@edugis-org/webmapx 0.1.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.
Files changed (84) hide show
  1. package/README.md +149 -0
  2. package/dist-lib/WMTS-DCN4zX0-.js +1169 -0
  3. package/dist-lib/alert-GeHlqlN8.js +310 -0
  4. package/dist-lib/assets/epsg-lookup.worker-J7TVnHDq.js +1 -0
  5. package/dist-lib/assets/shapefile.worker-kQfZj6G2.js +4 -0
  6. package/dist-lib/attribution-format-B4f05_u0.js +62 -0
  7. package/dist-lib/button-DFdGkRPQ.js +741 -0
  8. package/dist-lib/cesium-adapter-BHXNytkU.js +1488 -0
  9. package/dist-lib/checkbox-QoR4S8tV.js +284 -0
  10. package/dist-lib/chunk-HEgqtunE.js +20 -0
  11. package/dist-lib/chunk.36O46B5H-B6ZL7Sm1.js +77 -0
  12. package/dist-lib/chunk.3RPBFEDE-BFO1fHVm.js +138 -0
  13. package/dist-lib/chunk.5JY5FUCG-DTXsslmx.js +1090 -0
  14. package/dist-lib/chunk.6CTB5ZDJ-DjZrBd6Y.js +99 -0
  15. package/dist-lib/chunk.AJ3ENQ5C-Ci7Gm2b6.js +175 -0
  16. package/dist-lib/chunk.LD4M4QGE-CiCfhE8r.js +8 -0
  17. package/dist-lib/chunk.NYIIDP5N-BikXIStD.js +99 -0
  18. package/dist-lib/chunk.RWUUFNUL-DFztA4uV.js +43 -0
  19. package/dist-lib/chunk.SI4ACBFK-CLb9VfMG.js +61 -0
  20. package/dist-lib/chunk.YHLNUJ7P-D-kanrCf.js +503 -0
  21. package/dist-lib/core-CMAlSR68.js +22 -0
  22. package/dist-lib/decorate-CWgUV1hU.js +1139 -0
  23. package/dist-lib/decorators-B35AgiCU.js +351 -0
  24. package/dist-lib/deferred-query-service-BJDcngw6.js +386 -0
  25. package/dist-lib/dist-Dm6b7XCs.js +12318 -0
  26. package/dist-lib/dist-Ha9LQCut.js +244 -0
  27. package/dist-lib/dist-c1PlDAd1.js +2359 -0
  28. package/dist-lib/dist-kKlmcBXq.js +50 -0
  29. package/dist-lib/divider-CPm675yY.js +41 -0
  30. package/dist-lib/dropped-config-C_GyVa8o.js +17 -0
  31. package/dist-lib/dropped-layer-builder-DAaYgUPk.js +396 -0
  32. package/dist-lib/epsg-definitions-BZLZWa8Q.js +668 -0
  33. package/dist-lib/esm-CTuscnN5.js +46 -0
  34. package/dist-lib/file-sniff-Dhxj3KTF.js +251 -0
  35. package/dist-lib/geo-calculations-DbFJAUoI.js +30 -0
  36. package/dist-lib/icon-CEOgWlro.js +9 -0
  37. package/dist-lib/icon-button-Da_nBTy3.js +408 -0
  38. package/dist-lib/input-CeGntPlT.js +590 -0
  39. package/dist-lib/layer-discovery-afWzu5hY.js +2825 -0
  40. package/dist-lib/leaflet-adapter-D9djjrKv.js +1227 -0
  41. package/dist-lib/lib-CdHVicAE.js +4074 -0
  42. package/dist-lib/map-layer-registry-2cmkiRDK.js +62 -0
  43. package/dist-lib/maplibre-adapter-TFc3e0G9.js +1190 -0
  44. package/dist-lib/maplibre-expression-evaluator-DCWUcpwf.js +7233 -0
  45. package/dist-lib/marker-utils-DztWXeop.js +12 -0
  46. package/dist-lib/ol-tilegrid-9VtyxaLG.js +64 -0
  47. package/dist-lib/openlayers-adapter-DVW1KCRv.js +13307 -0
  48. package/dist-lib/option-CBxl1mZP.js +1106 -0
  49. package/dist-lib/papaparse.min-B7v3c0D7.js +501 -0
  50. package/dist-lib/rbush-C8k41T4z.js +254 -0
  51. package/dist-lib/shapefile-SawVY6xg.js +207 -0
  52. package/dist-lib/spinner-DysxdNG9.js +6 -0
  53. package/dist-lib/src-CL94RDe3.js +111 -0
  54. package/dist-lib/throttle-BeneRNYK.js +16 -0
  55. package/dist-lib/toast-Cm28o9U6.js +15 -0
  56. package/dist-lib/togeojson.es-DAgiTBvg.js +579 -0
  57. package/dist-lib/tooltip-Cucn1SiD.js +197 -0
  58. package/dist-lib/webmapx-3d-tool-D4CTD2gB.js +176 -0
  59. package/dist-lib/webmapx-base-tool-Dm9NAWLD.js +75 -0
  60. package/dist-lib/webmapx-config-edit-tool-DCTyxqTk.js +389 -0
  61. package/dist-lib/webmapx-coordinates-tool-jeWohup9.js +648 -0
  62. package/dist-lib/webmapx-core-bundle-BDImi1RE.js +8203 -0
  63. package/dist-lib/webmapx-draw-tool-DooAV8cF.js +4336 -0
  64. package/dist-lib/webmapx-geolocation-tool-Rw3-Iad1.js +788 -0
  65. package/dist-lib/webmapx-import-layer-tool-DRYviHd5.js +250 -0
  66. package/dist-lib/webmapx-info-tool-BJA157cy.js +412 -0
  67. package/dist-lib/webmapx-language-osmvector-M5y_lwOg.js +489 -0
  68. package/dist-lib/webmapx-measure-tool-BXhMJFC6.js +590 -0
  69. package/dist-lib/webmapx-modal-tool-eF6Naluv.js +84 -0
  70. package/dist-lib/webmapx-plugin-tool-D2Hghf9n.js +45 -0
  71. package/dist-lib/webmapx-print-tool-ob1bOsR5.js +348 -0
  72. package/dist-lib/webmapx-search-tool-Cv8BrYvY.js +437 -0
  73. package/dist-lib/webmapx-settings-DDEJ8aoV.js +479 -0
  74. package/dist-lib/webmapx-truearea-tool-CMB4Orm-.js +615 -0
  75. package/dist-lib/webmapx-view-mode-tool-CUpLNjOj.js +106 -0
  76. package/dist-lib/webmapx.css +2 -0
  77. package/dist-lib/webmapx.js +1321 -0
  78. package/dist-lib/wms-feature-info-C0RVMEQC.js +145 -0
  79. package/dist-lib/wms-url-builder-DIJLQ1v2.js +54 -0
  80. package/dist-lib/zip.js-DVhmtjxZ.js +3615 -0
  81. package/package.json +107 -0
  82. package/public/data/country-epsg-codes.json +297 -0
  83. package/public/data/world-countries-simplified.topojson +1 -0
  84. package/src/locales/en/core.json +20 -0
