@delta10/atlas-sdk 0.2.1 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -3
- package/dist/components/Map.vue.d.ts +3 -0
- package/dist/components/Map.vue.js +1 -1
- package/dist/components/Map.vue2.js +228 -204
- package/dist/style.css +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -72,6 +72,7 @@ const interactions: InteractionsConfig = {
|
|
|
72
72
|
selectable: {
|
|
73
73
|
enabled: true,
|
|
74
74
|
layers: ['meetbouten'],
|
|
75
|
+
hitTolerance: 20,
|
|
75
76
|
style: {
|
|
76
77
|
'circle-radius': 8,
|
|
77
78
|
'circle-fill-color': 'red',
|
|
@@ -375,6 +376,7 @@ Allow users to select features from specific layers:
|
|
|
375
376
|
selectable: {
|
|
376
377
|
enabled: true,
|
|
377
378
|
layers: ['meetbouten'],
|
|
379
|
+
hitTolerance: 20,
|
|
378
380
|
style: {
|
|
379
381
|
'circle-radius': 8,
|
|
380
382
|
'circle-fill-color': 'red',
|
|
@@ -386,18 +388,22 @@ Allow users to select features from specific layers:
|
|
|
386
388
|
```
|
|
387
389
|
|
|
388
390
|
### Modify Interaction
|
|
389
|
-
Allow users to edit existing geometries:
|
|
391
|
+
Allow users to edit existing geometries directly on the configured layer:
|
|
390
392
|
```typescript
|
|
391
393
|
{
|
|
392
394
|
modify: {
|
|
393
395
|
enabled: true,
|
|
394
396
|
layer: 'meetbouten',
|
|
395
|
-
labelProperty: 'meetboutnummer' // Optional: feature property shown in the confirm/cancel overlay
|
|
397
|
+
labelProperty: 'meetboutnummer', // Optional: feature property shown in the confirm/cancel overlay
|
|
398
|
+
pixelTolerance: 20, // Optional: edit tolerance in pixels for point symbols
|
|
399
|
+
filter: (feature) => feature.get('editable') === true // Optional: return false to prevent editing
|
|
396
400
|
}
|
|
397
401
|
}
|
|
398
402
|
```
|
|
399
403
|
|
|
400
|
-
The `labelProperty` value is read from the
|
|
404
|
+
The `labelProperty` value is read from the modified feature's `properties`. For example, if a feature has `properties: { id: '123482' }`, use `labelProperty: 'id'` to show that value in the confirmation overlay.
|
|
405
|
+
|
|
406
|
+
The optional `filter` callback receives the OpenLayers feature and layer. Return `false` to skip that feature for editing.
|
|
401
407
|
|
|
402
408
|
### Snap Interaction
|
|
403
409
|
Snap modified features to existing features:
|
|
@@ -3,11 +3,14 @@ export interface SelectableConfig {
|
|
|
3
3
|
enabled: boolean;
|
|
4
4
|
layers: string[];
|
|
5
5
|
style?: StyleConfig;
|
|
6
|
+
hitTolerance?: number;
|
|
6
7
|
}
|
|
7
8
|
export interface ModifyConfig {
|
|
8
9
|
enabled: boolean;
|
|
9
10
|
layer: string;
|
|
10
11
|
labelProperty?: string;
|
|
12
|
+
pixelTolerance?: number;
|
|
13
|
+
filter?: (feature: any, layer?: any) => boolean;
|
|
11
14
|
style?: StyleConfig;
|
|
12
15
|
}
|
|
13
16
|
export interface SnapConfig {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import o from "./Map.vue2.js";
|
|
2
2
|
/* empty css */
|
|
3
3
|
import t from "../_virtual/_plugin-vue_export-helper.js";
|
|
4
|
-
const e = /* @__PURE__ */ t(o, [["__scopeId", "data-v-
|
|
4
|
+
const e = /* @__PURE__ */ t(o, [["__scopeId", "data-v-1eba4e06"]]);
|
|
5
5
|
export {
|
|
6
6
|
e as default
|
|
7
7
|
};
|
|
@@ -1,35 +1,36 @@
|
|
|
1
|
-
import { defineComponent as
|
|
2
|
-
import { OlMap as
|
|
3
|
-
import { OlTileLayer as
|
|
4
|
-
import { OlSourceVector as
|
|
5
|
-
import { OlGeomPoint as
|
|
6
|
-
import { OlStyle as
|
|
7
|
-
import { OlInteractionSelect as
|
|
1
|
+
import { defineComponent as je, ref as c, shallowRef as H, computed as m, onMounted as Re, openBlock as a, createElementBlock as k, createVNode as y, unref as r, withCtx as L, createBlock as f, normalizeStyle as Ze, createCommentVNode as d, Fragment as Y, renderList as re, createElementVNode as v, toDisplayString as $e, normalizeClass as se, Transition as ae } from "vue";
|
|
2
|
+
import { OlMap as Ge, OlProjectionRegister as Ne, OlView as De, OlFeature as Ue, OlOverlay as Ke } from "vue3-openlayers/map";
|
|
3
|
+
import { OlTileLayer as le, OlVectorLayer as He } from "vue3-openlayers/layers";
|
|
4
|
+
import { OlSourceVector as Ye } from "vue3-openlayers/sources";
|
|
5
|
+
import { OlGeomPoint as qe, OlGeomPolygon as Je } from "vue3-openlayers/geometries";
|
|
6
|
+
import { OlStyle as ce } from "vue3-openlayers/styles";
|
|
7
|
+
import { OlInteractionSelect as Qe, OlInteractionModify as Xe, OlInteractionSnap as Ee } from "vue3-openlayers/interactions";
|
|
8
8
|
import { epsg28992 as j } from "../utils/projections.js";
|
|
9
|
-
import
|
|
10
|
-
import
|
|
11
|
-
import
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
9
|
+
import et, { optionsFromCapabilities as tt } from "ol/source/WMTS";
|
|
10
|
+
import ot from "ol/format/WMTSCapabilities";
|
|
11
|
+
import nt from "ol/source/TileWMS";
|
|
12
|
+
import { primaryAction as it } from "ol/events/condition";
|
|
13
|
+
import { Style as q, Fill as J, Stroke as Q, Circle as rt, Text as st } from "ol/style";
|
|
14
|
+
import { boundingExtent as at } from "ol/extent";
|
|
15
|
+
import { unByKey as lt } from "ol/Observable";
|
|
16
|
+
import { Collection as ue, Feature as ct } from "ol";
|
|
16
17
|
import "ol/geom";
|
|
17
|
-
import
|
|
18
|
-
import
|
|
19
|
-
import
|
|
20
|
-
import
|
|
21
|
-
import
|
|
22
|
-
import
|
|
23
|
-
const
|
|
18
|
+
import ut from "../assets/icons/map.svg.js";
|
|
19
|
+
import ft from "../assets/icons/layers.svg.js";
|
|
20
|
+
import dt from "../assets/icons/plus.svg.js";
|
|
21
|
+
import pt from "../assets/icons/minus.svg.js";
|
|
22
|
+
import mt from "./panels/BaseLayers.vue.js";
|
|
23
|
+
import yt from "./panels/Layers.vue.js";
|
|
24
|
+
const vt = { class: "map-container" }, gt = { class: "modify-overlay" }, bt = {
|
|
24
25
|
key: 0,
|
|
25
26
|
class: "modify-overlay-label"
|
|
26
|
-
},
|
|
27
|
+
}, wt = { class: "bottom-left-panels" }, ht = {
|
|
27
28
|
key: 0,
|
|
28
29
|
class: "layers-control"
|
|
29
|
-
},
|
|
30
|
+
}, Lt = ["aria-expanded"], kt = { class: "bottom-right-panels" }, St = {
|
|
30
31
|
key: 0,
|
|
31
32
|
class: "base-layers-control"
|
|
32
|
-
},
|
|
33
|
+
}, Tt = ["aria-expanded"], Ft = { class: "zoom-panel" }, qt = /* @__PURE__ */ je({
|
|
33
34
|
__name: "Map",
|
|
34
35
|
props: {
|
|
35
36
|
layers: { default: () => [] },
|
|
@@ -40,58 +41,58 @@ const at = { class: "map-container" }, ct = { class: "modify-overlay" }, ut = {
|
|
|
40
41
|
center: { default: () => [12e4, 487e3] }
|
|
41
42
|
},
|
|
42
43
|
emits: ["featureSelected", "featureDeselected", "featureModified", "mapClicked", "modifyCancelled"],
|
|
43
|
-
setup(S, { expose:
|
|
44
|
-
const i = S,
|
|
44
|
+
setup(S, { expose: fe, emit: de }) {
|
|
45
|
+
const i = S, z = de, P = c(), w = c(), X = c(), pe = c({}), R = c({}), _ = c(!1), x = c(!1), T = c(null), C = c(/* @__PURE__ */ new Set()), A = c(!1), I = c(null), h = c(null), F = c(null), B = c(null), V = c(null), Z = H(new ue([])), O = H(new ue([])), me = m(() => Z.value), ye = m(() => O.value), E = m(() => {
|
|
45
46
|
const e = i.interactions?.modify?.labelProperty;
|
|
46
|
-
if (!e || !
|
|
47
|
-
const t =
|
|
47
|
+
if (!e || !F.value) return "";
|
|
48
|
+
const t = F.value.get?.(e);
|
|
48
49
|
return t == null ? "" : String(t);
|
|
49
|
-
}),
|
|
50
|
+
}), M = H(
|
|
50
51
|
new globalThis.Map()
|
|
51
|
-
),
|
|
52
|
+
), ee = new globalThis.Map(), te = /* @__PURE__ */ new WeakMap(), $ = (e, t) => {
|
|
52
53
|
if (!e || !t) return null;
|
|
53
|
-
const o = `${e}|${t}`, n =
|
|
54
|
+
const o = `${e}|${t}`, n = ee.get(o);
|
|
54
55
|
if (n) return n;
|
|
55
|
-
const s = new
|
|
56
|
+
const s = new nt({
|
|
56
57
|
url: e,
|
|
57
58
|
params: { LAYERS: t, TILED: !0 },
|
|
58
59
|
serverType: "geoserver",
|
|
59
60
|
crossOrigin: "anonymous"
|
|
60
61
|
});
|
|
61
|
-
return
|
|
62
|
+
return ee.set(o, s), s;
|
|
62
63
|
}, G = (e) => {
|
|
63
64
|
if (!e) return null;
|
|
64
|
-
const t =
|
|
65
|
+
const t = te.get(e);
|
|
65
66
|
if (t) return t;
|
|
66
|
-
const o = new
|
|
67
|
+
const o = new et({
|
|
67
68
|
...e,
|
|
68
69
|
style: e.style || "default"
|
|
69
70
|
});
|
|
70
|
-
return
|
|
71
|
+
return te.set(e, o), o;
|
|
71
72
|
}, N = (e, t) => {
|
|
72
|
-
const o = new globalThis.Map(
|
|
73
|
-
o.set(e, t),
|
|
74
|
-
},
|
|
73
|
+
const o = new globalThis.Map(M.value);
|
|
74
|
+
o.set(e, t), M.value = o;
|
|
75
|
+
}, D = (e, t, o, n) => {
|
|
75
76
|
if (!e) return;
|
|
76
|
-
if (e instanceof
|
|
77
|
+
if (e instanceof q || typeof e == "function")
|
|
77
78
|
return e;
|
|
78
|
-
const s = {},
|
|
79
|
+
const s = {}, l = (p) => {
|
|
79
80
|
if (Array.isArray(p)) {
|
|
80
|
-
const [
|
|
81
|
-
switch (
|
|
81
|
+
const [g, ...u] = p;
|
|
82
|
+
switch (g) {
|
|
82
83
|
case "get":
|
|
83
84
|
return t?.getProperties()?.[u[0]] ?? null;
|
|
84
85
|
case "case":
|
|
85
|
-
for (let
|
|
86
|
-
if (
|
|
87
|
-
return
|
|
88
|
-
return
|
|
86
|
+
for (let b = 0; b < u.length - 1; b += 2)
|
|
87
|
+
if (l(u[b]))
|
|
88
|
+
return l(u[b + 1]);
|
|
89
|
+
return l(u[u.length - 1]);
|
|
89
90
|
case "==":
|
|
90
|
-
return
|
|
91
|
+
return l(u[0]) === l(u[1]);
|
|
91
92
|
case "coalesce":
|
|
92
|
-
for (const
|
|
93
|
-
const
|
|
94
|
-
if (
|
|
93
|
+
for (const b of u) {
|
|
94
|
+
const K = l(b);
|
|
95
|
+
if (K != null) return K;
|
|
95
96
|
}
|
|
96
97
|
return null;
|
|
97
98
|
default:
|
|
@@ -100,32 +101,32 @@ const at = { class: "map-container" }, ct = { class: "modify-overlay" }, ut = {
|
|
|
100
101
|
}
|
|
101
102
|
return p;
|
|
102
103
|
};
|
|
103
|
-
if (e["fill-color"] && (s.fill = new
|
|
104
|
-
color:
|
|
105
|
-
width:
|
|
104
|
+
if (e["fill-color"] && (s.fill = new J({ color: l(e["fill-color"]) })), (e["stroke-color"] || e["stroke-width"]) && (s.stroke = new Q({
|
|
105
|
+
color: l(e["stroke-color"]) || "#3399CC",
|
|
106
|
+
width: l(e["stroke-width"]) || 1.25
|
|
106
107
|
})), e["circle-radius"] || e["circle-fill-color"] || e["circle-stroke-color"]) {
|
|
107
|
-
const p =
|
|
108
|
-
s.image = new
|
|
108
|
+
const p = l(e["circle-radius"]) || 5, g = l(e["circle-fill-color"]), u = l(e["circle-stroke-color"]) || "#3399CC", b = l(e["circle-stroke-width"]) || 1.25;
|
|
109
|
+
s.image = new rt({
|
|
109
110
|
radius: p,
|
|
110
|
-
fill:
|
|
111
|
-
stroke: new
|
|
111
|
+
fill: g ? new J({ color: g }) : void 0,
|
|
112
|
+
stroke: new Q({ color: u, width: b })
|
|
112
113
|
});
|
|
113
114
|
}
|
|
114
115
|
if (e["text-value"]) {
|
|
115
|
-
const p =
|
|
116
|
-
p && (s.text = new
|
|
116
|
+
const p = l(e["text-value"]);
|
|
117
|
+
p && (s.text = new st({
|
|
117
118
|
text: String(p),
|
|
118
|
-
fill: new
|
|
119
|
-
stroke: new
|
|
119
|
+
fill: new J({ color: "#000" }),
|
|
120
|
+
stroke: new Q({ color: "#fff", width: 2 })
|
|
120
121
|
}));
|
|
121
122
|
}
|
|
122
|
-
return new
|
|
123
|
-
},
|
|
124
|
-
const s =
|
|
123
|
+
return new q(s);
|
|
124
|
+
}, ve = (e) => typeof e == "function" ? e : e instanceof q ? (t, o, n) => [e] : (t, o, n) => {
|
|
125
|
+
const s = D(e, t);
|
|
125
126
|
return s ? [s] : void 0;
|
|
126
|
-
},
|
|
127
|
+
}, ge = m(() => i.layers.map((e) => {
|
|
127
128
|
if (e.type === "wmts") {
|
|
128
|
-
const t =
|
|
129
|
+
const t = M.value.get(e.options.identifier);
|
|
129
130
|
return {
|
|
130
131
|
type: "wmts",
|
|
131
132
|
identifier: e.options.identifier,
|
|
@@ -145,15 +146,15 @@ const at = { class: "map-container" }, ct = { class: "modify-overlay" }, ut = {
|
|
|
145
146
|
style: e.options.style,
|
|
146
147
|
styleFunction: e.options.styleFunction
|
|
147
148
|
};
|
|
148
|
-
})), W =
|
|
149
|
-
if (!
|
|
149
|
+
})), W = m(() => {
|
|
150
|
+
if (!T.value || !i.baseLayers)
|
|
150
151
|
return null;
|
|
151
152
|
const e = i.baseLayers.find(
|
|
152
|
-
(t) => t.options.identifier ===
|
|
153
|
+
(t) => t.options.identifier === T.value
|
|
153
154
|
);
|
|
154
|
-
return !e || e.type === "wmts" && !
|
|
155
|
-
}),
|
|
156
|
-
(e) =>
|
|
155
|
+
return !e || e.type === "wmts" && !M.value.get(e.options.identifier) ? null : e;
|
|
156
|
+
}), oe = m(() => W.value && M.value.get(W.value.options.identifier) || null), be = m(() => (i.toggleableLayers || []).filter(
|
|
157
|
+
(e) => C.value.has(e.options.identifier)
|
|
157
158
|
).map((e) => {
|
|
158
159
|
if (e.type === "wms")
|
|
159
160
|
return {
|
|
@@ -164,7 +165,7 @@ const at = { class: "map-container" }, ct = { class: "modify-overlay" }, ut = {
|
|
|
164
165
|
source: $(e.options.url, e.options.layer)
|
|
165
166
|
};
|
|
166
167
|
if (e.type === "wmts") {
|
|
167
|
-
const t =
|
|
168
|
+
const t = M.value.get(e.options.identifier);
|
|
168
169
|
return {
|
|
169
170
|
type: "wmts",
|
|
170
171
|
identifier: e.options.identifier,
|
|
@@ -183,15 +184,15 @@ const at = { class: "map-container" }, ct = { class: "modify-overlay" }, ut = {
|
|
|
183
184
|
...e,
|
|
184
185
|
identifier: e.options.identifier
|
|
185
186
|
};
|
|
186
|
-
})),
|
|
187
|
+
})), we = m(() => {
|
|
187
188
|
const e = [];
|
|
188
189
|
if (W.value) {
|
|
189
190
|
const n = W.value;
|
|
190
191
|
n.type === "wmts" ? e.push({
|
|
191
192
|
type: "wmts",
|
|
192
193
|
identifier: n.options.identifier,
|
|
193
|
-
wmtsOptions:
|
|
194
|
-
source: G(
|
|
194
|
+
wmtsOptions: oe.value,
|
|
195
|
+
source: G(oe.value),
|
|
195
196
|
zIndex: 0
|
|
196
197
|
}) : n.type === "wms" ? e.push({
|
|
197
198
|
type: "wms",
|
|
@@ -209,54 +210,54 @@ const at = { class: "map-container" }, ct = { class: "modify-overlay" }, ut = {
|
|
|
209
210
|
zIndex: 0
|
|
210
211
|
});
|
|
211
212
|
}
|
|
212
|
-
const t =
|
|
213
|
+
const t = be.value.map((n, s) => ({
|
|
213
214
|
...n,
|
|
214
215
|
zIndex: s + 10
|
|
215
|
-
})), o =
|
|
216
|
+
})), o = ge.value.map((n, s) => ({
|
|
216
217
|
...n,
|
|
217
218
|
zIndex: t.length + s + 20
|
|
218
219
|
}));
|
|
219
220
|
return [...e, ...t, ...o];
|
|
220
|
-
}),
|
|
221
|
-
|
|
222
|
-
},
|
|
223
|
-
|
|
224
|
-
},
|
|
225
|
-
|
|
226
|
-
},
|
|
227
|
-
|
|
228
|
-
},
|
|
221
|
+
}), he = () => {
|
|
222
|
+
_.value = !_.value;
|
|
223
|
+
}, Le = () => {
|
|
224
|
+
x.value = !x.value;
|
|
225
|
+
}, ke = (e) => {
|
|
226
|
+
C.value.has(e) ? C.value.delete(e) : C.value.add(e);
|
|
227
|
+
}, Se = (e) => {
|
|
228
|
+
T.value = e;
|
|
229
|
+
}, Te = () => {
|
|
229
230
|
if (w.value?.view) {
|
|
230
231
|
const e = w.value.view, t = e.getZoom(), o = e.getMaxZoom();
|
|
231
232
|
typeof t == "number" && t < o && e.animate({ zoom: t + 1, duration: 250 });
|
|
232
233
|
}
|
|
233
|
-
},
|
|
234
|
+
}, Fe = () => {
|
|
234
235
|
if (w.value?.view) {
|
|
235
236
|
const e = w.value.view, t = e.getZoom(), o = e.getMinZoom();
|
|
236
237
|
typeof t == "number" && t > o && e.animate({ zoom: t - 1, duration: 250 });
|
|
237
238
|
}
|
|
238
|
-
},
|
|
239
|
+
}, U = async (e, t, o) => {
|
|
239
240
|
try {
|
|
240
|
-
const s = await (await fetch(e)).text(),
|
|
241
|
-
let
|
|
241
|
+
const s = await (await fetch(e)).text(), l = new ot().read(s), p = o ? [o, "image/jpeg", "image/png"] : ["image/png", "image/jpeg"];
|
|
242
|
+
let g = null;
|
|
242
243
|
for (const u of p)
|
|
243
244
|
try {
|
|
244
|
-
if (
|
|
245
|
+
if (g = tt(l, {
|
|
245
246
|
layer: t,
|
|
246
247
|
matrixSet: "EPSG:28992",
|
|
247
248
|
projection: "EPSG:28992",
|
|
248
249
|
format: u,
|
|
249
250
|
crossOrigin: "anonymous",
|
|
250
251
|
style: "default"
|
|
251
|
-
}),
|
|
252
|
-
} catch (
|
|
253
|
-
console.warn(`Format ${u} failed for layer ${t}:`,
|
|
252
|
+
}), g) break;
|
|
253
|
+
} catch (b) {
|
|
254
|
+
console.warn(`Format ${u} failed for layer ${t}:`, b);
|
|
254
255
|
}
|
|
255
|
-
return
|
|
256
|
+
return g && (g.style = "default"), g;
|
|
256
257
|
} catch (n) {
|
|
257
258
|
return console.error("Failed to fetch WMTS capabilities:", n), null;
|
|
258
259
|
}
|
|
259
|
-
},
|
|
260
|
+
}, Me = (e) => {
|
|
260
261
|
if (!e || e.length === 0 || !w.value?.view) return;
|
|
261
262
|
const t = [];
|
|
262
263
|
for (const o of e)
|
|
@@ -265,30 +266,30 @@ const at = { class: "map-container" }, ct = { class: "modify-overlay" }, ut = {
|
|
|
265
266
|
else if (o.type === "Polygon") {
|
|
266
267
|
const n = o.coordinates;
|
|
267
268
|
for (const s of n)
|
|
268
|
-
for (const
|
|
269
|
-
t.push(
|
|
269
|
+
for (const l of s)
|
|
270
|
+
t.push(l);
|
|
270
271
|
}
|
|
271
272
|
if (t.length > 0) {
|
|
272
|
-
const o =
|
|
273
|
+
const o = at(t);
|
|
273
274
|
w.value.view.fit(o, {
|
|
274
275
|
padding: [50, 50, 50, 50]
|
|
275
276
|
});
|
|
276
277
|
}
|
|
277
278
|
};
|
|
278
|
-
|
|
279
|
-
if (!
|
|
279
|
+
Re(async () => {
|
|
280
|
+
if (!T.value && i.baseLayers && i.baseLayers.length > 0) {
|
|
280
281
|
const e = i.baseLayers[0];
|
|
281
|
-
e?.options.identifier && (
|
|
282
|
+
e?.options.identifier && (T.value = e.options.identifier);
|
|
282
283
|
}
|
|
283
284
|
await new Promise((e) => setTimeout(e, 100)), P.value?.map && P.value.map.on("singleclick", (e) => {
|
|
284
|
-
|
|
285
|
+
z("mapClicked", {
|
|
285
286
|
coordinate: e.coordinate,
|
|
286
287
|
pixel: e.pixel
|
|
287
288
|
});
|
|
288
289
|
});
|
|
289
290
|
for (const e of i.layers.filter((t) => t.type === "wmts"))
|
|
290
291
|
if (e.options.url) {
|
|
291
|
-
const t = await
|
|
292
|
+
const t = await U(
|
|
292
293
|
e.options.url,
|
|
293
294
|
e.options.identifier,
|
|
294
295
|
e.options.format
|
|
@@ -298,7 +299,7 @@ const at = { class: "map-container" }, ct = { class: "modify-overlay" }, ut = {
|
|
|
298
299
|
if (i.baseLayers) {
|
|
299
300
|
for (const e of i.baseLayers.filter((t) => t.type === "wmts"))
|
|
300
301
|
if (e.options.url) {
|
|
301
|
-
const t = await
|
|
302
|
+
const t = await U(
|
|
302
303
|
e.options.url,
|
|
303
304
|
e.options.identifier,
|
|
304
305
|
e.options.format
|
|
@@ -311,7 +312,7 @@ const at = { class: "map-container" }, ct = { class: "modify-overlay" }, ut = {
|
|
|
311
312
|
(t) => t.type === "wmts"
|
|
312
313
|
))
|
|
313
314
|
if (e.options.url) {
|
|
314
|
-
const t = await
|
|
315
|
+
const t = await U(
|
|
315
316
|
e.options.url,
|
|
316
317
|
e.options.identifier,
|
|
317
318
|
e.options.format
|
|
@@ -320,7 +321,7 @@ const at = { class: "map-container" }, ct = { class: "modify-overlay" }, ut = {
|
|
|
320
321
|
}
|
|
321
322
|
}
|
|
322
323
|
});
|
|
323
|
-
const
|
|
324
|
+
const _e = m(() => {
|
|
324
325
|
if (!i.interactions?.selectable?.layers || i.interactions.selectable.layers.length === 0)
|
|
325
326
|
return;
|
|
326
327
|
const e = i.interactions.selectable.layers;
|
|
@@ -329,128 +330,151 @@ const at = { class: "map-container" }, ct = { class: "modify-overlay" }, ut = {
|
|
|
329
330
|
const n = o.get("name");
|
|
330
331
|
return e.includes(n);
|
|
331
332
|
};
|
|
332
|
-
}),
|
|
333
|
-
|
|
334
|
-
},
|
|
333
|
+
}), xe = m(() => D(i.interactions?.selectable?.style, void 0)), Ce = (e, t, o) => i.interactions?.modify?.style ? D(i.interactions.modify.style, e) : [], Ie = (e) => {
|
|
334
|
+
z("featureSelected", e);
|
|
335
|
+
}, Oe = m(() => i.interactions?.modify?.pixelTolerance ?? 10), ze = (e) => !i.interactions?.modify?.enabled || !i.interactions.modify.layer ? null : e.map.forEachFeatureAtPixel(
|
|
336
|
+
e.pixel,
|
|
337
|
+
(t, o) => {
|
|
338
|
+
if (i.interactions?.modify?.filter?.(t, o) !== !1)
|
|
339
|
+
return t;
|
|
340
|
+
},
|
|
341
|
+
{
|
|
342
|
+
hitTolerance: Oe.value,
|
|
343
|
+
layerFilter: (t) => t?.get("name") === i.interactions?.modify?.layer
|
|
344
|
+
}
|
|
345
|
+
) || null, Pe = (e) => {
|
|
346
|
+
if (!it(e) || A.value)
|
|
347
|
+
return !1;
|
|
348
|
+
const t = ze(e);
|
|
349
|
+
return O.value.clear(), t instanceof ct ? (O.value.push(t), !0) : !1;
|
|
350
|
+
}, Ae = (e) => {
|
|
335
351
|
h.value = e;
|
|
336
352
|
const t = e.features.getArray()[0];
|
|
337
|
-
if (
|
|
353
|
+
if (F.value = t || null, t) {
|
|
338
354
|
const o = t.getGeometry();
|
|
339
355
|
B.value = o.clone();
|
|
340
356
|
const n = o.getCoordinates();
|
|
341
|
-
|
|
357
|
+
I.value = n, A.value = !0, V.value = o.on("change", () => {
|
|
342
358
|
const s = o.getCoordinates();
|
|
343
|
-
|
|
359
|
+
I.value = s;
|
|
344
360
|
});
|
|
345
361
|
}
|
|
346
|
-
},
|
|
347
|
-
h.value = e,
|
|
348
|
-
},
|
|
349
|
-
|
|
350
|
-
const e =
|
|
362
|
+
}, Be = (e) => {
|
|
363
|
+
h.value = e, F.value = e.features.getArray()[0] || F.value;
|
|
364
|
+
}, ne = () => {
|
|
365
|
+
Z.value && Z.value.clear(), O.value && O.value.clear();
|
|
366
|
+
const e = X.value?.select;
|
|
351
367
|
(e?.value || e)?.getFeatures?.().clear();
|
|
352
|
-
},
|
|
368
|
+
}, Ve = () => {
|
|
353
369
|
if (h.value) {
|
|
354
370
|
const e = h.value.features.getArray();
|
|
355
|
-
|
|
371
|
+
z("featureModified", { features: e });
|
|
356
372
|
}
|
|
357
|
-
|
|
358
|
-
},
|
|
373
|
+
ne(), ie();
|
|
374
|
+
}, We = () => {
|
|
359
375
|
if (h.value && B.value) {
|
|
360
376
|
const e = h.value.features.getArray()[0];
|
|
361
377
|
e && e.setGeometry(B.value);
|
|
362
378
|
const t = h.value.features.getArray();
|
|
363
|
-
|
|
379
|
+
z("modifyCancelled", { features: t });
|
|
364
380
|
}
|
|
365
|
-
|
|
366
|
-
},
|
|
367
|
-
|
|
381
|
+
ne(), ie();
|
|
382
|
+
}, ie = () => {
|
|
383
|
+
A.value = !1, I.value = null, h.value = null, F.value = null, B.value = null, V.value && (lt(V.value), V.value = null);
|
|
368
384
|
};
|
|
369
|
-
return
|
|
370
|
-
|
|
385
|
+
return fe({ map: P, view: w, fitToFeatures: Me }), (e, t) => (a(), k("div", vt, [
|
|
386
|
+
y(r(Ge), {
|
|
371
387
|
ref_key: "mapRef",
|
|
372
388
|
ref: P,
|
|
373
389
|
style: { width: "100%", height: "100%" },
|
|
374
390
|
controls: []
|
|
375
391
|
}, {
|
|
376
|
-
default:
|
|
377
|
-
|
|
392
|
+
default: L(() => [
|
|
393
|
+
y(r(Ne), {
|
|
378
394
|
projectionName: r(j).name,
|
|
379
395
|
projectionDef: r(j).def,
|
|
380
396
|
extent: r(j).extent
|
|
381
397
|
}, null, 8, ["projectionName", "projectionDef", "extent"]),
|
|
382
|
-
|
|
398
|
+
y(r(De), {
|
|
383
399
|
ref_key: "viewRef",
|
|
384
400
|
ref: w,
|
|
385
401
|
center: S.center,
|
|
386
402
|
zoom: S.zoom,
|
|
387
403
|
projection: r(j).name
|
|
388
404
|
}, null, 8, ["center", "zoom", "projection"]),
|
|
389
|
-
i.interactions?.selectable?.enabled ? (
|
|
405
|
+
i.interactions?.selectable?.enabled ? (a(), f(r(Qe), {
|
|
390
406
|
key: 0,
|
|
391
407
|
ref_key: "selectInteractionRef",
|
|
392
|
-
ref:
|
|
408
|
+
ref: X,
|
|
393
409
|
multi: !1,
|
|
394
|
-
features:
|
|
395
|
-
filter:
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
410
|
+
features: me.value,
|
|
411
|
+
filter: _e.value,
|
|
412
|
+
hitTolerance: i.interactions.selectable.hitTolerance,
|
|
413
|
+
style: Ze(xe.value),
|
|
414
|
+
onSelect: Ie
|
|
415
|
+
}, null, 8, ["features", "filter", "hitTolerance", "style"])) : d("", !0),
|
|
416
|
+
(a(!0), k(Y, null, re(we.value, (o) => (a(), k(Y, {
|
|
400
417
|
key: o.identifier
|
|
401
418
|
}, [
|
|
402
|
-
o.type === "wms" && o.source ? (
|
|
419
|
+
o.type === "wms" && o.source ? (a(), f(r(le), {
|
|
403
420
|
key: 0,
|
|
404
421
|
zIndex: o.zIndex,
|
|
405
422
|
source: o.source
|
|
406
|
-
}, null, 8, ["zIndex", "source"])) : o.type === "wmts" && o.source ? (
|
|
423
|
+
}, null, 8, ["zIndex", "source"])) : o.type === "wmts" && o.source ? (a(), f(r(le), {
|
|
407
424
|
key: 1,
|
|
408
425
|
zIndex: o.zIndex,
|
|
409
426
|
source: o.source
|
|
410
|
-
}, null, 8, ["zIndex", "source"])) : o.type === "vector" ? (
|
|
427
|
+
}, null, 8, ["zIndex", "source"])) : o.type === "vector" ? (a(), f(r(He), {
|
|
411
428
|
key: 2,
|
|
412
429
|
zIndex: o.zIndex,
|
|
413
430
|
properties: { name: o.identifier },
|
|
414
431
|
ref_for: !0,
|
|
415
432
|
ref: (n) => {
|
|
416
|
-
n && (
|
|
433
|
+
n && (pe.value[o.identifier] = n);
|
|
417
434
|
}
|
|
418
435
|
}, {
|
|
419
|
-
default:
|
|
420
|
-
o.styleFunction || o.options?.styleFunction || o.style || o.options?.style ? (
|
|
436
|
+
default: L(() => [
|
|
437
|
+
o.styleFunction || o.options?.styleFunction || o.style || o.options?.style ? (a(), f(r(ce), {
|
|
421
438
|
key: 0,
|
|
422
|
-
overrideStyleFunction: o.styleFunction || o.options?.styleFunction ||
|
|
439
|
+
overrideStyleFunction: o.styleFunction || o.options?.styleFunction || ve(o.style || o.options?.style)
|
|
423
440
|
}, null, 8, ["overrideStyleFunction"])) : d("", !0),
|
|
424
|
-
|
|
441
|
+
y(r(Ye), {
|
|
425
442
|
ref_for: !0,
|
|
426
443
|
ref: (n) => {
|
|
427
444
|
n && (R.value[o.identifier] = n);
|
|
428
445
|
}
|
|
429
446
|
}, {
|
|
430
|
-
default:
|
|
431
|
-
(
|
|
447
|
+
default: L(() => [
|
|
448
|
+
(a(!0), k(Y, null, re(o.options?.features, (n, s) => (a(), f(r(Ue), {
|
|
432
449
|
key: `${o.identifier}-${s}`,
|
|
433
450
|
properties: n.properties || {}
|
|
434
451
|
}, {
|
|
435
|
-
default:
|
|
436
|
-
n.type === "Point" ? (
|
|
452
|
+
default: L(() => [
|
|
453
|
+
n.type === "Point" ? (a(), f(r(qe), {
|
|
437
454
|
key: 0,
|
|
438
455
|
coordinates: n.coordinates
|
|
439
456
|
}, null, 8, ["coordinates"])) : d("", !0),
|
|
440
|
-
n.type === "Polygon" ? (
|
|
457
|
+
n.type === "Polygon" ? (a(), f(r(Je), {
|
|
441
458
|
key: 1,
|
|
442
459
|
coordinates: n.coordinates
|
|
443
460
|
}, null, 8, ["coordinates"])) : d("", !0)
|
|
444
461
|
]),
|
|
445
462
|
_: 2
|
|
446
463
|
}, 1032, ["properties"]))), 128)),
|
|
447
|
-
i.interactions?.modify?.enabled && i.interactions.modify.layer === o.identifier
|
|
464
|
+
i.interactions?.modify?.enabled && i.interactions.modify.layer === o.identifier ? (a(), f(r(Xe), {
|
|
448
465
|
key: 0,
|
|
449
|
-
features:
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
466
|
+
features: ye.value,
|
|
467
|
+
condition: Pe,
|
|
468
|
+
pixelTolerance: i.interactions.modify.pixelTolerance,
|
|
469
|
+
onModifystart: Ae,
|
|
470
|
+
onModifyend: Be
|
|
471
|
+
}, {
|
|
472
|
+
default: L(() => [
|
|
473
|
+
y(r(ce), { overrideStyleFunction: Ce })
|
|
474
|
+
]),
|
|
475
|
+
_: 1
|
|
476
|
+
}, 8, ["features", "pixelTolerance"])) : d("", !0),
|
|
477
|
+
i.interactions?.snap?.enabled && i.interactions?.modify?.enabled && i.interactions?.modify?.layer === o.identifier && R.value[i.interactions.snap.targetLayer]?.source ? (a(), f(r(Ee), {
|
|
454
478
|
key: `snap-${o.identifier}-${i.interactions?.snap?.enabled}-${i.interactions?.modify?.enabled}`,
|
|
455
479
|
source: R.value[i.interactions.snap.targetLayer]?.source,
|
|
456
480
|
pixelTolerance: i.interactions?.snap?.pixelTolerance || 8
|
|
@@ -462,24 +486,24 @@ const at = { class: "map-container" }, ct = { class: "modify-overlay" }, ut = {
|
|
|
462
486
|
_: 2
|
|
463
487
|
}, 1032, ["zIndex", "properties"])) : d("", !0)
|
|
464
488
|
], 64))), 128)),
|
|
465
|
-
|
|
489
|
+
A.value && I.value ? (a(), f(r(Ke), {
|
|
466
490
|
key: 1,
|
|
467
|
-
position:
|
|
491
|
+
position: I.value,
|
|
468
492
|
positioning: "bottom-left",
|
|
469
493
|
offset: [10, -10],
|
|
470
494
|
stopEvent: !0
|
|
471
495
|
}, {
|
|
472
|
-
default:
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
496
|
+
default: L(() => [
|
|
497
|
+
v("div", gt, [
|
|
498
|
+
E.value ? (a(), k("div", bt, $e(E.value), 1)) : d("", !0),
|
|
499
|
+
v("div", { class: "modify-overlay-actions" }, [
|
|
500
|
+
v("button", {
|
|
477
501
|
class: "modify-btn modify-btn-cancel",
|
|
478
|
-
onClick:
|
|
502
|
+
onClick: We
|
|
479
503
|
}, " Annuleer "),
|
|
480
|
-
|
|
504
|
+
v("button", {
|
|
481
505
|
class: "modify-btn modify-btn-ok",
|
|
482
|
-
onClick:
|
|
506
|
+
onClick: Ve
|
|
483
507
|
}, " Bevestig ")
|
|
484
508
|
])
|
|
485
509
|
])
|
|
@@ -489,65 +513,65 @@ const at = { class: "map-container" }, ct = { class: "modify-overlay" }, ut = {
|
|
|
489
513
|
]),
|
|
490
514
|
_: 1
|
|
491
515
|
}, 512),
|
|
492
|
-
|
|
493
|
-
S.toggleableLayers && S.toggleableLayers.length > 0 ? (
|
|
494
|
-
|
|
495
|
-
class:
|
|
516
|
+
v("div", wt, [
|
|
517
|
+
S.toggleableLayers && S.toggleableLayers.length > 0 ? (a(), k("div", ht, [
|
|
518
|
+
v("button", {
|
|
519
|
+
class: se(["iconbutton", { isActive: x.value }]),
|
|
496
520
|
"aria-label": "Toon lagen",
|
|
497
|
-
"aria-expanded":
|
|
498
|
-
onClick:
|
|
521
|
+
"aria-expanded": x.value,
|
|
522
|
+
onClick: Le
|
|
499
523
|
}, [
|
|
500
|
-
|
|
501
|
-
], 10,
|
|
502
|
-
|
|
503
|
-
default:
|
|
504
|
-
|
|
524
|
+
y(r(ft))
|
|
525
|
+
], 10, Lt),
|
|
526
|
+
y(ae, { name: "fade" }, {
|
|
527
|
+
default: L(() => [
|
|
528
|
+
x.value ? (a(), f(yt, {
|
|
505
529
|
key: 0,
|
|
506
530
|
toggleableLayers: S.toggleableLayers || [],
|
|
507
|
-
visibleToggleableLayers:
|
|
508
|
-
onToggleLayer:
|
|
531
|
+
visibleToggleableLayers: C.value,
|
|
532
|
+
onToggleLayer: ke
|
|
509
533
|
}, null, 8, ["toggleableLayers", "visibleToggleableLayers"])) : d("", !0)
|
|
510
534
|
]),
|
|
511
535
|
_: 1
|
|
512
536
|
})
|
|
513
537
|
])) : d("", !0)
|
|
514
538
|
]),
|
|
515
|
-
|
|
516
|
-
i.baseLayers && i.baseLayers.length > 0 ? (
|
|
517
|
-
|
|
518
|
-
class:
|
|
539
|
+
v("div", kt, [
|
|
540
|
+
i.baseLayers && i.baseLayers.length > 0 ? (a(), k("div", St, [
|
|
541
|
+
v("button", {
|
|
542
|
+
class: se(["iconbutton", { isActive: _.value }]),
|
|
519
543
|
"aria-label": "Toon basislagen",
|
|
520
|
-
"aria-expanded":
|
|
521
|
-
onClick:
|
|
544
|
+
"aria-expanded": _.value,
|
|
545
|
+
onClick: he
|
|
522
546
|
}, [
|
|
523
|
-
|
|
524
|
-
], 10,
|
|
525
|
-
|
|
526
|
-
default:
|
|
527
|
-
|
|
547
|
+
y(r(ut))
|
|
548
|
+
], 10, Tt),
|
|
549
|
+
y(ae, { name: "fade" }, {
|
|
550
|
+
default: L(() => [
|
|
551
|
+
_.value ? (a(), f(mt, {
|
|
528
552
|
key: 0,
|
|
529
553
|
baseLayers: i.baseLayers,
|
|
530
|
-
selectedBaseLayerId:
|
|
531
|
-
onSelectBaseLayer:
|
|
554
|
+
selectedBaseLayerId: T.value,
|
|
555
|
+
onSelectBaseLayer: Se
|
|
532
556
|
}, null, 8, ["baseLayers", "selectedBaseLayerId"])) : d("", !0)
|
|
533
557
|
]),
|
|
534
558
|
_: 1
|
|
535
559
|
})
|
|
536
560
|
])) : d("", !0),
|
|
537
|
-
|
|
538
|
-
|
|
561
|
+
v("div", Ft, [
|
|
562
|
+
v("button", {
|
|
539
563
|
class: "iconbutton",
|
|
540
564
|
"aria-label": "Zoom in",
|
|
541
|
-
onClick:
|
|
565
|
+
onClick: Te
|
|
542
566
|
}, [
|
|
543
|
-
|
|
567
|
+
y(r(dt))
|
|
544
568
|
]),
|
|
545
|
-
|
|
569
|
+
v("button", {
|
|
546
570
|
class: "iconbutton",
|
|
547
571
|
"aria-label": "Zoom out",
|
|
548
|
-
onClick:
|
|
572
|
+
onClick: Fe
|
|
549
573
|
}, [
|
|
550
|
-
|
|
574
|
+
y(r(pt))
|
|
551
575
|
])
|
|
552
576
|
])
|
|
553
577
|
])
|
|
@@ -555,5 +579,5 @@ const at = { class: "map-container" }, ct = { class: "modify-overlay" }, ut = {
|
|
|
555
579
|
}
|
|
556
580
|
});
|
|
557
581
|
export {
|
|
558
|
-
|
|
582
|
+
qt as default
|
|
559
583
|
};
|
package/dist/style.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.wrapper[data-v-7a503b81]{position:absolute;bottom:100%;right:0;padding:8px 12px;background:#fff;border-radius:4px 4px 0;box-shadow:0 2px 8px #00000026;min-width:150px;z-index:1000;margin-bottom:8px}ul[data-v-7a503b81]{list-style:none;margin:0;padding:0}.layer[data-v-7a503b81]{position:relative;display:flex;margin-bottom:4px}.layer[data-v-7a503b81]:last-child{margin-bottom:0}.layer>input[data-v-7a503b81]{position:absolute;top:6px;left:0;width:12px;height:12px;margin:0;cursor:pointer}.layer>label[data-v-7a503b81]{display:block;position:relative;width:100%;cursor:pointer;padding:3px 0 3px 18px;-webkit-user-select:none;user-select:none;font-size:14px;white-space:nowrap}.wrapper[data-v-16f7d1b3]{position:absolute;bottom:100%;left:0;padding:12px;background:#fff;border-radius:4px 4px 4px 0;box-shadow:0 2px 8px #00000026;min-width:200px;z-index:1000;margin-bottom:8px}ul[data-v-16f7d1b3]{list-style:none;margin:0;padding:0}.layer[data-v-16f7d1b3]{margin-bottom:8px}.layer[data-v-16f7d1b3]:last-child{margin-bottom:0}.layer-control[data-v-16f7d1b3]{display:flex;align-items:center;cursor:pointer;gap:8px}.layer-checkbox[data-v-16f7d1b3]{flex-shrink:0}.layer-title[data-v-16f7d1b3]{font-size:14px;font-weight:500;color:#333;line-height:1.3}.map-container[data-v-
|
|
1
|
+
.wrapper[data-v-7a503b81]{position:absolute;bottom:100%;right:0;padding:8px 12px;background:#fff;border-radius:4px 4px 0;box-shadow:0 2px 8px #00000026;min-width:150px;z-index:1000;margin-bottom:8px}ul[data-v-7a503b81]{list-style:none;margin:0;padding:0}.layer[data-v-7a503b81]{position:relative;display:flex;margin-bottom:4px}.layer[data-v-7a503b81]:last-child{margin-bottom:0}.layer>input[data-v-7a503b81]{position:absolute;top:6px;left:0;width:12px;height:12px;margin:0;cursor:pointer}.layer>label[data-v-7a503b81]{display:block;position:relative;width:100%;cursor:pointer;padding:3px 0 3px 18px;-webkit-user-select:none;user-select:none;font-size:14px;white-space:nowrap}.wrapper[data-v-16f7d1b3]{position:absolute;bottom:100%;left:0;padding:12px;background:#fff;border-radius:4px 4px 4px 0;box-shadow:0 2px 8px #00000026;min-width:200px;z-index:1000;margin-bottom:8px}ul[data-v-16f7d1b3]{list-style:none;margin:0;padding:0}.layer[data-v-16f7d1b3]{margin-bottom:8px}.layer[data-v-16f7d1b3]:last-child{margin-bottom:0}.layer-control[data-v-16f7d1b3]{display:flex;align-items:center;cursor:pointer;gap:8px}.layer-checkbox[data-v-16f7d1b3]{flex-shrink:0}.layer-title[data-v-16f7d1b3]{font-size:14px;font-weight:500;color:#333;line-height:1.3}.map-container[data-v-1eba4e06]{position:relative;width:100%;height:100%}.bottom-right-panels[data-v-1eba4e06]{position:absolute;z-index:1;bottom:20px;right:20px;display:flex;flex-direction:column;gap:8px}.bottom-left-panels[data-v-1eba4e06]{position:absolute;z-index:1;bottom:20px;left:20px;display:flex;flex-direction:column;gap:8px}.zoom-panel[data-v-1eba4e06],.base-layers-control[data-v-1eba4e06],.layers-control[data-v-1eba4e06]{display:flex;flex-direction:column;background:#fff;border-radius:4px;box-shadow:0 1px 4px #0003;overflow:visible;position:relative}.iconbutton[data-v-1eba4e06]{width:30px;height:30px;border:none;background:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background-color .2s;padding:0}.iconbutton[data-v-1eba4e06]:hover{background:#f0f0f0}.iconbutton.isActive[data-v-1eba4e06]{background:#e6f3ff}.iconbutton[data-v-1eba4e06]:not(:last-child){border-bottom:1px solid #ddd}.fade-enter-active[data-v-1eba4e06],.fade-leave-active[data-v-1eba4e06]{transition:opacity .2s ease}.fade-enter-from[data-v-1eba4e06],.fade-leave-to[data-v-1eba4e06]{opacity:0}.modify-overlay[data-v-1eba4e06]{display:flex;flex-direction:column;align-items:stretch;gap:6px;background:#fff;padding:6px;border-radius:4px;box-shadow:0 2px 8px #0003;border:1px solid #ccc}.modify-overlay-label[data-v-1eba4e06]{max-width:220px;padding:0 6px;color:#333;font-size:12px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.modify-overlay-actions[data-v-1eba4e06]{display:flex;gap:4px}.modify-btn[data-v-1eba4e06]{padding:6px 12px;border:none;border-radius:3px;cursor:pointer;font-size:12px;font-weight:500;transition:background-color .2s}.modify-btn-ok[data-v-1eba4e06]{background:#4caf50;color:#fff}.modify-btn-ok[data-v-1eba4e06]:hover{background:#45a049}.modify-btn-cancel[data-v-1eba4e06]{background:#f44336;color:#fff}.modify-btn-cancel[data-v-1eba4e06]:hover{background:#da190b}
|