From a8520ee3044403a963449fcfa960d3352faae8ed Mon Sep 17 00:00:00 2001 From: miles-grant-ibigroup Date: Fri, 17 Sep 2021 15:07:21 +0100 Subject: [PATCH 1/9] feat(default-itinerary): add accessibility labels to legs and itineraries --- example-config.yml | 8 ++ .../narrative/default/default-itinerary.js | 95 +++++++++++++------ .../line-itin/connected-itinerary-body.js | 2 + lib/components/util/accessibility-routing.js | 18 ++++ 4 files changed, 92 insertions(+), 31 deletions(-) create mode 100644 lib/components/util/accessibility-routing.js diff --git a/example-config.yml b/example-config.yml index 889ba5ab8..620a2706f 100644 --- a/example-config.yml +++ b/example-config.yml @@ -269,6 +269,14 @@ itinerary: # defaultRouteTextColor: '000000' # longNameSplitter: ' - ' # order: 2 +# Use this config to overwrite the accessibility score gradation +# map that ships with otp-ui +#accessibilityScore: +# gradationMap: +# 0.0: +# color: "#ffb5b9" +# text: 'Not Accessible' +# icon: thumbs-down ### Use this config for the standard mode selector # modeGroups: diff --git a/lib/components/narrative/default/default-itinerary.js b/lib/components/narrative/default/default-itinerary.js index 6dcecd092..91b98b96b 100644 --- a/lib/components/narrative/default/default-itinerary.js +++ b/lib/components/narrative/default/default-itinerary.js @@ -3,6 +3,7 @@ import React from 'react' import { FormattedMessage, FormattedNumber, FormattedTime } from 'react-intl' import { connect } from 'react-redux' import styled from 'styled-components' +import { AccessibilityRating } from '@opentripplanner/itinerary-body' import FieldTripGroupSize from '../../admin/field-trip-itinerary-group-size' import NarrativeItinerary from '../narrative-itinerary' @@ -11,6 +12,11 @@ import SimpleRealtimeAnnotation from '../simple-realtime-annotation' import FormattedDuration from '../../util/formatted-duration' import FormattedTimeRange from '../../util/formatted-time-range' import { getTotalFare } from '../../../util/state' +import { + itineraryHasAccessibilityScores, + getAccessibilityScoreForItinerary +} from '../../util/accessibility-routing' +import Icon from '../../util/icon' import ItinerarySummary from './itinerary-summary' @@ -163,6 +169,7 @@ class DefaultItinerary extends NarrativeItinerary { render () { const { + accessibilityScoreGradationMap, active, configCosts, currency, @@ -180,7 +187,9 @@ class DefaultItinerary extends NarrativeItinerary { return (
+ {itineraryHasAccessibilityScores(itinerary) && ( + + )} - {(active && !expanded) && + {active && !expanded && ( - } + )} - {(active && expanded) && + {active && expanded && ( <> {showRealtimeAnnotation && } - + - } + )} ) } } const mapStateToProps = (state, ownProps) => { + const gradationMap = state.otp.config.accessibilityScore?.gradationMap + + // Generate icons based on fa icon keys in config + Object.keys(gradationMap).forEach(key => { + const {icon} = gradationMap[key] + if (icon && typeof icon === 'string') { + gradationMap[key].icon = + } + }) + return { + accessibilityScoreGradationMap: gradationMap, configCosts: state.otp.config.itinerary?.costs, // The configured (ambient) currency is needed for rendering the cost // of itineraries whether they include a fare or not, in which case diff --git a/lib/components/narrative/line-itin/connected-itinerary-body.js b/lib/components/narrative/line-itin/connected-itinerary-body.js index 4e41498f4..79b8f167b 100644 --- a/lib/components/narrative/line-itin/connected-itinerary-body.js +++ b/lib/components/narrative/line-itin/connected-itinerary-body.js @@ -43,6 +43,7 @@ class ConnectedItineraryBody extends Component { render () { const { + accessibilityScoreGradationMap, config, diagramVisible, itinerary, @@ -56,6 +57,7 @@ class ConnectedItineraryBody extends Component { return ( { + return !!itinerary.legs.find(leg => !!leg.accessibilityScore) +} + +/** + * Calculates the total itinerary score based on leg score by weighting + * each leg equally + */ +export const getAccessibilityScoreForItinerary = (itinerary) => { + const scores = itinerary.legs + .map((leg) => leg.accessibilityScore || null) + .filter((score) => score !== null) + + return scores.reduce((prev, cur) => prev + (cur * (1 / scores.length)), 0) +} From 83e10d7ce1157c3731cb317c017d397cb73925cd Mon Sep 17 00:00:00 2001 From: miles-grant-ibigroup <86619099+miles-grant-ibigroup@users.noreply.github.com> Date: Fri, 1 Oct 2021 10:13:26 +0100 Subject: [PATCH 2/9] chore: correct typo Co-authored-by: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> --- example-config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example-config.yml b/example-config.yml index 620a2706f..54027cdbe 100644 --- a/example-config.yml +++ b/example-config.yml @@ -269,7 +269,7 @@ itinerary: # defaultRouteTextColor: '000000' # longNameSplitter: ' - ' # order: 2 -# Use this config to overwrite the accessibility score gradation +# Use this config to overwrite the accessibility score gradation # map that ships with otp-ui #accessibilityScore: # gradationMap: From 723e38682e3b72f573066d22c27e4bd5f7a8d320 Mon Sep 17 00:00:00 2001 From: miles-grant-ibigroup Date: Fri, 1 Oct 2021 10:15:09 +0100 Subject: [PATCH 3/9] chore: sort imports --- lib/components/narrative/default/default-itinerary.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/components/narrative/default/default-itinerary.js b/lib/components/narrative/default/default-itinerary.js index 91b98b96b..093461422 100644 --- a/lib/components/narrative/default/default-itinerary.js +++ b/lib/components/narrative/default/default-itinerary.js @@ -13,8 +13,8 @@ import FormattedDuration from '../../util/formatted-duration' import FormattedTimeRange from '../../util/formatted-time-range' import { getTotalFare } from '../../../util/state' import { - itineraryHasAccessibilityScores, - getAccessibilityScoreForItinerary + getAccessibilityScoreForItinerary, + itineraryHasAccessibilityScores } from '../../util/accessibility-routing' import Icon from '../../util/icon' From bc19c7bc9a350ae1a34dc12c826fd9db8eaeaf24 Mon Sep 17 00:00:00 2001 From: miles-grant-ibigroup Date: Fri, 1 Oct 2021 11:18:21 +0100 Subject: [PATCH 4/9] refactor(default-itinerary): allow gradationMap text langauge override --- example-config.yml | 5 +++++ .../narrative/default/default-itinerary.js | 13 +++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/example-config.yml b/example-config.yml index 54027cdbe..481e33c57 100644 --- a/example-config.yml +++ b/example-config.yml @@ -275,6 +275,7 @@ itinerary: # gradationMap: # 0.0: # color: "#ffb5b9" +# # The text can be overridden in the language section # text: 'Not Accessible' # icon: thumbs-down @@ -302,6 +303,10 @@ itinerary: # common: # accessModes: # bikeshare: Blue Bike +# acessibilityScore: +# gradationMap: +# 0.0: +# text: 'Not Accessible' ### Localization section to provide language/locale settings #localization: diff --git a/lib/components/narrative/default/default-itinerary.js b/lib/components/narrative/default/default-itinerary.js index 093461422..53b8200d1 100644 --- a/lib/components/narrative/default/default-itinerary.js +++ b/lib/components/narrative/default/default-itinerary.js @@ -1,6 +1,6 @@ import coreUtils from '@opentripplanner/core-utils' import React from 'react' -import { FormattedMessage, FormattedNumber, FormattedTime } from 'react-intl' +import { FormattedMessage, FormattedNumber, FormattedTime, injectIntl } from 'react-intl' import { connect } from 'react-redux' import styled from 'styled-components' import { AccessibilityRating } from '@opentripplanner/itinerary-body' @@ -262,14 +262,23 @@ class DefaultItinerary extends NarrativeItinerary { } const mapStateToProps = (state, ownProps) => { + const {intl} = ownProps const gradationMap = state.otp.config.accessibilityScore?.gradationMap // Generate icons based on fa icon keys in config + // Override text fields if translation set Object.keys(gradationMap).forEach(key => { const {icon} = gradationMap[key] if (icon && typeof icon === 'string') { gradationMap[key].icon = } + + const localizationId = `config.acessibilityScore.gradationMap.${key}` + const localizedText = intl.formatMessage({id: localizationId}) + // Override the config label if a localized label exists + if (localizationId !== localizedText) { + gradationMap[key].text = localizedText + } }) return { @@ -282,4 +291,4 @@ const mapStateToProps = (state, ownProps) => { } } -export default connect(mapStateToProps)(DefaultItinerary) +export default injectIntl(connect(mapStateToProps)(DefaultItinerary)) From 1aefcd052591a27ed11a5ba56a8714c4b419394b Mon Sep 17 00:00:00 2001 From: miles-grant-ibigroup Date: Mon, 4 Oct 2021 16:15:35 +0100 Subject: [PATCH 5/9] refactor: address pr feedback --- lib/components/narrative/default/default-itinerary.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/components/narrative/default/default-itinerary.js b/lib/components/narrative/default/default-itinerary.js index 53b8200d1..27690436e 100644 --- a/lib/components/narrative/default/default-itinerary.js +++ b/lib/components/narrative/default/default-itinerary.js @@ -273,6 +273,8 @@ const mapStateToProps = (state, ownProps) => { gradationMap[key].icon = } + // As these localization keys are in the config, rather than + // standard language files, the message ids must be dynamically generated const localizationId = `config.acessibilityScore.gradationMap.${key}` const localizedText = intl.formatMessage({id: localizationId}) // Override the config label if a localized label exists From 4227c50a83a2eca8df8289bd7da42a297397b492 Mon Sep 17 00:00:00 2001 From: miles-grant-ibigroup Date: Mon, 4 Oct 2021 18:51:51 +0100 Subject: [PATCH 6/9] refactor(default-itinerary): support gradationMap not being passed --- lib/components/narrative/default/default-itinerary.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/components/narrative/default/default-itinerary.js b/lib/components/narrative/default/default-itinerary.js index 27690436e..9a1a60366 100644 --- a/lib/components/narrative/default/default-itinerary.js +++ b/lib/components/narrative/default/default-itinerary.js @@ -267,7 +267,7 @@ const mapStateToProps = (state, ownProps) => { // Generate icons based on fa icon keys in config // Override text fields if translation set - Object.keys(gradationMap).forEach(key => { + gradationMap && Object.keys(gradationMap).forEach(key => { const {icon} = gradationMap[key] if (icon && typeof icon === 'string') { gradationMap[key].icon = From 9ea4c9a2abda10da92c7628e5ba5c99dbd56b05b Mon Sep 17 00:00:00 2001 From: miles-grant-ibigroup Date: Wed, 27 Oct 2021 11:51:31 +0100 Subject: [PATCH 7/9] chore(deps): update otp-ui --- package.json | 12 ++-- yarn.lock | 195 +++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 172 insertions(+), 35 deletions(-) diff --git a/package.json b/package.json index 522674a56..526b44178 100644 --- a/package.json +++ b/package.json @@ -34,24 +34,24 @@ "dependencies": { "@auth0/auth0-react": "^1.1.0", "@opentripplanner/base-map": "^1.2.0", - "@opentripplanner/core-utils": "^3.2.3", + "@opentripplanner/core-utils": "^4.2.0", "@opentripplanner/endpoints-overlay": "^1.2.0", "@opentripplanner/from-to-location-picker": "^1.2.1", - "@opentripplanner/geocoder": "^1.1.0", + "@opentripplanner/geocoder": "^1.1.1", "@opentripplanner/humanize-distance": "^1.1.0", "@opentripplanner/icons": "^1.1.0", - "@opentripplanner/itinerary-body": "^2.3.1", - "@opentripplanner/location-field": "^1.3.0", + "@opentripplanner/itinerary-body": "^2.5.0", + "@opentripplanner/location-field": "^1.6.1", "@opentripplanner/location-icon": "^1.3.0", "@opentripplanner/park-and-ride-overlay": "^1.2.0", - "@opentripplanner/printable-itinerary": "^1.2.0", + "@opentripplanner/printable-itinerary": "^1.3.1", "@opentripplanner/route-viewer-overlay": "^1.1.0", "@opentripplanner/stop-viewer-overlay": "^1.1.0", "@opentripplanner/stops-overlay": "^3.2.0", "@opentripplanner/transit-vehicle-overlay": "^2.2.0", "@opentripplanner/transitive-overlay": "^1.1.1", "@opentripplanner/trip-details": "^1.3.1", - "@opentripplanner/trip-form": "^1.3.1", + "@opentripplanner/trip-form": "^1.6.0", "@opentripplanner/trip-viewer-overlay": "^1.1.0", "@opentripplanner/vehicle-rental-overlay": "^1.2.0", "blob-stream": "^0.1.3", diff --git a/yarn.lock b/yarn.lock index 939a4c77f..d11d9ee7a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1071,6 +1071,13 @@ dependencies: regenerator-runtime "^0.13.4" +"@babel/runtime@^7.14.0", "@babel/runtime@^7.15.3": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.4.tgz#fd17d16bfdf878e6dd02d19753a39fa8a8d9c84a" + integrity sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw== + dependencies: + regenerator-runtime "^0.13.4" + "@babel/template@^7.10.4", "@babel/template@^7.12.7", "@babel/template@^7.4.0": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.7.tgz#c817233696018e39fbb6c491d2fb684e05ed43bc" @@ -1125,6 +1132,11 @@ resolved "https://registry.yarnpkg.com/@conveyal/lonlat/-/lonlat-1.4.0.tgz#18a5c1349078a779e710d24af11bc02b24127ba0" integrity sha512-ag1FcRuwRGAZgeZ4e3sUq+gblf1Pgma2c9SaIVXluIrgsZ9Lrq7xhCbV0ErN8chyg/OCOoG8m/l3mgzbycQCnQ== +"@conveyal/lonlat@^1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@conveyal/lonlat/-/lonlat-1.4.1.tgz#9970f33a2dc810ac08e89c844901405f18da478b" + integrity sha512-Z4W1NmvDsnkylhPMDWCk7kLaAjRtA9BVixASFxDPVkQwAiceOxaLEo4UVbZys4jNFzdtbcZ1UVPr6SQHBmEsrA== + "@csstools/convert-colors@^1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" @@ -1166,7 +1178,7 @@ resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== -"@emotion/is-prop-valid@^0.8.6", "@emotion/is-prop-valid@^0.8.8": +"@emotion/is-prop-valid@^0.8.6", "@emotion/is-prop-valid@^0.8.7", "@emotion/is-prop-valid@^0.8.8": version "0.8.8" resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz#db28b1c4368a259b60a97311d6a952d4fd01ac1a" integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA== @@ -1560,7 +1572,7 @@ "@opentripplanner/core-utils" "^3.0.4" prop-types "^15.7.2" -"@opentripplanner/core-utils@^3.0.0", "@opentripplanner/core-utils@^3.0.4", "@opentripplanner/core-utils@^3.1.1", "@opentripplanner/core-utils@^3.2.1", "@opentripplanner/core-utils@^3.2.3": +"@opentripplanner/core-utils@^3.0.0", "@opentripplanner/core-utils@^3.0.4", "@opentripplanner/core-utils@^3.1.1", "@opentripplanner/core-utils@^3.2.1": version "3.2.3" resolved "https://registry.yarnpkg.com/@opentripplanner/core-utils/-/core-utils-3.2.3.tgz#dd8d9107c268308ea922220e843a491411b48100" integrity sha512-c18qsVsPSCNjWmDaDCRgyZTuRWW7FfmHxI3EoOoasWCjJWhkuWdypWCzPjqPPTUXdOs835lPlw9BlkPadSIa0A== @@ -1575,6 +1587,24 @@ prop-types "^15.7.2" qs "^6.9.1" +"@opentripplanner/core-utils@^4.1.0", "@opentripplanner/core-utils@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@opentripplanner/core-utils/-/core-utils-4.2.0.tgz#c6b1097221f7372798bf53db969e47cf86e9bb66" + integrity sha512-FdwLQJxrS9oxbITctFBar4v0UcJng5F2OaApQN8tGWqQhnIrxb+odtgvFMxR4ExKBGkS8TKfv4DSSmZXUC24Mg== + dependencies: + "@mapbox/polyline" "^1.1.0" + "@opentripplanner/geocoder" "^1.1.0" + "@styled-icons/foundation" "^10.34.0" + "@turf/along" "^6.0.1" + bowser "^2.7.0" + date-fns "^2.23.0" + date-fns-tz "^1.1.4" + lodash.clonedeep "^4.5.0" + lodash.isequal "^4.5.0" + moment "^2.24.0" + prop-types "^15.7.2" + qs "^6.9.1" + "@opentripplanner/endpoints-overlay@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@opentripplanner/endpoints-overlay/-/endpoints-overlay-1.2.0.tgz#d8bcf347d82b1566352c4c2bc52f4f389bf72f6b" @@ -1604,6 +1634,16 @@ isomorphic-mapzen-search "^1.5.1" lodash.memoize "^4.1.2" +"@opentripplanner/geocoder@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@opentripplanner/geocoder/-/geocoder-1.1.1.tgz#a449ad868a01d9e35291e52f68946929469c065a" + integrity sha512-XejHs5KvYcZOnv/oh8QrF4JU43Fne803HjWx0o0a7OfxqvWj9Xh7ioKktKz7HMXmtI9nSMWWXpeqLW6tTp9K9w== + dependencies: + "@conveyal/geocoder-arcgis-geojson" "^0.0.2" + "@conveyal/lonlat" "^1.4.1" + isomorphic-mapzen-search "^1.5.1" + lodash.memoize "^4.1.2" + "@opentripplanner/humanize-distance@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@opentripplanner/humanize-distance/-/humanize-distance-1.1.0.tgz#aa5ecdd70f33cfbdd214c76da4ba799a8ab473a5" @@ -1617,32 +1657,42 @@ "@opentripplanner/core-utils" "^3.0.4" prop-types "^15.7.2" -"@opentripplanner/itinerary-body@^2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@opentripplanner/itinerary-body/-/itinerary-body-2.3.1.tgz#451a21e25a9478da22c37356d879eeef09fdc699" - integrity sha512-9hRK3dqOm1/6v6jQnEvOzlYCWIZ0OjDhLfufyDi4daYidWUyqumwo8/LIuFXArqmCRfP89bLYoPSsWiRaKAKSQ== +"@opentripplanner/icons@^1.2.0": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@opentripplanner/icons/-/icons-1.2.1.tgz#aaaf4c7ac5c11a64cc3387be031fb1a71acb3806" + integrity sha512-LMPRxc8S34CklMJEciOw/fGFx7YEc4lwJJqyFKofisslObTK2Tx1Q7dCFFYCO2APqKDGuGxTUIkvYyv5wlFaxQ== dependencies: - "@opentripplanner/core-utils" "^3.0.4" + "@opentripplanner/core-utils" "^4.1.0" + prop-types "^15.7.2" + +"@opentripplanner/itinerary-body@^2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@opentripplanner/itinerary-body/-/itinerary-body-2.5.0.tgz#c533712b7a7f1da2e9625739d0b36a26a5587c99" + integrity sha512-r1ZRUpK0GuvCiRV/3hakQKtt4cQe9xYqUAMghh/V/EhBDa3MAW1mX5bGC/4QUBRa4rmU2HGQKALn5j8qrcDzrA== + dependencies: + "@opentripplanner/core-utils" "^4.1.0" "@opentripplanner/humanize-distance" "^1.1.0" - "@opentripplanner/icons" "^1.0.4" - "@opentripplanner/location-icon" "^1.0.1" + "@opentripplanner/icons" "^1.1.0" + "@opentripplanner/location-icon" "^1.3.0" + "@styled-icons/fa-solid" "^10.34.0" + "@styled-icons/foundation" "^10.34.0" currency-formatter "^1.5.5" moment "^2.24.0" prop-types "^15.7.2" react-resize-detector "^4.2.1" velocity-react "^1.4.3" -"@opentripplanner/location-field@^1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@opentripplanner/location-field/-/location-field-1.3.0.tgz#18c31edfe03d8483e0663cbfa6ced5349b809aa7" - integrity sha512-j9TvSOfB9EAiRHIy6lR43qnPqQQqlnqO1WjibBhThUkgkxL/NOy688hAJuUyna+PXE/m3SJKgNlVdkyDzyJ9HQ== +"@opentripplanner/location-field@^1.6.1": + version "1.6.1" + resolved "https://registry.yarnpkg.com/@opentripplanner/location-field/-/location-field-1.6.1.tgz#2a439d4c87f1ee2e914fb628ab919eda32498b58" + integrity sha512-5RPn1j8o7ACWhJ9v/X9G/NZoORqEq91xplE8y0LGz6dLRhnRjY2brhqIz4DtzKyWM3siMJS51dsxOUWhkJDMDA== dependencies: - "@opentripplanner/core-utils" "^3.0.4" - "@opentripplanner/geocoder" "^1.0.2" + "@opentripplanner/core-utils" "^4.1.0" + "@opentripplanner/geocoder" "^1.1.0" "@opentripplanner/humanize-distance" "^1.1.0" - "@opentripplanner/location-icon" "^1.0.1" + "@opentripplanner/location-icon" "^1.3.0" + "@styled-icons/fa-solid" "^10.34.0" prop-types "^15.7.2" - styled-icons "^9.1.0" throttle-debounce "^2.1.0" "@opentripplanner/location-icon@^1.0.1", "@opentripplanner/location-icon@^1.3.0": @@ -1661,12 +1711,12 @@ "@opentripplanner/from-to-location-picker" "^1.0.3" prop-types "^15.7.2" -"@opentripplanner/printable-itinerary@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@opentripplanner/printable-itinerary/-/printable-itinerary-1.2.0.tgz#cf5c7b9ea35ccc9140ea6e6e7a8cd620c75e2e11" - integrity sha512-lG7f7c3ZB4DlRcnSTt8V1dH1/bjeW28bcmAnutjjxsM4R/8RutmMbMay67IxfapPWq29Y91sSvIbJDLexMyMyA== +"@opentripplanner/printable-itinerary@^1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@opentripplanner/printable-itinerary/-/printable-itinerary-1.3.1.tgz#e82ecfc91ecd5fb8f4ec4d7d3cc1548f33b3da7e" + integrity sha512-3T+r/U+0Pfe6CvUSWbqBBFS5uUyq3T3v19xV3jb7KplsQpYLy4nKjQcqO2/doxf/fVpWZ3XPXAFMntFHqx7pTA== dependencies: - "@opentripplanner/core-utils" "^3.0.4" + "@opentripplanner/core-utils" "^4.1.0" "@opentripplanner/humanize-distance" "^1.1.0" prop-types "^15.7.2" @@ -1731,14 +1781,19 @@ styled-icons "^9.1.0" velocity-react "^1.4.3" -"@opentripplanner/trip-form@^1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@opentripplanner/trip-form/-/trip-form-1.3.1.tgz#c8e08bb068372eae0b974d31626a1da9f19cf485" - integrity sha512-PG2ZvWBevhOUcvf5jvTIfn8R30EFVGlEMq1b7geDAN1BzGCLDOh10bxFmnzdsXJG7XZ2hkThTvADl3DgPypwrA== - dependencies: - "@opentripplanner/core-utils" "^3.0.4" - "@opentripplanner/icons" "^1.0.4" +"@opentripplanner/trip-form@^1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@opentripplanner/trip-form/-/trip-form-1.6.0.tgz#d681b6dc34a9a682bd20dcc5f8a68a621d62cfb5" + integrity sha512-y7jR9HigmS3khepPwSKvJmYdStvBhR9q0QioGY0ErVH+PfW1aIo4V7ClVHo0TGH4vOFSJakRVyrVnOC+ENRQJw== + dependencies: + "@opentripplanner/core-utils" "^4.1.0" + "@opentripplanner/icons" "^1.2.0" + "@styled-icons/bootstrap" "^10.34.0" + "@styled-icons/boxicons-regular" "^10.38.0" + "@styled-icons/fa-regular" "^10.34.0" + "@styled-icons/fa-solid" "^10.34.0" moment "^2.17.1" + react-indiana-drag-scroll "^2.0.1" "@opentripplanner/trip-viewer-overlay@^1.1.0": version "1.1.0" @@ -1896,6 +1951,14 @@ lodash "^4.17.4" read-pkg-up "^7.0.0" +"@styled-icons/bootstrap@^10.34.0": + version "10.34.0" + resolved "https://registry.yarnpkg.com/@styled-icons/bootstrap/-/bootstrap-10.34.0.tgz#d9142e9eb70dc437f7ef62ffc40168e1ae13ab12" + integrity sha512-UpzdVUR7r9BNqEfPrMchJdgMZEg9eXQxLQJUXM0ouvbI5o9j21/y1dGameO4PZtYbutT/dWv5O6y24z5JWzd5w== + dependencies: + "@babel/runtime" "^7.14.0" + "@styled-icons/styled-icon" "^10.6.3" + "@styled-icons/boxicons-logos@^9.4.1": version "9.4.1" resolved "https://registry.yarnpkg.com/@styled-icons/boxicons-logos/-/boxicons-logos-9.4.1.tgz#774e7f73839e834445dcc0ae4c0c356221767664" @@ -1904,6 +1967,14 @@ "@styled-icons/styled-icon" "^9.4.1" tslib "^1.9.3" +"@styled-icons/boxicons-regular@^10.38.0": + version "10.38.0" + resolved "https://registry.yarnpkg.com/@styled-icons/boxicons-regular/-/boxicons-regular-10.38.0.tgz#1eb80b4f94a18a9b77b11dee5204aa23378d37ec" + integrity sha512-xjhafoa0/EeYtQOyTw+ohuSlBx599t8l8++JH1tQlM0l73dP4icTpF4znYL+HhZeaUe3D+UhrkfWuBBua2w2Qw== + dependencies: + "@babel/runtime" "^7.15.3" + "@styled-icons/styled-icon" "^10.6.3" + "@styled-icons/boxicons-regular@^9.4.1": version "9.4.1" resolved "https://registry.yarnpkg.com/@styled-icons/boxicons-regular/-/boxicons-regular-9.4.1.tgz#742a1d0b5798c54f189b9278810d8110df8f9754" @@ -1960,6 +2031,14 @@ "@styled-icons/styled-icon" "^9.4.1" tslib "^1.9.3" +"@styled-icons/fa-regular@^10.34.0": + version "10.34.0" + resolved "https://registry.yarnpkg.com/@styled-icons/fa-regular/-/fa-regular-10.34.0.tgz#b6761412c0b2985eae60d20bff77e76cecd2deb8" + integrity sha512-QUqljT+uIfowGurV5GzjnHA1qvq922H+6yGRzQYBxBZ5Vgaak4Q71jtCSMqZKXcOG3tngMyhrOuaNaPOw1Q1pQ== + dependencies: + "@babel/runtime" "^7.14.0" + "@styled-icons/styled-icon" "^10.6.3" + "@styled-icons/fa-regular@^9.4.1": version "9.4.1" resolved "https://registry.yarnpkg.com/@styled-icons/fa-regular/-/fa-regular-9.4.1.tgz#556b1840e97db031b5c07a7175b57103e3fd988b" @@ -1968,6 +2047,14 @@ "@styled-icons/styled-icon" "^9.4.1" tslib "^1.9.3" +"@styled-icons/fa-solid@^10.34.0": + version "10.34.0" + resolved "https://registry.yarnpkg.com/@styled-icons/fa-solid/-/fa-solid-10.34.0.tgz#315a6f6f25d38202d3387928191731e4c7a3bb18" + integrity sha512-PnJMUPcbuPA7gswxl9FKd725qaqP5VSbmX7rk+ZZ7ivdA6Dbi1VoKYXqAc62OEisGDhzn5g56KbBvE14W1n7vw== + dependencies: + "@babel/runtime" "^7.14.0" + "@styled-icons/styled-icon" "^10.6.3" + "@styled-icons/fa-solid@^9.4.1": version "9.4.1" resolved "https://registry.yarnpkg.com/@styled-icons/fa-solid/-/fa-solid-9.4.1.tgz#d30de755f8fee6e932032e97fa592cb1eaa21d8e" @@ -1984,6 +2071,14 @@ "@styled-icons/styled-icon" "^9.4.1" tslib "^1.9.3" +"@styled-icons/foundation@^10.34.0": + version "10.34.0" + resolved "https://registry.yarnpkg.com/@styled-icons/foundation/-/foundation-10.34.0.tgz#7d2ffb882701ca415ea0296ef5464bbd5884a5fe" + integrity sha512-RJksGQoStOqVQegwvtDTqrhEQjc7x5izqzBuwMw6R+18XcBC+pP8oRtuisv2ogn5icVrN/FWQHMx8EJ14jMdig== + dependencies: + "@babel/runtime" "^7.14.0" + "@styled-icons/styled-icon" "^10.6.3" + "@styled-icons/foundation@^9.5.0": version "9.5.0" resolved "https://registry.yarnpkg.com/@styled-icons/foundation/-/foundation-9.5.0.tgz#011ac022ffcb20868385b97bf4fb173cceaf634d" @@ -2056,6 +2151,14 @@ "@styled-icons/styled-icon" "^9.4.1" tslib "^1.9.3" +"@styled-icons/styled-icon@^10.6.3": + version "10.6.3" + resolved "https://registry.yarnpkg.com/@styled-icons/styled-icon/-/styled-icon-10.6.3.tgz#eae0e5e18fd601ac47e821bb9c2e099810e86403" + integrity sha512-/A95L3peioLoWFiy+/eKRhoQ9r/oRrN/qzbSX4hXU1nGP2rUXcX3LWUhoBNAOp9Rw38ucc/4ralY427UUNtcGQ== + dependencies: + "@babel/runtime" "^7.10.5" + "@emotion/is-prop-valid" "^0.8.7" + "@styled-icons/styled-icon@^9.4.1": version "9.4.1" resolved "https://registry.yarnpkg.com/@styled-icons/styled-icon/-/styled-icon-9.4.1.tgz#9dc236c85afd89edc2bc7265ec7858cbc35d4234" @@ -4849,6 +4952,11 @@ classnames@^2.2.5: resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== +classnames@^2.2.6: + version "2.3.1" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" + integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== + clean-stack@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.1.0.tgz#9e7fec7f3f8340a2ab4f127c80273085e8fbbdd0" @@ -6028,6 +6136,16 @@ data-urls@^1.0.0: whatwg-mimetype "^2.2.0" whatwg-url "^7.0.0" +date-fns-tz@^1.1.4: + version "1.1.6" + resolved "https://registry.yarnpkg.com/date-fns-tz/-/date-fns-tz-1.1.6.tgz#93cbf354e2aeb2cd312ffa32e462c1943cf20a8e" + integrity sha512-nyy+URfFI3KUY7udEJozcoftju+KduaqkVfwyTIE0traBiVye09QnyWKLZK7drRr5h9B7sPJITmQnS3U6YOdQg== + +date-fns@^2.23.0: + version "2.25.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.25.0.tgz#8c5c8f1d958be3809a9a03f4b742eba894fc5680" + integrity sha512-ovYRFnTrbGPD4nqaEqescPEv1mNwvt+UTqI3Ay9SzNtey9NZnYu6E2qCcBBgJ6/2VF1zGGygpyTDITqpQQ5e+w== + date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" @@ -6048,6 +6166,11 @@ debounce@^1.0.0: resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.0.tgz#44a540abc0ea9943018dc0eaa95cce87f65cd131" integrity sha512-mYtLl1xfZLi1m4RtQYlZgJUNQjl4ZxVnHzIR8nLLgi4q1YT8o/WM+MK/f8yfcc9s5Ir5zRaPZyZU6xs1Syoocg== +debounce@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" + integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== + debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.5.1, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -6552,6 +6675,11 @@ duplexify@^3.4.2, duplexify@^3.6.0: readable-stream "^2.0.0" stream-shift "^1.0.0" +easy-bem@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/easy-bem/-/easy-bem-1.1.1.tgz#1bfcc10425498090bcfddc0f9c000aba91399e03" + integrity sha512-GJRqdiy2h+EXy6a8E6R+ubmqUM08BK0FWNq41k24fup6045biQ8NXxoXimiwegMQvFFV3t1emADdGNL1TlS61A== + ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" @@ -14644,6 +14772,15 @@ react-fontawesome@^1.5.0: dependencies: prop-types "^15.5.6" +react-indiana-drag-scroll@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/react-indiana-drag-scroll/-/react-indiana-drag-scroll-2.1.0.tgz#37654eae8caced01cdecc8bce55f0382871a021d" + integrity sha512-Tj94Dv9PkmoKqc9nxK/dzwhtE8pP7NTxmeHqkD8KN0zad1NNE+/JsvRcK4EdqE6CdA2nMESzqPMvv1AzRXdBew== + dependencies: + classnames "^2.2.6" + debounce "^1.2.0" + easy-bem "^1.1.1" + react-input-autosize@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/react-input-autosize/-/react-input-autosize-2.2.2.tgz#fcaa7020568ec206bc04be36f4eb68e647c4d8c2" From 6e7678d76435625c5d83ef2229bd646d88672025 Mon Sep 17 00:00:00 2001 From: miles-grant-ibigroup Date: Thu, 28 Oct 2021 12:50:12 +0100 Subject: [PATCH 8/9] refactor(example-config): adjust to match practical use --- example-config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/example-config.yml b/example-config.yml index 54ca6e068..275b3b7d3 100644 --- a/example-config.yml +++ b/example-config.yml @@ -330,8 +330,8 @@ itinerary: # bikeshare: Blue Bike # acessibilityScore: # gradationMap: -# 0.0: -# text: 'Not Accessible' +# 0.0: 'Not Accessible' +# 0.9: 'Mostly Accessible' # config: # menuItems: # demo-item: Demo Item From aed00582dcb3490c5f3945f7d35d7e70a3c9232e Mon Sep 17 00:00:00 2001 From: miles-grant-ibigroup Date: Thu, 28 Oct 2021 15:56:51 +0100 Subject: [PATCH 9/9] refactor: address pr feedback --- example-config.yml | 14 +++++++------- .../narrative/default/default-itinerary.js | 3 ++- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/example-config.yml b/example-config.yml index 275b3b7d3..37acdcc6a 100644 --- a/example-config.yml +++ b/example-config.yml @@ -328,13 +328,13 @@ itinerary: # common: # accessModes: # bikeshare: Blue Bike -# acessibilityScore: -# gradationMap: -# 0.0: 'Not Accessible' -# 0.9: 'Mostly Accessible' -# config: -# menuItems: -# demo-item: Demo Item +# config: +# acessibilityScore: +# gradationMap: +# 0.0: 'Not Accessible' +# 0.9: 'Mostly Accessible' +# menuItems: +# demo-item: Demo Item ### Localization section to provide language/locale settings #localization: diff --git a/lib/components/narrative/default/default-itinerary.js b/lib/components/narrative/default/default-itinerary.js index 2611a68db..128e408dc 100644 --- a/lib/components/narrative/default/default-itinerary.js +++ b/lib/components/narrative/default/default-itinerary.js @@ -209,7 +209,8 @@ class DefaultItinerary extends NarrativeItinerary { const bSelected = this._isSortingOnAttribute(b) if (aSelected) return -1 if (bSelected) return 1 - else return a.order - b.order + + return a.order - b.order }).map((attribute) => { const isSelected = this._isSortingOnAttribute(attribute) const options = attribute.id === 'arrivalTime' ? timeOptions : {}