@eodash/eodash 5.7.1 → 5.8.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 (66) hide show
  1. package/core/client/eodashSTAC/EodashCollection.js +14 -5
  2. package/core/client/eodashSTAC/createLayers.js +193 -80
  3. package/core/client/eodashSTAC/helpers.js +330 -39
  4. package/core/client/eodashSTAC/mosaic.js +10 -4
  5. package/core/client/store/stac.js +29 -0
  6. package/core/client/types.ts +5 -0
  7. package/dist/client/{DashboardLayout-ePbdvUTE.js → DashboardLayout-DEs4f_Vy.js} +2 -2
  8. package/dist/client/{DynamicWebComponent-g5SdRbjY.js → DynamicWebComponent-PvnV88BA.js} +1 -1
  9. package/dist/client/EodashChart-D-3AGKZY.js +260 -0
  10. package/dist/client/{EodashDatePicker-CY1TrsDo.js → EodashDatePicker-Dm_goZzs.js} +3 -3
  11. package/dist/client/{EodashItemFilter-DzshHDlS.js → EodashItemFilter-CJy3zYzD.js} +2 -2
  12. package/dist/client/{EodashLayerControl-DMCeMkSd.js → EodashLayerControl-rL8UnpkA.js} +11 -19
  13. package/dist/client/{EodashLayoutSwitcher-iJ8mX1rF.js → EodashLayoutSwitcher-ZRlESI9O.js} +3 -3
  14. package/dist/client/{EodashMapBtns-C7Cr7q5Y.js → EodashMapBtns-CG7u2Aq8.js} +34 -33
  15. package/dist/client/{EodashStacInfo-K7-iuXa7.js → EodashStacInfo-CJhhxthD.js} +2 -2
  16. package/dist/client/{EodashTools-BEK7e7JM.js → EodashTools-CWyK8QJT.js} +4 -4
  17. package/dist/client/{ExportState-CqIzfMYQ.js → ExportState-BXhy5TOU.js} +19 -11
  18. package/dist/client/{Footer-1P0cmBOZ.js → Footer-DZPvnhcT.js} +1 -1
  19. package/dist/client/{Header-CkkBaBNh.js → Header-CiGsDE_a.js} +2 -2
  20. package/dist/client/{MobileLayout-BPf49kDU.js → MobileLayout-BJHW7x5V.js} +2 -2
  21. package/dist/client/{PopUp-DPZq5SWI.js → PopUp-7_XnhvCc.js} +3 -3
  22. package/dist/client/{ProcessList-DuI6WpS1.js → ProcessList-LL_UCbvc.js} +4 -4
  23. package/dist/client/{VDivider-Bj9LG_JV.js → VDivider-DWYM0WUr.js} +2 -2
  24. package/dist/client/{VImg-Ddv5OyMz.js → VImg-B75dgw2K.js} +2 -2
  25. package/dist/client/{VMain-7yqk_qC3.js → VMain-DvMmOL4f.js} +1 -1
  26. package/dist/client/{VTooltip-2hAJyEoa.js → VTooltip-ClWHUmWL.js} +2 -2
  27. package/dist/client/{WidgetsContainer-2DOrlwCB.js → WidgetsContainer-BqaWs4ch.js} +1 -1
  28. package/dist/client/{asWebComponent-BlFN2lkB.js → asWebComponent-IZanwL-A.js} +239 -91
  29. package/dist/client/{async-B2H8ZwUK.js → async-CiNIOBVz.js} +31 -29
  30. package/dist/client/{create-layers-config-u_vn5hPk.js → create-layers-config-3S3y_kZg.js} +1 -1
  31. package/dist/client/{dialog-transition-BrMkMiNa.js → dialog-transition-c4ZSnzac.js} +2 -2
  32. package/dist/client/eo-dash.js +1 -1
  33. package/dist/client/{forwardRefs-DAlror6d.js → forwardRefs-B-c1_6yo.js} +2 -2
  34. package/dist/client/{handling-B6I1V5eG.js → handling-NvY8Csry.js} +3 -4
  35. package/dist/client/{helpers-CBqIUSXJ.js → helpers-BFuh19CP.js} +328 -40
  36. package/dist/client/{index-DhKU6KqM.js → index-1wMAyuNL.js} +17 -9
  37. package/dist/client/{index-DXLz4sFR.js → index-B8jGJSTA.js} +4 -4
  38. package/dist/client/{index-DjQlbWbJ.js → index-BKQQJkhy.js} +166 -61
  39. package/dist/client/{index-BWq1ZKaV.js → index-D0jUyol8.js} +10 -11
  40. package/dist/client/{index-CJ9UI3ln.js → index-KGxz5Egv.js} +2 -2
  41. package/dist/client/{mosaic-BFYLEwyx.js → mosaic-vHvSuih6.js} +10 -6
  42. package/dist/client/templates.js +6 -7
  43. package/dist/client/{transition-D_W6Wn9v.js → transition-BkyUsZh_.js} +1 -1
  44. package/dist/types/core/client/eodashSTAC/helpers.d.ts +47 -7
  45. package/dist/types/core/client/store/stac.d.ts +8 -2
  46. package/dist/types/core/client/types.d.ts +5 -0
  47. package/dist/types/templates/explore.d.ts +1 -0
  48. package/dist/types/widgets/EodashProcess/methods/custom-endpoints/layers/eoxhub-workspaces-endpoint.d.ts +1 -1
  49. package/package.json +5 -5
  50. package/templates/baseConfig.js +2 -1
  51. package/templates/compare.js +0 -1
  52. package/templates/expert.js +2 -3
  53. package/templates/explore.js +1 -0
  54. package/templates/lite.js +0 -1
  55. package/widgets/EodashChart.vue +161 -21
  56. package/widgets/EodashItemCatalog/methods/map.js +0 -1
  57. package/widgets/EodashLayerControl.vue +10 -15
  58. package/widgets/EodashMap/index.vue +3 -1
  59. package/widgets/EodashMap/methods/btns.js +27 -26
  60. package/widgets/EodashMap/methods/use-map-loading.js +8 -2
  61. package/widgets/EodashProcess/index.vue +135 -16
  62. package/widgets/EodashProcess/methods/composables.js +13 -0
  63. package/widgets/EodashProcess/methods/outputs.js +0 -1
  64. package/widgets/EodashProcess/methods/utils.js +29 -27
  65. package/widgets/ExportState.vue +13 -4
  66. package/dist/client/EodashChart-ChrkA5oS.js +0 -145
