@eodash/eodash 5.4.0 → 5.5.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.
- package/core/client/asWebComponent.js +1 -1
- package/core/client/composables/DefineWidgets.js +12 -2
- package/core/client/eodashSTAC/EodashCollection.js +3 -3
- package/core/client/eodashSTAC/createLayers.js +44 -17
- package/core/client/eodashSTAC/helpers.js +12 -5
- package/core/client/eodashSTAC/parquet.js +2 -1
- package/core/client/eodashSTAC/triggers.js +1 -2
- package/core/client/store/actions.js +17 -17
- package/core/client/store/states.js +26 -4
- package/core/client/types.ts +9 -0
- package/core/client/utils/index.js +18 -1
- package/dist/client/{DashboardLayout-CQOGHPW_.js → DashboardLayout-CkSgvaFF.js} +2 -2
- package/dist/client/{DynamicWebComponent-CoLO8FEf.js → DynamicWebComponent-Ncsg6fb9.js} +1 -1
- package/dist/client/EodashChart-5v7adDpG.js +144 -0
- package/dist/client/{EodashDatePicker-BZeQ6bcu.js → EodashDatePicker-RoQJe6ss.js} +4 -4
- package/dist/client/{EodashItemFilter-CmZkk7GK.js → EodashItemFilter-CCoVC5BE.js} +2 -2
- package/dist/client/{EodashLayerControl-D54fY-bX.js → EodashLayerControl-weVj7aQA.js} +2 -2
- package/dist/client/{EodashLayoutSwitcher-BCP3FvDb.js → EodashLayoutSwitcher-CL-Z9d5_.js} +3 -3
- package/dist/client/EodashMapBtns-CXU8IuPO.js +433 -0
- package/dist/client/{EodashStacInfo-BZbmT8vT.js → EodashStacInfo-BbMnjf-n.js} +11 -15
- package/dist/client/{EodashTimeSlider-DIcAJr6D.js → EodashTimeSlider-BZXnqfax.js} +2 -2
- package/dist/client/{EodashTools-Cz6X6hsF.js → EodashTools-DUJlkkgx.js} +4 -4
- package/dist/client/{ExportState-DFVFAgKz.js → ExportState-CT3FQOHW.js} +46 -21
- package/dist/client/{Footer-DLzQcjkI.js → Footer-D_iqP-1K.js} +1 -1
- package/dist/client/{Header-_D9Z-zFJ.js → Header-Dzhnvsy-.js} +127 -17
- package/dist/client/MobileLayout-6Rg_PSO8.js +118 -0
- package/dist/client/{PopUp-DwI8V2gW.js → PopUp-DPPv_GSA.js} +8 -59
- package/dist/client/{ProcessList-C9eAg2Sb.js → ProcessList-BIN_Mb27.js} +9 -13
- package/dist/client/{VImg-COXTnCWE.js → VImg-DhbuvNrA.js} +2 -2
- package/dist/client/{VMain-C74l1bv-.js → VMain-CVabY_NY.js} +1 -1
- package/dist/client/{VTooltip-BLS-cQ9N.js → VTooltip-Cc6au3Sn.js} +3 -4
- package/dist/client/{WidgetsContainer-D-VfMRxE.js → WidgetsContainer-ChqTJS4h.js} +1 -1
- package/dist/client/asWebComponent-DaIxULaA.js +9207 -0
- package/dist/client/{async-D4G-FOIc.js → async-D6Lvv-fT.js} +4 -4
- package/dist/client/eo-dash.js +1 -1
- package/dist/client/{forwardRefs-CRMFoNYN.js → forwardRefs--IccUBdR.js} +196 -37
- package/dist/client/{handling-DTAhQuPh.js → handling-DSA67d6E.js} +74 -35
- package/dist/client/{helpers-CsjKHAcK.js → helpers-BBSdbOmv.js} +187 -87
- package/dist/client/{index-DEmHaCL3.js → index-6LlXNkke.js} +5 -3
- package/dist/client/{index-BHilH1qx.js → index-BS-8Y5FE.js} +22 -69
- package/dist/client/{index-BIcmbjr0.js → index-CQihL_c6.js} +27 -14
- package/dist/client/{index-BoCcZ0l4.js → index-qsZhYR_6.js} +15 -16
- package/dist/client/templates.js +48 -2
- package/dist/client/{transition-6MJLK-_H.js → transition-DFr4cXu8.js} +1 -1
- package/dist/node/cli.js +1 -1
- package/dist/types/core/client/App.vue.d.ts +16 -6
- package/dist/types/core/client/asWebComponent.d.ts +2 -2
- package/dist/types/core/client/components/DashboardLayout.vue.d.ts +2 -1
- package/dist/types/core/client/components/DynamicWebComponent.vue.d.ts +36 -16
- package/dist/types/core/client/components/EodashOverlay.vue.d.ts +2 -1
- package/dist/types/core/client/components/ErrorAlert.vue.d.ts +9 -1
- package/dist/types/core/client/components/Footer.vue.d.ts +2 -1
- package/dist/types/core/client/components/Header.vue.d.ts +2 -1
- package/dist/types/core/client/components/IframeWrapper.vue.d.ts +12 -6
- package/dist/types/core/client/components/Loading.vue.d.ts +2 -1
- package/dist/types/core/client/components/MobileLayout.vue.d.ts +2 -1
- package/dist/types/core/client/eodashSTAC/helpers.d.ts +1 -0
- package/dist/types/core/client/store/actions.d.ts +1 -2
- package/dist/types/core/client/store/states.d.ts +22 -4
- package/dist/types/core/client/types.d.ts +6 -1
- package/dist/types/core/client/utils/index.d.ts +1 -0
- package/dist/types/core/client/views/Dashboard.vue.d.ts +20 -8
- package/dist/types/templates/compare.d.ts +20 -0
- package/dist/types/templates/expert.d.ts +30 -1
- package/dist/types/widgets/EodashChart.vue.d.ts +28 -0
- package/dist/types/widgets/EodashDatePicker.vue.d.ts +38 -9
- package/dist/types/widgets/EodashItemCatalog/index.vue.d.ts +88 -13
- package/dist/types/widgets/EodashItemCatalog/methods/map.d.ts +1 -1
- package/dist/types/widgets/EodashItemFilter.vue.d.ts +169 -26
- package/dist/types/widgets/EodashLayerControl.vue.d.ts +38 -10
- package/dist/types/widgets/EodashLayoutSwitcher.vue.d.ts +22 -7
- package/dist/types/widgets/EodashMap/EodashMapBtns.vue.d.ts +94 -21
- package/dist/types/widgets/EodashMap/index.vue.d.ts +646 -93
- package/dist/types/widgets/EodashMap/methods/btns.d.ts +14 -0
- package/dist/types/widgets/EodashProcess/ProcessList.vue.d.ts +24 -7
- package/dist/types/widgets/EodashProcess/index.vue.d.ts +26 -7
- package/dist/types/widgets/EodashProcess/methods/composables.d.ts +1 -2
- package/dist/types/widgets/EodashProcess/methods/handling.d.ts +5 -11
- package/dist/types/widgets/EodashProcess/methods/outputs.d.ts +2 -2
- package/dist/types/widgets/EodashStacInfo.vue.d.ts +67 -18
- package/dist/types/widgets/EodashTimeSlider.vue.d.ts +14 -6
- package/dist/types/widgets/EodashTools.vue.d.ts +437 -47
- package/dist/types/widgets/ExportState.vue.d.ts +26 -8
- package/dist/types/widgets/PopUp.vue.d.ts +61 -11
- package/dist/types/widgets/WidgetsContainer.vue.d.ts +22 -6
- package/package.json +33 -34
- package/templates/baseConfig.js +2 -1
- package/templates/compare.js +28 -1
- package/templates/expert.js +19 -1
- package/widgets/EodashChart.vue +139 -0
- package/widgets/EodashItemCatalog/index.vue +2 -2
- package/widgets/EodashItemCatalog/methods/map.js +9 -10
- package/widgets/EodashMap/EodashMapBtns.vue +58 -93
- package/widgets/EodashMap/index.vue +10 -2
- package/widgets/EodashMap/methods/btns.js +155 -0
- package/widgets/EodashMap/methods/create-layers-config.js +3 -3
- package/widgets/EodashMap/methods/index.js +2 -1
- package/widgets/EodashProcess/ProcessList.vue +2 -3
- package/widgets/EodashProcess/index.vue +18 -61
- package/widgets/EodashProcess/methods/async.js +1 -1
- package/widgets/EodashProcess/methods/composables.js +0 -5
- package/widgets/EodashProcess/methods/custom-endpoints/chart/veda-endpoint.js +10 -6
- package/widgets/EodashProcess/methods/handling.js +23 -22
- package/widgets/EodashProcess/methods/outputs.js +44 -4
- package/widgets/EodashProcess/methods/utils.js +1 -1
- package/widgets/EodashStacInfo.vue +10 -23
- package/widgets/ExportState.vue +9 -15
- package/dist/client/EodashMapBtns-D-HulIl1.js +0 -306
- package/dist/client/MobileLayout-3Ko9XSfO.js +0 -118
- package/dist/client/asWebComponent-Bw03Jutr.js +0 -9090
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { P as useEmitLayersUpdate } from './asWebComponent-
|
|
1
|
+
import { x as getCompareLayers, w as getLayers, $ as replaceLayer, b as extractLayerConfig, v as extractLayerLegend, m as mergeGeojsons, d as axios, a0 as axios$1, I as compareIndicator, G as indicator } from './helpers-BBSdbOmv.js';
|
|
2
|
+
import { P as useEmitLayersUpdate } from './asWebComponent-DaIxULaA.js';
|
|
3
3
|
import { isMulti } from '@eox/jsonform/src/custom-inputs/spatial/utils';
|
|
4
4
|
import log from 'loglevel';
|
|
5
5
|
|
|
@@ -537,7 +537,7 @@ const applyProcessLayersToMap = (mapElement, processLayers) => {
|
|
|
537
537
|
(l) => l.properties?.id === layer.properties?.id,
|
|
538
538
|
);
|
|
539
539
|
if (!exists) {
|
|
540
|
-
analysisGroup.layers.
|
|
540
|
+
analysisGroup.layers.push(layer);
|
|
541
541
|
} else {
|
|
542
542
|
analysisGroup.layers = replaceLayer(
|
|
543
543
|
analysisGroup.layers,
|
|
@@ -679,7 +679,7 @@ async function updateJobsStatus(jobs, indicator) {
|
|
|
679
679
|
new Date(a.job_start_datetime).getTime()
|
|
680
680
|
);
|
|
681
681
|
});
|
|
682
|
-
jobs.value
|
|
682
|
+
jobs.value.splice(0, jobs.value.length, ...jobResults);
|
|
683
683
|
}
|
|
684
684
|
|
|
685
685
|
/**
|
package/dist/client/eo-dash.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { aJ as EodashConstructor, aI as register, aK as store } from './asWebComponent-DaIxULaA.js';
|
|
2
2
|
import 'vue';
|
|
@@ -1,17 +1,18 @@
|
|
|
1
|
-
import { computed, watch, onScopeDispose, nextTick, ref, watchEffect, effectScope, inject, mergeProps, shallowRef, onMounted,
|
|
2
|
-
import {
|
|
3
|
-
import { m as makeTransitionProps, M as MaybeTransition } from './transition-
|
|
1
|
+
import { computed, watch, onScopeDispose, nextTick, ref, watchEffect, effectScope, inject, mergeProps, toRef, toValue, shallowRef, onMounted, reactive, provide, toRaw, readonly, warn, onBeforeUnmount, createElementVNode, Fragment, createVNode, Teleport, withDirectives, vShow, Transition } from 'vue';
|
|
2
|
+
import { aq as isOn, ar as eventName, p as propsFactory, as as destructComputed, at as parseAnchor, au as flipSide, av as flipAlign, aw as flipCorner, ax as CircularBuffer, ay as deepEqual, Y as consoleError, az as getAxis, o as convertToUnit, v as clamp, aA as IN_BROWSER, y as useToggleScope, aB as defer, al as getCurrentInstance, aC as templateRef, aD as matchesSelector, aE as focusableChildren, D as useDisplay, q as makeThemeProps, d as makeDimensionProps, e as makeComponentProps, g as genericComponent, $ as omit, x as useProxiedModel, k as provideTheme, l as useRtl, f as useBackgroundColor, b as useDimension, aF as useRouter, aG as useBackButton, ao as standardEasing, c as useRender } from './asWebComponent-DaIxULaA.js';
|
|
3
|
+
import { m as makeTransitionProps, M as MaybeTransition } from './transition-DFr4cXu8.js';
|
|
4
4
|
|
|
5
5
|
class Box {
|
|
6
6
|
constructor(args) {
|
|
7
7
|
const pageScale = document.body.currentCSSZoom ?? 1;
|
|
8
|
-
const
|
|
8
|
+
const isElement = args instanceof Element;
|
|
9
|
+
const factor = isElement ? 1 + (1 - pageScale) / pageScale : 1;
|
|
9
10
|
const {
|
|
10
11
|
x,
|
|
11
12
|
y,
|
|
12
13
|
width,
|
|
13
14
|
height
|
|
14
|
-
} = args;
|
|
15
|
+
} = isElement ? args.getBoundingClientRect() : args;
|
|
15
16
|
this.x = x * factor;
|
|
16
17
|
this.y = y * factor;
|
|
17
18
|
this.width = width * factor;
|
|
@@ -53,7 +54,7 @@ function getTargetBox(target) {
|
|
|
53
54
|
height: 0 * factor
|
|
54
55
|
});
|
|
55
56
|
} else {
|
|
56
|
-
return new Box(target
|
|
57
|
+
return new Box(target);
|
|
57
58
|
}
|
|
58
59
|
}
|
|
59
60
|
function getElementBox(el) {
|
|
@@ -75,20 +76,14 @@ function getElementBox(el) {
|
|
|
75
76
|
});
|
|
76
77
|
}
|
|
77
78
|
} else {
|
|
78
|
-
|
|
79
|
-
return new Box({
|
|
80
|
-
x: rect.x,
|
|
81
|
-
y: rect.y,
|
|
82
|
-
width: el.clientWidth,
|
|
83
|
-
height: el.clientHeight
|
|
84
|
-
});
|
|
79
|
+
return new Box(el);
|
|
85
80
|
}
|
|
86
81
|
}
|
|
87
82
|
|
|
88
83
|
// Utilities
|
|
89
84
|
/** @see https://stackoverflow.com/a/57876601/2074736 */
|
|
90
85
|
function nullifyTransforms(el) {
|
|
91
|
-
const rect = new Box(el
|
|
86
|
+
const rect = new Box(el);
|
|
92
87
|
const style = getComputedStyle(el);
|
|
93
88
|
const tx = style.transform;
|
|
94
89
|
if (tx) {
|
|
@@ -418,7 +413,11 @@ const makeLocationStrategyProps = propsFactory({
|
|
|
418
413
|
default: 'auto'
|
|
419
414
|
},
|
|
420
415
|
offset: [Number, String, Array],
|
|
421
|
-
stickToTarget: Boolean
|
|
416
|
+
stickToTarget: Boolean,
|
|
417
|
+
viewportMargin: {
|
|
418
|
+
type: [Number, String],
|
|
419
|
+
default: 12
|
|
420
|
+
}
|
|
422
421
|
}, 'VOverlay-location-strategies');
|
|
423
422
|
function useLocationStrategies(props, data) {
|
|
424
423
|
const contentStyles = ref({});
|
|
@@ -605,7 +604,7 @@ function connectedLocationStrategy(data, props, contentStyles) {
|
|
|
605
604
|
|
|
606
605
|
const contentBox = getIntrinsicSize(data.contentEl.value, data.isRtl.value);
|
|
607
606
|
const scrollParents = getScrollParents(data.contentEl.value);
|
|
608
|
-
const viewportMargin =
|
|
607
|
+
const viewportMargin = Number(props.viewportMargin);
|
|
609
608
|
if (!scrollParents.length) {
|
|
610
609
|
scrollParents.push(document.documentElement);
|
|
611
610
|
if (!(data.contentEl.value.style.top && data.contentEl.value.style.left)) {
|
|
@@ -625,10 +624,17 @@ function connectedLocationStrategy(data, props, contentStyles) {
|
|
|
625
624
|
}
|
|
626
625
|
return scrollBox;
|
|
627
626
|
}, undefined);
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
627
|
+
if (props.stickToTarget) {
|
|
628
|
+
viewport.x += Math.min(viewportMargin, targetBox.x);
|
|
629
|
+
viewport.y += Math.min(viewportMargin, targetBox.y);
|
|
630
|
+
viewport.width = Math.max(viewport.width - viewportMargin * 2, targetBox.x + targetBox.width - viewportMargin);
|
|
631
|
+
viewport.height = Math.max(viewport.height - viewportMargin * 2, targetBox.y + targetBox.height - viewportMargin);
|
|
632
|
+
} else {
|
|
633
|
+
viewport.x += viewportMargin;
|
|
634
|
+
viewport.y += viewportMargin;
|
|
635
|
+
viewport.width -= viewportMargin * 2;
|
|
636
|
+
viewport.height -= viewportMargin * 2;
|
|
637
|
+
}
|
|
632
638
|
let placement = {
|
|
633
639
|
anchor: preferredAnchor.value,
|
|
634
640
|
origin: preferredOrigin.value
|
|
@@ -739,19 +745,19 @@ function connectedLocationStrategy(data, props, contentStyles) {
|
|
|
739
745
|
|
|
740
746
|
// shift
|
|
741
747
|
if (overflows.x.before) {
|
|
742
|
-
|
|
748
|
+
x += overflows.x.before;
|
|
743
749
|
contentBox.x += overflows.x.before;
|
|
744
750
|
}
|
|
745
751
|
if (overflows.x.after) {
|
|
746
|
-
|
|
752
|
+
x -= overflows.x.after;
|
|
747
753
|
contentBox.x -= overflows.x.after;
|
|
748
754
|
}
|
|
749
755
|
if (overflows.y.before) {
|
|
750
|
-
|
|
756
|
+
y += overflows.y.before;
|
|
751
757
|
contentBox.y += overflows.y.before;
|
|
752
758
|
}
|
|
753
759
|
if (overflows.y.after) {
|
|
754
|
-
|
|
760
|
+
y -= overflows.y.after;
|
|
755
761
|
contentBox.y -= overflows.y.after;
|
|
756
762
|
}
|
|
757
763
|
|
|
@@ -760,9 +766,9 @@ function connectedLocationStrategy(data, props, contentStyles) {
|
|
|
760
766
|
const overflows = getOverflow(contentBox, viewport);
|
|
761
767
|
available.x = viewport.width - overflows.x.before - overflows.x.after;
|
|
762
768
|
available.y = viewport.height - overflows.y.before - overflows.y.after;
|
|
763
|
-
|
|
769
|
+
x += overflows.x.before;
|
|
764
770
|
contentBox.x += overflows.x.before;
|
|
765
|
-
|
|
771
|
+
y += overflows.y.before;
|
|
766
772
|
contentBox.y += overflows.y.before;
|
|
767
773
|
}
|
|
768
774
|
break;
|
|
@@ -985,11 +991,12 @@ const makeDelayProps = propsFactory({
|
|
|
985
991
|
}, 'delay');
|
|
986
992
|
function useDelay(props, cb) {
|
|
987
993
|
let clearDelay = () => {};
|
|
988
|
-
function runDelay(isOpening) {
|
|
994
|
+
function runDelay(isOpening, options) {
|
|
989
995
|
clearDelay?.();
|
|
990
|
-
const delay =
|
|
996
|
+
const delay = isOpening ? props.openDelay : props.closeDelay;
|
|
997
|
+
const normalizedDelay = Math.max(options?.minDelay ?? 0, Number(delay ?? 0));
|
|
991
998
|
return new Promise(resolve => {
|
|
992
|
-
clearDelay = defer(
|
|
999
|
+
clearDelay = defer(normalizedDelay, () => {
|
|
993
1000
|
cb?.(isOpening);
|
|
994
1001
|
resolve(isOpening);
|
|
995
1002
|
});
|
|
@@ -998,8 +1005,8 @@ function useDelay(props, cb) {
|
|
|
998
1005
|
function runOpenDelay() {
|
|
999
1006
|
return runDelay(true);
|
|
1000
1007
|
}
|
|
1001
|
-
function runCloseDelay() {
|
|
1002
|
-
return runDelay(false);
|
|
1008
|
+
function runCloseDelay(options) {
|
|
1009
|
+
return runDelay(false, options);
|
|
1003
1010
|
}
|
|
1004
1011
|
return {
|
|
1005
1012
|
clearDelay,
|
|
@@ -1063,7 +1070,6 @@ function useActivator(props, _ref) {
|
|
|
1063
1070
|
isActive.value = !isActive.value;
|
|
1064
1071
|
},
|
|
1065
1072
|
onMouseenter: e => {
|
|
1066
|
-
if (e.sourceCapabilities?.firesTouchEvents) return;
|
|
1067
1073
|
isHovered = true;
|
|
1068
1074
|
activatorEl.value = e.currentTarget || e.target;
|
|
1069
1075
|
runOpenDelay();
|
|
@@ -1082,7 +1088,9 @@ function useActivator(props, _ref) {
|
|
|
1082
1088
|
onBlur: e => {
|
|
1083
1089
|
isFocused = false;
|
|
1084
1090
|
e.stopPropagation();
|
|
1085
|
-
runCloseDelay(
|
|
1091
|
+
runCloseDelay({
|
|
1092
|
+
minDelay: 1
|
|
1093
|
+
});
|
|
1086
1094
|
}
|
|
1087
1095
|
};
|
|
1088
1096
|
const activatorEvents = computed(() => {
|
|
@@ -1113,13 +1121,16 @@ function useActivator(props, _ref) {
|
|
|
1113
1121
|
};
|
|
1114
1122
|
}
|
|
1115
1123
|
if (openOnFocus.value) {
|
|
1116
|
-
events.onFocusin =
|
|
1124
|
+
events.onFocusin = e => {
|
|
1125
|
+
if (!e.target.matches(':focus-visible')) return;
|
|
1117
1126
|
isFocused = true;
|
|
1118
1127
|
runOpenDelay();
|
|
1119
1128
|
};
|
|
1120
1129
|
events.onFocusout = () => {
|
|
1121
1130
|
isFocused = false;
|
|
1122
|
-
runCloseDelay(
|
|
1131
|
+
runCloseDelay({
|
|
1132
|
+
minDelay: 1
|
|
1133
|
+
});
|
|
1123
1134
|
};
|
|
1124
1135
|
}
|
|
1125
1136
|
if (props.closeOnContentClick) {
|
|
@@ -1274,6 +1285,148 @@ function getTarget(selector, vm) {
|
|
|
1274
1285
|
return target;
|
|
1275
1286
|
}
|
|
1276
1287
|
|
|
1288
|
+
// Utilities
|
|
1289
|
+
// Types
|
|
1290
|
+
// Composables
|
|
1291
|
+
const makeFocusTrapProps = propsFactory({
|
|
1292
|
+
retainFocus: Boolean,
|
|
1293
|
+
captureFocus: Boolean,
|
|
1294
|
+
/** @deprecated */
|
|
1295
|
+
disableInitialFocus: Boolean
|
|
1296
|
+
}, 'focusTrap');
|
|
1297
|
+
const registry = new Map();
|
|
1298
|
+
let subscribers = 0;
|
|
1299
|
+
function onKeydown(e) {
|
|
1300
|
+
const activeElement = document.activeElement;
|
|
1301
|
+
if (e.key !== 'Tab' || !activeElement) return;
|
|
1302
|
+
const parentTraps = Array.from(registry.values()).filter(_ref => {
|
|
1303
|
+
let {
|
|
1304
|
+
isActive,
|
|
1305
|
+
contentEl
|
|
1306
|
+
} = _ref;
|
|
1307
|
+
return isActive.value && contentEl.value?.contains(activeElement);
|
|
1308
|
+
}).map(x => x.contentEl.value);
|
|
1309
|
+
let closestTrap;
|
|
1310
|
+
let currentParent = activeElement.parentElement;
|
|
1311
|
+
while (currentParent) {
|
|
1312
|
+
if (parentTraps.includes(currentParent)) {
|
|
1313
|
+
closestTrap = currentParent;
|
|
1314
|
+
break;
|
|
1315
|
+
}
|
|
1316
|
+
currentParent = currentParent.parentElement;
|
|
1317
|
+
}
|
|
1318
|
+
if (!closestTrap) return;
|
|
1319
|
+
const focusable = focusableChildren(closestTrap)
|
|
1320
|
+
// excluding VListItems with tabindex="-2"
|
|
1321
|
+
.filter(x => x.tabIndex >= 0);
|
|
1322
|
+
if (!focusable.length) return;
|
|
1323
|
+
const active = document.activeElement;
|
|
1324
|
+
if (focusable.length === 1 && focusable[0].classList.contains('v-list') && focusable[0].contains(active)) {
|
|
1325
|
+
e.preventDefault();
|
|
1326
|
+
return;
|
|
1327
|
+
}
|
|
1328
|
+
const firstElement = focusable[0];
|
|
1329
|
+
const lastElement = focusable[focusable.length - 1];
|
|
1330
|
+
if (e.shiftKey && (active === firstElement || firstElement.classList.contains('v-list') && firstElement.contains(active))) {
|
|
1331
|
+
e.preventDefault();
|
|
1332
|
+
lastElement.focus();
|
|
1333
|
+
}
|
|
1334
|
+
if (!e.shiftKey && (active === lastElement || lastElement.classList.contains('v-list') && lastElement.contains(active))) {
|
|
1335
|
+
e.preventDefault();
|
|
1336
|
+
firstElement.focus();
|
|
1337
|
+
}
|
|
1338
|
+
}
|
|
1339
|
+
function useFocusTrap(props, _ref2) {
|
|
1340
|
+
let {
|
|
1341
|
+
isActive,
|
|
1342
|
+
localTop,
|
|
1343
|
+
contentEl
|
|
1344
|
+
} = _ref2;
|
|
1345
|
+
const trapId = Symbol('trap');
|
|
1346
|
+
let focusTrapSuppressed = false;
|
|
1347
|
+
let focusTrapSuppressionTimeout = -1;
|
|
1348
|
+
async function onPointerdown() {
|
|
1349
|
+
focusTrapSuppressed = true;
|
|
1350
|
+
focusTrapSuppressionTimeout = window.setTimeout(() => {
|
|
1351
|
+
focusTrapSuppressed = false;
|
|
1352
|
+
}, 100);
|
|
1353
|
+
}
|
|
1354
|
+
async function captureOnFocus(e) {
|
|
1355
|
+
const before = e.relatedTarget;
|
|
1356
|
+
const after = e.target;
|
|
1357
|
+
document.removeEventListener('pointerdown', onPointerdown);
|
|
1358
|
+
document.removeEventListener('keydown', captureOnKeydown);
|
|
1359
|
+
await nextTick();
|
|
1360
|
+
if (isActive.value && !focusTrapSuppressed && before !== after && contentEl.value &&
|
|
1361
|
+
// We're the menu without open submenus or overlays
|
|
1362
|
+
toValue(localTop) &&
|
|
1363
|
+
// It isn't the document or the container body
|
|
1364
|
+
![document, contentEl.value].includes(after) &&
|
|
1365
|
+
// It isn't inside the container body
|
|
1366
|
+
!contentEl.value.contains(after)) {
|
|
1367
|
+
const focusable = focusableChildren(contentEl.value);
|
|
1368
|
+
focusable[0]?.focus();
|
|
1369
|
+
}
|
|
1370
|
+
}
|
|
1371
|
+
function captureOnKeydown(e) {
|
|
1372
|
+
if (e.key !== 'Tab') return;
|
|
1373
|
+
document.removeEventListener('keydown', captureOnKeydown);
|
|
1374
|
+
if (isActive.value && contentEl.value && e.target && !contentEl.value.contains(e.target)) {
|
|
1375
|
+
const allFocusableElements = focusableChildren(document.documentElement);
|
|
1376
|
+
if (e.shiftKey && e.target === allFocusableElements.at(0) || !e.shiftKey && e.target === allFocusableElements.at(-1)) {
|
|
1377
|
+
const focusable = focusableChildren(contentEl.value);
|
|
1378
|
+
if (focusable.length > 0) {
|
|
1379
|
+
e.preventDefault();
|
|
1380
|
+
focusable[0].focus();
|
|
1381
|
+
}
|
|
1382
|
+
}
|
|
1383
|
+
}
|
|
1384
|
+
}
|
|
1385
|
+
const shouldCapture = toRef(() => isActive.value && props.captureFocus && !props.disableInitialFocus);
|
|
1386
|
+
if (IN_BROWSER) {
|
|
1387
|
+
watch(() => props.retainFocus, val => {
|
|
1388
|
+
if (val) {
|
|
1389
|
+
registry.set(trapId, {
|
|
1390
|
+
isActive,
|
|
1391
|
+
contentEl
|
|
1392
|
+
});
|
|
1393
|
+
} else {
|
|
1394
|
+
registry.delete(trapId);
|
|
1395
|
+
}
|
|
1396
|
+
}, {
|
|
1397
|
+
immediate: true
|
|
1398
|
+
});
|
|
1399
|
+
watch(shouldCapture, val => {
|
|
1400
|
+
if (val) {
|
|
1401
|
+
document.addEventListener('pointerdown', onPointerdown);
|
|
1402
|
+
document.addEventListener('focusin', captureOnFocus, {
|
|
1403
|
+
once: true
|
|
1404
|
+
});
|
|
1405
|
+
document.addEventListener('keydown', captureOnKeydown);
|
|
1406
|
+
} else {
|
|
1407
|
+
document.removeEventListener('pointerdown', onPointerdown);
|
|
1408
|
+
document.removeEventListener('focusin', captureOnFocus);
|
|
1409
|
+
document.removeEventListener('keydown', captureOnKeydown);
|
|
1410
|
+
}
|
|
1411
|
+
}, {
|
|
1412
|
+
immediate: true
|
|
1413
|
+
});
|
|
1414
|
+
if (subscribers++ < 1) {
|
|
1415
|
+
document.addEventListener('keydown', onKeydown);
|
|
1416
|
+
}
|
|
1417
|
+
}
|
|
1418
|
+
onScopeDispose(() => {
|
|
1419
|
+
registry.delete(trapId);
|
|
1420
|
+
clearTimeout(focusTrapSuppressionTimeout);
|
|
1421
|
+
document.removeEventListener('pointerdown', onPointerdown);
|
|
1422
|
+
document.removeEventListener('focusin', captureOnFocus);
|
|
1423
|
+
document.removeEventListener('keydown', captureOnKeydown);
|
|
1424
|
+
if (--subscribers < 1) {
|
|
1425
|
+
document.removeEventListener('keydown', onKeydown);
|
|
1426
|
+
}
|
|
1427
|
+
});
|
|
1428
|
+
}
|
|
1429
|
+
|
|
1277
1430
|
// Composables
|
|
1278
1431
|
function useHydration() {
|
|
1279
1432
|
if (!IN_BROWSER) return shallowRef(false);
|
|
@@ -1432,6 +1585,7 @@ const makeVOverlayProps = propsFactory({
|
|
|
1432
1585
|
...makeLazyProps(),
|
|
1433
1586
|
...makeLocationStrategyProps(),
|
|
1434
1587
|
...makeScrollStrategyProps(),
|
|
1588
|
+
...makeFocusTrapProps(),
|
|
1435
1589
|
...makeThemeProps(),
|
|
1436
1590
|
...makeTransitionProps()
|
|
1437
1591
|
}, 'VOverlay');
|
|
@@ -1443,7 +1597,7 @@ const VOverlay = genericComponent()({
|
|
|
1443
1597
|
inheritAttrs: false,
|
|
1444
1598
|
props: {
|
|
1445
1599
|
_disableGlobalStack: Boolean,
|
|
1446
|
-
...makeVOverlayProps()
|
|
1600
|
+
...omit(makeVOverlayProps(), ['disableInitialFocus'])
|
|
1447
1601
|
},
|
|
1448
1602
|
emits: {
|
|
1449
1603
|
'click:outside': e => true,
|
|
@@ -1543,10 +1697,14 @@ const VOverlay = genericComponent()({
|
|
|
1543
1697
|
if (!props.persistent) isActive.value = false;else animateClick();
|
|
1544
1698
|
}
|
|
1545
1699
|
function closeConditional(e) {
|
|
1546
|
-
return isActive.value &&
|
|
1700
|
+
return isActive.value && localTop.value && (
|
|
1547
1701
|
// If using scrim, only close if clicking on it rather than anything opened on top
|
|
1548
1702
|
!props.scrim || e.target === scrimEl.value || e instanceof MouseEvent && e.shadowTarget === scrimEl.value);
|
|
1549
1703
|
}
|
|
1704
|
+
useFocusTrap(props, {
|
|
1705
|
+
isActive,
|
|
1706
|
+
localTop,
|
|
1707
|
+
contentEl});
|
|
1550
1708
|
IN_BROWSER && watch(isActive, val => {
|
|
1551
1709
|
if (val) {
|
|
1552
1710
|
window.addEventListener('keydown', onKeydown);
|
|
@@ -1672,6 +1830,7 @@ const VOverlay = genericComponent()({
|
|
|
1672
1830
|
target,
|
|
1673
1831
|
animateClick,
|
|
1674
1832
|
contentEl,
|
|
1833
|
+
rootEl: root,
|
|
1675
1834
|
globalTop,
|
|
1676
1835
|
localTop,
|
|
1677
1836
|
updateLocation
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import log from 'loglevel';
|
|
2
|
-
import { s as separateEndpointLinks, c as createTiffLayerDefinition, p as pollProcessStatus, e as extractAsyncResults, u as updateJobsStatus, a as creatAsyncProcessLayerDefinitions, b as getBboxProperty, f as generateTimePairs, h as updateJsonformSchemaTarget, i as extractGeometries, j as applyProcessLayersToMap, g as getDrawToolsProperty } from './async-
|
|
3
|
-
import { d as axios, b as extractLayerConfig, I as compareIndicator, G as indicator, y as extractCollectionUrls, H as currentCompareUrl, B as currentUrl, z as generateLinksFromItems, o as getDatetimeProperty, C as datetime,
|
|
2
|
+
import { s as separateEndpointLinks, c as createTiffLayerDefinition, p as pollProcessStatus, e as extractAsyncResults, u as updateJobsStatus, a as creatAsyncProcessLayerDefinitions, b as getBboxProperty, f as generateTimePairs, h as updateJsonformSchemaTarget, i as extractGeometries, j as applyProcessLayersToMap, g as getDrawToolsProperty } from './async-D6Lvv-fT.js';
|
|
3
|
+
import { d as axios, b as extractLayerConfig, I as compareIndicator, G as indicator, y as extractCollectionUrls, H as currentCompareUrl, B as currentUrl, z as generateLinksFromItems, o as getDatetimeProperty, J as comparePoi, C as datetime, w as getLayers, Z as compareChartData, _ as chartData, O as compareChartSpec, N as chartSpec, D as poi } from './helpers-BBSdbOmv.js';
|
|
4
4
|
import mustache from 'mustache';
|
|
5
|
-
import { Q as isFirstLoad, E as useSTAcStore,
|
|
5
|
+
import { Q as isFirstLoad, E as useSTAcStore, T as readParquetItems, U as useGetSubCodeId } from './asWebComponent-DaIxULaA.js';
|
|
6
6
|
import { toAbsolute } from 'stac-js/src/http.js';
|
|
7
7
|
|
|
8
8
|
////// --- CHARTS --- //////
|
|
@@ -17,7 +17,7 @@ import { toAbsolute } from 'stac-js/src/http.js';
|
|
|
17
17
|
* @param {Record<string,any>} options.jsonformSchema
|
|
18
18
|
* @param {import("vue").Ref<import("../types").AsyncJob[]>} options.jobs
|
|
19
19
|
* @param {boolean} [options.enableCompare=false] - Whether to enable compare mode
|
|
20
|
-
* @returns {Promise<[import("
|
|
20
|
+
* @returns {Promise<[import("vega-embed").VisualizationSpec | null,Record<string,any>|null]>}
|
|
21
21
|
**/
|
|
22
22
|
async function processCharts({
|
|
23
23
|
links,
|
|
@@ -61,10 +61,48 @@ async function processCharts({
|
|
|
61
61
|
if (data && data.length) {
|
|
62
62
|
//@ts-expect-error we assume data to exist in spec
|
|
63
63
|
spec.data.values = data;
|
|
64
|
-
return [spec, dataValues];
|
|
64
|
+
return [structuredClone(spec), structuredClone(dataValues)];
|
|
65
65
|
}
|
|
66
|
-
|
|
67
66
|
const dataLinks = standardLinks.filter((link) => link.rel === "service");
|
|
67
|
+
|
|
68
|
+
// We count if there are at least two application/json links, if yes,
|
|
69
|
+
// we download the data and assign them to specific data ids in the spec
|
|
70
|
+
const jsonLinks = dataLinks.filter(
|
|
71
|
+
(link) => link.type === "application/json",
|
|
72
|
+
);
|
|
73
|
+
if (jsonLinks.length >= 2) {
|
|
74
|
+
for (const link of jsonLinks ?? []) {
|
|
75
|
+
let linkType = link.type;
|
|
76
|
+
switch (linkType) {
|
|
77
|
+
case undefined:
|
|
78
|
+
continue;
|
|
79
|
+
case "application/json":
|
|
80
|
+
dataValues[/** @type {string} */ (link.id)] = await axios
|
|
81
|
+
.get(
|
|
82
|
+
mustache.render(link.href, {
|
|
83
|
+
...(jsonformValue ?? {}),
|
|
84
|
+
}),
|
|
85
|
+
)
|
|
86
|
+
.then((resp) => resp.data);
|
|
87
|
+
// assign to spec datasets, assuming spec.data is InlineData
|
|
88
|
+
// Always assign values as an object with string keys
|
|
89
|
+
if (spec.data) {
|
|
90
|
+
/** @type {import("vega-lite/build/src/data").InlineData} */
|
|
91
|
+
(spec.data).values = {
|
|
92
|
+
...(spec.data &&
|
|
93
|
+
"values" in spec.data &&
|
|
94
|
+
typeof spec.data.values === "object"
|
|
95
|
+
? spec.data.values
|
|
96
|
+
: {}),
|
|
97
|
+
[/** @type {string} */ (link.id)]:
|
|
98
|
+
dataValues[/** @type {string} */ (link.id)],
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return [spec, dataValues];
|
|
105
|
+
}
|
|
68
106
|
try {
|
|
69
107
|
checkForData: for (const link of dataLinks ?? []) {
|
|
70
108
|
switch (link.type) {
|
|
@@ -91,7 +129,7 @@ async function processCharts({
|
|
|
91
129
|
} catch (e) {
|
|
92
130
|
console.error("[eodash] Error while injecting Vega data", e);
|
|
93
131
|
}
|
|
94
|
-
return [spec, dataValues];
|
|
132
|
+
return [structuredClone(spec), structuredClone(dataValues)];
|
|
95
133
|
}
|
|
96
134
|
|
|
97
135
|
/**
|
|
@@ -797,7 +835,9 @@ async function handleVedaEndpoint({
|
|
|
797
835
|
enableCompare = false,
|
|
798
836
|
}) {
|
|
799
837
|
const vedaLink = links.find(
|
|
800
|
-
(link) =>
|
|
838
|
+
(link) =>
|
|
839
|
+
link.rel === "service" &&
|
|
840
|
+
(link.endpoint === "veda" || link.endpoint === "veda_stac"),
|
|
801
841
|
);
|
|
802
842
|
if (!vedaLink) {
|
|
803
843
|
return;
|
|
@@ -895,12 +935,14 @@ async function fetchVedaCOGsConfig(selectedStac, absoluteUrl, vedaLink) {
|
|
|
895
935
|
const itemLinks = collection.links.filter((link) => link.rel == "item");
|
|
896
936
|
configs.push(
|
|
897
937
|
...itemLinks.map((link) => {
|
|
898
|
-
const endpoint = /** @type {string} */ (
|
|
938
|
+
const endpoint = /** @type {string} */ (
|
|
939
|
+
vedaLink.endpoint === "veda_stac" ? link.id : link["cog_href"]
|
|
940
|
+
);
|
|
899
941
|
return {
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
942
|
+
endpoint,
|
|
943
|
+
datetime: /** @type string **/ (link[datetimeProperty]),
|
|
944
|
+
};
|
|
945
|
+
}),
|
|
904
946
|
);
|
|
905
947
|
}
|
|
906
948
|
|
|
@@ -965,7 +1007,6 @@ function createCustomChartEndpointsHandler(callbacks) {
|
|
|
965
1007
|
* @param {import("vue").Ref<import("stac-ts").StacCollection | null>} params.selectedStac
|
|
966
1008
|
* @param {import("vue").Ref<import("@eox/jsonform").EOxJSONForm | null>} params.jsonformEl
|
|
967
1009
|
* @param {import("vue").Ref<Record<string,any> | null>} params.jsonformSchema
|
|
968
|
-
* @param {import("vue").Ref<import("@eox/chart").EOxChart["spec"] | null>} params.chartSpec
|
|
969
1010
|
* @param {import("vue").Ref<any[]>} params.processResults
|
|
970
1011
|
* @param {import("vue").Ref<boolean>} params.isProcessed
|
|
971
1012
|
* @param {import("vue").Ref<boolean>} params.loading
|
|
@@ -976,7 +1017,6 @@ async function initProcess({
|
|
|
976
1017
|
selectedStac,
|
|
977
1018
|
jsonformEl,
|
|
978
1019
|
jsonformSchema,
|
|
979
|
-
chartSpec,
|
|
980
1020
|
isProcessed,
|
|
981
1021
|
processResults,
|
|
982
1022
|
loading,
|
|
@@ -999,10 +1039,10 @@ async function initProcess({
|
|
|
999
1039
|
resetProcess({
|
|
1000
1040
|
loading,
|
|
1001
1041
|
isProcessed,
|
|
1002
|
-
chartSpec,
|
|
1003
1042
|
jsonformSchema,
|
|
1004
1043
|
isPolling,
|
|
1005
1044
|
processResults,
|
|
1045
|
+
enableCompare,
|
|
1006
1046
|
});
|
|
1007
1047
|
|
|
1008
1048
|
await jsonformEl.value?.editor.destroy();
|
|
@@ -1096,8 +1136,6 @@ async function updateJsonformIdentifier({ jsonformSchema, newLayers }) {
|
|
|
1096
1136
|
* @param {import("vue").Ref<import("stac-ts").StacCollection | null>} params.selectedStac
|
|
1097
1137
|
* @param {import("vue").Ref<import("@eox/jsonform").EOxJSONForm | null>} params.jsonformEl
|
|
1098
1138
|
* @param {import("vue").Ref<Record<string,any>|null>} params.jsonformSchema
|
|
1099
|
-
* @param {import("vue").Ref<import("@eox/chart").EOxChart["spec"] | null>} params.chartSpec
|
|
1100
|
-
* @param {import("vue").Ref<Record<string, any> | null>} params.chartData
|
|
1101
1139
|
* @param {import("vue").Ref<boolean>} params.isPolling
|
|
1102
1140
|
* @param {import("vue").Ref<any[]>} params.processResults
|
|
1103
1141
|
* @param {import("@eox/map").EOxMap | null} params.mapElement
|
|
@@ -1108,8 +1146,6 @@ async function handleProcesses({
|
|
|
1108
1146
|
selectedStac,
|
|
1109
1147
|
jsonformEl,
|
|
1110
1148
|
jsonformSchema,
|
|
1111
|
-
chartSpec,
|
|
1112
|
-
chartData,
|
|
1113
1149
|
isPolling,
|
|
1114
1150
|
processResults,
|
|
1115
1151
|
mapElement,
|
|
@@ -1118,6 +1154,7 @@ async function handleProcesses({
|
|
|
1118
1154
|
if (!jsonformEl.value || !jsonformSchema.value || !selectedStac.value) {
|
|
1119
1155
|
return;
|
|
1120
1156
|
}
|
|
1157
|
+
const enableCompare = mapElement?.id === "compare";
|
|
1121
1158
|
|
|
1122
1159
|
log.debug("Processing...");
|
|
1123
1160
|
loading.value = true;
|
|
@@ -1139,12 +1176,14 @@ async function handleProcesses({
|
|
|
1139
1176
|
selectedStac.value?.["eodash:vegadefinition"]
|
|
1140
1177
|
);
|
|
1141
1178
|
const layerId = selectedStac.value?.id ?? "";
|
|
1142
|
-
|
|
1143
|
-
|
|
1179
|
+
const usedChartSpec = enableCompare ? compareChartSpec : chartSpec;
|
|
1180
|
+
const usedChartData = enableCompare ? compareChartData : chartData;
|
|
1181
|
+
let tempChartSpec = null;
|
|
1182
|
+
[tempChartSpec, usedChartData.value] = await processCharts({
|
|
1144
1183
|
links: serviceLinks,
|
|
1145
1184
|
jsonformValue: { ...(jsonformValue ?? {}) },
|
|
1146
1185
|
jsonformSchema: jsonformSchema.value,
|
|
1147
|
-
enableCompare
|
|
1186
|
+
enableCompare,
|
|
1148
1187
|
selectedStac: selectedStac.value,
|
|
1149
1188
|
specUrl,
|
|
1150
1189
|
isPolling,
|
|
@@ -1152,19 +1191,19 @@ async function handleProcesses({
|
|
|
1152
1191
|
customEndpointsHandler: handleChartCustomEndpoints,
|
|
1153
1192
|
});
|
|
1154
1193
|
|
|
1155
|
-
if (Object.keys(
|
|
1156
|
-
processResults.value.push(
|
|
1194
|
+
if (Object.keys(usedChartData.value ?? {}).length) {
|
|
1195
|
+
processResults.value.push(usedChartData.value);
|
|
1157
1196
|
}
|
|
1158
1197
|
|
|
1159
1198
|
//@ts-expect-error we assume that the spec data is of type InlineData
|
|
1160
|
-
if (
|
|
1199
|
+
if (tempChartSpec.data?.values?.length) {
|
|
1161
1200
|
//@ts-expect-error we assume that the spec data is of type InlineData
|
|
1162
|
-
processResults.value.push(
|
|
1201
|
+
processResults.value.push(tempChartSpec?.data.values);
|
|
1163
1202
|
}
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
chartSpec.value["background"] = "transparent";
|
|
1203
|
+
if (tempChartSpec && !("background" in tempChartSpec)) {
|
|
1204
|
+
tempChartSpec["background"] = "transparent";
|
|
1167
1205
|
}
|
|
1206
|
+
usedChartSpec.value = tempChartSpec;
|
|
1168
1207
|
|
|
1169
1208
|
await processSTAC(
|
|
1170
1209
|
serviceLinks,
|
|
@@ -1215,23 +1254,24 @@ async function handleProcesses({
|
|
|
1215
1254
|
* @param {Object} params
|
|
1216
1255
|
* @param {import("vue").Ref<boolean>} params.loading
|
|
1217
1256
|
* @param {import("vue").Ref<boolean>} params.isProcessed
|
|
1218
|
-
* @param {import("vue").Ref<import("@eox/chart").EOxChart["spec"] | null>} params.chartSpec
|
|
1219
1257
|
* @param {import("vue").Ref<boolean>} params.isPolling
|
|
1220
1258
|
* @param {import("vue").Ref<any[]>} params.processResults
|
|
1221
1259
|
* @param {import("vue").Ref<Record<string,any>|null>} params.jsonformSchema
|
|
1260
|
+
* @param {boolean} params.enableCompare
|
|
1222
1261
|
*/
|
|
1223
1262
|
function resetProcess({
|
|
1224
1263
|
loading,
|
|
1225
1264
|
isProcessed,
|
|
1226
|
-
chartSpec,
|
|
1227
1265
|
jsonformSchema,
|
|
1228
1266
|
processResults,
|
|
1229
1267
|
isPolling,
|
|
1268
|
+
enableCompare,
|
|
1230
1269
|
}) {
|
|
1231
1270
|
loading.value = false;
|
|
1232
1271
|
isProcessed.value = false;
|
|
1233
1272
|
isPolling.value = false;
|
|
1234
|
-
|
|
1273
|
+
const usedChartSpec = enableCompare ? compareChartSpec : chartSpec;
|
|
1274
|
+
usedChartSpec.value = null;
|
|
1235
1275
|
processResults.value = [];
|
|
1236
1276
|
jsonformSchema.value = null;
|
|
1237
1277
|
}
|
|
@@ -1250,8 +1290,7 @@ const onChartClick = (evt) => {
|
|
|
1250
1290
|
const chartSpec = evt.target?.spec;
|
|
1251
1291
|
if (
|
|
1252
1292
|
!chartSpec ||
|
|
1253
|
-
!evt.detail?.item?.datum
|
|
1254
|
-
!evt.detail?.item?.datum.datum
|
|
1293
|
+
(!evt.detail?.item?.datum && !evt.detail?.item?.datum.datum)
|
|
1255
1294
|
) {
|
|
1256
1295
|
return;
|
|
1257
1296
|
}
|