@gooddata/sdk-ui-geo 11.15.0-alpha.8 → 11.15.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/esm/next/components/RenderGeoChartNext.d.ts.map +1 -1
- package/esm/next/components/RenderGeoChartNext.js +5 -4
- package/esm/next/components/RenderGeoChartNext.js.map +1 -1
- package/esm/next/hooks/dataLoading/useNormalizedLayerExecutions.d.ts +3 -1
- package/esm/next/hooks/dataLoading/useNormalizedLayerExecutions.d.ts.map +1 -1
- package/esm/next/hooks/dataLoading/useNormalizedLayerExecutions.js +51 -34
- package/esm/next/hooks/dataLoading/useNormalizedLayerExecutions.js.map +1 -1
- package/esm/next/hooks/layers/useLayerClickEvent.d.ts.map +1 -1
- package/esm/next/hooks/layers/useLayerClickEvent.js +62 -5
- package/esm/next/hooks/layers/useLayerClickEvent.js.map +1 -1
- package/esm/next/hooks/map/useApplyViewportOnConfigChange.d.ts +21 -0
- package/esm/next/hooks/map/useApplyViewportOnConfigChange.d.ts.map +1 -0
- package/esm/next/hooks/map/useApplyViewportOnConfigChange.js +44 -0
- package/esm/next/hooks/map/useApplyViewportOnConfigChange.js.map +1 -0
- package/esm/next/hooks/map/useMapResize.d.ts +2 -2
- package/esm/next/hooks/map/useMapResize.js +3 -3
- package/esm/next/hooks/map/useMapResize.js.map +1 -1
- package/esm/next/hooks/props/useResolvedGeoChartNextProps.js +2 -2
- package/esm/next/hooks/props/useResolvedGeoChartNextProps.js.map +1 -1
- package/esm/next/hooks/pushData/useGeoPushData.d.ts +3 -1
- package/esm/next/hooks/pushData/useGeoPushData.d.ts.map +1 -1
- package/esm/next/hooks/pushData/useGeoPushData.js +28 -4
- package/esm/next/hooks/pushData/useGeoPushData.js.map +1 -1
- package/esm/next/layers/area/source.d.ts.map +1 -1
- package/esm/next/layers/area/source.js +3 -9
- package/esm/next/layers/area/source.js.map +1 -1
- package/esm/next/layers/area/tooltip/tooltipManagement.d.ts.map +1 -1
- package/esm/next/layers/area/tooltip/tooltipManagement.js +4 -6
- package/esm/next/layers/area/tooltip/tooltipManagement.js.map +1 -1
- package/esm/next/layers/common/constants.d.ts +2 -0
- package/esm/next/layers/common/constants.d.ts.map +1 -1
- package/esm/next/layers/common/constants.js +6 -1
- package/esm/next/layers/common/constants.js.map +1 -1
- package/esm/next/layers/pushpin/adapter.d.ts.map +1 -1
- package/esm/next/layers/pushpin/adapter.js +9 -5
- package/esm/next/layers/pushpin/adapter.js.map +1 -1
- package/esm/next/map/MapController.d.ts +2 -1
- package/esm/next/map/MapController.d.ts.map +1 -1
- package/esm/next/map/MapController.js +6 -4
- package/esm/next/map/MapController.js.map +1 -1
- package/esm/next/map/runtime/mapConfig.d.ts +59 -7
- package/esm/next/map/runtime/mapConfig.d.ts.map +1 -1
- package/esm/next/map/runtime/mapConfig.js +1 -1
- package/esm/next/map/runtime/mapConfig.js.map +1 -1
- package/esm/next/map/viewport/viewportPresets.d.ts.map +1 -1
- package/esm/next/map/viewport/viewportPresets.js +4 -3
- package/esm/next/map/viewport/viewportPresets.js.map +1 -1
- package/esm/next/map/viewport/viewportResolution.d.ts +31 -0
- package/esm/next/map/viewport/viewportResolution.d.ts.map +1 -0
- package/esm/next/map/viewport/viewportResolution.js +58 -0
- package/esm/next/map/viewport/viewportResolution.js.map +1 -0
- package/esm/next/map/viewport.d.ts +5 -0
- package/esm/next/map/viewport.d.ts.map +1 -1
- package/esm/next/map/viewport.js +6 -1
- package/esm/next/map/viewport.js.map +1 -1
- package/esm/next/pushData/PushDataSync.d.ts +3 -1
- package/esm/next/pushData/PushDataSync.d.ts.map +1 -1
- package/esm/next/pushData/PushDataSync.js +3 -2
- package/esm/next/pushData/PushDataSync.js.map +1 -1
- package/esm/next/types/common/drilling.d.ts +10 -0
- package/esm/next/types/common/drilling.d.ts.map +1 -0
- package/esm/next/types/common/drilling.js +3 -0
- package/esm/next/types/common/drilling.js.map +1 -0
- package/esm/next/utils/fingerprint.d.ts +11 -0
- package/esm/next/utils/fingerprint.d.ts.map +1 -1
- package/esm/next/utils/fingerprint.js +13 -1
- package/esm/next/utils/fingerprint.js.map +1 -1
- package/esm/next/utils/layerConversion.d.ts.map +1 -1
- package/esm/next/utils/layerConversion.js +12 -2
- package/esm/next/utils/layerConversion.js.map +1 -1
- package/package.json +15 -15
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RenderGeoChartNext.d.ts","sourceRoot":"","sources":["../../../src/next/components/RenderGeoChartNext.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAA6B,MAAM,OAAO,CAAC;AAyBrE;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,IAAI,YAAY,
|
|
1
|
+
{"version":3,"file":"RenderGeoChartNext.d.ts","sourceRoot":"","sources":["../../../src/next/components/RenderGeoChartNext.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAA6B,MAAM,OAAO,CAAC;AAyBrE;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,IAAI,YAAY,CAgFjD"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
// (C) 2025 GoodData Corporation
|
|
2
|
+
// (C) 2025-2026 GoodData Corporation
|
|
3
3
|
import { useMemo, useRef, useState } from "react";
|
|
4
4
|
import cx from "classnames";
|
|
5
5
|
import { defaultImport } from "default-import";
|
|
@@ -10,7 +10,7 @@ import { GeoChartNextLegendOverlay } from "./multiLayerLegend/GeoChartNextLegend
|
|
|
10
10
|
import { useGeoChartNextProps } from "../context/GeoChartNextContext.js";
|
|
11
11
|
import { useGeoLayers } from "../context/GeoLayersContext.js";
|
|
12
12
|
import { MapController } from "../map/MapController.js";
|
|
13
|
-
import { computeCombinedViewport } from "../map/viewport.js";
|
|
13
|
+
import { computeCombinedViewport, computeViewportFromConfig } from "../map/viewport.js";
|
|
14
14
|
import { PushDataSync } from "../pushData/PushDataSync.js";
|
|
15
15
|
// There are known compatibility issues between CommonJS (CJS) and ECMAScript modules (ESM).
|
|
16
16
|
const Measure = defaultImport(ReactMeasure);
|
|
@@ -38,12 +38,13 @@ export function RenderGeoChartNext() {
|
|
|
38
38
|
const [chartContainerRect, setChartContainerRect] = useState(null);
|
|
39
39
|
const colorStrategy = primaryLayer?.colorStrategy ?? null;
|
|
40
40
|
const availableLegends = primaryLayer?.availableLegends;
|
|
41
|
-
const
|
|
41
|
+
const dataViewport = useMemo(() => computeCombinedViewport(layers), [layers]);
|
|
42
|
+
const initialViewport = useMemo(() => computeViewportFromConfig(props.config, dataViewport), [props.config, dataViewport]);
|
|
42
43
|
const drillablePredicates = useMemo(() => convertDrillableItemsToPredicates(props.drillableItems ?? []), [props.drillableItems]);
|
|
43
44
|
const isExportMode = props.config?.isExportMode ?? false;
|
|
44
45
|
const containerClass = cx("gd-geo-chart-next__container", "gd-geo-component", containerBaseId, containerId, {
|
|
45
46
|
isExportMode,
|
|
46
47
|
});
|
|
47
|
-
return (_jsx(Measure, { client: true, onResize: setChartContainerRect, children: ({ measureRef }) => (_jsxs("div", { id: containerId, "data-testid": isExportMode ? "geo-chart-next-export-mode" : containerBaseId, className: containerClass, ref: measureRef, children: [_jsx("div", { ref: mapContainerRef, className: "gd-geo-chart-next__map", children: _jsx(IntlTranslationsProvider, { children: (translationProps) => (_jsx(GeoChartNextLegendOverlay, { config: props.config, chartContainerRect: chartContainerRect, layers: layers, layerExecutions: layerExecutions, primaryLayer: primaryLayer, numericSymbols: translationProps.numericSymbols })) }) }), _jsx(MapController, { mapContainerRef: mapContainerRef, chartContainerRect: chartContainerRect, initialViewport: initialViewport, layerExecutions: layerExecutions, drillablePredicates: drillablePredicates, onCenterPositionChanged: props.onCenterPositionChanged, onZoomChanged: props.onZoomChanged, onDrill: props.onDrill, afterRender: props.afterRender, config: props.config, backend: props.backend }), _jsx(PushDataSync, { colorStrategy: colorStrategy, colorPalette: colorPalette, availableLegends: availableLegends })] })) }));
|
|
48
|
+
return (_jsx(Measure, { client: true, onResize: setChartContainerRect, children: ({ measureRef }) => (_jsxs("div", { id: containerId, "data-testid": isExportMode ? "geo-chart-next-export-mode" : containerBaseId, className: containerClass, ref: measureRef, children: [_jsx("div", { ref: mapContainerRef, className: "gd-geo-chart-next__map", children: _jsx(IntlTranslationsProvider, { children: (translationProps) => (_jsx(GeoChartNextLegendOverlay, { config: props.config, chartContainerRect: chartContainerRect, layers: layers, layerExecutions: layerExecutions, primaryLayer: primaryLayer, numericSymbols: translationProps.numericSymbols })) }) }), _jsx(MapController, { mapContainerRef: mapContainerRef, chartContainerRect: chartContainerRect, initialViewport: initialViewport, dataViewport: dataViewport, layerExecutions: layerExecutions, drillablePredicates: drillablePredicates, onCenterPositionChanged: props.onCenterPositionChanged, onZoomChanged: props.onZoomChanged, onDrill: props.onDrill, afterRender: props.afterRender, config: props.config, backend: props.backend }), _jsx(PushDataSync, { colorStrategy: colorStrategy, colorPalette: colorPalette, availableLegends: availableLegends, geoLayerType: props.type })] })) }));
|
|
48
49
|
}
|
|
49
50
|
//# sourceMappingURL=RenderGeoChartNext.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RenderGeoChartNext.js","sourceRoot":"","sources":["../../../src/next/components/RenderGeoChartNext.tsx"],"names":[],"mappings":";AAAA,
|
|
1
|
+
{"version":3,"file":"RenderGeoChartNext.js","sourceRoot":"","sources":["../../../src/next/components/RenderGeoChartNext.tsx"],"names":[],"mappings":"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"}
|
|
@@ -39,6 +39,8 @@ export interface INormalizedLayerExecutions<TCoreProps> {
|
|
|
39
39
|
*
|
|
40
40
|
* @internal
|
|
41
41
|
*/
|
|
42
|
-
export declare function useNormalizedLayerExecutions<TCoreProps extends IDataVisualizationProps & IPropsWithLayerType
|
|
42
|
+
export declare function useNormalizedLayerExecutions<TCoreProps extends IDataVisualizationProps & IPropsWithLayerType & {
|
|
43
|
+
backend?: unknown;
|
|
44
|
+
}>(props: TCoreProps): INormalizedLayerExecutions<WithoutExecutions<TCoreProps>>;
|
|
43
45
|
export {};
|
|
44
46
|
//# sourceMappingURL=useNormalizedLayerExecutions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useNormalizedLayerExecutions.d.ts","sourceRoot":"","sources":["../../../../src/next/hooks/dataLoading/useNormalizedLayerExecutions.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAGhE,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAChF,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AAGxF,KAAK,iBAAiB,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,WAAW,GAAG,YAAY,CAAC,CAAC;AAEhE;;GAEG;AACH,UAAU,mBAAmB;IACzB,IAAI,CAAC,EAAE,YAAY,CAAC;CACvB;
|
|
1
|
+
{"version":3,"file":"useNormalizedLayerExecutions.d.ts","sourceRoot":"","sources":["../../../../src/next/hooks/dataLoading/useNormalizedLayerExecutions.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAGhE,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAChF,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AAGxF,KAAK,iBAAiB,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,WAAW,GAAG,YAAY,CAAC,CAAC;AAEhE;;GAEG;AACH,UAAU,mBAAmB;IACzB,IAAI,CAAC,EAAE,YAAY,CAAC;CACvB;AAoBD;;;;GAIG;AACH,MAAM,WAAW,0BAA0B,CAAC,UAAU;IAClD;;OAEG;IACH,eAAe,EAAE,qBAAqB,EAAE,CAAC;IAEzC;;OAEG;IACH,eAAe,EAAE,UAAU,GAAG;QAAE,MAAM,EAAE,SAAS,EAAE,CAAA;KAAE,CAAC;CACzD;AAoFD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,4BAA4B,CACxC,UAAU,SAAS,uBAAuB,GAAG,mBAAmB,GAAG;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,EAC1F,KAAK,EAAE,UAAU,GAAG,0BAA0B,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAuE9E"}
|
|
@@ -1,7 +1,22 @@
|
|
|
1
|
-
// (C) 2025 GoodData Corporation
|
|
1
|
+
// (C) 2025-2026 GoodData Corporation
|
|
2
2
|
import { useMemo } from "react";
|
|
3
3
|
import { hasGeoLayerContext } from "../../layers/execution/layerContext.js";
|
|
4
|
-
import {
|
|
4
|
+
import { createExecutionBucketsFingerprint } from "../../utils/fingerprint.js";
|
|
5
|
+
function executionContextFingerprint(execution) {
|
|
6
|
+
if (!hasGeoLayerContext(execution)) {
|
|
7
|
+
return "";
|
|
8
|
+
}
|
|
9
|
+
const { id, type, name } = execution.context;
|
|
10
|
+
return `${type}:${id}:${name ?? ""}`;
|
|
11
|
+
}
|
|
12
|
+
function executionNormalizationFingerprint(execution, index) {
|
|
13
|
+
return [
|
|
14
|
+
index,
|
|
15
|
+
execution.fingerprint(),
|
|
16
|
+
createExecutionBucketsFingerprint(execution),
|
|
17
|
+
executionContextFingerprint(execution),
|
|
18
|
+
].join("|");
|
|
19
|
+
}
|
|
5
20
|
/**
|
|
6
21
|
* Checks if a layer has a valid (non-empty) ID.
|
|
7
22
|
*
|
|
@@ -43,32 +58,13 @@ function ensureUniqueLayerId(layer, usedIds, index) {
|
|
|
43
58
|
}
|
|
44
59
|
/**
|
|
45
60
|
* Tries to extract a layer definition from an execution's context.
|
|
46
|
-
*
|
|
47
|
-
* as much information as possible (type, properties, etc).
|
|
61
|
+
* Unsupported context shapes are ignored; a minimal fallback layer is created.
|
|
48
62
|
*
|
|
49
63
|
* @internal
|
|
50
64
|
*/
|
|
51
|
-
function extractLayerFromContext(
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
if (!isRecord(context)) {
|
|
55
|
-
const id = generateUniqueId(`${fallbackType}-layer-${index}`, usedIds);
|
|
56
|
-
return createMinimalLayer(id, fallbackType);
|
|
57
|
-
}
|
|
58
|
-
// Extract type from context if available
|
|
59
|
-
const contextType = context["type"];
|
|
60
|
-
const layerType = contextType === "pushpin" || contextType === "area" ? contextType : fallbackType;
|
|
61
|
-
// Generate or fix the ID
|
|
62
|
-
const contextId = context["id"];
|
|
63
|
-
const hasValidId = typeof contextId === "string" && contextId.length > 0 && !usedIds.has(contextId);
|
|
64
|
-
const id = hasValidId ? contextId : generateUniqueId(`${layerType}-layer-${index}`, usedIds);
|
|
65
|
-
// Preserve all context properties and ensure required fields are set
|
|
66
|
-
// This maintains layer configuration (filters, sortBy, etc.) even if some fields were missing
|
|
67
|
-
return {
|
|
68
|
-
...context,
|
|
69
|
-
id,
|
|
70
|
-
type: layerType,
|
|
71
|
-
};
|
|
65
|
+
function extractLayerFromContext(_execution, index, fallbackType, usedIds) {
|
|
66
|
+
const id = generateUniqueId(`${fallbackType}-layer-${index}`, usedIds);
|
|
67
|
+
return createMinimalLayer(id, fallbackType);
|
|
72
68
|
}
|
|
73
69
|
/**
|
|
74
70
|
* Creates a minimal layer definition with just id and type.
|
|
@@ -105,10 +101,20 @@ function createMinimalLayer(id, type) {
|
|
|
105
101
|
* @internal
|
|
106
102
|
*/
|
|
107
103
|
export function useNormalizedLayerExecutions(props) {
|
|
108
|
-
const { execution, executions, type: rootLayerType
|
|
109
|
-
|
|
104
|
+
const { execution, executions, type: rootLayerType } = props;
|
|
105
|
+
const normalizationFingerprint = [
|
|
106
|
+
rootLayerType ?? "",
|
|
107
|
+
executionNormalizationFingerprint(execution, 0),
|
|
108
|
+
...(executions ?? []).map((e, index) => executionNormalizationFingerprint(e, index + 1)),
|
|
109
|
+
].join("||");
|
|
110
|
+
const layerExecutionsCache = useMemo(() => new Map(), []);
|
|
111
|
+
const layerExecutions = useMemo(() => {
|
|
112
|
+
const cached = layerExecutionsCache.get(normalizationFingerprint);
|
|
113
|
+
if (cached) {
|
|
114
|
+
return cached;
|
|
115
|
+
}
|
|
110
116
|
const allExecutions = [execution, ...(executions ?? [])];
|
|
111
|
-
const
|
|
117
|
+
const normalizedLayerExecutions = [];
|
|
112
118
|
const usedIds = new Set();
|
|
113
119
|
allExecutions.forEach((candidate, index) => {
|
|
114
120
|
if (!candidate) {
|
|
@@ -127,18 +133,29 @@ export function useNormalizedLayerExecutions(props) {
|
|
|
127
133
|
layer = extractLayerFromContext(candidate, index, fallbackType, usedIds);
|
|
128
134
|
}
|
|
129
135
|
usedIds.add(layer.id);
|
|
130
|
-
|
|
136
|
+
normalizedLayerExecutions.push({
|
|
131
137
|
layerId: layer.id,
|
|
132
138
|
layer,
|
|
133
139
|
execution: candidate,
|
|
134
140
|
});
|
|
135
141
|
});
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
142
|
+
// Prevent unbounded growth in case the fingerprint changes frequently.
|
|
143
|
+
// The cache is only used to stabilize outputs and avoid flicker.
|
|
144
|
+
if (layerExecutionsCache.size > 20) {
|
|
145
|
+
layerExecutionsCache.clear();
|
|
146
|
+
}
|
|
147
|
+
layerExecutionsCache.set(normalizationFingerprint, normalizedLayerExecutions);
|
|
148
|
+
return normalizedLayerExecutions;
|
|
149
|
+
}, [layerExecutionsCache, normalizationFingerprint, execution, executions, rootLayerType]);
|
|
150
|
+
const layers = useMemo(() => layerExecutions.map((record) => record.layer), [layerExecutions]);
|
|
151
|
+
const propsWithLayers = useMemo(() => {
|
|
152
|
+
const { execution: _execution, executions: _executions, type: _type, ...rest } = props;
|
|
153
|
+
return {
|
|
154
|
+
...rest,
|
|
139
155
|
layers,
|
|
156
|
+
type: rootLayerType,
|
|
140
157
|
};
|
|
141
|
-
|
|
142
|
-
|
|
158
|
+
}, [props, layers, rootLayerType]);
|
|
159
|
+
return { layerExecutions, propsWithLayers };
|
|
143
160
|
}
|
|
144
161
|
//# sourceMappingURL=useNormalizedLayerExecutions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useNormalizedLayerExecutions.js","sourceRoot":"","sources":["../../../../src/next/hooks/dataLoading/useNormalizedLayerExecutions.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"useNormalizedLayerExecutions.js","sourceRoot":"","sources":["../../../../src/next/hooks/dataLoading/useNormalizedLayerExecutions.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useLayerClickEvent.d.ts","sourceRoot":"","sources":["../../../../src/next/hooks/layers/useLayerClickEvent.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useLayerClickEvent.d.ts","sourceRoot":"","sources":["../../../../src/next/hooks/layers/useLayerClickEvent.ts"],"names":[],"mappings":"AAYA,OAAO,EAEH,KAAK,gBAAgB,EAErB,KAAK,iBAAiB,EAGzB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAOvE,OAAO,KAAK,EAAE,UAAU,EAAiB,MAAM,kCAAkC,CAAC;AAiIlF;;GAEG;AACH,wBAAgB,kBAAkB,CAC9B,GAAG,EAAE,UAAU,GAAG,IAAI,EACtB,UAAU,EAAE,OAAO,EACnB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,EAClC,mBAAmB,EAAE,gBAAgB,EAAE,EACvC,OAAO,CAAC,EAAE,iBAAiB,GAC5B,IAAI,CAoDN"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
// (C) 2025 GoodData Corporation
|
|
1
|
+
// (C) 2025-2026 GoodData Corporation
|
|
2
2
|
import { useEffect } from "react";
|
|
3
|
-
import { isAttributeDescriptor, isResultAttributeHeader } from "@gooddata/sdk-model";
|
|
3
|
+
import { isAttributeDescriptor, isResultAttributeHeader, objRefToString, } from "@gooddata/sdk-model";
|
|
4
4
|
import { getDrillIntersection, isSomeHeaderPredicateMatched, } from "@gooddata/sdk-ui";
|
|
5
|
-
import { GEO_LAYER_DRILL_ELEMENT, GEO_LAYER_DRILL_TYPE, MAPLIBRE_LAYER_TYPE_PREFIXES, } from "../../layers/common/constants.js";
|
|
5
|
+
import { COORDINATE_FORM_TYPES, GEO_LAYER_DRILL_ELEMENT, GEO_LAYER_DRILL_TYPE, MAPLIBRE_LAYER_TYPE_PREFIXES, } from "../../layers/common/constants.js";
|
|
6
6
|
/**
|
|
7
7
|
* Get the layer data by MapLibre layer ID.
|
|
8
8
|
*/
|
|
@@ -17,22 +17,79 @@ function getClickedLayerByMapLibreLayerId(layers, mapLibreLayerId) {
|
|
|
17
17
|
});
|
|
18
18
|
return clickedLayerEntry?.[1];
|
|
19
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* Check if a display form type is a geo coordinate type.
|
|
22
|
+
*/
|
|
23
|
+
function isCoordinateFormType(labelType) {
|
|
24
|
+
return labelType !== undefined && COORDINATE_FORM_TYPES.includes(labelType);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Extract parent attribute info from a coordinate display form descriptor.
|
|
28
|
+
* Uses primaryLabel as ref if available, otherwise falls back to the descriptor's ref.
|
|
29
|
+
*/
|
|
30
|
+
function getParentAttributeInfo(descriptor) {
|
|
31
|
+
const { primaryLabel, formOf, ref } = descriptor.attributeHeader;
|
|
32
|
+
return {
|
|
33
|
+
ref: primaryLabel ?? ref,
|
|
34
|
+
name: formOf.name,
|
|
35
|
+
key: primaryLabel ? objRefToString(primaryLabel) : formOf.identifier,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function normalizeCoordinateAttribute(descriptor, rowHeader, parentInfo) {
|
|
39
|
+
return {
|
|
40
|
+
descriptor: {
|
|
41
|
+
attributeHeader: {
|
|
42
|
+
...descriptor.attributeHeader,
|
|
43
|
+
ref: parentInfo.ref,
|
|
44
|
+
name: parentInfo.name,
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
rowHeader: {
|
|
48
|
+
...rowHeader,
|
|
49
|
+
attributeHeaderItem: {
|
|
50
|
+
...rowHeader.attributeHeaderItem,
|
|
51
|
+
name: rowHeader.attributeHeaderItem.name, // Keep the value (e.g., "New York")
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
}
|
|
20
56
|
/**
|
|
21
57
|
* Build drill headers for a clicked location.
|
|
22
|
-
* Includes attribute headers (excluding
|
|
58
|
+
* Includes attribute headers (excluding auxiliary geo attributes) and measure descriptors.
|
|
23
59
|
*/
|
|
24
60
|
function getDrillHeaders(dataView, locationIndex, tooltipIndex) {
|
|
25
61
|
const headerItems = dataView.dataView.headerItems;
|
|
26
62
|
const geoAttributesDimensionIndex = dataView.meta().dimensions().length - 1;
|
|
27
63
|
const descriptors = dataView.meta().dimensionItemDescriptors(geoAttributesDimensionIndex);
|
|
28
64
|
const drillHeaders = [];
|
|
65
|
+
// Track processed coordinate attributes by their parent attribute key
|
|
66
|
+
// This ensures we only include one coordinate attribute per parent (e.g., City, not City lat + City lon)
|
|
67
|
+
const processedCoordinateParents = new Set();
|
|
29
68
|
descriptors.forEach((descriptor, attrIndex) => {
|
|
30
69
|
if (isAttributeDescriptor(descriptor)) {
|
|
31
70
|
if (attrIndex === tooltipIndex) {
|
|
32
71
|
return; // Skip tooltip attribute
|
|
33
72
|
}
|
|
34
73
|
const rowHeader = headerItems[geoAttributesDimensionIndex]?.[attrIndex]?.[locationIndex];
|
|
35
|
-
if (rowHeader
|
|
74
|
+
if (!rowHeader || !isResultAttributeHeader(rowHeader)) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const labelType = descriptor.attributeHeader.labelType;
|
|
78
|
+
// Handle coordinate display forms (lat/lon/pin) - deduplicate by parent attribute
|
|
79
|
+
if (isCoordinateFormType(labelType)) {
|
|
80
|
+
const parentInfo = getParentAttributeInfo(descriptor);
|
|
81
|
+
// Skip if we already processed a coordinate attribute from this parent
|
|
82
|
+
if (processedCoordinateParents.has(parentInfo.key)) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
processedCoordinateParents.add(parentInfo.key);
|
|
86
|
+
// Normalize to use parent attribute's name and primary display form
|
|
87
|
+
const normalized = normalizeCoordinateAttribute(descriptor, rowHeader, parentInfo);
|
|
88
|
+
drillHeaders.push(normalized.rowHeader);
|
|
89
|
+
drillHeaders.push(normalized.descriptor);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
// Regular attributes - include as-is
|
|
36
93
|
drillHeaders.push(rowHeader);
|
|
37
94
|
drillHeaders.push(descriptor);
|
|
38
95
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useLayerClickEvent.js","sourceRoot":"","sources":["../../../../src/next/hooks/layers/useLayerClickEvent.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"useLayerClickEvent.js","sourceRoot":"","sources":["../../../../src/next/hooks/layers/useLayerClickEvent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { IMapFacade } from "../../layers/common/mapFacade.js";
|
|
2
|
+
import type { IGeoChartNextConfig } from "../../types/config/unified.js";
|
|
3
|
+
import type { IMapViewport } from "../../types/map/provider.js";
|
|
4
|
+
/**
|
|
5
|
+
* Applies configured viewport whenever the viewport-related config changes.
|
|
6
|
+
*
|
|
7
|
+
* @remarks
|
|
8
|
+
* `useMapInitialization` intentionally captures only the initial viewport and does not re-center the map on
|
|
9
|
+
* prop changes. This hook provides the missing behavior for Analytical Designer: when the user changes
|
|
10
|
+
* "Default viewport", we apply the new viewport to the already-initialized map.
|
|
11
|
+
*
|
|
12
|
+
* We only react to viewport-relevant config changes (`center`/`zoom` or `viewport.area`).
|
|
13
|
+
* Data changes are intentionally ignored to avoid unexpected re-centering during interactions.
|
|
14
|
+
*
|
|
15
|
+
* The current `dataViewport` is still passed in so that switching to `"auto"` (or clearing the preset)
|
|
16
|
+
* applies the latest data-derived bounds.
|
|
17
|
+
*
|
|
18
|
+
* @internal
|
|
19
|
+
*/
|
|
20
|
+
export declare function useApplyViewportOnConfigChange(map: IMapFacade | null, isMapReady: boolean, config: IGeoChartNextConfig | undefined, dataViewport: Partial<IMapViewport> | null): void;
|
|
21
|
+
//# sourceMappingURL=useApplyViewportOnConfigChange.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useApplyViewportOnConfigChange.d.ts","sourceRoot":"","sources":["../../../../src/next/hooks/map/useApplyViewportOnConfigChange.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAGnE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,8BAA8B,CAC1C,GAAG,EAAE,UAAU,GAAG,IAAI,EACtB,UAAU,EAAE,OAAO,EACnB,MAAM,EAAE,mBAAmB,GAAG,SAAS,EACvC,YAAY,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI,GAC3C,IAAI,CA2BN"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// (C) 2025-2026 GoodData Corporation
|
|
2
|
+
import { useEffect, useMemo, useRef } from "react";
|
|
3
|
+
import { applyViewport } from "../../map/viewport/viewportCalculation.js";
|
|
4
|
+
import { computeViewportFromConfig, getViewportConfigKey } from "../../map/viewport/viewportResolution.js";
|
|
5
|
+
/**
|
|
6
|
+
* Applies configured viewport whenever the viewport-related config changes.
|
|
7
|
+
*
|
|
8
|
+
* @remarks
|
|
9
|
+
* `useMapInitialization` intentionally captures only the initial viewport and does not re-center the map on
|
|
10
|
+
* prop changes. This hook provides the missing behavior for Analytical Designer: when the user changes
|
|
11
|
+
* "Default viewport", we apply the new viewport to the already-initialized map.
|
|
12
|
+
*
|
|
13
|
+
* We only react to viewport-relevant config changes (`center`/`zoom` or `viewport.area`).
|
|
14
|
+
* Data changes are intentionally ignored to avoid unexpected re-centering during interactions.
|
|
15
|
+
*
|
|
16
|
+
* The current `dataViewport` is still passed in so that switching to `"auto"` (or clearing the preset)
|
|
17
|
+
* applies the latest data-derived bounds.
|
|
18
|
+
*
|
|
19
|
+
* @internal
|
|
20
|
+
*/
|
|
21
|
+
export function useApplyViewportOnConfigChange(map, isMapReady, config, dataViewport) {
|
|
22
|
+
const configKey = useMemo(() => getViewportConfigKey(config), [config]);
|
|
23
|
+
const previousConfigKeyRef = useRef(null);
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
if (!map || !isMapReady) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const previousKey = previousConfigKeyRef.current;
|
|
29
|
+
previousConfigKeyRef.current = configKey;
|
|
30
|
+
// First run: map just initialized with the initial viewport already applied.
|
|
31
|
+
if (previousKey === null) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
if (previousKey === configKey) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const viewportToApply = computeViewportFromConfig(config, dataViewport);
|
|
38
|
+
if (!viewportToApply) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
applyViewport(map, viewportToApply, true);
|
|
42
|
+
}, [map, isMapReady, configKey, config, dataViewport]);
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=useApplyViewportOnConfigChange.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useApplyViewportOnConfigChange.js","sourceRoot":"","sources":["../../../../src/next/hooks/map/useApplyViewportOnConfigChange.ts"],"names":[],"mappings":"AAAA,qCAAqC;AAErC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAGnD,OAAO,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAC1E,OAAO,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,MAAM,0CAA0C,CAAC;AAI3G;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,8BAA8B,CAC1C,GAAsB,EACtB,UAAmB,EACnB,MAAuC,EACvC,YAA0C;IAE1C,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IACxE,MAAM,oBAAoB,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;IAEzD,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YACtB,OAAO;QACX,CAAC;QAED,MAAM,WAAW,GAAG,oBAAoB,CAAC,OAAO,CAAC;QACjD,oBAAoB,CAAC,OAAO,GAAG,SAAS,CAAC;QAEzC,6EAA6E;QAC7E,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;YACvB,OAAO;QACX,CAAC;QAED,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO;QACX,CAAC;QAED,MAAM,eAAe,GAAG,yBAAyB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QACxE,IAAI,CAAC,eAAe,EAAE,CAAC;YACnB,OAAO;QACX,CAAC;QACD,aAAa,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,CAAC,CAAC;IAC9C,CAAC,EAAE,CAAC,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -10,8 +10,8 @@ import { type IMapViewport } from "../../types/map/provider.js";
|
|
|
10
10
|
* 1. Calls map.resize() to update the MapLibre canvas size
|
|
11
11
|
* 2. Reapplies the viewport so fitBounds can recalculate based on new dimensions
|
|
12
12
|
*
|
|
13
|
-
* This is separate from viewport updates triggered by
|
|
14
|
-
* Those are handled in
|
|
13
|
+
* This is separate from viewport updates triggered by config changes (e.g. Analytical Designer viewport).
|
|
14
|
+
* Those are handled in `useApplyViewportOnConfigChange`.
|
|
15
15
|
*
|
|
16
16
|
* @param map - MapLibre map instance (null if not initialized)
|
|
17
17
|
* @param isMapReady - Whether map is ready for updates
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// (C) 2025 GoodData Corporation
|
|
1
|
+
// (C) 2025-2026 GoodData Corporation
|
|
2
2
|
import { useEffect, useRef } from "react";
|
|
3
3
|
import { applyViewport } from "../../map/viewport/viewportCalculation.js";
|
|
4
4
|
/**
|
|
@@ -10,8 +10,8 @@ import { applyViewport } from "../../map/viewport/viewportCalculation.js";
|
|
|
10
10
|
* 1. Calls map.resize() to update the MapLibre canvas size
|
|
11
11
|
* 2. Reapplies the viewport so fitBounds can recalculate based on new dimensions
|
|
12
12
|
*
|
|
13
|
-
* This is separate from viewport updates triggered by
|
|
14
|
-
* Those are handled in
|
|
13
|
+
* This is separate from viewport updates triggered by config changes (e.g. Analytical Designer viewport).
|
|
14
|
+
* Those are handled in `useApplyViewportOnConfigChange`.
|
|
15
15
|
*
|
|
16
16
|
* @param map - MapLibre map instance (null if not initialized)
|
|
17
17
|
* @param isMapReady - Whether map is ready for updates
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMapResize.js","sourceRoot":"","sources":["../../../../src/next/hooks/map/useMapResize.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"useMapResize.js","sourceRoot":"","sources":["../../../../src/next/hooks/map/useMapResize.ts"],"names":[],"mappings":"AAAA,qCAAqC;AAErC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAK1C,OAAO,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAG1E;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,YAAY,CACxB,GAAsB,EACtB,UAAmB,EACnB,kBAAsC,EACtC,QAAsC;IAEtC,MAAM,iBAAiB,GAAG,MAAM,CAAqB,IAAI,CAAC,CAAC;IAE3D,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,IAAI,CAAC,kBAAkB,EAAE,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClE,OAAO;QACX,CAAC;QAED,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC;QAC/C,MAAM,IAAI,GAAG,kBAAkB,CAAC,MAAM,CAAC;QACvC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QAC/B,MAAM,UAAU,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC;QAE3E,IAAI,UAAU,EAAE,CAAC;YACb,iBAAiB,CAAC,OAAO,GAAG,kBAAkB,CAAC;YAC/C,GAAG,CAAC,MAAM,EAAE,CAAC;YACb,aAAa,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QACxC,CAAC;IACL,CAAC,EAAE,CAAC,GAAG,EAAE,UAAU,EAAE,kBAAkB,EAAE,QAAQ,CAAC,CAAC,CAAC;AACxD,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// (C) 2025 GoodData Corporation
|
|
1
|
+
// (C) 2025-2026 GoodData Corporation
|
|
2
2
|
import { useMemo } from "react";
|
|
3
3
|
import { useResolveValueWithPlaceholders } from "@gooddata/sdk-ui";
|
|
4
4
|
import { EMPTY_DRILLS, EMPTY_FILTERS, EMPTY_OBJECT } from "../../constants/emptyDefaults.js";
|
|
@@ -19,7 +19,7 @@ export function useResolvedGeoChartNextProps(props) {
|
|
|
19
19
|
const resolvedLayers = useResolveValueWithPlaceholders(props.layers);
|
|
20
20
|
const resolvedFilters = useResolveValueWithPlaceholders(props.filters ?? EMPTY_FILTERS);
|
|
21
21
|
const resolvedType = props.type ?? resolvedLayers[0]?.type ?? props.layers[0]?.type ?? "pushpin";
|
|
22
|
-
const config = applyGeoChartNextConfigDefaults(props.config);
|
|
22
|
+
const config = useMemo(() => applyGeoChartNextConfigDefaults(props.config), [props.config]);
|
|
23
23
|
return useMemo(() => ({
|
|
24
24
|
...props,
|
|
25
25
|
layers: resolvedLayers,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useResolvedGeoChartNextProps.js","sourceRoot":"","sources":["../../../../src/next/hooks/props/useResolvedGeoChartNextProps.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"useResolvedGeoChartNextProps.js","sourceRoot":"","sources":["../../../../src/next/hooks/props/useResolvedGeoChartNextProps.ts"],"names":[],"mappings":"AAAA,qCAAqC;AAErC,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAEhC,OAAO,EAAE,+BAA+B,EAAE,MAAM,kBAAkB,CAAC;AAEnE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAC7F,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAC/E,OAAO,EAAE,0BAA0B,EAAE,MAAM,yCAAyC,CAAC;AACrF,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;AAKjF;;;;;;;;;GASG;AACH,MAAM,UAAU,4BAA4B,CAAC,KAAyB;IAClE,MAAM,cAAc,GAAG,+BAA+B,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACrE,MAAM,eAAe,GAAG,+BAA+B,CAAC,KAAK,CAAC,OAAO,IAAI,aAAa,CAAC,CAAC;IACxF,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,IAAI,cAAc,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,SAAS,CAAC;IAEjG,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,+BAA+B,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAE5F,OAAO,OAAO,CACV,GAAG,EAAE,CAAC,CAAC;QACH,GAAG,KAAK;QACR,MAAM,EAAE,cAAc;QACtB,IAAI,EAAE,YAAY;QAClB,cAAc,EAAE,KAAK,CAAC,cAAc,IAAI,YAAY;QACpD,OAAO,EAAE,eAAe;QACxB,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,YAAY;QAC5C,MAAM;KACT,CAAC,EACF,CAAC,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,CAAC,CACjE,CAAC;AACN,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,+BAA+B,CAC3C,MAAuC;IAEvC,OAAO,uBAAuB,CAAC,0BAA0B,CAAC,4BAA4B,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACrG,CAAC"}
|
|
@@ -2,6 +2,7 @@ import { type IColorPalette } from "@gooddata/sdk-model";
|
|
|
2
2
|
import { type IPushData } from "@gooddata/sdk-ui";
|
|
3
3
|
import { type IColorStrategy } from "@gooddata/sdk-ui-vis-commons";
|
|
4
4
|
import { type IAvailableLegends } from "../../types/common/legends.js";
|
|
5
|
+
import { type GeoLayerType } from "../../types/layers/index.js";
|
|
5
6
|
interface ILegendContext {
|
|
6
7
|
availableLegends: IAvailableLegends;
|
|
7
8
|
}
|
|
@@ -17,12 +18,13 @@ interface IUseGeoPushDataConfig<TProps extends IPushDataProps, TLegendContext ex
|
|
|
17
18
|
useProps: () => TProps;
|
|
18
19
|
useLegendContext: () => TLegendContext;
|
|
19
20
|
getLegendVisibility?: (availableLegends: IAvailableLegends) => boolean;
|
|
21
|
+
geoLayerType: GeoLayerType;
|
|
20
22
|
}
|
|
21
23
|
/**
|
|
22
24
|
* Shared implementation for Analytical Designer pushData updates.
|
|
23
25
|
*
|
|
24
26
|
* @internal
|
|
25
27
|
*/
|
|
26
|
-
export declare function useGeoPushData<TProps extends IPushDataProps, TLegendContext extends ILegendContext>(colorStrategy: IColorStrategy | null, colorPalette: IColorPalette, { useProps, useLegendContext, getLegendVisibility }: IUseGeoPushDataConfig<TProps, TLegendContext>): void;
|
|
28
|
+
export declare function useGeoPushData<TProps extends IPushDataProps, TLegendContext extends ILegendContext>(colorStrategy: IColorStrategy | null, colorPalette: IColorPalette, { useProps, useLegendContext, getLegendVisibility, geoLayerType, }: IUseGeoPushDataConfig<TProps, TLegendContext>): void;
|
|
27
29
|
export {};
|
|
28
30
|
//# sourceMappingURL=useGeoPushData.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useGeoPushData.d.ts","sourceRoot":"","sources":["../../../../src/next/hooks/pushData/useGeoPushData.ts"],"names":[],"mappings":"AAIA,OAAO,
|
|
1
|
+
{"version":3,"file":"useGeoPushData.d.ts","sourceRoot":"","sources":["../../../../src/next/hooks/pushData/useGeoPushData.ts"],"names":[],"mappings":"AAIA,OAAO,EAAiC,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACxF,OAAO,EAA+B,KAAK,SAAS,EAA6B,MAAM,kBAAkB,CAAC;AAC1G,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAInE,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE,UAAU,cAAc;IACpB,gBAAgB,EAAE,iBAAiB,CAAC;CACvC;AAED;;;;GAIG;AACH,UAAU,cAAc;IACpB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;CACxC;AAED,UAAU,qBAAqB,CAAC,MAAM,SAAS,cAAc,EAAE,cAAc,SAAS,cAAc;IAChG,QAAQ,EAAE,MAAM,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,cAAc,CAAC;IACvC,mBAAmB,CAAC,EAAE,CAAC,gBAAgB,EAAE,iBAAiB,KAAK,OAAO,CAAC;IACvE,YAAY,EAAE,YAAY,CAAC;CAC9B;AAoCD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,SAAS,cAAc,EAAE,cAAc,SAAS,cAAc,EAC/F,aAAa,EAAE,cAAc,GAAG,IAAI,EACpC,YAAY,EAAE,aAAa,EAC3B,EACI,QAAQ,EACR,gBAAgB,EAChB,mBAAmB,EACnB,YAAY,GACf,EAAE,qBAAqB,CAAC,MAAM,EAAE,cAAc,CAAC,GACjD,IAAI,CAwCN"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// (C) 2025 GoodData Corporation
|
|
1
|
+
// (C) 2025-2026 GoodData Corporation
|
|
2
2
|
import { useEffect, useMemo } from "react";
|
|
3
3
|
import { getMultiLayerDrillTargets } from "@gooddata/sdk-ui";
|
|
4
4
|
import { useGeoLayers } from "../../context/GeoLayersContext.js";
|
|
@@ -7,12 +7,34 @@ const defaultLegendVisibility = (availableLegends) => {
|
|
|
7
7
|
const hasSizeLegend = availableLegends.hasSizeLegend ?? false;
|
|
8
8
|
return Boolean(availableLegends.hasCategoryLegend || availableLegends.hasColorLegend || hasSizeLegend);
|
|
9
9
|
};
|
|
10
|
+
/**
|
|
11
|
+
* Maps geo layer type to the preferred display form type for drill-down targets.
|
|
12
|
+
*/
|
|
13
|
+
function getGeoDisplayFormType(geoLayerType) {
|
|
14
|
+
return geoLayerType === "area" ? "GDC.geo.area" : undefined;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Enhances drill targets with geo-specific display form type preference.
|
|
18
|
+
*/
|
|
19
|
+
function enhanceDrillTargetsWithGeoDisplayForm(drillTargets, geoLayerType) {
|
|
20
|
+
if (!drillTargets) {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
const drillTargetDisplayFormType = getGeoDisplayFormType(geoLayerType);
|
|
24
|
+
return {
|
|
25
|
+
...drillTargets,
|
|
26
|
+
attributes: drillTargets.attributes?.map((attr) => ({
|
|
27
|
+
...attr,
|
|
28
|
+
drillTargetDisplayFormType,
|
|
29
|
+
})),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
10
32
|
/**
|
|
11
33
|
* Shared implementation for Analytical Designer pushData updates.
|
|
12
34
|
*
|
|
13
35
|
* @internal
|
|
14
36
|
*/
|
|
15
|
-
export function useGeoPushData(colorStrategy, colorPalette, { useProps, useLegendContext, getLegendVisibility }) {
|
|
37
|
+
export function useGeoPushData(colorStrategy, colorPalette, { useProps, useLegendContext, getLegendVisibility, geoLayerType, }) {
|
|
16
38
|
const props = useProps();
|
|
17
39
|
const { availableLegends } = useLegendContext();
|
|
18
40
|
const { initialDataView } = useInitialExecution();
|
|
@@ -26,9 +48,11 @@ export function useGeoPushData(colorStrategy, colorPalette, { useProps, useLegen
|
|
|
26
48
|
// Use fingerprints key as dependency
|
|
27
49
|
// We can't use layers as dependency because they are not stable across renders resulting in infinite loop
|
|
28
50
|
const availableDrillTargets = useMemo(() => {
|
|
29
|
-
|
|
51
|
+
const baseDrillTargets = getMultiLayerDrillTargets(layerDataViews, initialDataView);
|
|
52
|
+
// Enhance drill targets with geo-specific display form preference
|
|
53
|
+
return enhanceDrillTargetsWithGeoDisplayForm(baseDrillTargets, geoLayerType);
|
|
30
54
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
31
|
-
}, [fingerprintsKey, initialDataView]);
|
|
55
|
+
}, [fingerprintsKey, initialDataView, geoLayerType]);
|
|
32
56
|
useEffect(() => {
|
|
33
57
|
if (!pushData || !colorStrategy) {
|
|
34
58
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useGeoPushData.js","sourceRoot":"","sources":["../../../../src/next/hooks/pushData/useGeoPushData.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"useGeoPushData.js","sourceRoot":"","sources":["../../../../src/next/hooks/pushData/useGeoPushData.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../../../src/next/layers/area/source.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,eAAe,EAAgB,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAEnE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAEzE,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACjC,aAAa,EAAE,cAAc,CAAC;IAC9B,MAAM,EAAE,mBAAmB,CAAC;IAC5B,OAAO,EAAE,YAAY,CAAC;IACtB;;OAEG;IACH,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC/B;AAED,KAAK,sBAAsB,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAC3F,MAAM,MAAM,uBAAuB,GAAG,sBAAsB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../../../src/next/layers/area/source.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,eAAe,EAAgB,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAEnE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAEzE,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACjC,aAAa,EAAE,cAAc,CAAC;IAC9B,MAAM,EAAE,mBAAmB,CAAC;IAC5B,OAAO,EAAE,YAAY,CAAC;IACtB;;OAEG;IACH,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC/B;AAED,KAAK,sBAAsB,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAC3F,MAAM,MAAM,uBAAuB,GAAG,sBAAsB,EAAE,CAAC;AAuR/D;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAAC,eAAe,EAAE,oBAAoB,GAAG,0BAA0B,CAUtG"}
|