@opentripplanner/vehicle-rental-overlay 1.3.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -21,10 +21,14 @@ var templatePropTypes = {
21
21
  children: PropTypes.node,
22
22
 
23
23
  /** The rental vehicle or station to render. */
24
- entity: coreUtils.types.stationType.isRequired
24
+ entity: coreUtils.types.stationType.isRequired,
25
+
26
+ /** leaflet attribute to control tabindex value for keyboaryd-only / SR users */
27
+ keyboard: PropTypes.bool
25
28
  };
26
29
  var templateDefaultProps = {
27
- children: null
30
+ children: null,
31
+ keyboard: false
28
32
  };
29
33
  /**
30
34
  * Renders a shared bike or shared bike dock as a circle
@@ -40,6 +44,7 @@ export var SharedBikeCircle = function SharedBikeCircle(_ref) {
40
44
 
41
45
  var GeneratedMarker = function GeneratedMarker(_ref2) {
42
46
  var children = _ref2.children,
47
+ keyboard = _ref2.keyboard,
43
48
  station = _ref2.entity;
44
49
  var newStrokeColor = strokeColor || fillColor;
45
50
 
@@ -52,6 +57,7 @@ export var SharedBikeCircle = function SharedBikeCircle(_ref) {
52
57
  color: newStrokeColor,
53
58
  fillColor: fillColor,
54
59
  fillOpacity: 1,
60
+ keyboard: keyboard,
55
61
  radius: pixels - (station.isFloatingBike ? 1 : 0),
56
62
  weight: 1
57
63
  }, children);
@@ -68,6 +74,7 @@ export var SharedBikeCircle = function SharedBikeCircle(_ref) {
68
74
 
69
75
  export var HubAndFloatingBike = function HubAndFloatingBike(_ref3) {
70
76
  var children = _ref3.children,
77
+ keyboard = _ref3.keyboard,
71
78
  station = _ref3.entity;
72
79
  var icon;
73
80
 
@@ -83,6 +90,7 @@ export var HubAndFloatingBike = function HubAndFloatingBike(_ref3) {
83
90
 
84
91
  return /*#__PURE__*/React.createElement(Marker, {
85
92
  icon: icon,
93
+ keyboard: keyboard,
86
94
  position: [station.y, station.x]
87
95
  }, children);
88
96
  };
