@geops/rvf-mobility-web-component 0.1.74 → 0.1.75
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/CHANGELOG.md +21 -0
- package/README.md +17 -55
- package/docutils.js +1 -1
- package/index.html +9 -1
- package/index.js +112 -108
- package/package.json +1 -1
- package/src/FeatureDetails/FeatureDetails.tsx +9 -18
- package/src/LayerTreeMenu/LayerTreeMenu.tsx +1 -1
- package/src/LayoutState/LayoutState.tsx +14 -1
- package/src/LinesNetworkPlanDetails/LinesNetworkPlanDetails.tsx +37 -68
- package/src/LinesNetworkPlanLayerHighlight/LinesNetworkPlanLayerHighlight.tsx +1 -1
- package/src/MobilityMap/MobilityMap.tsx +1 -5
- package/src/MobilityMap/MobilityMapAttributes.ts +9 -5
- package/src/MobilityNotifications/MobilityNotifications.tsx +1 -6
- package/src/OverlayContent/OverlayContent.tsx +1 -2
- package/src/OverlayDetails/OverlayDetails.tsx +23 -2
- package/src/OverlayDetailsHeader/OverlayDetailsHeader.tsx +3 -0
- package/src/OverlayHeader/OverlayHeader.tsx +1 -1
- package/src/RvfFeatureDetails/RvfFeatureDetails.tsx +5 -4
- package/src/RvfFeatureDetails/RvfSellingPointDetails/RvfSellingPointDetails.tsx +1 -1
- package/src/utils/constants.ts +2 -1
- package/src/utils/hooks/useLayersConfig.tsx +3 -0
- package/src/utils/hooks/{useLnpLineInfo.tsx → useLnp.tsx} +24 -9
- package/src/utils/hooks/useMapContext.tsx +4 -0
- package/src/RvfSingleClickListener/RvfSingleClickListener.tsx +0 -238
- package/src/RvfSingleClickListener/index.tsx +0 -1
|
@@ -1,238 +0,0 @@
|
|
|
1
|
-
import { getFeatureInfoAtCoordinate } from "mobility-toolbox-js/ol";
|
|
2
|
-
import { GeoJSON } from "ol/format";
|
|
3
|
-
import { unByKey } from "ol/Observable";
|
|
4
|
-
import { useCallback, useEffect } from "preact/hooks";
|
|
5
|
-
|
|
6
|
-
import {
|
|
7
|
-
LAYER_NAME_REALTIME,
|
|
8
|
-
LAYER_NAME_STATIONS,
|
|
9
|
-
PROVIDER_LOGOS_BY_FEED_ID,
|
|
10
|
-
} from "../utils/constants";
|
|
11
|
-
import useMapContext from "../utils/hooks/useMapContext";
|
|
12
|
-
import useRvfContext from "../utils/hooks/useRvfContext";
|
|
13
|
-
import MobilityEvent from "../utils/MobilityEvent";
|
|
14
|
-
import { fetchSharingStation } from "../utils/sharingGraphqlUtils";
|
|
15
|
-
|
|
16
|
-
import type { GeoJSONSource } from "maplibre-gl";
|
|
17
|
-
import type { Feature, MapBrowserEvent } from "ol";
|
|
18
|
-
|
|
19
|
-
const geojson = new GeoJSON();
|
|
20
|
-
|
|
21
|
-
function SingleClickListener({ eventNode }: { eventNode: HTMLElement }) {
|
|
22
|
-
const {
|
|
23
|
-
baseLayer,
|
|
24
|
-
map,
|
|
25
|
-
queryablelayers,
|
|
26
|
-
realtimeLayer,
|
|
27
|
-
setStationId,
|
|
28
|
-
setTrainId,
|
|
29
|
-
stationId,
|
|
30
|
-
stationsLayer,
|
|
31
|
-
tenant,
|
|
32
|
-
trainId,
|
|
33
|
-
} = useMapContext();
|
|
34
|
-
const { selectedFeature, setSelectedFeature, setSelectedFeatures } =
|
|
35
|
-
useRvfContext();
|
|
36
|
-
|
|
37
|
-
// Send the selctedFEature to the parent window
|
|
38
|
-
useEffect(() => {
|
|
39
|
-
eventNode?.dispatchEvent(
|
|
40
|
-
new MobilityEvent("mwc:selectedfeature", {
|
|
41
|
-
feature: selectedFeature
|
|
42
|
-
? geojson.writeFeatureObject(selectedFeature)
|
|
43
|
-
: null,
|
|
44
|
-
}),
|
|
45
|
-
);
|
|
46
|
-
}, [eventNode, selectedFeature]);
|
|
47
|
-
|
|
48
|
-
const onPointerMove = useCallback(
|
|
49
|
-
(evt: MapBrowserEvent<PointerEvent>) => {
|
|
50
|
-
const [realtimeFeature] = evt.map.getFeaturesAtPixel(evt.pixel, {
|
|
51
|
-
hitTolerance: 5,
|
|
52
|
-
layerFilter: (l) => {
|
|
53
|
-
return l === realtimeLayer;
|
|
54
|
-
},
|
|
55
|
-
});
|
|
56
|
-
realtimeLayer?.highlight(realtimeFeature as Feature);
|
|
57
|
-
|
|
58
|
-
const stationsFeatures = evt.map.getFeaturesAtPixel(evt.pixel, {
|
|
59
|
-
layerFilter: (l) => {
|
|
60
|
-
return l === stationsLayer;
|
|
61
|
-
},
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
const [stationFeature] = stationsFeatures.filter((feat) => {
|
|
65
|
-
return feat.get("tralis_network")?.includes(tenant);
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
// Send all the features under the cursor
|
|
69
|
-
const features = evt.map.getFeaturesAtPixel(evt.pixel, {
|
|
70
|
-
layerFilter: (l) => {
|
|
71
|
-
return queryablelayers
|
|
72
|
-
? queryablelayers.split(",").includes(l.get("name"))
|
|
73
|
-
: l.get("isQueryable");
|
|
74
|
-
},
|
|
75
|
-
}) as Feature[];
|
|
76
|
-
|
|
77
|
-
evt.map.getTargetElement().style.cursor =
|
|
78
|
-
realtimeFeature || stationFeature || features?.length
|
|
79
|
-
? "pointer"
|
|
80
|
-
: "default";
|
|
81
|
-
},
|
|
82
|
-
[queryablelayers, realtimeLayer, stationsLayer, tenant],
|
|
83
|
-
);
|
|
84
|
-
|
|
85
|
-
const onSingleClick = useCallback(
|
|
86
|
-
async (evt: MapBrowserEvent<PointerEvent>) => {
|
|
87
|
-
if (!baseLayer?.mapLibreMap) {
|
|
88
|
-
return;
|
|
89
|
-
}
|
|
90
|
-
const [realtimeFeature] = evt.map.getFeaturesAtPixel(evt.pixel, {
|
|
91
|
-
hitTolerance: 5,
|
|
92
|
-
layerFilter: (l) => {
|
|
93
|
-
return l === realtimeLayer;
|
|
94
|
-
},
|
|
95
|
-
}) as Feature[];
|
|
96
|
-
realtimeFeature?.set("layerName", LAYER_NAME_REALTIME);
|
|
97
|
-
|
|
98
|
-
const stationsFeatures = evt.map.getFeaturesAtPixel(evt.pixel, {
|
|
99
|
-
layerFilter: (l) => {
|
|
100
|
-
return l === stationsLayer;
|
|
101
|
-
},
|
|
102
|
-
});
|
|
103
|
-
const [stationFeature] = stationsFeatures.filter((feat) => {
|
|
104
|
-
return feat.get("tralis_network")?.includes(tenant);
|
|
105
|
-
}) as Feature[];
|
|
106
|
-
stationFeature?.set("layerName", LAYER_NAME_STATIONS);
|
|
107
|
-
|
|
108
|
-
const newStationId = stationFeature?.get("uid");
|
|
109
|
-
|
|
110
|
-
const newTrainId = realtimeFeature?.get("train_id");
|
|
111
|
-
|
|
112
|
-
if (newStationId && stationId !== newStationId) {
|
|
113
|
-
setStationId(newStationId);
|
|
114
|
-
setTrainId(null);
|
|
115
|
-
} else if (newTrainId && newTrainId !== trainId) {
|
|
116
|
-
setTrainId(realtimeFeature.get("train_id"));
|
|
117
|
-
setStationId(null);
|
|
118
|
-
} else {
|
|
119
|
-
setTrainId(null);
|
|
120
|
-
setStationId(null);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
// Send all the features under the cursor
|
|
124
|
-
// const features = evt.map.getFeaturesAtPixel(evt.pixel, {
|
|
125
|
-
// hitTolerance: 5,
|
|
126
|
-
// layerFilter: (l) => {
|
|
127
|
-
// console.log(queryablelayers);
|
|
128
|
-
// return queryablelayers
|
|
129
|
-
// ? queryablelayers.split(",").includes(l.get("name"))
|
|
130
|
-
// : l.get("isQueryable");
|
|
131
|
-
// },
|
|
132
|
-
// }) as Feature[];
|
|
133
|
-
|
|
134
|
-
const queryableLayers = evt.map.getAllLayers().filter((l) => {
|
|
135
|
-
return queryablelayers
|
|
136
|
-
? queryablelayers.split(",").includes(l.get("name"))
|
|
137
|
-
: l.get("isQueryable");
|
|
138
|
-
});
|
|
139
|
-
const featuresInfos = await getFeatureInfoAtCoordinate(
|
|
140
|
-
evt.coordinate,
|
|
141
|
-
queryableLayers,
|
|
142
|
-
5,
|
|
143
|
-
true,
|
|
144
|
-
);
|
|
145
|
-
|
|
146
|
-
// Set the layerName as property of the feature
|
|
147
|
-
featuresInfos.forEach((f) => {
|
|
148
|
-
f.features.forEach((feat) => {
|
|
149
|
-
feat.set("layerName", f.layer.get("name"));
|
|
150
|
-
});
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
const features = featuresInfos.flatMap((f) => {
|
|
154
|
-
return f.features;
|
|
155
|
-
});
|
|
156
|
-
|
|
157
|
-
// Append more infos about the features
|
|
158
|
-
for (const feature of features) {
|
|
159
|
-
const clusterId = feature.get("cluster_id");
|
|
160
|
-
if (clusterId) {
|
|
161
|
-
const vtFeat = feature.get("vectorTileFeature");
|
|
162
|
-
const sourceId = vtFeat.layer.source;
|
|
163
|
-
const leaves =
|
|
164
|
-
(await baseLayer.mapLibreMap
|
|
165
|
-
.getSource<GeoJSONSource>(sourceId)
|
|
166
|
-
?.getClusterLeaves(clusterId, 1000, 0)) || [];
|
|
167
|
-
|
|
168
|
-
feature.set(
|
|
169
|
-
"clusterLeaves",
|
|
170
|
-
leaves.map((l) => {
|
|
171
|
-
return geojson.readFeature(l);
|
|
172
|
-
}),
|
|
173
|
-
);
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
// Sharing station
|
|
177
|
-
const sharingStationId = selectedFeature?.get("station_id");
|
|
178
|
-
if (sharingStationId) {
|
|
179
|
-
const sharingStationInfo =
|
|
180
|
-
await fetchSharingStation(sharingStationId);
|
|
181
|
-
selectedFeature.setProperties(sharingStationInfo);
|
|
182
|
-
selectedFeature.set(
|
|
183
|
-
"provider_logo",
|
|
184
|
-
PROVIDER_LOGOS_BY_FEED_ID[selectedFeature?.get("feed_id")],
|
|
185
|
-
);
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
if (newStationId || newTrainId || !features.length) {
|
|
190
|
-
setSelectedFeature(null);
|
|
191
|
-
setSelectedFeatures([]);
|
|
192
|
-
} else {
|
|
193
|
-
setSelectedFeatures(features);
|
|
194
|
-
|
|
195
|
-
// We prioritize some layers like the notification one over the others
|
|
196
|
-
const notificationFeature = features.find((feat) => {
|
|
197
|
-
return feat.get("situation");
|
|
198
|
-
});
|
|
199
|
-
if (notificationFeature) {
|
|
200
|
-
setSelectedFeature(notificationFeature);
|
|
201
|
-
} else {
|
|
202
|
-
setSelectedFeature(features[0]);
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
},
|
|
206
|
-
[
|
|
207
|
-
baseLayer?.mapLibreMap,
|
|
208
|
-
stationId,
|
|
209
|
-
trainId,
|
|
210
|
-
realtimeLayer,
|
|
211
|
-
stationsLayer,
|
|
212
|
-
tenant,
|
|
213
|
-
setStationId,
|
|
214
|
-
setTrainId,
|
|
215
|
-
queryablelayers,
|
|
216
|
-
selectedFeature,
|
|
217
|
-
setSelectedFeature,
|
|
218
|
-
setSelectedFeatures,
|
|
219
|
-
],
|
|
220
|
-
);
|
|
221
|
-
|
|
222
|
-
useEffect(() => {
|
|
223
|
-
const key = map?.on("singleclick", onSingleClick);
|
|
224
|
-
return () => {
|
|
225
|
-
unByKey(key);
|
|
226
|
-
};
|
|
227
|
-
}, [map, onSingleClick]);
|
|
228
|
-
|
|
229
|
-
useEffect(() => {
|
|
230
|
-
const key = map?.on("pointermove", onPointerMove);
|
|
231
|
-
return () => {
|
|
232
|
-
unByKey(key);
|
|
233
|
-
};
|
|
234
|
-
}, [map, onPointerMove]);
|
|
235
|
-
|
|
236
|
-
return null;
|
|
237
|
-
}
|
|
238
|
-
export default SingleClickListener;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { default } from "./RvfSingleClickListener";
|