diff --git a/.github/workflows/percy.yml b/.github/workflows/percy.yml
index c5e878b72..9684cb875 100644
--- a/.github/workflows/percy.yml
+++ b/.github/workflows/percy.yml
@@ -52,7 +52,7 @@ jobs:
- name: Download OTP2 config file
run: curl $PERCY_OTP2_CONFIG_URL --output /tmp/otp2config.yml
env:
- PERCY_OTP2_CONFIG_URL: ${{ secrets.PERCY_MOCK_OTP2_GEOCODER_CONFIG }}
+ PERCY_OTP2_CONFIG_URL: ${{ secrets.PERCY_MOCK_OTP2_GEOCODER_CALLTAKER_CONFIG }}
- name: Build OTP-RR Calltaker
# Calltaker has a separate config file, so another build should be produced.
run: yarn build
diff --git a/i18n/en-US.yml b/i18n/en-US.yml
index 32c9b46f1..eafbba0db 100644
--- a/i18n/en-US.yml
+++ b/i18n/en-US.yml
@@ -677,6 +677,7 @@ components:
notificationsDisabled: "Notifications: Disabled"
TripTools:
copyLink: Copy Link
+ header: Trip Tools
linkCopied: Copied
reportEmailSubject: Reporting an Issue with OpenTripPlanner
reportEmailTemplate: >
diff --git a/i18n/es.yml b/i18n/es.yml
index 4df1c29df..be9f8314a 100644
--- a/i18n/es.yml
+++ b/i18n/es.yml
@@ -30,7 +30,8 @@ actions:
No se puede guardar el plan: este plan no se pudo guardar debido a la
falta de capacidad en uno o más vehículos. Por favor, vuelva a planificar
su viaje.
- maxTripRequestsExceeded: Número de solicitudes de viaje superadas sin resultados válidos
+ maxTripRequestsExceeded: Número de solicitudes de viaje superadas sin resultados
+ válidos
saveItinerariesError: "No se pudieron guardar los itinerarios: {err}"
setDateError: "Error al establecer la fecha:"
setGroupSizeError: "No se pudo establecer el tamaño del grupo:"
@@ -52,9 +53,13 @@ actions:
authTokenError: Error al obtener un token de autorización.
confirmDeleteMonitoredTrip: ¿Desea eliminar este viaje?
confirmDeletePlace: ¿Quiere eliminar este lugar?
- emailVerificationResent: El mensaje de verificación de correo electrónico ha sido reenviado.
+ emailVerificationResent: El mensaje de verificación de correo electrónico ha sido
+ reenviado.
genericError: "Se ha encontrado un error: {err}"
- itineraryExistenceCheckFailed: Comprobación de errores para ver si el viaje seleccionado es posible.
+ itineraryExistenceCheckFailed: Comprobación de errores para ver si el viaje seleccionado
+ es posible.
+ mustBeLoggedInToSavePlace: Por favor, inicia la sesión para guardar las ubicaciones.
+ placeRemembered: La configuración de este lugar se ha guardado.
preferencesSaved: Sus preferencias se han guardado.
smsInvalidCode: El código introducido no es válido. Por favor, inténtelo de nuevo.
smsResendThrottled: >-
@@ -63,8 +68,6 @@ actions:
smsVerificationFailed: >-
Su teléfono no ha podido ser verificado. Quizás el código que has
introducido ha caducado. Solicita un nuevo código e inténtalo de nuevo.
- mustBeLoggedInToSavePlace: Por favor, inicia la sesión para guardar las ubicaciones.
- placeRemembered: La configuración de este lugar se ha guardado.
common:
coordinates: "{lat}; {lon}"
dateExpressions:
@@ -245,7 +248,8 @@ components:
a incluir el transporte publico en la selección de modos.
origin: origen
planTripTooltip: Planificar viaje
- validationMessage: "Por favor, defina los siguientes campos para planificar un viaje: {issues}"
+ validationMessage: "Por favor, defina los siguientes campos para planificar un
+ viaje: {issues}"
BeforeSignInScreen:
mainTitle: Iniciando sesión
message: >
@@ -487,11 +491,11 @@ components:
tripsFound: Encontramos {count, plural, one {# opción} other {# opciones}}
waiting: Espera...
RouteDetails:
+ headsignTo: "{headsign} ({lastStop})"
moreDetails: Más detalles
operatedBy: Servicio operado por {agencyName}
selectADirection: Seleccione una dirección…
stopsTo: Hacia
- headsignTo: '{headsign} ({lastStop})'
RouteViewer:
agencyFilter: Filtro de agencia
allAgencies: Todas las agencias
@@ -547,7 +551,8 @@ components:
header: ¡La sesión está a punto de terminar!
keepSession: Continuar sesión
SimpleRealtimeAnnotation:
- usingRealtimeInfo: Este viaje utiliza información de tráfico y retrasos en tiempo real
+ usingRealtimeInfo: Este viaje utiliza información de tráfico y retrasos en tiempo
+ real
StackedPaneDisplay:
savePreferences: Guardar preferencias
StopScheduleTable:
@@ -610,16 +615,19 @@ components:
travelingAt: Viajando a {milesPerHour}
vehicleName: Vehículo {vehicleNumber}
TripBasicsPane:
- checkingItineraryExistence: Comprobación de la existencia de itinerarios para cada día de la semana…
+ checkingItineraryExistence: Comprobación de la existencia de itinerarios para
+ cada día de la semana…
selectAtLeastOneDay: Por favor, seleccione al menos un día para el seguimiento.
tripDaysPrompt: ¿Qué días hace este viaje?
- tripIsAvailableOnDaysIndicated: Su viaje está disponible en los días de la semana indicados anteriormente.
+ tripIsAvailableOnDaysIndicated: Su viaje está disponible en los días de la semana
+ indicados anteriormente.
tripNamePrompt: "Por favor, indique un nombre para este viaje:"
tripNotAvailableOnDay: El viaje no está disponible el {repeatedDay}
unsavedChangesExistingTrip: >-
Todavía no ha guardado su viaje. Si abandona la página, los cambios se
perderán.
- unsavedChangesNewTrip: Todavía no ha guardado su nuevo viaje. Si abandona la página, se perderá.
+ unsavedChangesNewTrip: Todavía no ha guardado su nuevo viaje. Si abandona la página,
+ se perderá.
TripNotificationsPane:
advancedSettings: Configuración avanzada
altRouteRecommended: Se recomienda una ruta alternativa o un punto de transferencia
@@ -700,9 +708,10 @@ components:
notifications: >-
Notificaciones: {leadTimeInMinutes} minutos antes de la salida
programada
- notificationsDisabled: "Notificaciones: Disabled"
+ notificationsDisabled: "Notificaciones: Desactivadas"
TripTools:
copyLink: Copiar enlace
+ header: Herramientas
linkCopied: Copiado
reportEmailSubject: Informar un problema con OpenTripPlanner
reportEmailTemplate: >
diff --git a/i18n/fr.yml b/i18n/fr.yml
index 6e7c7d6ba..1ef6fd89a 100644
--- a/i18n/fr.yml
+++ b/i18n/fr.yml
@@ -703,6 +703,7 @@ components:
notificationsDisabled: "Notifications : Désactivées"
TripTools:
copyLink: Copier le lien
+ header: Outils
linkCopied: Copié
reportEmailSubject: Signaler un problème avec OpenTripPlanner
reportEmailTemplate: >
diff --git a/i18n/ko.yml b/i18n/ko.yml
index c36644127..53bfc40c3 100644
--- a/i18n/ko.yml
+++ b/i18n/ko.yml
@@ -22,7 +22,8 @@ actions:
fetchFieldTripsError: "트립을 가져오는 중에 오류가 발생했습니다: {err}"
fetchTripsForDateError: "필트 트립 날짜에 대한 트립을 가져오는 중에 오류가 발생했습니다: {err}"
incompatibleTripDateError: 계획한 트립 날짜({tripDate})가 요청한 트립 날짜({requestDate})가 아닙니다
- itineraryCapacityError: "플랜을 저장할 수 없습니다: 하나 이상의 차량의 용량이 부족하여 이 플랜을 저장할 수 없습니다. 트립을 다시 계획하세요."
+ itineraryCapacityError: "플랜을 저장할 수 없습니다: 하나 이상의 차량의 용량이 부족하여 이 플랜을 저장할 수 없습니다.
+ 트립을 다시 계획하세요."
maxTripRequestsExceeded: 유효한 결과없이 초과된 트립 요청의 개수
saveItinerariesError: "트립을 저장하는 데 실패했습니다: {err}"
setDateError: "날짜를 설정하는 중에 오류가 발생했습니다:"
@@ -504,6 +505,7 @@ components:
notifyViaChannelWhen: "다음의 경우, {channel}을 통해 알려주세요:"
oneHour: 1 시간
realtimeAlertFlagged: 내 트립 일정에 실시간 경고가 있습니다
+ timeBefore: '{time} 전'
TripStatus:
alerts: "{alerts, plural, one {# 경고!} other {# 경고!}}"
deleteTrip: 트립 삭제
@@ -561,6 +563,7 @@ components:
notificationsDisabled: "알림: 비활성화됨"
TripTools:
copyLink: 링크 복사
+ header: 도구
linkCopied: 복사됨
reportEmailSubject: OpenTripPlanner로 문제 보고
reportEmailTemplate: |
@@ -640,5 +643,6 @@ util:
networkUnavailable: 현재 {network} 네트워크를 사용할 수 없습니다.
noTripFound: 트립을 찾을 수 없습니다.
noTripFoundForMode: "{modes}의 트립을 찾을 수 없습니다."
- noTripFoundReason: 지정된 최대 거리 내 또는 지정된 시간에 대중 교통 서비스가 없거나, 출발지 또는 도착지가 안전하게 접근가능하지 못할 수 있습니다.
+ noTripFoundReason: 지정된 최대 거리 내 또는 지정된 시간에 대중 교통 서비스가 없거나, 출발지 또는 도착지가 안전하게 접근가능하지
+ 못할 수 있습니다.
noTripFoundWithReason: "{noTripFound} {reason}"
diff --git a/i18n/vi.yml b/i18n/vi.yml
index e31f08271..471a3e7cb 100644
--- a/i18n/vi.yml
+++ b/i18n/vi.yml
@@ -602,6 +602,7 @@ components:
notificationsDisabled: "Thông báo: Đã tắt"
TripTools:
copyLink: Sao chép URL
+ header: Công cụ
linkCopied: Đã sao chép
reportEmailSubject: Báo cáo sự cố với OpenTripPlanner
reportEmailTemplate: |
diff --git a/i18n/zh.yml b/i18n/zh.yml
index 021e91a97..d487fa672 100644
--- a/i18n/zh.yml
+++ b/i18n/zh.yml
@@ -502,6 +502,7 @@ components:
notifyViaChannelWhen: "通过 {channel} 通知我当:"
oneHour: 1小时
realtimeAlertFlagged: 在我的行程中有一个实时警报标志着
+ timeBefore: '{time} 前'
TripStatus:
alerts: "{alerts, plural, one {# 警报!} other {# 警报!}}"
deleteTrip: 删除行程
@@ -559,6 +560,7 @@ components:
notificationsDisabled: "通知: 已禁用"
TripTools:
copyLink: 复制链接
+ header: 工具
linkCopied: 已复制
reportEmailSubject: 报告OpenTripPlanner的问题
reportEmailTemplate: |
diff --git a/lib/actions/apiV2.js b/lib/actions/apiV2.js
index 55bacbcc8..0ee27117c 100644
--- a/lib/actions/apiV2.js
+++ b/lib/actions/apiV2.js
@@ -13,8 +13,10 @@ import { generateModeSettingValues } from '../util/api'
import {
getActiveItineraries,
getActiveItinerary,
+ getRouteOperator,
queryIsValid
} from '../util/state'
+import { getRouteColorBasedOnSettings } from '../util/viewer'
import { ItineraryView } from '../util/ui'
import {
@@ -671,6 +673,10 @@ export const findRoute = (params) =>
newRoute.patterns = routePatterns
// TODO: avoid explicit behavior shift like this
newRoute.v2 = true
+ newRoute.color = getRouteColorBasedOnSettings(
+ getRouteOperator(route, getState().otp.config.transitOperators),
+ route
+ ).split('#')[1]
newRoute.mode = checkForRouteModeOverride(
newRoute,
getState().otp.config?.routeModeOverrides
@@ -718,29 +724,27 @@ export function findRoutes() {
const { config } = getState().otp
// To initialize the route viewer,
// convert the routes array to a dictionary indexed by route ids.
- return routes.reduce(
- (
- result,
- { agency, color, id, longName, mode, shortName, type }
- ) => {
- result[id] = {
- agencyId: agency.id,
- agencyName: agency.name,
- color,
- id,
- longName,
- mode: checkForRouteModeOverride(
- { id, mode },
- config?.routeModeOverrides
- ),
- shortName,
- type,
- v2: true
- }
- return result
- },
- {}
- )
+ return routes.reduce((result, route) => {
+ const { agency, id, longName, mode, shortName, type } = route
+ result[id] = {
+ agencyId: agency.id,
+ agencyName: agency.name,
+ color: getRouteColorBasedOnSettings(
+ getRouteOperator(route, config.transitOperators),
+ route
+ ).split('#')[1],
+ id,
+ longName,
+ mode: checkForRouteModeOverride(
+ { id, mode },
+ config?.routeModeOverrides
+ ),
+ shortName,
+ type,
+ v2: true
+ }
+ return result
+ }, {})
}
}
)
@@ -944,9 +948,27 @@ export function routingQuery(searchId = null, updateSearchInReducer) {
const withCollapsedShortNames = filteredItineraries.map(
(itin) => ({
...itin,
- legs: itin.legs?.map(convertGraphQLResponseToLegacy)
- })
- )
+ legs: itin.legs
+ ?.map((leg) => {
+ return {
+ ...leg,
+ route: {
+ ...leg.route,
+ color: getRouteColorBasedOnSettings(
+ getRouteOperator(
+ {
+ agencyId: leg?.agency?.id,
+ id: leg?.route?.id
+ },
+ config.transitOperators
+ ),
+ { color: leg?.route?.color, mode: leg.mode }
+ ).split('#')?.[1]
+ }
+ }
+ })
+ ?.map(convertGraphQLResponseToLegacy)
+ }))
/* It is possible for a NO_TRANSIT_CONNECTION error to be
returned even if trips were returned, since it is on a mode-by-mode basis.
diff --git a/lib/app.js b/lib/app.js
index 4ea733227..fda84a81f 100644
--- a/lib/app.js
+++ b/lib/app.js
@@ -21,12 +21,7 @@ import {
BatchResultsScreen,
BatchRoutingPanel,
BatchSearchScreen,
- CallHistoryWindow,
- CallTakerControls,
- CallTakerPanel,
DefaultItinerary,
- FieldTripWindows,
- MailablesWindow,
ResponsiveWebapp
} from './index'
@@ -178,17 +173,9 @@ const components = {
ItineraryBody: DefaultItinerary,
- MainControls: isCallTakerModuleEnabled ? CallTakerControls : null,
+ MainPanel: BatchRoutingPanel,
- MainPanel: isCallTakerModuleEnabled ? CallTakerPanel : BatchRoutingPanel,
-
- MapWindows: isCallTakerModuleEnabled ? (
- <>
-