@@ -0,0 +1,260 @@
1
+ import { computed, ref, watch, nextTick, useTemplateRef, onMounted, onBeforeUnmount, openBlock, createElementBlock, createElementVNode, normalizeStyle, withDirectives, unref, createCommentVNode, toRaw } from 'vue';
2
+ import '@eox/chart';
3
+ import { o as onChartClick } from './handling-NvY8Csry.js';
4
+ import { ah as compareChartData, ai as chartData, $ as compareChartSpec, _ as chartSpec, Z as areChartsSeparateLayout } from './helpers-BFuh19CP.js';
5
+ import { _ as _export_sfc, ad as getOverlayParent } from './asWebComponent-IZanwL-A.js';
6
+ import { mdiArrowCollapse, mdiArrowExpand } from '@mdi/js';
7
+ import { T as Tooltip } from './index-KGxz5Egv.js';
8
+
9
+ const _style_0 = ".bg-surface:has(.eodash-chart-wrapper){height:100%;display:flex;flex-direction:column}";
10
+
11
+ const _style_1 = ".eodash-chart-wrapper[data-v-29f0a1a6]{height:100%;flex-grow:1;min-height:180px;display:flex;flex-direction:column}.chart-frame[data-v-29f0a1a6]{position:relative;flex-grow:1;min-height:180px;display:flex;flex-direction:column}eox-chart[data-v-29f0a1a6]{flex-grow:1;min-height:0}.chart-toggle[data-v-29f0a1a6]{position:absolute;top:8px;right:46px;z-index:2;cursor:pointer}";
12
+
13
+ const _hoisted_1 = {
14
+ ref: "container",
15
+ class: "eodash-chart-wrapper"
16
+ };
17
+ const _hoisted_2 = {
18
+ viewBox: "0 0 20 20",
19
+ width: "20",
20
+ height: "20",
21
+ "aria-hidden": "true"
22
+ };
23
+ const _hoisted_3 = ["d"];
24
+ const _hoisted_4 = [".spec", ".dataValues", ".opt"];
25
+
26
+
27
+ const _sfc_main = {
28
+ __name: 'EodashChart',
29
+ props: {
30
+ enableCompare: {
31
+ type: Boolean,
32
+ default: false,
33
+ },
34
+ vegaEmbedOptions: {
35
+ /** @type {import("vue").PropType<import("vega-embed").EmbedOptions>} */
36
+ type: Object,
37
+ default() {
38
+ return { actions: true };
39
+ },
40
+ },
41
+ },
42
+ setup(__props) {
43
+
44
+
45
+
46
+ const usedChartData = computed(() => {
47
+ return __props.enableCompare ? compareChartData.value : chartData.value;
48
+ });
49
+
50
+ const usedChartSpec = computed(() => {
51
+ return __props.enableCompare ? compareChartSpec.value : chartSpec.value;
52
+ });
53
+
54
+ const hasBindings = computed(() => {
55
+ const spec = usedChartSpec.value;
56
+ if (!spec) return false;
57
+
58
+ // Recursively search for any object with a 'bind' key that represents a physical UI input
59
+ let found = false;
60
+ /** @param {any} obj */
61
+ const searchBindings = (obj) => {
62
+ if (found || !obj || typeof obj !== "object") return;
63
+
64
+ // UI bindings that take up physical DOM space are objects with an 'input' property.
65
+ if (
66
+ "bind" in obj &&
67
+ typeof obj.bind === "object" &&
68
+ obj.bind !== null &&
69
+ "input" in obj.bind
70
+ ) {
71
+ found = true;
72
+ return;
73
+ }
74
+ Object.values(obj).forEach(searchBindings);
75
+ };
76
+ searchBindings(spec);
77
+ return found;
78
+ });
79
+
80
+ const renderedChartSpec = ref(null);
81
+
82
+ watch(
83
+ usedChartSpec,
84
+ (newSpec) => {
85
+ if (!newSpec) {
86
+ renderedChartSpec.value = null;
87
+ return;
88
+ }
89
+
90
+ // Create a deep copy so we can safely mutate it
91
+ const adjustedSpec = JSON.parse(JSON.stringify(newSpec));
92
+
93
+ // Force the chart to be fully responsive to its CSS container
94
+ adjustedSpec.height = "container";
95
+ adjustedSpec.width = "container";
96
+
97
+ // Delay passing the spec to eox-chart until the next DOM update cycle.
98
+ // This ensures the dynamic chartStyles are physically applied
99
+ // to the container BEFORE Vega calculates its canvas size.
100
+ nextTick(() => {
101
+ renderedChartSpec.value = adjustedSpec;
102
+ chartRenderKey.value = Math.random(); // Force eox-chart to completely remount
103
+
104
+ // Force a browser-level resize event after the chart mounts.
105
+ // This tells Vega to re-read the container dimensions once the CSS has finished painting.
106
+ setTimeout(() => {
107
+ window.dispatchEvent(new Event("resize"));
108
+ }, 150);
109
+ });
110
+ },
111
+ { immediate: true },
112
+ );
113
+
114
+ const chartRenderKey = ref(0);
115
+ const containerEl = useTemplateRef("container");
116
+
117
+ /** @type {MutationObserver | null} */
118
+ let observer = null;
119
+ /** @type {number | null} */
120
+ let styleInterval = null;
121
+
122
+ onMounted(() => {
123
+ const el = containerEl.value;
124
+ if (!el) return;
125
+
126
+ // Continuously inject basic styling for the bindings form to make it look decent
127
+ styleInterval = window.setInterval(() => {
128
+ if (el) {
129
+ const eoxChart = el.querySelector("eox-chart");
130
+ if (eoxChart && eoxChart.shadowRoot) {
131
+ if (!eoxChart.shadowRoot.querySelector("#eodash-chart-styles")) {
132
+ const style = document.createElement("style");
133
+ style.id = "eodash-chart-styles";
134
+ style.innerHTML = `
135
+ * {
136
+ box-sizing: border-box !important;
137
+ }
138
+ #vis {
139
+ min-height: 100px !important;
140
+ flex: 1 1 auto !important;
141
+ }
142
+ :host, .vega-embed {
143
+ display: flex !important;
144
+ flex-direction: column !important;
145
+ height: 100% !important;
146
+ padding: 0 !important;
147
+ margin: 0 !important;
148
+ }
149
+ .vega-bindings {
150
+ flex: 0 0 auto !important;
151
+ display: flex !important;
152
+ flex-wrap: wrap;
153
+ gap: 2px !important;
154
+ background: rgba(255, 255, 255, 0.85);
155
+ padding: 6px 12px !important;
156
+ border-radius: 6px;
157
+ box-shadow: 0 2px 5px rgba(0,0,0,0.15);
158
+ margin: 0 !important;
159
+ margin-top: -10px !important;
160
+ z-index: 10;
161
+ }
162
+ .vega-bindings:empty {
163
+ display: none !important;
164
+ }
165
+ .vega-embed > canvas, .vega-embed > svg {
166
+ height: 100% !important;
167
+ max-width: 100% !important;
168
+ object-fit: contain;
169
+ }
170
+ .vega-bind {
171
+ display: flex;
172
+ align-items: center;
173
+ gap: 6px;
174
+ margin-bottom: 0 !important;
175
+ }
176
+ `;
177
+ eoxChart.shadowRoot.appendChild(style);
178
+ }
179
+ }
180
+ }
181
+ }, 200);
182
+
183
+ // For mobile view, handle overlay display changes
184
+ const overlay = getOverlayParent(el);
185
+ if (!overlay) return;
186
+
187
+ observer = new MutationObserver(async () => {
188
+ const style = getComputedStyle(overlay);
189
+ const visible = style.display !== "none";
190
+ if (visible) {
191
+ chartRenderKey.value = Math.random();
192
+ }
193
+ });
194
+
195
+ observer.observe(overlay, {
196
+ attributes: true,
197
+ attributeFilter: ["style", "class"],
198
+ });
199
+ });
200
+
201
+ onBeforeUnmount(() => {
202
+ observer?.disconnect();
203
+ if (styleInterval) window.clearInterval(styleInterval);
204
+ });
205
+
206
+ const chartStyles = computed(() => {
207
+ return {
208
+ height: "100%",
209
+ width: "100%",
210
+ };
211
+ });
212
+
213
+ const toggleIcon = computed(() =>
214
+ areChartsSeparateLayout.value ? mdiArrowCollapse : mdiArrowExpand,
215
+ );
216
+
217
+ function toggleLayout() {
218
+ areChartsSeparateLayout.value = !areChartsSeparateLayout.value;
219
+ }
220
+
221
+ return (_ctx, _cache) => {
222
+
223
+
224
+ return (openBlock(), createElementBlock("div", _hoisted_1, [
225
+ createElementVNode("div", {
226
+ class: "chart-frame",
227
+ style: normalizeStyle({ paddingBottom: hasBindings.value ? '25px' : '0px' })
228
+ }, [
229
+ (usedChartData.value && usedChartSpec.value)
230
+ ? withDirectives((openBlock(), createElementBlock("button", {
231
+ key: 0,
232
+ class: "chart-toggle",
233
+ onClick: toggleLayout
234
+ }, [
235
+ (openBlock(), createElementBlock("svg", _hoisted_2, [
236
+ createElementVNode("path", { d: toggleIcon.value }, null, 8 /* PROPS */, _hoisted_3)
237
+ ]))
238
+ ])), [
239
+ [Tooltip, unref(areChartsSeparateLayout) ? 'Minimize' : 'Maximize']
240
+ ])
241
+ : createCommentVNode("v-if", true),
242
+ (usedChartData.value && renderedChartSpec.value)
243
+ ? (openBlock(), createElementBlock("eox-chart", {
244
+ ".spec": toRaw(renderedChartSpec.value),
245
+ key: chartRenderKey.value,
246
+ ".dataValues": toRaw(usedChartData.value),
247
+ "onClick:item": _cache[0] || (_cache[0] = (...args) => (unref(onChartClick) && unref(onChartClick)(...args))),
248
+ style: normalizeStyle(chartStyles.value),
249
+ ".opt": __props.vegaEmbedOptions
250
+ }, null, 44 /* STYLE, PROPS, NEED_HYDRATION */, _hoisted_4))
251
+ : createCommentVNode("v-if", true)
252
+ ], 4 /* STYLE */)
253
+ ], 512 /* NEED_PATCH */))
254
+ }
255
+ }
256
+
257
+ };
258
+ const EodashChart = /*#__PURE__*/_export_sfc(_sfc_main, [['styles',[_style_0,_style_1]],['__scopeId',"data-v-29f0a1a6"]]);
259
+
260
+ export { EodashChart as default };
@@ -1,11 +1,11 @@
1
1
  import { useCssVars, useTemplateRef, customRef, ref, computed, reactive, watch, onMounted, openBlock, createElementBlock, createVNode, unref, createSlots, withCtx, createElementVNode, withDirectives, createBlock, createCommentVNode, mergeProps, toHandlers } from 'vue';
