From c2164803280b0d05da452330e613f040b3202949 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Fri, 7 Aug 2020 18:50:19 -0400 Subject: [PATCH 1/7] feat(TimeColumnWithDelays): Add component to display transit leg realtime time changes. --- .../line-itin/time-column-with-delays.js | 164 ++++++++++++++++++ 1 file changed, 164 insertions(+) create mode 100644 lib/components/narrative/line-itin/time-column-with-delays.js diff --git a/lib/components/narrative/line-itin/time-column-with-delays.js b/lib/components/narrative/line-itin/time-column-with-delays.js new file mode 100644 index 000000000..18fe29e9f --- /dev/null +++ b/lib/components/narrative/line-itin/time-column-with-delays.js @@ -0,0 +1,164 @@ +import { isTransit } from '@opentripplanner/core-utils/lib/itinerary' +import { + legType, + timeOptionsType +} from '@opentripplanner/core-utils/lib/types' +import { formatTime } from '@opentripplanner/core-utils/lib/time' +import PropTypes from 'prop-types' +import React from 'react' +import styled from 'styled-components' + +const StatusText = styled.div` + background-color: #bbb; + color: #fff; + font-size: 80%; + line-height: 1em; + padding: 2px; + text-align: center; + text-transform: uppercase; +` +const TimeText = styled.div`` + +const TimeStruck = styled.div` + text-decoration: line-through; +` + +const TimeBlock = styled.div` + line-height: 1em; + margin-bottom: 4px; +` + +const TimeColumnBase = styled.div`` + +// Reusing stop viewer colors. +/* +const TimeColumnOnTime = styled(TimeColumnBase)` + ${TimeText}, ${StatusText} { + color: #5cb85c; + } +`; +const TimeColumnEarly = styled(TimeColumnBase)` + ${TimeText}, ${StatusText} { + color: #337ab7; + } +`; +const TimeColumnLate = styled(TimeColumnBase)` + ${TimeText}, ${StatusText} { + color: #d9534f; + } +`; +*/ + +const TimeColumnOnTime = styled(TimeColumnBase)` + ${TimeText} { + color: #5cb85c; + } + ${StatusText} { + background-color: #5cb85c; + } +` +const TimeColumnEarly = styled(TimeColumnBase)` + ${TimeText} { + color: #337ab7; + } + ${StatusText} { + background-color: #337ab7; + } +` +const TimeColumnLate = styled(TimeColumnBase)` + ${TimeText} { + color: #d9534f; + } + ${StatusText} { + background-color: #d9534f; + } +` + +/** + * This component displays the scheduled departure/arrival time for a leg, + * and, for transit legs, displays any delays or earliness where applicable. + */ +export default function TimeColumnWithDelays ({ + isDestination, + leg, + timeOptions +}) { + const time = isDestination ? leg.endTime : leg.startTime + const formattedTime = time && formatTime(time, timeOptions) + const isTransitLeg = isTransit(leg.mode) + + if (leg.realTime) { + // Delay in seconds. + const delay = isDestination ? leg.arrivalDelay : leg.departureDelay + // Time is in milliseconds. + const originalTime = time - delay * 1000 + const originalFormattedTime = + originalTime && formatTime(originalTime, timeOptions) + + // TODO: refine on-time thresholds. + // const isOnTime = delay >= -60 && delay <= 120; + const isOnTime = delay === 0 + + let statusText + let TimeColumn = TimeColumnBase + if (isOnTime) { + statusText = 'on time' + TimeColumn = TimeColumnOnTime + } else if (delay < 0) { + statusText = 'early' + TimeColumn = TimeColumnEarly + } else if (delay > 0) { + statusText = 'late' + TimeColumn = TimeColumnLate + } + + // Absolute delay in rounded minutes, for display purposes. + const delayInMinutes = Math.abs( + Math.round((isDestination ? leg.arrivalDelay : leg.departureDelay) / 60) + ) + + let renderedTime + if (!isOnTime) { + // If the transit vehicle is not on time, strike the original scheduled time + // and display the updated time underneath. + renderedTime = ( + + {!isOnTime && {originalFormattedTime}} + {formattedTime} + + ) + } else { + renderedTime = {formattedTime} + } + + return ( + + {renderedTime} + + {!isOnTime && <>{delayInMinutes} min} + {'\n'} + {statusText} + + + ) + } + + // Non-real-time leg. + return ( + <> + {formattedTime} + {/* Add the scheduled mention for transit legs only. */} + {isTransitLeg && scheduled} + + ) +} + +TimeColumnWithDelays.propTypes = { + isDestination: PropTypes.bool.isRequired, + leg: legType.isRequired, + timeOptions: timeOptionsType +} + +TimeColumnWithDelays.defaultProps = { + timeOptions: null +} From b8c0b44ea5a20d07684986f4bf837c63b8d2be52 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Tue, 18 Aug 2020 17:54:53 -0400 Subject: [PATCH 2/7] feat(TimeColumnWithDelays): Add support for real-time delays/updates to line-itin/ConnectedItinerary --- .../line-itin/connected-itinerary-body.js | 5 ++- .../line-itin/time-column-with-delays.js | 33 +++++++++++-------- package.json | 2 +- yarn.lock | 24 +++++++++++--- 4 files changed, 43 insertions(+), 21 deletions(-) diff --git a/lib/components/narrative/line-itin/connected-itinerary-body.js b/lib/components/narrative/line-itin/connected-itinerary-body.js index d1cef245a..b808b0f1b 100644 --- a/lib/components/narrative/line-itin/connected-itinerary-body.js +++ b/lib/components/narrative/line-itin/connected-itinerary-body.js @@ -12,6 +12,7 @@ import styled from 'styled-components' import { showLegDiagram } from '../../../actions/map' import { setViewedTrip } from '../../../actions/ui' import TransitLegSubheader from './connected-transit-leg-subheader' +import TimeColumnWithDelays from './time-column-with-delays' import TripDetails from '../connected-trip-details' import TripTools from '../trip-tools' @@ -41,7 +42,8 @@ class ConnectedItineraryBody extends Component { LegIcon, setActiveLeg, setViewedTrip, - showLegDiagram + showLegDiagram, + TimeColumnContent } = this.props return ( @@ -65,6 +67,7 @@ class ConnectedItineraryBody extends Component { toRouteAbbreviation={noop} TransitLegSubheader={TransitLegSubheader} TransitLegSummary={TransitLegSummary} + TimeColumnContent={TimeColumnWithDelays} /> diff --git a/lib/components/narrative/line-itin/time-column-with-delays.js b/lib/components/narrative/line-itin/time-column-with-delays.js index 18fe29e9f..6d5c952cf 100644 --- a/lib/components/narrative/line-itin/time-column-with-delays.js +++ b/lib/components/narrative/line-itin/time-column-with-delays.js @@ -8,15 +8,6 @@ import PropTypes from 'prop-types' import React from 'react' import styled from 'styled-components' -const StatusText = styled.div` - background-color: #bbb; - color: #fff; - font-size: 80%; - line-height: 1em; - padding: 2px; - text-align: center; - text-transform: uppercase; -` const TimeText = styled.div`` const TimeStruck = styled.div` @@ -31,7 +22,12 @@ const TimeBlock = styled.div` const TimeColumnBase = styled.div`` // Reusing stop viewer colors. -/* + +const StatusText = styled.div` + color: #bbb; + font-size: 80%; + line-height: 1em; +` const TimeColumnOnTime = styled(TimeColumnBase)` ${TimeText}, ${StatusText} { color: #5cb85c; @@ -47,8 +43,17 @@ const TimeColumnLate = styled(TimeColumnBase)` color: #d9534f; } `; -*/ +/* +const StatusText = styled.div` + background-color: #bbb; + color: #fff; + font-size: 80%; + line-height: 1em; + padding: 2px; + text-align: center; + text-transform: uppercase; +` const TimeColumnOnTime = styled(TimeColumnBase)` ${TimeText} { color: #5cb85c; @@ -73,7 +78,7 @@ const TimeColumnLate = styled(TimeColumnBase)` background-color: #d9534f; } ` - +*/ /** * This component displays the scheduled departure/arrival time for a leg, * and, for transit legs, displays any delays or earliness where applicable. @@ -87,7 +92,7 @@ export default function TimeColumnWithDelays ({ const formattedTime = time && formatTime(time, timeOptions) const isTransitLeg = isTransit(leg.mode) - if (leg.realTime) { +// if (leg.realTime) { // Delay in seconds. const delay = isDestination ? leg.arrivalDelay : leg.departureDelay // Time is in milliseconds. @@ -141,7 +146,7 @@ export default function TimeColumnWithDelays ({ ) - } + // } // Non-real-time leg. return ( diff --git a/package.json b/package.json index 527561bb0..9f7a5732b 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "@opentripplanner/geocoder": "^1.0.2", "@opentripplanner/humanize-distance": "^0.0.22", "@opentripplanner/icons": "^1.0.1", - "@opentripplanner/itinerary-body": "^1.0.2", + "@opentripplanner/itinerary-body": "^1.1.0", "@opentripplanner/location-field": "^1.0.1", "@opentripplanner/location-icon": "^1.0.0", "@opentripplanner/park-and-ride-overlay": "^1.0.1", diff --git a/yarn.lock b/yarn.lock index 051fc2355..2c4d35bf6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1275,6 +1275,20 @@ prop-types "^15.7.2" qs "^6.9.1" +"@opentripplanner/core-utils@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@opentripplanner/core-utils/-/core-utils-2.1.0.tgz#ab7271a2b560168b21b0dd26c78532f24fd031f5" + integrity sha512-sQ3oiZB7f01kCVuTj5SzqsPe4uchupNbla+onLWH+aO3wH+OLZNuLRZZ/7oFFFnvpcFBakyg4TePPxyyEyJlMA== + dependencies: + "@mapbox/polyline" "^1.1.0" + "@turf/along" "^6.0.1" + bowser "^2.7.0" + lodash.isequal "^4.5.0" + moment "^2.24.0" + moment-timezone "^0.5.27" + prop-types "^15.7.2" + qs "^6.9.1" + "@opentripplanner/endpoints-overlay@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@opentripplanner/endpoints-overlay/-/endpoints-overlay-1.0.1.tgz#d95f0bbfddc9382b593845799b963340eece2742" @@ -1317,12 +1331,12 @@ "@opentripplanner/core-utils" "^1.2.0" prop-types "^15.7.2" -"@opentripplanner/itinerary-body@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@opentripplanner/itinerary-body/-/itinerary-body-1.0.2.tgz#f280932a13723f49bac92c79feb83a088d14329b" - integrity sha512-3x8UvtkL3WmUeNTeWsWTJJtR2FqcWU42xw4833+6pMMzPoS2U4bYzSbw7ucQT64vqcoRQ0ykUjE7as32W+VgGg== +"@opentripplanner/itinerary-body@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@opentripplanner/itinerary-body/-/itinerary-body-1.1.0.tgz#6fabc389ad25f6f14db5a5861603a127530e0d9e" + integrity sha512-svu2A0z+CnL5vrkDXuaMjJaDoSC4d52utzdGfgkXdfMaK9prO1D/6SHWiVILXmaDJExdBAoF3mxSuA7xPItTTA== dependencies: - "@opentripplanner/core-utils" "^1.2.0" + "@opentripplanner/core-utils" "^2.1.0" "@opentripplanner/humanize-distance" "^0.0.22" "@opentripplanner/icons" "^1.0.0" "@opentripplanner/location-icon" "^1.0.0" From b1570b25361497e0845510cb396463a563cfc0ee Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Tue, 18 Aug 2020 18:08:27 -0400 Subject: [PATCH 3/7] refactor(TimeColumnWithDelays): Cleanup --- .../line-itin/connected-itinerary-body.js | 3 +- .../line-itin/time-column-with-delays.js | 49 +++---------------- 2 files changed, 8 insertions(+), 44 deletions(-) diff --git a/lib/components/narrative/line-itin/connected-itinerary-body.js b/lib/components/narrative/line-itin/connected-itinerary-body.js index b808b0f1b..88e65dec0 100644 --- a/lib/components/narrative/line-itin/connected-itinerary-body.js +++ b/lib/components/narrative/line-itin/connected-itinerary-body.js @@ -42,8 +42,7 @@ class ConnectedItineraryBody extends Component { LegIcon, setActiveLeg, setViewedTrip, - showLegDiagram, - TimeColumnContent + showLegDiagram } = this.props return ( diff --git a/lib/components/narrative/line-itin/time-column-with-delays.js b/lib/components/narrative/line-itin/time-column-with-delays.js index 6d5c952cf..22fb2aeeb 100644 --- a/lib/components/narrative/line-itin/time-column-with-delays.js +++ b/lib/components/narrative/line-itin/time-column-with-delays.js @@ -21,64 +21,29 @@ const TimeBlock = styled.div` const TimeColumnBase = styled.div`` -// Reusing stop viewer colors. - const StatusText = styled.div` color: #bbb; font-size: 80%; line-height: 1em; ` -const TimeColumnOnTime = styled(TimeColumnBase)` - ${TimeText}, ${StatusText} { - color: #5cb85c; - } -`; -const TimeColumnEarly = styled(TimeColumnBase)` - ${TimeText}, ${StatusText} { - color: #337ab7; - } -`; -const TimeColumnLate = styled(TimeColumnBase)` - ${TimeText}, ${StatusText} { - color: #d9534f; - } -`; -/* -const StatusText = styled.div` - background-color: #bbb; - color: #fff; - font-size: 80%; - line-height: 1em; - padding: 2px; - text-align: center; - text-transform: uppercase; -` +// Reusing stop viewer colors. const TimeColumnOnTime = styled(TimeColumnBase)` - ${TimeText} { + ${TimeText}, ${StatusText} { color: #5cb85c; } - ${StatusText} { - background-color: #5cb85c; - } ` const TimeColumnEarly = styled(TimeColumnBase)` - ${TimeText} { + ${TimeText}, ${StatusText} { color: #337ab7; } - ${StatusText} { - background-color: #337ab7; - } ` const TimeColumnLate = styled(TimeColumnBase)` - ${TimeText} { + ${TimeText}, ${StatusText} { color: #d9534f; } - ${StatusText} { - background-color: #d9534f; - } ` -*/ + /** * This component displays the scheduled departure/arrival time for a leg, * and, for transit legs, displays any delays or earliness where applicable. @@ -92,7 +57,7 @@ export default function TimeColumnWithDelays ({ const formattedTime = time && formatTime(time, timeOptions) const isTransitLeg = isTransit(leg.mode) -// if (leg.realTime) { + if (leg.realTime) { // Delay in seconds. const delay = isDestination ? leg.arrivalDelay : leg.departureDelay // Time is in milliseconds. @@ -146,7 +111,7 @@ export default function TimeColumnWithDelays ({ ) - // } + } // Non-real-time leg. return ( From 2115c7befadd6d7ecc1fd0e02d54a2a462f2774e Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Tue, 25 Aug 2020 10:40:34 -0400 Subject: [PATCH 4/7] refactor(TimeColumnWithDelays): Format delay using template string. --- .../narrative/line-itin/time-column-with-delays.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/components/narrative/line-itin/time-column-with-delays.js b/lib/components/narrative/line-itin/time-column-with-delays.js index 22fb2aeeb..85ff2499c 100644 --- a/lib/components/narrative/line-itin/time-column-with-delays.js +++ b/lib/components/narrative/line-itin/time-column-with-delays.js @@ -105,8 +105,9 @@ export default function TimeColumnWithDelays ({ {renderedTime} - {!isOnTime && <>{delayInMinutes} min} - {'\n'} + {/* Keep the '5 min' string on the same line. */} + {/* Append space before printing statusText. (statusText can be displayed on same line or new line.) */} + {!isOnTime && `${delayInMinutes}\xa0min `} {statusText} From 3ef29f3f43f2f8829b397499d15d98ce3bcbe17b Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Tue, 25 Aug 2020 12:27:27 -0400 Subject: [PATCH 5/7] refactor(RealtimeTimeColumn): Rename component, address PR comments. --- .../line-itin/connected-itinerary-body.js | 4 +- .../line-itin/realtime-time-column.js | 135 ++++++++++++++++++ .../line-itin/time-column-with-delays.js | 135 ------------------ 3 files changed, 137 insertions(+), 137 deletions(-) create mode 100644 lib/components/narrative/line-itin/realtime-time-column.js delete mode 100644 lib/components/narrative/line-itin/time-column-with-delays.js diff --git a/lib/components/narrative/line-itin/connected-itinerary-body.js b/lib/components/narrative/line-itin/connected-itinerary-body.js index 4c40e6749..ce38a6f73 100644 --- a/lib/components/narrative/line-itin/connected-itinerary-body.js +++ b/lib/components/narrative/line-itin/connected-itinerary-body.js @@ -12,7 +12,7 @@ import styled from 'styled-components' import { showLegDiagram } from '../../../actions/map' import { setViewedTrip } from '../../../actions/ui' import TransitLegSubheader from './connected-transit-leg-subheader' -import TimeColumnWithDelays from './time-column-with-delays' +import RealtimeTimeColumn from './realtime-time-column' import TripDetails from '../connected-trip-details' import TripTools from '../trip-tools' @@ -68,7 +68,7 @@ class ConnectedItineraryBody extends Component { toRouteAbbreviation={noop} TransitLegSubheader={TransitLegSubheader} TransitLegSummary={TransitLegSummary} - TimeColumnContent={TimeColumnWithDelays} + TimeColumnContent={RealtimeTimeColumn} /> diff --git a/lib/components/narrative/line-itin/realtime-time-column.js b/lib/components/narrative/line-itin/realtime-time-column.js new file mode 100644 index 000000000..8ab6f1550 --- /dev/null +++ b/lib/components/narrative/line-itin/realtime-time-column.js @@ -0,0 +1,135 @@ +import { isTransit } from '@opentripplanner/core-utils/lib/itinerary' +import { + legType, + timeOptionsType +} from '@opentripplanner/core-utils/lib/types' +import { formatTime } from '@opentripplanner/core-utils/lib/time' +import PropTypes from 'prop-types' +import React from 'react' +import styled from 'styled-components' + +const TimeText = styled.div`` + +const TimeStruck = styled.div` + text-decoration: line-through; +` + +const TimeBlock = styled.div` + line-height: 1em; + margin-bottom: 4px; +` + +const TimeColumnBase = styled.div`` + +const StatusText = styled.div` + color: #bbb; + font-size: 80%; + line-height: 1em; +` + +// Reusing stop viewer colors. +const TimeColumnOnTime = styled(TimeColumnBase)` + ${TimeText}, ${StatusText} { + color: #5cb85c; + } +` +const TimeColumnEarly = styled(TimeColumnBase)` + ${TimeText}, ${StatusText} { + color: #337ab7; + } +` +const TimeColumnLate = styled(TimeColumnBase)` + ${TimeText}, ${StatusText} { + color: #d9534f; + } +` + +/** + * This component displays the scheduled departure/arrival time for a leg, + * and, for transit legs, displays any delays or earliness where applicable. + */ +export default function RealtimeTimeColumn ({ + isDestination, + leg, + timeOptions +}) { + const time = isDestination ? leg.endTime : leg.startTime + const formattedTime = time && formatTime(time, timeOptions) + const isTransitLeg = isTransit(leg.mode) + + // For non-real-time legs, show only the scheduled time, + // except for transit legs where we add the "scheduled" text underneath. + if (!leg.realTime) { + return ( + <> + {formattedTime} + {isTransitLeg && scheduled} + + ) + } + + // Delay in seconds. + const delay = isDestination ? leg.arrivalDelay : leg.departureDelay + // Time is in milliseconds. + const originalTime = time - delay * 1000 + const originalFormattedTime = + originalTime && formatTime(originalTime, timeOptions) + + // TODO: refine on-time thresholds. + // const isOnTime = delay >= -60 && delay <= 120; + const isOnTime = delay === 0 + + let statusText + let TimeColumn = TimeColumnBase + if (isOnTime) { + statusText = 'on time' + TimeColumn = TimeColumnOnTime + } else if (delay < 0) { + statusText = 'early' + TimeColumn = TimeColumnEarly + } else if (delay > 0) { + statusText = 'late' + TimeColumn = TimeColumnLate + } + + // Absolute delay in rounded minutes, for display purposes. + const delayInMinutes = Math.abs( + Math.round((isDestination ? leg.arrivalDelay : leg.departureDelay) / 60) + ) + + let renderedTime + if (!isOnTime) { + // If the transit vehicle is not on time, strike the original scheduled time + // and display the updated time underneath. + renderedTime = ( + + {!isOnTime && {originalFormattedTime}} + {formattedTime} + + ) + } else { + renderedTime = {formattedTime} + } + + return ( + + {renderedTime} + + {/* Keep the '5 min' string on the same line. */} + {/* Append space before printing statusText. (statusText can be displayed on same line or new line.) */} + {!isOnTime && `${delayInMinutes}\xa0min `} + {statusText} + + + ) +} + +RealtimeTimeColumn.propTypes = { + isDestination: PropTypes.bool.isRequired, + leg: legType.isRequired, + timeOptions: timeOptionsType +} + +RealtimeTimeColumn.defaultProps = { + timeOptions: null +} diff --git a/lib/components/narrative/line-itin/time-column-with-delays.js b/lib/components/narrative/line-itin/time-column-with-delays.js deleted file mode 100644 index 85ff2499c..000000000 --- a/lib/components/narrative/line-itin/time-column-with-delays.js +++ /dev/null @@ -1,135 +0,0 @@ -import { isTransit } from '@opentripplanner/core-utils/lib/itinerary' -import { - legType, - timeOptionsType -} from '@opentripplanner/core-utils/lib/types' -import { formatTime } from '@opentripplanner/core-utils/lib/time' -import PropTypes from 'prop-types' -import React from 'react' -import styled from 'styled-components' - -const TimeText = styled.div`` - -const TimeStruck = styled.div` - text-decoration: line-through; -` - -const TimeBlock = styled.div` - line-height: 1em; - margin-bottom: 4px; -` - -const TimeColumnBase = styled.div`` - -const StatusText = styled.div` - color: #bbb; - font-size: 80%; - line-height: 1em; -` - -// Reusing stop viewer colors. -const TimeColumnOnTime = styled(TimeColumnBase)` - ${TimeText}, ${StatusText} { - color: #5cb85c; - } -` -const TimeColumnEarly = styled(TimeColumnBase)` - ${TimeText}, ${StatusText} { - color: #337ab7; - } -` -const TimeColumnLate = styled(TimeColumnBase)` - ${TimeText}, ${StatusText} { - color: #d9534f; - } -` - -/** - * This component displays the scheduled departure/arrival time for a leg, - * and, for transit legs, displays any delays or earliness where applicable. - */ -export default function TimeColumnWithDelays ({ - isDestination, - leg, - timeOptions -}) { - const time = isDestination ? leg.endTime : leg.startTime - const formattedTime = time && formatTime(time, timeOptions) - const isTransitLeg = isTransit(leg.mode) - - if (leg.realTime) { - // Delay in seconds. - const delay = isDestination ? leg.arrivalDelay : leg.departureDelay - // Time is in milliseconds. - const originalTime = time - delay * 1000 - const originalFormattedTime = - originalTime && formatTime(originalTime, timeOptions) - - // TODO: refine on-time thresholds. - // const isOnTime = delay >= -60 && delay <= 120; - const isOnTime = delay === 0 - - let statusText - let TimeColumn = TimeColumnBase - if (isOnTime) { - statusText = 'on time' - TimeColumn = TimeColumnOnTime - } else if (delay < 0) { - statusText = 'early' - TimeColumn = TimeColumnEarly - } else if (delay > 0) { - statusText = 'late' - TimeColumn = TimeColumnLate - } - - // Absolute delay in rounded minutes, for display purposes. - const delayInMinutes = Math.abs( - Math.round((isDestination ? leg.arrivalDelay : leg.departureDelay) / 60) - ) - - let renderedTime - if (!isOnTime) { - // If the transit vehicle is not on time, strike the original scheduled time - // and display the updated time underneath. - renderedTime = ( - - {!isOnTime && {originalFormattedTime}} - {formattedTime} - - ) - } else { - renderedTime = {formattedTime} - } - - return ( - - {renderedTime} - - {/* Keep the '5 min' string on the same line. */} - {/* Append space before printing statusText. (statusText can be displayed on same line or new line.) */} - {!isOnTime && `${delayInMinutes}\xa0min `} - {statusText} - - - ) - } - - // Non-real-time leg. - return ( - <> - {formattedTime} - {/* Add the scheduled mention for transit legs only. */} - {isTransitLeg && scheduled} - - ) -} - -TimeColumnWithDelays.propTypes = { - isDestination: PropTypes.bool.isRequired, - leg: legType.isRequired, - timeOptions: timeOptionsType -} - -TimeColumnWithDelays.defaultProps = { - timeOptions: null -} From 60f4ad69336cd89193ac0a4888859f1708439572 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Tue, 25 Aug 2020 14:09:06 -0400 Subject: [PATCH 6/7] refactor(RealtimeTimeColumn): Extract styles for delay display. --- .../narrative/line-itin/realtime-time-column.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/components/narrative/line-itin/realtime-time-column.js b/lib/components/narrative/line-itin/realtime-time-column.js index 8ab6f1550..41efc3aec 100644 --- a/lib/components/narrative/line-itin/realtime-time-column.js +++ b/lib/components/narrative/line-itin/realtime-time-column.js @@ -27,6 +27,11 @@ const StatusText = styled.div` line-height: 1em; ` +const DelayText = styled.span` + display: block; + white-space: nowrap; +` + // Reusing stop viewer colors. const TimeColumnOnTime = styled(TimeColumnBase)` ${TimeText}, ${StatusText} { @@ -116,8 +121,7 @@ export default function RealtimeTimeColumn ({ {renderedTime} {/* Keep the '5 min' string on the same line. */} - {/* Append space before printing statusText. (statusText can be displayed on same line or new line.) */} - {!isOnTime && `${delayInMinutes}\xa0min `} + {!isOnTime && {`${delayInMinutes} min`}} {statusText} From 83c201230c65b8c61915b5dd0498da1a4959e145 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Tue, 25 Aug 2020 14:41:08 -0400 Subject: [PATCH 7/7] refactor(RealtimeTimeColumn): Remove template string --- lib/components/narrative/line-itin/realtime-time-column.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/components/narrative/line-itin/realtime-time-column.js b/lib/components/narrative/line-itin/realtime-time-column.js index 41efc3aec..3cf031fee 100644 --- a/lib/components/narrative/line-itin/realtime-time-column.js +++ b/lib/components/narrative/line-itin/realtime-time-column.js @@ -121,7 +121,7 @@ export default function RealtimeTimeColumn ({ {renderedTime} {/* Keep the '5 min' string on the same line. */} - {!isOnTime && {`${delayInMinutes} min`}} + {!isOnTime && {delayInMinutes} min} {statusText}