@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
@@ -1,14 +1,14 @@
1
1
  import { watch, onUnmounted, onMounted, computed, withAsyncContext, useTemplateRef, ref, toRaw, nextTick, openBlock, createElementBlock, createElementVNode, unref, normalizeStyle, createCommentVNode, createVNode } from 'vue';
2
2
  import { transformExtent } from '@eox/map';
3
3
  import '@eox/map/src/plugins/advancedLayersAndSources';
4
- import { Y as loading, a6 as isGlobe, a7 as setMapProjFromCol, L as isFirstLoad, K as mapPosition, $ as sanitizeBbox, n as mapEl, a1 as mapCompareEl, a0 as tooltipAdapter, M as indicator, Q as compareIndicator, I as poi, a4 as layerControlFormValue, a3 as layerControlFormValueCompare, H as datetime, P as eodashCompareCollections, S as eodashCollections } from './helpers-CBqIUSXJ.js';
4
+ import { a0 as loading, ab as isGlobe, ac as setMapProjFromCol, P as isFirstLoad, O as mapPosition, a3 as sanitizeBbox, q as mapEl, a5 as mapCompareEl, a4 as tooltipAdapter, Q as indicator, U as compareIndicator, M as poi, a9 as layerControlFormValue, a8 as layerControlFormValueCompare, L as datetime, T as eodashCompareCollections, W as eodashCollections } from './helpers-BFuh19CP.js';
5
5
  import { storeToRefs } from 'pinia';
6
- import { H as useSTAcStore, aa as useEmitLayersUpdate, L as useOnLayersUpdate, _ as _export_sfc, G as useDisplay, a as useLayout } from './asWebComponent-BlFN2lkB.js';
7
- import { c as createLayersConfig } from './create-layers-config-u_vn5hPk.js';
6
+ import { H as useSTAcStore, aa as useEmitLayersUpdate, L as useOnLayersUpdate, _ as _export_sfc, G as useDisplay, a as useLayout } from './asWebComponent-IZanwL-A.js';
7
+ import { c as createLayersConfig } from './create-layers-config-3S3y_kZg.js';
8
8
  import log from 'loglevel';
9
9
  import { i as inAndOut } from './easing-CH0-9wR8.js';
10
10
  import mustache from 'mustache';
11
- import EodashMapBtns from './EodashMapBtns-C7Cr7q5Y.js';
11
+ import EodashMapBtns from './EodashMapBtns-CG7u2Aq8.js';
12
12
 
13
13
  /**
14
14
  * Tracks map loading state at the source level via `loading.activeLoads`,
@@ -19,11 +19,15 @@ import EodashMapBtns from './EodashMapBtns-C7Cr7q5Y.js';
19
19
  * @param {import("vue").Ref<import("@eox/map").EOxMap | null>} compareMapElement
20
20
  */
21
21
  const useMapLoading = (mapElement, compareMapElement) => {
22
+ // This instance's outstanding loads, so unmount subtracts only its share.
23
+ let localLoads = 0;
22
24
  const startHandler = () => {
25
+ localLoads++;
23
26
  loading.activeLoads++;
24
27
  };
25
28
  const endHandler = () => {
26
- loading.activeLoads--;
29
+ localLoads = Math.max(0, localLoads - 1);
30
+ loading.activeLoads = Math.max(0, loading.activeLoads - 1);
27
31
  };
28
32
 
29
33
  /** @param {import("@eox/map").EOxMap | null} newMapEl */
@@ -54,9 +58,11 @@ const useMapLoading = (mapElement, compareMapElement) => {
54
58
  onUnmounted(() => {
55
59
  mapElement.value?.map.removeEventListener("loadstart", startHandler);
56
60
  mapElement.value?.map.removeEventListener("loadend", endHandler);
61
+ compareMapElement.value?.map.removeEventListener("loadstart", startHandler);
62
+ compareMapElement.value?.map.removeEventListener("loadend", endHandler);
57
63
  stopMainWatcher();
58
64
  stopCompareWatcher();
59
- loading.activeLoads = 0;
65
+ loading.activeLoads = Math.max(0, loading.activeLoads - localLoads);
60
66
  });
61
67
  };
62
68
 
@@ -394,7 +400,7 @@ const useUpdateTooltipProperties = (
394
400
  });
395
401
  };
396
402
 
397
- const _style_0 = ".map-buttons-container[data-v-6d08ac44]{position:fixed;left:0;width:100%;height:100%;display:grid;grid-template-columns:repeat(12,1fr);grid-template-rows:repeat(12,1fr);pointer-events:none;z-index:1}.map-buttons-container[data-v-6d08ac44]>*{pointer-events:auto}";
403
+ const _style_0 = ".map-buttons-container[data-v-0ac5d70c]{position:fixed;left:0;width:100%;height:100%;display:grid;grid-template-columns:repeat(12,1fr);grid-template-rows:repeat(12,1fr);pointer-events:none;z-index:1}.map-buttons-container[data-v-0ac5d70c]>*{pointer-events:auto}";
398
404
 
399
405
  const _hoisted_1 = [".enabled"];
400
406
  const _hoisted_2 = [".animationOptions", ".center", ".zoom", ".layers", ".controls"];
