@gooddata/sdk-ui-geo 11.39.0-alpha.1 → 11.39.0-alpha.2
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/GeoChartDataLoader.js +2 -2
- package/esm/next/components/GeoChartProviders.d.ts +3 -1
- package/esm/next/components/GeoChartProviders.js +2 -2
- package/esm/next/context/GeoLayersContext.d.ts +7 -1
- package/esm/next/context/GeoLayersContext.js +3 -2
- package/esm/next/hooks/dataLoading/useGeoChartDataPipeline.d.ts +2 -0
- package/esm/next/hooks/dataLoading/useGeoChartDataPipeline.js +11 -0
- package/esm/next/hooks/layers/useLayerTooltips.d.ts +6 -1
- package/esm/next/hooks/layers/useLayerTooltips.js +5 -4
- package/esm/next/hooks/layers/useLayersTooltipData.d.ts +31 -0
- package/esm/next/hooks/layers/useLayersTooltipData.js +90 -0
- package/esm/next/hooks/layers/useSyncLayersToMap.js +2 -1
- package/esm/next/layers/area/adapter.js +48 -18
- package/esm/next/layers/area/tooltip/tooltipManagement.d.ts +2 -1
- package/esm/next/layers/area/tooltip/tooltipManagement.js +6 -5
- package/esm/next/layers/common/customTooltipExecution.d.ts +64 -0
- package/esm/next/layers/common/customTooltipExecution.js +82 -0
- package/esm/next/layers/common/customTooltipSection.d.ts +2 -1
- package/esm/next/layers/common/customTooltipSection.js +13 -6
- package/esm/next/layers/common/resolveReferencesFromGeoFeature.d.ts +1 -1
- package/esm/next/layers/common/resolveReferencesFromGeoFeature.js +5 -1
- package/esm/next/layers/common/tooltipUtils.d.ts +6 -0
- package/esm/next/layers/common/tooltipUtils.js +2 -0
- package/esm/next/layers/pushpin/adapter.js +67 -18
- package/esm/next/layers/pushpin/tooltip/tooltipManagement.d.ts +3 -2
- package/esm/next/layers/pushpin/tooltip/tooltipManagement.js +6 -5
- package/esm/next/layers/registry/adapterTypes.d.ts +17 -1
- package/package.json +11 -11
- package/styles/css/main.css +21 -17
- package/styles/css/main.css.map +1 -1
|
@@ -22,7 +22,7 @@ export function GeoChartDataLoader({ layerExecutions, }) {
|
|
|
22
22
|
const intl = useIntl();
|
|
23
23
|
const backend = useBackendStrict(props.backend, "GeoDataLoadingGate");
|
|
24
24
|
const workspace = useWorkspaceStrict(props.workspace, "GeoDataLoadingGate");
|
|
25
|
-
const { layerOutputs, status, error } = useGeoChartData({
|
|
25
|
+
const { layerOutputs, tooltipLookups, status, error } = useGeoChartData({
|
|
26
26
|
layerExecutions,
|
|
27
27
|
backend,
|
|
28
28
|
workspace,
|
|
@@ -76,5 +76,5 @@ export function GeoChartDataLoader({ layerExecutions, }) {
|
|
|
76
76
|
if (status !== "success") {
|
|
77
77
|
return _jsx(GeoLoadingComponent, {});
|
|
78
78
|
}
|
|
79
|
-
return (_jsx(GeoChartProviders, { layerExecutions: layerExecutions, layerOutputs: layerOutputs, children: _jsx(RenderGeoChart, { onMapError: setMapError }) }));
|
|
79
|
+
return (_jsx(GeoChartProviders, { layerExecutions: layerExecutions, layerOutputs: layerOutputs, tooltipLookups: tooltipLookups, children: _jsx(RenderGeoChart, { onMapError: setMapError }) }));
|
|
80
80
|
}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { type ReactElement, type ReactNode } from "react";
|
|
2
2
|
import type { ILayerPreparedData } from "../hooks/layers/useLayersPrepare.js";
|
|
3
|
+
import type { IGeoLayerTooltipLookup } from "../layers/common/customTooltipExecution.js";
|
|
3
4
|
import type { ILayerExecutionRecord } from "../types/props/geoChart/internal.js";
|
|
4
5
|
interface IGeoChartProvidersProps {
|
|
5
6
|
children: ReactNode;
|
|
6
7
|
layerExecutions: ILayerExecutionRecord[];
|
|
7
8
|
layerOutputs: Map<string, ILayerPreparedData>;
|
|
9
|
+
tooltipLookups: Map<string, IGeoLayerTooltipLookup>;
|
|
8
10
|
}
|
|
9
|
-
export declare function GeoChartProviders({ children, layerExecutions, layerOutputs }: IGeoChartProvidersProps): ReactElement;
|
|
11
|
+
export declare function GeoChartProviders({ children, layerExecutions, layerOutputs, tooltipLookups }: IGeoChartProvidersProps): ReactElement;
|
|
10
12
|
export {};
|
|
@@ -4,8 +4,8 @@ import { useMemo } from "react";
|
|
|
4
4
|
import { GeoLayersProvider, useGeoLayers } from "../context/GeoLayersContext.js";
|
|
5
5
|
import { GeoLegendProvider } from "../context/GeoLegendContext.js";
|
|
6
6
|
import { InitialExecutionContextProvider } from "../context/InitialExecutionContext.js";
|
|
7
|
-
export function GeoChartProviders({ children, layerExecutions, layerOutputs, }) {
|
|
8
|
-
return (_jsx(GeoLayersProvider, { layerExecutions: layerExecutions, layerOutputs: layerOutputs, children: _jsx(GeoLegendProvider, { children: _jsx(InitialExecutionProvider, { children: children }) }) }));
|
|
7
|
+
export function GeoChartProviders({ children, layerExecutions, layerOutputs, tooltipLookups, }) {
|
|
8
|
+
return (_jsx(GeoLayersProvider, { layerExecutions: layerExecutions, layerOutputs: layerOutputs, tooltipLookups: tooltipLookups, children: _jsx(GeoLegendProvider, { children: _jsx(InitialExecutionProvider, { children: children }) }) }));
|
|
9
9
|
}
|
|
10
10
|
function InitialExecutionProvider({ children }) {
|
|
11
11
|
const { primaryLayer } = useGeoLayers();
|
|
@@ -2,6 +2,7 @@ import { type ReactNode } from "react";
|
|
|
2
2
|
import { type DataViewFacade } from "@gooddata/sdk-ui";
|
|
3
3
|
import { type IColorStrategy } from "@gooddata/sdk-ui-vis-commons";
|
|
4
4
|
import type { ILayerPreparedData } from "../hooks/layers/useLayersPrepare.js";
|
|
5
|
+
import type { IGeoLayerTooltipLookup } from "../layers/common/customTooltipExecution.js";
|
|
5
6
|
import type { GeoJSONSourceSpecification } from "../layers/common/mapFacade.js";
|
|
6
7
|
import type { ITooltipReferenceMaps } from "../layers/registry/adapterTypes.js";
|
|
7
8
|
import { type IAvailableLegends, type IGeoLegendItem } from "../types/common/legends.js";
|
|
@@ -83,6 +84,10 @@ export interface IGeoLayersContext {
|
|
|
83
84
|
* Primary (first) layer data - used for legend/tooltips.
|
|
84
85
|
*/
|
|
85
86
|
primaryLayer: IGeoLayerData | null;
|
|
87
|
+
/**
|
|
88
|
+
* Per-layer custom-tooltip lookups (empty when nothing external is fetched).
|
|
89
|
+
*/
|
|
90
|
+
tooltipLookups: Map<string, IGeoLayerTooltipLookup>;
|
|
86
91
|
}
|
|
87
92
|
/**
|
|
88
93
|
* Provider that exposes pre-loaded layer data through context.
|
|
@@ -93,10 +98,11 @@ export interface IGeoLayersContext {
|
|
|
93
98
|
*
|
|
94
99
|
* @internal
|
|
95
100
|
*/
|
|
96
|
-
export declare function GeoLayersProvider({ children, layerExecutions, layerOutputs }: {
|
|
101
|
+
export declare function GeoLayersProvider({ children, layerExecutions, layerOutputs, tooltipLookups }: {
|
|
97
102
|
children: ReactNode;
|
|
98
103
|
layerExecutions: ILayerExecutionRecord[];
|
|
99
104
|
layerOutputs: Map<string, ILayerPreparedData>;
|
|
105
|
+
tooltipLookups: Map<string, IGeoLayerTooltipLookup>;
|
|
100
106
|
}): import("react/jsx-runtime").JSX.Element;
|
|
101
107
|
/**
|
|
102
108
|
* Hook to access multi-layer geo data context
|
|
@@ -17,7 +17,7 @@ const GeoLayersContext = createContext(undefined);
|
|
|
17
17
|
*
|
|
18
18
|
* @internal
|
|
19
19
|
*/
|
|
20
|
-
export function GeoLayersProvider({ children, layerExecutions, layerOutputs, }) {
|
|
20
|
+
export function GeoLayersProvider({ children, layerExecutions, layerOutputs, tooltipLookups, }) {
|
|
21
21
|
const layersData = useMemo(() => {
|
|
22
22
|
const map = new Map();
|
|
23
23
|
for (const layerExecution of layerExecutions) {
|
|
@@ -46,7 +46,8 @@ export function GeoLayersProvider({ children, layerExecutions, layerOutputs, })
|
|
|
46
46
|
layerExecutions,
|
|
47
47
|
layers: layersData,
|
|
48
48
|
primaryLayer,
|
|
49
|
-
|
|
49
|
+
tooltipLookups,
|
|
50
|
+
}), [layerExecutions, layersData, primaryLayer, tooltipLookups]);
|
|
50
51
|
return _jsx(GeoLayersContext.Provider, { value: value, children: children });
|
|
51
52
|
}
|
|
52
53
|
/**
|
|
@@ -2,11 +2,13 @@ import { type IntlShape } from "react-intl";
|
|
|
2
2
|
import { type IAnalyticalBackend } from "@gooddata/sdk-backend-spi";
|
|
3
3
|
import { type IExecutionConfig } from "@gooddata/sdk-model";
|
|
4
4
|
import { type GoodDataSdkError, type UseCancelablePromiseStatus } from "@gooddata/sdk-ui";
|
|
5
|
+
import type { IGeoLayerTooltipLookup } from "../../layers/common/customTooltipExecution.js";
|
|
5
6
|
import { type IGeoChartConfig } from "../../types/config/unified.js";
|
|
6
7
|
import { type ILayerExecutionRecord } from "../../types/props/geoChart/internal.js";
|
|
7
8
|
import { type ILayerPreparedData } from "../layers/useLayersPrepare.js";
|
|
8
9
|
export interface IGeoChartDataResult {
|
|
9
10
|
layerOutputs: Map<string, ILayerPreparedData>;
|
|
11
|
+
tooltipLookups: Map<string, IGeoLayerTooltipLookup>;
|
|
10
12
|
status: UseCancelablePromiseStatus;
|
|
11
13
|
error?: GoodDataSdkError;
|
|
12
14
|
}
|
|
@@ -4,6 +4,7 @@ import { DataTooLargeToDisplaySdkError, } from "@gooddata/sdk-ui";
|
|
|
4
4
|
import { getDataPointsLimit, validateLayersDataSize } from "../../utils/dataValidation.js";
|
|
5
5
|
import { useLayersData } from "../layers/useLayersData.js";
|
|
6
6
|
import { useLayersPrepare, } from "../layers/useLayersPrepare.js";
|
|
7
|
+
import { useLayersTooltipData } from "../layers/useLayersTooltipData.js";
|
|
7
8
|
/**
|
|
8
9
|
* Status priority for combining multiple statuses.
|
|
9
10
|
* Lower number = higher priority (takes precedence).
|
|
@@ -32,6 +33,15 @@ export function useGeoChartData(params) {
|
|
|
32
33
|
intl,
|
|
33
34
|
};
|
|
34
35
|
const { layerOutputs, status: prepareStatus, error: prepareError, } = useLayersPrepare(layerExecutions, layerDataViews, dataStatus, prepareContext);
|
|
36
|
+
const { tooltipLookups } = useLayersTooltipData({
|
|
37
|
+
layerExecutions,
|
|
38
|
+
layerDataViews,
|
|
39
|
+
backend,
|
|
40
|
+
workspace,
|
|
41
|
+
config,
|
|
42
|
+
execConfig,
|
|
43
|
+
intl,
|
|
44
|
+
});
|
|
35
45
|
const combinedStatus = combineStatus(dataStatus, prepareStatus);
|
|
36
46
|
const pipelineError = dataError ?? prepareError;
|
|
37
47
|
const dataSizeValidation = useMemo(() => {
|
|
@@ -51,6 +61,7 @@ export function useGeoChartData(params) {
|
|
|
51
61
|
const error = pipelineError ?? dataTooLargeError;
|
|
52
62
|
return {
|
|
53
63
|
layerOutputs,
|
|
64
|
+
tooltipLookups,
|
|
54
65
|
status,
|
|
55
66
|
error,
|
|
56
67
|
};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type IHeaderPredicate } from "@gooddata/sdk-ui";
|
|
2
2
|
import { type IGeoLayerData } from "../../context/GeoLayersContext.js";
|
|
3
|
+
import type { IGeoLayerTooltipLookup } from "../../layers/common/customTooltipExecution.js";
|
|
3
4
|
import type { IMapFacade, IPopupFacade } from "../../layers/common/mapFacade.js";
|
|
4
5
|
import type { IGeoAdapterContext } from "../../layers/registry/adapterTypes.js";
|
|
5
6
|
import { type ILayerExecutionRecord } from "../../types/props/geoChart/internal.js";
|
|
@@ -32,6 +33,10 @@ interface IUseLayerTooltipsParams {
|
|
|
32
33
|
* Adapter context for tooltip registration.
|
|
33
34
|
*/
|
|
34
35
|
adapterContext: IGeoAdapterContext;
|
|
36
|
+
/**
|
|
37
|
+
* Per-layer custom-tooltip lookups, keyed by layerId.
|
|
38
|
+
*/
|
|
39
|
+
tooltipLookups: Map<string, IGeoLayerTooltipLookup>;
|
|
35
40
|
}
|
|
36
41
|
/**
|
|
37
42
|
* Hook that manages unified tooltip handling for all layers.
|
|
@@ -43,5 +48,5 @@ interface IUseLayerTooltipsParams {
|
|
|
43
48
|
*
|
|
44
49
|
* @internal
|
|
45
50
|
*/
|
|
46
|
-
export declare function useLayerTooltips({ map, isMapReady, tooltip, drillablePredicates, layerExecutions, layers, adapterContext }: IUseLayerTooltipsParams): void;
|
|
51
|
+
export declare function useLayerTooltips({ map, isMapReady, tooltip, drillablePredicates, layerExecutions, layers, adapterContext, tooltipLookups }: IUseLayerTooltipsParams): void;
|
|
47
52
|
export {};
|
|
@@ -5,7 +5,7 @@ import { buildOutputFromLayerData } from "../../layers/registry/output.js";
|
|
|
5
5
|
/**
|
|
6
6
|
* Collects tooltip configuration from an adapter.
|
|
7
7
|
*/
|
|
8
|
-
function getLayerTooltipConfig(layerExecution, layerData, adapterContext, tooltip, drillablePredicates) {
|
|
8
|
+
function getLayerTooltipConfig(layerExecution, layerData, adapterContext, tooltip, drillablePredicates, tooltipLookup) {
|
|
9
9
|
const { layer } = layerExecution;
|
|
10
10
|
const adapter = getLayerAdapter(layer);
|
|
11
11
|
const layerOutput = buildOutputFromLayerData(layerData);
|
|
@@ -15,6 +15,7 @@ function getLayerTooltipConfig(layerExecution, layerData, adapterContext, toolti
|
|
|
15
15
|
return (adapter.getTooltipConfig(layer, layerOutput, adapterContext, {
|
|
16
16
|
tooltip,
|
|
17
17
|
drillablePredicates,
|
|
18
|
+
tooltipLookup,
|
|
18
19
|
}) ?? null);
|
|
19
20
|
}
|
|
20
21
|
/**
|
|
@@ -27,7 +28,7 @@ function getLayerTooltipConfig(layerExecution, layerData, adapterContext, toolti
|
|
|
27
28
|
*
|
|
28
29
|
* @internal
|
|
29
30
|
*/
|
|
30
|
-
export function useLayerTooltips({ map, isMapReady, tooltip, drillablePredicates, layerExecutions, layers, adapterContext, }) {
|
|
31
|
+
export function useLayerTooltips({ map, isMapReady, tooltip, drillablePredicates, layerExecutions, layers, adapterContext, tooltipLookups, }) {
|
|
31
32
|
const currentTooltipConfigRef = useRef(null);
|
|
32
33
|
const tooltipConfigs = useMemo(() => {
|
|
33
34
|
if (!tooltip) {
|
|
@@ -39,13 +40,13 @@ export function useLayerTooltips({ map, isMapReady, tooltip, drillablePredicates
|
|
|
39
40
|
if (!layerData) {
|
|
40
41
|
continue;
|
|
41
42
|
}
|
|
42
|
-
const config = getLayerTooltipConfig(layerExecution, layerData, adapterContext, tooltip, drillablePredicates);
|
|
43
|
+
const config = getLayerTooltipConfig(layerExecution, layerData, adapterContext, tooltip, drillablePredicates, tooltipLookups.get(layerExecution.layerId));
|
|
43
44
|
if (config) {
|
|
44
45
|
configs.push(config);
|
|
45
46
|
}
|
|
46
47
|
}
|
|
47
48
|
return configs;
|
|
48
|
-
}, [layerExecutions, layers, adapterContext, tooltip, drillablePredicates]);
|
|
49
|
+
}, [layerExecutions, layers, adapterContext, tooltip, drillablePredicates, tooltipLookups]);
|
|
49
50
|
const layerIdToConfig = useMemo(() => {
|
|
50
51
|
const lookup = new Map();
|
|
51
52
|
for (const config of tooltipConfigs) {
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type IntlShape } from "react-intl";
|
|
2
|
+
import { type IAnalyticalBackend } from "@gooddata/sdk-backend-spi";
|
|
3
|
+
import { type IExecutionConfig } from "@gooddata/sdk-model";
|
|
4
|
+
import { type DataViewFacade } from "@gooddata/sdk-ui";
|
|
5
|
+
import { type IGeoLayerTooltipLookup } from "../../layers/common/customTooltipExecution.js";
|
|
6
|
+
import { type IGeoChartConfig } from "../../types/config/unified.js";
|
|
7
|
+
import { type ILayerExecutionRecord } from "../../types/props/geoChart/internal.js";
|
|
8
|
+
/**
|
|
9
|
+
* @internal
|
|
10
|
+
*/
|
|
11
|
+
export interface IGeoTooltipDataResult {
|
|
12
|
+
tooltipLookups: Map<string, IGeoLayerTooltipLookup>;
|
|
13
|
+
}
|
|
14
|
+
interface IUseLayersTooltipDataParams {
|
|
15
|
+
layerExecutions: ILayerExecutionRecord[];
|
|
16
|
+
/**
|
|
17
|
+
* DataViews per layer from `useLayersData`. Source of the PREPARED execution
|
|
18
|
+
* definition — pushpin's `prepareExecution` adds the TOOLTIP_TEXT bucket that
|
|
19
|
+
* the unprepared `record.execution.definition` lacks, and the tooltip plan
|
|
20
|
+
* keys its slicing attributes off that bucket. Empty when data hasn't loaded
|
|
21
|
+
* yet, in which case the plan is empty too.
|
|
22
|
+
*/
|
|
23
|
+
layerDataViews: Map<string, DataViewFacade>;
|
|
24
|
+
backend: IAnalyticalBackend;
|
|
25
|
+
workspace: string;
|
|
26
|
+
config?: IGeoChartConfig;
|
|
27
|
+
execConfig?: IExecutionConfig;
|
|
28
|
+
intl: IntlShape;
|
|
29
|
+
}
|
|
30
|
+
export declare function useLayersTooltipData(params: IUseLayersTooltipDataParams): IGeoTooltipDataResult;
|
|
31
|
+
export {};
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
// (C) 2026 GoodData Corporation
|
|
2
|
+
import { useMemo } from "react";
|
|
3
|
+
import { defineMessages } from "react-intl";
|
|
4
|
+
import { useTooltipLookupExecutions } from "@gooddata/sdk-ui-vis-commons";
|
|
5
|
+
import { getLayerAdapter } from "../../layers/registry/adapterRegistry.js";
|
|
6
|
+
const customTooltipMessages = defineMessages({
|
|
7
|
+
noData: { id: "richText.no_data" },
|
|
8
|
+
multipleItems: { id: "richText.multiple_data" },
|
|
9
|
+
});
|
|
10
|
+
const EMPTY_RESULT = { tooltipLookups: new Map() };
|
|
11
|
+
function planTooltipExecutions(layerExecutions, layerDataViews, backend, workspace, config, execConfig, intl) {
|
|
12
|
+
const planned = [];
|
|
13
|
+
for (const record of layerExecutions) {
|
|
14
|
+
const adapter = getLayerAdapter(record.layer.type);
|
|
15
|
+
if (!adapter.buildTooltipExecution) {
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
// The unprepared `record.execution.definition` can be missing buckets
|
|
19
|
+
// (e.g. pushpin's TOOLTIP_TEXT, added by `prepareExecution`). The
|
|
20
|
+
// dataView's definition reflects the prepared one — wait for it.
|
|
21
|
+
const dataView = layerDataViews.get(record.layerId);
|
|
22
|
+
if (!dataView) {
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
const mainDefinition = dataView.definition;
|
|
26
|
+
const context = {
|
|
27
|
+
backend,
|
|
28
|
+
workspace,
|
|
29
|
+
config,
|
|
30
|
+
execConfig,
|
|
31
|
+
intl,
|
|
32
|
+
};
|
|
33
|
+
let built;
|
|
34
|
+
try {
|
|
35
|
+
built = adapter.buildTooltipExecution(record.layer, context, mainDefinition);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
if (!built) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
planned.push({
|
|
44
|
+
key: record.layerId,
|
|
45
|
+
execution: built.execution,
|
|
46
|
+
meta: built.meta,
|
|
47
|
+
context: built.buildFeatureKey,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
return planned;
|
|
51
|
+
}
|
|
52
|
+
export function useLayersTooltipData(params) {
|
|
53
|
+
const { layerExecutions, layerDataViews, backend, workspace, config, execConfig, intl } = params;
|
|
54
|
+
const isExportMode = config?.isExportMode ?? false;
|
|
55
|
+
const customTooltip = config?.customTooltip;
|
|
56
|
+
const tooltipContent = customTooltip?.content ?? "";
|
|
57
|
+
const tooltipEnabled = !isExportMode && Boolean(customTooltip?.enabled) && Boolean(tooltipContent);
|
|
58
|
+
// Content arrives already debounced from the AD editor.
|
|
59
|
+
// `config` / `execConfig` are excluded from deps: any change that affects
|
|
60
|
+
// the tooltip execution is already baked into `record.execution` upstream.
|
|
61
|
+
// `intl` is read inside the planning function for forward-compat with future adapters.
|
|
62
|
+
const planned = useMemo(() => {
|
|
63
|
+
if (!tooltipEnabled || layerExecutions.length === 0) {
|
|
64
|
+
return [];
|
|
65
|
+
}
|
|
66
|
+
return planTooltipExecutions(layerExecutions, layerDataViews, backend, workspace, config, execConfig, intl);
|
|
67
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
68
|
+
}, [tooltipEnabled, layerExecutions, layerDataViews, backend, workspace, tooltipContent]);
|
|
69
|
+
const separators = config?.separators;
|
|
70
|
+
const localizedStrings = useMemo(() => ({
|
|
71
|
+
noData: `(${intl.formatMessage(customTooltipMessages.noData)})`,
|
|
72
|
+
multipleItems: `(${intl.formatMessage(customTooltipMessages.multipleItems)})`,
|
|
73
|
+
}), [intl]);
|
|
74
|
+
const lookupResults = useTooltipLookupExecutions(planned, separators, localizedStrings);
|
|
75
|
+
// Lookup-table construction is downstream of the cancelable promise so a
|
|
76
|
+
// separators-only change rebuilds the cached strings without a backend call.
|
|
77
|
+
// No stale-guard needed here: `useTooltipLookupExecutions` clears its result
|
|
78
|
+
// when the planned set changes, so a planned-set switch surfaces as
|
|
79
|
+
// `EMPTY_RESULT` until the new executions land.
|
|
80
|
+
return useMemo(() => {
|
|
81
|
+
if (lookupResults.size === 0) {
|
|
82
|
+
return EMPTY_RESULT;
|
|
83
|
+
}
|
|
84
|
+
const map = new Map();
|
|
85
|
+
for (const [layerId, entry] of lookupResults) {
|
|
86
|
+
map.set(layerId, { lookup: entry.lookup, buildFeatureKey: entry.context });
|
|
87
|
+
}
|
|
88
|
+
return { tooltipLookups: map };
|
|
89
|
+
}, [lookupResults]);
|
|
90
|
+
}
|
|
@@ -27,7 +27,7 @@ import { useUpdateLayersOnMap } from "./useUpdateLayersOnMap.js";
|
|
|
27
27
|
*/
|
|
28
28
|
export function useSyncLayersToMap({ drillablePredicates, onDrill }) {
|
|
29
29
|
const { map, isMapReady, tooltip, adapterContext } = useMapRuntime();
|
|
30
|
-
const { layers, layerExecutions } = useGeoLayers();
|
|
30
|
+
const { layers, layerExecutions, tooltipLookups } = useGeoLayers();
|
|
31
31
|
const { hiddenLayers, enabledItemsByLayer } = useGeoLegend();
|
|
32
32
|
// Key capturing adapter-declared config changes that require a full re-sync.
|
|
33
33
|
// Keeps this hook generic (no layer-specific config knowledge).
|
|
@@ -86,6 +86,7 @@ export function useSyncLayersToMap({ drillablePredicates, onDrill }) {
|
|
|
86
86
|
layerExecutions: visibleLayerExecutions,
|
|
87
87
|
layers,
|
|
88
88
|
adapterContext,
|
|
89
|
+
tooltipLookups,
|
|
89
90
|
});
|
|
90
91
|
useLayerClickEvent(map, isMapReady, layers, drillablePredicates, onDrill);
|
|
91
92
|
}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
// (C) 2025-2026 GoodData Corporation
|
|
2
|
-
import { attributeDisplayFormRef,
|
|
2
|
+
import { attributeDisplayFormRef, newBucket, } from "@gooddata/sdk-model";
|
|
3
3
|
import { BucketNames } from "@gooddata/sdk-ui";
|
|
4
|
+
import { buildKeySegment, buildTooltipExecution } from "@gooddata/sdk-ui-vis-commons";
|
|
4
5
|
import { bboxToViewport } from "../../map/viewport/viewportCalculation.js";
|
|
5
6
|
import { getLocationCollectionMetadata } from "../../utils/geoCollection.js";
|
|
6
7
|
import { getGeoHeaderStrings } from "../../utils/geoHeaders.js";
|
|
7
8
|
import { getHeaderPredicateFingerprint } from "../../utils/predicateFingerprint.js";
|
|
8
9
|
import { computeLegend } from "../common/computeLegend.js";
|
|
10
|
+
import { getAttributeIdRefIdentifier, getAttributeLocalIdsFromBuckets, getAttributeRefId, } from "../common/customTooltipExecution.js";
|
|
9
11
|
import { getGeoChartDimensions } from "../common/dimensions.js";
|
|
10
12
|
import { canSetGeoJsonSourceData, trySetGeoJsonSourceData } from "../common/layerOps.js";
|
|
11
13
|
import { buildTooltipReferenceMaps } from "../common/tooltipReferenceMaps.js";
|
|
@@ -21,19 +23,6 @@ import { createAreaTooltipConfig } from "./tooltip/tooltipManagement.js";
|
|
|
21
23
|
const COLLECTION_OVERRIDES = {
|
|
22
24
|
region: { collectionId: "regions" },
|
|
23
25
|
};
|
|
24
|
-
function getDisplayFormId(attribute) {
|
|
25
|
-
if (!attribute) {
|
|
26
|
-
return undefined;
|
|
27
|
-
}
|
|
28
|
-
const ref = attributeDisplayFormRef(attribute);
|
|
29
|
-
if (isIdentifierRef(ref)) {
|
|
30
|
-
return ref.identifier;
|
|
31
|
-
}
|
|
32
|
-
if (isUriRef(ref)) {
|
|
33
|
-
return ref.uri;
|
|
34
|
-
}
|
|
35
|
-
return undefined;
|
|
36
|
-
}
|
|
37
26
|
function normalizeCollectionId(collectionId) {
|
|
38
27
|
return COLLECTION_OVERRIDES[collectionId]?.collectionId ?? collectionId;
|
|
39
28
|
}
|
|
@@ -87,11 +76,52 @@ async function fetchAreaFeatures(dataView, areaAttribute, metadata) {
|
|
|
87
76
|
});
|
|
88
77
|
return result?.features ?? [];
|
|
89
78
|
}
|
|
79
|
+
function buildAreaTooltipExecution(layer, context, mainDefinition) {
|
|
80
|
+
const customTooltip = context.config?.customTooltip;
|
|
81
|
+
if (!customTooltip?.enabled || !customTooltip.content) {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
// idRef-only: `buildLookupTable` keys rows by the result descriptor's
|
|
85
|
+
// identifier. A uriRef-backed display form would produce a hover key the
|
|
86
|
+
// lookup can't match — skip the whole tooltip execution rather than fetch
|
|
87
|
+
// values that won't resolve at hover time.
|
|
88
|
+
const areaAttrId = getAttributeIdRefIdentifier(layer.area);
|
|
89
|
+
if (!areaAttrId) {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
// Slice by AREA only — features are deduplicated by areaUri, so a tooltip
|
|
93
|
+
// execution sliced by AREA + SEGMENT would expand rows past one-per-feature.
|
|
94
|
+
const slicingAttributeLocalIds = getAttributeLocalIdsFromBuckets(mainDefinition, [BucketNames.AREA]);
|
|
95
|
+
if (slicingAttributeLocalIds.length === 0) {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
const factory = context.executionFactory ?? context.backend.workspace(context.workspace).execution();
|
|
99
|
+
const built = buildTooltipExecution(factory, mainDefinition, customTooltip.content, {
|
|
100
|
+
slicingAttributeLocalIds,
|
|
101
|
+
});
|
|
102
|
+
if (!built) {
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
const buildFeatureKey = (properties) => {
|
|
106
|
+
if (!properties) {
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
const areaUri = typeof properties["areaUri"] === "string" ? properties["areaUri"] : "";
|
|
110
|
+
if (!areaUri) {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
return buildKeySegment(areaAttrId, areaUri);
|
|
114
|
+
};
|
|
115
|
+
return { ...built, buildFeatureKey };
|
|
116
|
+
}
|
|
90
117
|
export const areaAdapter = {
|
|
91
118
|
type: "area",
|
|
92
119
|
buildExecution(layer, context) {
|
|
93
120
|
return createExecution(layer, context);
|
|
94
121
|
},
|
|
122
|
+
buildTooltipExecution(layer, context, mainDefinition) {
|
|
123
|
+
return buildAreaTooltipExecution(layer, context, mainDefinition);
|
|
124
|
+
},
|
|
95
125
|
async prepareExecution(layer, context, execution) {
|
|
96
126
|
const needsTooltip = !execution.definition.buckets.some((b) => b.localIdentifier === BucketNames.TOOLTIP_TEXT);
|
|
97
127
|
const displayFormRef = layer.area ? attributeDisplayFormRef(layer.area) : undefined;
|
|
@@ -128,8 +158,8 @@ export const areaAdapter = {
|
|
|
128
158
|
config: areaConfig,
|
|
129
159
|
features: boundaryFeatures,
|
|
130
160
|
tooltipAttrIds: {
|
|
131
|
-
locationName:
|
|
132
|
-
segment:
|
|
161
|
+
locationName: getAttributeRefId(layer.area),
|
|
162
|
+
segment: getAttributeRefId(layer.segmentBy),
|
|
133
163
|
},
|
|
134
164
|
});
|
|
135
165
|
const legend = computeLegend(geoData, colorStrategy, {
|
|
@@ -198,14 +228,14 @@ export const areaAdapter = {
|
|
|
198
228
|
removeFromMap(layer, map) {
|
|
199
229
|
removeAreaLayer(map, layer.id);
|
|
200
230
|
},
|
|
201
|
-
getTooltipConfig(layer, output, context, { tooltip, drillablePredicates }) {
|
|
231
|
+
getTooltipConfig(layer, output, context, { tooltip, drillablePredicates, tooltipLookup }) {
|
|
202
232
|
if (!tooltip || !context.intl) {
|
|
203
233
|
return undefined;
|
|
204
234
|
}
|
|
205
235
|
const config = context.config ?? {};
|
|
206
236
|
const ids = getAreaLayerIds(layer.id);
|
|
207
237
|
const layerIds = [ids.fillLayerId, ids.outlineLayerId];
|
|
208
|
-
return createAreaTooltipConfig(tooltip, config, drillablePredicates, context.intl, layerIds, output.tooltipReferenceMaps);
|
|
238
|
+
return createAreaTooltipConfig(tooltip, config, drillablePredicates, context.intl, layerIds, output.tooltipReferenceMaps, tooltipLookup);
|
|
209
239
|
},
|
|
210
240
|
getMapLibreLayerIds(layer) {
|
|
211
241
|
const ids = getAreaLayerIds(layer.id);
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type IntlShape } from "react-intl";
|
|
2
2
|
import { type IHeaderPredicate } from "@gooddata/sdk-ui";
|
|
3
3
|
import { type IGeoAreaChartConfig } from "../../../types/config/areaChart.js";
|
|
4
|
+
import { type IGeoLayerTooltipLookup } from "../../common/customTooltipExecution.js";
|
|
4
5
|
import type { IPopupFacade } from "../../common/mapFacade.js";
|
|
5
6
|
import type { IGeoTooltipConfig, ITooltipReferenceMaps } from "../../registry/adapterTypes.js";
|
|
6
7
|
/**
|
|
@@ -17,4 +18,4 @@ import type { IGeoTooltipConfig, ITooltipReferenceMaps } from "../../registry/ad
|
|
|
17
18
|
*
|
|
18
19
|
* @internal
|
|
19
20
|
*/
|
|
20
|
-
export declare function createAreaTooltipConfig(tooltip: IPopupFacade, config: IGeoAreaChartConfig, _drillableItems: IHeaderPredicate[] | undefined, intl: IntlShape, layerIds: string[], referenceMaps?: ITooltipReferenceMaps): IGeoTooltipConfig;
|
|
21
|
+
export declare function createAreaTooltipConfig(tooltip: IPopupFacade, config: IGeoAreaChartConfig, _drillableItems: IHeaderPredicate[] | undefined, intl: IntlShape, layerIds: string[], referenceMaps?: ITooltipReferenceMaps, tooltipLookup?: IGeoLayerTooltipLookup): IGeoTooltipConfig;
|
|
@@ -13,15 +13,16 @@ const tooltipFormatConfig = {
|
|
|
13
13
|
emptyValue: "-",
|
|
14
14
|
escape: escapeHtml,
|
|
15
15
|
};
|
|
16
|
-
function buildAreaTooltipHtml(rawProperties, locationName, color, segment, strokeColor, separators, customConfig, referenceMaps, intl) {
|
|
16
|
+
function buildAreaTooltipHtml(rawProperties, locationName, color, segment, strokeColor, separators, customConfig, referenceMaps, intl, tooltipLookup) {
|
|
17
17
|
const attributeItems = dedupeAttributePayloadsByAttrId([locationName, segment])
|
|
18
18
|
.map((payload) => formatAttributeHtml(payload, tooltipFormatConfig))
|
|
19
19
|
.filter((item) => item !== null);
|
|
20
20
|
const measureItem = formatMeasureHtml(color, separators, tooltipFormatConfig);
|
|
21
21
|
const items = [...attributeItems, ...(measureItem ? [measureItem] : [])];
|
|
22
22
|
const defaultItemsHtml = items.join("");
|
|
23
|
-
const fallbackText = `(${intl.formatMessage({ id: "richText.
|
|
24
|
-
const
|
|
23
|
+
const fallbackText = `(${intl.formatMessage({ id: "richText.no_fetch" })})`;
|
|
24
|
+
const noDataLabel = `(${intl.formatMessage({ id: "richText.no_data" })})`;
|
|
25
|
+
const customPieces = buildCustomTooltipPieces(rawProperties, customConfig, referenceMaps, separators, fallbackText, noDataLabel, tooltipLookup);
|
|
25
26
|
// Suppress the tooltip entirely only when there's nothing to show in
|
|
26
27
|
// either the default or the custom section.
|
|
27
28
|
if (items.length === 0 && !customPieces.sectionHtml) {
|
|
@@ -49,7 +50,7 @@ function buildAreaTooltipHtml(rawProperties, locationName, color, segment, strok
|
|
|
49
50
|
*
|
|
50
51
|
* @internal
|
|
51
52
|
*/
|
|
52
|
-
export function createAreaTooltipConfig(tooltip, config, _drillableItems, intl, layerIds, referenceMaps) {
|
|
53
|
+
export function createAreaTooltipConfig(tooltip, config, _drillableItems, intl, layerIds, referenceMaps, tooltipLookup) {
|
|
53
54
|
const { separators } = config;
|
|
54
55
|
return {
|
|
55
56
|
layerIds,
|
|
@@ -62,7 +63,7 @@ export function createAreaTooltipConfig(tooltip, config, _drillableItems, intl,
|
|
|
62
63
|
// Build tooltip HTML
|
|
63
64
|
const fallbackStroke = properties["color_fill"];
|
|
64
65
|
const tooltipStroke = color?.fill ?? (typeof fallbackStroke === "string" ? fallbackStroke : "#20B2E2");
|
|
65
|
-
const tooltipHtml = buildAreaTooltipHtml(feature.properties, locationName, color, segment, tooltipStroke, separators, config.customTooltip, referenceMaps, intl);
|
|
66
|
+
const tooltipHtml = buildAreaTooltipHtml(feature.properties, locationName, color, segment, tooltipStroke, separators, config.customTooltip, referenceMaps, intl, tooltipLookup);
|
|
66
67
|
if (tooltipHtml) {
|
|
67
68
|
tooltip
|
|
68
69
|
.setLngLat([lngLat.lng, lngLat.lat])
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { type IAttribute, type IExecutionDefinition } from "@gooddata/sdk-model";
|
|
2
|
+
import { type IResolvedReferenceValues, type ITooltipExecutionBundle } from "@gooddata/sdk-ui-vis-commons";
|
|
3
|
+
import { type JsonValue } from "../../utils/guards.js";
|
|
4
|
+
/**
|
|
5
|
+
* Returns the lookup key for a hovered feature in the same format
|
|
6
|
+
* `buildLookupTable` produces — or `null` if the feature lacks the data
|
|
7
|
+
* needed to build a stable key.
|
|
8
|
+
*
|
|
9
|
+
* @internal
|
|
10
|
+
*/
|
|
11
|
+
export type BuildFeatureKey = (properties: GeoJSON.GeoJsonProperties) => string | null;
|
|
12
|
+
/**
|
|
13
|
+
* @internal
|
|
14
|
+
*/
|
|
15
|
+
export interface IGeoLayerCustomTooltipExecution extends ITooltipExecutionBundle {
|
|
16
|
+
buildFeatureKey: BuildFeatureKey;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Lives here (not in the hook file) to break a circular import with
|
|
20
|
+
* `adapterTypes.ts`.
|
|
21
|
+
*
|
|
22
|
+
* @internal
|
|
23
|
+
*/
|
|
24
|
+
export interface IGeoLayerTooltipLookup {
|
|
25
|
+
lookup: Map<string, IResolvedReferenceValues>;
|
|
26
|
+
buildFeatureKey: BuildFeatureKey;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Returned localIdentifiers follow `bucketNames` order — both the row dim and
|
|
30
|
+
* the hover-time key segment order rely on it.
|
|
31
|
+
*
|
|
32
|
+
* @internal
|
|
33
|
+
*/
|
|
34
|
+
export declare function getAttributeLocalIdsFromBuckets(definition: IExecutionDefinition, bucketNames: readonly string[]): string[];
|
|
35
|
+
/**
|
|
36
|
+
* Narrow a tooltip attribute payload (e.g. `feature.properties.locationName`)
|
|
37
|
+
* to its identifying fields. `attrId === undefined` signals "no stable key for
|
|
38
|
+
* this feature" — callers compare against the expected layer attribute id.
|
|
39
|
+
*
|
|
40
|
+
* Reuses `parseTooltipPayload` so the JSON-string-or-object handling stays in
|
|
41
|
+
* one place (MapLibre stringifies complex GeoJSON property values when they
|
|
42
|
+
* round-trip through `queryRenderedFeatures`).
|
|
43
|
+
*
|
|
44
|
+
* @internal
|
|
45
|
+
*/
|
|
46
|
+
export declare function readAttrIdentity(payload: JsonValue | undefined): {
|
|
47
|
+
attrId?: string;
|
|
48
|
+
uri: string;
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* URI refs return `undefined` — the tooltip-execution backend path can't
|
|
52
|
+
* resolve uriRef display forms, so the caller must skip that layer.
|
|
53
|
+
* For payload bookkeeping that accepts either ref kind, use {@link getAttributeRefId}.
|
|
54
|
+
*
|
|
55
|
+
* @internal
|
|
56
|
+
*/
|
|
57
|
+
export declare function getAttributeIdRefIdentifier(attribute: IAttribute | undefined): string | undefined;
|
|
58
|
+
/**
|
|
59
|
+
* Returns identifier for idRef, uri for uriRef — a stable key for feature
|
|
60
|
+
* payloads whichever ref kind the layer uses.
|
|
61
|
+
*
|
|
62
|
+
* @internal
|
|
63
|
+
*/
|
|
64
|
+
export declare function getAttributeRefId(attribute: IAttribute | undefined): string | undefined;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
// (C) 2026 GoodData Corporation
|
|
2
|
+
import { attributeDisplayFormRef, isAttribute, isIdentifierRef, isUriRef, } from "@gooddata/sdk-model";
|
|
3
|
+
import { parseTooltipPayload } from "./tooltipUtils.js";
|
|
4
|
+
/**
|
|
5
|
+
* Returned localIdentifiers follow `bucketNames` order — both the row dim and
|
|
6
|
+
* the hover-time key segment order rely on it.
|
|
7
|
+
*
|
|
8
|
+
* @internal
|
|
9
|
+
*/
|
|
10
|
+
export function getAttributeLocalIdsFromBuckets(definition, bucketNames) {
|
|
11
|
+
const localIds = [];
|
|
12
|
+
for (const bucketName of bucketNames) {
|
|
13
|
+
const bucket = definition.buckets.find((b) => b.localIdentifier === bucketName);
|
|
14
|
+
if (!bucket) {
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
for (const item of bucket.items) {
|
|
18
|
+
if (isAttribute(item)) {
|
|
19
|
+
localIds.push(item.attribute.localIdentifier);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return localIds;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Narrow a tooltip attribute payload (e.g. `feature.properties.locationName`)
|
|
27
|
+
* to its identifying fields. `attrId === undefined` signals "no stable key for
|
|
28
|
+
* this feature" — callers compare against the expected layer attribute id.
|
|
29
|
+
*
|
|
30
|
+
* Reuses `parseTooltipPayload` so the JSON-string-or-object handling stays in
|
|
31
|
+
* one place (MapLibre stringifies complex GeoJSON property values when they
|
|
32
|
+
* round-trip through `queryRenderedFeatures`).
|
|
33
|
+
*
|
|
34
|
+
* @internal
|
|
35
|
+
*/
|
|
36
|
+
export function readAttrIdentity(payload) {
|
|
37
|
+
// Pushpin call sites read from GeoJsonProperties (e.g. `properties["locationName"]`),
|
|
38
|
+
// where a missing key yields `undefined` at runtime. The `any` type from
|
|
39
|
+
// @types/geojson hides that from TS, but we want the function to short-circuit
|
|
40
|
+
// safely rather than crash inside parseTooltipPayload.
|
|
41
|
+
if (payload === undefined) {
|
|
42
|
+
return { uri: "" };
|
|
43
|
+
}
|
|
44
|
+
const parsed = parseTooltipPayload(payload);
|
|
45
|
+
return { attrId: parsed?.attrId, uri: parsed?.uri ?? "" };
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* URI refs return `undefined` — the tooltip-execution backend path can't
|
|
49
|
+
* resolve uriRef display forms, so the caller must skip that layer.
|
|
50
|
+
* For payload bookkeeping that accepts either ref kind, use {@link getAttributeRefId}.
|
|
51
|
+
*
|
|
52
|
+
* @internal
|
|
53
|
+
*/
|
|
54
|
+
export function getAttributeIdRefIdentifier(attribute) {
|
|
55
|
+
if (!attribute) {
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
const ref = attributeDisplayFormRef(attribute);
|
|
59
|
+
if (isIdentifierRef(ref)) {
|
|
60
|
+
return ref.identifier;
|
|
61
|
+
}
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Returns identifier for idRef, uri for uriRef — a stable key for feature
|
|
66
|
+
* payloads whichever ref kind the layer uses.
|
|
67
|
+
*
|
|
68
|
+
* @internal
|
|
69
|
+
*/
|
|
70
|
+
export function getAttributeRefId(attribute) {
|
|
71
|
+
if (!attribute) {
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
const ref = attributeDisplayFormRef(attribute);
|
|
75
|
+
if (isIdentifierRef(ref)) {
|
|
76
|
+
return ref.identifier;
|
|
77
|
+
}
|
|
78
|
+
if (isUriRef(ref)) {
|
|
79
|
+
return ref.uri;
|
|
80
|
+
}
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type ISeparators } from "@gooddata/sdk-model";
|
|
2
2
|
import { type ICustomTooltipConfig } from "@gooddata/sdk-ui-vis-commons";
|
|
3
3
|
import { type ITooltipReferenceMaps } from "../registry/adapterTypes.js";
|
|
4
|
+
import { type IGeoLayerTooltipLookup } from "./customTooltipExecution.js";
|
|
4
5
|
interface ICustomTooltipPieces {
|
|
5
6
|
/** Wrapped `<div class="gd-viz-tooltip-custom-section">…</div>` or "" if disabled/empty. */
|
|
6
7
|
sectionHtml: string;
|
|
@@ -15,7 +16,7 @@ interface ICustomTooltipPieces {
|
|
|
15
16
|
*
|
|
16
17
|
* @internal
|
|
17
18
|
*/
|
|
18
|
-
export declare function buildCustomTooltipPieces(properties: GeoJSON.GeoJsonProperties, customConfig: ICustomTooltipConfig | undefined, referenceMaps: ITooltipReferenceMaps | undefined, separators: ISeparators | undefined, fallbackText: string): ICustomTooltipPieces;
|
|
19
|
+
export declare function buildCustomTooltipPieces(properties: GeoJSON.GeoJsonProperties, customConfig: ICustomTooltipConfig | undefined, referenceMaps: ITooltipReferenceMaps | undefined, separators: ISeparators | undefined, fallbackText: string, noDataLabel: string, tooltipLookup?: IGeoLayerTooltipLookup): ICustomTooltipPieces;
|
|
19
20
|
/**
|
|
20
21
|
* Splice custom-tooltip pieces into the default tooltip body.
|
|
21
22
|
*
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// (C) 2026 GoodData Corporation
|
|
2
|
-
import {
|
|
2
|
+
import { composeCustomTooltipSectionHtml } from "@gooddata/sdk-ui-vis-commons";
|
|
3
3
|
import { resolveReferencesFromGeoFeature } from "./resolveReferencesFromGeoFeature.js";
|
|
4
4
|
/**
|
|
5
5
|
* Build the custom-tooltip section + separator HTML pieces for a hovered feature.
|
|
@@ -9,14 +9,21 @@ import { resolveReferencesFromGeoFeature } from "./resolveReferencesFromGeoFeatu
|
|
|
9
9
|
*
|
|
10
10
|
* @internal
|
|
11
11
|
*/
|
|
12
|
-
export function buildCustomTooltipPieces(properties, customConfig, referenceMaps, separators, fallbackText) {
|
|
12
|
+
export function buildCustomTooltipPieces(properties, customConfig, referenceMaps, separators, fallbackText, noDataLabel, tooltipLookup) {
|
|
13
13
|
if (!customConfig?.enabled || !customConfig.content) {
|
|
14
14
|
return { sectionHtml: "", separatorHtml: "" };
|
|
15
15
|
}
|
|
16
|
-
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
16
|
+
// In-chart values from the rendered feature's properties.
|
|
17
|
+
const pointLocal = resolveReferencesFromGeoFeature(properties, referenceMaps, separators, noDataLabel);
|
|
18
|
+
// External values from the precomputed lookup (refs not on the feature).
|
|
19
|
+
let externalValues = {};
|
|
20
|
+
if (tooltipLookup) {
|
|
21
|
+
const featureKey = tooltipLookup.buildFeatureKey(properties);
|
|
22
|
+
if (featureKey != null) {
|
|
23
|
+
externalValues = tooltipLookup.lookup.get(featureKey) ?? {};
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
const sectionHtml = composeCustomTooltipSectionHtml(customConfig.content, pointLocal, externalValues, fallbackText);
|
|
20
27
|
// Replace mode shows only the custom section, so no separator is needed.
|
|
21
28
|
const separatorHtml = customConfig.placement === "replace" ? "" : `<div class="gd-viz-tooltip-custom-separator"></div>`;
|
|
22
29
|
return { sectionHtml, separatorHtml };
|
|
@@ -17,4 +17,4 @@ import { type ITooltipReferenceMaps } from "../registry/adapterTypes.js";
|
|
|
17
17
|
*
|
|
18
18
|
* @internal
|
|
19
19
|
*/
|
|
20
|
-
export declare function resolveReferencesFromGeoFeature(properties: GeoJSON.GeoJsonProperties, referenceMaps: ITooltipReferenceMaps | undefined, separators: ISeparators | undefined): IResolvedReferenceValues;
|
|
20
|
+
export declare function resolveReferencesFromGeoFeature(properties: GeoJSON.GeoJsonProperties, referenceMaps: ITooltipReferenceMaps | undefined, separators: ISeparators | undefined, noDataLabel: string): IResolvedReferenceValues;
|
|
@@ -17,7 +17,7 @@ import { getTooltipProperties, parseTooltipPayload } from "./tooltipUtils.js";
|
|
|
17
17
|
*
|
|
18
18
|
* @internal
|
|
19
19
|
*/
|
|
20
|
-
export function resolveReferencesFromGeoFeature(properties, referenceMaps, separators) {
|
|
20
|
+
export function resolveReferencesFromGeoFeature(properties, referenceMaps, separators, noDataLabel) {
|
|
21
21
|
const values = {};
|
|
22
22
|
if (!properties) {
|
|
23
23
|
return values;
|
|
@@ -59,6 +59,10 @@ export function resolveReferencesFromGeoFeature(properties, referenceMaps, separ
|
|
|
59
59
|
}
|
|
60
60
|
const rawValue = payload.value;
|
|
61
61
|
if (typeof rawValue !== "number" || !Number.isFinite(rawValue)) {
|
|
62
|
+
// Null / undefined / NaN on the rendered feature — emit the no-data
|
|
63
|
+
// sentinel so the custom section reads "(No data)" instead of falling
|
|
64
|
+
// through to the resolution-failure fallback text.
|
|
65
|
+
values[key] = noDataLabel;
|
|
62
66
|
return;
|
|
63
67
|
}
|
|
64
68
|
// Use the raw formatted value without HTML escaping. The resolved
|
|
@@ -5,6 +5,12 @@ export type TooltipPayload = {
|
|
|
5
5
|
value?: string | number;
|
|
6
6
|
format?: string;
|
|
7
7
|
attrId?: string;
|
|
8
|
+
/**
|
|
9
|
+
* Attribute element URI. By convention only set by attribute payload
|
|
10
|
+
* writers (locationName, segment, tooltipText). Used by the custom-tooltip
|
|
11
|
+
* execution path to build per-feature lookup keys.
|
|
12
|
+
*/
|
|
13
|
+
uri?: string;
|
|
8
14
|
fill?: string;
|
|
9
15
|
/**
|
|
10
16
|
* Bucket `localIdentifier` of the underlying measure. By convention only
|
|
@@ -30,6 +30,7 @@ export function parseTooltipPayload(item) {
|
|
|
30
30
|
const value = typeof rawValue === "string" || typeof rawValue === "number" ? rawValue : undefined;
|
|
31
31
|
const format = typeof parsed["format"] === "string" ? parsed["format"] : undefined;
|
|
32
32
|
const attrId = typeof parsed["attrId"] === "string" ? parsed["attrId"] : undefined;
|
|
33
|
+
const uri = typeof parsed["uri"] === "string" ? parsed["uri"] : undefined;
|
|
33
34
|
const fill = typeof parsed["fill"] === "string" ? parsed["fill"] : undefined;
|
|
34
35
|
const localId = typeof parsed["localId"] === "string" ? parsed["localId"] : undefined;
|
|
35
36
|
return {
|
|
@@ -37,6 +38,7 @@ export function parseTooltipPayload(item) {
|
|
|
37
38
|
value,
|
|
38
39
|
format,
|
|
39
40
|
attrId,
|
|
41
|
+
uri,
|
|
40
42
|
fill,
|
|
41
43
|
localId,
|
|
42
44
|
};
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
// (C) 2025-2026 GoodData Corporation
|
|
2
|
-
import { attributeDisplayFormRef,
|
|
2
|
+
import { attributeDisplayFormRef, newBucket } from "@gooddata/sdk-model";
|
|
3
3
|
import { BucketNames } from "@gooddata/sdk-ui";
|
|
4
|
+
import { buildKeySegment, buildTooltipExecution, joinKeySegments } from "@gooddata/sdk-ui-vis-commons";
|
|
4
5
|
import { calculateViewport } from "../../map/viewport/viewportCalculation.js";
|
|
5
6
|
import { getGeoHeaderStrings } from "../../utils/geoHeaders.js";
|
|
6
7
|
import { getHeaderPredicateFingerprint } from "../../utils/predicateFingerprint.js";
|
|
7
8
|
import { computeLegend } from "../common/computeLegend.js";
|
|
9
|
+
import { getAttributeIdRefIdentifier, getAttributeLocalIdsFromBuckets, getAttributeRefId, readAttrIdentity, } from "../common/customTooltipExecution.js";
|
|
8
10
|
import { getGeoChartDimensions } from "../common/dimensions.js";
|
|
9
11
|
import { canSetGeoJsonSourceData, trySetGeoJsonSourceData } from "../common/layerOps.js";
|
|
10
12
|
import { buildTooltipReferenceMaps } from "../common/tooltipReferenceMaps.js";
|
|
@@ -14,6 +16,7 @@ import { prepareExecutionWithTooltipText } from "../execution/prepareTooltipExec
|
|
|
14
16
|
import { resolveAttributeDisplayForms } from "../execution/resolveAttributeDisplayForms.js";
|
|
15
17
|
import { isClusteringAllowed } from "./clustering/clustering.js";
|
|
16
18
|
import { getPushpinColorStrategy } from "./coloring/colorStrategy.js";
|
|
19
|
+
import { EMPTY_SEGMENT_VALUE } from "./constants.js";
|
|
17
20
|
import { transformPushpinData } from "./data/transformation.js";
|
|
18
21
|
import { UNCLUSTER_FILTER } from "./layers.js";
|
|
19
22
|
import { getPushpinLayerIds, removePushpinLayer, syncPushpinLayerToMap } from "./operations.js";
|
|
@@ -107,19 +110,6 @@ function computeInitialViewport(geoData) {
|
|
|
107
110
|
const dataViewportConfig = { viewport: { area: "auto" } };
|
|
108
111
|
return calculateViewport(validLocations, dataViewportConfig);
|
|
109
112
|
}
|
|
110
|
-
function getDisplayFormId(attribute) {
|
|
111
|
-
if (!attribute) {
|
|
112
|
-
return undefined;
|
|
113
|
-
}
|
|
114
|
-
const ref = attributeDisplayFormRef(attribute);
|
|
115
|
-
if (isIdentifierRef(ref)) {
|
|
116
|
-
return ref.identifier;
|
|
117
|
-
}
|
|
118
|
-
if (isUriRef(ref)) {
|
|
119
|
-
return ref.uri;
|
|
120
|
-
}
|
|
121
|
-
return undefined;
|
|
122
|
-
}
|
|
123
113
|
function createPushpinConfig(context) {
|
|
124
114
|
return {
|
|
125
115
|
...context.config,
|
|
@@ -128,8 +118,8 @@ function createPushpinConfig(context) {
|
|
|
128
118
|
}
|
|
129
119
|
function createPushpinTooltipAttrIds(layer) {
|
|
130
120
|
return {
|
|
131
|
-
locationName:
|
|
132
|
-
segment:
|
|
121
|
+
locationName: getAttributeRefId(layer.tooltipText),
|
|
122
|
+
segment: getAttributeRefId(layer.segmentBy),
|
|
133
123
|
};
|
|
134
124
|
}
|
|
135
125
|
function createPushpinSource(layer, geoData, colorStrategy, context) {
|
|
@@ -190,11 +180,70 @@ function createExecution(layer, context) {
|
|
|
190
180
|
}
|
|
191
181
|
return execution;
|
|
192
182
|
}
|
|
183
|
+
function buildPushpinTooltipExecution(layer, context, mainDefinition) {
|
|
184
|
+
const customTooltip = context.config?.customTooltip;
|
|
185
|
+
if (!customTooltip?.enabled || !customTooltip.content) {
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
// Pushpin keys features by tooltipText; without it the feature has no
|
|
189
|
+
// stable display-form id to reconcile a tooltip row to.
|
|
190
|
+
if (!layer.tooltipText) {
|
|
191
|
+
return null;
|
|
192
|
+
}
|
|
193
|
+
const tooltipAttrId = getAttributeIdRefIdentifier(layer.tooltipText);
|
|
194
|
+
if (!tooltipAttrId) {
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
const segmentAttrId = layer.segmentBy ? getAttributeIdRefIdentifier(layer.segmentBy) : undefined;
|
|
198
|
+
const desiredBuckets = [BucketNames.TOOLTIP_TEXT];
|
|
199
|
+
// URI-backed segments are absent from buildFeatureKey; skip them from slicing too or keys won't match.
|
|
200
|
+
if (segmentAttrId) {
|
|
201
|
+
desiredBuckets.push(BucketNames.SEGMENT);
|
|
202
|
+
}
|
|
203
|
+
const slicingAttributeLocalIds = getAttributeLocalIdsFromBuckets(mainDefinition, desiredBuckets);
|
|
204
|
+
if (slicingAttributeLocalIds.length === 0) {
|
|
205
|
+
return null;
|
|
206
|
+
}
|
|
207
|
+
const factory = context.executionFactory ?? context.backend.workspace(context.workspace).execution();
|
|
208
|
+
const built = buildTooltipExecution(factory, mainDefinition, customTooltip.content, {
|
|
209
|
+
slicingAttributeLocalIds,
|
|
210
|
+
});
|
|
211
|
+
if (!built) {
|
|
212
|
+
return null;
|
|
213
|
+
}
|
|
214
|
+
const buildFeatureKey = (properties) => {
|
|
215
|
+
if (!properties) {
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
const locationName = readAttrIdentity(properties["locationName"]);
|
|
219
|
+
if (locationName.attrId !== tooltipAttrId) {
|
|
220
|
+
return null;
|
|
221
|
+
}
|
|
222
|
+
const parts = [buildKeySegment(locationName.attrId, locationName.uri)];
|
|
223
|
+
if (segmentAttrId) {
|
|
224
|
+
const segment = readAttrIdentity(properties["segment"]);
|
|
225
|
+
if (segment.attrId !== segmentAttrId) {
|
|
226
|
+
return null;
|
|
227
|
+
}
|
|
228
|
+
// Pushpin payload writer substitutes EMPTY_SEGMENT_VALUE for null
|
|
229
|
+
// segment URIs (needed for MapLibre `in` filtering). The tooltip
|
|
230
|
+
// execution result preserves the original null/empty URI, so
|
|
231
|
+
// normalize back here or the key never matches.
|
|
232
|
+
const segmentUri = segment.uri === EMPTY_SEGMENT_VALUE ? "" : segment.uri;
|
|
233
|
+
parts.push(buildKeySegment(segment.attrId, segmentUri));
|
|
234
|
+
}
|
|
235
|
+
return joinKeySegments(parts);
|
|
236
|
+
};
|
|
237
|
+
return { ...built, buildFeatureKey };
|
|
238
|
+
}
|
|
193
239
|
export const pushpinAdapter = {
|
|
194
240
|
type: "pushpin",
|
|
195
241
|
buildExecution(layer, context) {
|
|
196
242
|
return createExecution(layer, context);
|
|
197
243
|
},
|
|
244
|
+
buildTooltipExecution(layer, context, mainDefinition) {
|
|
245
|
+
return buildPushpinTooltipExecution(layer, context, mainDefinition);
|
|
246
|
+
},
|
|
198
247
|
async prepareExecution(layer, context, execution) {
|
|
199
248
|
// Resolve tooltip and geoIcon display forms in a single backend call.
|
|
200
249
|
// Skip the metadata lookup entirely when both derived buckets already exist.
|
|
@@ -293,7 +342,7 @@ export const pushpinAdapter = {
|
|
|
293
342
|
removeFromMap(layer, map) {
|
|
294
343
|
removePushpinLayer(map, layer.id);
|
|
295
344
|
},
|
|
296
|
-
getTooltipConfig(layer, output, context, { tooltip, drillablePredicates }) {
|
|
345
|
+
getTooltipConfig(layer, output, context, { tooltip, drillablePredicates, tooltipLookup }) {
|
|
297
346
|
if (!tooltip || !context.intl) {
|
|
298
347
|
return undefined;
|
|
299
348
|
}
|
|
@@ -303,7 +352,7 @@ export const pushpinAdapter = {
|
|
|
303
352
|
if (layerIds.length === 0) {
|
|
304
353
|
return undefined;
|
|
305
354
|
}
|
|
306
|
-
return createPushpinTooltipConfig(tooltip, config, drillablePredicates, context.intl, layerIds, output.tooltipReferenceMaps);
|
|
355
|
+
return createPushpinTooltipConfig(tooltip, config, drillablePredicates, context.intl, layerIds, output.tooltipReferenceMaps, tooltipLookup);
|
|
307
356
|
},
|
|
308
357
|
getMapLibreLayerIds(layer) {
|
|
309
358
|
const ids = getPushpinLayerIds(layer.id);
|
|
@@ -3,6 +3,7 @@ import { type ISeparators } from "@gooddata/sdk-model";
|
|
|
3
3
|
import { type IHeaderPredicate } from "@gooddata/sdk-ui";
|
|
4
4
|
import { type ICustomTooltipConfig } from "@gooddata/sdk-ui-vis-commons";
|
|
5
5
|
import { type IGeoPushpinChartConfig } from "../../../types/config/pushpinChart.js";
|
|
6
|
+
import { type IGeoLayerTooltipLookup } from "../../common/customTooltipExecution.js";
|
|
6
7
|
import { type IPopupFacade } from "../../common/mapFacade.js";
|
|
7
8
|
import type { IGeoTooltipConfig, ITooltipReferenceMaps } from "../../registry/adapterTypes.js";
|
|
8
9
|
export declare const TOOLTIP_MAX_WIDTH = 320;
|
|
@@ -37,7 +38,7 @@ export declare function shouldShowTooltip(geoProperties: GeoJSON.GeoJsonProperti
|
|
|
37
38
|
*
|
|
38
39
|
* @internal
|
|
39
40
|
*/
|
|
40
|
-
export declare function getTooltipHtml(geoProperties: GeoJSON.GeoJsonProperties, tooltipStroke: string, maxWidth: number, separators: ISeparators | undefined, drillableItems: IHeaderPredicate[] | undefined, intl: IntlShape, showStroke?: boolean, customConfig?: ICustomTooltipConfig, referenceMaps?: ITooltipReferenceMaps): string;
|
|
41
|
+
export declare function getTooltipHtml(geoProperties: GeoJSON.GeoJsonProperties, tooltipStroke: string, maxWidth: number, separators: ISeparators | undefined, drillableItems: IHeaderPredicate[] | undefined, intl: IntlShape, showStroke?: boolean, customConfig?: ICustomTooltipConfig, referenceMaps?: ITooltipReferenceMaps, tooltipLookup?: IGeoLayerTooltipLookup): string;
|
|
41
42
|
/**
|
|
42
43
|
* Creates tooltip configuration for the unified tooltip handler.
|
|
43
44
|
*
|
|
@@ -50,4 +51,4 @@ export declare function getTooltipHtml(geoProperties: GeoJSON.GeoJsonProperties,
|
|
|
50
51
|
*
|
|
51
52
|
* @internal
|
|
52
53
|
*/
|
|
53
|
-
export declare function createPushpinTooltipConfig(tooltip: IPopupFacade, config: IGeoPushpinChartConfig, drillableItems: IHeaderPredicate[] | undefined, intl: IntlShape, layerIds: string[], referenceMaps?: ITooltipReferenceMaps): IGeoTooltipConfig;
|
|
54
|
+
export declare function createPushpinTooltipConfig(tooltip: IPopupFacade, config: IGeoPushpinChartConfig, drillableItems: IHeaderPredicate[] | undefined, intl: IntlShape, layerIds: string[], referenceMaps?: ITooltipReferenceMaps, tooltipLookup?: IGeoLayerTooltipLookup): IGeoTooltipConfig;
|
|
@@ -99,7 +99,7 @@ function getInteractionMessage(drillableItems, intl) {
|
|
|
99
99
|
*
|
|
100
100
|
* @internal
|
|
101
101
|
*/
|
|
102
|
-
export function getTooltipHtml(geoProperties, tooltipStroke, maxWidth, separators, drillableItems, intl, showStroke = true, customConfig, referenceMaps) {
|
|
102
|
+
export function getTooltipHtml(geoProperties, tooltipStroke, maxWidth, separators, drillableItems, intl, showStroke = true, customConfig, referenceMaps, tooltipLookup) {
|
|
103
103
|
const interactionMessage = getInteractionMessage(drillableItems, intl);
|
|
104
104
|
const properties = getTooltipProperties(geoProperties);
|
|
105
105
|
const locationPayload = parseTooltipPayload(properties["locationName"]);
|
|
@@ -124,8 +124,9 @@ export function getTooltipHtml(geoProperties, tooltipStroke, maxWidth, separator
|
|
|
124
124
|
]
|
|
125
125
|
.filter((item) => item !== null)
|
|
126
126
|
.join("");
|
|
127
|
-
const fallbackText = `(${intl.formatMessage({ id: "richText.
|
|
128
|
-
const
|
|
127
|
+
const fallbackText = `(${intl.formatMessage({ id: "richText.no_fetch" })})`;
|
|
128
|
+
const noDataLabel = `(${intl.formatMessage({ id: "richText.no_data" })})`;
|
|
129
|
+
const customPieces = buildCustomTooltipPieces(geoProperties, customConfig, referenceMaps, separators, fallbackText, noDataLabel, tooltipLookup);
|
|
129
130
|
const itemsBody = composeTooltipBody(tooltipItems, customPieces, customConfig?.placement);
|
|
130
131
|
const strokeHtml = showStroke
|
|
131
132
|
? `<span class="gd-viz-tooltip-stroke" style="border-top-color: ${tooltipStroke}"></span>`
|
|
@@ -156,7 +157,7 @@ function resolveTooltipCoordinatesFromGeometry(geometry) {
|
|
|
156
157
|
*
|
|
157
158
|
* @internal
|
|
158
159
|
*/
|
|
159
|
-
export function createPushpinTooltipConfig(tooltip, config, drillableItems, intl, layerIds, referenceMaps) {
|
|
160
|
+
export function createPushpinTooltipConfig(tooltip, config, drillableItems, intl, layerIds, referenceMaps, tooltipLookup) {
|
|
160
161
|
const { separators } = config;
|
|
161
162
|
return {
|
|
162
163
|
layerIds,
|
|
@@ -185,7 +186,7 @@ export function createPushpinTooltipConfig(tooltip, config, drillableItems, intl
|
|
|
185
186
|
const maxTooltipContentWidth = getTooltipContentWidth(isFullScreenTooltip, chartWidth, TOOLTIP_MAX_WIDTH);
|
|
186
187
|
const shapeType = config.points?.shapeType ?? "circle";
|
|
187
188
|
const isIconShape = shapeType === "iconByValue" || shapeType === "oneIcon";
|
|
188
|
-
const tooltipHtml = getTooltipHtml(parsedProps, tooltipStroke, maxTooltipContentWidth, separators, drillableItems, intl, !isIconShape, config.customTooltip, referenceMaps);
|
|
189
|
+
const tooltipHtml = getTooltipHtml(parsedProps, tooltipStroke, maxTooltipContentWidth, separators, drillableItems, intl, !isIconShape, config.customTooltip, referenceMaps, tooltipLookup);
|
|
189
190
|
tooltip
|
|
190
191
|
.setLngLat(coordinates)
|
|
191
192
|
.setHTML(tooltipHtml)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { IntlShape } from "react-intl";
|
|
2
2
|
import type { IAnalyticalBackend, IExecutionFactory, IPreparedExecution } from "@gooddata/sdk-backend-spi";
|
|
3
|
-
import type { IColorPalette, IExecutionConfig, INullableFilter } from "@gooddata/sdk-model";
|
|
3
|
+
import type { IColorPalette, IExecutionConfig, IExecutionDefinition, INullableFilter } from "@gooddata/sdk-model";
|
|
4
4
|
import type { DataViewFacade, IHeaderPredicate } from "@gooddata/sdk-ui";
|
|
5
5
|
import type { IColorMapping, IColorStrategy } from "@gooddata/sdk-ui-vis-commons";
|
|
6
6
|
import type { IAvailableLegends, IGeoLegendItem } from "../../types/common/legends.js";
|
|
@@ -9,6 +9,7 @@ import type { IAreaGeoData } from "../../types/geoData/area.js";
|
|
|
9
9
|
import type { IPushpinGeoData } from "../../types/geoData/pushpin.js";
|
|
10
10
|
import type { GeoLayerType, IGeoLayer, IGeoLayerArea, IGeoLayerPushpin } from "../../types/layers/index.js";
|
|
11
11
|
import type { IMapViewport } from "../../types/map/provider.js";
|
|
12
|
+
import type { IGeoLayerCustomTooltipExecution, IGeoLayerTooltipLookup } from "../common/customTooltipExecution.js";
|
|
12
13
|
import type { FilterSpecification, GeoJSONSourceSpecification, IMapFacade, IPopupFacade } from "../common/mapFacade.js";
|
|
13
14
|
/**
|
|
14
15
|
* Context provided to adapter methods.
|
|
@@ -221,6 +222,7 @@ export type IGeoLayerAdapterByType<TType extends GeoLayerType> = IGeoLayerAdapte
|
|
|
221
222
|
export interface IGeoLayerTooltipParams {
|
|
222
223
|
tooltip: IPopupFacade;
|
|
223
224
|
drillablePredicates: IHeaderPredicate[];
|
|
225
|
+
tooltipLookup?: IGeoLayerTooltipLookup;
|
|
224
226
|
}
|
|
225
227
|
/**
|
|
226
228
|
* Tooltip configuration returned by adapters for unified tooltip handling.
|
|
@@ -303,6 +305,20 @@ export interface IGeoLayerAdapter<TLayer extends IGeoLayer, TOutput extends IGeo
|
|
|
303
305
|
* @returns Prepared execution ready to be executed
|
|
304
306
|
*/
|
|
305
307
|
prepareExecution?(layer: TLayer, context: IGeoAdapterContext, execution: IPreparedExecution): Promise<IPreparedExecution>;
|
|
308
|
+
/**
|
|
309
|
+
* Build a secondary execution that fetches external `{metric/id}` / `{label/id}`
|
|
310
|
+
* references for this layer, sliced so each row uniquely identifies one feature.
|
|
311
|
+
* The returned closure builds the matching key from feature properties at hover
|
|
312
|
+
* time. Return `null` when nothing external needs to be fetched.
|
|
313
|
+
*
|
|
314
|
+
* @param mainDefinition - The PREPARED layer execution definition (post
|
|
315
|
+
* `prepareExecution`, taken from the loaded
|
|
316
|
+
* dataView). Carries the TOOLTIP_TEXT / SEGMENT
|
|
317
|
+
* buckets that the unprepared definition can lack,
|
|
318
|
+
* plus filters / execConfig and the in-chart refs
|
|
319
|
+
* used for dedup.
|
|
320
|
+
*/
|
|
321
|
+
buildTooltipExecution?(layer: TLayer, context: IGeoAdapterContext, mainDefinition: IExecutionDefinition): IGeoLayerCustomTooltipExecution | null;
|
|
306
322
|
/**
|
|
307
323
|
* Prepare layer output from execution result.
|
|
308
324
|
*
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gooddata/sdk-ui-geo",
|
|
3
|
-
"version": "11.39.0-alpha.
|
|
3
|
+
"version": "11.39.0-alpha.2",
|
|
4
4
|
"description": "GoodData.UI SDK - Geo Charts",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "GoodData Corporation",
|
|
@@ -43,12 +43,12 @@
|
|
|
43
43
|
"ts-invariant": "0.10.3",
|
|
44
44
|
"tslib": "2.8.1",
|
|
45
45
|
"uuid": "11.1.0",
|
|
46
|
-
"@gooddata/sdk-backend-spi": "11.39.0-alpha.
|
|
47
|
-
"@gooddata/sdk-
|
|
48
|
-
"@gooddata/sdk-ui-kit": "11.39.0-alpha.
|
|
49
|
-
"@gooddata/sdk-ui-theme-provider": "11.39.0-alpha.
|
|
50
|
-
"@gooddata/sdk-
|
|
51
|
-
"@gooddata/sdk-ui-vis-commons": "11.39.0-alpha.
|
|
46
|
+
"@gooddata/sdk-backend-spi": "11.39.0-alpha.2",
|
|
47
|
+
"@gooddata/sdk-ui": "11.39.0-alpha.2",
|
|
48
|
+
"@gooddata/sdk-ui-kit": "11.39.0-alpha.2",
|
|
49
|
+
"@gooddata/sdk-ui-theme-provider": "11.39.0-alpha.2",
|
|
50
|
+
"@gooddata/sdk-model": "11.39.0-alpha.2",
|
|
51
|
+
"@gooddata/sdk-ui-vis-commons": "11.39.0-alpha.2"
|
|
52
52
|
},
|
|
53
53
|
"devDependencies": {
|
|
54
54
|
"@microsoft/api-documenter": "^7.17.0",
|
|
@@ -91,10 +91,10 @@
|
|
|
91
91
|
"typescript": "5.9.3",
|
|
92
92
|
"vitest": "4.1.0",
|
|
93
93
|
"vitest-dom": "0.1.1",
|
|
94
|
-
"@gooddata/oxlint-config": "11.39.0-alpha.
|
|
95
|
-
"@gooddata/
|
|
96
|
-
"@gooddata/
|
|
97
|
-
"@gooddata/
|
|
94
|
+
"@gooddata/oxlint-config": "11.39.0-alpha.2",
|
|
95
|
+
"@gooddata/eslint-config": "11.39.0-alpha.2",
|
|
96
|
+
"@gooddata/sdk-backend-mockingbird": "11.39.0-alpha.2",
|
|
97
|
+
"@gooddata/stylelint-config": "11.39.0-alpha.2"
|
|
98
98
|
},
|
|
99
99
|
"peerDependencies": {
|
|
100
100
|
"react": "^18.0.0 || ^19.0.0",
|
package/styles/css/main.css
CHANGED
|
@@ -1730,56 +1730,60 @@ a.mapboxgl-ctrl-logo.mapboxgl-compact {
|
|
|
1730
1730
|
}
|
|
1731
1731
|
|
|
1732
1732
|
.gd-viz-tooltip-custom-section {
|
|
1733
|
-
font-size:
|
|
1734
|
-
line-height: 1.
|
|
1733
|
+
font-size: 14px;
|
|
1734
|
+
line-height: 1.2;
|
|
1735
1735
|
text-align: left;
|
|
1736
1736
|
white-space: normal;
|
|
1737
1737
|
word-wrap: break-word;
|
|
1738
1738
|
min-width: 200px;
|
|
1739
|
+
color: var(--gd-palette-complementary-7);
|
|
1739
1740
|
}
|
|
1740
1741
|
.gd-viz-tooltip-custom-section h1,
|
|
1741
1742
|
.gd-viz-tooltip-custom-section h2,
|
|
1742
1743
|
.gd-viz-tooltip-custom-section h3,
|
|
1743
1744
|
.gd-viz-tooltip-custom-section h4 {
|
|
1744
|
-
margin: 0
|
|
1745
|
+
margin: 0;
|
|
1745
1746
|
font-weight: 700;
|
|
1746
|
-
color: var(--gd-
|
|
1747
|
+
color: var(--gd-palette-complementary-9);
|
|
1747
1748
|
font-size: 14px;
|
|
1748
|
-
line-height: 1.
|
|
1749
|
+
line-height: 1.2;
|
|
1750
|
+
padding: 5px 0;
|
|
1749
1751
|
}
|
|
1750
1752
|
.gd-viz-tooltip-custom-section p {
|
|
1751
|
-
margin: 0
|
|
1753
|
+
margin: 0;
|
|
1754
|
+
padding-block-end: 5px;
|
|
1752
1755
|
}
|
|
1753
1756
|
.gd-viz-tooltip-custom-section strong {
|
|
1754
1757
|
font-weight: 700;
|
|
1755
|
-
color: var(--gd-chart-tooltip-valueColor);
|
|
1756
1758
|
}
|
|
1757
1759
|
.gd-viz-tooltip-custom-section ul,
|
|
1758
1760
|
.gd-viz-tooltip-custom-section ol {
|
|
1759
|
-
|
|
1760
|
-
|
|
1761
|
-
}
|
|
1762
|
-
.gd-viz-tooltip-custom-section li {
|
|
1763
|
-
margin-bottom: 1px;
|
|
1761
|
+
padding: 0 0 0 18px;
|
|
1762
|
+
margin: 0;
|
|
1764
1763
|
}
|
|
1765
1764
|
.gd-viz-tooltip-custom-section hr {
|
|
1766
1765
|
border: 0;
|
|
1767
1766
|
border-top: 1px solid var(--gd-palette-complementary-3);
|
|
1768
|
-
|
|
1767
|
+
padding: 4px 0;
|
|
1769
1768
|
}
|
|
1770
1769
|
.gd-viz-tooltip-custom-section img {
|
|
1771
1770
|
max-width: 100%;
|
|
1772
1771
|
display: block;
|
|
1773
|
-
|
|
1772
|
+
padding: 3px 0;
|
|
1774
1773
|
}
|
|
1775
|
-
.gd-viz-tooltip-custom-section
|
|
1774
|
+
.gd-viz-tooltip-custom-section a {
|
|
1776
1775
|
text-decoration: underline;
|
|
1777
|
-
color:
|
|
1776
|
+
color: inherit;
|
|
1777
|
+
cursor: pointer;
|
|
1778
|
+
pointer-events: auto;
|
|
1779
|
+
}
|
|
1780
|
+
.gd-viz-tooltip-custom-section a:hover {
|
|
1781
|
+
color: var(--gd-palette-primary-base);
|
|
1778
1782
|
}
|
|
1779
1783
|
|
|
1780
1784
|
.gd-viz-tooltip-custom-separator {
|
|
1781
1785
|
border-top: 1px solid var(--gd-palette-complementary-3);
|
|
1782
|
-
|
|
1786
|
+
padding: 7px 0;
|
|
1783
1787
|
}
|
|
1784
1788
|
|
|
1785
1789
|
.gd-viz-tooltip {
|
package/styles/css/main.css.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sourceRoot":"","sources":["../../node_modules/@gooddata/sdk-ui-kit/src/@ui/defaultTheme.scss","../../node_modules/mapbox-gl/dist/mapbox-gl.css","../../node_modules/@gooddata/sdk-ui-kit/styles/scss/aria.scss","../../node_modules/@gooddata/sdk-ui-kit/styles/scss/Button/_variables.scss","../../node_modules/@gooddata/sdk-ui-kit/styles/scss/mixins.scss","../../node_modules/@gooddata/sdk-ui-kit/styles/scss/Bubble/_variables.scss","../../node_modules/@gooddata/sdk-ui-vis-commons/styles/scss/legend.scss","../../node_modules/@gooddata/sdk-ui-kit/styles/scss/variables.scss","../../node_modules/@gooddata/sdk-ui-vis-commons/styles/scss/customTooltip.scss","../scss/tooltip.scss","../scss/_variables.scss","../scss/charts.scss","../../node_modules/maplibre-gl/dist/maplibre-gl.css","../scss/_maplibre-overrides.scss","../scss/_geo-pushpin-next-legend.scss","../scss/geo-pushpin-next.scss","../scss/geo-area-next.scss","../scss/geo-chart-next.scss","../scss/_geo-multi-layer-legend.scss","../scss/main.scss"],"names":[],"mappings":";AAIA;EAEI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EAGA;EACA;EAGA;EACA;AAAA;AAAA;AAAA;EAIA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;AAAA;AAAA;AAAA;EAIA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;AAAA;AAAA;AAAA;EAIA;AAAA;AAAA;AAAA;EAIA;AAAA;AAAA;AAAA;EAIA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAAA;AAAA;AAAA;EAIA;EACA;AAAA;AAAA;AAAA;EAIA;EAGA;EACA;EACA;AAAA;AAAA;AAAA;EAIA;AAAA;AAAA;AAAA;EAIA;EACA;EACA;EACA;AAAA;AAAA;AAAA;EAIA;EACA;EACA;EACA;EAGA;EACA;EAGA;EAGA;EACA;AAAA;AAAA;AAAA;EAIA;AAAA;AAAA;AAAA;EAIA;EACA;EACA;EACA;AAAA;AAAA;AAAA;EAIA;EACA;AAAA;AAAA;AAAA;EAIA;AAAA;AAAA;AAAA;EAIA;EACA;EACA;EACA;EACA;AAAA;AAAA;AAAA;EAIA;EACA;AAAA;AAAA;AAAA;EAIA;EACA;EACA;EACA;EACA;EACA;EACA;AAAA;AAAA;AAAA;EAIA;EACA;EACA;EACA;EACA;AAAA;AAAA;AAAA;EAIA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA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;EACI;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA,kBJvGiB;;AI4GzB;EACI;;AAEA;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA,OP5FI;;AO+FR;EACI;EACA;EACA;EACA;EACA;EACA;EACA,OJnIiB;EIoIjB,aPhCM;;AOoCN;EACI;;AAMZ;EACI;EACA;EACA;;AAEA;EACI;EACA;;AAMJ;EACI;EACA;EACA;;;ACvJR;EACI;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;;AAGJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;ACpDJ;EACI;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;EACA;;;AClBJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;;;ACOR;EACI;EACA;EACA;EACA;EACA,kBXRa;EWSb;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA,aX4Dc;EW3Dd;EACA;EAEA;EAEA;;AAEA;EAzBJ;IA0BQ;;;AAIJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAMJ;EACI;EACA;EACA;EACA;EACA;EACA;EAGA;;AAGA;EACI;;AAIJ;EACI;EACA;EACA;;AAIJ;EACI;;AAKR;EACI;EACA;EACA;EACA;EACA;EACA;EACA,kBXrGS;EWsGT;EAEA;EACA;;AAIA;EACI;;AAEA;EACI;;AAGJ;EACI;EACA;;AAMZ;EAEI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;EACA;;AAKR;EACI;EACA;EACA;EACA;EACA;EACA;;AAIJ;EACI;EACA,OAhLe;EAiLf;EACA;;AAEA;EACI;;AAKR;EACI;EACA;EACA;EACA;EACA,OAjMa;EAkMb;EACA;EACA;;AAIJ;EACI;EACA;EACA;;AAGJ;EACI;;AAIJ;EAEI;EACA;EACA;;AAKJ;EACI;EACA;EAEA;EACA;EACA;EACA;EACA;EA0CA;EACA;;AAxCA;EACI;EACA;EACA;;AAIJ;EACI;EACA;EACA;;AAKJ;EACI;EACA;EACA;;AAIJ;EACI;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAWR;EAGI;;AAGA;EACI;;AAIJ;EACI;EACA;;AAGJ;EACI;;AAIA;EACI,YACI;EAjShB;EACA;;AAuSA;EACI;EACA;;AAIJ;EACI;EACA;EACA;EACA,OA5TY;EA6TZ;EACA;EACA;EACA;;AAMJ;EACI;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA,OAhWY;EAiWZ;;AAMJ;EACI;EACA;;AAIA;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;EACA;EACA;;AAGA;EACI;EACA;EACA;EACA;;AAGA;EACI;;AAGJ;EApYR;EACA,gBAoY0C;EAnY1C;;AA0YQ;EA5YR;EACA,gBA4Y0C;EA3Y1C;EAIA;EACA;;AAyYY;EACI;;AAOR;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAKZ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA,OArbY;EAsbZ;EACA;EACA;;AAGJ;EACI;EACA,OA7bY;EA8bZ;;AAMJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EAEA;;AAOJ;EACI;EACA;EACA;;AAGJ;EAEI;EACA;EACA;EACA,OAleY;;;ACUZ;EACI;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;;AAIR;EACI;EACA;;AAOA;EACI;;AAIR;EACI;EACA;EACA;EACA;;AAIA;EACI;EACA;EACA;EACA;EACA;;AAGJ;EACI;;AAGJ;EACI;;AAMZ;EACI;EACA;EACA;;;AAKJ;EAEI;;AAGJ;EACI;;AAEA;EAEI;;AAGJ;EAEI;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;AAAA;EAEI;;AAGJ;EACI;;AAGJ;EACI;;;AAIR;EACI;;AAEA;EACI;EACA;EACA;EACA;EACA,OZ1HQ;EY2HR;EACA;EACA;EACA;;AAIA;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA,OZ5II;;AY+IR;EACI,OT7KiB;ES8KjB,aZ1EM;;AY8EN;EACI;;AAKZ;EACI;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;;;AAIR;EACI;;;AAGJ;EACI;EAGA;;;AAIJ;EAEI;;;AAIJ;EACI;EACA;EACA;;;AAGJ;AACA;EACI;;;AAGJ;EACI;EACA;;;AAGJ;AACA;AAAA;EAEI,aT3Oe;ES6Of;EACA,OZpNoB;EYqNpB;;;AAIJ;EAEI;EAEA","file":"main.css"}
|
|
1
|
+
{"version":3,"sourceRoot":"","sources":["../../node_modules/@gooddata/sdk-ui-kit/src/@ui/defaultTheme.scss","../../node_modules/mapbox-gl/dist/mapbox-gl.css","../../node_modules/@gooddata/sdk-ui-kit/styles/scss/aria.scss","../../node_modules/@gooddata/sdk-ui-kit/styles/scss/Button/_variables.scss","../../node_modules/@gooddata/sdk-ui-kit/styles/scss/mixins.scss","../../node_modules/@gooddata/sdk-ui-kit/styles/scss/Bubble/_variables.scss","../../node_modules/@gooddata/sdk-ui-vis-commons/styles/scss/legend.scss","../../node_modules/@gooddata/sdk-ui-kit/styles/scss/variables.scss","../../node_modules/@gooddata/sdk-ui-vis-commons/styles/scss/customTooltip.scss","../scss/tooltip.scss","../scss/_variables.scss","../scss/charts.scss","../../node_modules/maplibre-gl/dist/maplibre-gl.css","../scss/_maplibre-overrides.scss","../scss/_geo-pushpin-next-legend.scss","../scss/geo-pushpin-next.scss","../scss/geo-area-next.scss","../scss/geo-chart-next.scss","../scss/_geo-multi-layer-legend.scss","../scss/main.scss"],"names":[],"mappings":";AAIA;EAEI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EAGA;EACA;EAGA;EACA;AAAA;AAAA;AAAA;EAIA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;AAAA;AAAA;AAAA;EAIA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;AAAA;AAAA;AAAA;EAIA;AAAA;AAAA;AAAA;EAIA;AAAA;AAAA;AAAA;EAIA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAAA;AAAA;AAAA;EAIA;EACA;AAAA;AAAA;AAAA;EAIA;EAGA;EACA;EACA;AAAA;AAAA;AAAA;EAIA;AAAA;AAAA;AAAA;EAIA;EACA;EACA;EACA;AAAA;AAAA;AAAA;EAIA;EACA;EACA;EACA;EAGA;EACA;EAGA;EAGA;EACA;AAAA;AAAA;AAAA;EAIA;AAAA;AAAA;AAAA;EAIA;EACA;EACA;EACA;AAAA;AAAA;AAAA;EAIA;EACA;AAAA;AAAA;AAAA;EAIA;AAAA;AAAA;AAAA;EAIA;EACA;EACA;EACA;EACA;AAAA;AAAA;AAAA;EAIA;EACA;AAAA;AAAA;AAAA;EAIA;EACA;EACA;EACA;EACA;EACA;EACA;AAAA;AAAA;AAAA;EAIA;EACA;EACA;EACA;EACA;AAAA;AAAA;AAAA;EAIA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA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AAGJ;EACI;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA,kBJvGiB;;AI4GzB;EACI;;AAEA;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA,OP5FI;;AO+FR;EACI;EACA;EACA;EACA;EACA;EACA;EACA,OJnIiB;EIoIjB,aPhCM;;AOoCN;EACI;;AAMZ;EACI;EACA;EACA;;AAEA;EACI;EACA;;AAMJ;EACI;EACA;EACA;;;ACvJR;EACI;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;;AAGJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;ACpDJ;EACI;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;EACA;;;AClBJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;;;ACOR;EACI;EACA;EACA;EACA;EACA,kBXRa;EWSb;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA,aX4Dc;EW3Dd;EACA;EAEA;EAEA;;AAEA;EAzBJ;IA0BQ;;;AAIJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAMJ;EACI;EACA;EACA;EACA;EACA;EACA;EAGA;;AAGA;EACI;;AAIJ;EACI;EACA;EACA;;AAIJ;EACI;;AAKR;EACI;EACA;EACA;EACA;EACA;EACA;EACA,kBXrGS;EWsGT;EAEA;EACA;;AAIA;EACI;;AAEA;EACI;;AAGJ;EACI;EACA;;AAMZ;EAEI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;EACA;;AAKR;EACI;EACA;EACA;EACA;EACA;EACA;;AAIJ;EACI;EACA,OAhLe;EAiLf;EACA;;AAEA;EACI;;AAKR;EACI;EACA;EACA;EACA;EACA,OAjMa;EAkMb;EACA;EACA;;AAIJ;EACI;EACA;EACA;;AAGJ;EACI;;AAIJ;EAEI;EACA;EACA;;AAKJ;EACI;EACA;EAEA;EACA;EACA;EACA;EACA;EA0CA;EACA;;AAxCA;EACI;EACA;EACA;;AAIJ;EACI;EACA;EACA;;AAKJ;EACI;EACA;EACA;;AAIJ;EACI;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAWR;EAGI;;AAGA;EACI;;AAIJ;EACI;EACA;;AAGJ;EACI;;AAIA;EACI,YACI;EAjShB;EACA;;AAuSA;EACI;EACA;;AAIJ;EACI;EACA;EACA;EACA,OA5TY;EA6TZ;EACA;EACA;EACA;;AAMJ;EACI;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA,OAhWY;EAiWZ;;AAMJ;EACI;EACA;;AAIA;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;EACA;EACA;;AAGA;EACI;EACA;EACA;EACA;;AAGA;EACI;;AAGJ;EApYR;EACA,gBAoY0C;EAnY1C;;AA0YQ;EA5YR;EACA,gBA4Y0C;EA3Y1C;EAIA;EACA;;AAyYY;EACI;;AAOR;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAKZ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA,OArbY;EAsbZ;EACA;EACA;;AAGJ;EACI;EACA,OA7bY;EA8bZ;;AAMJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EAEA;;AAOJ;EACI;EACA;EACA;;AAGJ;EAEI;EACA;EACA;EACA,OAleY;;;ACUZ;EACI;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;;AAIR;EACI;EACA;;AAOA;EACI;;AAIR;EACI;EACA;EACA;EACA;;AAIA;EACI;EACA;EACA;EACA;EACA;;AAGJ;EACI;;AAGJ;EACI;;AAMZ;EACI;EACA;EACA;;;AAKJ;EAEI;;AAGJ;EACI;;AAEA;EAEI;;AAGJ;EAEI;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;AAAA;EAEI;;AAGJ;EACI;;AAGJ;EACI;;;AAIR;EACI;;AAEA;EACI;EACA;EACA;EACA;EACA,OZ1HQ;EY2HR;EACA;EACA;EACA;;AAIA;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA,OZ5II;;AY+IR;EACI,OT7KiB;ES8KjB,aZ1EM;;AY8EN;EACI;;AAKZ;EACI;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;;;AAIR;EACI;;;AAGJ;EACI;EAGA;;;AAIJ;EAEI;;;AAIJ;EACI;EACA;EACA;;;AAGJ;AACA;EACI;;;AAGJ;EACI;EACA;;;AAGJ;AACA;AAAA;EAEI,aT3Oe;ES6Of;EACA,OZpNoB;EYqNpB;;;AAIJ;EAEI;EAEA","file":"main.css"}
|