2
2
  import { DatePicker } from 'v-calendar';
3
- import { _ as _export_sfc, G as useDisplay, H as useSTAcStore, I as useTransparentPanel, J as VBtn, K as VIcon } from './asWebComponent-BlFN2lkB.js';
4
- import { H as datetime, S as eodashCollections, P as eodashCompareCollections } from './helpers-CBqIUSXJ.js';
3
+ import { _ as _export_sfc, G as useDisplay, H as useSTAcStore, I as useTransparentPanel, J as VBtn, K as VIcon } from './asWebComponent-IZanwL-A.js';
4
+ import { L as datetime, W as eodashCollections, T as eodashCompareCollections } from './helpers-BFuh19CP.js';
5
5
  import { mdiRayEndArrow, mdiRayStartArrow } from '@mdi/js';
6
6
  import log from 'loglevel';
7
7
  import { storeToRefs } from 'pinia';
8
- import { T as Tooltip } from './index-CJ9UI3ln.js';
8
+ import { T as Tooltip } from './index-KGxz5Egv.js';
9
9
 
10
10
  const _style_0 = ".vc-popover-content{--vc-nav-hover-bg: rgba(var(--v-theme-on-surface), .1);--vc-nav-item-active-color: rgb(var(--v-theme-on-secondary));--vc-nav-item-active-bg: rgba(var(--v-theme-secondary), .8);--vc-focus-ring: 0 0 0 2px rgba(var(--v-theme-secondary), .5)}.vc-container{--vc-day-content-hover-bg: rgba(var(--v-theme-on-surface), .2);--vc-focus-ring: 0 0 0 2px rgba(var(--v-theme-secondary), .4);--vc-header-arrow-hover-bg: rgba(var(--v-theme-secondary), .1)}.vc-attr{--vc-accent-600: rgba(var(--v-theme-secondary), .8)}.datePicker{--vc-day-content-hover-bg: red}@media(min-width:960px){.datePicker{position:absolute;bottom:0;left:0;right:0;margin-inline:auto;width:fit-content}}.vc-day-content{color:#5e5e5e;font-weight:400}.vc-highlight-content-solid{color:#fff!important}.vc-popover-content-wrapper{transform:var(--v518b583c)!important}.vc-date-picker-content,.datePicker{backdrop-filter:blur(10px)!important;border-radius:8px;border:none;box-shadow:0 0 1px #18274b38,0 6px 12px -6px #18274b1f,0 8px 24px -4px #18274b14;background-color:rgba(var(--v-theme-surface),var(--v-surface-opacity, .8))!important}.vc-popover-caret.direction-top.align-left{clip-path:polygon(0% 0%,100% 0%,0% 100%,0% 100%)}.vc-bordered{border:none}";
