react-spatial 1.12.0 → 1.12.1
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/components/BaseLayerSwitcher/BaseLayerSwitcher.js +51 -51
- package/components/BaseLayerSwitcher/BaseLayerSwitcher.js.map +2 -2
- package/components/BasicMap/BasicMap.js +80 -80
- package/components/BasicMap/BasicMap.js.map +2 -2
- package/components/CanvasSaveButton/CanvasSaveButton.js +68 -68
- package/components/CanvasSaveButton/CanvasSaveButton.js.map +2 -2
- package/components/Copyright/Copyright.js +12 -12
- package/components/Copyright/Copyright.js.map +2 -2
- package/components/FeatureExportButton/FeatureExportButton.js +5 -5
- package/components/FeatureExportButton/FeatureExportButton.js.map +2 -2
- package/components/FitExtent/FitExtent.js +15 -15
- package/components/FitExtent/FitExtent.js.map +2 -2
- package/components/Geolocation/Geolocation.js +96 -96
- package/components/Geolocation/Geolocation.js.map +2 -2
- package/components/LayerTree/LayerTree.js +172 -172
- package/components/LayerTree/LayerTree.js.map +2 -2
- package/components/MousePosition/MousePosition.js +27 -27
- package/components/MousePosition/MousePosition.js.map +2 -2
- package/components/NorthArrow/NorthArrow.js +13 -13
- package/components/NorthArrow/NorthArrow.js.map +2 -2
- package/components/Overlay/Overlay.js +49 -49
- package/components/Overlay/Overlay.js.map +2 -2
- package/components/Permalink/Permalink.js +70 -70
- package/components/Permalink/Permalink.js.map +2 -2
- package/components/Popup/Popup.js +73 -73
- package/components/Popup/Popup.js.map +2 -2
- package/components/ResizeHandler/ResizeHandler.js +51 -49
- package/components/ResizeHandler/ResizeHandler.js.map +2 -2
- package/components/RouteSchedule/RouteSchedule.js +86 -74
- package/components/RouteSchedule/RouteSchedule.js.map +2 -2
- package/components/RouteSchedule/RouteSchedule.scss +0 -20
- package/components/ScaleLine/ScaleLine.js +2 -2
- package/components/ScaleLine/ScaleLine.js.map +2 -2
- package/components/StopsFinder/StopsFinder.js +21 -21
- package/components/StopsFinder/StopsFinder.js.map +2 -2
- package/components/StopsFinder/StopsFinderOption.js +3 -3
- package/components/StopsFinder/StopsFinderOption.js.map +2 -2
- package/components/Zoom/Zoom.js +35 -35
- package/components/Zoom/Zoom.js.map +2 -2
- package/package.json +33 -29
- package/propTypes.js +10 -10
- package/propTypes.js.map +2 -2
- package/utils/GlobalsForOle.js +57 -57
- package/utils/GlobalsForOle.js.map +2 -2
- package/utils/KML.js +32 -32
- package/utils/KML.js.map +2 -2
- package/utils/Styles.js +7 -7
- package/utils/Styles.js.map +2 -2
- package/utils/timeUtils.js +6 -6
- package/utils/timeUtils.js.map +2 -2
|
@@ -1,20 +1,22 @@
|
|
|
1
|
-
import
|
|
2
|
-
import PropTypes from "prop-types";
|
|
3
|
-
import { Layer, getLayersAsFlatArray } from "mobility-toolbox-js/ol";
|
|
1
|
+
import { getLayersAsFlatArray, Layer } from "mobility-toolbox-js/ol";
|
|
4
2
|
import { unByKey } from "ol/Observable";
|
|
3
|
+
import PropTypes from "prop-types";
|
|
4
|
+
import React, { Component } from "react";
|
|
5
5
|
const propTypes = {
|
|
6
|
-
/**
|
|
7
|
-
* Layers provider.
|
|
8
|
-
*/
|
|
9
|
-
layers: PropTypes.arrayOf(PropTypes.instanceOf(Layer)),
|
|
10
6
|
/**
|
|
11
7
|
* CSS class to apply on the container.
|
|
12
8
|
*/
|
|
13
9
|
className: PropTypes.string,
|
|
14
10
|
/**
|
|
15
|
-
*
|
|
11
|
+
* Boolean determining whether children collapse/expand when their parent is toggled
|
|
12
|
+
* @param {...(boolean|function)} expandChildren Boolean or function returning a boolean.
|
|
13
|
+
* @return {boolean} True or false
|
|
16
14
|
*/
|
|
17
|
-
|
|
15
|
+
expandChildren: PropTypes.oneOfType([PropTypes.bool, PropTypes.func]),
|
|
16
|
+
/**
|
|
17
|
+
* Determine the className used by the div containing the parent and its children.
|
|
18
|
+
*/
|
|
19
|
+
getParentClassName: PropTypes.func,
|
|
18
20
|
/**
|
|
19
21
|
* Determine if the item is hidden in the tree or not.
|
|
20
22
|
*
|
|
@@ -24,44 +26,52 @@ const propTypes = {
|
|
|
24
26
|
*/
|
|
25
27
|
isItemHidden: PropTypes.func,
|
|
26
28
|
/**
|
|
27
|
-
*
|
|
29
|
+
* Layers provider.
|
|
28
30
|
*/
|
|
29
|
-
|
|
31
|
+
layers: PropTypes.arrayOf(PropTypes.instanceOf(Layer)),
|
|
30
32
|
/**
|
|
31
|
-
*
|
|
33
|
+
* Padding left to apply on each level.
|
|
34
|
+
*/
|
|
35
|
+
padding: PropTypes.number,
|
|
36
|
+
/**
|
|
37
|
+
* Custom function to render custom content after the list of children of an item.
|
|
32
38
|
*
|
|
33
39
|
* @param {object} item The item to render.
|
|
34
40
|
*
|
|
35
41
|
* @return {node} A jsx node.
|
|
36
42
|
*/
|
|
37
|
-
|
|
43
|
+
renderAfterItem: PropTypes.func,
|
|
38
44
|
/**
|
|
39
|
-
* Custom function to render
|
|
40
|
-
* inputProps und toggleProps can be used when calling the default renderItemContent function
|
|
41
|
-
* (comp.renderItemContent(layer, inputProps, toggleProps)) to overwrite the default input and label props
|
|
45
|
+
* Custom function to render custom content before the list of children of an item.
|
|
42
46
|
*
|
|
43
|
-
* @param {
|
|
44
|
-
* @param {LayerTree} comp The LayerTree component.
|
|
47
|
+
* @param {object} item The item to render.
|
|
45
48
|
*
|
|
46
49
|
* @return {node} A jsx node.
|
|
47
50
|
*/
|
|
48
|
-
|
|
51
|
+
renderBeforeItem: PropTypes.func,
|
|
49
52
|
/**
|
|
50
|
-
* Custom function to render
|
|
53
|
+
* Custom function to render the checkbox.
|
|
54
|
+
*/
|
|
55
|
+
renderCheckbox: PropTypes.func,
|
|
56
|
+
/**
|
|
57
|
+
* Custom function to render an item in the tree.
|
|
51
58
|
*
|
|
52
59
|
* @param {object} item The item to render.
|
|
53
60
|
*
|
|
54
61
|
* @return {node} A jsx node.
|
|
55
62
|
*/
|
|
56
|
-
|
|
63
|
+
renderItem: PropTypes.func,
|
|
57
64
|
/**
|
|
58
|
-
* Custom function to render
|
|
65
|
+
* Custom function to render only the content of an item in the tree.
|
|
66
|
+
* inputProps und toggleProps can be used when calling the default renderItemContent function
|
|
67
|
+
* (comp.renderItemContent(layer, inputProps, toggleProps)) to overwrite the default input and label props
|
|
59
68
|
*
|
|
60
|
-
* @param {
|
|
69
|
+
* @param {Layer} layer The layer the item content is created for
|
|
70
|
+
* @param {LayerTree} comp The LayerTree component.
|
|
61
71
|
*
|
|
62
72
|
* @return {node} A jsx node.
|
|
63
73
|
*/
|
|
64
|
-
|
|
74
|
+
renderItemContent: PropTypes.func,
|
|
65
75
|
/**
|
|
66
76
|
* Custom function to render the label.
|
|
67
77
|
*
|
|
@@ -72,76 +82,66 @@ const propTypes = {
|
|
|
72
82
|
*/
|
|
73
83
|
renderLabel: PropTypes.func,
|
|
74
84
|
/**
|
|
75
|
-
*
|
|
85
|
+
* Translation function.
|
|
86
|
+
* @param {function} Translation function returning the translated string.
|
|
76
87
|
*/
|
|
77
|
-
|
|
88
|
+
t: PropTypes.func,
|
|
78
89
|
/**
|
|
79
90
|
* Object holding title for the layer tree's buttons.
|
|
80
91
|
*/
|
|
81
92
|
titles: PropTypes.shape({
|
|
82
|
-
/**
|
|
83
|
-
* aria-label on checkbox to show layer.
|
|
84
|
-
*/
|
|
85
|
-
layerShow: PropTypes.string,
|
|
86
93
|
/**
|
|
87
94
|
* aria-label on checkbox to hide layer.
|
|
88
95
|
*/
|
|
89
96
|
layerHide: PropTypes.string,
|
|
97
|
+
/**
|
|
98
|
+
* aria-label on checkbox to show layer.
|
|
99
|
+
*/
|
|
100
|
+
layerShow: PropTypes.string,
|
|
90
101
|
/**
|
|
91
102
|
* title on button to show sublayers.
|
|
92
103
|
*/
|
|
93
|
-
|
|
104
|
+
subLayerHide: PropTypes.string,
|
|
94
105
|
/**
|
|
95
106
|
* title on button to show sublayers.
|
|
96
107
|
*/
|
|
97
|
-
|
|
98
|
-
})
|
|
99
|
-
/**
|
|
100
|
-
* Boolean determining whether children collapse/expand when their parent is toggled
|
|
101
|
-
* @param {...(boolean|function)} expandChildren Boolean or function returning a boolean.
|
|
102
|
-
* @return {boolean} True or false
|
|
103
|
-
*/
|
|
104
|
-
expandChildren: PropTypes.oneOfType([PropTypes.bool, PropTypes.func]),
|
|
105
|
-
/**
|
|
106
|
-
* Translation function.
|
|
107
|
-
* @param {function} Translation function returning the translated string.
|
|
108
|
-
*/
|
|
109
|
-
t: PropTypes.func
|
|
108
|
+
subLayerShow: PropTypes.string
|
|
109
|
+
})
|
|
110
110
|
};
|
|
111
111
|
const defaultProps = {
|
|
112
|
-
layers: [],
|
|
113
112
|
className: "rs-layer-tree",
|
|
114
|
-
|
|
115
|
-
isItemHidden: () => {
|
|
116
|
-
return false;
|
|
117
|
-
},
|
|
113
|
+
expandChildren: false,
|
|
118
114
|
getParentClassName: () => {
|
|
119
115
|
return void 0;
|
|
120
116
|
},
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
117
|
+
isItemHidden: () => {
|
|
118
|
+
return false;
|
|
119
|
+
},
|
|
120
|
+
layers: [],
|
|
121
|
+
padding: 30,
|
|
124
122
|
renderAfterItem: null,
|
|
123
|
+
renderBeforeItem: null,
|
|
125
124
|
renderCheckbox: null,
|
|
125
|
+
renderItem: null,
|
|
126
|
+
renderItemContent: null,
|
|
126
127
|
renderLabel: (layer, layerComp) => {
|
|
127
128
|
const { t } = layerComp.props;
|
|
128
129
|
return t(layer.name);
|
|
129
130
|
},
|
|
130
|
-
titles: {
|
|
131
|
-
layerShow: "Show layer",
|
|
132
|
-
layerHide: "Hide layer",
|
|
133
|
-
subLayerShow: "Show sublayer",
|
|
134
|
-
subLayerHide: "Hide sublayer"
|
|
135
|
-
},
|
|
136
131
|
t: (s) => {
|
|
137
132
|
return s;
|
|
138
133
|
},
|
|
139
|
-
|
|
134
|
+
titles: {
|
|
135
|
+
layerHide: "Hide layer",
|
|
136
|
+
layerShow: "Show layer",
|
|
137
|
+
subLayerHide: "Hide sublayer",
|
|
138
|
+
subLayerShow: "Show sublayer"
|
|
139
|
+
}
|
|
140
140
|
};
|
|
141
141
|
class LayerTree extends Component {
|
|
142
142
|
constructor(props) {
|
|
143
143
|
super(props);
|
|
144
|
-
const {
|
|
144
|
+
const { isItemHidden, layers } = this.props;
|
|
145
145
|
const initialExpandedLayers = layers ? this.getExpandedLayers(
|
|
146
146
|
layers.filter((l) => {
|
|
147
147
|
return !isItemHidden(l) && (l.children || []).filter((child) => {
|
|
@@ -152,9 +152,9 @@ class LayerTree extends Component {
|
|
|
152
152
|
})
|
|
153
153
|
) : [];
|
|
154
154
|
this.state = {
|
|
155
|
-
rootLayer: new Layer(),
|
|
156
155
|
expandedLayers: initialExpandedLayers,
|
|
157
|
-
revision: 0
|
|
156
|
+
revision: 0,
|
|
157
|
+
rootLayer: new Layer()
|
|
158
158
|
};
|
|
159
159
|
this.olKeys = [];
|
|
160
160
|
}
|
|
@@ -171,24 +171,17 @@ class LayerTree extends Component {
|
|
|
171
171
|
unByKey(this.olKeys);
|
|
172
172
|
this.olKeys = [];
|
|
173
173
|
}
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
onToggle(layer) {
|
|
184
|
-
const { expandedLayers } = this.state;
|
|
185
|
-
const pos = expandedLayers.indexOf(layer);
|
|
186
|
-
if (pos > -1) {
|
|
187
|
-
expandedLayers.splice(pos, 1);
|
|
188
|
-
} else {
|
|
189
|
-
expandedLayers.push(...this.getExpandedLayers([layer]));
|
|
174
|
+
expandLayer(layer, expLayers = []) {
|
|
175
|
+
const { isItemHidden } = this.props;
|
|
176
|
+
if (layer.visible && !isItemHidden(layer)) {
|
|
177
|
+
const children = layer.children.filter((c) => {
|
|
178
|
+
return !isItemHidden(c) && !c.get("isAlwaysExpanded");
|
|
179
|
+
}).flatMap((c) => {
|
|
180
|
+
return this.expandLayer(c, expLayers);
|
|
181
|
+
});
|
|
182
|
+
return [...expLayers, ...children, layer];
|
|
190
183
|
}
|
|
191
|
-
|
|
184
|
+
return expLayers;
|
|
192
185
|
}
|
|
193
186
|
/**
|
|
194
187
|
* Get the always expanded ancestors (isAlwaysExpanded=true) of the given layers
|
|
@@ -209,47 +202,46 @@ class LayerTree extends Component {
|
|
|
209
202
|
}
|
|
210
203
|
return [...layers, this.getExpandedLayers(children)].flat();
|
|
211
204
|
}
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
if (
|
|
216
|
-
|
|
217
|
-
[rootLayer] = layers;
|
|
218
|
-
}
|
|
219
|
-
rootLayer = new Layer({ children: layers });
|
|
205
|
+
onInputClick(layer, toggle = false) {
|
|
206
|
+
if (toggle) {
|
|
207
|
+
this.onToggle(layer);
|
|
208
|
+
} else if (layer.setVisible) {
|
|
209
|
+
layer.setVisible(!layer.visible);
|
|
220
210
|
} else {
|
|
221
|
-
|
|
211
|
+
layer.visible = !layer.visible;
|
|
222
212
|
}
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
const state = { rootLayer };
|
|
232
|
-
if (typeof expandChildren === "function" ? expandChildren(layers) : expandChildren) {
|
|
233
|
-
state.expandedLayers = rootLayer.children.flatMap((l) => {
|
|
234
|
-
return this.expandLayer(l);
|
|
235
|
-
});
|
|
213
|
+
}
|
|
214
|
+
onToggle(layer) {
|
|
215
|
+
const { expandedLayers } = this.state;
|
|
216
|
+
const pos = expandedLayers.indexOf(layer);
|
|
217
|
+
if (pos > -1) {
|
|
218
|
+
expandedLayers.splice(pos, 1);
|
|
219
|
+
} else {
|
|
220
|
+
expandedLayers.push(...this.getExpandedLayers([layer]));
|
|
236
221
|
}
|
|
237
|
-
this.setState(
|
|
222
|
+
this.setState({ expandedLayers });
|
|
238
223
|
}
|
|
239
|
-
|
|
224
|
+
render() {
|
|
225
|
+
const { className } = this.props;
|
|
226
|
+
return /* @__PURE__ */ React.createElement("div", { className }, this.renderTree());
|
|
227
|
+
}
|
|
228
|
+
renderArrow(layer) {
|
|
240
229
|
const { isItemHidden } = this.props;
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
});
|
|
247
|
-
return [...expLayers, ...children, layer];
|
|
230
|
+
const { expandedLayers } = this.state;
|
|
231
|
+
if (!(layer.children || []).filter((c) => {
|
|
232
|
+
return !isItemHidden(c);
|
|
233
|
+
}).length || layer.get("isAlwaysExpanded")) {
|
|
234
|
+
return null;
|
|
248
235
|
}
|
|
249
|
-
return
|
|
236
|
+
return /* @__PURE__ */ React.createElement(
|
|
237
|
+
"div",
|
|
238
|
+
{
|
|
239
|
+
className: `rs-layer-tree-arrow rs-layer-tree-arrow-${!expandedLayers.includes(layer) ? "collapsed" : "expanded"}`
|
|
240
|
+
}
|
|
241
|
+
);
|
|
250
242
|
}
|
|
251
243
|
renderInput(layer, inputProps) {
|
|
252
|
-
const {
|
|
244
|
+
const { isItemHidden, renderCheckbox, titles } = this.props;
|
|
253
245
|
let tabIndex = 0;
|
|
254
246
|
if (!(layer.children || []).filter((c) => {
|
|
255
247
|
return !isItemHidden(c);
|
|
@@ -262,26 +254,26 @@ class LayerTree extends Component {
|
|
|
262
254
|
/* @__PURE__ */ React.createElement(
|
|
263
255
|
"label",
|
|
264
256
|
{
|
|
265
|
-
className: `rs-layer-tree-input rs-layer-tree-input-${inputType} rs-${inputType}`,
|
|
266
|
-
tabIndex,
|
|
267
|
-
title: layer.visible ? titles.layerHide : titles.layerShow,
|
|
268
257
|
"aria-label": layer.visible ? titles.layerHide : titles.layerShow,
|
|
258
|
+
className: `rs-layer-tree-input rs-layer-tree-input-${inputType} rs-${inputType}`,
|
|
269
259
|
onKeyPress: (e) => {
|
|
270
260
|
if (e.which === 13) {
|
|
271
261
|
this.onInputClick(layer);
|
|
272
262
|
}
|
|
273
|
-
}
|
|
263
|
+
},
|
|
264
|
+
tabIndex,
|
|
265
|
+
title: layer.visible ? titles.layerHide : titles.layerShow
|
|
274
266
|
},
|
|
275
267
|
/* @__PURE__ */ React.createElement(
|
|
276
268
|
"input",
|
|
277
269
|
{
|
|
278
|
-
type: inputType,
|
|
279
|
-
tabIndex: -1,
|
|
280
270
|
checked: layer.visible,
|
|
281
|
-
readOnly: true,
|
|
282
271
|
onClick: () => {
|
|
283
272
|
return this.onInputClick(layer);
|
|
284
273
|
},
|
|
274
|
+
readOnly: true,
|
|
275
|
+
tabIndex: -1,
|
|
276
|
+
type: inputType,
|
|
285
277
|
...inputProps
|
|
286
278
|
}
|
|
287
279
|
),
|
|
@@ -289,25 +281,45 @@ class LayerTree extends Component {
|
|
|
289
281
|
)
|
|
290
282
|
);
|
|
291
283
|
}
|
|
292
|
-
|
|
284
|
+
// Render a button which expands/collapse the layer if there is children
|
|
285
|
+
renderItem(layer, level) {
|
|
293
286
|
const { isItemHidden } = this.props;
|
|
294
287
|
const { expandedLayers } = this.state;
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
288
|
+
const {
|
|
289
|
+
getParentClassName,
|
|
290
|
+
padding,
|
|
291
|
+
renderAfterItem,
|
|
292
|
+
renderBeforeItem,
|
|
293
|
+
renderItem,
|
|
294
|
+
renderItemContent
|
|
295
|
+
} = this.props;
|
|
296
|
+
const children = expandedLayers.includes(layer) ? [
|
|
297
|
+
...(layer.children || []).filter((c) => {
|
|
298
|
+
return !isItemHidden(c);
|
|
299
|
+
})
|
|
300
|
+
] : [];
|
|
301
|
+
if (renderItem) {
|
|
302
|
+
return renderItem(layer, this.onInputClick, this.onToggle);
|
|
299
303
|
}
|
|
300
|
-
return /* @__PURE__ */ React.createElement(
|
|
304
|
+
return /* @__PURE__ */ React.createElement("div", { className: getParentClassName(), key: layer.key }, /* @__PURE__ */ React.createElement(
|
|
301
305
|
"div",
|
|
302
306
|
{
|
|
303
|
-
className: `rs-layer-tree-
|
|
304
|
-
|
|
305
|
-
|
|
307
|
+
className: `rs-layer-tree-item ${layer.visible ? "rs-visible" : ""}`,
|
|
308
|
+
style: {
|
|
309
|
+
paddingLeft: `${padding * level}px`
|
|
310
|
+
}
|
|
311
|
+
},
|
|
312
|
+
renderItemContent ? renderItemContent(layer, this) : this.renderItemContent(layer)
|
|
313
|
+
), renderBeforeItem && renderBeforeItem(layer, level, this), [...children].reverse().map((child) => {
|
|
314
|
+
return this.renderItem(child, level + 1);
|
|
315
|
+
}), renderAfterItem && renderAfterItem(layer, level, this));
|
|
316
|
+
}
|
|
317
|
+
renderItemContent(layer, inputProps = {}, toggleProps = {}) {
|
|
318
|
+
return /* @__PURE__ */ React.createElement(React.Fragment, null, this.renderInput(layer, inputProps), this.renderToggleButton(layer, toggleProps));
|
|
306
319
|
}
|
|
307
|
-
// Render a button which expands/collapse the layer if there is children
|
|
308
320
|
// or simulate a click on the input otherwise.
|
|
309
321
|
renderToggleButton(layer, toggleProps) {
|
|
310
|
-
const {
|
|
322
|
+
const { isItemHidden, renderLabel, t, titles } = this.props;
|
|
311
323
|
const { expandedLayers } = this.state;
|
|
312
324
|
const onInputClick = () => {
|
|
313
325
|
this.onInputClick(
|
|
@@ -321,55 +333,20 @@ class LayerTree extends Component {
|
|
|
321
333
|
return /* @__PURE__ */ React.createElement(
|
|
322
334
|
"div",
|
|
323
335
|
{
|
|
324
|
-
role: "button",
|
|
325
|
-
tabIndex: 0,
|
|
326
|
-
className: "rs-layer-tree-toggle",
|
|
327
|
-
title,
|
|
328
336
|
"aria-expanded": expandedLayers.includes(layer),
|
|
329
337
|
"aria-label": title,
|
|
338
|
+
className: "rs-layer-tree-toggle",
|
|
330
339
|
onClick: onInputClick,
|
|
331
340
|
onKeyPress: onInputClick,
|
|
341
|
+
role: "button",
|
|
342
|
+
tabIndex: 0,
|
|
343
|
+
title,
|
|
332
344
|
...toggleProps
|
|
333
345
|
},
|
|
334
346
|
/* @__PURE__ */ React.createElement("div", null, renderLabel(layer, this)),
|
|
335
347
|
this.renderArrow(layer)
|
|
336
348
|
);
|
|
337
349
|
}
|
|
338
|
-
renderItemContent(layer, inputProps = {}, toggleProps = {}) {
|
|
339
|
-
return /* @__PURE__ */ React.createElement(React.Fragment, null, this.renderInput(layer, inputProps), this.renderToggleButton(layer, toggleProps));
|
|
340
|
-
}
|
|
341
|
-
renderItem(layer, level) {
|
|
342
|
-
const { isItemHidden } = this.props;
|
|
343
|
-
const { expandedLayers } = this.state;
|
|
344
|
-
const {
|
|
345
|
-
renderItem,
|
|
346
|
-
renderItemContent,
|
|
347
|
-
renderBeforeItem,
|
|
348
|
-
renderAfterItem,
|
|
349
|
-
padding,
|
|
350
|
-
getParentClassName
|
|
351
|
-
} = this.props;
|
|
352
|
-
const children = expandedLayers.includes(layer) ? [
|
|
353
|
-
...(layer.children || []).filter((c) => {
|
|
354
|
-
return !isItemHidden(c);
|
|
355
|
-
})
|
|
356
|
-
] : [];
|
|
357
|
-
if (renderItem) {
|
|
358
|
-
return renderItem(layer, this.onInputClick, this.onToggle);
|
|
359
|
-
}
|
|
360
|
-
return /* @__PURE__ */ React.createElement("div", { className: getParentClassName(), key: layer.key }, /* @__PURE__ */ React.createElement(
|
|
361
|
-
"div",
|
|
362
|
-
{
|
|
363
|
-
className: `rs-layer-tree-item ${layer.visible ? "rs-visible" : ""}`,
|
|
364
|
-
style: {
|
|
365
|
-
paddingLeft: `${padding * level}px`
|
|
366
|
-
}
|
|
367
|
-
},
|
|
368
|
-
renderItemContent ? renderItemContent(layer, this) : this.renderItemContent(layer)
|
|
369
|
-
), renderBeforeItem && renderBeforeItem(layer, level, this), [...children].reverse().map((child) => {
|
|
370
|
-
return this.renderItem(child, level + 1);
|
|
371
|
-
}), renderAfterItem && renderAfterItem(layer, level, this));
|
|
372
|
-
}
|
|
373
350
|
renderTree() {
|
|
374
351
|
const { isItemHidden } = this.props;
|
|
375
352
|
const { rootLayer } = this.state;
|
|
@@ -382,9 +359,32 @@ class LayerTree extends Component {
|
|
|
382
359
|
return this.renderItem(l, 0);
|
|
383
360
|
}));
|
|
384
361
|
}
|
|
385
|
-
|
|
386
|
-
const {
|
|
387
|
-
|
|
362
|
+
updateLayers() {
|
|
363
|
+
const { expandChildren, layers } = this.props;
|
|
364
|
+
let rootLayer = new Layer();
|
|
365
|
+
if (Array.isArray(layers)) {
|
|
366
|
+
if (layers.length === 1) {
|
|
367
|
+
[rootLayer] = layers;
|
|
368
|
+
}
|
|
369
|
+
rootLayer = new Layer({ children: layers });
|
|
370
|
+
} else {
|
|
371
|
+
rootLayer = layers;
|
|
372
|
+
}
|
|
373
|
+
getLayersAsFlatArray(rootLayer).forEach((layer) => {
|
|
374
|
+
this.olKeys.push(
|
|
375
|
+
layer.on("propertychange", () => {
|
|
376
|
+
const { revision } = this.state;
|
|
377
|
+
this.setState({ revision: revision + 1 });
|
|
378
|
+
})
|
|
379
|
+
);
|
|
380
|
+
});
|
|
381
|
+
const state = { rootLayer };
|
|
382
|
+
if (typeof expandChildren === "function" ? expandChildren(layers) : expandChildren) {
|
|
383
|
+
state.expandedLayers = rootLayer.children.flatMap((l) => {
|
|
384
|
+
return this.expandLayer(l);
|
|
385
|
+
});
|
|
386
|
+
}
|
|
387
|
+
this.setState(state);
|
|
388
388
|
}
|
|
389
389
|
}
|
|
390
390
|
LayerTree.propTypes = propTypes;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/components/LayerTree/LayerTree.js"],
|
|
4
|
-
"sourcesContent": ["import React, { Component } from \"react\";\nimport PropTypes from \"prop-types\";\nimport { Layer, getLayersAsFlatArray } from \"mobility-toolbox-js/ol\";\nimport { unByKey } from \"ol/Observable\";\n\nconst propTypes = {\n /**\n * Layers provider.\n */\n layers: PropTypes.arrayOf(PropTypes.instanceOf(Layer)),\n\n /**\n * CSS class to apply on the container.\n */\n className: PropTypes.string,\n\n /**\n * Padding left to apply on each level.\n */\n padding: PropTypes.number,\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 * Determine the className used by the div containing the parent and its children.\n */\n getParentClassName: 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 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 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 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 * Custom function to render the checkbox.\n */\n renderCheckbox: 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 show layer.\n */\n layerShow: PropTypes.string,\n /**\n * aria-label on checkbox to hide layer.\n */\n layerHide: PropTypes.string,\n /**\n * title on button to show sublayers.\n */\n subLayerShow: PropTypes.string,\n /**\n * title on button to show sublayers.\n */\n subLayerHide: PropTypes.string,\n }),\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 * Translation function.\n * @param {function} Translation function returning the translated string.\n */\n t: PropTypes.func,\n};\n\nconst defaultProps = {\n layers: [],\n className: \"rs-layer-tree\",\n padding: 30,\n isItemHidden: () => {\n return false;\n },\n getParentClassName: () => {\n return undefined;\n },\n renderItem: null,\n renderItemContent: null,\n renderBeforeItem: null,\n renderAfterItem: null,\n renderCheckbox: null,\n renderLabel: (layer, layerComp) => {\n const { t } = layerComp.props;\n return t(layer.name);\n },\n titles: {\n layerShow: \"Show layer\",\n layerHide: \"Hide layer\",\n subLayerShow: \"Show sublayer\",\n subLayerHide: \"Hide sublayer\",\n },\n t: (s) => {\n return s;\n },\n expandChildren: false,\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 { layers, isItemHidden } = 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 rootLayer: new Layer(),\n expandedLayers: initialExpandedLayers,\n revision: 0,\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 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 /**\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 updateLayers() {\n const { layers, expandChildren } = 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 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 renderInput(layer, inputProps) {\n const { titles, isItemHidden, renderCheckbox } = 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 className={`rs-layer-tree-input rs-layer-tree-input-${inputType} rs-${inputType}`}\n tabIndex={tabIndex}\n title={layer.visible ? titles.layerHide : titles.layerShow}\n aria-label={layer.visible ? titles.layerHide : titles.layerShow}\n onKeyPress={(e) => {\n if (e.which === 13) {\n this.onInputClick(layer);\n }\n }}\n >\n <input\n type={inputType}\n tabIndex={-1}\n checked={layer.visible}\n readOnly\n onClick={() => {\n return this.onInputClick(layer);\n }}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...inputProps}\n />\n <span />\n </label>\n );\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 // 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 { t, titles, isItemHidden, renderLabel } = 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 role=\"button\"\n tabIndex={0}\n className=\"rs-layer-tree-toggle\"\n title={title}\n aria-expanded={expandedLayers.includes(layer)}\n aria-label={title}\n onClick={onInputClick}\n onKeyPress={onInputClick}\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 renderItemContent(layer, inputProps = {}, toggleProps = {}) {\n return (\n <>\n {this.renderInput(layer, inputProps)}\n {this.renderToggleButton(layer, toggleProps)}\n </>\n );\n }\n\n renderItem(layer, level) {\n const { isItemHidden } = this.props;\n const { expandedLayers } = this.state;\n const {\n renderItem,\n renderItemContent,\n renderBeforeItem,\n renderAfterItem,\n padding,\n getParentClassName,\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 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 render() {\n const { className } = this.props;\n return <div className={className}>{this.renderTree()}</div>;\n }\n}\n\nLayerTree.propTypes = propTypes;\nLayerTree.defaultProps = defaultProps;\n\nexport default LayerTree;\n"],
|
|
5
|
-
"mappings": "AAAA,
|
|
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": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|