react-spatial 1.12.2-beta.0 → 1.12.3-beta.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.
- package/README.md +3 -3
- package/components/BaseLayerSwitcher/BaseLayerSwitcher.js +43 -39
- package/components/BaseLayerSwitcher/BaseLayerSwitcher.js.map +2 -2
- package/components/BasicMap/BasicMap.js +8 -20
- package/components/BasicMap/BasicMap.js.map +2 -2
- package/components/Copyright/Copyright.js +15 -26
- package/components/Copyright/Copyright.js.map +2 -2
- package/components/FeatureExportButton/FeatureExportButton.js +3 -3
- package/components/FeatureExportButton/FeatureExportButton.js.map +2 -2
- package/components/Geolocation/Geolocation.scss +7 -5
- package/components/LayerTree/LayerTree.js +113 -37
- package/components/LayerTree/LayerTree.js.map +2 -2
- package/components/LayerTree/LayerTree.scss +4 -2
- package/components/Permalink/Permalink.js +19 -14
- package/components/Permalink/Permalink.js.map +2 -2
- package/components/Popup/Popup.scss +3 -1
- package/components/RouteSchedule/RouteSchedule.md.scss +3 -1
- package/components/RouteSchedule/RouteSchedule.scss +3 -1
- package/components/ScaleLine/ScaleLine.scss +5 -3
- package/components/StopsFinder/StopsFinder.js +25 -31
- package/components/StopsFinder/StopsFinder.js.map +2 -2
- package/components/Zoom/Zoom.md.scss +3 -1
- package/components/Zoom/Zoom.scss +6 -4
- package/package.json +37 -39
- package/themes/default/components.scss +9 -9
- package/themes/default/examples.scss +19 -17
- package/themes/default/index.scss +3 -3
- package/themes/default/mixins.scss +7 -5
- package/utils/KML.js +3 -4
- package/utils/KML.js.map +2 -2
- package/utils/getLayersAsFlatArray.js +14 -0
- package/utils/getLayersAsFlatArray.js.map +7 -0
- package/images/baselayer/osm.baselayer.hot.png +0 -0
- package/images/baselayer/osm.baselayer.png +0 -0
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import
|
|
1
|
+
import Layer from "ol/layer/Layer";
|
|
2
2
|
import { unByKey } from "ol/Observable";
|
|
3
|
+
import { getUid } from "ol/util";
|
|
3
4
|
import PropTypes from "prop-types";
|
|
4
5
|
import React, { Component } from "react";
|
|
6
|
+
import getLayersAsFlatArray from "../../utils/getLayersAsFlatArray";
|
|
5
7
|
const propTypes = {
|
|
6
8
|
/**
|
|
7
9
|
* CSS class to apply on the container.
|
|
@@ -124,9 +126,8 @@ const defaultProps = {
|
|
|
124
126
|
renderCheckbox: null,
|
|
125
127
|
renderItem: null,
|
|
126
128
|
renderItemContent: null,
|
|
127
|
-
renderLabel: (layer
|
|
128
|
-
|
|
129
|
-
return t(layer.name);
|
|
129
|
+
renderLabel: (layer) => {
|
|
130
|
+
return layer?.get("name") || "";
|
|
130
131
|
},
|
|
131
132
|
t: (s) => {
|
|
132
133
|
return s;
|
|
@@ -139,13 +140,39 @@ const defaultProps = {
|
|
|
139
140
|
}
|
|
140
141
|
};
|
|
141
142
|
class LayerTree extends Component {
|
|
143
|
+
static getChildren = (layer) => layer?.get("children") || layer?.children || // ol.layer.group
|
|
144
|
+
layer?.getLayers?.().getArray() || [];
|
|
145
|
+
static getVisible = (layer) => layer.getVisible ? layer.getVisible() : layer.visible;
|
|
146
|
+
static listenGroups = (layers) => {
|
|
147
|
+
const flat = getLayersAsFlatArray(layers);
|
|
148
|
+
const keys = flat.map((layer) => {
|
|
149
|
+
return layer.on("change:visible", (e) => {
|
|
150
|
+
const { target } = e;
|
|
151
|
+
if (target.getVisible() && target.get("group")) {
|
|
152
|
+
flat.forEach((l) => {
|
|
153
|
+
if (l.get("group") === target.get("group") && l !== target) {
|
|
154
|
+
l.setVisible(false);
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
return keys;
|
|
161
|
+
};
|
|
162
|
+
static setVisible = (layer, visible) => {
|
|
163
|
+
if (layer.setVisible) {
|
|
164
|
+
layer.setVisible(visible);
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
layer.visible = visible;
|
|
168
|
+
};
|
|
142
169
|
constructor(props) {
|
|
143
170
|
super(props);
|
|
144
171
|
const { isItemHidden, layers } = this.props;
|
|
145
172
|
const initialExpandedLayers = layers ? this.getExpandedLayers(
|
|
146
173
|
layers.filter((l) => {
|
|
147
|
-
return !isItemHidden(l) && (l
|
|
148
|
-
return child
|
|
174
|
+
return !isItemHidden(l) && LayerTree.getChildren(l).filter((child) => {
|
|
175
|
+
return LayerTree.getVisible(child);
|
|
149
176
|
}).filter((c) => {
|
|
150
177
|
return !isItemHidden(c);
|
|
151
178
|
}).length;
|
|
@@ -154,7 +181,7 @@ class LayerTree extends Component {
|
|
|
154
181
|
this.state = {
|
|
155
182
|
expandedLayers: initialExpandedLayers,
|
|
156
183
|
revision: 0,
|
|
157
|
-
rootLayer: new Layer()
|
|
184
|
+
rootLayer: new Layer({})
|
|
158
185
|
};
|
|
159
186
|
this.olKeys = [];
|
|
160
187
|
}
|
|
@@ -173,8 +200,8 @@ class LayerTree extends Component {
|
|
|
173
200
|
}
|
|
174
201
|
expandLayer(layer, expLayers = []) {
|
|
175
202
|
const { isItemHidden } = this.props;
|
|
176
|
-
if (layer
|
|
177
|
-
const children = layer.
|
|
203
|
+
if (LayerTree.getVisible(layer) && !isItemHidden(layer)) {
|
|
204
|
+
const children = LayerTree.getChildren(layer).filter((c) => {
|
|
178
205
|
return !isItemHidden(c) && !c.get("isAlwaysExpanded");
|
|
179
206
|
}).flatMap((c) => {
|
|
180
207
|
return this.expandLayer(c, expLayers);
|
|
@@ -193,7 +220,7 @@ class LayerTree extends Component {
|
|
|
193
220
|
getExpandedLayers(layers) {
|
|
194
221
|
const { isItemHidden } = this.props;
|
|
195
222
|
const children = layers.flatMap((l) => {
|
|
196
|
-
return l.
|
|
223
|
+
return LayerTree.getChildren(l).filter((c) => {
|
|
197
224
|
return !isItemHidden(c) && c.get("isAlwaysExpanded");
|
|
198
225
|
});
|
|
199
226
|
});
|
|
@@ -205,10 +232,8 @@ class LayerTree extends Component {
|
|
|
205
232
|
onInputClick(layer, toggle = false) {
|
|
206
233
|
if (toggle) {
|
|
207
234
|
this.onToggle(layer);
|
|
208
|
-
} else if (layer.setVisible) {
|
|
209
|
-
layer.setVisible(!layer.visible);
|
|
210
235
|
} else {
|
|
211
|
-
layer
|
|
236
|
+
LayerTree.setVisible(layer, !LayerTree.getVisible(layer));
|
|
212
237
|
}
|
|
213
238
|
}
|
|
214
239
|
onToggle(layer) {
|
|
@@ -228,7 +253,7 @@ class LayerTree extends Component {
|
|
|
228
253
|
renderArrow(layer) {
|
|
229
254
|
const { isItemHidden } = this.props;
|
|
230
255
|
const { expandedLayers } = this.state;
|
|
231
|
-
if (!(layer
|
|
256
|
+
if (!LayerTree.getChildren(layer).filter((c) => {
|
|
232
257
|
return !isItemHidden(c);
|
|
233
258
|
}).length || layer.get("isAlwaysExpanded")) {
|
|
234
259
|
return null;
|
|
@@ -243,7 +268,7 @@ class LayerTree extends Component {
|
|
|
243
268
|
renderInput(layer, inputProps) {
|
|
244
269
|
const { isItemHidden, renderCheckbox, titles } = this.props;
|
|
245
270
|
let tabIndex = 0;
|
|
246
|
-
if (!(layer
|
|
271
|
+
if (!LayerTree.getChildren(layer).filter((c) => {
|
|
247
272
|
return !isItemHidden(c);
|
|
248
273
|
}).length) {
|
|
249
274
|
tabIndex = -1;
|
|
@@ -254,7 +279,6 @@ class LayerTree extends Component {
|
|
|
254
279
|
/* @__PURE__ */ React.createElement(
|
|
255
280
|
"label",
|
|
256
281
|
{
|
|
257
|
-
"aria-label": layer.visible ? titles.layerHide : titles.layerShow,
|
|
258
282
|
className: `rs-layer-tree-input rs-layer-tree-input-${inputType} rs-${inputType}`,
|
|
259
283
|
onKeyPress: (e) => {
|
|
260
284
|
if (e.which === 13) {
|
|
@@ -262,12 +286,12 @@ class LayerTree extends Component {
|
|
|
262
286
|
}
|
|
263
287
|
},
|
|
264
288
|
tabIndex,
|
|
265
|
-
title: layer
|
|
289
|
+
title: LayerTree.getVisible(layer) ? titles.layerHide : titles.layerShow
|
|
266
290
|
},
|
|
267
291
|
/* @__PURE__ */ React.createElement(
|
|
268
292
|
"input",
|
|
269
293
|
{
|
|
270
|
-
checked: layer
|
|
294
|
+
checked: LayerTree.getVisible(layer),
|
|
271
295
|
onClick: () => {
|
|
272
296
|
return this.onInputClick(layer);
|
|
273
297
|
},
|
|
@@ -281,7 +305,6 @@ class LayerTree extends Component {
|
|
|
281
305
|
)
|
|
282
306
|
);
|
|
283
307
|
}
|
|
284
|
-
// Render a button which expands/collapse the layer if there is children
|
|
285
308
|
renderItem(layer, level) {
|
|
286
309
|
const { isItemHidden } = this.props;
|
|
287
310
|
const { expandedLayers } = this.state;
|
|
@@ -294,42 +317,53 @@ class LayerTree extends Component {
|
|
|
294
317
|
renderItemContent
|
|
295
318
|
} = this.props;
|
|
296
319
|
const children = expandedLayers.includes(layer) ? [
|
|
297
|
-
...(layer
|
|
320
|
+
...LayerTree.getChildren(layer).filter((c) => {
|
|
298
321
|
return !isItemHidden(c);
|
|
299
322
|
})
|
|
300
323
|
] : [];
|
|
301
324
|
if (renderItem) {
|
|
302
325
|
return renderItem(layer, this.onInputClick, this.onToggle);
|
|
303
326
|
}
|
|
304
|
-
return /* @__PURE__ */ React.createElement(
|
|
327
|
+
return /* @__PURE__ */ React.createElement(
|
|
305
328
|
"div",
|
|
306
329
|
{
|
|
307
|
-
className:
|
|
308
|
-
|
|
309
|
-
paddingLeft: `${padding * level}px`
|
|
310
|
-
}
|
|
330
|
+
className: getParentClassName(),
|
|
331
|
+
key: layer.key || layer.get("key") || layer.get("name") || getUid(layer)
|
|
311
332
|
},
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
333
|
+
/* @__PURE__ */ React.createElement(
|
|
334
|
+
"div",
|
|
335
|
+
{
|
|
336
|
+
className: `rs-layer-tree-item ${LayerTree.getVisible(layer) ? "rs-visible" : ""}`,
|
|
337
|
+
style: {
|
|
338
|
+
paddingLeft: `${padding * level}px`
|
|
339
|
+
}
|
|
340
|
+
},
|
|
341
|
+
renderItemContent ? renderItemContent(layer, this) : this.renderItemContent(layer)
|
|
342
|
+
),
|
|
343
|
+
renderBeforeItem && renderBeforeItem(layer, level, this),
|
|
344
|
+
[...children].reverse().map((child) => {
|
|
345
|
+
return this.renderItem(child, level + 1);
|
|
346
|
+
}),
|
|
347
|
+
renderAfterItem && renderAfterItem(layer, level, this)
|
|
348
|
+
);
|
|
316
349
|
}
|
|
317
350
|
renderItemContent(layer, inputProps = {}, toggleProps = {}) {
|
|
318
351
|
return /* @__PURE__ */ React.createElement(React.Fragment, null, this.renderInput(layer, inputProps), this.renderToggleButton(layer, toggleProps));
|
|
319
352
|
}
|
|
353
|
+
// Render a button which expands/collapse the layer if there is children
|
|
320
354
|
// or simulate a click on the input otherwise.
|
|
321
355
|
renderToggleButton(layer, toggleProps) {
|
|
322
|
-
const { isItemHidden, renderLabel,
|
|
356
|
+
const { isItemHidden, renderLabel, titles } = this.props;
|
|
323
357
|
const { expandedLayers } = this.state;
|
|
324
358
|
const onInputClick = () => {
|
|
325
359
|
this.onInputClick(
|
|
326
360
|
layer,
|
|
327
|
-
(layer
|
|
361
|
+
LayerTree.getChildren(layer).filter((c) => {
|
|
328
362
|
return !isItemHidden(c);
|
|
329
363
|
}).length && !layer.get("isAlwaysExpanded")
|
|
330
364
|
);
|
|
331
365
|
};
|
|
332
|
-
const title = `${
|
|
366
|
+
const title = `${renderLabel(layer, this)} ${expandedLayers.includes(layer) ? titles.subLayerHide : titles.subLayerShow}`;
|
|
333
367
|
return /* @__PURE__ */ React.createElement(
|
|
334
368
|
"div",
|
|
335
369
|
{
|
|
@@ -350,10 +384,10 @@ class LayerTree extends Component {
|
|
|
350
384
|
renderTree() {
|
|
351
385
|
const { isItemHidden } = this.props;
|
|
352
386
|
const { rootLayer } = this.state;
|
|
353
|
-
if (!rootLayer
|
|
387
|
+
if (!LayerTree.getChildren(rootLayer).length) {
|
|
354
388
|
return null;
|
|
355
389
|
}
|
|
356
|
-
return /* @__PURE__ */ React.createElement(React.Fragment, null, rootLayer.
|
|
390
|
+
return /* @__PURE__ */ React.createElement(React.Fragment, null, LayerTree.getChildren(rootLayer).filter((l) => {
|
|
357
391
|
return !isItemHidden(l);
|
|
358
392
|
}).reverse().map((l) => {
|
|
359
393
|
return this.renderItem(l, 0);
|
|
@@ -361,7 +395,7 @@ class LayerTree extends Component {
|
|
|
361
395
|
}
|
|
362
396
|
updateLayers() {
|
|
363
397
|
const { expandChildren, layers } = this.props;
|
|
364
|
-
let rootLayer = new Layer();
|
|
398
|
+
let rootLayer = new Layer({});
|
|
365
399
|
if (Array.isArray(layers)) {
|
|
366
400
|
if (layers.length === 1) {
|
|
367
401
|
[rootLayer] = layers;
|
|
@@ -370,17 +404,59 @@ class LayerTree extends Component {
|
|
|
370
404
|
} else {
|
|
371
405
|
rootLayer = layers;
|
|
372
406
|
}
|
|
373
|
-
getLayersAsFlatArray(rootLayer)
|
|
407
|
+
const flat = getLayersAsFlatArray(rootLayer);
|
|
408
|
+
flat.forEach((layer) => {
|
|
374
409
|
this.olKeys.push(
|
|
375
410
|
layer.on("propertychange", () => {
|
|
376
411
|
const { revision } = this.state;
|
|
377
412
|
this.setState({ revision: revision + 1 });
|
|
413
|
+
}),
|
|
414
|
+
// Manage group visibility
|
|
415
|
+
layer.on("change:visible", (evt) => {
|
|
416
|
+
const { target } = evt;
|
|
417
|
+
if (target.getVisible() && target.get("group")) {
|
|
418
|
+
flat.forEach((l) => {
|
|
419
|
+
if (l.get("group") === target.get("group") && l !== target) {
|
|
420
|
+
l.setVisible(false);
|
|
421
|
+
}
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
}),
|
|
425
|
+
// Manage parent/children visibility
|
|
426
|
+
layer.on("change:visible", (evt) => {
|
|
427
|
+
const { target } = evt;
|
|
428
|
+
const parent = target.get("parent");
|
|
429
|
+
const children = LayerTree.getChildren(target);
|
|
430
|
+
if (target.getVisible()) {
|
|
431
|
+
if (parent) {
|
|
432
|
+
parent.setVisible(true);
|
|
433
|
+
}
|
|
434
|
+
if (children && !children.some((child) => child.getVisible())) {
|
|
435
|
+
children.forEach((child) => {
|
|
436
|
+
child.setVisible(true);
|
|
437
|
+
});
|
|
438
|
+
}
|
|
439
|
+
} else {
|
|
440
|
+
children.forEach((child) => {
|
|
441
|
+
child.setVisible(false);
|
|
442
|
+
});
|
|
443
|
+
if (parent?.getVisible() && !parent?.get("children").find((child) => child.getVisible())) {
|
|
444
|
+
parent.setVisible(false);
|
|
445
|
+
}
|
|
446
|
+
}
|
|
378
447
|
})
|
|
379
448
|
);
|
|
380
449
|
});
|
|
450
|
+
flat.forEach((layer) => {
|
|
451
|
+
const children = LayerTree.getChildren(layer);
|
|
452
|
+
children.forEach((child) => {
|
|
453
|
+
child.set("parent", layer);
|
|
454
|
+
});
|
|
455
|
+
});
|
|
381
456
|
const state = { rootLayer };
|
|
382
457
|
if (typeof expandChildren === "function" ? expandChildren(layers) : expandChildren) {
|
|
383
|
-
|
|
458
|
+
const children = LayerTree.getChildren(rootLayer);
|
|
459
|
+
state.expandedLayers = children.flatMap((l) => {
|
|
384
460
|
return this.expandLayer(l);
|
|
385
461
|
});
|
|
386
462
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/components/LayerTree/LayerTree.js"],
|
|
4
|
-
"sourcesContent": ["import { getLayersAsFlatArray, Layer } from \"mobility-toolbox-js/ol\";\nimport { unByKey } from \"ol/Observable\";\nimport PropTypes from \"prop-types\";\nimport React, { Component } from \"react\";\n\nconst propTypes = {\n /**\n * CSS class to apply on the container.\n */\n className: PropTypes.string,\n\n /**\n * Boolean determining whether children collapse/expand when their parent is toggled\n * @param {...(boolean|function)} expandChildren Boolean or function returning a boolean.\n * @return {boolean} True or false\n */\n expandChildren: PropTypes.oneOfType([PropTypes.bool, PropTypes.func]),\n\n /**\n * Determine the className used by the div containing the parent and its children.\n */\n getParentClassName: PropTypes.func,\n\n /**\n * Determine if the item is hidden in the tree or not.\n *\n * @param {object} item The item to hide or not.\n *\n * @return {bool} true if the item is not displayed in the tree\n */\n isItemHidden: PropTypes.func,\n\n /**\n * Layers provider.\n */\n layers: PropTypes.arrayOf(PropTypes.instanceOf(Layer)),\n\n /**\n * Padding left to apply on each level.\n */\n padding: PropTypes.number,\n\n /**\n * Custom function to render custom content after the list of children of an item.\n *\n * @param {object} item The item to render.\n *\n * @return {node} A jsx node.\n */\n renderAfterItem: PropTypes.func,\n\n /**\n * Custom function to render custom content before the list of children of an item.\n *\n * @param {object} item The item to render.\n *\n * @return {node} A jsx node.\n */\n renderBeforeItem: PropTypes.func,\n\n /**\n * Custom function to render the checkbox.\n */\n renderCheckbox: PropTypes.func,\n\n /**\n * Custom function to render an item in the tree.\n *\n * @param {object} item The item to render.\n *\n * @return {node} A jsx node.\n */\n renderItem: PropTypes.func,\n\n /**\n * Custom function to render only the content of an item in the tree.\n * inputProps und toggleProps can be used when calling the default renderItemContent function\n * (comp.renderItemContent(layer, inputProps, toggleProps)) to overwrite the default input and label props\n *\n * @param {Layer} layer The layer the item content is created for\n * @param {LayerTree} comp The LayerTree component.\n *\n * @return {node} A jsx node.\n */\n renderItemContent: PropTypes.func,\n\n /**\n * Custom function to render the label.\n *\n * @param {string} item The label to render.\n * @param {LayerTree} comp The LayerTree component.\n *\n * @return {node} A jsx node.\n */\n renderLabel: PropTypes.func,\n\n /**\n * Translation function.\n * @param {function} Translation function returning the translated string.\n */\n t: PropTypes.func,\n\n /**\n * Object holding title for the layer tree's buttons.\n */\n titles: PropTypes.shape({\n /**\n * aria-label on checkbox to hide layer.\n */\n layerHide: PropTypes.string,\n /**\n * aria-label on checkbox to show layer.\n */\n layerShow: PropTypes.string,\n /**\n * title on button to show sublayers.\n */\n subLayerHide: PropTypes.string,\n /**\n * title on button to show sublayers.\n */\n subLayerShow: PropTypes.string,\n }),\n};\n\nconst defaultProps = {\n className: \"rs-layer-tree\",\n expandChildren: false,\n getParentClassName: () => {\n return undefined;\n },\n isItemHidden: () => {\n return false;\n },\n layers: [],\n padding: 30,\n renderAfterItem: null,\n renderBeforeItem: null,\n renderCheckbox: null,\n renderItem: null,\n renderItemContent: null,\n renderLabel: (layer, layerComp) => {\n const { t } = layerComp.props;\n return t(layer.name);\n },\n t: (s) => {\n return s;\n },\n titles: {\n layerHide: \"Hide layer\",\n layerShow: \"Show layer\",\n subLayerHide: \"Hide sublayer\",\n subLayerShow: \"Show sublayer\",\n },\n};\n\n/**\n * The LayerTree component renders an interface for toggling\n * [mobility-toolbox-js layers](https://mobility-toolbox-js.geops.io/api/identifiers%20html#ol-layers)\n * and their corresponding child layers.\n */\n\nclass LayerTree extends Component {\n constructor(props) {\n super(props);\n\n const { isItemHidden, layers } = this.props;\n const initialExpandedLayers = layers\n ? this.getExpandedLayers(\n layers.filter((l) => {\n return (\n !isItemHidden(l) &&\n (l.children || [])\n .filter((child) => {\n return child.visible;\n })\n .filter((c) => {\n return !isItemHidden(c);\n }).length\n );\n }),\n )\n : [];\n\n this.state = {\n expandedLayers: initialExpandedLayers,\n revision: 0,\n rootLayer: new Layer(),\n };\n // this.updateLayers = this.updateLayers.bind(this);\n this.olKeys = [];\n }\n\n componentDidMount() {\n this.updateLayers();\n }\n\n componentDidUpdate(prevProps) {\n const { layers } = this.props;\n\n if (layers !== prevProps.layers) {\n this.updateLayers();\n }\n }\n\n componentWillUnmount() {\n unByKey(this.olKeys);\n this.olKeys = [];\n }\n\n expandLayer(layer, expLayers = []) {\n const { isItemHidden } = this.props;\n if (layer.visible && !isItemHidden(layer)) {\n const children = layer.children\n .filter((c) => {\n return !isItemHidden(c) && !c.get(\"isAlwaysExpanded\");\n })\n .flatMap((c) => {\n return this.expandLayer(c, expLayers);\n });\n return [...expLayers, ...children, layer];\n }\n return expLayers;\n }\n\n /**\n * Get the always expanded ancestors (isAlwaysExpanded=true) of the given layers\n * together with the (given) initially expanded layers\n *\n * @param {Layer} layers Initially expanded layers\n * @return {Array.<Layer>} Initially expanded layers and all its always expanded ancestors\n */\n getExpandedLayers(layers) {\n const { isItemHidden } = this.props;\n const children = layers.flatMap((l) => {\n return l.children.filter((c) => {\n return !isItemHidden(c) && c.get(\"isAlwaysExpanded\");\n });\n });\n\n if (!children.length) {\n return layers;\n }\n return [...layers, this.getExpandedLayers(children)].flat();\n }\n\n onInputClick(layer, toggle = false) {\n if (toggle) {\n this.onToggle(layer);\n } else if (layer.setVisible) {\n layer.setVisible(!layer.visible);\n } else {\n // eslint-disable-next-line no-param-reassign\n layer.visible = !layer.visible;\n }\n }\n\n onToggle(layer) {\n const { expandedLayers } = this.state;\n const pos = expandedLayers.indexOf(layer);\n if (pos > -1) {\n expandedLayers.splice(pos, 1);\n } else {\n expandedLayers.push(...this.getExpandedLayers([layer]));\n }\n this.setState({ expandedLayers });\n }\n\n render() {\n const { className } = this.props;\n return <div className={className}>{this.renderTree()}</div>;\n }\n\n renderArrow(layer) {\n const { isItemHidden } = this.props;\n const { expandedLayers } = this.state;\n\n if (\n !(layer.children || []).filter((c) => {\n return !isItemHidden(c);\n }).length ||\n layer.get(\"isAlwaysExpanded\")\n ) {\n return null;\n }\n\n return (\n <div\n className={`rs-layer-tree-arrow rs-layer-tree-arrow-${\n !expandedLayers.includes(layer) ? \"collapsed\" : \"expanded\"\n }`}\n />\n );\n }\n\n renderInput(layer, inputProps) {\n const { isItemHidden, renderCheckbox, titles } = this.props;\n let tabIndex = 0;\n\n if (\n !(layer.children || []).filter((c) => {\n return !isItemHidden(c);\n }).length\n ) {\n // We forbid focus on keypress event for first level layers and layers without children.\n tabIndex = -1;\n }\n\n const inputType = layer.get(\"group\") ? \"radio\" : \"checkbox\";\n return renderCheckbox ? (\n renderCheckbox(layer, this, inputProps)\n ) : (\n // eslint-disable-next-line jsx-a11y/label-has-associated-control,jsx-a11y/no-noninteractive-element-interactions\n <label\n aria-label={layer.visible ? titles.layerHide : titles.layerShow}\n className={`rs-layer-tree-input rs-layer-tree-input-${inputType} rs-${inputType}`}\n onKeyPress={(e) => {\n if (e.which === 13) {\n this.onInputClick(layer);\n }\n }}\n tabIndex={tabIndex}\n title={layer.visible ? titles.layerHide : titles.layerShow}\n >\n <input\n checked={layer.visible}\n onClick={() => {\n return this.onInputClick(layer);\n }}\n readOnly\n tabIndex={-1}\n type={inputType}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...inputProps}\n />\n <span />\n </label>\n );\n }\n\n // Render a button which expands/collapse the layer if there is children\n renderItem(layer, level) {\n const { isItemHidden } = this.props;\n const { expandedLayers } = this.state;\n const {\n getParentClassName,\n padding,\n renderAfterItem,\n renderBeforeItem,\n renderItem,\n renderItemContent,\n } = this.props;\n\n const children = expandedLayers.includes(layer)\n ? [\n ...(layer.children || []).filter((c) => {\n return !isItemHidden(c);\n }),\n ]\n : [];\n\n if (renderItem) {\n return renderItem(layer, this.onInputClick, this.onToggle);\n }\n\n return (\n <div className={getParentClassName()} key={layer.key}>\n <div\n className={`rs-layer-tree-item ${layer.visible ? \"rs-visible\" : \"\"}`}\n style={{\n paddingLeft: `${padding * level}px`,\n }}\n >\n {renderItemContent\n ? renderItemContent(layer, this)\n : this.renderItemContent(layer)}\n </div>\n {renderBeforeItem && renderBeforeItem(layer, level, this)}\n {[...children].reverse().map((child) => {\n return this.renderItem(child, level + 1);\n })}\n {renderAfterItem && renderAfterItem(layer, level, this)}\n </div>\n );\n }\n\n renderItemContent(layer, inputProps = {}, toggleProps = {}) {\n return (\n <>\n {this.renderInput(layer, inputProps)}\n {this.renderToggleButton(layer, toggleProps)}\n </>\n );\n }\n\n // or simulate a click on the input otherwise.\n renderToggleButton(layer, toggleProps) {\n const { isItemHidden, renderLabel, t, titles } = this.props;\n const { expandedLayers } = this.state;\n\n const onInputClick = () => {\n this.onInputClick(\n layer,\n (layer.children || []).filter((c) => {\n return !isItemHidden(c);\n }).length && !layer.get(\"isAlwaysExpanded\"),\n );\n };\n const title = `${t(layer.name)} ${\n expandedLayers.includes(layer) ? titles.subLayerHide : titles.subLayerShow\n }`;\n\n return (\n <div\n aria-expanded={expandedLayers.includes(layer)}\n aria-label={title}\n className=\"rs-layer-tree-toggle\"\n onClick={onInputClick}\n onKeyPress={onInputClick}\n role=\"button\"\n tabIndex={0}\n title={title}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...toggleProps}\n >\n <div>{renderLabel(layer, this)}</div>\n {this.renderArrow(layer)}\n </div>\n );\n }\n\n renderTree() {\n const { isItemHidden } = this.props;\n const { rootLayer } = this.state;\n\n if (!rootLayer?.children?.length) {\n return null;\n }\n\n return (\n <>\n {rootLayer.children\n .filter((l) => {\n return !isItemHidden(l);\n })\n .reverse()\n .map((l) => {\n return this.renderItem(l, 0);\n })}\n </>\n );\n }\n\n updateLayers() {\n const { expandChildren, layers } = this.props;\n\n // Update the root layer\n let rootLayer = new Layer();\n if (Array.isArray(layers)) {\n if (layers.length === 1) {\n [rootLayer] = layers;\n }\n rootLayer = new Layer({ children: layers });\n } else {\n rootLayer = layers;\n }\n\n getLayersAsFlatArray(rootLayer).forEach((layer) => {\n this.olKeys.push(\n layer.on(\"propertychange\", () => {\n const { revision } = this.state;\n this.setState({ revision: revision + 1 });\n }),\n );\n });\n\n const state = { rootLayer };\n if (\n typeof expandChildren === \"function\"\n ? expandChildren(layers)\n : expandChildren\n ) {\n state.expandedLayers = rootLayer.children.flatMap((l) => {\n return this.expandLayer(l);\n });\n }\n\n this.setState(state);\n }\n}\n\nLayerTree.propTypes = propTypes;\nLayerTree.defaultProps = defaultProps;\n\nexport default LayerTree;\n"],
|
|
5
|
-
"mappings": "AAAA,
|
|
4
|
+
"sourcesContent": ["import Layer from \"ol/layer/Layer\";\nimport { unByKey } from \"ol/Observable\";\nimport { getUid } from \"ol/util\";\nimport PropTypes from \"prop-types\";\nimport React, { Component } from \"react\";\n\nimport getLayersAsFlatArray from \"../../utils/getLayersAsFlatArray\";\n\nconst propTypes = {\n /**\n * CSS class to apply on the container.\n */\n className: PropTypes.string,\n\n /**\n * Boolean determining whether children collapse/expand when their parent is toggled\n * @param {...(boolean|function)} expandChildren Boolean or function returning a boolean.\n * @return {boolean} True or false\n */\n expandChildren: PropTypes.oneOfType([PropTypes.bool, PropTypes.func]),\n\n /**\n * Determine the className used by the div containing the parent and its children.\n */\n getParentClassName: PropTypes.func,\n\n /**\n * Determine if the item is hidden in the tree or not.\n *\n * @param {object} item The item to hide or not.\n *\n * @return {bool} true if the item is not displayed in the tree\n */\n isItemHidden: PropTypes.func,\n\n /**\n * Layers provider.\n */\n layers: PropTypes.arrayOf(PropTypes.instanceOf(Layer)),\n\n /**\n * Padding left to apply on each level.\n */\n padding: PropTypes.number,\n\n /**\n * Custom function to render custom content after the list of children of an item.\n *\n * @param {object} item The item to render.\n *\n * @return {node} A jsx node.\n */\n renderAfterItem: PropTypes.func,\n\n /**\n * Custom function to render custom content before the list of children of an item.\n *\n * @param {object} item The item to render.\n *\n * @return {node} A jsx node.\n */\n renderBeforeItem: PropTypes.func,\n\n /**\n * Custom function to render the checkbox.\n */\n renderCheckbox: PropTypes.func,\n\n /**\n * Custom function to render an item in the tree.\n *\n * @param {object} item The item to render.\n *\n * @return {node} A jsx node.\n */\n renderItem: PropTypes.func,\n\n /**\n * Custom function to render only the content of an item in the tree.\n * inputProps und toggleProps can be used when calling the default renderItemContent function\n * (comp.renderItemContent(layer, inputProps, toggleProps)) to overwrite the default input and label props\n *\n * @param {Layer} layer The layer the item content is created for\n * @param {LayerTree} comp The LayerTree component.\n *\n * @return {node} A jsx node.\n */\n renderItemContent: PropTypes.func,\n\n /**\n * Custom function to render the label.\n *\n * @param {string} item The label to render.\n * @param {LayerTree} comp The LayerTree component.\n *\n * @return {node} A jsx node.\n */\n renderLabel: PropTypes.func,\n\n /**\n * Translation function.\n * @param {function} Translation function returning the translated string.\n */\n t: PropTypes.func,\n\n /**\n * Object holding title for the layer tree's buttons.\n */\n titles: PropTypes.shape({\n /**\n * aria-label on checkbox to hide layer.\n */\n layerHide: PropTypes.string,\n /**\n * aria-label on checkbox to show layer.\n */\n layerShow: PropTypes.string,\n /**\n * title on button to show sublayers.\n */\n subLayerHide: PropTypes.string,\n /**\n * title on button to show sublayers.\n */\n subLayerShow: PropTypes.string,\n }),\n};\n\nconst defaultProps = {\n className: \"rs-layer-tree\",\n expandChildren: false,\n getParentClassName: () => {\n return undefined;\n },\n isItemHidden: () => {\n return false;\n },\n layers: [],\n padding: 30,\n renderAfterItem: null,\n renderBeforeItem: null,\n renderCheckbox: null,\n renderItem: null,\n renderItemContent: null,\n renderLabel: (layer) => {\n return layer?.get(\"name\") || \"\";\n },\n t: (s) => {\n return s;\n },\n titles: {\n layerHide: \"Hide layer\",\n layerShow: \"Show layer\",\n subLayerHide: \"Hide sublayer\",\n subLayerShow: \"Show sublayer\",\n },\n};\n\n/**\n * The LayerTree component renders an interface for toggling layers visibility.\n * and their corresponding child layers.\n */\n\nclass LayerTree extends Component {\n static getChildren = (layer) =>\n layer?.get(\"children\") ||\n layer?.children ||\n // ol.layer.group\n layer?.getLayers?.().getArray() ||\n [];\n\n static getVisible = (layer) =>\n layer.getVisible ? layer.getVisible() : layer.visible;\n\n static listenGroups = (layers) => {\n const flat = getLayersAsFlatArray(layers);\n const keys = flat.map((layer) => {\n return layer.on(\"change:visible\", (e) => {\n const { target } = e;\n if (target.getVisible() && target.get(\"group\")) {\n flat.forEach((l) => {\n if (l.get(\"group\") === target.get(\"group\") && l !== target) {\n l.setVisible(false);\n }\n });\n }\n });\n });\n return keys;\n };\n\n static setVisible = (layer, visible) => {\n if (layer.setVisible) {\n layer.setVisible(visible);\n return;\n }\n // eslint-disable-next-line no-param-reassign\n layer.visible = visible;\n };\n\n constructor(props) {\n super(props);\n\n const { isItemHidden, layers } = this.props;\n const initialExpandedLayers = layers\n ? this.getExpandedLayers(\n layers.filter((l) => {\n return (\n !isItemHidden(l) &&\n LayerTree.getChildren(l)\n .filter((child) => {\n return LayerTree.getVisible(child);\n })\n .filter((c) => {\n return !isItemHidden(c);\n }).length\n );\n }),\n )\n : [];\n\n this.state = {\n expandedLayers: initialExpandedLayers,\n revision: 0,\n rootLayer: new Layer({}),\n };\n // this.updateLayers = this.updateLayers.bind(this);\n this.olKeys = [];\n }\n\n componentDidMount() {\n this.updateLayers();\n }\n\n componentDidUpdate(prevProps) {\n const { layers } = this.props;\n\n if (layers !== prevProps.layers) {\n this.updateLayers();\n }\n }\n\n componentWillUnmount() {\n unByKey(this.olKeys);\n this.olKeys = [];\n }\n\n expandLayer(layer, expLayers = []) {\n const { isItemHidden } = this.props;\n if (LayerTree.getVisible(layer) && !isItemHidden(layer)) {\n const children = LayerTree.getChildren(layer)\n .filter((c) => {\n return !isItemHidden(c) && !c.get(\"isAlwaysExpanded\");\n })\n .flatMap((c) => {\n return this.expandLayer(c, expLayers);\n });\n return [...expLayers, ...children, layer];\n }\n return expLayers;\n }\n\n /**\n * Get the always expanded ancestors (isAlwaysExpanded=true) of the given layers\n * together with the (given) initially expanded layers\n *\n * @param {Layer} layers Initially expanded layers\n * @return {Array.<Layer>} Initially expanded layers and all its always expanded ancestors\n */\n getExpandedLayers(layers) {\n const { isItemHidden } = this.props;\n const children = layers.flatMap((l) => {\n return LayerTree.getChildren(l).filter((c) => {\n return !isItemHidden(c) && c.get(\"isAlwaysExpanded\");\n });\n });\n\n if (!children.length) {\n return layers;\n }\n return [...layers, this.getExpandedLayers(children)].flat();\n }\n\n onInputClick(layer, toggle = false) {\n if (toggle) {\n this.onToggle(layer);\n } else {\n LayerTree.setVisible(layer, !LayerTree.getVisible(layer));\n }\n }\n\n onToggle(layer) {\n const { expandedLayers } = this.state;\n const pos = expandedLayers.indexOf(layer);\n if (pos > -1) {\n expandedLayers.splice(pos, 1);\n } else {\n expandedLayers.push(...this.getExpandedLayers([layer]));\n }\n this.setState({ expandedLayers });\n }\n\n render() {\n const { className } = this.props;\n return <div className={className}>{this.renderTree()}</div>;\n }\n\n renderArrow(layer) {\n const { isItemHidden } = this.props;\n const { expandedLayers } = this.state;\n\n if (\n !LayerTree.getChildren(layer).filter((c) => {\n return !isItemHidden(c);\n }).length ||\n layer.get(\"isAlwaysExpanded\")\n ) {\n return null;\n }\n\n return (\n <div\n className={`rs-layer-tree-arrow rs-layer-tree-arrow-${\n !expandedLayers.includes(layer) ? \"collapsed\" : \"expanded\"\n }`}\n />\n );\n }\n\n renderInput(layer, inputProps) {\n const { isItemHidden, renderCheckbox, titles } = this.props;\n let tabIndex = 0;\n\n if (\n !LayerTree.getChildren(layer).filter((c) => {\n return !isItemHidden(c);\n }).length\n ) {\n // We forbid focus on keypress event for first level layers and layers without children.\n tabIndex = -1;\n }\n\n const inputType = layer.get(\"group\") ? \"radio\" : \"checkbox\";\n return renderCheckbox ? (\n renderCheckbox(layer, this, inputProps)\n ) : (\n // eslint-disable-next-line jsx-a11y/label-has-associated-control,jsx-a11y/no-noninteractive-element-interactions\n <label\n className={`rs-layer-tree-input rs-layer-tree-input-${inputType} rs-${inputType}`}\n onKeyPress={(e) => {\n if (e.which === 13) {\n this.onInputClick(layer);\n }\n }}\n tabIndex={tabIndex}\n title={\n LayerTree.getVisible(layer) ? titles.layerHide : titles.layerShow\n }\n >\n <input\n checked={LayerTree.getVisible(layer)}\n onClick={() => {\n return this.onInputClick(layer);\n }}\n readOnly\n tabIndex={-1}\n type={inputType}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...inputProps}\n />\n <span />\n </label>\n );\n }\n\n renderItem(layer, level) {\n const { isItemHidden } = this.props;\n const { expandedLayers } = this.state;\n const {\n getParentClassName,\n padding,\n renderAfterItem,\n renderBeforeItem,\n renderItem,\n renderItemContent,\n } = this.props;\n\n const children = expandedLayers.includes(layer)\n ? [\n ...LayerTree.getChildren(layer).filter((c) => {\n return !isItemHidden(c);\n }),\n ]\n : [];\n\n if (renderItem) {\n return renderItem(layer, this.onInputClick, this.onToggle);\n }\n\n return (\n <div\n className={getParentClassName()}\n key={\n layer.key || layer.get(\"key\") || layer.get(\"name\") || getUid(layer)\n }\n >\n <div\n className={`rs-layer-tree-item ${LayerTree.getVisible(layer) ? \"rs-visible\" : \"\"}`}\n style={{\n paddingLeft: `${padding * level}px`,\n }}\n >\n {renderItemContent\n ? renderItemContent(layer, this)\n : this.renderItemContent(layer)}\n </div>\n {renderBeforeItem && renderBeforeItem(layer, level, this)}\n {[...children].reverse().map((child) => {\n return this.renderItem(child, level + 1);\n })}\n {renderAfterItem && renderAfterItem(layer, level, this)}\n </div>\n );\n }\n\n renderItemContent(layer, inputProps = {}, toggleProps = {}) {\n return (\n <>\n {this.renderInput(layer, inputProps)}\n {this.renderToggleButton(layer, toggleProps)}\n </>\n );\n }\n\n // Render a button which expands/collapse the layer if there is children\n // or simulate a click on the input otherwise.\n renderToggleButton(layer, toggleProps) {\n const { isItemHidden, renderLabel, titles } = this.props;\n const { expandedLayers } = this.state;\n\n const onInputClick = () => {\n this.onInputClick(\n layer,\n LayerTree.getChildren(layer).filter((c) => {\n return !isItemHidden(c);\n }).length && !layer.get(\"isAlwaysExpanded\"),\n );\n };\n const title = `${renderLabel(layer, this)} ${\n expandedLayers.includes(layer) ? titles.subLayerHide : titles.subLayerShow\n }`;\n\n return (\n <div\n aria-expanded={expandedLayers.includes(layer)}\n aria-label={title}\n className=\"rs-layer-tree-toggle\"\n onClick={onInputClick}\n onKeyPress={onInputClick}\n role=\"button\"\n tabIndex={0}\n title={title}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...toggleProps}\n >\n <div>{renderLabel(layer, this)}</div>\n {this.renderArrow(layer)}\n </div>\n );\n }\n\n renderTree() {\n const { isItemHidden } = this.props;\n const { rootLayer } = this.state;\n\n if (!LayerTree.getChildren(rootLayer).length) {\n return null;\n }\n\n return (\n <>\n {LayerTree.getChildren(rootLayer)\n .filter((l) => {\n return !isItemHidden(l);\n })\n .reverse()\n .map((l) => {\n return this.renderItem(l, 0);\n })}\n </>\n );\n }\n\n updateLayers() {\n const { expandChildren, layers } = this.props;\n\n // Update the root layer\n let rootLayer = new Layer({});\n if (Array.isArray(layers)) {\n if (layers.length === 1) {\n [rootLayer] = layers;\n }\n rootLayer = new Layer({ children: layers });\n } else {\n rootLayer = layers;\n }\n\n const flat = getLayersAsFlatArray(rootLayer);\n flat.forEach((layer) => {\n this.olKeys.push(\n layer.on(\"propertychange\", () => {\n const { revision } = this.state;\n this.setState({ revision: revision + 1 });\n }),\n\n // Manage group visibility\n layer.on(\"change:visible\", (evt) => {\n const { target } = evt;\n if (target.getVisible() && target.get(\"group\")) {\n flat.forEach((l) => {\n if (l.get(\"group\") === target.get(\"group\") && l !== target) {\n l.setVisible(false);\n }\n });\n }\n }),\n\n // Manage parent/children visibility\n layer.on(\"change:visible\", (evt) => {\n const { target } = evt;\n const parent = target.get(\"parent\");\n const children = LayerTree.getChildren(target);\n\n if (target.getVisible()) {\n // We make the parent visible\n if (parent) {\n parent.setVisible(true);\n }\n\n // If children doesn't contain any visible layers, we display all children.\n if (children && !children.some((child) => child.getVisible())) {\n children.forEach((child) => {\n child.setVisible(true);\n });\n }\n } else {\n // We hide all the children\n children.forEach((child) => {\n child.setVisible(false);\n });\n\n // If the parent has no more visible child we also hide it.\n if (\n parent?.getVisible() &&\n !parent?.get(\"children\").find((child) => child.getVisible())\n ) {\n parent.setVisible(false);\n }\n }\n }),\n );\n });\n\n // Set parent property.\n flat.forEach((layer) => {\n const children = LayerTree.getChildren(layer);\n children.forEach((child) => {\n child.set(\"parent\", layer);\n });\n });\n\n const state = { rootLayer };\n if (\n typeof expandChildren === \"function\"\n ? expandChildren(layers)\n : expandChildren\n ) {\n const children = LayerTree.getChildren(rootLayer);\n state.expandedLayers = children.flatMap((l) => {\n return this.expandLayer(l);\n });\n }\n\n this.setState(state);\n }\n}\n\nLayerTree.propTypes = propTypes;\nLayerTree.defaultProps = defaultProps;\n\nexport default LayerTree;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
@use "../../themes/default/variables";
|
|
2
|
+
|
|
1
3
|
.rs-layer-tree {
|
|
2
4
|
width: 100%;
|
|
3
5
|
overflow-y: auto;
|
|
@@ -111,7 +113,7 @@
|
|
|
111
113
|
top: 1px;
|
|
112
114
|
width: 5px;
|
|
113
115
|
height: 10px;
|
|
114
|
-
border: solid
|
|
116
|
+
border: solid variables.$brand-primary;
|
|
115
117
|
border-width: 0 1px 1px 0;
|
|
116
118
|
transform: rotate(45deg);
|
|
117
119
|
}
|
|
@@ -123,7 +125,7 @@
|
|
|
123
125
|
width: 12px;
|
|
124
126
|
height: 12px;
|
|
125
127
|
border-radius: 50%;
|
|
126
|
-
background:
|
|
128
|
+
background: variables.$brand-primary;
|
|
127
129
|
}
|
|
128
130
|
|
|
129
131
|
label input:checked ~ span::after {
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import
|
|
1
|
+
import Layer from "ol/layer/Layer";
|
|
2
2
|
import OLMap from "ol/Map";
|
|
3
3
|
import { unByKey } from "ol/Observable";
|
|
4
4
|
import PropTypes from "prop-types";
|
|
5
5
|
import { PureComponent } from "react";
|
|
6
|
+
import getLayersAsFlatArray from "../../utils/getLayersAsFlatArray";
|
|
6
7
|
const propTypes = {
|
|
7
8
|
/**
|
|
8
9
|
* Maximum number of decimals allowed for coordinates.
|
|
@@ -83,14 +84,14 @@ class Permalink extends PureComponent {
|
|
|
83
84
|
if (urlParams.get("layers")) {
|
|
84
85
|
const visibleLayers = urlParams.get("layers").split(",");
|
|
85
86
|
getLayersAsFlatArray(layers).forEach((l) => {
|
|
86
|
-
if (visibleLayers.includes(l.key)) {
|
|
87
|
+
if (visibleLayers.includes(l.key || l.get("key"))) {
|
|
87
88
|
if (l.setVisible) {
|
|
88
89
|
l.setVisible(true);
|
|
89
90
|
} else {
|
|
90
91
|
l.visible = true;
|
|
91
92
|
}
|
|
92
|
-
} else if (!isBaseLayer(l) && !isLayerHidden(l) && !l.children.some((ll) => {
|
|
93
|
-
return ll.visible;
|
|
93
|
+
} else if (!isBaseLayer(l) && !isLayerHidden(l) && !(l.children || l.get("children")).some((ll) => {
|
|
94
|
+
return ll.getVisible ? ll.getVisible() : ll.visible;
|
|
94
95
|
})) {
|
|
95
96
|
if (l.setVisible) {
|
|
96
97
|
l.setVisible(false);
|
|
@@ -105,7 +106,8 @@ class Permalink extends PureComponent {
|
|
|
105
106
|
)[0];
|
|
106
107
|
if (visibleBaseLayer) {
|
|
107
108
|
getLayersAsFlatArray(layers).filter(isBaseLayer).forEach((baseLayer) => {
|
|
108
|
-
const
|
|
109
|
+
const key = baseLayer.key || baseLayer.get("key");
|
|
110
|
+
const visible = key === visibleBaseLayer;
|
|
109
111
|
if (baseLayer.setVisible) {
|
|
110
112
|
baseLayer.setVisible(visible);
|
|
111
113
|
} else {
|
|
@@ -203,37 +205,40 @@ class Permalink extends PureComponent {
|
|
|
203
205
|
let layersParam;
|
|
204
206
|
if (layers.length) {
|
|
205
207
|
layersParam = getLayersAsFlatArray(layers).filter((l) => {
|
|
206
|
-
const children = l.children || [];
|
|
208
|
+
const children = l.get("children") || l.children || [];
|
|
207
209
|
const allChildrenHidden = children.every((child) => {
|
|
208
210
|
return isLayerHidden(child);
|
|
209
211
|
});
|
|
210
212
|
const hasVisibleChildren = children.some((child) => {
|
|
211
|
-
return child.visible;
|
|
213
|
+
return child.getVisible ? child.getVisible() : child.visible;
|
|
212
214
|
});
|
|
213
|
-
|
|
215
|
+
const isVisible = l.getVisible ? l.getVisible() : l.visible;
|
|
216
|
+
return !isBaseLayer(l) && !isLayerHidden(l) && isVisible && (!hasVisibleChildren || allChildrenHidden);
|
|
214
217
|
}).map((l) => {
|
|
215
|
-
return l.key;
|
|
218
|
+
return l.key || l.get("key");
|
|
216
219
|
}).join();
|
|
217
220
|
}
|
|
218
221
|
let baseLayersParam;
|
|
219
222
|
const baseLayers = getLayersAsFlatArray(layers).filter(isBaseLayer);
|
|
220
223
|
if (baseLayers.length) {
|
|
221
224
|
const visibleBaseLayers = (baseLayers.filter((l) => {
|
|
222
|
-
return l.visible;
|
|
225
|
+
return l.getVisible ? l.getVisible() : l.visible;
|
|
223
226
|
}) || []).reverse();
|
|
224
227
|
const nonVisibleBaseLayers = baseLayers.filter((l) => {
|
|
225
|
-
return !l.visible;
|
|
228
|
+
return !(l.getVisible ? l.getVisible() : l.visible);
|
|
226
229
|
}) || [];
|
|
227
230
|
baseLayersParam = [...visibleBaseLayers, ...nonVisibleBaseLayers].sort((a, b) => {
|
|
228
|
-
|
|
231
|
+
const aVisible = a.getVisible ? a.getVisible() : a.visible;
|
|
232
|
+
const bVisible = b.getVisible ? b.getVisible() : b.visible;
|
|
233
|
+
if (aVisible === bVisible) {
|
|
229
234
|
return 0;
|
|
230
235
|
}
|
|
231
|
-
if (
|
|
236
|
+
if (aVisible && !bVisible) {
|
|
232
237
|
return -1;
|
|
233
238
|
}
|
|
234
239
|
return 1;
|
|
235
240
|
}).map((l) => {
|
|
236
|
-
return l.key;
|
|
241
|
+
return l.key || l.get("key");
|
|
237
242
|
}).join();
|
|
238
243
|
}
|
|
239
244
|
this.setState({
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/components/Permalink/Permalink.js"],
|
|
4
|
-
"sourcesContent": ["import
|
|
5
|
-
"mappings": "AAAA,
|
|
4
|
+
"sourcesContent": ["import Layer from \"ol/layer/Layer\";\nimport OLMap from \"ol/Map\";\nimport { unByKey } from \"ol/Observable\";\nimport PropTypes from \"prop-types\";\nimport { PureComponent } from \"react\";\n\nimport getLayersAsFlatArray from \"../../utils/getLayersAsFlatArray\";\n\nconst propTypes = {\n /**\n * Maximum number of decimals allowed for coordinates.\n */\n coordinateDecimals: PropTypes.number,\n\n /**\n * Either 'react-router' history object:\n * https://github.com/ReactTraining/react-router/blob/master/packages/react-router/docs/api/history.md<br>\n * or default fallback as HTML5 History:\n * https://developer.mozilla.org/en-US/docs/Web/API/History\n */\n history: PropTypes.shape({\n replace: PropTypes.func,\n }),\n\n /**\n * Determine if the layer appears in the baselayers permalink parameter or not.\n *\n * @param {object} item The item to hide or not.\n *\n * @return {bool} true if the item is not displayed in the baselayers permalink parameter\n */\n isBaseLayer: PropTypes.func,\n\n /**\n * Determine if the layer is hidden in the permalink or not.\n *\n * @param {object} item The item to hide or not.\n *\n * @return {bool} true if the item is not displayed in the permalink\n */\n isLayerHidden: PropTypes.func,\n\n /**\n * Layers provider.\n */\n layers: PropTypes.arrayOf(PropTypes.instanceOf(Layer)),\n\n /**\n * An [ol/map](https://openlayers.org/en/latest/apidoc/module-ol_Map-Map.html).\n */\n map: PropTypes.instanceOf(OLMap),\n\n /**\n * Params to be written in url.\n */\n params: PropTypes.object,\n\n /**\n * Custom function to be called when the permalink is updated.\n * This property has priority over the history parameter and window.history.replaceState calls.\n */\n replace: PropTypes.func,\n};\n\nconst defaultProps = {\n coordinateDecimals: 2,\n history: null,\n isBaseLayer: (layer) => {\n return layer.get(\"isBaseLayer\");\n },\n isLayerHidden: () => {\n return false;\n },\n layers: [],\n map: null,\n params: {},\n replace: null,\n};\n\n/**\n * This component handles permalink logic. Injecting an\n * __[ol/map](https://openlayers.org/en/latest/apidoc/module-ol_Map-Map.html)__\n * will add the *map center* (x, y) and the *zoom* (z) parameters to the permalink.\n * Injecting layers will add the *baselayers* and/or *layers* parameters. Further parameters can\n * be added using __params__.\n */\nclass Permalink extends PureComponent {\n constructor(props) {\n super(props);\n this.state = { revision: 0 };\n this.onPropertyChangeKeys = [];\n }\n\n componentDidMount() {\n const { isBaseLayer, isLayerHidden, layers, map } = this.props;\n if (map) {\n this.moveEndRef = map.on(\"moveend\", () => {\n this.onMapMoved();\n });\n }\n\n if (layers) {\n // set layer visibility based on 'layers' parameter.\n const urlParams = new URLSearchParams(window.location.search);\n\n if (urlParams.get(\"layers\")) {\n const visibleLayers = urlParams.get(\"layers\").split(\",\");\n getLayersAsFlatArray(layers).forEach((l) => {\n if (visibleLayers.includes(l.key || l.get(\"key\"))) {\n if (l.setVisible) {\n l.setVisible(true);\n } else {\n // eslint-disable-next-line no-param-reassign\n l.visible = true;\n }\n } else if (\n !isBaseLayer(l) &&\n !isLayerHidden(l) &&\n !(l.children || l.get(\"children\")).some((ll) => {\n return ll.getVisible ? ll.getVisible() : ll.visible;\n })\n ) {\n if (l.setVisible) {\n l.setVisible(false);\n } else {\n // eslint-disable-next-line no-param-reassign\n l.visible = false;\n }\n }\n });\n }\n\n // Set baser layer visibility based on 'baseLayers' parameter.\n // Show the first of the list then hide the others\n const visibleBaseLayer = (urlParams.get(\"baselayers\") || \"\").split(\n \",\",\n )[0];\n if (visibleBaseLayer) {\n getLayersAsFlatArray(layers)\n .filter(isBaseLayer)\n .forEach((baseLayer) => {\n const key = baseLayer.key || baseLayer.get(\"key\");\n const visible = key === visibleBaseLayer;\n if (baseLayer.setVisible) {\n baseLayer.setVisible(visible);\n } else {\n // eslint-disable-next-line no-param-reassign\n baseLayer.visible = visible;\n }\n });\n }\n this.updateLayers();\n }\n }\n\n componentDidUpdate(prevProps, prevState) {\n const { layers, map } = this.props;\n const { revision } = this.state;\n\n if (layers !== prevProps.layers || revision !== prevState.revision) {\n this.updateLayers();\n }\n\n if (map !== prevProps.map) {\n unByKey(this.moveEndRef);\n this.moveEndRef = map.on(\"moveend\", () => {\n return this.onMapMoved();\n });\n }\n\n this.updateHistory();\n }\n\n componentWillUnmount() {\n const { map } = this.props;\n\n if (map) {\n unByKey(this.moveEndRef);\n }\n unByKey(this.onPropertyChangeKeys);\n this.onPropertyChangeKeys = [];\n }\n\n onMapMoved() {\n const { map } = this.props;\n const mapView = map.getView();\n const center = mapView.getCenter();\n const params = {};\n\n if (\n center !== undefined &&\n center[0] !== undefined &&\n center[1] !== undefined\n ) {\n params.x = this.roundCoord(center[0]);\n params.y = this.roundCoord(center[1]);\n }\n\n this.setState({\n ...params,\n // rounds zoom to two digits max.\n z: +`${Math.round(`${parseFloat(mapView.getZoom())}e+2`)}e-2`,\n });\n }\n\n render() {\n return null;\n }\n\n roundCoord(val) {\n const { coordinateDecimals } = this.props;\n return parseFloat(val.toFixed(coordinateDecimals));\n }\n\n updateHistory() {\n const { history, params, replace } = this.props;\n const oldParams = new URLSearchParams(window.location.search);\n const parameters = {\n ...Object.fromEntries(oldParams.entries()),\n ...this.state,\n ...params,\n };\n\n delete parameters.revision;\n\n // Remove parameters that are undefined or null\n Object.entries(parameters).forEach(([key, value]) => {\n if (value === undefined || value === null) {\n delete parameters[key];\n }\n });\n\n // We don't encode the , to leave the permalink lisible\n const qStr = new URLSearchParams(parameters)\n .toString()\n .replace(/%2C/g, \",\");\n const search = qStr ? `?${qStr}` : \"\";\n\n if (\n (!qStr && window.location.search) ||\n (qStr && search !== window.location.search)\n ) {\n if (replace) {\n replace({ parameters, search });\n } else if (history) {\n history.replace({ search });\n } else {\n const { hash } = window.location;\n window.history.replaceState(\n undefined,\n undefined,\n `${search}${hash || \"\"}`,\n );\n }\n }\n }\n\n updateLayers() {\n const { isBaseLayer, isLayerHidden, layers } = this.props;\n const { revision } = this.state;\n\n unByKey(this.onPropertyChangeKeys);\n this.onPropertyChangeKeys = getLayersAsFlatArray(layers).map((layer) => {\n return layer.on(\"change:visible\", () => {\n this.setState({ revision: revision + 1 });\n });\n });\n\n // layers param\n let layersParam;\n if (layers.length) {\n layersParam = getLayersAsFlatArray(layers)\n .filter((l) => {\n const children = l.get(\"children\") || l.children || [];\n const allChildrenHidden = children.every((child) => {\n return isLayerHidden(child);\n });\n const hasVisibleChildren = children.some((child) => {\n return child.getVisible ? child.getVisible() : child.visible;\n });\n const isVisible = l.getVisible ? l.getVisible() : l.visible;\n return (\n !isBaseLayer(l) &&\n !isLayerHidden(l) &&\n isVisible &&\n (!hasVisibleChildren || allChildrenHidden)\n );\n })\n .map((l) => {\n return l.key || l.get(\"key\");\n })\n .join();\n }\n\n // baselayers param\n let baseLayersParam;\n const baseLayers = getLayersAsFlatArray(layers).filter(isBaseLayer);\n if (baseLayers.length) {\n // First baselayers in order of visibility, top layer is first\n const visibleBaseLayers = (\n baseLayers.filter((l) => {\n return l.getVisible ? l.getVisible() : l.visible;\n }) || []\n ).reverse();\n const nonVisibleBaseLayers =\n baseLayers.filter((l) => {\n return !(l.getVisible ? l.getVisible() : l.visible);\n }) || [];\n baseLayersParam = [...visibleBaseLayers, ...nonVisibleBaseLayers]\n .sort((a, b) => {\n const aVisible = a.getVisible ? a.getVisible() : a.visible;\n const bVisible = b.getVisible ? b.getVisible() : b.visible;\n if (aVisible === bVisible) {\n return 0;\n }\n if (aVisible && !bVisible) {\n return -1;\n }\n return 1;\n })\n .map((l) => {\n return l.key || l.get(\"key\");\n })\n .join();\n }\n\n // Only add parameters if there is actually some layers added.\n this.setState({\n baselayers: baseLayersParam,\n layers: layersParam,\n });\n }\n}\n\nPermalink.propTypes = propTypes;\nPermalink.defaultProps = defaultProps;\n\nexport default Permalink;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
+
@use "../../themes/default/variables";
|
|
2
|
+
|
|
1
3
|
.rs-popup {
|
|
2
4
|
position: absolute;
|
|
3
5
|
|
|
4
6
|
.rs-popup-container {
|
|
5
7
|
position: absolute;
|
|
6
8
|
background-color: white;
|
|
7
|
-
filter: drop-shadow(
|
|
9
|
+
filter: drop-shadow(variables.$box-shadow);
|
|
8
10
|
bottom: 12px;
|
|
9
11
|
left: -50px;
|
|
10
12
|
min-width: 220px;
|