11
11
 
@@ -1,6 +1,6 @@
1
1
  import { withAsyncContext, computed, ref, openBlock, createElementBlock, mergeProps, unref, createElementVNode, toDisplayString } from 'vue';
2
- import { _ as _export_sfc, H as useSTAcStore } from './asWebComponent-BlFN2lkB.js';
3
- import { L as isFirstLoad } from './helpers-CBqIUSXJ.js';
2
+ import { _ as _export_sfc, H as useSTAcStore } from './asWebComponent-IZanwL-A.js';
3
+ import { P as isFirstLoad } from './helpers-BFuh19CP.js';
4
4
 
5
5
  const _style_0 = "eox-itemfilter[data-v-88d0abc7]{--form-flex-direction: row}@media(max-width:768px){eox-itemfilter[data-v-88d0abc7]{--form-flex-direction: column}}";
6
6
 
@@ -1,10 +1,10 @@
1
- import { withAsyncContext, computed, ref, watch, openBlock, createElementBlock, mergeProps, unref, createElementVNode, toDisplayString, createCommentVNode, createBlock } from 'vue';
1
+ import { withAsyncContext, computed, ref, openBlock, createElementBlock, mergeProps, unref, createElementVNode, toDisplayString, createCommentVNode, createBlock } from 'vue';
2
2
  import 'color-legend-element';
3
3
  import '@eox/timecontrol';
4
- import { a1 as mapCompareEl, n as mapEl, a2 as updateGeoZarrBands, a3 as layerControlFormValueCompare, a4 as layerControlFormValue, a5 as getColFromLayer, P as eodashCompareCollections, S as eodashCollections } from './helpers-CBqIUSXJ.js';
4
+ import { a5 as mapCompareEl, q as mapEl, a6 as updateGeoZarrBands, a7 as updateLayerUrl, a8 as layerControlFormValueCompare, a9 as layerControlFormValue, aa as getColFromLayer, T as eodashCompareCollections, W as eodashCollections } from './helpers-BFuh19CP.js';
5
5
  import { storeToRefs } from 'pinia';
6
- import { _ as _export_sfc, H as useSTAcStore, aa as useEmitLayersUpdate } from './asWebComponent-BlFN2lkB.js';
7
- import _sfc_main$1 from './EodashLayoutSwitcher-iJ8mX1rF.js';
6
+ import { _ as _export_sfc, H as useSTAcStore, aa as useEmitLayersUpdate } from './asWebComponent-IZanwL-A.js';
7
+ import _sfc_main$1 from './EodashLayoutSwitcher-ZRlESI9O.js';
8
8
  import { mdiViewDashboard } from '@mdi/js';
9
9
 