@@ -115,9 +123,11 @@ export var GenericMarker = function GenericMarker(_ref4) {
115
123
 
116
124
  var GeneratedMarker = function GeneratedMarker(_ref5) {
117
125
  var children = _ref5.children,
126
+ keyboard = _ref5.keyboard,
118
127
  station = _ref5.entity;
119
128
  return /*#__PURE__*/React.createElement(Marker, {
120
129
  icon: markerIcon,
130
+ keyboard: keyboard,
121
131
  position: [station.y, station.x]
122
132
  }, children);
123
133
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/DefaultMarkers/index.js"],"names":["divIcon","memoize","coreUtils","PropTypes","React","ReactDOMServer","CircleMarker","Marker","floatingBikeIcon","hubIcons","Styled","templatePropTypes","children","node","entity","types","stationType","isRequired","templateDefaultProps","SharedBikeCircle","dockStrokeColor","fillColor","pixels","strokeColor","GeneratedMarker","station","newStrokeColor","isFloatingBike","y","x","propTypes","defaultProps","HubAndFloatingBike","icon","capacity","bikesAvailable","spacesAvailable","pctFull","i","Math","round","getStationMarkerByColor","color","className","iconSize","popupAnchor","html","renderToStaticMarkup","GenericMarker","markerIcon"],"mappings":"AAAA,SAASA,OAAT,QAAwB,SAAxB;AACA,OAAOC,OAAP,MAAoB,gBAApB;AACA,OAAOC,SAAP,MAAsB,6BAAtB;AACA,OAAOC,SAAP,MAAsB,YAAtB;AACA,OAAOC,KAAP,MAAkB,OAAlB;AACA,OAAOC,cAAP,MAA2B,kBAA3B;AACA,SAASC,YAAT,EAAuBC,MAAvB,QAAqC,eAArC;AAEA,SAASC,gBAAT,EAA2BC,QAA3B,QAA2C,eAA3C;AACA,OAAO,KAAKC,MAAZ,MAAwB,WAAxB;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;;AACA,IAAMC,iBAAiB,GAAG;AACxB;AACAC,EAAAA,QAAQ,EAAET,SAAS,CAACU,IAFI;;AAGxB;AACAC,EAAAA,MAAM,EAAEZ,SAAS,CAACa,KAAV,CAAgBC,WAAhB,CAA4BC;AAJZ,CAA1B;AAMA,IAAMC,oBAAoB,GAAG;AAC3BN,EAAAA,QAAQ,EAAE;AADiB,CAA7B;AAIA;AACA;AACA;AACA;;AACA,OAAO,IAAMO,gBAAgB,GAAG,SAAnBA,gBAAmB,OAK1B;AAAA,MAJJC,eAII,QAJJA,eAII;AAAA,4BAHJC,SAGI;AAAA,MAHJA,SAGI,+BAHQ,MAGR;AAAA,MAFJC,MAEI,QAFJA,MAEI;AAAA,MADJC,WACI,QADJA,WACI;;AACJ,MAAMC,eAAe,GAAG,SAAlBA,eAAkB,QAAmC;AAAA,QAAhCZ,QAAgC,SAAhCA,QAAgC;AAAA,QAAda,OAAc,SAAtBX,MAAsB;AACzD,QAAIY,cAAc,GAAGH,WAAW,IAAIF,SAApC;;AAEA,QAAI,CAACI,OAAO,CAACE,cAAb,EAA6B;AAC3BD,MAAAA,cAAc,GAAGN,eAAe,IAAIG,WAApC;AACD;;AAED,wBACE,oBAAC,YAAD;AACE,MAAA,MAAM,EAAE,CAACE,OAAO,CAACG,CAAT,EAAYH,OAAO,CAACI,CAApB,CADV;AAEE,MAAA,KAAK,EAAEH,cAFT;AAGE,MAAA,SAAS,EAAEL,SAHb;AAIE,MAAA,WAAW,EAAE,CAJf;AAKE,MAAA,MAAM,EAAEC,MAAM,IAAIG,OAAO,CAACE,cAAR,GAAyB,CAAzB,GAA6B,CAAjC,CALhB;AAME,MAAA,MAAM,EAAE;AANV,OAQGf,QARH,CADF;AAYD,GAnBD;;AAqBAY,EAAAA,eAAe,CAACM,SAAhB,GAA4BnB,iBAA5B;AACAa,EAAAA,eAAe,CAACO,YAAhB,GAA+Bb,oBAA/B;AACA,SAAOM,eAAP;AACD,CA9BM;AAgCP;AACA;AACA;AACA;;AACA,OAAO,IAAMQ,kBAAkB,GAAG,SAArBA,kBAAqB,QAAmC;AAAA,MAAhCpB,QAAgC,SAAhCA,QAAgC;AAAA,MAAda,OAAc,SAAtBX,MAAsB;AACnE,MAAImB,IAAJ;;AACA,MAAIR,OAAO,CAACE,cAAZ,EAA4B;AAC1BM,IAAAA,IAAI,GAAGzB,gBAAP;AACD,GAFD,MAEO;AACL,QAAM0B,QAAQ,GAAGT,OAAO,CAACU,cAAR,GAAyBV,OAAO,CAACW,eAAlD;AACA,QAAIF,QAAQ,KAAK,CAAjB,EAAoB,OAAO,IAAP;AACpB,QAAMG,OAAO,GAAGZ,OAAO,CAACU,cAAR,GAAyBD,QAAzC;AACA,QAAMI,CAAC,GAAGC,IAAI,CAACC,KAAL,CAAWH,OAAO,GAAG,CAArB,CAAV;AACAJ,IAAAA,IAAI,GAAGxB,QAAQ,CAAC6B,CAAD,CAAf;AACD;;AACD,sBACE,oBAAC,MAAD;AAAQ,IAAA,IAAI,EAAEL,IAAd;AAAoB,IAAA,QAAQ,EAAE,CAACR,OAAO,CAACG,CAAT,EAAYH,OAAO,CAACI,CAApB;AAA9B,KACGjB,QADH,CADF;AAKD,CAhBM;AAiBPoB,kBAAkB,CAACF,SAAnB,GAA+BnB,iBAA/B;AACAqB,kBAAkB,CAACD,YAAnB,GAAkCb,oBAAlC;AAEA;AACA;AACA;;AACA,IAAMuB,uBAAuB,GAAGxC,OAAO,CAAC,UAAAyC,KAAK;AAAA,SAC3C1C,OAAO,CAAC;AACN2C,IAAAA,SAAS,EAAE,EADL;AAENC,IAAAA,QAAQ,EAAE,CAAC,EAAD,EAAK,EAAL,CAFJ;AAGNC,IAAAA,WAAW,EAAE,CAAC,CAAD,EAAI,CAAC,CAAL,CAHP;AAINC,IAAAA,IAAI,EAAEzC,cAAc,CAAC0C,oBAAf,eACJ,oBAAC,MAAD,CAAQ,aAAR;AAAsB,MAAA,KAAK,EAAEL;AAA7B,MADI;AAJA,GAAD,CADoC;AAAA,CAAN,CAAvC;AAWA;AACA;AACA;AACA;AACA;;AACA,OAAO,IAAMM,aAAa,GAAG,SAAhBA,aAAgB,QAA4B;AAAA,8BAAzB3B,SAAyB;AAAA,MAAzBA,SAAyB,gCAAb,MAAa;AACvD,MAAM4B,UAAU,GAAGR,uBAAuB,CAACpB,SAAD,CAA1C;;AAEA,MAAMG,eAAe,GAAG,SAAlBA,eAAkB;AAAA,QAAGZ,QAAH,SAAGA,QAAH;AAAA,QAAqBa,OAArB,SAAaX,MAAb;AAAA,wBACtB,oBAAC,MAAD;AAAQ,MAAA,IAAI,EAAEmC,UAAd;AAA0B,MAAA,QAAQ,EAAE,CAACxB,OAAO,CAACG,CAAT,EAAYH,OAAO,CAACI,CAApB;AAApC,OACGjB,QADH,CADsB;AAAA,GAAxB;;AAKAY,EAAAA,eAAe,CAACM,SAAhB,GAA4BnB,iBAA5B;AACAa,EAAAA,eAAe,CAACO,YAAhB,GAA+Bb,oBAA/B;AACA,SAAOM,eAAP;AACD,CAXM","sourcesContent":["import { divIcon } from \"leaflet\";\nimport memoize from \"lodash.memoize\";\nimport coreUtils from \"@opentripplanner/core-utils\";\nimport PropTypes from \"prop-types\";\nimport React from \"react\";\nimport ReactDOMServer from \"react-dom/server\";\nimport { CircleMarker, Marker } from \"react-leaflet\";\n\nimport { floatingBikeIcon, hubIcons } from \"../bike-icons\";\nimport * as Styled from \"../styled\";\n\n/**\n * This file contains default marker types for rental vehicles,\n * that can be used when defining the VehicleRentalOverlay's symbol prop:\n * - SharedBikeCircle\n * - GenericMarker\n * - HubAndFloatingBike\n */\n\n// Prop types reused across components.\nconst templatePropTypes = {\n /** The children of the component. */\n children: PropTypes.node,\n /** The rental vehicle or station to render. */\n entity: coreUtils.types.stationType.isRequired\n};\nconst templateDefaultProps = {\n children: null\n};\n\n/**\n * Renders a shared bike or shared bike dock as a circle\n * with predefined colors and size.\n */\nexport const SharedBikeCircle = ({\n dockStrokeColor,\n fillColor = \"gray\",\n pixels,\n strokeColor\n}) => {\n const GeneratedMarker = ({ children, entity: station }) => {\n let newStrokeColor = strokeColor || fillColor;\n\n if (!station.isFloatingBike) {\n newStrokeColor = dockStrokeColor || strokeColor;\n }\n\n return (\n <CircleMarker\n center={[station.y, station.x]}\n color={newStrokeColor}\n fillColor={fillColor}\n fillOpacity={1}\n radius={pixels - (station.isFloatingBike ? 1 : 0)}\n weight={1}\n >\n {children}\n </CircleMarker>\n );\n };\n\n GeneratedMarker.propTypes = templatePropTypes;\n GeneratedMarker.defaultProps = templateDefaultProps;\n return GeneratedMarker;\n};\n\n/**\n * A component that renders rental bike entities\n * either as a bike or a bike dock (or hub, showing spaces available).\n */\nexport const HubAndFloatingBike = ({ children, entity: station }) => {\n let icon;\n if (station.isFloatingBike) {\n icon = floatingBikeIcon;\n } else {\n const capacity = station.bikesAvailable + station.spacesAvailable;\n if (capacity === 0) return null;\n const pctFull = station.bikesAvailable / capacity;\n const i = Math.round(pctFull * 9);\n icon = hubIcons[i];\n }\n return (\n <Marker icon={icon} position={[station.y, station.x]}>\n {children}\n </Marker>\n );\n};\nHubAndFloatingBike.propTypes = templatePropTypes;\nHubAndFloatingBike.defaultProps = templateDefaultProps;\n\n/**\n * Creates and caches a leaflet element icon based on color.\n */\nconst getStationMarkerByColor = memoize(color =>\n divIcon({\n className: \"\",\n iconSize: [11, 16],\n popupAnchor: [0, -6],\n html: ReactDOMServer.renderToStaticMarkup(\n <Styled.StationMarker color={color} />\n )\n })\n);\n\n/**\n * Helper function to create a leaflet Marker component to render entities\n * using fixed fill color.\n * Usage: GenericMarker({ fillColor: \"#F204B5\" })\n */\nexport const GenericMarker = ({ fillColor = \"gray\" }) => {\n const markerIcon = getStationMarkerByColor(fillColor);\n\n const GeneratedMarker = ({ children, entity: station }) => (\n <Marker icon={markerIcon} position={[station.y, station.x]}>\n {children}\n </Marker>\n );\n GeneratedMarker.propTypes = templatePropTypes;\n GeneratedMarker.defaultProps = templateDefaultProps;\n return GeneratedMarker;\n};\n"],"file":"index.js"}
1
+ {"version":3,"sources":["../../src/DefaultMarkers/index.js"],"names":["divIcon","memoize","coreUtils","PropTypes","React","ReactDOMServer","CircleMarker","Marker","floatingBikeIcon","hubIcons","Styled","templatePropTypes","children","node","entity","types","stationType","isRequired","keyboard","bool","templateDefaultProps","SharedBikeCircle","dockStrokeColor","fillColor","pixels","strokeColor","GeneratedMarker","station","newStrokeColor","isFloatingBike","y","x","propTypes","defaultProps","HubAndFloatingBike","icon","capacity","bikesAvailable","spacesAvailable","pctFull","i","Math","round","getStationMarkerByColor","color","className","iconSize","popupAnchor","html","renderToStaticMarkup","GenericMarker","markerIcon"],"mappings":"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","sourcesContent":["import { divIcon } from \"leaflet\";\nimport memoize from \"lodash.memoize\";\nimport coreUtils from \"@opentripplanner/core-utils\";\nimport PropTypes from \"prop-types\";\nimport React from \"react\";\nimport ReactDOMServer from \"react-dom/server\";\nimport { CircleMarker, Marker } from \"react-leaflet\";\n\nimport { floatingBikeIcon, hubIcons } from \"../bike-icons\";\nimport * as Styled from \"../styled\";\n\n/**\n * This file contains default marker types for rental vehicles,\n * that can be used when defining the VehicleRentalOverlay's symbol prop:\n * - SharedBikeCircle\n * - GenericMarker\n * - HubAndFloatingBike\n */\n\n// Prop types reused across components.\nconst templatePropTypes = {\n /** The children of the component. */\n children: PropTypes.node,\n /** The rental vehicle or station to render. */\n entity: coreUtils.types.stationType.isRequired,\n /** leaflet attribute to control tabindex value for keyboaryd-only / SR users */\n keyboard: PropTypes.bool\n};\nconst templateDefaultProps = {\n children: null,\n keyboard: false\n};\n\n/**\n * Renders a shared bike or shared bike dock as a circle\n * with predefined colors and size.\n */\nexport const SharedBikeCircle = ({\n dockStrokeColor,\n fillColor = \"gray\",\n pixels,\n strokeColor\n}) => {\n const GeneratedMarker = ({ children, keyboard, entity: station }) => {\n let newStrokeColor = strokeColor || fillColor;\n\n if (!station.isFloatingBike) {\n newStrokeColor = dockStrokeColor || strokeColor;\n }\n\n return (\n <CircleMarker\n center={[station.y, station.x]}\n color={newStrokeColor}\n fillColor={fillColor}\n fillOpacity={1}\n keyboard={keyboard}\n radius={pixels - (station.isFloatingBike ? 1 : 0)}\n weight={1}\n >\n {children}\n </CircleMarker>\n );\n };\n\n GeneratedMarker.propTypes = templatePropTypes;\n GeneratedMarker.defaultProps = templateDefaultProps;\n return GeneratedMarker;\n};\n\n/**\n * A component that renders rental bike entities\n * either as a bike or a bike dock (or hub, showing spaces available).\n */\nexport const HubAndFloatingBike = ({ children, keyboard, entity: station }) => {\n let icon;\n if (station.isFloatingBike) {\n icon = floatingBikeIcon;\n } else {\n const capacity = station.bikesAvailable + station.spacesAvailable;\n if (capacity === 0) return null;\n const pctFull = station.bikesAvailable / capacity;\n const i = Math.round(pctFull * 9);\n icon = hubIcons[i];\n }\n return (\n <Marker icon={icon} keyboard={keyboard} position={[station.y, station.x]}>\n {children}\n </Marker>\n );\n};\nHubAndFloatingBike.propTypes = templatePropTypes;\nHubAndFloatingBike.defaultProps = templateDefaultProps;\n\n/**\n * Creates and caches a leaflet element icon based on color.\n */\nconst getStationMarkerByColor = memoize(color =>\n divIcon({\n className: \"\",\n iconSize: [11, 16],\n popupAnchor: [0, -6],\n html: ReactDOMServer.renderToStaticMarkup(\n <Styled.StationMarker color={color} />\n )\n })\n);\n\n/**\n * Helper function to create a leaflet Marker component to render entities\n * using fixed fill color.\n * Usage: GenericMarker({ fillColor: \"#F204B5\" })\n */\nexport const GenericMarker = ({ fillColor = \"gray\" }) => {\n const markerIcon = getStationMarkerByColor(fillColor);\n\n const GeneratedMarker = ({ children, keyboard, entity: station }) => (\n <Marker\n icon={markerIcon}\n keyboard={keyboard}\n position={[station.y, station.x]}\n >\n {children}\n </Marker>\n );\n GeneratedMarker.propTypes = templatePropTypes;\n GeneratedMarker.defaultProps = templateDefaultProps;\n return GeneratedMarker;\n};\n"],"file":"index.js"}
package/esm/index.js CHANGED
@@ -8,14 +8,23 @@ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflec
8
8
 
