@opentripplanner/vehicle-rental-overlay 1.4.1 → 1.4.2
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.
- package/esm/DefaultMarkers/index.js +3 -2
- package/esm/DefaultMarkers/index.js.map +1 -1
- package/esm/index.js +49 -22
- package/esm/index.js.map +1 -1
- package/i18n/en-US.yml +3 -0
- package/i18n/fr.yml +3 -0
- package/lib/DefaultMarkers/index.js +3 -3
- package/lib/DefaultMarkers/index.js.map +1 -1
- package/lib/index.js +49 -22
- package/lib/index.js.map +1 -1
- package/package.json +2 -2
- package/src/DefaultMarkers/index.js +3 -2
- package/src/VehicleRentalOverlay.story.js +9 -5
- package/src/index.js +60 -25
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { divIcon } from "leaflet";
|
|
2
2
|
import memoize from "lodash.memoize";
|
|
3
|
-
import coreUtils from "@opentripplanner/core-utils";
|
|
4
3
|
import PropTypes from "prop-types";
|
|
5
4
|
import React from "react";
|
|
6
5
|
import ReactDOMServer from "react-dom/server";
|
|
@@ -21,7 +20,9 @@ var templatePropTypes = {
|
|
|
21
20
|
children: PropTypes.node,
|
|
22
21
|
|
|
23
22
|
/** The rental vehicle or station to render. */
|
|
24
|
-
entity: coreUtils.types.stationType.isRequired,
|
|
23
|
+
// entity: coreUtils.types.stationType.isRequired,
|
|
24
|
+
// eslint-disable-next-line react/forbid-prop-types
|
|
25
|
+
entity: PropTypes.object.isRequired,
|
|
25
26
|
|
|
26
27
|
/** leaflet attribute to control tabindex value for keyboaryd-only / SR users */
|
|
27
28
|
keyboard: PropTypes.bool
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/DefaultMarkers/index.js"],"names":["divIcon","memoize","
|
|
1
|
+
{"version":3,"sources":["../../src/DefaultMarkers/index.js"],"names":["divIcon","memoize","PropTypes","React","ReactDOMServer","CircleMarker","Marker","floatingBikeIcon","hubIcons","Styled","templatePropTypes","children","node","entity","object","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 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 // eslint-disable-next-line react/forbid-prop-types\n entity: PropTypes.object.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
|
@@ -15,7 +15,7 @@ import FromToLocationPicker from "@opentripplanner/from-to-location-picker";
|
|
|
15
15
|
import ZoomBasedMarkers from "@opentripplanner/zoom-based-markers";
|
|
16
16
|
import PropTypes from "prop-types";
|
|
17
17
|
import React from "react";
|
|
18
|
-
import { FormattedMessage } from "react-intl";
|
|
18
|
+
import { FormattedMessage, injectIntl } from "react-intl";
|
|
19
19
|
import { FeatureGroup, MapLayer, Popup, withLeaflet } from "react-leaflet";
|
|
20
20
|
import { GenericMarker, HubAndFloatingBike, SharedBikeCircle } from "./DefaultMarkers"; // Load the default messages.
|
|
21
21
|
|
|
@@ -25,12 +25,50 @@ import defaultEnglishMessages from "../i18n/en-US.yml"; // HACK: We should flatt
|
|
|
25
25
|
// - the yaml loader for jest returns messages with flattened ids.
|
|
26
26
|
|
|
27
27
|
var defaultMessages = flatten(defaultEnglishMessages);
|
|
28
|
+
|
|
29
|
+
function makeDefaultGetStationName(intl) {
|
|
30
|
+
return function defaultGetStationName(configCompanies, station) {
|
|
31
|
+
var stationNetworks = coreUtils.itinerary.getCompaniesLabelFromNetworks(station.networks, configCompanies);
|
|
32
|
+
var stationName = station.name || station.id;
|
|
33
|
+
|
|
34
|
+
if (station.isFloatingBike) {
|
|
35
|
+
stationName = intl.formatMessage({
|
|
36
|
+
defaultMessage: defaultEnglishMessages["otpUi.VehicleRentalOverlay.floatingBike"],
|
|
37
|
+
description: "Popup title for a free-floating bike",
|
|
38
|
+
id: "otpUi.VehicleRentalOverlay.floatingBike"
|
|
39
|
+
}, {
|
|
40
|
+
name: stationName
|
|
41
|
+
});
|
|
42
|
+
} else if (station.isFloatingCar) {
|
|
43
|
+
stationName = intl.formatMessage({
|
|
44
|
+
defaultMessage: defaultEnglishMessages["otpUi.VehicleRentalOverlay.floatingCar"],
|
|
45
|
+
description: "Popup title for a free-floating car",
|
|
46
|
+
id: "otpUi.VehicleRentalOverlay.floatingCar"
|
|
47
|
+
}, {
|
|
48
|
+
company: stationNetworks,
|
|
49
|
+
name: stationName
|
|
50
|
+
});
|
|
51
|
+
} else if (station.isFloatingVehicle) {
|
|
52
|
+
// assumes that all floating vehicles are E-scooters
|
|
53
|
+
stationName = intl.formatMessage({
|
|
54
|
+
defaultMessage: defaultEnglishMessages["otpUi.VehicleRentalOverlay.floatingEScooter"],
|
|
55
|
+
description: "Popup title for a free-floating e-scooter",
|
|
56
|
+
id: "otpUi.VehicleRentalOverlay.floatingEScooter"
|
|
57
|
+
}, {
|
|
58
|
+
company: stationNetworks
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return stationName;
|
|
63
|
+
};
|
|
64
|
+
}
|
|
28
65
|
/**
|
|
29
66
|
* This vehicle rental overlay can be used to render vehicle rentals of various
|
|
30
67
|
* types. This layer can be configured to show different styles of markers at
|
|
31
68
|
* different zoom levels.
|
|
32
69
|
*/
|
|
33
70
|
|
|
71
|
+
|
|
34
72
|
var VehicleRentalOverlay = /*#__PURE__*/function (_MapLayer) {
|
|
35
73
|
_inherits(VehicleRentalOverlay, _MapLayer);
|
|
36
74
|
|
|
@@ -54,7 +92,7 @@ var VehicleRentalOverlay = /*#__PURE__*/function (_MapLayer) {
|
|
|
54
92
|
};
|
|
55
93
|
|
|
56
94
|
SymbolWrapper.propTypes = {
|
|
57
|
-
entity: coreUtils.types.stationType.isRequired,
|
|
95
|
+
// entity: coreUtils.types.stationType.isRequired,
|
|
58
96
|
zoom: PropTypes.number.isRequired
|
|
59
97
|
};
|
|
60
98
|
return SymbolWrapper;
|
|
@@ -113,8 +151,10 @@ var VehicleRentalOverlay = /*#__PURE__*/function (_MapLayer) {
|
|
|
113
151
|
var _this$props = _this.props,
|
|
114
152
|
configCompanies = _this$props.configCompanies,
|
|
115
153
|
getStationName = _this$props.getStationName,
|
|
154
|
+
intl = _this$props.intl,
|
|
116
155
|
setLocation = _this$props.setLocation;
|
|
117
|
-
var
|
|
156
|
+
var getStationNameFunc = getStationName || makeDefaultGetStationName(intl);
|
|
157
|
+
var stationName = getStationNameFunc(configCompanies, station);
|
|
118
158
|
var location = {
|
|
119
159
|
lat: station.y,
|
|
120
160
|
lon: station.x,
|
|
@@ -262,7 +302,8 @@ VehicleRentalOverlay.props = {
|
|
|
262
302
|
/**
|
|
263
303
|
* The entire companies config array.
|
|
264
304
|
*/
|
|
265
|
-
configCompanies: PropTypes.arrayOf(coreUtils.types.companyType.isRequired)
|
|
305
|
+
// configCompanies: PropTypes.arrayOf(coreUtils.types.companyType.isRequired)
|
|
306
|
+
// .isRequired,
|
|
266
307
|
|
|
267
308
|
/**
|
|
268
309
|
* A list of companies that are applicable to just this instance of the
|
|
@@ -281,7 +322,7 @@ VehicleRentalOverlay.props = {
|
|
|
281
322
|
* A configuration of what map markers or symbols to show at various
|
|
282
323
|
* zoom levels.
|
|
283
324
|
*/
|
|
284
|
-
mapSymbols: coreUtils.types.vehicleRentalMapOverlaySymbolsType,
|
|
325
|
+
// mapSymbols: coreUtils.types.vehicleRentalMapOverlaySymbolsType,
|
|
285
326
|
|
|
286
327
|
/**
|
|
287
328
|
* If specified, a function that will be triggered every 30 seconds whenever this layer is
|
|
@@ -311,7 +352,7 @@ VehicleRentalOverlay.props = {
|
|
|
311
352
|
/**
|
|
312
353
|
* A list of the vehicle rental stations specific to this overlay instance.
|
|
313
354
|
*/
|
|
314
|
-
stations: PropTypes.arrayOf(coreUtils.types.stationType),
|
|
355
|
+
// stations: PropTypes.arrayOf(coreUtils.types.stationType),
|
|
315
356
|
|
|
316
357
|
/**
|
|
317
358
|
* Whether the overlay is currently visible.
|
|
@@ -319,21 +360,7 @@ VehicleRentalOverlay.props = {
|
|
|
319
360
|
visible: PropTypes.bool
|
|
320
361
|
};
|
|
321
362
|
VehicleRentalOverlay.defaultProps = {
|
|
322
|
-
getStationName:
|
|
323
|
-
var stationNetworks = coreUtils.itinerary.getCompaniesLabelFromNetworks(station.networks, configCompanies);
|
|
324
|
-
var stationName = station.name || station.id;
|
|
325
|
-
|
|
326
|
-
if (station.isFloatingBike) {
|
|
327
|
-
stationName = "Free-floating bike: ".concat(stationName);
|
|
328
|
-
} else if (station.isFloatingCar) {
|
|
329
|
-
stationName = "".concat(stationNetworks, " ").concat(stationName);
|
|
330
|
-
} else if (station.isFloatingVehicle) {
|
|
331
|
-
// assumes that all floating vehicles are E-scooters
|
|
332
|
-
stationName = "".concat(stationNetworks, " E-scooter");
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
return stationName;
|
|
336
|
-
},
|
|
363
|
+
getStationName: null,
|
|
337
364
|
mapSymbols: [{
|
|
338
365
|
zoom: 0,
|
|
339
366
|
symbol: GenericMarker
|
|
@@ -342,5 +369,5 @@ VehicleRentalOverlay.defaultProps = {
|
|
|
342
369
|
stations: [],
|
|
343
370
|
visible: false
|
|
344
371
|
};
|
|
345
|
-
export default withLeaflet(VehicleRentalOverlay);
|
|
372
|
+
export default withLeaflet(injectIntl(VehicleRentalOverlay));
|
|
346
373
|
//# sourceMappingURL=index.js.map
|
package/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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","refreshVehicles","refreshTimer","setInterval","clearInterval","leaflet","registerOverlay","visible","getZoom","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: null\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 { leaflet, registerOverlay, visible } = this.props;\n this.setState({\n zoom: leaflet.map.getZoom()\n });\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, leaflet, mapSymbols, stations } = this.props;\n const { zoom = leaflet.map.getZoom() } = 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"}
|
|
1
|
+
{"version":3,"sources":["../src/index.js"],"names":["flatten","Styled","BaseMapStyled","coreUtils","FromToLocationPicker","ZoomBasedMarkers","PropTypes","React","FormattedMessage","injectIntl","FeatureGroup","MapLayer","Popup","withLeaflet","GenericMarker","HubAndFloatingBike","SharedBikeCircle","defaultEnglishMessages","defaultMessages","makeDefaultGetStationName","intl","defaultGetStationName","configCompanies","station","stationNetworks","itinerary","getCompaniesLabelFromNetworks","networks","stationName","name","id","isFloatingBike","formatMessage","defaultMessage","description","isFloatingCar","company","isFloatingVehicle","VehicleRentalOverlay","props","renderSymbolWithPopup","Symbol","SymbolWrapper","entity","zoom","renderPopupForStation","bikesAvailable","undefined","propTypes","number","isRequired","convertToZoomMarkerSymbols","mapSymbols","map","mapSymbol","symbol","type","minZoom","onOverlayAdded","startRefreshing","onOverlayRemoved","stopRefreshing","onViewportChanged","viewport","newZoom","state","setState","stationIsHub","getStationName","setLocation","getStationNameFunc","location","lat","y","lon","x","value","spacesAvailable","refreshVehicles","refreshTimer","setInterval","clearInterval","leaflet","registerOverlay","visible","getZoom","companies","stations","filteredStations","filter","includes","length","symbols","arrayOf","string","func","bool","defaultProps"],"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, injectIntl } 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\nfunction makeDefaultGetStationName(intl) {\n return function defaultGetStationName(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 = intl.formatMessage(\n {\n defaultMessage:\n defaultEnglishMessages[\"otpUi.VehicleRentalOverlay.floatingBike\"],\n description: \"Popup title for a free-floating bike\",\n id: \"otpUi.VehicleRentalOverlay.floatingBike\"\n },\n { name: stationName }\n );\n } else if (station.isFloatingCar) {\n stationName = intl.formatMessage(\n {\n defaultMessage:\n defaultEnglishMessages[\"otpUi.VehicleRentalOverlay.floatingCar\"],\n description: \"Popup title for a free-floating car\",\n id: \"otpUi.VehicleRentalOverlay.floatingCar\"\n },\n {\n company: stationNetworks,\n name: stationName\n }\n );\n } else if (station.isFloatingVehicle) {\n // assumes that all floating vehicles are E-scooters\n stationName = intl.formatMessage(\n {\n defaultMessage:\n defaultEnglishMessages[\n \"otpUi.VehicleRentalOverlay.floatingEScooter\"\n ],\n description: \"Popup title for a free-floating e-scooter\",\n id: \"otpUi.VehicleRentalOverlay.floatingEScooter\"\n },\n { company: stationNetworks }\n );\n }\n return stationName;\n };\n}\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: null\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 { leaflet, registerOverlay, visible } = this.props;\n this.setState({\n zoom: leaflet.map.getZoom()\n });\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, intl, setLocation } = this.props;\n const getStationNameFunc =\n getStationName || makeDefaultGetStationName(intl);\n const stationName = getStationNameFunc(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, leaflet, mapSymbols, stations } = this.props;\n const { zoom = leaflet.map.getZoom() } = 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: null,\n mapSymbols: [\n {\n zoom: 0,\n symbol: GenericMarker\n }\n ],\n refreshVehicles: null,\n stations: [],\n visible: false\n};\n\nexport default withLeaflet(injectIntl(VehicleRentalOverlay));\n"],"file":"index.js"}
|
package/i18n/en-US.yml
CHANGED
|
@@ -12,3 +12,6 @@ otpUi:
|
|
|
12
12
|
VehicleRentalOverlay:
|
|
13
13
|
availableBikes: "Available bikes: {value}"
|
|
14
14
|
availableDocks: "Available docks: {value}"
|
|
15
|
+
floatingBike: "Free-floating bike: {name}"
|
|
16
|
+
floatingCar: "{company} {name}" # as in "CarCompany Veh1234a"
|
|
17
|
+
floatingEScooter: "{company} E-scooter"
|
package/i18n/fr.yml
CHANGED
|
@@ -12,3 +12,6 @@ otpUi:
|
|
|
12
12
|
VehicleRentalOverlay:
|
|
13
13
|
availableBikes: "Vélos disponibles : {value}"
|
|
14
14
|
availableDocks: "Bornes disponibles : {value}"
|
|
15
|
+
floatingBike: "Vélo flottant : {name}"
|
|
16
|
+
floatingCar: "{company} {name}" # as in "CarCompany Veh1234a"
|
|
17
|
+
floatingEScooter: "Trottinette {company}"
|
|
@@ -11,8 +11,6 @@ var _leaflet = require("leaflet");
|
|
|
11
11
|
|
|
12
12
|
var _lodash = _interopRequireDefault(require("lodash.memoize"));
|
|
13
13
|
|
|
14
|
-
var _coreUtils = _interopRequireDefault(require("@opentripplanner/core-utils"));
|
|
15
|
-
|
|
16
14
|
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
17
15
|
|
|
18
16
|
var _react = _interopRequireDefault(require("react"));
|
|
@@ -42,7 +40,9 @@ const templatePropTypes = {
|
|
|
42
40
|
children: _propTypes.default.node,
|
|
43
41
|
|
|
44
42
|
/** The rental vehicle or station to render. */
|
|
45
|
-
entity:
|
|
43
|
+
// entity: coreUtils.types.stationType.isRequired,
|
|
44
|
+
// eslint-disable-next-line react/forbid-prop-types
|
|
45
|
+
entity: _propTypes.default.object.isRequired,
|
|
46
46
|
|
|
47
47
|
/** leaflet attribute to control tabindex value for keyboaryd-only / SR users */
|
|
48
48
|
keyboard: _propTypes.default.bool
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/DefaultMarkers/index.js"],"names":["templatePropTypes","children","PropTypes","node","entity","
|
|
1
|
+
{"version":3,"sources":["../../src/DefaultMarkers/index.js"],"names":["templatePropTypes","children","PropTypes","node","entity","object","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 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 // eslint-disable-next-line react/forbid-prop-types\n entity: PropTypes.object.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/lib/index.js
CHANGED
|
@@ -35,12 +35,51 @@ var _enUS = _interopRequireDefault(require("../i18n/en-US.yml"));
|
|
|
35
35
|
// - the yaml loader for webpack returns a nested object,
|
|
36
36
|
// - the yaml loader for jest returns messages with flattened ids.
|
|
37
37
|
const defaultMessages = (0, _flat.default)(_enUS.default);
|
|
38
|
+
|
|
39
|
+
function makeDefaultGetStationName(intl) {
|
|
40
|
+
return function defaultGetStationName(configCompanies, station) {
|
|
41
|
+
const stationNetworks = _coreUtils.default.itinerary.getCompaniesLabelFromNetworks(station.networks, configCompanies);
|
|
42
|
+
|
|
43
|
+
let stationName = station.name || station.id;
|
|
44
|
+
|
|
45
|
+
if (station.isFloatingBike) {
|
|
46
|
+
stationName = intl.formatMessage({
|
|
47
|
+
defaultMessage: _enUS.default["otpUi.VehicleRentalOverlay.floatingBike"],
|
|
48
|
+
description: "Popup title for a free-floating bike",
|
|
49
|
+
id: "otpUi.VehicleRentalOverlay.floatingBike"
|
|
50
|
+
}, {
|
|
51
|
+
name: stationName
|
|
52
|
+
});
|
|
53
|
+
} else if (station.isFloatingCar) {
|
|
54
|
+
stationName = intl.formatMessage({
|
|
55
|
+
defaultMessage: _enUS.default["otpUi.VehicleRentalOverlay.floatingCar"],
|
|
56
|
+
description: "Popup title for a free-floating car",
|
|
57
|
+
id: "otpUi.VehicleRentalOverlay.floatingCar"
|
|
58
|
+
}, {
|
|
59
|
+
company: stationNetworks,
|
|
60
|
+
name: stationName
|
|
61
|
+
});
|
|
62
|
+
} else if (station.isFloatingVehicle) {
|
|
63
|
+
// assumes that all floating vehicles are E-scooters
|
|
64
|
+
stationName = intl.formatMessage({
|
|
65
|
+
defaultMessage: _enUS.default["otpUi.VehicleRentalOverlay.floatingEScooter"],
|
|
66
|
+
description: "Popup title for a free-floating e-scooter",
|
|
67
|
+
id: "otpUi.VehicleRentalOverlay.floatingEScooter"
|
|
68
|
+
}, {
|
|
69
|
+
company: stationNetworks
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return stationName;
|
|
74
|
+
};
|
|
75
|
+
}
|
|
38
76
|
/**
|
|
39
77
|
* This vehicle rental overlay can be used to render vehicle rentals of various
|
|
40
78
|
* types. This layer can be configured to show different styles of markers at
|
|
41
79
|
* different zoom levels.
|
|
42
80
|
*/
|
|
43
81
|
|
|
82
|
+
|
|
44
83
|
class VehicleRentalOverlay extends _reactLeaflet.MapLayer {
|
|
45
84
|
constructor(props) {
|
|
46
85
|
super(props);
|
|
@@ -55,7 +94,7 @@ class VehicleRentalOverlay extends _reactLeaflet.MapLayer {
|
|
|
55
94
|
}, this.renderPopupForStation(station, station.bikesAvailable !== undefined && !station.isFloatingBike));
|
|
56
95
|
|
|
57
96
|
SymbolWrapper.propTypes = {
|
|
58
|
-
entity:
|
|
97
|
+
// entity: coreUtils.types.stationType.isRequired,
|
|
59
98
|
zoom: _propTypes.default.number.isRequired
|
|
60
99
|
};
|
|
61
100
|
return SymbolWrapper;
|
|
@@ -113,9 +152,11 @@ class VehicleRentalOverlay extends _reactLeaflet.MapLayer {
|
|
|
113
152
|
const {
|
|
114
153
|
configCompanies,
|
|
115
154
|
getStationName,
|
|
155
|
+
intl,
|
|
116
156
|
setLocation
|
|
117
157
|
} = this.props;
|
|
118
|
-
const
|
|
158
|
+
const getStationNameFunc = getStationName || makeDefaultGetStationName(intl);
|
|
159
|
+
const stationName = getStationNameFunc(configCompanies, station);
|
|
119
160
|
const location = {
|
|
120
161
|
lat: station.y,
|
|
121
162
|
lon: station.x,
|
|
@@ -252,7 +293,8 @@ VehicleRentalOverlay.props = {
|
|
|
252
293
|
/**
|
|
253
294
|
* The entire companies config array.
|
|
254
295
|
*/
|
|
255
|
-
configCompanies:
|
|
296
|
+
// configCompanies: PropTypes.arrayOf(coreUtils.types.companyType.isRequired)
|
|
297
|
+
// .isRequired,
|
|
256
298
|
|
|
257
299
|
/**
|
|
258
300
|
* A list of companies that are applicable to just this instance of the
|
|
@@ -271,7 +313,7 @@ VehicleRentalOverlay.props = {
|
|
|
271
313
|
* A configuration of what map markers or symbols to show at various
|
|
272
314
|
* zoom levels.
|
|
273
315
|
*/
|
|
274
|
-
mapSymbols:
|
|
316
|
+
// mapSymbols: coreUtils.types.vehicleRentalMapOverlaySymbolsType,
|
|
275
317
|
|
|
276
318
|
/**
|
|
277
319
|
* If specified, a function that will be triggered every 30 seconds whenever this layer is
|
|
@@ -301,7 +343,7 @@ VehicleRentalOverlay.props = {
|
|
|
301
343
|
/**
|
|
302
344
|
* A list of the vehicle rental stations specific to this overlay instance.
|
|
303
345
|
*/
|
|
304
|
-
stations:
|
|
346
|
+
// stations: PropTypes.arrayOf(coreUtils.types.stationType),
|
|
305
347
|
|
|
306
348
|
/**
|
|
307
349
|
* Whether the overlay is currently visible.
|
|
@@ -309,22 +351,7 @@ VehicleRentalOverlay.props = {
|
|
|
309
351
|
visible: _propTypes.default.bool
|
|
310
352
|
};
|
|
311
353
|
VehicleRentalOverlay.defaultProps = {
|
|
312
|
-
getStationName:
|
|
313
|
-
const stationNetworks = _coreUtils.default.itinerary.getCompaniesLabelFromNetworks(station.networks, configCompanies);
|
|
314
|
-
|
|
315
|
-
let stationName = station.name || station.id;
|
|
316
|
-
|
|
317
|
-
if (station.isFloatingBike) {
|
|
318
|
-
stationName = `Free-floating bike: ${stationName}`;
|
|
319
|
-
} else if (station.isFloatingCar) {
|
|
320
|
-
stationName = `${stationNetworks} ${stationName}`;
|
|
321
|
-
} else if (station.isFloatingVehicle) {
|
|
322
|
-
// assumes that all floating vehicles are E-scooters
|
|
323
|
-
stationName = `${stationNetworks} E-scooter`;
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
return stationName;
|
|
327
|
-
},
|
|
354
|
+
getStationName: null,
|
|
328
355
|
mapSymbols: [{
|
|
329
356
|
zoom: 0,
|
|
330
357
|
symbol: _DefaultMarkers.GenericMarker
|
|
@@ -334,7 +361,7 @@ VehicleRentalOverlay.defaultProps = {
|
|
|
334
361
|
visible: false
|
|
335
362
|
};
|
|
336
363
|
|
|
337
|
-
var _default = (0, _reactLeaflet.withLeaflet)(VehicleRentalOverlay);
|
|
364
|
+
var _default = (0, _reactLeaflet.withLeaflet)((0, _reactIntl.injectIntl)(VehicleRentalOverlay));
|
|
338
365
|
|
|
339
366
|
exports.default = _default;
|
|
340
367
|
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.js"],"names":["defaultMessages","defaultEnglishMessages","VehicleRentalOverlay","MapLayer","constructor","props","renderSymbolWithPopup","Symbol","SymbolWrapper","entity","station","zoom","renderPopupForStation","bikesAvailable","undefined","isFloatingBike","propTypes","coreUtils","types","stationType","isRequired","PropTypes","number","convertToZoomMarkerSymbols","mapSymbols","map","mapSymbol","symbol","type","HubAndFloatingBike","minZoom","onOverlayAdded","startRefreshing","onOverlayRemoved","stopRefreshing","onViewportChanged","viewport","newZoom","state","setState","stationIsHub","configCompanies","getStationName","setLocation","stationName","location","lat","y","lon","x","name","value","spacesAvailable","createLeafletElement","updateLeafletElement","refreshVehicles","refreshTimer","setInterval","clearInterval","componentDidMount","leaflet","registerOverlay","visible","getZoom","componentWillUnmount","render","companies","stations","filteredStations","filter","networks","includes","length","symbols","arrayOf","companyType","string","func","vehicleRentalMapOverlaySymbolsType","bool","defaultProps","stationNetworks","itinerary","getCompaniesLabelFromNetworks","id","isFloatingCar","isFloatingVehicle","GenericMarker"],"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: null\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 { leaflet, registerOverlay, visible } = this.props;\n this.setState({\n zoom: leaflet.map.getZoom()\n });\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, leaflet, mapSymbols, stations } = this.props;\n const { zoom = leaflet.map.getZoom() } = 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"}
|
|
1
|
+
{"version":3,"sources":["../src/index.js"],"names":["defaultMessages","defaultEnglishMessages","makeDefaultGetStationName","intl","defaultGetStationName","configCompanies","station","stationNetworks","coreUtils","itinerary","getCompaniesLabelFromNetworks","networks","stationName","name","id","isFloatingBike","formatMessage","defaultMessage","description","isFloatingCar","company","isFloatingVehicle","VehicleRentalOverlay","MapLayer","constructor","props","renderSymbolWithPopup","Symbol","SymbolWrapper","entity","zoom","renderPopupForStation","bikesAvailable","undefined","propTypes","PropTypes","number","isRequired","convertToZoomMarkerSymbols","mapSymbols","map","mapSymbol","symbol","type","HubAndFloatingBike","minZoom","onOverlayAdded","startRefreshing","onOverlayRemoved","stopRefreshing","onViewportChanged","viewport","newZoom","state","setState","stationIsHub","getStationName","setLocation","getStationNameFunc","location","lat","y","lon","x","value","spacesAvailable","createLeafletElement","updateLeafletElement","refreshVehicles","refreshTimer","setInterval","clearInterval","componentDidMount","leaflet","registerOverlay","visible","getZoom","componentWillUnmount","render","companies","stations","filteredStations","filter","includes","length","symbols","arrayOf","string","func","bool","defaultProps","GenericMarker"],"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, injectIntl } 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\nfunction makeDefaultGetStationName(intl) {\n return function defaultGetStationName(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 = intl.formatMessage(\n {\n defaultMessage:\n defaultEnglishMessages[\"otpUi.VehicleRentalOverlay.floatingBike\"],\n description: \"Popup title for a free-floating bike\",\n id: \"otpUi.VehicleRentalOverlay.floatingBike\"\n },\n { name: stationName }\n );\n } else if (station.isFloatingCar) {\n stationName = intl.formatMessage(\n {\n defaultMessage:\n defaultEnglishMessages[\"otpUi.VehicleRentalOverlay.floatingCar\"],\n description: \"Popup title for a free-floating car\",\n id: \"otpUi.VehicleRentalOverlay.floatingCar\"\n },\n {\n company: stationNetworks,\n name: stationName\n }\n );\n } else if (station.isFloatingVehicle) {\n // assumes that all floating vehicles are E-scooters\n stationName = intl.formatMessage(\n {\n defaultMessage:\n defaultEnglishMessages[\n \"otpUi.VehicleRentalOverlay.floatingEScooter\"\n ],\n description: \"Popup title for a free-floating e-scooter\",\n id: \"otpUi.VehicleRentalOverlay.floatingEScooter\"\n },\n { company: stationNetworks }\n );\n }\n return stationName;\n };\n}\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: null\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 { leaflet, registerOverlay, visible } = this.props;\n this.setState({\n zoom: leaflet.map.getZoom()\n });\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, intl, setLocation } = this.props;\n const getStationNameFunc =\n getStationName || makeDefaultGetStationName(intl);\n const stationName = getStationNameFunc(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, leaflet, mapSymbols, stations } = this.props;\n const { zoom = leaflet.map.getZoom() } = 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: null,\n mapSymbols: [\n {\n zoom: 0,\n symbol: GenericMarker\n }\n ],\n refreshVehicles: null,\n stations: [],\n visible: false\n};\n\nexport default withLeaflet(injectIntl(VehicleRentalOverlay));\n"],"file":"index.js"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opentripplanner/vehicle-rental-overlay",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.2",
|
|
4
4
|
"description": "A map overlay to show vehicle rentals from a specific company",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"module": "esm/index.js",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
21
|
"@opentripplanner/core-utils": "^4.5.0",
|
|
22
|
-
"@opentripplanner/from-to-location-picker": "^2.1.
|
|
22
|
+
"@opentripplanner/from-to-location-picker": "^2.1.2",
|
|
23
23
|
"@opentripplanner/zoom-based-markers": "^1.2.1",
|
|
24
24
|
"@styled-icons/fa-solid": "^10.34.0",
|
|
25
25
|
"flat": "^5.0.2",
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { divIcon } from "leaflet";
|
|
2
2
|
import memoize from "lodash.memoize";
|
|
3
|
-
import coreUtils from "@opentripplanner/core-utils";
|
|
4
3
|
import PropTypes from "prop-types";
|
|
5
4
|
import React from "react";
|
|
6
5
|
import ReactDOMServer from "react-dom/server";
|
|
@@ -22,7 +21,9 @@ const templatePropTypes = {
|
|
|
22
21
|
/** The children of the component. */
|
|
23
22
|
children: PropTypes.node,
|
|
24
23
|
/** The rental vehicle or station to render. */
|
|
25
|
-
entity: coreUtils.types.stationType.isRequired,
|
|
24
|
+
// entity: coreUtils.types.stationType.isRequired,
|
|
25
|
+
// eslint-disable-next-line react/forbid-prop-types
|
|
26
|
+
entity: PropTypes.object.isRequired,
|
|
26
27
|
/** leaflet attribute to control tabindex value for keyboaryd-only / SR users */
|
|
27
28
|
keyboard: PropTypes.bool
|
|
28
29
|
};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
// Removed as core-utils is typescripted. TODO: Remove when typescripting!
|
|
2
|
+
/* eslint-disable react/forbid-prop-types */
|
|
1
3
|
import BaseMap from "@opentripplanner/base-map";
|
|
2
|
-
import coreUtils from "@opentripplanner/core-utils";
|
|
3
4
|
import PropTypes from "prop-types";
|
|
4
5
|
import React from "react";
|
|
5
6
|
import { CircleMarker } from "react-leaflet";
|
|
@@ -37,7 +38,8 @@ const MyCircle = ({ fillColor = "gray", pixels, strokeColor }) => {
|
|
|
37
38
|
);
|
|
38
39
|
GeneratedCircle.propTypes = {
|
|
39
40
|
children: PropTypes.node,
|
|
40
|
-
entity: coreUtils.types.stationType.isRequired
|
|
41
|
+
// entity: coreUtils.types.stationType.isRequired
|
|
42
|
+
entity: PropTypes.object.isRequired
|
|
41
43
|
};
|
|
42
44
|
GeneratedCircle.defaultProps = {
|
|
43
45
|
children: null
|
|
@@ -194,10 +196,12 @@ const ZoomControlledMapWithVehicleRentalOverlay = ({
|
|
|
194
196
|
ZoomControlledMapWithVehicleRentalOverlay.propTypes = {
|
|
195
197
|
companies: PropTypes.arrayOf(PropTypes.string.isRequired),
|
|
196
198
|
getStationName: PropTypes.func,
|
|
197
|
-
mapSymbols: coreUtils.types.vehicleRentalMapOverlaySymbolsType,
|
|
199
|
+
// mapSymbols: coreUtils.types.vehicleRentalMapOverlaySymbolsType,
|
|
200
|
+
mapSymbols: PropTypes.object,
|
|
198
201
|
refreshVehicles: PropTypes.func.isRequired,
|
|
199
|
-
stations: PropTypes.arrayOf(coreUtils.types.stationType.isRequired)
|
|
200
|
-
|
|
202
|
+
// stations: PropTypes.arrayOf(coreUtils.types.stationType.isRequired)
|
|
203
|
+
// .isRequired,
|
|
204
|
+
stations: PropTypes.arrayOf(PropTypes.object.isRequired).isRequired,
|
|
201
205
|
visible: PropTypes.bool
|
|
202
206
|
};
|
|
203
207
|
|
package/src/index.js
CHANGED
|
@@ -5,7 +5,7 @@ import FromToLocationPicker from "@opentripplanner/from-to-location-picker";
|
|
|
5
5
|
import ZoomBasedMarkers from "@opentripplanner/zoom-based-markers";
|
|
6
6
|
import PropTypes from "prop-types";
|
|
7
7
|
import React from "react";
|
|
8
|
-
import { FormattedMessage } from "react-intl";
|
|
8
|
+
import { FormattedMessage, injectIntl } from "react-intl";
|
|
9
9
|
import { FeatureGroup, MapLayer, Popup, withLeaflet } from "react-leaflet";
|
|
10
10
|
|
|
11
11
|
import {
|
|
@@ -23,6 +23,54 @@ import defaultEnglishMessages from "../i18n/en-US.yml";
|
|
|
23
23
|
// - the yaml loader for jest returns messages with flattened ids.
|
|
24
24
|
const defaultMessages = flatten(defaultEnglishMessages);
|
|
25
25
|
|
|
26
|
+
function makeDefaultGetStationName(intl) {
|
|
27
|
+
return function defaultGetStationName(configCompanies, station) {
|
|
28
|
+
const stationNetworks = coreUtils.itinerary.getCompaniesLabelFromNetworks(
|
|
29
|
+
station.networks,
|
|
30
|
+
configCompanies
|
|
31
|
+
);
|
|
32
|
+
let stationName = station.name || station.id;
|
|
33
|
+
if (station.isFloatingBike) {
|
|
34
|
+
stationName = intl.formatMessage(
|
|
35
|
+
{
|
|
36
|
+
defaultMessage:
|
|
37
|
+
defaultEnglishMessages["otpUi.VehicleRentalOverlay.floatingBike"],
|
|
38
|
+
description: "Popup title for a free-floating bike",
|
|
39
|
+
id: "otpUi.VehicleRentalOverlay.floatingBike"
|
|
40
|
+
},
|
|
41
|
+
{ name: stationName }
|
|
42
|
+
);
|
|
43
|
+
} else if (station.isFloatingCar) {
|
|
44
|
+
stationName = intl.formatMessage(
|
|
45
|
+
{
|
|
46
|
+
defaultMessage:
|
|
47
|
+
defaultEnglishMessages["otpUi.VehicleRentalOverlay.floatingCar"],
|
|
48
|
+
description: "Popup title for a free-floating car",
|
|
49
|
+
id: "otpUi.VehicleRentalOverlay.floatingCar"
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
company: stationNetworks,
|
|
53
|
+
name: stationName
|
|
54
|
+
}
|
|
55
|
+
);
|
|
56
|
+
} else if (station.isFloatingVehicle) {
|
|
57
|
+
// assumes that all floating vehicles are E-scooters
|
|
58
|
+
stationName = intl.formatMessage(
|
|
59
|
+
{
|
|
60
|
+
defaultMessage:
|
|
61
|
+
defaultEnglishMessages[
|
|
62
|
+
"otpUi.VehicleRentalOverlay.floatingEScooter"
|
|
63
|
+
],
|
|
64
|
+
description: "Popup title for a free-floating e-scooter",
|
|
65
|
+
id: "otpUi.VehicleRentalOverlay.floatingEScooter"
|
|
66
|
+
},
|
|
67
|
+
{ company: stationNetworks }
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
return stationName;
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
|
|
26
74
|
/**
|
|
27
75
|
* This vehicle rental overlay can be used to render vehicle rentals of various
|
|
28
76
|
* types. This layer can be configured to show different styles of markers at
|
|
@@ -51,7 +99,7 @@ class VehicleRentalOverlay extends MapLayer {
|
|
|
51
99
|
</Symbol>
|
|
52
100
|
);
|
|
53
101
|
SymbolWrapper.propTypes = {
|
|
54
|
-
entity: coreUtils.types.stationType.isRequired,
|
|
102
|
+
// entity: coreUtils.types.stationType.isRequired,
|
|
55
103
|
zoom: PropTypes.number.isRequired
|
|
56
104
|
};
|
|
57
105
|
|
|
@@ -163,8 +211,10 @@ class VehicleRentalOverlay extends MapLayer {
|
|
|
163
211
|
* applicable to other regions.
|
|
164
212
|
*/
|
|
165
213
|
renderPopupForStation = (station, stationIsHub = false) => {
|
|
166
|
-
const { configCompanies, getStationName, setLocation } = this.props;
|
|
167
|
-
const
|
|
214
|
+
const { configCompanies, getStationName, intl, setLocation } = this.props;
|
|
215
|
+
const getStationNameFunc =
|
|
216
|
+
getStationName || makeDefaultGetStationName(intl);
|
|
217
|
+
const stationName = getStationNameFunc(configCompanies, station);
|
|
168
218
|
const location = {
|
|
169
219
|
lat: station.y,
|
|
170
220
|
lon: station.x,
|
|
@@ -254,8 +304,8 @@ VehicleRentalOverlay.props = {
|
|
|
254
304
|
/**
|
|
255
305
|
* The entire companies config array.
|
|
256
306
|
*/
|
|
257
|
-
configCompanies: PropTypes.arrayOf(coreUtils.types.companyType.isRequired)
|
|
258
|
-
|
|
307
|
+
// configCompanies: PropTypes.arrayOf(coreUtils.types.companyType.isRequired)
|
|
308
|
+
// .isRequired,
|
|
259
309
|
/**
|
|
260
310
|
* A list of companies that are applicable to just this instance of the
|
|
261
311
|
* overlay.
|
|
@@ -271,7 +321,7 @@ VehicleRentalOverlay.props = {
|
|
|
271
321
|
* A configuration of what map markers or symbols to show at various
|
|
272
322
|
* zoom levels.
|
|
273
323
|
*/
|
|
274
|
-
mapSymbols: coreUtils.types.vehicleRentalMapOverlaySymbolsType,
|
|
324
|
+
// mapSymbols: coreUtils.types.vehicleRentalMapOverlaySymbolsType,
|
|
275
325
|
/**
|
|
276
326
|
* If specified, a function that will be triggered every 30 seconds whenever this layer is
|
|
277
327
|
* visible.
|
|
@@ -298,7 +348,7 @@ VehicleRentalOverlay.props = {
|
|
|
298
348
|
/**
|
|
299
349
|
* A list of the vehicle rental stations specific to this overlay instance.
|
|
300
350
|
*/
|
|
301
|
-
stations: PropTypes.arrayOf(coreUtils.types.stationType),
|
|
351
|
+
// stations: PropTypes.arrayOf(coreUtils.types.stationType),
|
|
302
352
|
/**
|
|
303
353
|
* Whether the overlay is currently visible.
|
|
304
354
|
*/
|
|
@@ -306,22 +356,7 @@ VehicleRentalOverlay.props = {
|
|
|
306
356
|
};
|
|
307
357
|
|
|
308
358
|
VehicleRentalOverlay.defaultProps = {
|
|
309
|
-
getStationName:
|
|
310
|
-
const stationNetworks = coreUtils.itinerary.getCompaniesLabelFromNetworks(
|
|
311
|
-
station.networks,
|
|
312
|
-
configCompanies
|
|
313
|
-
);
|
|
314
|
-
let stationName = station.name || station.id;
|
|
315
|
-
if (station.isFloatingBike) {
|
|
316
|
-
stationName = `Free-floating bike: ${stationName}`;
|
|
317
|
-
} else if (station.isFloatingCar) {
|
|
318
|
-
stationName = `${stationNetworks} ${stationName}`;
|
|
319
|
-
} else if (station.isFloatingVehicle) {
|
|
320
|
-
// assumes that all floating vehicles are E-scooters
|
|
321
|
-
stationName = `${stationNetworks} E-scooter`;
|
|
322
|
-
}
|
|
323
|
-
return stationName;
|
|
324
|
-
},
|
|
359
|
+
getStationName: null,
|
|
325
360
|
mapSymbols: [
|
|
326
361
|
{
|
|
327
362
|
zoom: 0,
|
|
@@ -333,4 +368,4 @@ VehicleRentalOverlay.defaultProps = {
|
|
|
333
368
|
visible: false
|
|
334
369
|
};
|
|
335
370
|
|
|
336
|
-
export default withLeaflet(VehicleRentalOverlay);
|
|
371
|
+
export default withLeaflet(injectIntl(VehicleRentalOverlay));
|