10
10
  /**
@@ -1369,10 +1369,10 @@ const bandsEditorInterface = [
1369
1369
  },
1370
1370
  ];
1371
1371
 
1372
- const _style_0 = "eox-layercontrol[data-v-2e9372f7]{overflow:auto}";
1372
+ const _style_0 = "eox-layercontrol[data-v-8c6e0291]{overflow:auto}";
1373
1373
 
1374
1374
  const _hoisted_1 = { class: "d-flex flex-column" };
1375
- const _hoisted_2 = ["for", ".customEditorInterfaces"];
1375
+ const _hoisted_2 = ["for", ".colormapRegistry", ".customEditorInterfaces"];
1376
1376
  const _hoisted_3 = {
1377
1377
  slot: "layerstitle",
1378
1378
  class: "d-flex justify-space-between ma-2 pa-2 flex-shrink-0"
@@ -1448,7 +1448,8 @@ const enableLayoutSwitcher = computed(
1448
1448
  () => !!props.layoutTarget && !!props.layoutIcon,
1449
1449
  );
1450
1450
 
1451
- const { selectedCompareStac, selectedStac } = storeToRefs(useSTAcStore());
1451
+ const { selectedCompareStac, selectedStac, colormapRegistry } =
1452
+ storeToRefs(useSTAcStore());
1452
1453
 
1453
1454
  const showControls = computed(() => {
1454
1455
  if (props.map === "second") {
@@ -1464,20 +1465,9 @@ const mapElement = props.map === "second" ? mapCompareEl : mapEl;
1464
1465
  /** @type { import("vue").Ref<import("@eox/layercontrol").EOxLayerControl | null>} */
1465
1466
  const eoxLayercontrol = ref(null);
1466
1467
 
1467
- // eox-timecontrol re-fires datetime:updated after layer reassignment;
1468
- // dedupe by (collectionId, datetime)
1469
- const processedDatetimes = new Map();
1470
- watch([selectedStac, selectedCompareStac], () => processedDatetimes.clear());
1471
-
1472
1468
  /** @param {CustomEvent<{layer:import('ol/layer').Layer; datetime:string;}>} evt */