@@ -0,0 +1,389 @@
1
+ import { r as e, t } from "./decorate-CWgUV1hU.js";
2
+ import { i as n, o as r } from "./decorators-B35AgiCU.js";
3
+ import "./icon-CEOgWlro.js";
4
+ import "./button-DFdGkRPQ.js";
5
+ import "./checkbox-QoR4S8tV.js";
6
+ import "./input-CeGntPlT.js";
7
+ import "./divider-CPm675yY.js";
8
+ import { LitElement as i, css as a, html as o } from "lit";
9
+ //#region src/utils/dynamic-layout.ts
10
+ var s = [
11
+ {
12
+ id: "search",
13
+ label: "Search",
14
+ icon: "search"
15
+ },
16
+ {
17
+ id: "layerTree",
18
+ label: "Catalog",
19
+ icon: "layers"
20
+ },
21
+ {
22
+ id: "measure",
23
+ label: "Measure",
24
+ icon: "rulers"
25
+ },
26
+ {
27
+ id: "info",
28
+ label: "Feature info",
29
+ icon: "info-circle"
30
+ },
31
+ {
32
+ id: "draw",
33
+ label: "Draw",
34
+ icon: "pencil"
35
+ },
36
+ {
37
+ id: "geolocation",
38
+ label: "Geolocation",
39
+ icon: "crosshair"
40
+ },
41
+ {
42
+ id: "view-mode",
43
+ label: "View mode",
44
+ icon: "globe"
45
+ },
46
+ {
47
+ id: "3d",
48
+ label: "3D",
49
+ icon: "box"
50
+ },
51
+ {
52
+ id: "importLayer",
53
+ label: "Import layer",
54
+ icon: "file-earmark-arrow-up"
55
+ },
56
+ {
57
+ id: "layerOverview",
58
+ label: "Legend",
59
+ icon: "card-list"
60
+ },
61
+ {
62
+ id: "maplanguage",
63
+ label: "Map language",
64
+ icon: "translate"
65
+ },
66
+ {
67
+ id: "print",
68
+ label: "Print",
69
+ icon: "printer"
70
+ },
71
+ {
72
+ id: "truearea",
73
+ label: "True Area",
74
+ icon: "bounding-box-circles"
75
+ },
76
+ {
77
+ id: "settings",
78
+ label: "Settings",
79
+ icon: "gear"
80
+ },
81
+ {
82
+ id: "navigation",
83
+ label: "Navigation",
84
+ icon: "compass"
85
+ },
86
+ {
87
+ id: "scale",
88
+ label: "Scale bar",
89
+ icon: "rulers"
90
+ },
91
+ {
92
+ id: "coordinates",
93
+ label: "Coordinates",
94
+ icon: "crosshair2"
95
+ },
96
+ {
97
+ id: "fullscreen",
98
+ label: "Fullscreen",
99
+ icon: "fullscreen"
100
+ },
101
+ {
102
+ id: "zoomLevel",
103
+ label: "Zoom level",
104
+ icon: "zoom-in"
105
+ },
106
+ {
107
+ id: "attribution",
108
+ label: "Attribution",
109
+ icon: "info-circle"
110
+ },
111
+ {
112
+ id: "insetMap",
113
+ label: "Inset map",
114
+ icon: "map"
115
+ }
116
+ ], c = new Set([
117
+ "configedit",
118
+ "config-edit",
119
+ "settings"
120
+ ]), l = {
121
+ layers: "layerTree",
122
+ catalog: "layerTree",
123
+ datacatalog: "layerTree",
124
+ "import-layer": "importLayer",
125
+ legend: "layerOverview",
126
+ geolocate: "geolocation"
127
+ };
128
+ function u(e) {
129
+ return l[e] ?? e;
130
+ }
131
+ function d(e, t) {
132
+ let n = e.tools ?? {};
133
+ for (let [e, r] of Object.entries(n)) if (u(e) === t) return r?.enabled !== !1;
134
+ for (let e of Object.values(n)) {
135
+ let n = e?.items;
136
+ if (Array.isArray(n)) for (let e of n) {
137
+ let n = e;
138
+ if (u(String(n.id ?? n.type ?? "")) === t) return n.enabled !== !1;
139
+ }
140
+ }
141
+ return null;
142
+ }
143
+ function f(e, t, n, r, i, a, o, s, l) {
144
+ let d = /* @__PURE__ */ new Set(), f = null, p = {};
145
+ for (let [n, r] of Object.entries(e.tools ?? {})) {
146
+ let e = r ?? {}, i = u(n);
147
+ if (c.has(n) || c.has(i)) p[n] = {
148
+ ...e,
149
+ enabled: !1
150
+ }, d.add(i);
151
+ else if (Array.isArray(e.items)) {
152
+ f ||= n;
153
+ let r = e.items.map((e) => {
154
+ let n = e, r = u(String(n.id ?? n.type ?? ""));
155
+ return c.has(r) ? (d.add(r), {
156
+ ...n,
157
+ enabled: !1
158
+ }) : t.has(r) ? (d.add(r), {
159
+ ...n,
160
+ enabled: t.get(r)
161
+ }) : e;
162
+ });
163
+ p[n] = {
164
+ ...e,
165
+ items: r
166
+ };
167
+ } else t.has(i) ? (d.add(i), p[n] = {
168
+ ...e,
169
+ enabled: t.get(i)
170
+ }) : p[n] = r;
171
+ }
172
+ let m = Array.from(t.entries()).filter(([e, t]) => t === !0 && !d.has(e) && !c.has(e));
173
+ if (m.length > 0 && f) {
174
+ let e = p[f], t = [...e.items ?? []];
175
+ for (let [e] of m) t.push({
176
+ id: e,
177
+ type: e,
178
+ enabled: !0
179
+ });
180
+ p[f] = {
181
+ ...e,
182
+ items: t
183
+ };
184
+ }
185
+ let h = l ?? /* @__PURE__ */ new Set(), g = h.size > 0 ? (() => {
186
+ let t = (e.layerData?.layers ?? []).filter((e) => !h.has(e.id)), n = new Set(t.map((e) => e.source).filter(Boolean)), r = (e.layerData?.sources ?? []).filter((e) => n.has(e.id));
187
+ return {
188
+ ...e.layerData,
189
+ layers: t,
190
+ sources: r
191
+ };
192
+ })() : e.layerData, _ = e.project, v = s?.trim() ? {
193
+ ..._,
194
+ title: s.trim(),
195
+ id: s.trim().toLowerCase().replace(/[^a-z0-9]+/g, "_").replace(/^_|_$/g, "") || "config"
196
+ } : _, y = a ? {
197
+ ...e.map,
198
+ center: a.center,
199
+ zoom: Math.round(a.zoom * 100) / 100,
200
+ ...a.bearing === 0 ? { bearing: void 0 } : { bearing: Math.round(a.bearing * 10) / 10 },
201
+ ...a.pitch === 0 ? { pitch: void 0 } : { pitch: Math.round(a.pitch * 10) / 10 },
202
+ ...o && o !== "mercator" ? { projection: o } : { projection: void 0 }
203
+ } : e.map, b = [...i && !h.has(i) ? [i] : [], ...r.filter((e) => !h.has(e))], x = {
204
+ ...e.state,
205
+ activeLayers: b.map((e) => ({
206
+ ref: e,
207
+ visible: !0
208
+ })),
209
+ ...i ? { activeBackground: i } : {}
210
+ };
211
+ if (!n) return {
212
+ ...e,
213
+ project: v,
214
+ map: y,
215
+ layerData: g,
216
+ tools: p,
217
+ state: x
218
+ };
219
+ let S = new Set(r);
220
+ i && S.add(i);
221
+ let C = (e.layerData?.layers ?? []).filter((e) => S.has(e.id)), w = new Set(C.map((e) => e.source).filter(Boolean)), T = (e.layerData?.sources ?? []).filter((e) => w.has(e.id)), E = {
222
+ ...e.layerData,
223
+ layers: C,
224
+ sources: T
225
+ }, D = (e) => {
226
+ let t = [];
227
+ for (let n of e) {
228
+ let e = n;
229
+ if (e.layerId) S.has(e.layerId) && !h.has(e.layerId) && t.push(n);
230
+ else if (Array.isArray(e.children)) {
231
+ let n = D(e.children);
232
+ n.length > 0 && t.push({
233
+ ...e,
234
+ children: n
235
+ });
236
+ }
237
+ }
238
+ return t;
239
+ }, O = {};
240
+ for (let [e, t] of Object.entries(p)) {
241
+ let n = t;
242
+ Array.isArray(n?.items) ? O[e] = {
243
+ ...n,
244
+ items: n.items.map((e) => {
245
+ let t = e;
246
+ return Array.isArray(t.tree) ? {
247
+ ...t,
248
+ tree: D(t.tree)
249
+ } : e;
250
+ })
251
+ } : O[e] = t;
252
+ }
253
+ return {
254
+ ...e,
255
+ project: v,
256
+ map: y,
257
+ tools: O,
258
+ layerData: E,
259
+ state: x
260
+ };
261
+ }
262
+ var p = class extends i {
263
+ constructor(...e) {
264
+ super(...e), this.toolEnabled = /* @__PURE__ */ new Map(), this.onlyActiveLayers = !1, this.removeUnsupported = !1, this.projectTitle = "", this.filename = "config.json";
265
+ }
266
+ static {
267
+ this.styles = a`
268
+ :host { display: block; padding: 0.75rem; box-sizing: border-box; min-width: 220px; }
269
+ h4 { margin: 0 0 0.6rem; font-size: 0.85rem; font-weight: 600; display: flex; align-items: center; gap: 0.4rem; }
270
+ .section-label { font-size: 0.78rem; font-weight: 600; color: var(--sl-color-neutral-600); margin: 0.6rem 0 0.3rem; }
271
+ .tool-list { display: flex; flex-direction: column; gap: 0.15rem; }
272
+ sl-checkbox::part(label) { font-size: 0.82rem; }
273
+ sl-input { margin-top: 0.6rem; }
274
+ sl-button { margin-top: 0.5rem; width: 100%; }
275
+ `;
276
+ }
277
+ get mapElement() {
278
+ return e(this);
279
+ }
280
+ connectedCallback() {
281
+ super.connectedCallback(), this.loadFromConfig();
282
+ }
283
+ loadFromConfig() {
284
+ let e = this.mapElement?.config, t = /* @__PURE__ */ new Map();
285
+ for (let { id: n } of s) c.has(n) || t.set(n, d(e ?? {}, n));
286
+ this.toolEnabled = t;
287
+ let n = e?.project;
288
+ this.projectTitle = typeof n?.title == "string" ? n.title : "";
289
+ let r = (typeof n?.id == "string" ? n.id : "config").toLowerCase().replace(/[^a-z0-9]+/g, "_").replace(/^_|_$/g, "") || "config";
290
+ this.filename = `${r}.json`;
291
+ }
292
+ handleTitleInput(e) {
293
+ this.projectTitle = e.target.value;
294
+ let t = this.projectTitle.trim().toLowerCase().replace(/[^a-z0-9]+/g, "_").replace(/^_|_$/g, "") || "config";
295
+ this.filename = `${t}.json`;
296
+ }
297
+ toggle(e, t) {
298
+ this.toolEnabled = new Map(this.toolEnabled).set(e, t);
299
+ }
300
+ async handleDownload() {
301
+ let e = this.mapElement, t = e?.config;
302
+ if (!t) return;
303
+ let n = e?.adapter, r = n?.store?.getState?.()?.mapLayers ?? {}, i = n?.getViewportState?.(), a = n?.getProjection?.()?.name ?? null, o = [], s;
304
+ for (let [e, t] of Object.entries(r)) t?.visible !== !1 && (t?.legendRole === "background" ? s = e : o.push(e));
305
+ let c = /* @__PURE__ */ new Set(), l;
306
+ if (this.removeUnsupported) {
307
+ let n = (t) => e?.isCatalogLayerSupported?.(t) ?? Promise.resolve(!0), r = await Promise.all((t.layerData?.layers ?? []).map(async (e) => {
308
+ let t = e.id;
309
+ return await n(t) ? null : t;
310
+ }));
311
+ if (c = new Set(r.filter((e) => e !== null)), s && c.has(s)) {
312
+ let e = (t.layerData?.layers ?? []).find((e) => e.id === s)?.singleGroup;
313
+ if (e) for (let n of t.layerData?.layers ?? []) {
314
+ let t = n;
315
+ if (t.singleGroup === e && !c.has(t.id)) {
316
+ l = t.id;
317
+ break;
318
+ }
319
+ }
320
+ if (!l) {
321
+ let { showToast: e } = await import("./toast-Cm28o9U6.js").then((e) => e.n);
322
+ e("<strong>No supported background layer available</strong><br>All background layers are unsupported by the current engine. Uncheck \"Remove engine-unsupported layers\" or switch engine.", { variant: "danger" });
323
+ return;
324
+ }
325
+ }
326
+ }
327
+ let u = /* @__PURE__ */ new Map();
328
+ for (let [e, t] of this.toolEnabled) t !== null && u.set(e, t);
329
+ let d = s && c.has(s) ? l : s, p = f(t, u, this.onlyActiveLayers, o, d, i, a, this.projectTitle, c), m = new Blob([JSON.stringify(p, null, 2)], { type: "application/json" }), h = URL.createObjectURL(m);
330
+ Object.assign(document.createElement("a"), {
331
+ href: h,
332
+ download: this.filename || "config.json"
333
+ }).click(), URL.revokeObjectURL(h);
334
+ }
335
+ render() {
336
+ let e = s.filter((e) => !c.has(e.id));
337
+ return o`
338
+ <h4><sl-icon name="pencil-square"></sl-icon> Edit config</h4>
339
+
340
+ <sl-input size="small" label="Project title" required
341
+ ?invalid=${!this.projectTitle.trim()}
342
+ help-text=${this.projectTitle.trim() ? "" : "Title is required"}
343
+ .value=${this.projectTitle}
344
+ @sl-input=${this.handleTitleInput}>
345
+ </sl-input>
346
+
347
+ <sl-checkbox
348
+ ?checked=${this.onlyActiveLayers}
349
+ @sl-change=${(e) => {
350
+ this.onlyActiveLayers = e.target.checked;
351
+ }}>
352
+ Only active layers
353
+ </sl-checkbox>
354
+ <sl-checkbox
355
+ ?checked=${this.removeUnsupported}
356
+ @sl-change=${(e) => {
357
+ this.removeUnsupported = e.target.checked;
358
+ }}>
359
+ Remove engine-unsupported layers
360
+ </sl-checkbox>
361
+
362
+ <div class="section-label">Visible tools:</div>
363
+ <div class="tool-list">
364
+ ${e.map((e) => o`
365
+ <sl-checkbox
366
+ ?checked=${this.toolEnabled.get(e.id) === !0}
367
+ @sl-change=${(t) => this.toggle(e.id, t.target.checked)}>
368
+ ${e.label}
369
+ </sl-checkbox>
370
+ `)}
371
+ </div>
372
+
373
+ <sl-input size="small" label="Filename"
374
+ .value=${this.filename}
375
+ @sl-input=${(e) => {
376
+ this.filename = e.target.value;
377
+ }}>
378
+ </sl-input>
379
+
380
+ <sl-button variant="primary" ?disabled=${!this.projectTitle.trim()} @click=${this.handleDownload}>
381
+ <sl-icon slot="prefix" name="download"></sl-icon>
382
+ Download config
383
+ </sl-button>
384
+ `;
385
+ }
386
+ };
387
+ t([n()], p.prototype, "toolEnabled", void 0), t([n()], p.prototype, "onlyActiveLayers", void 0), t([n()], p.prototype, "removeUnsupported", void 0), t([n()], p.prototype, "projectTitle", void 0), t([n()], p.prototype, "filename", void 0), p = t([r("webmapx-config-edit-tool")], p);
388
+ //#endregion
389
+ export { p as WebmapxConfigEditTool };