@@ -594,7 +600,9 @@ const controls = computed(() => {
594
600
  controlsObj.MousePosition = {
595
601
  projection: "EPSG:4326",
596
602
  coordinateFormat: (c) => {
597
- return `${c?.[1].toFixed(3)} °N, ${c?.[0].toFixed(3)} °E`;
603
+ if (!c) return "";
604
+ const [lon, lat] = c;
605
+ return `${Math.abs(lat).toFixed(3)} °${lat >= 0 ? "N" : "S"}, ${Math.abs(lon).toFixed(3)} °${lon >= 0 ? "E" : "W"}`;
598
606
  },
599
607
  target: cursorCoordsRef.value,
600
608
  };
@@ -836,6 +844,6 @@ return (_ctx, _cache) => {
836
844
  }
837
845
 
838
846
  };
839
- const index = /*#__PURE__*/_export_sfc(_sfc_main, [['styles',[_style_0]],['__scopeId',"data-v-6d08ac44"]]);
847
+ const index = /*#__PURE__*/_export_sfc(_sfc_main, [['styles',[_style_0]],['__scopeId',"data-v-0ac5d70c"]]);
840
848
 
841
849
  export { index as default };
@@ -1,11 +1,11 @@
1
1
  import { useTemplateRef, ref, computed, onMounted, openBlock, createElementBlock, unref, createElementVNode, createCommentVNode } from 'vue';
2
- import { S as eodashCollections, af as removeLayers, $ as sanitizeBbox, f as axios, n as mapEl, B as getLayers, H as datetime } from './helpers-CBqIUSXJ.js';
2
+ import { W as eodashCollections, ak as removeLayers, a3 as sanitizeBbox, g as axios, q as mapEl, F as getLayers, L as datetime } from './helpers-BFuh19CP.js';
3
3
  import '@eox/timecontrol';
4
4
  import '@eox/itemfilter';
5
5
  import { storeToRefs } from 'pinia';
6
- import { _ as _export_sfc, H as useSTAcStore } from './asWebComponent-BlFN2lkB.js';
7
- import { c as createLayersConfig } from './create-layers-config-u_vn5hPk.js';
8
- import { b as buildCqlFilter, u as useMosaicState, a as useScheduleMosaicUpdate, c as useInitMosaic } from './mosaic-BFYLEwyx.js';
6
+ import { _ as _export_sfc, H as useSTAcStore } from './asWebComponent-IZanwL-A.js';
7
+ import { c as createLayersConfig } from './create-layers-config-3S3y_kZg.js';
8
+ import { b as buildCqlFilter, u as useMosaicState, a as useScheduleMosaicUpdate, c as useInitMosaic } from './mosaic-vHvSuih6.js';
9
9
 
10
10
  /**
11
11
  * @param {string} stacEndpoint
@@ -1,14 +1,14 @@
1
- import { onMounted, watch, nextTick, onUnmounted, ref, useTemplateRef, computed, openBlock, createElementBlock, createVNode, unref, createCommentVNode, createBlock, createElementVNode, withCtx, createTextVNode } from 'vue';
1
+ import { onMounted, watch, nextTick, onUnmounted, ref, useTemplateRef, computed, openBlock, createElementBlock, createElementVNode, createVNode, unref, createCommentVNode, createBlock, withCtx, createTextVNode } from 'vue';
2
2
  import '@eox/chart';
3
3
  import '@eox/drawtools';
4
4
  import '@eox/jsonform';
5
- import { L as useOnLayersUpdate, _ as _export_sfc, H as useSTAcStore, J as VBtn } from './asWebComponent-BlFN2lkB.js';
5
+ import { L as useOnLayersUpdate, _ as _export_sfc, H as useSTAcStore, J as VBtn } from './asWebComponent-IZanwL-A.js';
6
6
  import { storeToRefs } from 'pinia';
7
- import { P as ProcessList, c as compareJobs, j as jobs } from './ProcessList-DuI6WpS1.js';
8
- import EodashChart from './EodashChart-ChrkA5oS.js';
9
- import { i as initProcess, u as updateJsonformIdentifier, h as handleProcesses } from './handling-B6I1V5eG.js';
10
- import { ab as getCompareLayers, B as getLayers, Q as compareIndicator, M as indicator, a1 as mapCompareEl, n as mapEl, V as areChartsSeparateLayout, X as compareChartSpec, W as chartSpec } from './helpers-CBqIUSXJ.js';
11
- import { u as updateJobsStatus, d as download, g as getDrawToolsProperties } from './async-B2H8ZwUK.js';
7
+ import { P as ProcessList, c as compareJobs, j as jobs } from './ProcessList-LL_UCbvc.js';
8
+ import EodashChart from './EodashChart-D-3AGKZY.js';
9
+ import { i as initProcess, u as updateJsonformIdentifier, h as handleProcesses } from './handling-NvY8Csry.js';
10
+ import { ag as getCompareLayers, F as getLayers, U as compareIndicator, Q as indicator, a5 as mapCompareEl, q as mapEl, Z as areChartsSeparateLayout, $ as compareChartSpec, _ as chartSpec } from './helpers-BFuh19CP.js';
11
+ import { u as updateJobsStatus, d as download, g as getDrawToolsProperties } from './async-CiNIOBVz.js';
12
12
  import { mdiCogPlayOutline, mdiDownloadCircleOutline } from '@mdi/js';
13
13
 
14
14
  /**
@@ -68,6 +68,19 @@ const useInitProcess = ({
68
68
  });
69
69
 
70
70
  if (newJsonForm) {
71
+ // Layer rebuilds strip drawtools' selection interactions; remount
72
+ // the form so initSelection re-attaches them.
73
+ const selectionStripped =
74
+ Object.values(newJsonForm.properties ?? {}).some(
75
+ (p) => p?.options?.drawtools?.layerId,
76
+ ) &&
77
+ !mapElement.value?.selectInteractions?.[
78
+ "SelectLayerClickInteraction"
79
+ ];
80
+ if (selectionStripped) {
81
+ jsonformSchema.value = null;
82
+ await nextTick();
83
+ }
71
84
  jsonformSchema.value = newJsonForm;
72
85
  }
73
86
  }
@@ -140,14 +153,18 @@ function useAutoExec(
140
153
  });
141
154
  }
142
155
 
143
- const _style_0 = "eox-jsonform{padding:.7em;min-height:0px}";
156
+ const _style_0 = "eox-jsonform{padding:0 12px;min-height:0px;flex-shrink:0}.bg-surface:has(.eodash-process-container){height:calc(100% - 30px);overflow:hidden}.eodash-process-container{height:100%;display:flex;flex-direction:column;overflow:hidden}.eodash-process-content{flex-grow:1;overflow-y:auto;display:flex;flex-direction:column}.eodash-process-actions{text-align:right;padding:4px 12px;flex-shrink:0;border-top:1px solid rgba(0,0,0,.1);background:inherit}";
144
157
 
145
158
  const _hoisted_1 = {
146
159
  ref: "container",
147
- class: "py-1"
160
+ class: "eodash-process-container"
161
+ };
162
+ const _hoisted_2 = { class: "eodash-process-content" };
163
+ const _hoisted_3 = [".schema"];
164
+ const _hoisted_4 = {
165
+ key: 0,
166
+ class: "eodash-process-actions"
148
167
  };
149
- const _hoisted_2 = [".schema"];
150
- const _hoisted_3 = { class: "text-right" };
151
168
 
152
169
 
153
170
  const _sfc_main = {
@@ -179,6 +196,90 @@ const jsonformEl =
179
196
  useTemplateRef("jsonformEl")
180
197
  );
181
198
 
199
+ // Inject custom styles into the eox-jsonform shadow DOM to make eox-drawtools inline
200
+ watch(jsonformEl, (el) => {
201
+ if (el && el.shadowRoot) {
202
+ const styleId = "eodash-drawtools-inline-style";
203
+ if (!el.shadowRoot.getElementById(styleId)) {
204
+ const style = document.createElement("style");
205
+ style.id = styleId;
206
+ style.textContent = `
207
+ /* Compact standard form elements */
208
+ .form-control, .form-group {
209
+ margin-bottom: 8px !important;
210
+ }
211
+ .form-control > label, .form-group > label {
212
+ margin-bottom: 2px !important;
213
+ font-size: 0.9em;
214
+ }
215
+
216
+ /* Specific layout for drawtools */
217
+ .form-control:has(eox-drawtools) {
218
+ position: relative;
219
+ padding: 8px 12px !important;
220
+ border: none !important;
221
+ background: transparent !important;
222
+ margin-bottom: 8px !important;
223
+ }
224
+ .form-control:has(eox-drawtools) > label {
225
+ position: absolute;
226
+ left: 12px;
227
+ top: 8px;
228
+ margin: 0 !important;
229
+ width: calc(100% - 180px); /* Give label maximum available width */
230
+ line-height: 1.2;
231
+ display: flex;
232
+ align-items: flex-start;
233
+ padding-top: 8px;
234
+ pointer-events: none; /* Let clicks pass through to buttons if they overlap slightly */
235
+ }
236
+ .form-control:has(eox-drawtools) > eox-drawtools {
237
+ display: block;
238
+ width: 100%;
239
+ }
240
+ `;
241
+ el.shadowRoot.appendChild(style);
242
+ }
243
+
244
+ const injectDrawtoolsStyle = () => {
245
+ const drawtools = el?.shadowRoot?.querySelector("eox-drawtools");
246
+ if (drawtools && drawtools.shadowRoot) {
247
+ if (
248
+ !drawtools.shadowRoot.getElementById("eodash-drawtools-indent-style")
249
+ ) {
250
+ const dtStyle = document.createElement("style");
251
+ dtStyle.id = "eodash-drawtools-indent-style";
252
+ dtStyle.textContent = `
253
+ eox-drawtools-controller {
254
+ display: flex;
255
+ justify-content: flex-end; /* Push buttons to the right */
256
+ min-height: 40px;
257
+ width: 100%;
258
+ }
259
+ eox-drawtools-list {
260
+ display: block;
261
+ margin-top: 10px;
262
+ width: 100%;
263
+ }
264
+ `;
265
+ drawtools.shadowRoot.appendChild(dtStyle);
266
+ return true;
267
+ }
268
+ }
269
+ return false;
270
+ };
271
+
272
+ if (!injectDrawtoolsStyle()) {
273
+ const observer = new MutationObserver(() => {
274
+ if (injectDrawtoolsStyle()) {
275
+ observer.disconnect();
276
+ }
277
+ });
278
+ observer.observe(el.shadowRoot, { childList: true, subtree: true });
279
+ }
280
+ }
281
+ });
282
+
182
283
  const isAsync = computed(
183
284
  () =>
184
285
  selectedStac.value?.links.filter((l) => l.endpoint === "eoxhub_workspaces")
@@ -282,59 +383,63 @@ return (_ctx, _cache) => {
282
383
 
283
384
 
284
385
  return (openBlock(), createElementBlock("div", _hoisted_1, [
285
- createVNode(ProcessList, {
286
- "map-element": unref(mapElement),
287
- "enable-compare": __props.enableCompare
288
- }, null, 8 /* PROPS */, ["map-element", "enable-compare"]),
289
- (jsonformSchema.value)
290
- ? (openBlock(), createElementBlock("eox-jsonform", {
291
- key: jsonformKey.value,
292
- ref_key: "jsonformEl",
293
- ref: jsonformEl,
294
- ".schema": jsonformSchema.value
295
- }, null, 40 /* PROPS, NEED_HYDRATION */, _hoisted_2))
296
- : createCommentVNode("v-if", true),
297
- (!unref(areChartsSeparateLayout))
298
- ? (openBlock(), createBlock(EodashChart, {
299
- key: 1,
300
- "vega-embed-options": __props.vegaEmbedOptions,
301
- "enable-compare": __props.enableCompare
302
- }, null, 8 /* PROPS */, ["vega-embed-options", "enable-compare"]))
303
- : createCommentVNode("v-if", true),
304
- createElementVNode("div", _hoisted_3, [
305
- (showExecBtn.value)
306
- ? (openBlock(), createBlock(VBtn, {
307
- key: 0,
308
- loading: loading.value,
309
- style: {"margin-right":"8px"},
310
- "append-icon": [unref(mdiCogPlayOutline)],
311
- onClick: startProcess,
312
- density: "comfortable",
313
- size: "small"
314
- }, {
315
- default: withCtx(() => [...(_cache[0] || (_cache[0] = [
316
- createTextVNode(" Execute ", -1 /* CACHED */)
317
- ]))]),
318
- _: 1 /* STABLE */
319
- }, 8 /* PROPS */, ["loading", "append-icon"]))
386
+ createElementVNode("div", _hoisted_2, [
387
+ createVNode(ProcessList, {
388
+ "map-element": unref(mapElement),
389
+ "enable-compare": __props.enableCompare
390
+ }, null, 8 /* PROPS */, ["map-element", "enable-compare"]),
391
+ (jsonformSchema.value)
392
+ ? (openBlock(), createElementBlock("eox-jsonform", {
393
+ key: jsonformKey.value,
394
+ ref_key: "jsonformEl",
395
+ ref: jsonformEl,
396
+ ".schema": jsonformSchema.value
397
+ }, null, 40 /* PROPS, NEED_HYDRATION */, _hoisted_3))
320
398
  : createCommentVNode("v-if", true),
321
- (processResults.value.length && isProcessed.value && !isAsync.value)
322
- ? (openBlock(), createBlock(VBtn, {
399
+ (!unref(areChartsSeparateLayout))
400
+ ? (openBlock(), createBlock(EodashChart, {
323
401
  key: 1,
324
- color: "primary",
325
- style: {"margin-right":"8px"},
326
- "append-icon": [unref(mdiDownloadCircleOutline)],
327
- onClick: downloadResults,
328
- size: "small",
329
- density: "comfortable"
330
- }, {
331
- default: withCtx(() => [...(_cache[1] || (_cache[1] = [
332
- createTextVNode(" Download ", -1 /* CACHED */)
333
- ]))]),
334
- _: 1 /* STABLE */
335
- }, 8 /* PROPS */, ["append-icon"]))
402
+ "vega-embed-options": __props.vegaEmbedOptions,
403
+ "enable-compare": __props.enableCompare
404
+ }, null, 8 /* PROPS */, ["vega-embed-options", "enable-compare"]))
336
405
  : createCommentVNode("v-if", true)
337
- ])
406
+ ]),
407
+ (showExecBtn.value || (processResults.value.length && isProcessed.value && !isAsync.value))
408
+ ? (openBlock(), createElementBlock("div", _hoisted_4, [
409
+ (showExecBtn.value)
410
+ ? (openBlock(), createBlock(VBtn, {
411
+ key: 0,
412
+ loading: loading.value,
413
+ style: {"margin-right":"8px"},
414
+ "append-icon": [unref(mdiCogPlayOutline)],
415
+ onClick: startProcess,
416
+ density: "comfortable",
417
+ size: "small"
418
+ }, {
419
+ default: withCtx(() => [...(_cache[0] || (_cache[0] = [
420
+ createTextVNode(" Execute ", -1 /* CACHED */)
421
+ ]))]),
422
+ _: 1 /* STABLE */
423
+ }, 8 /* PROPS */, ["loading", "append-icon"]))
424
+ : createCommentVNode("v-if", true),
425
+ (processResults.value.length && isProcessed.value && !isAsync.value)
426
+ ? (openBlock(), createBlock(VBtn, {
427
+ key: 1,
428
+ color: "primary",
429
+ style: {"margin-right":"8px"},
430
+ "append-icon": [unref(mdiDownloadCircleOutline)],
431
+ onClick: downloadResults,
432
+ size: "small",
433
+ density: "comfortable"
434
+ }, {
435
+ default: withCtx(() => [...(_cache[1] || (_cache[1] = [
436
+ createTextVNode(" Download ", -1 /* CACHED */)
437
+ ]))]),
438
+ _: 1 /* STABLE */
439
+ }, 8 /* PROPS */, ["append-icon"]))
440
+ : createCommentVNode("v-if", true)
441
+ ]))
442
+ : createCommentVNode("v-if", true)
338
443
  ], 512 /* NEED_PATCH */))
339
444
  }
340
445
  }
@@ -1,18 +1,18 @@
1
1
  import { onMounted, onUnmounted, inject, shallowRef, useId, provide, toRaw, computed, onBeforeUnmount, watch, toValue, toRef, onBeforeMount, nextTick, ref, createVNode, normalizeStyle, normalizeClass, withDirectives, createElementVNode, vShow, mergeProps, Fragment, toDisplayString, onDeactivated, withAsyncContext, useTemplateRef, openBlock, createElementBlock, createBlock, withCtx, renderList, createTextVNode, createCommentVNode, unref } from 'vue';
2
2
  import { storeToRefs } from 'pinia';
3
- import { H as useSTAcStore, L as useOnLayersUpdate, M as wrapInArray, z as useProxiedModel, N as getCurrentInstance, O as consoleError, p as propsFactory, g as genericComponent, c as useRender, V as VDefaultsProvider, P as defineComponent, Q as IconValue, m as makeTagProps, e as makeComponentProps, R as createSimpleFunctional, S as Ripple, T as useLink, l as provideTheme, h as useBorder, U as useVariant, W as useDensity, b as useDimension, i as useElevation, k as useRounded, X as makeVariantProps, r as makeThemeProps, Y as makeRouterProps, s as makeRoundedProps, v as makeElevationProps, d as makeDimensionProps, Z as makeDensityProps, w as makeBorderProps, $ as EventProp, a0 as deprecate, q as convertToUnit, a1 as genOverlays, K as VIcon, a2 as useTextColor, f as useBackgroundColor, o as provideDefaults, a3 as focusChild, a4 as isPrimitive, a5 as getPropertyFromItem, C as omit, n as useRtl, a6 as isClickInsideElement, a7 as getNextElement, a8 as focusableChildren, _ as _export_sfc, a9 as VRow, J as VBtn } from './asWebComponent-BlFN2lkB.js';
4
- import { M as indicator, f as axios, n as mapEl, $ as sanitizeBbox, a0 as tooltipAdapter, K as mapPosition, a1 as mapCompareEl } from './helpers-CBqIUSXJ.js';
5
- import { b as buildCqlFilter, u as useMosaicState, r as renderLatestMosaic, a as useScheduleMosaicUpdate, c as useInitMosaic } from './mosaic-BFYLEwyx.js';
3
+ import { H as useSTAcStore, L as useOnLayersUpdate, M as wrapInArray, z as useProxiedModel, N as getCurrentInstance, O as consoleError, p as propsFactory, g as genericComponent, c as useRender, V as VDefaultsProvider, P as defineComponent, Q as IconValue, m as makeTagProps, e as makeComponentProps, R as createSimpleFunctional, S as Ripple, T as useLink, l as provideTheme, h as useBorder, U as useVariant, W as useDensity, b as useDimension, i as useElevation, k as useRounded, X as makeVariantProps, r as makeThemeProps, Y as makeRouterProps, s as makeRoundedProps, v as makeElevationProps, d as makeDimensionProps, Z as makeDensityProps, w as makeBorderProps, $ as EventProp, a0 as deprecate, q as convertToUnit, a1 as genOverlays, K as VIcon, a2 as useTextColor, f as useBackgroundColor, o as provideDefaults, a3 as focusChild, a4 as isPrimitive, a5 as getPropertyFromItem, C as omit, n as useRtl, a6 as isClickInsideElement, a7 as getNextElement, a8 as focusableChildren, _ as _export_sfc, a9 as VRow, J as VBtn } from './asWebComponent-IZanwL-A.js';
4
+ import { Q as indicator, g as axios, q as mapEl, a3 as sanitizeBbox, a4 as tooltipAdapter, O as mapPosition, a5 as mapCompareEl } from './helpers-BFuh19CP.js';
5
+ import { b as buildCqlFilter, u as useMosaicState, r as renderLatestMosaic, a as useScheduleMosaicUpdate, c as useInitMosaic } from './mosaic-vHvSuih6.js';
6
6
  import { i as inAndOut } from './easing-CH0-9wR8.js';
7
7
  import { mdiViewDashboard } from '@mdi/js';
8
- import _sfc_main$1 from './EodashLayoutSwitcher-iJ8mX1rF.js';
9
- import { u as useScopeId, V as VMenuSymbol, f as forwardRefs, m as makeVOverlayProps, a as VOverlay } from './forwardRefs-DAlror6d.js';
10
- import { V as VDialogTransition } from './dialog-transition-BrMkMiNa.js';
11
- import { a as VExpandTransition } from './VImg-Ddv5OyMz.js';
8
+ import _sfc_main$1 from './EodashLayoutSwitcher-ZRlESI9O.js';
9
+ import { u as useScopeId, V as VMenuSymbol, f as forwardRefs, m as makeVOverlayProps, a as VOverlay } from './forwardRefs-B-c1_6yo.js';
10
+ import { V as VDialogTransition } from './dialog-transition-c4ZSnzac.js';
11
+ import { a as VExpandTransition } from './VImg-B75dgw2K.js';
12
12
  import { u as useSsrBoot } from './ssrBoot-Zgc_Ttvi.js';
13
- import { M as MaybeTransition } from './transition-D_W6Wn9v.js';
14
- import { V as VAvatar, a as VDivider } from './VDivider-Bj9LG_JV.js';
15
- import { V as VTooltip } from './VTooltip-2hAJyEoa.js';
13
+ import { M as MaybeTransition } from './transition-BkyUsZh_.js';
14
+ import { V as VAvatar, a as VDivider } from './VDivider-DWYM0WUr.js';
15
+ import { V as VTooltip } from './VTooltip-ClWHUmWL.js';
16
16
 
17
17
  function throttle(fn, delay) {
18
18
  let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
@@ -517,7 +517,6 @@ function renderItemsFeatures(
517
517
  },
518
518
  source: {
519
519
  type: "Vector",
520
- //@ts-expect-error todo
521
520
  url:
522
521
  "data:application/geo+json," +
523
522
  encodeURIComponent(
@@ -1,6 +1,6 @@
1
1
  import { resolveComponent, render, h, mergeProps } from 'vue';
2
- import { O as consoleError, ag as isObject } from './asWebComponent-BlFN2lkB.js';
3
- import { V as VTooltip } from './VTooltip-2hAJyEoa.js';
2
+ import { O as consoleError, ag as isObject } from './asWebComponent-IZanwL-A.js';
3
+ import { V as VTooltip } from './VTooltip-ClWHUmWL.js';
4
4
 
5
5
  // Utilities
6
6
  function useDirectiveComponent(component, props) {
@@ -1,7 +1,7 @@
1
- import { K as mapPosition, a6 as isGlobe, n as mapEl, S as eodashCollections, q as extractLayerTimeValues, H as datetime, f as axios, ag as resolveRenders, l as encodeURLObject, M as indicator, B as getLayers } from './helpers-CBqIUSXJ.js';
1
+ import { O as mapPosition, ab as isGlobe, q as mapEl, W as eodashCollections, u as extractLayerTimeValues, L as datetime, g as axios, l as resolveRenders, p as encodeURLObject, n as normalizeRescale, o as normalizeNodata, Q as indicator, F as getLayers } from './helpers-BFuh19CP.js';
2
2
  import { shallowRef, ref, computed, watch, onMounted, onUnmounted, nextTick } from 'vue';
3
3
  import { createSharedComposable, useEventBus, useDebounceFn } from '@vueuse/core';
4
- import { H as useSTAcStore, L as useOnLayersUpdate, ab as useEodash } from './asWebComponent-BlFN2lkB.js';
4
+ import { H as useSTAcStore, L as useOnLayersUpdate, ab as useEodash } from './asWebComponent-IZanwL-A.js';
5
5
  import log from 'loglevel';
6
6
 
7
7
  /**
@@ -285,17 +285,21 @@ async function createMosaicLayers(mosaicEndpoint, params) {
285
285
  }
286
286
 
287
287
  const renderParamsStr = encodeURLObject({
288
- assets: preset.assets,
288
+ // TiTiler treats assets and expression as mutually exclusive band selection
289
+ assets: preset.expression ? undefined : preset.assets,
289
290
  expression: preset.expression,
290
- nodata: preset.nodata,
291
+ nodata: normalizeNodata(preset.nodata),
291
292
  resampling: preset.resampling,
292
293
  color_formula: preset.color_formula,
293
294
  colormap: preset.colormap,
294
295
  colormap_name: preset.colormap_name,
295
- rescale: preset.rescale,
296
+ rescale: normalizeRescale(preset.rescale),
296
297
  });
297
298
 
298
- const tileParams = new URLSearchParams({ tilesize: "512", ...params });
299
+ const tileParams = new URLSearchParams({
300
+ tilesize: `${preset.tilesize ?? "512"}`,
301
+ ...params,
302
+ });
299
303
  const tileJsonUrl = `${mosaicEndpoint}?${renderParamsStr}${tileParams.toString()}`;
300
304
 
301
305
  const tileJSON = await axios
@@ -1,5 +1,5 @@
1
1
  import { mdiViewDashboardVariant, mdiViewDashboard } from '@mdi/js';
2
- import { Z as includesProcess, _ as shouldShowChartWidget } from './helpers-CBqIUSXJ.js';
2
+ import { a1 as includesProcess, a2 as shouldShowChartWidget } from './helpers-BFuh19CP.js';
3
3
 
4
4
  /**
5
5
  * Special values that tell deepmerge to perform a certain action.
@@ -410,7 +410,6 @@ const lite = {
410
410
  },
411
411
  source: {
412
412
  type: "XYZ",
413
- //@ts-expect-error todo
414
413
  url: "https://s2maps-tiles.eu/wmts/1.0.0/terrain-light_3857/default/g/{z}/{y}/{x}.jpeg",
415
414
  },
416
415
  },
@@ -568,7 +567,6 @@ const expert = {
568
567
  },
569
568
  source: {
570
569
  type: "XYZ",
571
- //@ts-expect-error todo
572
570
  url: "https://s2maps-tiles.eu/wmts/1.0.0/terrain-light_3857/default/g/{z}/{y}/{x}.jpeg",
573
571
  },
574
572
  },
@@ -624,7 +622,7 @@ const expert = {
624
622
  id: "Layercontrol",
625
623
  type: "internal",
626
624
  title: "Layers",
627
- layout: { x: 0, y: 1, w: "3/3/2", h: 11 },
625
+ layout: { x: 0, y: 1, w: "3/3/2", h: 10 },
628
626
  widget: {
629
627
  name: "EodashLayerControl",
630
628
  properties: {
@@ -675,7 +673,7 @@ const expert = {
675
673
  id: "Processes",
676
674
  type: "internal",
677
675
  title: "Processes",
678
- layout: { x: "9/9/10", y: 6, w: "3/3/2", h: 5 },
676
+ layout: { x: "9/9/10", y: 6, w: "3/3/2", h: 6 },
679
677
  widget: {
680
678
  name: "EodashProcess",
681
679
  },
@@ -737,7 +735,6 @@ const compare = {
737
735
  },
738
736
  source: {
739
737
  type: "XYZ",
740
- //@ts-expect-error todo
741
738
  url: "https://s2maps-tiles.eu/wmts/1.0.0/terrain-light_3857/default/g/{z}/{y}/{x}.jpeg",
742
739
  },
743
740
  },
@@ -949,6 +946,7 @@ const explore = {
949
946
  enableZoom: true,
950
947
  enableExportMap: true,
951
948
  enableChangeProjection: true,
949
+ enableMosaic: false,
952
950
  enableCompareIndicators: {
953
951
  fallbackTemplate: "explore",
954
952
  compareTemplate: "compare",
@@ -1004,7 +1002,8 @@ const baseConfig = {
1004
1002
  { url: "openveda.cloud", titilerVersion: 1 },
1005
1003
  { url: "api.explorer.eopf.copernicus.eu", titilerVersion: 2 },
1006
1004
  ],
1007
- rasterEndpoint: "https://api.explorer.eopf.copernicus.eu/rstaging",
1005
+ colormapRegistry:
1006
+ "https://raw.githubusercontent.com/eurodatacube/eodash-assets/refs/heads/main/defaults/colormaps.json",
1008
1007
  },
1009
1008
  brand: {
1010
1009
  noLayout: true,
@@ -1,5 +1,5 @@
1
1
  import { mergeProps, h, TransitionGroup, Transition } from 'vue';
2
- import { p as propsFactory, ag as isObject, aQ as onlyDefinedProps } from './asWebComponent-BlFN2lkB.js';
2
+ import { p as propsFactory, ag as isObject, aQ as onlyDefinedProps } from './asWebComponent-IZanwL-A.js';
3
3
 
4
4
  // Utilities
5
5
  const makeTransitionProps = propsFactory({
@@ -13,6 +13,14 @@ export function generateFeatures(links?: import("stac-ts").StacLink[], extraProp
13
13
  };
14
14
  features: import("geojson").Feature<import("geojson").Geometry, import("geojson").GeoJsonProperties>[];
15
15
  };
16
+ /**
17
+ * Fetches or extracts the raster form configuration for a STAC object.
18
+ * Supports direct JSON objects, data URIs, and URL strings.
19
+ *
20
+ * @param {string|object|undefined} rasterform - The rasterform property from the STAC object.
21
+ * @returns {Promise<import("../types").EodashRasterJSONForm|undefined>}
22
+ */
23
+ export function fetchRasterForm(rasterform: string | object | undefined): Promise<import("../types").EodashRasterJSONForm | undefined>;
16
24
  /**
17
25
  * Spearates and extracts layerConfig (jsonform schema & legend) from a style json
18
26
  *
@@ -32,6 +40,13 @@ export function extractLayerConfig(collectionId: string, style?: import("../type
32
40
  layerConfig: Record<string, unknown> | undefined;
33
41
  style: import("../types").EodashStyleJson | undefined;
34
42
  };
43
+ /**
44
+ * Recursively extracts URL keys from a JSON Schema.
45
+ * Maps schema property names to their defined `url_key`.
46
+ * @param {Record<string, any> | null | undefined} schema
47
+ * @returns {Record<string, string>}
48
+ */
49
+ export function extractUrlKeys(schema: Record<string, any> | null | undefined): Record<string, string>;
35
50
  /**
36
51
  * Function to extract collection urls from an indicator
37
52
  * @param {import("stac-ts").StacCatalog
@@ -133,6 +148,16 @@ export function getBandsProperty(schema: Record<string, any> | null | undefined,
133
148
  * @returns {boolean} true if the source was rebuilt
134
149
  */
135
150
  export function updateGeoZarrBands(olLayer: import("ol/layer/Layer").default, jsonformValue: Record<string, any>): boolean;
151
+ /**
152
+ * Checks whether a VectorTile layer's URL needs to be updated based on jsonform output.
153
+ * If the style's jsonform schema has properties with `url_key` defined, their values
154
+ * are injected as query parameters into the source URL.
155
+ *
156
+ * @param {import("ol/layer/Layer").default} olLayer - Layer from layerConfig:change event
157
+ * @param {Record<string, any>} jsonformValue - Current jsonform output
158
+ * @returns {boolean} true if the URL was updated
159
+ */
160
+ export function updateLayerUrl(olLayer: import("ol/layer/Layer").default, jsonformValue: Record<string, any>): boolean;
136
161
  /**
137
162
  * Applies titiler upscaling to an XYZ tile URL based on the matched endpoint config.
138
163
  * - titiler v1: appends `@2x` to the `{y}` tile coordinate
@@ -151,18 +176,33 @@ export function applyTitilerUpscaling(url: string, upscalingEndpoints: Array<str
151
176
  tileSize: [number, number];
152
177
  } | null;
153
178
  /**
154
- * Picks the render presets for a collection, preferring the collection's own
155
- * STAC `renders` extension and falling back to client-provided config
156
- *
179
+ * Picks the render presets for a collection, preferring client-provided config
180
+ * (`options.renders[collectionId]`) and falling back to the collection's own STAC
181
+ * `renders` extension when no config entry exists.
157
182
  * @param {import("stac-ts").StacCollection | null | undefined} collection
158
183
  * @param {Record<string, Record<string, import("../types").Render>> | undefined} [configRenders]
159
184
  * @returns {Record<string, import("../types").Render> | undefined}
160
185
  */
161
186
  export function resolveRenders(collection: import("stac-ts").StacCollection | null | undefined, configRenders?: Record<string, Record<string, import("../types").Render>> | undefined): Record<string, import("../types").Render> | undefined;
162
187
  /**
163
- * Serializes an object into a TiTiler query string. Arrays join with commas;
164
- * nested arrays repeat the key (e.g. `rescale: [[0,1]]` -> `rescale=0,1`);
165
- * objects are JSON-encoded. Shared by the render-extension and mosaic paths.
188
+ * TiTiler expects rescale as [min,max] pairs; chunks a flat numeric list
189
+ * into pairs (e.g. [0,0.4,0,0.1] -> [[0,0.4],[0,0.1]]). Nested input passes through.
190
+ * @param {number[]|number[][]|undefined} rescale - flat or nested rescale values
191
+ * @returns {number[][]|undefined} rescale as [min,max] pairs
192
+ */
193
+ export function normalizeRescale(rescale: number[] | number[][] | undefined): number[][] | undefined;
194
+ /**
195
+ * Drops NaN nodata values; NaN is already the implicit fill for float data,
196
+ * so forwarding `nodata=nan` to TiTiler is redundant.
197
+ * @param {string|number|undefined} nodata - nodata value from render/asset metadata
198
+ * @returns {string|number|undefined} nodata, or undefined when it is NaN
199
+ */
200
+ export function normalizeNodata(nodata: string | number | undefined): string | number | undefined;
201
+ /**
202
+ * Serializes an object into a TiTiler query string. Arrays repeat the key per
203
+ * element (TiTiler list params, e.g. `assets=a&assets=b`); nested elements
204
+ * comma-join (`rescale: [[0,1],[0,2]]` -> `rescale=0,1&rescale=0,2`); objects
205
+ * are JSON-encoded. Shared by the render-extension and mosaic paths.
166
206
  * @param {Record<string,any>} obj
167
207
  * @returns {string}
168
208
  */
@@ -576,6 +616,6 @@ export function replaceLayer(layers: import("@eox/map").EoxLayer[], toRemove: st
576
616
  export function getColFromLayer(indicators: import("../eodashSTAC/EodashCollection.js").EodashCollection[], layer: import("ol/layer").Layer): Promise<import("../eodashSTAC/EodashCollection.js").EodashCollection | undefined>;
577
617
  export function createLayerID(collectionId: string, itemId: string, link: import("stac-ts").StacLink, projectionCode: string | import("ol/proj").ProjectionLike): string;
578
618
  export function createAssetID(collectionId: string, itemId: string, index: number): string;
579
- export function removeUnneededProperties(layers: Record<string, any>[]): Record<string, any>[];
619
+ export function removeUnneededProperties(layers: Record<string, any>[], formValues?: {}): Record<string, any>[];
580
620
  export function addTooltipInteraction(layer: Record<string, any>, style?: import("../types").EodashStyleJson): void;
581
621
  export function fetchSplitItems(itemsUrl: string, query: string, centerDatetime: string | Date, maxNumber: number): Promise<import("stac-ts").StacItem[]>;