1473
1469
  const handleDatetimeUpdate = async (evt) => {
1474
1470
  const { layer, datetime } = evt.detail;
1475
- const collectionId = layer.get("id")?.split(";:;")[0] ?? layer.get("id");
1476
- if (processedDatetimes.get(collectionId) === datetime) return;
1477
- // First event per collection is eox-timecontrol's mount echo.
1478
- const isFirstEvent = !processedDatetimes.has(collectionId);
1479
- processedDatetimes.set(collectionId, datetime);
1480
- if (isFirstEvent) return;
1481
1471
 
1482
1472
  const ec = await getColFromLayer(eodashCols, layer);
1483
1473
 
@@ -1534,6 +1524,7 @@ const debouncedHandleDateTime = (evt) => {
1534
1524
  */
1535
1525
  const onLayerConfigChange = (evt) => {
1536
1526
  updateGeoZarrBands(evt.detail.layer, evt.detail.jsonformValue);
1527
+ updateLayerUrl(evt.detail.layer, evt.detail.jsonformValue);
1537
1528
 
1538
1529
  if (props.map === "second") {
1539
1530
  layerControlFormValueCompare.value = evt.detail.jsonformValue;
@@ -1547,6 +1538,7 @@ return (_ctx, _cache) => {
1547
1538
  (showControls.value)
1548
1539
  ? (openBlock(), createElementBlock("eox-layercontrol", mergeProps({ key: unref(mapElement) }, config, {
1549
1540
  for: unref(mapElement),
1541
+ ".colormapRegistry": unref(colormapRegistry),
1550
1542
  ".showLayerZoomState": true,
1551
1543
  ".customEditorInterfaces": unref(bandsEditorInterface),
1552
1544
  "onDatetime:updated": debouncedHandleDateTime,
@@ -1574,6 +1566,6 @@ return (_ctx, _cache) => {
1574
1566
  }
1575
1567
 
1576
1568
  };
1577
- const EodashLayerControl = /*#__PURE__*/_export_sfc(_sfc_main, [['styles',[_style_0]],['__scopeId',"data-v-2e9372f7"]]);
1569
+ const EodashLayerControl = /*#__PURE__*/_export_sfc(_sfc_main, [['styles',[_style_0]],['__scopeId',"data-v-8c6e0291"]]);
1578
1570
 
1579
1571
  export { EodashLayerControl as default };
@@ -1,8 +1,8 @@
1
1
  import { ref, openBlock, createElementBlock, unref, createBlock, withCtx, createVNode, mergeProps } from 'vue';
2
- import { J as activeTemplate } from './helpers-CBqIUSXJ.js';
2
+ import { N as activeTemplate } from './helpers-BFuh19CP.js';
3
3
  import { mdiViewDashboard } from '@mdi/js';
4
- import { G as useDisplay, I as useTransparentPanel, K as VIcon } from './asWebComponent-BlFN2lkB.js';
5
- import { V as VTooltip } from './VTooltip-2hAJyEoa.js';
4
+ import { G as useDisplay, I as useTransparentPanel, K as VIcon } from './asWebComponent-IZanwL-A.js';
5
+ import { V as VTooltip } from './VTooltip-ClWHUmWL.js';
6
6
 
7
7
  const _sfc_main = {
8
8
  __name: 'EodashLayoutSwitcher',
@@ -1,12 +1,12 @@
1
1
  import { triggerRef, ref, withAsyncContext, computed, openBlock, createElementBlock, unref, createElementVNode, createCommentVNode, createBlock, toDisplayString, createVNode, isRef, withCtx, mergeProps, Fragment, createTextVNode, withModifiers } from 'vue';
2
- import { H as useSTAcStore, _ as _export_sfc, ab as useEodash, G as useDisplay, I as useTransparentPanel, ac as VAlert } from './asWebComponent-BlFN2lkB.js';
3
- import { n as mapEl, J as activeTemplate, a8 as setActiveTemplate, a6 as isGlobe, B as getLayers, a9 as availableMapProjection, aa as changeMapProjection, I as poi, R as comparePoi, K as mapPosition } from './helpers-CBqIUSXJ.js';
4
- import { u as useMosaicState, n as normalizeGlobeZoom } from './mosaic-BFYLEwyx.js';
2
+ import { H as useSTAcStore, _ as _export_sfc, ab as useEodash, G as useDisplay, I as useTransparentPanel, ac as VAlert } from './asWebComponent-IZanwL-A.js';
3
+ import { q as mapEl, N as activeTemplate, ad as setActiveTemplate, ab as isGlobe, F as getLayers, ae as availableMapProjection, af as changeMapProjection, M as poi, V as comparePoi, O as mapPosition } from './helpers-BFuh19CP.js';
4
+ import { u as useMosaicState, n as normalizeGlobeZoom } from './mosaic-vHvSuih6.js';
5
5
  import { mdiCompareRemove, mdiCompare, mdiPlus, mdiMinus, mdiMapPlus, mdiEarthBox, mdiEarth, mdiMessageQuestion, mdiStarFourPointsCircleOutline } from '@mdi/js';
6
- import ExportState from './ExportState-CqIzfMYQ.js';
7
- import _sfc_main$1 from './PopUp-DPZq5SWI.js';
8
- import EodashItemFilter from './EodashItemFilter-DzshHDlS.js';
9
- import { l as loadPOiIndicator } from './handling-B6I1V5eG.js';
6
+ import ExportState from './ExportState-BXhy5TOU.js';
7
+ import _sfc_main$1 from './PopUp-7_XnhvCc.js';
8
+ import EodashItemFilter from './EodashItemFilter-CJy3zYzD.js';
9
+ import { l as loadPOiIndicator } from './handling-NvY8Csry.js';
10
10
  import { e as easeOut } from './easing-CH0-9wR8.js';
11
11
  import { storeToRefs } from 'pinia';
12
12
  import '@eox/geosearch';
@@ -81,37 +81,38 @@ function showAllPanels() {
81
81
  }
82
82
  /**
83
83
  *
84
- * @param {import("@eox/map").EoxLayer[]} layers
85
- * @return {import("@eox/map").EoxLayer[]}
84
+ * @param {import("@eox/map").EoxLayer[]} layers - eox map layers
85
+ * @returns {import("@eox/map").EoxLayer[]} anonymized Cors
86
86
  */
87
87
  function addCorsAnonym(layers) {
88
- //@ts-expect-error todo
89
- return layers.map((layer) => {
90
- if (layer.type === "Group") {
91
- layer.layers = addCorsAnonym([...(layer.layers ?? [])]);
92
- return layer;
93
- }
94
- // check if not mapbox style as a fix for ts error
95
- if (layer.type === "MapboxStyle") {
96
- return layer;
97
- }
88
+ return /** @type {import("@eox/map").EoxLayer[]} */ (
89
+ layers.map((layer) => {
90
+ if (layer.type === "Group") {
91
+ layer.layers = addCorsAnonym([...(layer.layers ?? [])]);
92
+ return layer;
93
+ }
94
+ // check if not mapbox style as a fix for ts error
95
+ if (layer.type === "MapboxStyle") {
96
+ return layer;
97
+ }
98
98
 
99
- return {
100
- ...layer,
101
- ...(layer.source && {
102
- source: {
103
- ...layer.source,
104
- crossOrigin: "anonymous",
105
- },
106
- ...(layer.sources && {
107
- sources: layer.sources.map((source) => ({
108
- ...source,
99
+ return {
100
+ ...layer,
101
+ ...("source" in layer && {
102
+ source: {
103
+ ...layer.source,
109
104
  crossOrigin: "anonymous",
110
- })),
105
+ },
106
+ ...(layer.sources && {
107
+ sources: layer.sources.map((source) => ({
108
+ ...source,
109
+ crossOrigin: "anonymous",
110
+ })),
111
+ }),
111
112
  }),
112
- }),
113
- };
114
- });
113
+ };
114
+ })
115
+ );
115
116
  }
116
117
 
117
118
  const onMapZoomOut = () => {
@@ -1,8 +1,8 @@
1
1
  import { ref, watch, onUnmounted, computed, openBlock, createElementBlock, createCommentVNode } from 'vue';
2
2
  import '@eox/stacinfo';
3
- import { p as isSTACItem, N as currentUrl } from './helpers-CBqIUSXJ.js';
3
+ import { t as isSTACItem, R as currentUrl } from './helpers-BFuh19CP.js';
4
4
  import { storeToRefs } from 'pinia';
5
- import { H as useSTAcStore } from './asWebComponent-BlFN2lkB.js';
5
+ import { H as useSTAcStore } from './asWebComponent-IZanwL-A.js';
6
6
 
7
7
  const _hoisted_1 = { class: "flex-grow-1" };
8
8
  const _hoisted_2 = [".for", ".allowHtml", ".body", ".featured", ".footer", ".header", ".tags", ".styleOverride"];
@@ -1,9 +1,9 @@
1
1
  import { ref, computed, openBlock, createElementBlock, createElementVNode, createBlock, unref, createCommentVNode, createVNode, withCtx, mergeProps } from 'vue';
2
- import _sfc_main$2 from './PopUp-DPZq5SWI.js';
3
- import EodashItemFilter from './EodashItemFilter-DzshHDlS.js';
4
- import _sfc_main$1 from './EodashLayoutSwitcher-iJ8mX1rF.js';
2
+ import _sfc_main$2 from './PopUp-7_XnhvCc.js';
3
+ import EodashItemFilter from './EodashItemFilter-CJy3zYzD.js';
4
+ import _sfc_main$1 from './EodashLayoutSwitcher-ZRlESI9O.js';
5
5
  import { mdiViewDashboard, mdiPlusCircleOutline } from '@mdi/js';
6
- import { _ as _export_sfc, G as useDisplay, I as useTransparentPanel, J as VBtn } from './asWebComponent-BlFN2lkB.js';
6
+ import { _ as _export_sfc, G as useDisplay, I as useTransparentPanel, J as VBtn } from './asWebComponent-IZanwL-A.js';
7
7
 
8
8
  const _style_0 = ".v-btn--size-default[data-v-73449028]{--v-btn-height: 30px}";
9
9
 
@@ -1,16 +1,16 @@
1
1
  import { createVNode, normalizeStyle, normalizeClass, createElementVNode, Fragment, toDisplayString, shallowRef, watch, withDirectives, mergeProps, useModel, ref, openBlock, createBlock, withCtx, createElementBlock, renderList, unref, createTextVNode, vShow, createCommentVNode, mergeModels } from 'vue';
2
2
  import { mdiContentCopy, mdiClipboardCheckOutline } from '@mdi/js';
3
- import _sfc_main$1 from './PopUp-DPZq5SWI.js';
4
- import { R as createSimpleFunctional, g as genericComponent, o as provideDefaults, c as useRender, p as propsFactory, m as makeTagProps, e as makeComponentProps, K as VIcon, V as VDefaultsProvider, Q as IconValue, Z as makeDensityProps, S as Ripple, l as provideTheme, h as useBorder, U as useVariant, W as useDensity, b as useDimension, i as useElevation, ai as useLoader, j as useLocation, aj as usePosition, k as useRounded, T as useLink, X as makeVariantProps, r as makeThemeProps, Y as makeRouterProps, s as makeRoundedProps, ak as makePositionProps, t as makeLocationProps, al as makeLoaderProps, v as makeElevationProps, d as makeDimensionProps, w as makeBorderProps, q as convertToUnit, am as LoaderSlot, a1 as genOverlays, _ as _export_sfc, J as VBtn, an as copyToClipBoard } from './asWebComponent-BlFN2lkB.js';
5
- import { W as chartSpec, ah as removeUnneededProperties, B as getLayers, K as mapPosition, a9 as availableMapProjection } from './helpers-CBqIUSXJ.js';
3
+ import _sfc_main$1 from './PopUp-7_XnhvCc.js';
4
+ import { R as createSimpleFunctional, g as genericComponent, o as provideDefaults, c as useRender, p as propsFactory, m as makeTagProps, e as makeComponentProps, K as VIcon, V as VDefaultsProvider, Q as IconValue, Z as makeDensityProps, S as Ripple, l as provideTheme, h as useBorder, U as useVariant, W as useDensity, b as useDimension, i as useElevation, ai as useLoader, j as useLocation, aj as usePosition, k as useRounded, T as useLink, X as makeVariantProps, r as makeThemeProps, Y as makeRouterProps, s as makeRoundedProps, ak as makePositionProps, t as makeLocationProps, al as makeLoaderProps, v as makeElevationProps, d as makeDimensionProps, w as makeBorderProps, q as convertToUnit, am as LoaderSlot, a1 as genOverlays, _ as _export_sfc, J as VBtn, an as copyToClipBoard } from './asWebComponent-IZanwL-A.js';
5
+ import { _ as chartSpec, al as removeUnneededProperties, a9 as layerControlFormValue, F as getLayers, O as mapPosition, ae as availableMapProjection } from './helpers-BFuh19CP.js';
6
6
  import { base64EncodeSpec } from '@eox/chart';
7
- import { V as VImg, a as VExpandTransition } from './VImg-Ddv5OyMz.js';
8
- import { V as VAvatar, a as VDivider } from './VDivider-Bj9LG_JV.js';
7
+ import { V as VImg, a as VExpandTransition } from './VImg-B75dgw2K.js';
8
+ import { V as VAvatar, a as VDivider } from './VDivider-DWYM0WUr.js';
9
9
 
10
10
  // Styles
11
11
  const VSpacer = createSimpleFunctional('v-spacer', 'div', 'VSpacer');
12
12
 
13
- const _style_0 = ".code-block[data-v-b7d44f9a]{background-color:#ddd;font-family:monospace;font-size:small;max-height:200px;overflow-y:auto}";
13
+ const _style_0 = ".code-block[data-v-72a96cd2]{background-color:#ddd;font-family:monospace;font-size:small;max-height:200px;overflow-y:auto}";
14
14
 
15
15
  const makeVCardActionsProps = propsFactory({
16
16
  ...makeComponentProps(),
@@ -396,7 +396,15 @@ const copyBtns = [
396
396
  {
397
397
  id: Symbol(),
398
398
  copyFn: async () =>
399
- await copyToClipBoard(JSON.stringify(props.getLayers()), copySuccess),
399
+ await copyToClipBoard(
400
+ JSON.stringify(
401
+ removeUnneededProperties(
402
+ props.getLayers(),
403
+ layerControlFormValue.value,
404
+ ),
405
+ ),
406
+ copySuccess,
407
+ ),
400
408
  copyAs: "layers configuration",
401
409
  },
402
410
  {
@@ -420,7 +428,7 @@ const getMapStepCode = () => {
420
428
  #### Tour step title
421
429
  Text describing the current step of the tour and why it is interesting what the map shows currently
422
430
  `;
423
- return `${preTag}'${JSON.stringify(removeUnneededProperties(props.getLayers()))}' ${endTag}`;
431
+ return `${preTag}'${JSON.stringify(removeUnneededProperties(props.getLayers(), layerControlFormValue.value))}' ${endTag}`;
424
432
  };
425
433
  const getMapEntryCode = () => {
426
434
  const [x, y, z] = mapPosition.value;
@@ -428,7 +436,7 @@ const getMapEntryCode = () => {
428
436
  "## Map Example <!" +
429
437
  '--{as="eox-map" style="width: 100%; height: 500px;" layers=';
430
438
  const endTag = `zoom="${z}" center=[${[x, y]}] projection="${availableMapProjection.value}" }-->`;
431
- return `${preTag}'${JSON.stringify(removeUnneededProperties(props.getLayers()))}' ${endTag}`;
439
+ return `${preTag}'${JSON.stringify(removeUnneededProperties(props.getLayers(), layerControlFormValue.value))}' ${endTag}`;
432
440
  };
433
441
 
434
442
  const getChartExportCode = () => {
@@ -511,7 +519,7 @@ return (_ctx, _cache) => {
511
519
  _cache[5] || (_cache[5] = createElementVNode("p", { class: "text-body-2 mb-2" }, [
512
520
  createElementVNode("strong", null, "Map Layers Configuration")
513
521
  ], -1 /* CACHED */)),
514
- createElementVNode("div", _hoisted_4, toDisplayString(unref(removeUnneededProperties)(__props.getLayers())), 1 /* TEXT */),
522
+ createElementVNode("div", _hoisted_4, toDisplayString(unref(removeUnneededProperties)(__props.getLayers(), unref(layerControlFormValue))), 1 /* TEXT */),
515
523
  (unref(chartSpec))
516
524
  ? (openBlock(), createElementBlock("div", _hoisted_5, [
517
525
  _cache[4] || (_cache[4] = createElementVNode("p", { class: "text-body-2 mb-2" }, [
@@ -549,6 +557,6 @@ return (_ctx, _cache) => {
549
557
  }
550
558
 
551
559
  };
552
- const ExportState = /*#__PURE__*/_export_sfc(_sfc_main, [['styles',[_style_0]],['__scopeId',"data-v-b7d44f9a"]]);
560
+ const ExportState = /*#__PURE__*/_export_sfc(_sfc_main, [['styles',[_style_0]],['__scopeId',"data-v-72a96cd2"]]);
553
561
 
554
562
  export { ExportState as default };
@@ -1,5 +1,5 @@
1
1
  import { ref, shallowRef, computed, toRef, watchEffect, createVNode, normalizeStyle, normalizeClass, inject, openBlock, createBlock, unref, withCtx, createElementVNode, toDisplayString } from 'vue';
2
- import { g as genericComponent, l as provideTheme, f as useBackgroundColor, h as useBorder, i as useElevation, k as useRounded, F as useResizeObserver, A as useToggleScope, B as useLayoutItem, c as useRender, q as convertToUnit, p as propsFactory, r as makeThemeProps, m as makeTagProps, s as makeRoundedProps, D as makeLayoutItemProps, v as makeElevationProps, e as makeComponentProps, w as makeBorderProps, _ as _export_sfc, E as eodashKey, G as useDisplay } from './asWebComponent-BlFN2lkB.js';
2
+ import { g as genericComponent, l as provideTheme, f as useBackgroundColor, h as useBorder, i as useElevation, k as useRounded, F as useResizeObserver, A as useToggleScope, B as useLayoutItem, c as useRender, q as convertToUnit, p as propsFactory, r as makeThemeProps, m as makeTagProps, s as makeRoundedProps, D as makeLayoutItemProps, v as makeElevationProps, e as makeComponentProps, w as makeBorderProps, _ as _export_sfc, E as eodashKey, G as useDisplay } from './asWebComponent-IZanwL-A.js';
3
3
 
4
4
  const _style_0 = ".footer-text[data-v-f0fd061e]{font-size:.8rem}";
5
5
 
@@ -1,6 +1,6 @@
1
1
  import { createVNode, normalizeStyle, normalizeClass, createElementVNode, shallowRef, computed, ref, watch, onMounted, onBeforeUnmount, toRef, watchEffect, mergeProps, inject, openBlock, createBlock, withCtx, createTextVNode, toDisplayString, unref } from 'vue';
2
- import { g as genericComponent, c as useRender, p as propsFactory, m as makeTagProps, e as makeComponentProps, f as useBackgroundColor, h as useBorder, i as useElevation, j as useLocation, k as useRounded, l as provideTheme, n as useRtl, o as provideDefaults, V as VDefaultsProvider, q as convertToUnit, r as makeThemeProps, s as makeRoundedProps, t as makeLocationProps, v as makeElevationProps, w as makeBorderProps, x as clamp, y as consoleWarn, z as useProxiedModel, A as useToggleScope, B as useLayoutItem, C as omit, D as makeLayoutItemProps, _ as _export_sfc, E as eodashKey } from './asWebComponent-BlFN2lkB.js';
3
- import { V as VImg, a as VExpandTransition } from './VImg-Ddv5OyMz.js';
2
+ import { g as genericComponent, c as useRender, p as propsFactory, m as makeTagProps, e as makeComponentProps, f as useBackgroundColor, h as useBorder, i as useElevation, j as useLocation, k as useRounded, l as provideTheme, n as useRtl, o as provideDefaults, V as VDefaultsProvider, q as convertToUnit, r as makeThemeProps, s as makeRoundedProps, t as makeLocationProps, v as makeElevationProps, w as makeBorderProps, x as clamp, y as consoleWarn, z as useProxiedModel, A as useToggleScope, B as useLayoutItem, C as omit, D as makeLayoutItemProps, _ as _export_sfc, E as eodashKey } from './asWebComponent-IZanwL-A.js';
3
+ import { V as VImg, a as VExpandTransition } from './VImg-B75dgw2K.js';
4
4
  import { u as useSsrBoot } from './ssrBoot-Zgc_Ttvi.js';
5
5
 
6
6
  const _style_0 = ".logo[data-v-86c95219]{max-width:140px}";