9
9
  function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
10
10
 
11
+ import flatten from "flat";
11
12
  import { Styled as BaseMapStyled } from "@opentripplanner/base-map";
12
13
  import coreUtils from "@opentripplanner/core-utils";
13
14
  import FromToLocationPicker from "@opentripplanner/from-to-location-picker";
14
15
  import ZoomBasedMarkers from "@opentripplanner/zoom-based-markers";
15
16
  import PropTypes from "prop-types";
16
17
  import React from "react";
18
+ import { FormattedMessage } from "react-intl";
17
19
  import { FeatureGroup, MapLayer, Popup, withLeaflet } from "react-leaflet";
18
- import { GenericMarker, HubAndFloatingBike, SharedBikeCircle } from "./DefaultMarkers";
20
+ import { GenericMarker, HubAndFloatingBike, SharedBikeCircle } from "./DefaultMarkers"; // Load the default messages.
21
+
22
+ import defaultEnglishMessages from "../i18n/en-US.yml"; // HACK: We should flatten the messages loaded above because
23
+ // the YAML loaders behave differently between webpack and our version of jest:
24
+ // - the yaml loader for webpack returns a nested object,
25
+ // - the yaml loader for jest returns messages with flattened ids.
26
+
27
+ var defaultMessages = flatten(defaultEnglishMessages);
19
28
  /**
20
29
  * This vehicle rental overlay can be used to render vehicle rentals of various
21
30
  * types. This layer can be configured to show different styles of markers at
@@ -27,16 +36,12 @@ var VehicleRentalOverlay = /*#__PURE__*/function (_MapLayer) {
27
36
 
28
37
  var _super = _createSuper(VehicleRentalOverlay);
29
38
 
30
- function VehicleRentalOverlay() {
39
+ function VehicleRentalOverlay(props) {
31
40
  var _this;
32
41
 
33
42
  _classCallCheck(this, VehicleRentalOverlay);
34
43
 
35
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
36
- args[_key] = arguments[_key];
37
- }
38
-
39
- _this = _super.call.apply(_super, [this].concat(args));
44
+ _this = _super.call(this, props);
40
45
 
41
46
  _this.renderSymbolWithPopup = function (_Symbol) {
42
47
  var SymbolWrapper = function SymbolWrapper(_ref) {
@@ -85,6 +90,24 @@ var VehicleRentalOverlay = /*#__PURE__*/function (_MapLayer) {
85
90
  });
86
91
  };
87
92
 
93
+ _this.onOverlayAdded = function () {
94
+ _this.startRefreshing();
95
+ };
96
+
97
+ _this.onOverlayRemoved = function () {
98
+ _this.stopRefreshing();
99
+ };
100
+
101
+ _this.onViewportChanged = function (viewport) {
102
+ var newZoom = viewport.zoom;
103
+
104
+ if (_this.state.zoom !== newZoom) {
105
+ _this.setState({
106
+ zoom: newZoom
107
+ });
108
+ }
109
+ };
110
+
88
111
  _this.renderPopupForStation = function (station) {
89
112
  var stationIsHub = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
90
113
  var _this$props = _this.props,
@@ -97,14 +120,38 @@ var VehicleRentalOverlay = /*#__PURE__*/function (_MapLayer) {
97
120
  lon: station.x,
98
121
  name: stationName
99
122
  };
100
- return /*#__PURE__*/React.createElement(Popup, null, /*#__PURE__*/React.createElement(BaseMapStyled.MapOverlayPopup, null, /*#__PURE__*/React.createElement(BaseMapStyled.PopupTitle, null, stationName), stationIsHub && /*#__PURE__*/React.createElement(BaseMapStyled.PopupRow, null, /*#__PURE__*/React.createElement("div", null, "Available bikes: ", station.bikesAvailable), /*#__PURE__*/React.createElement("div", null, "Available docks: ", station.spacesAvailable)), /*#__PURE__*/React.createElement(BaseMapStyled.PopupRow, null, /*#__PURE__*/React.createElement("b", null, "Plan a trip:"), /*#__PURE__*/React.createElement(FromToLocationPicker, {
123
+ return /*#__PURE__*/React.createElement(Popup, null, /*#__PURE__*/React.createElement(BaseMapStyled.MapOverlayPopup, null, /*#__PURE__*/React.createElement(BaseMapStyled.PopupTitle, null, stationName), stationIsHub && /*#__PURE__*/React.createElement(BaseMapStyled.PopupRow, null, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(FormattedMessage, {
124
+ defaultMessage: defaultMessages["otpUi.VehicleRentalOverlay.availableBikes"],
125
+ description: "Label text for the number of bikes available",
126
+ id: "otpUi.VehicleRentalOverlay.availableBikes",
127
+ values: {
128
+ value: station.bikesAvailable
129
+ }
130
+ })), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(FormattedMessage, {
131
+ defaultMessage: defaultMessages["otpUi.VehicleRentalOverlay.availableDocks"],
132
+ description: "Label text for the number of docks available",
133
+ id: "otpUi.VehicleRentalOverlay.availableDocks",
134
+ values: {
135
+ value: station.spacesAvailable
136
+ }
137
+ }))), /*#__PURE__*/React.createElement(BaseMapStyled.PopupRow, null, /*#__PURE__*/React.createElement(FromToLocationPicker, {
138
+ label: true,
101
139
  location: location,
102
140
  setLocation: setLocation
103
141
  }))));
104
142
  };
105
143
 
144
+ _this.state = {
145
+ zoom: props.leaflet.map.getZoom()
146
+ };
106
147
  return _this;
107
148
  }
149
+ /**
150
+ * This helper method will be passed to the ZoomBasedMarkers symbolTransform prop.
151
+ * It creates a component that inserts a popup
152
+ * as a child of the specified symbol from the mapSymbols prop.
153
+ */
154
+
108
155
 
109
156
  _createClass(VehicleRentalOverlay, [{
110
157
  key: "createLeafletElement",
@@ -131,26 +178,34 @@ var VehicleRentalOverlay = /*#__PURE__*/function (_MapLayer) {
131
178
  value: function stopRefreshing() {
132
179
  if (this.refreshTimer) clearInterval(this.refreshTimer);
133
180
  }
181
+ /**
182
+ * When the layer is added (or toggled on, or its visibility becomes true),
183
+ * start refreshing vehicle positions.
184
+ */
185
+
134
186
  }, {
135
187
  key: "componentDidMount",
136
- value: function componentDidMount() {
137
- var visible = this.props.visible;
188
+ value:
189
+ /**
190
+ * Upon mounting, see whether the vehicles should be fetched,
191
+ * and also call the register overlay prop that the
192
+ * @opentripplanner/base-map package has injected to listen to zoom/position changes.
193
+ */
194
+ function componentDidMount() {
195
+ var _this$props2 = this.props,
196
+ registerOverlay = _this$props2.registerOverlay,
197
+ visible = _this$props2.visible;
138
198
  if (visible) this.startRefreshing();
199
+
200
+ if (typeof registerOverlay === "function") {
201
+ registerOverlay(this);
202
+ }
139
203
  }
140
204
  }, {
141
205
  key: "componentWillUnmount",
142
206
  value: function componentWillUnmount() {
143
207
  this.stopRefreshing();
144
208
  }
145
- }, {
146
- key: "componentDidUpdate",
147
- value: function componentDidUpdate(prevProps) {
148
- if (!prevProps.visible && this.props.visible) {
149
- this.startRefreshing();
150
- } else if (prevProps.visible && !this.props.visible) {
151
- this.stopRefreshing();
152
- }
153
- }
154
209
  /**
155
210
  * Render some popup html for a station. This contains custom logic for
156
211
  * displaying rental vehicles in the TriMet MOD website that might not be
@@ -160,19 +215,15 @@ var VehicleRentalOverlay = /*#__PURE__*/function (_MapLayer) {
160
215
  }, {
161
216
  key: "render",
162
217
  value: function render() {
163
- var _this$props2 = this.props,
164
- companies = _this$props2.companies,
165
- mapSymbols = _this$props2.mapSymbols,
166
- stations = _this$props2.stations,
167
- visible = _this$props2.visible; // Render an empty FeatureGroup if the rental vehicles should not be visible
218
+ var _this$props3 = this.props,
219
+ companies = _this$props3.companies,
220
+ mapSymbols = _this$props3.mapSymbols,
221
+ stations = _this$props3.stations;
222
+ var zoom = this.state.zoom; // Render an empty FeatureGroup if the rental vehicles should not be visible
168
223
  // on the map. Otherwise previous stations may still be shown due to some
169
224
  // react-leaflet internals, maybe? Also, do not return null because that will
170
225
  // prevent the overlay from appearing in the layer controls.
171
226
 
172
- if (!visible) {
173
- return /*#__PURE__*/React.createElement(FeatureGroup, null);
174
- }
175
-
176
227
  var filteredStations = stations;
177
228
 
178
229
  if (companies) {
@@ -185,10 +236,8 @@ var VehicleRentalOverlay = /*#__PURE__*/function (_MapLayer) {
185
236
 
186
237
  if (!filteredStations || filteredStations.length === 0) {
187
238
  return /*#__PURE__*/React.createElement(FeatureGroup, null);
188
- } // get zoom to check which symbol to render
189
-
239
+ } // Convert map symbols for this overlay to zoomBasedSymbolType.
190
240
 
191
- var zoom = this.props.leaflet.map.getZoom(); // Convert map symbols for this overlay to zoomBasedSymbolType.
192
241
 
193
242
  var symbols = this.convertToZoomMarkerSymbols(mapSymbols);
194
243
  return /*#__PURE__*/React.createElement(FeatureGroup, null, /*#__PURE__*/React.createElement(ZoomBasedMarkers, {
package/esm/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.js"],"names":["Styled","BaseMapStyled","coreUtils","FromToLocationPicker","ZoomBasedMarkers","PropTypes","React","FeatureGroup","MapLayer","Popup","withLeaflet","GenericMarker","HubAndFloatingBike","SharedBikeCircle","VehicleRentalOverlay","renderSymbolWithPopup","Symbol","SymbolWrapper","station","entity","zoom","renderPopupForStation","bikesAvailable","undefined","isFloatingBike","propTypes","types","stationType","isRequired","number","convertToZoomMarkerSymbols","mapSymbols","map","mapSymbol","symbol","type","minZoom","stationIsHub","props","configCompanies","getStationName","setLocation","stationName","location","lat","y","lon","x","name","spacesAvailable","refreshVehicles","refreshTimer","setInterval","clearInterval","visible","startRefreshing","stopRefreshing","prevProps","companies","stations","filteredStations","filter","networks","value","includes","length","leaflet","getZoom","symbols","arrayOf","companyType","string","func","vehicleRentalMapOverlaySymbolsType","bool","defaultProps","stationNetworks","itinerary","getCompaniesLabelFromNetworks","id","isFloatingCar","isFloatingVehicle"],"mappings":"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","sourcesContent":["import { Styled as BaseMapStyled } from \"@opentripplanner/base-map\";\nimport coreUtils from \"@opentripplanner/core-utils\";\nimport FromToLocationPicker from \"@opentripplanner/from-to-location-picker\";\nimport ZoomBasedMarkers from \"@opentripplanner/zoom-based-markers\";\nimport PropTypes from \"prop-types\";\nimport React from \"react\";\nimport { FeatureGroup, MapLayer, Popup, withLeaflet } from \"react-leaflet\";\n\nimport {\n GenericMarker,\n HubAndFloatingBike,\n SharedBikeCircle\n} from \"./DefaultMarkers\";\n\n/**\n * This vehicle rental overlay can be used to render vehicle rentals of various\n * types. This layer can be configured to show different styles of markers at\n * different zoom levels.\n */\nclass VehicleRentalOverlay extends MapLayer {\n /**\n * This helper method will be passed to the ZoomBasedMarkers symbolTransform prop.\n * It creates a component that inserts a popup\n * as a child of the specified symbol from the mapSymbols prop.\n */\n renderSymbolWithPopup = Symbol => {\n const SymbolWrapper = ({ entity: station, zoom }) => (\n <Symbol entity={station} zoom={zoom}>\n {this.renderPopupForStation(\n station,\n station.bikesAvailable !== undefined && !station.isFloatingBike\n )}\n </Symbol>\n );\n SymbolWrapper.propTypes = {\n entity: coreUtils.types.stationType.isRequired,\n zoom: PropTypes.number.isRequired\n };\n\n return SymbolWrapper;\n };\n\n /**\n * Convert map symbols to zoomBasedSymbolType.\n */\n convertToZoomMarkerSymbols = mapSymbols =>\n mapSymbols.map(mapSymbol => {\n // If mapSymbol uses zoomBasedSymbolType, use it as is.\n if (mapSymbol.symbol) {\n return mapSymbol;\n }\n\n // Otherwise, convert into zoomBasedType (no support for symbols by type).\n let symbol;\n switch (mapSymbol.type) {\n case \"circle\":\n symbol = SharedBikeCircle(mapSymbol);\n break;\n case \"hubAndFloatingBike\":\n symbol = HubAndFloatingBike;\n break;\n default:\n symbol = GenericMarker(mapSymbol);\n }\n\n return {\n minZoom: mapSymbol.minZoom,\n symbol\n };\n });\n\n createLeafletElement() {}\n\n updateLeafletElement() {}\n\n startRefreshing() {\n const { refreshVehicles } = this.props;\n\n // Create the timer only if refreshVehicles is a valid function.\n if (typeof refreshVehicles === \"function\") {\n // initial station retrieval\n refreshVehicles();\n\n // set up timer to refresh stations periodically\n this.refreshTimer = setInterval(() => {\n refreshVehicles();\n }, 30000); // defaults to every 30 sec. TODO: make this configurable?\n }\n }\n\n stopRefreshing() {\n if (this.refreshTimer) clearInterval(this.refreshTimer);\n }\n\n componentDidMount() {\n const { visible } = this.props;\n if (visible) this.startRefreshing();\n }\n\n componentWillUnmount() {\n this.stopRefreshing();\n }\n\n componentDidUpdate(prevProps) {\n if (!prevProps.visible && this.props.visible) {\n this.startRefreshing();\n } else if (prevProps.visible && !this.props.visible) {\n this.stopRefreshing();\n }\n }\n\n /**\n * Render some popup html for a station. This contains custom logic for\n * displaying rental vehicles in the TriMet MOD website that might not be\n * applicable to other regions.\n */\n renderPopupForStation = (station, stationIsHub = false) => {\n const { configCompanies, getStationName, setLocation } = this.props;\n const stationName = getStationName(configCompanies, station);\n const location = {\n lat: station.y,\n lon: station.x,\n name: stationName\n };\n return (\n <Popup>\n <BaseMapStyled.MapOverlayPopup>\n <BaseMapStyled.PopupTitle>{stationName}</BaseMapStyled.PopupTitle>\n\n {/* render dock info if it is available */}\n {stationIsHub && (\n <BaseMapStyled.PopupRow>\n <div>Available bikes: {station.bikesAvailable}</div>\n <div>Available docks: {station.spacesAvailable}</div>\n </BaseMapStyled.PopupRow>\n )}\n\n {/* Set as from/to toolbar */}\n <BaseMapStyled.PopupRow>\n <b>Plan a trip:</b>\n <FromToLocationPicker\n location={location}\n setLocation={setLocation}\n />\n </BaseMapStyled.PopupRow>\n </BaseMapStyled.MapOverlayPopup>\n </Popup>\n );\n };\n\n render() {\n const { companies, mapSymbols, stations, visible } = this.props;\n // Render an empty FeatureGroup if the rental vehicles should not be visible\n // on the map. Otherwise previous stations may still be shown due to some\n // react-leaflet internals, maybe? Also, do not return null because that will\n // prevent the overlay from appearing in the layer controls.\n if (!visible) {\n return <FeatureGroup />;\n }\n\n let filteredStations = stations;\n if (companies) {\n filteredStations = stations.filter(\n station =>\n station.networks.filter(value => companies.includes(value)).length > 0\n );\n }\n\n if (!filteredStations || filteredStations.length === 0) {\n return <FeatureGroup />;\n }\n\n // get zoom to check which symbol to render\n const zoom = this.props.leaflet.map.getZoom();\n\n // Convert map symbols for this overlay to zoomBasedSymbolType.\n const symbols = this.convertToZoomMarkerSymbols(mapSymbols);\n\n return (\n <FeatureGroup>\n <ZoomBasedMarkers\n entities={filteredStations}\n symbols={symbols}\n symbolTransform={this.renderSymbolWithPopup}\n zoom={zoom}\n />\n </FeatureGroup>\n );\n }\n}\n\nVehicleRentalOverlay.props = {\n /**\n * The entire companies config array.\n */\n configCompanies: PropTypes.arrayOf(coreUtils.types.companyType.isRequired)\n .isRequired,\n /**\n * A list of companies that are applicable to just this instance of the\n * overlay.\n */\n companies: PropTypes.arrayOf(PropTypes.string.isRequired),\n /**\n * An optional custom function to create a string name of a particular vehicle\n * rental station. This function takes two arguments of the configCompanies\n * prop and a vehicle rental station. The function must return a string.\n */\n getStationName: PropTypes.func,\n /**\n * A configuration of what map markers or symbols to show at various\n * zoom levels.\n */\n mapSymbols: coreUtils.types.vehicleRentalMapOverlaySymbolsType,\n /**\n * If specified, a function that will be triggered every 30 seconds whenever this layer is\n * visible.\n */\n refreshVehicles: PropTypes.func,\n /**\n * A callback for when a user clicks on setting this stop as either the from\n * or to location of a new search.\n *\n * This will be dispatched with the following argument:\n *\n * ```js\n * {\n * location: {\n * lat: number,\n * lon: number,\n * name: string\n * },\n * locationType: \"from\" or \"to\"\n * }\n * ```\n */\n setLocation: PropTypes.func.isRequired,\n /**\n * A list of the vehicle rental stations specific to this overlay instance.\n */\n stations: PropTypes.arrayOf(coreUtils.types.stationType),\n /**\n * Whether the overlay is currently visible.\n */\n visible: PropTypes.bool\n};\n\nVehicleRentalOverlay.defaultProps = {\n getStationName: (configCompanies, station) => {\n const stationNetworks = coreUtils.itinerary.getCompaniesLabelFromNetworks(\n station.networks,\n configCompanies\n );\n let stationName = station.name || station.id;\n if (station.isFloatingBike) {\n stationName = `Free-floating bike: ${stationName}`;\n } else if (station.isFloatingCar) {\n stationName = `${stationNetworks} ${stationName}`;\n } else if (station.isFloatingVehicle) {\n // assumes that all floating vehicles are E-scooters\n stationName = `${stationNetworks} E-scooter`;\n }\n return stationName;\n },\n mapSymbols: [\n {\n zoom: 0,\n symbol: GenericMarker\n }\n ],\n refreshVehicles: null,\n stations: [],\n visible: false\n};\n\nexport default withLeaflet(VehicleRentalOverlay);\n"],"file":"index.js"}
1
+ {"version":3,"sources":["../src/index.js"],"names":["flatten","Styled","BaseMapStyled","coreUtils","FromToLocationPicker","ZoomBasedMarkers","PropTypes","React","FormattedMessage","FeatureGroup","MapLayer","Popup","withLeaflet","GenericMarker","HubAndFloatingBike","SharedBikeCircle","defaultEnglishMessages","defaultMessages","VehicleRentalOverlay","props","renderSymbolWithPopup","Symbol","SymbolWrapper","station","entity","zoom","renderPopupForStation","bikesAvailable","undefined","isFloatingBike","propTypes","types","stationType","isRequired","number","convertToZoomMarkerSymbols","mapSymbols","map","mapSymbol","symbol","type","minZoom","onOverlayAdded","startRefreshing","onOverlayRemoved","stopRefreshing","onViewportChanged","viewport","newZoom","state","setState","stationIsHub","configCompanies","getStationName","setLocation","stationName","location","lat","y","lon","x","name","value","spacesAvailable","leaflet","getZoom","refreshVehicles","refreshTimer","setInterval","clearInterval","registerOverlay","visible","companies","stations","filteredStations","filter","networks","includes","length","symbols","arrayOf","companyType","string","func","vehicleRentalMapOverlaySymbolsType","bool","defaultProps","stationNetworks","itinerary","getCompaniesLabelFromNetworks","id","isFloatingCar","isFloatingVehicle"],"mappings":"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","sourcesContent":["import flatten from \"flat\";\nimport { Styled as BaseMapStyled } from \"@opentripplanner/base-map\";\nimport coreUtils from \"@opentripplanner/core-utils\";\nimport FromToLocationPicker from \"@opentripplanner/from-to-location-picker\";\nimport ZoomBasedMarkers from \"@opentripplanner/zoom-based-markers\";\nimport PropTypes from \"prop-types\";\nimport React from \"react\";\nimport { FormattedMessage } from \"react-intl\";\nimport { FeatureGroup, MapLayer, Popup, withLeaflet } from \"react-leaflet\";\n\nimport {\n GenericMarker,\n HubAndFloatingBike,\n SharedBikeCircle\n} from \"./DefaultMarkers\";\n\n// Load the default messages.\nimport defaultEnglishMessages from \"../i18n/en-US.yml\";\n\n// HACK: We should flatten the messages loaded above because\n// the YAML loaders behave differently between webpack and our version of jest:\n// - the yaml loader for webpack returns a nested object,\n// - the yaml loader for jest returns messages with flattened ids.\nconst defaultMessages = flatten(defaultEnglishMessages);\n\n/**\n * This vehicle rental overlay can be used to render vehicle rentals of various\n * types. This layer can be configured to show different styles of markers at\n * different zoom levels.\n */\nclass VehicleRentalOverlay extends MapLayer {\n constructor(props) {\n super(props);\n this.state = {\n zoom: props.leaflet.map.getZoom()\n };\n }\n\n /**\n * This helper method will be passed to the ZoomBasedMarkers symbolTransform prop.\n * It creates a component that inserts a popup\n * as a child of the specified symbol from the mapSymbols prop.\n */\n renderSymbolWithPopup = Symbol => {\n const SymbolWrapper = ({ entity: station, zoom }) => (\n <Symbol entity={station} zoom={zoom}>\n {this.renderPopupForStation(\n station,\n station.bikesAvailable !== undefined && !station.isFloatingBike\n )}\n </Symbol>\n );\n SymbolWrapper.propTypes = {\n entity: coreUtils.types.stationType.isRequired,\n zoom: PropTypes.number.isRequired\n };\n\n return SymbolWrapper;\n };\n\n /**\n * Convert map symbols to zoomBasedSymbolType.\n */\n convertToZoomMarkerSymbols = mapSymbols =>\n mapSymbols.map(mapSymbol => {\n // If mapSymbol uses zoomBasedSymbolType, use it as is.\n if (mapSymbol.symbol) {\n return mapSymbol;\n }\n\n // Otherwise, convert into zoomBasedType (no support for symbols by type).\n let symbol;\n switch (mapSymbol.type) {\n case \"circle\":\n symbol = SharedBikeCircle(mapSymbol);\n break;\n case \"hubAndFloatingBike\":\n symbol = HubAndFloatingBike;\n break;\n default:\n symbol = GenericMarker(mapSymbol);\n }\n\n return {\n minZoom: mapSymbol.minZoom,\n symbol\n };\n });\n\n createLeafletElement() {}\n\n updateLeafletElement() {}\n\n startRefreshing() {\n const { refreshVehicles } = this.props;\n\n // Create the timer only if refreshVehicles is a valid function.\n if (typeof refreshVehicles === \"function\") {\n // initial station retrieval\n refreshVehicles();\n\n // set up timer to refresh stations periodically\n this.refreshTimer = setInterval(() => {\n refreshVehicles();\n }, 30000); // defaults to every 30 sec. TODO: make this configurable?\n }\n }\n\n stopRefreshing() {\n if (this.refreshTimer) clearInterval(this.refreshTimer);\n }\n\n /**\n * When the layer is added (or toggled on, or its visibility becomes true),\n * start refreshing vehicle positions.\n */\n onOverlayAdded = () => {\n this.startRefreshing();\n };\n\n /**\n * When the layer is removed (or toggled off, or its visibility becomes false),\n * stop refreshing vehicle positions.\n */\n onOverlayRemoved = () => {\n this.stopRefreshing();\n };\n\n /**\n * Listen to changes on the BaseMap's center or zoom.\n * @param viewport The viewport data. See https://github.com/PaulLeCam/react-leaflet/blob/master/example/components/viewport.js for details.\n */\n onViewportChanged = viewport => {\n const { zoom: newZoom } = viewport;\n if (this.state.zoom !== newZoom) {\n this.setState({ zoom: newZoom });\n }\n };\n\n /**\n * Upon mounting, see whether the vehicles should be fetched,\n * and also call the register overlay prop that the\n * @opentripplanner/base-map package has injected to listen to zoom/position changes.\n */\n componentDidMount() {\n const { registerOverlay, visible } = this.props;\n if (visible) this.startRefreshing();\n if (typeof registerOverlay === \"function\") {\n registerOverlay(this);\n }\n }\n\n componentWillUnmount() {\n this.stopRefreshing();\n }\n\n /**\n * Render some popup html for a station. This contains custom logic for\n * displaying rental vehicles in the TriMet MOD website that might not be\n * applicable to other regions.\n */\n renderPopupForStation = (station, stationIsHub = false) => {\n const { configCompanies, getStationName, setLocation } = this.props;\n const stationName = getStationName(configCompanies, station);\n const location = {\n lat: station.y,\n lon: station.x,\n name: stationName\n };\n return (\n <Popup>\n <BaseMapStyled.MapOverlayPopup>\n <BaseMapStyled.PopupTitle>{stationName}</BaseMapStyled.PopupTitle>\n\n {/* render dock info if it is available */}\n {stationIsHub && (\n <BaseMapStyled.PopupRow>\n <div>\n <FormattedMessage\n defaultMessage={\n defaultMessages[\"otpUi.VehicleRentalOverlay.availableBikes\"]\n }\n description=\"Label text for the number of bikes available\"\n id=\"otpUi.VehicleRentalOverlay.availableBikes\"\n values={{ value: station.bikesAvailable }}\n />\n </div>\n <div>\n <FormattedMessage\n defaultMessage={\n defaultMessages[\"otpUi.VehicleRentalOverlay.availableDocks\"]\n }\n description=\"Label text for the number of docks available\"\n id=\"otpUi.VehicleRentalOverlay.availableDocks\"\n values={{ value: station.spacesAvailable }}\n />\n </div>\n </BaseMapStyled.PopupRow>\n )}\n\n {/* Set as from/to toolbar */}\n <BaseMapStyled.PopupRow>\n <FromToLocationPicker\n label\n location={location}\n setLocation={setLocation}\n />\n </BaseMapStyled.PopupRow>\n </BaseMapStyled.MapOverlayPopup>\n </Popup>\n );\n };\n\n render() {\n const { companies, mapSymbols, stations } = this.props;\n const { zoom } = this.state;\n // Render an empty FeatureGroup if the rental vehicles should not be visible\n // on the map. Otherwise previous stations may still be shown due to some\n // react-leaflet internals, maybe? Also, do not return null because that will\n // prevent the overlay from appearing in the layer controls.\n\n let filteredStations = stations;\n if (companies) {\n filteredStations = stations.filter(\n station =>\n station.networks.filter(value => companies.includes(value)).length > 0\n );\n }\n\n if (!filteredStations || filteredStations.length === 0) {\n return <FeatureGroup />;\n }\n\n // Convert map symbols for this overlay to zoomBasedSymbolType.\n const symbols = this.convertToZoomMarkerSymbols(mapSymbols);\n\n return (\n <FeatureGroup>\n <ZoomBasedMarkers\n entities={filteredStations}\n symbols={symbols}\n symbolTransform={this.renderSymbolWithPopup}\n zoom={zoom}\n />\n </FeatureGroup>\n );\n }\n}\n\nVehicleRentalOverlay.props = {\n /**\n * The entire companies config array.\n */\n configCompanies: PropTypes.arrayOf(coreUtils.types.companyType.isRequired)\n .isRequired,\n /**\n * A list of companies that are applicable to just this instance of the\n * overlay.\n */\n companies: PropTypes.arrayOf(PropTypes.string.isRequired),\n /**\n * An optional custom function to create a string name of a particular vehicle\n * rental station. This function takes two arguments of the configCompanies\n * prop and a vehicle rental station. The function must return a string.\n */\n getStationName: PropTypes.func,\n /**\n * A configuration of what map markers or symbols to show at various\n * zoom levels.\n */\n mapSymbols: coreUtils.types.vehicleRentalMapOverlaySymbolsType,\n /**\n * If specified, a function that will be triggered every 30 seconds whenever this layer is\n * visible.\n */\n refreshVehicles: PropTypes.func,\n /**\n * A callback for when a user clicks on setting this stop as either the from\n * or to location of a new search.\n *\n * This will be dispatched with the following argument:\n *\n * ```js\n * {\n * location: {\n * lat: number,\n * lon: number,\n * name: string\n * },\n * locationType: \"from\" or \"to\"\n * }\n * ```\n */\n setLocation: PropTypes.func.isRequired,\n /**\n * A list of the vehicle rental stations specific to this overlay instance.\n */\n stations: PropTypes.arrayOf(coreUtils.types.stationType),\n /**\n * Whether the overlay is currently visible.\n */\n visible: PropTypes.bool\n};\n\nVehicleRentalOverlay.defaultProps = {\n getStationName: (configCompanies, station) => {\n const stationNetworks = coreUtils.itinerary.getCompaniesLabelFromNetworks(\n station.networks,\n configCompanies\n );\n let stationName = station.name || station.id;\n if (station.isFloatingBike) {\n stationName = `Free-floating bike: ${stationName}`;\n } else if (station.isFloatingCar) {\n stationName = `${stationNetworks} ${stationName}`;\n } else if (station.isFloatingVehicle) {\n // assumes that all floating vehicles are E-scooters\n stationName = `${stationNetworks} E-scooter`;\n }\n return stationName;\n },\n mapSymbols: [\n {\n zoom: 0,\n symbol: GenericMarker\n }\n ],\n refreshVehicles: null,\n stations: [],\n visible: false\n};\n\nexport default withLeaflet(VehicleRentalOverlay);\n"],"file":"index.js"}
package/i18n/en-US.yml ADDED
@@ -0,0 +1,14 @@
1
+ # Default messages for the VehicleRentalOverlay component.
2
+ # To use from a react-intl application:
3
+ # - merge the content of this file into the messages object
4
+ # that has your other localized strings,
5
+ # - flatten the ids, i.e. convert a structure such as
6
+ # otpUi > VehicleRentalOverlay > availableBikes
7
+ # into "otpUi.VehicleRentalOverlay.availableBikes".
8
+ # - pass the resulting object to the messages prop of IntlProvider.
9
+ #
10
+
11
+ otpUi:
12
+ VehicleRentalOverlay:
13
+ availableBikes: "Available bikes: {value}"
14
+ availableDocks: "Available docks: {value}"
package/i18n/fr.yml ADDED
@@ -0,0 +1,14 @@
1
+ # Default messages for the VehicleRentalOverlay component.
2
+ # To use from a react-intl application:
3
+ # - merge the content of this file into the messages object
4
+ # that has your other localized strings,
5
+ # - flatten the ids, i.e. convert a structure such as
6
+ # otpUi > VehicleRentalOverlay > availableBikes
7
+ # into "otpUi.VehicleRentalOverlay.availableBikes".
8
+ # - pass the resulting object to the messages prop of IntlProvider.
9
+ #
10
+
11
+ otpUi:
12
+ VehicleRentalOverlay:
13
+ availableBikes: "Vélos disponibles : {value}"
14
+ availableDocks: "Bornes disponibles : {value}"
@@ -42,10 +42,14 @@ const templatePropTypes = {
42
42
  children: _propTypes.default.node,
43
43
 
44
44
  /** The rental vehicle or station to render. */
45
- entity: _coreUtils.default.types.stationType.isRequired
45
+ entity: _coreUtils.default.types.stationType.isRequired,
46
+
47
+ /** leaflet attribute to control tabindex value for keyboaryd-only / SR users */
48
+ keyboard: _propTypes.default.bool
46
49
  };
47
50
  const templateDefaultProps = {
48
- children: null
51
+ children: null,
52
+ keyboard: false
49
53
  };
50
54
  /**
51
55
  * Renders a shared bike or shared bike dock as a circle
@@ -60,6 +64,7 @@ const SharedBikeCircle = ({
60
64
  }) => {
61
65
  const GeneratedMarker = ({
62
66
  children,
67
+ keyboard,
63
68
  entity: station
64
69
  }) => {
65
70
  let newStrokeColor = strokeColor || fillColor;
@@ -73,6 +78,7 @@ const SharedBikeCircle = ({
73
78
  color: newStrokeColor,
74
79
  fillColor: fillColor,
75
80
  fillOpacity: 1,
81
+ keyboard: keyboard,
76
82
  radius: pixels - (station.isFloatingBike ? 1 : 0),
77
83
  weight: 1
78
84
  }, children);
@@ -92,6 +98,7 @@ exports.SharedBikeCircle = SharedBikeCircle;
92
98
 
93
99
  const HubAndFloatingBike = ({
94
100
  children,
101
+ keyboard,
95
102
  entity: station
96
103
  }) => {
97
104
  let icon;
@@ -108,6 +115,7 @@ const HubAndFloatingBike = ({
108
115
 
109
116
  return /*#__PURE__*/_react.default.createElement(_reactLeaflet.Marker, {
110
117
  icon: icon,
118
+ keyboard: keyboard,
111
119
  position: [station.y, station.x]
112
120
  }, children);
113
121
  };
@@ -140,9 +148,11 @@ const GenericMarker = ({
140
148
 
141
149
  const GeneratedMarker = ({
142
150
  children,
151
+ keyboard,
143
152
  entity: station
144
153
  }) => /*#__PURE__*/_react.default.createElement(_reactLeaflet.Marker, {
145
154
  icon: markerIcon,
155
+ keyboard: keyboard,
146
156
  position: [station.y, station.x]
147
157
  }, children);
148
158
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/DefaultMarkers/index.js"],"names":["templatePropTypes","children","PropTypes","node","entity","coreUtils","types","stationType","isRequired","templateDefaultProps","SharedBikeCircle","dockStrokeColor","fillColor","pixels","strokeColor","GeneratedMarker","station","newStrokeColor","isFloatingBike","y","x","propTypes","defaultProps","HubAndFloatingBike","icon","floatingBikeIcon","capacity","bikesAvailable","spacesAvailable","pctFull","i","Math","round","hubIcons","getStationMarkerByColor","color","className","iconSize","popupAnchor","html","ReactDOMServer","renderToStaticMarkup","GenericMarker","markerIcon"],"mappings":"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","sourcesContent":["import { divIcon } from \"leaflet\";\nimport memoize from \"lodash.memoize\";\nimport coreUtils from \"@opentripplanner/core-utils\";\nimport PropTypes from \"prop-types\";\nimport React from \"react\";\nimport ReactDOMServer from \"react-dom/server\";\nimport { CircleMarker, Marker } from \"react-leaflet\";\n\nimport { floatingBikeIcon, hubIcons } from \"../bike-icons\";\nimport * as Styled from \"../styled\";\n\n/**\n * This file contains default marker types for rental vehicles,\n * that can be used when defining the VehicleRentalOverlay's symbol prop:\n * - SharedBikeCircle\n * - GenericMarker\n * - HubAndFloatingBike\n */\n\n// Prop types reused across components.\nconst templatePropTypes = {\n /** The children of the component. */\n children: PropTypes.node,\n /** The rental vehicle or station to render. */\n entity: coreUtils.types.stationType.isRequired\n};\nconst templateDefaultProps = {\n children: null\n};\n\n/**\n * Renders a shared bike or shared bike dock as a circle\n * with predefined colors and size.\n */\nexport const SharedBikeCircle = ({\n dockStrokeColor,\n fillColor = \"gray\",\n pixels,\n strokeColor\n}) => {\n const GeneratedMarker = ({ children, entity: station }) => {\n let newStrokeColor = strokeColor || fillColor;\n\n if (!station.isFloatingBike) {\n newStrokeColor = dockStrokeColor || strokeColor;\n }\n\n return (\n <CircleMarker\n center={[station.y, station.x]}\n color={newStrokeColor}\n fillColor={fillColor}\n fillOpacity={1}\n radius={pixels - (station.isFloatingBike ? 1 : 0)}\n weight={1}\n >\n {children}\n </CircleMarker>\n );\n };\n\n GeneratedMarker.propTypes = templatePropTypes;\n GeneratedMarker.defaultProps = templateDefaultProps;\n return GeneratedMarker;\n};\n\n/**\n * A component that renders rental bike entities\n * either as a bike or a bike dock (or hub, showing spaces available).\n */\nexport const HubAndFloatingBike = ({ children, entity: station }) => {\n let icon;\n if (station.isFloatingBike) {\n icon = floatingBikeIcon;\n } else {\n const capacity = station.bikesAvailable + station.spacesAvailable;\n if (capacity === 0) return null;\n const pctFull = station.bikesAvailable / capacity;\n const i = Math.round(pctFull * 9);\n icon = hubIcons[i];\n }\n return (\n <Marker icon={icon} position={[station.y, station.x]}>\n {children}\n </Marker>\n );\n};\nHubAndFloatingBike.propTypes = templatePropTypes;\nHubAndFloatingBike.defaultProps = templateDefaultProps;\n\n/**\n * Creates and caches a leaflet element icon based on color.\n */\nconst getStationMarkerByColor = memoize(color =>\n divIcon({\n className: \"\",\n iconSize: [11, 16],\n popupAnchor: [0, -6],\n html: ReactDOMServer.renderToStaticMarkup(\n <Styled.StationMarker color={color} />\n )\n })\n);\n\n/**\n * Helper function to create a leaflet Marker component to render entities\n * using fixed fill color.\n * Usage: GenericMarker({ fillColor: \"#F204B5\" })\n */\nexport const GenericMarker = ({ fillColor = \"gray\" }) => {\n const markerIcon = getStationMarkerByColor(fillColor);\n\n const GeneratedMarker = ({ children, entity: station }) => (\n <Marker icon={markerIcon} position={[station.y, station.x]}>\n {children}\n </Marker>\n );\n GeneratedMarker.propTypes = templatePropTypes;\n GeneratedMarker.defaultProps = templateDefaultProps;\n return GeneratedMarker;\n};\n"],"file":"index.js"}
1
+ {"version":3,"sources":["../../src/DefaultMarkers/index.js"],"names":["templatePropTypes","children","PropTypes","node","entity","coreUtils","types","stationType","isRequired","keyboard","bool","templateDefaultProps","SharedBikeCircle","dockStrokeColor","fillColor","pixels","strokeColor","GeneratedMarker","station","newStrokeColor","isFloatingBike","y","x","propTypes","defaultProps","HubAndFloatingBike","icon","floatingBikeIcon","capacity","bikesAvailable","spacesAvailable","pctFull","i","Math","round","hubIcons","getStationMarkerByColor","color","className","iconSize","popupAnchor","html","ReactDOMServer","renderToStaticMarkup","GenericMarker","markerIcon"],"mappings":"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","sourcesContent":["import { divIcon } from \"leaflet\";\nimport memoize from \"lodash.memoize\";\nimport coreUtils from \"@opentripplanner/core-utils\";\nimport PropTypes from \"prop-types\";\nimport React from \"react\";\nimport ReactDOMServer from \"react-dom/server\";\nimport { CircleMarker, Marker } from \"react-leaflet\";\n\nimport { floatingBikeIcon, hubIcons } from \"../bike-icons\";\nimport * as Styled from \"../styled\";\n\n/**\n * This file contains default marker types for rental vehicles,\n * that can be used when defining the VehicleRentalOverlay's symbol prop:\n * - SharedBikeCircle\n * - GenericMarker\n * - HubAndFloatingBike\n */\n\n// Prop types reused across components.\nconst templatePropTypes = {\n /** The children of the component. */\n children: PropTypes.node,\n /** The rental vehicle or station to render. */\n entity: coreUtils.types.stationType.isRequired,\n /** leaflet attribute to control tabindex value for keyboaryd-only / SR users */\n keyboard: PropTypes.bool\n};\nconst templateDefaultProps = {\n children: null,\n keyboard: false\n};\n\n/**\n * Renders a shared bike or shared bike dock as a circle\n * with predefined colors and size.\n */\nexport const SharedBikeCircle = ({\n dockStrokeColor,\n fillColor = \"gray\",\n pixels,\n strokeColor\n}) => {\n const GeneratedMarker = ({ children, keyboard, entity: station }) => {\n let newStrokeColor = strokeColor || fillColor;\n\n if (!station.isFloatingBike) {\n newStrokeColor = dockStrokeColor || strokeColor;\n }\n\n return (\n <CircleMarker\n center={[station.y, station.x]}\n color={newStrokeColor}\n fillColor={fillColor}\n fillOpacity={1}\n keyboard={keyboard}\n radius={pixels - (station.isFloatingBike ? 1 : 0)}\n weight={1}\n >\n {children}\n </CircleMarker>\n );\n };\n\n GeneratedMarker.propTypes = templatePropTypes;\n GeneratedMarker.defaultProps = templateDefaultProps;\n return GeneratedMarker;\n};\n\n/**\n * A component that renders rental bike entities\n * either as a bike or a bike dock (or hub, showing spaces available).\n */\nexport const HubAndFloatingBike = ({ children, keyboard, entity: station }) => {\n let icon;\n if (station.isFloatingBike) {\n icon = floatingBikeIcon;\n } else {\n const capacity = station.bikesAvailable + station.spacesAvailable;\n if (capacity === 0) return null;\n const pctFull = station.bikesAvailable / capacity;\n const i = Math.round(pctFull * 9);\n icon = hubIcons[i];\n }\n return (\n <Marker icon={icon} keyboard={keyboard} position={[station.y, station.x]}>\n {children}\n </Marker>\n );\n};\nHubAndFloatingBike.propTypes = templatePropTypes;\nHubAndFloatingBike.defaultProps = templateDefaultProps;\n\n/**\n * Creates and caches a leaflet element icon based on color.\n */\nconst getStationMarkerByColor = memoize(color =>\n divIcon({\n className: \"\",\n iconSize: [11, 16],\n popupAnchor: [0, -6],\n html: ReactDOMServer.renderToStaticMarkup(\n <Styled.StationMarker color={color} />\n )\n })\n);\n\n/**\n * Helper function to create a leaflet Marker component to render entities\n * using fixed fill color.\n * Usage: GenericMarker({ fillColor: \"#F204B5\" })\n */\nexport const GenericMarker = ({ fillColor = \"gray\" }) => {\n const markerIcon = getStationMarkerByColor(fillColor);\n\n const GeneratedMarker = ({ children, keyboard, entity: station }) => (\n <Marker\n icon={markerIcon}\n keyboard={keyboard}\n position={[station.y, station.x]}\n >\n {children}\n </Marker>\n );\n GeneratedMarker.propTypes = templatePropTypes;\n GeneratedMarker.defaultProps = templateDefaultProps;\n return GeneratedMarker;\n};\n"],"file":"index.js"}