@gooddata/sdk-ui-ext 11.58.0-alpha.1 → 11.58.0-alpha.3

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/NOTICE CHANGED
@@ -7,9 +7,9 @@
7
7
 
8
8
  The following 3rd-party software packages may be used by or distributed with gooddata-ui-sdk. Any information relevant to third-party vendors listed below are collected using common, reasonable means.
9
9
 
10
- Date generated: 2026-9-17
10
+ Date generated: 2026-9-21
11
11
 
12
- Revision ID: 6e9e7d215b299b59d80f8f5d8951b4add339a98a
12
+ Revision ID: d287888cbc82806bcb9866c66ecff9b2ff92c32b
13
13
 
14
14
  ================================================================================
15
15
  ================================================================================
@@ -13663,7 +13663,7 @@ MIT
13663
13663
 
13664
13664
  Authors: 1075746765@qq.com, afc163@gmail.com, scdzwyxst@gmail.com, smith3816@gmail.com, wasd2144@hotmail.com
13665
13665
  Package Manager: NPM
13666
- Project URL: https://www.npmjs.com/package/@rc-component/resize-observer
13666
+ Project URL: https://react-component.github.io/resize-observer
13667
13667
  Package Download URL: https://registry.npmjs.org/@rc-component/resize-observer/-/resize-observer-1.1.2.tgz
13668
13668
  Dependency Path: @rc-component/picker > @rc-component/overflow > @rc-component/resize-observer > @rc-component/picker > @rc-component/resize-observer > @rc-component/picker > @rc-component/trigger > @rc-component/resize-observer
13669
13669
  File Path(s): common/config/subspaces/sdk/pnpm-lock.yaml
@@ -21127,7 +21127,7 @@ MIT
21127
21127
 
21128
21128
  Authors: ljharb@gmail.com
21129
21129
  Package Manager: NPM
21130
- Project URL: https://www.npmjs.com/package/call-bind-apply-helpers
21130
+ Project URL: https://github.com/ljharb/call-bind-apply-helpers#readme
21131
21131
  Package Download URL: https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz
21132
21132
  Dependency Path: @formatjs/cli-lib > @formatjs/ts-transformer > json-stable-stringify > call-bind > set-function-length > get-intrinsic > call-bind-apply-helpers > @formatjs/cli-lib > @types/json-stable-stringify > json-stable-stringify > call-bind > set-function-length > get-intrinsic > call-bind-apply-helpers > @formatjs/cli-lib > json-stable-stringify > call-bind > set-function-length > get-intrinsic > call-bind-apply-helpers > axios > form-data > es-set-tostringtag > get-intrinsic > call-bind-apply-helpers > json-stable-stringify > call-bind > call-bind-apply-helpers > json-stable-stringify > call-bind > get-intrinsic > call-bind-apply-helpers > json-stable-stringify > call-bind > get-intrinsic > get-proto > dunder-proto > call-bind-apply-helpers > json-stable-stringify > call-bind > set-function-length > get-intrinsic > call-bind-apply-helpers > json-stable-stringify > call-bound > call-bind-apply-helpers > json-stable-stringify > call-bound > get-intrinsic > call-bind-apply-helpers
21133
21133
  File Path(s): common/config/subspaces/sdk/pnpm-lock.yaml
@@ -30212,7 +30212,7 @@ MIT
30212
30212
 
30213
30213
  Authors: ljharb@gmail.com
30214
30214
  Package Manager: NPM
30215
- Project URL: https://www.npmjs.com/package/gopd
30215
+ Project URL: https://github.com/ljharb/gopd#readme
30216
30216
  Package Download URL: https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz
30217
30217
  Dependency Path: @formatjs/cli-lib > @formatjs/ts-transformer > @types/json-stable-stringify > json-stable-stringify > call-bind > set-function-length > gopd > @formatjs/cli-lib > @formatjs/ts-transformer > json-stable-stringify > call-bind > set-function-length > gopd > @formatjs/cli-lib > @types/json-stable-stringify > json-stable-stringify > call-bind > set-function-length > gopd > @formatjs/cli-lib > json-stable-stringify > call-bind > set-function-length > gopd > axios > form-data > es-set-tostringtag > get-intrinsic > gopd > json-stable-stringify > call-bind > get-intrinsic > get-proto > dunder-proto > gopd > json-stable-stringify > call-bind > get-intrinsic > gopd > json-stable-stringify > call-bind > set-function-length > define-data-property > gopd > json-stable-stringify > call-bind > set-function-length > gopd > json-stable-stringify > call-bound > get-intrinsic > gopd
30218
30218
  File Path(s): common/config/subspaces/sdk/pnpm-lock.yaml
@@ -38217,7 +38217,7 @@ MIT
38217
38217
 
38218
38218
  Authors: tituswormer@gmail.com
38219
38219
  Package Manager: NPM
38220
- Project URL: https://www.npmjs.com/package/mathml-tag-names
38220
+ Project URL: https://github.com/wooorm/mathml-tag-names#readme
38221
38221
  Package Download URL: https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz
38222
38222
  Dependency Path: stylelint > mathml-tag-names > stylelint-config-standard > stylelint > mathml-tag-names > stylelint-config-standard > stylelint-config-recommended > stylelint > mathml-tag-names > stylelint-order > stylelint > mathml-tag-names > stylelint-plugin-defensive-css > stylelint > mathml-tag-names > stylelint-scss > stylelint > mathml-tag-names
38223
38223
  File Path(s): common/config/subspaces/sdk/pnpm-lock.yaml
@@ -43603,7 +43603,7 @@ MIT
43603
43603
 
43604
43604
  Authors: daniel@touchlay.com, npm@joshuakgoldberg.com
43605
43605
  Package Manager: NPM
43606
- Project URL: https://www.npmjs.com/package/node-emoji
43606
+ Project URL: https://github.com/omnidan/node-emoji#readme
43607
43607
  Package Download URL: https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz
43608
43608
  Dependency Path: remark-emoji > node-emoji
43609
43609
  File Path(s): common/config/subspaces/sdk/pnpm-lock.yaml
@@ -58579,7 +58579,7 @@ MIT
58579
58579
 
58580
58580
  Authors: marijn@haverbeke.berlin
58581
58581
  Package Manager: NPM
58582
- Project URL: https://www.npmjs.com/package/style-mod
58582
+ Project URL: https://code.haverbeke.berlin/marijn/style-mod
58583
58583
  Package Download URL: https://registry.npmjs.org/style-mod/-/style-mod-4.1.3.tgz
58584
58584
  Dependency Path: @codemirror/autocomplete > @codemirror/language > @codemirror/view > style-mod > @codemirror/autocomplete > @codemirror/view > style-mod > @codemirror/commands > @codemirror/language > @codemirror/view > style-mod > @codemirror/commands > @codemirror/view > style-mod > @codemirror/lang-json > @codemirror/language > @codemirror/view > style-mod > @codemirror/lang-yaml > @codemirror/language > @codemirror/view > style-mod > @codemirror/language > @codemirror/view > style-mod > @codemirror/language > style-mod > @codemirror/lint > @codemirror/view > style-mod > @codemirror/view > style-mod
58585
58585
  File Path(s): common/config/subspaces/sdk/pnpm-lock.yaml
@@ -64914,4 +64914,4 @@ File Path(s): common/config/subspaces/sdk/pnpm-lock.yaml
64914
64914
  --------------------------------------------------------------------------------
64915
64915
  --------------------------------------------------------------------------------
64916
64916
 
64917
- Report Generated by FOSSA on 2026-9-17
64917
+ Report Generated by FOSSA on 2026-9-21
package/esm/index.d.ts CHANGED
@@ -87,4 +87,6 @@ export { accessListToSummary, draftToSummary, type ObjectShareLevel, summaryOthe
87
87
  export { isPermissionsNotAvailable } from "./share/accessErrors.js";
88
88
  export { type IObjectAccessLevel, type IUseObjectAccessLevelOptions, useObjectAccessLevel, } from "./share/useObjectAccessLevel.js";
89
89
  export type { IObjectAccessSummary, IObjectShareLabel } from "./share/types.js";
90
+ export { type ILayerTableConversionOptions, type ILayerTableDefinition, canConvertToTable, convertInsightToLayerTables, convertInsightToTableDefinition, supportsShowAsTable, } from "./insightToTable/insightToTable.js";
91
+ export { getGeoTableDisplayFormRefs } from "./insightToTable/geoDefaultDisplayFormRefs.js";
90
92
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/esm/index.js CHANGED
@@ -79,3 +79,5 @@ export { useCopyObjectPermissions } from "./share/useCopyObjectPermissions.js";
79
79
  export { accessListToSummary, draftToSummary, summaryOtherGranteeCount, summaryToShareLevel, } from "./share/accessSummary.js";
80
80
  export { isPermissionsNotAvailable } from "./share/accessErrors.js";
81
81
  export { useObjectAccessLevel, } from "./share/useObjectAccessLevel.js";
82
+ export { canConvertToTable, convertInsightToLayerTables, convertInsightToTableDefinition, supportsShowAsTable, } from "./insightToTable/insightToTable.js";
83
+ export { getGeoTableDisplayFormRefs } from "./insightToTable/geoDefaultDisplayFormRefs.js";
@@ -0,0 +1,10 @@
1
+ import { type IAttributeWithReferences } from "@gooddata/sdk-backend-spi";
2
+ import { type GeoLayerType, type IBucket, type ICatalogAttribute, type IInsight, type ISettings, type ObjRef } from "@gooddata/sdk-model";
3
+ /**
4
+ * The display form each geo attribute is read through when the insight states none of its own.
5
+ *
6
+ * @internal
7
+ */
8
+ export declare function getGeoTableDisplayFormRefs(insight: IInsight, settings: ISettings | undefined, catalogAttributes: ICatalogAttribute[], preloadedAttributesWithReferences?: IAttributeWithReferences[]): Map<string, ObjRef> | undefined;
9
+ export declare function resolveGeoDefaultDisplayFormRefs(layerType: GeoLayerType, buckets: IBucket[], catalogAttributes: ICatalogAttribute[], preloadedAttributesWithReferences?: IAttributeWithReferences[]): Map<string, ObjRef> | undefined;
10
+ //# sourceMappingURL=geoDefaultDisplayFormRefs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geoDefaultDisplayFormRefs.d.ts","sourceRoot":"","sources":["../../src/insightToTable/geoDefaultDisplayFormRefs.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EACH,KAAK,YAAY,EAEjB,KAAK,OAAO,EACZ,KAAK,iBAAiB,EACtB,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,KAAK,MAAM,EAQd,MAAM,qBAAqB,CAAC;AAO7B;;;;GAIG;AACH,wBAAgB,0BAA0B,CACtC,OAAO,EAAE,QAAQ,EACjB,QAAQ,EAAE,SAAS,GAAG,SAAS,EAC/B,iBAAiB,EAAE,iBAAiB,EAAE,EACtC,iCAAiC,CAAC,EAAE,wBAAwB,EAAE,GAC/D,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAiBjC;AAED,wBAAgB,gCAAgC,CAC5C,SAAS,EAAE,YAAY,EACvB,OAAO,EAAE,OAAO,EAAE,EAClB,iBAAiB,EAAE,iBAAiB,EAAE,EACtC,iCAAiC,CAAC,EAAE,wBAAwB,EAAE,GAC/D,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAmBjC"}
@@ -0,0 +1,33 @@
1
+ // (C) 2025-2026 GoodData Corporation
2
+ import { GeoLayerTypes, attributeDisplayFormRef, bucketAttribute, bucketsFind, geoLayerTypeFromVisualizationType, insightBuckets, insightVisualizationType, serializeObjRef, } from "@gooddata/sdk-model";
3
+ import { BucketNames, isGeoVisualizationUsingNewEngine, resolveDefaultDisplayFormRefForDisplayForm, } from "@gooddata/sdk-ui";
4
+ /**
5
+ * The display form each geo attribute is read through when the insight states none of its own.
6
+ *
7
+ * @internal
8
+ */
9
+ export function getGeoTableDisplayFormRefs(insight, settings, catalogAttributes, preloadedAttributesWithReferences) {
10
+ const type = insightVisualizationType(insight);
11
+ if (!isGeoVisualizationUsingNewEngine(type, settings)) {
12
+ return undefined;
13
+ }
14
+ const layerType = geoLayerTypeFromVisualizationType(type);
15
+ if (!layerType) {
16
+ return undefined;
17
+ }
18
+ return resolveGeoDefaultDisplayFormRefs(layerType, insightBuckets(insight), catalogAttributes, preloadedAttributesWithReferences);
19
+ }
20
+ export function resolveGeoDefaultDisplayFormRefs(layerType, buckets, catalogAttributes, preloadedAttributesWithReferences) {
21
+ const bucketName = layerType === GeoLayerTypes.AREA ? BucketNames.AREA : BucketNames.LOCATION;
22
+ const geoBucket = bucketsFind(buckets, bucketName);
23
+ const geoAttribute = geoBucket ? bucketAttribute(geoBucket) : undefined;
24
+ if (!geoAttribute) {
25
+ return undefined;
26
+ }
27
+ const geoDisplayFormRef = attributeDisplayFormRef(geoAttribute);
28
+ const defaultDisplayFormRef = resolveDefaultDisplayFormRefForDisplayForm(geoDisplayFormRef, catalogAttributes, preloadedAttributesWithReferences);
29
+ if (!defaultDisplayFormRef) {
30
+ return undefined;
31
+ }
32
+ return new Map([[serializeObjRef(geoDisplayFormRef), defaultDisplayFormRef]]);
33
+ }
@@ -0,0 +1,75 @@
1
+ import { type IAttributeWithReferences } from "@gooddata/sdk-backend-spi";
2
+ import { type ICatalogAttribute, type IInsight, type ISettings } from "@gooddata/sdk-model";
3
+ import { type GeoTableConversionOptions } from "@gooddata/sdk-ui";
4
+ /**
5
+ * Determines if a visualization type supports the "Show as Table" UI button.
6
+ * This controls whether users can manually toggle table view in the UI.
7
+ *
8
+ * @param insightType - The visualization type to check
9
+ * @returns true if the visualization supports the Show as Table UI feature
10
+ * @internal
11
+ */
12
+ export declare function supportsShowAsTable(insightType?: string): boolean;
13
+ /**
14
+ * Determines if a visualization type can be converted to table format.
15
+ * This is used for accessibility and export purposes, separate from UI controls.
16
+ *
17
+ * @param insightType - The visualization type to check
18
+ * @returns true if the visualization can be converted to table format
19
+ * @internal
20
+ */
21
+ export declare function canConvertToTable(insightType?: string): boolean;
22
+ /**
23
+ * Defines a single layer's table conversion result for multi-layer geo charts.
24
+ *
25
+ * @alpha
26
+ */
27
+ export interface ILayerTableDefinition {
28
+ /** Stable id — "root" for root layer, layer.id for additional layers */
29
+ layerId: string;
30
+ /** Human-readable name for the tab label */
31
+ layerName: string;
32
+ /** Normalized layer type */
33
+ layerType: string;
34
+ /** Converted table insight for this layer */
35
+ tableInsight: IInsight;
36
+ }
37
+ /**
38
+ * Options steering how a multi-layer geo insight is turned into per-layer tables.
39
+ *
40
+ * @internal
41
+ */
42
+ export interface ILayerTableConversionOptions {
43
+ settings?: ISettings;
44
+ catalogAttributes?: ICatalogAttribute[];
45
+ preloadedAttributesWithReferences?: IAttributeWithReferences[];
46
+ }
47
+ /**
48
+ * Converts a multi-layer geo insight into per-layer table definitions.
49
+ *
50
+ * Returns `undefined` when the insight is not a new-geo type (flags off, non-geo, etc.).
51
+ * Returns an array of {@link ILayerTableDefinition} with root layer first, then
52
+ * additional layers in their original order.
53
+ *
54
+ * @internal
55
+ */
56
+ export declare function convertGeoInsightToLayerTables(insight: IInsight, options: ILayerTableConversionOptions): ILayerTableDefinition[] | undefined;
57
+ /**
58
+ * Converts an insight to layered table definitions.
59
+ *
60
+ * @remarks
61
+ * Currently supports geo insights only and is gated by `enableGeoChartA11yImprovements`.
62
+ *
63
+ * @internal
64
+ */
65
+ export declare function convertInsightToLayerTables(insight: IInsight, options: ILayerTableConversionOptions): ILayerTableDefinition[] | undefined;
66
+ /**
67
+ * Converts any insight (except of type "table", "repeater", or "xirr") to a table insight definition.
68
+ * For table, repeater, or xirr insights, returns the original insight.
69
+ *
70
+ * @param insight - The input insight to convert.
71
+ * @returns IInsight with table visualization or the original insight if conversion is not supported.
72
+ * @internal
73
+ */
74
+ export declare function convertInsightToTableDefinition(insight: IInsight, options?: GeoTableConversionOptions): IInsight;
75
+ //# sourceMappingURL=insightToTable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insightToTable.d.ts","sourceRoot":"","sources":["../../src/insightToTable/insightToTable.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EAQH,KAAK,iBAAiB,EACtB,KAAK,QAAQ,EAEb,KAAK,SAAS,EAyBjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAEH,KAAK,yBAAyB,EAIjC,MAAM,kBAAkB,CAAC;AAI1B;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAOjE;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAE/D;AAsYD;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IAClC,wEAAwE;IACxE,OAAO,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,6CAA6C;IAC7C,YAAY,EAAE,QAAQ,CAAC;CAC1B;AAED;;;;GAIG;AACH,MAAM,WAAW,4BAA4B;IACzC,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,iBAAiB,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACxC,iCAAiC,CAAC,EAAE,wBAAwB,EAAE,CAAC;CAClE;AAED;;;;;;;;GAQG;AACH,wBAAgB,8BAA8B,CAC1C,OAAO,EAAE,QAAQ,EACjB,OAAO,EAAE,4BAA4B,GACtC,qBAAqB,EAAE,GAAG,SAAS,CAsDrC;AAED;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CACvC,OAAO,EAAE,QAAQ,EACjB,OAAO,EAAE,4BAA4B,GACtC,qBAAqB,EAAE,GAAG,SAAS,CAErC;AAED;;;;;;;GAOG;AACH,wBAAgB,+BAA+B,CAC3C,OAAO,EAAE,QAAQ,EACjB,OAAO,GAAE,yBAA8B,GACxC,QAAQ,CA+HV"}
@@ -0,0 +1,482 @@
1
+ // (C) 2025-2026 GoodData Corporation
2
+ import { GeoLayerTypes, areObjRefsEqual, attributeAlias, attributeDisplayFormRef, attributeLocalId, bucketAttribute, bucketMeasure, bucketsFind, geoLayerTypeFromVisualizationType, idRef, insightBuckets, insightLayers, insightMeasures, insightProperties, insightSorts, insightVisualizationType, isGeoLayerType, isPoPMeasure, isPreviousPeriodMeasure, isUriRef, newAttribute, newVirtualArithmeticMeasure, serializeObjRef, uriRef, } from "@gooddata/sdk-model";
3
+ import { BucketNames, VisualizationTypes, convertGeoInsightToTableDefinition as convertGeoInsightToTableDefinitionShared, isGeoVisualizationUsingNewEngine, } from "@gooddata/sdk-ui";
4
+ import { resolveGeoDefaultDisplayFormRefs } from "./geoDefaultDisplayFormRefs.js";
5
+ /**
6
+ * Determines if a visualization type supports the "Show as Table" UI button.
7
+ * This controls whether users can manually toggle table view in the UI.
8
+ *
9
+ * @param insightType - The visualization type to check
10
+ * @returns true if the visualization supports the Show as Table UI feature
11
+ * @internal
12
+ */
13
+ export function supportsShowAsTable(insightType) {
14
+ return (insightType !== "table" &&
15
+ insightType !== "repeater" &&
16
+ insightType !== "headline" &&
17
+ insightType !== "xirr");
18
+ }
19
+ /**
20
+ * Determines if a visualization type can be converted to table format.
21
+ * This is used for accessibility and export purposes, separate from UI controls.
22
+ *
23
+ * @param insightType - The visualization type to check
24
+ * @returns true if the visualization can be converted to table format
25
+ * @internal
26
+ */
27
+ export function canConvertToTable(insightType) {
28
+ return insightType !== "table" && insightType !== "repeater" && insightType !== "xirr";
29
+ }
30
+ /**
31
+ * Default format strings for comparison calculations
32
+ * These match the defaults from sdk-ui-charts/headlineHelper.ts CALCULATION_VALUES_DEFAULT
33
+ *
34
+ * @remarks
35
+ * - CHANGE: Percentage change between primary and secondary
36
+ * - RATIO: Ratio of primary to secondary as percentage
37
+ * - DIFFERENCE: Absolute difference (null means inherit from primary measure)
38
+ * - CHANGE_DIFFERENCE: Both percentage and absolute (sub-value uses null to inherit)
39
+ */
40
+ const COMPARISON_FORMATS = {
41
+ change: "#,##0%",
42
+ ratio: "#,##0%",
43
+ difference: null, // null means inherit format from primary measure
44
+ change_difference: {
45
+ main: "#,##0%",
46
+ sub: null, // Absolute difference (inherit)
47
+ },
48
+ };
49
+ /**
50
+ * Extracts comparison configuration from insight properties
51
+ */
52
+ function getComparisonConfig(insight) {
53
+ const properties = insightProperties(insight);
54
+ return properties["controls"]?.comparison;
55
+ }
56
+ /**
57
+ * Checks if a headline insight has comparison enabled and exactly one secondary measure
58
+ * Matches the logic from HeadlineProviderFactory.isComparisonType in sdk-ui-charts
59
+ *
60
+ * @param insight - The insight to check
61
+ * @returns true if the insight is a headline with comparison enabled
62
+ *
63
+ * @remarks
64
+ * A headline qualifies for comparison if:
65
+ * 1. It's a "headline" visualization type
66
+ * 2. It has both a primary and secondary measure
67
+ * 3. Comparison is enabled in config (defaults to true)
68
+ *
69
+ */
70
+ function isHeadlineWithComparison(insight) {
71
+ const type = insightVisualizationType(insight);
72
+ if (type !== "headline") {
73
+ return false;
74
+ }
75
+ const buckets = insightBuckets(insight);
76
+ const primaryBucket = bucketsFind(buckets, BucketNames.MEASURES);
77
+ const secondaryBucket = bucketsFind(buckets, BucketNames.SECONDARY_MEASURES);
78
+ const primaryMeasure = primaryBucket && bucketMeasure(primaryBucket);
79
+ const secondaryMeasure = secondaryBucket && bucketMeasure(secondaryBucket);
80
+ if (!primaryMeasure || !secondaryMeasure) {
81
+ return false;
82
+ }
83
+ const comparison = getComparisonConfig(insight);
84
+ return comparison?.enabled ?? true;
85
+ }
86
+ /**
87
+ * Determines the calculation type for headline comparison
88
+ * Matches the logic from ComparisonProvider in sdk-ui-charts
89
+ *
90
+ * @param secondaryMeasure - The secondary measure to compare against
91
+ * @param comparison - Optional comparison configuration from insight properties
92
+ * @returns The calculation type to use
93
+ *
94
+ * @remarks
95
+ * Default logic (when no calculationType is configured):
96
+ * - If secondary measure is derived (PoP, Previous Period) → use "change" (percentage change)
97
+ * - If secondary measure is regular → use "ratio" (proportion)
98
+ *
99
+ */
100
+ function getCalculationType(secondaryMeasure, comparison) {
101
+ if (comparison?.calculationType) {
102
+ return comparison.calculationType;
103
+ }
104
+ if (isPoPMeasure(secondaryMeasure) || isPreviousPeriodMeasure(secondaryMeasure)) {
105
+ return "change";
106
+ }
107
+ return "ratio";
108
+ }
109
+ /**
110
+ * Creates virtual arithmetic measures for headline comparison
111
+ * Replicates the logic from ComparisonProvider in sdk-ui-charts
112
+ *
113
+ * @param primaryMeasure - The primary measure
114
+ * @param secondaryMeasure - The secondary measure to compare against
115
+ * @param calculationType - The type of calculation to perform
116
+ * @returns Array of virtual arithmetic measures (1 or 2 depending on calculation type)
117
+ *
118
+ * @remarks
119
+ * Virtual arithmetic measures are calculated by the backend:
120
+ * - "change": ((primary - secondary) / secondary) * 100
121
+ * - "ratio": (primary / secondary)
122
+ * - "difference": (primary - secondary)
123
+ * - "change_difference": Both change AND difference as separate measures
124
+ *
125
+ * The backend performs all calculations; we just create the measure definitions.
126
+ * Format strings are applied so values display correctly (e.g., "25%" instead of "0.25").
127
+ *
128
+ * @see {@link sdk-backend-tiger/MeasureConverter.ts#convertArithmeticMeasureDefinition}
129
+ */
130
+ function createHeadlineComparisonMeasures(primaryMeasure, secondaryMeasure, calculationType) {
131
+ const createVirtualArithmeticMeasure = (operator, format, shouldCombineLocalIdAndOperator) => {
132
+ return newVirtualArithmeticMeasure([primaryMeasure, secondaryMeasure], operator, (builder) => {
133
+ if (shouldCombineLocalIdAndOperator) {
134
+ builder.combineLocalIdWithOperator();
135
+ }
136
+ // Apply format: null means inherit from primary measure, string means use explicit format
137
+ if (format !== null) {
138
+ builder.format(format);
139
+ }
140
+ return builder;
141
+ });
142
+ };
143
+ switch (calculationType) {
144
+ case "difference":
145
+ return [createVirtualArithmeticMeasure("difference", COMPARISON_FORMATS.difference)];
146
+ case "ratio":
147
+ return [createVirtualArithmeticMeasure("ratio", COMPARISON_FORMATS.ratio)];
148
+ case "change":
149
+ return [createVirtualArithmeticMeasure("change", COMPARISON_FORMATS.change)];
150
+ case "change_difference":
151
+ return [
152
+ createVirtualArithmeticMeasure("change", COMPARISON_FORMATS.change_difference.main, true),
153
+ createVirtualArithmeticMeasure("difference", COMPARISON_FORMATS.change_difference.sub, true),
154
+ ];
155
+ default:
156
+ return [];
157
+ }
158
+ }
159
+ /**
160
+ * Transforms a geo bucket attribute to use tooltipText display form (legacy pushpin only).
161
+ *
162
+ * @remarks
163
+ * This is used only when legacy pushpin behavior is active (new geo flags disabled).
164
+ */
165
+ function transformGeoBucketAttributeUsingTooltipText(bucket, insight, uniqueLocalIdSuffix) {
166
+ if (!bucket) {
167
+ return undefined;
168
+ }
169
+ const geoAttr = bucketAttribute(bucket);
170
+ if (!geoAttr) {
171
+ return undefined;
172
+ }
173
+ const properties = insightProperties(insight);
174
+ const tooltipTextId = properties?.["controls"]?.["tooltipText"];
175
+ if (!tooltipTextId) {
176
+ return geoAttr;
177
+ }
178
+ const ref = isUriRef(attributeDisplayFormRef(geoAttr))
179
+ ? uriRef(tooltipTextId)
180
+ : idRef(tooltipTextId, "displayForm");
181
+ // Generate a unique localId to avoid conflicts with existing attributes
182
+ const uniqueLocalId = `${attributeLocalId(geoAttr)}_${uniqueLocalIdSuffix}`;
183
+ const alias = attributeAlias(geoAttr);
184
+ return newAttribute(ref, (m) => {
185
+ m.localId(uniqueLocalId);
186
+ if (alias) {
187
+ m.alias(alias);
188
+ }
189
+ return m;
190
+ });
191
+ }
192
+ /**
193
+ * Transforms a geo bucket attribute to use the default display form.
194
+ *
195
+ * @remarks
196
+ * Used for new GeoChartNext variants when feature flags are enabled.
197
+ */
198
+ function transformGeoBucketAttributeUsingDefaultDisplayForm(bucket, defaultDisplayFormRefs, uniqueLocalIdSuffix) {
199
+ if (!bucket) {
200
+ return undefined;
201
+ }
202
+ const geoAttr = bucketAttribute(bucket);
203
+ if (!geoAttr) {
204
+ return undefined;
205
+ }
206
+ const geoDisplayFormRef = attributeDisplayFormRef(geoAttr);
207
+ const defaultDisplayFormRef = defaultDisplayFormRefs?.get(serializeObjRef(geoDisplayFormRef));
208
+ if (!defaultDisplayFormRef || areObjRefsEqual(defaultDisplayFormRef, geoDisplayFormRef)) {
209
+ return geoAttr;
210
+ }
211
+ const uniqueLocalId = `${attributeLocalId(geoAttr)}_${uniqueLocalIdSuffix}`;
212
+ const alias = attributeAlias(geoAttr);
213
+ return newAttribute(defaultDisplayFormRef, (m) => {
214
+ m.localId(uniqueLocalId);
215
+ if (alias) {
216
+ m.alias(alias);
217
+ }
218
+ return m;
219
+ });
220
+ }
221
+ function transformGeoLocationAttribute(locationBucket, insight) {
222
+ return transformGeoBucketAttributeUsingTooltipText(locationBucket, insight, "table_name");
223
+ }
224
+ function resolveGeoPrimaryAttribute(options, insight, buckets, layerType) {
225
+ if (layerType) {
226
+ return resolveGeoPrimaryAttributeByLayerType(layerType, buckets, options.defaultDisplayFormRefs);
227
+ }
228
+ const type = insightVisualizationType(insight);
229
+ const isLegacyGeoPushpin = type === VisualizationTypes.PUSHPIN && !options.settings?.enableNewGeoPushpin;
230
+ const isNewGeoVisualization = isGeoVisualizationUsingNewEngine(type, options.settings);
231
+ if (isLegacyGeoPushpin) {
232
+ return transformGeoLocationAttribute(bucketsFind(buckets, BucketNames.LOCATION), insight);
233
+ }
234
+ if (isNewGeoVisualization) {
235
+ const rootLayerType = geoLayerTypeFromVisualizationType(type);
236
+ if (rootLayerType) {
237
+ return resolveGeoPrimaryAttributeByLayerType(rootLayerType, buckets, options.defaultDisplayFormRefs);
238
+ }
239
+ }
240
+ return undefined;
241
+ }
242
+ function getGeoTableAttributesWithSegmentAndPrimary(buckets, primaryAttribute) {
243
+ const segmentBucket = bucketsFind(buckets, BucketNames.SEGMENT);
244
+ const rowAttributes = [];
245
+ const segmentAttr = segmentBucket ? bucketAttribute(segmentBucket) : undefined;
246
+ if (segmentAttr) {
247
+ rowAttributes.push(segmentAttr);
248
+ }
249
+ if (primaryAttribute) {
250
+ rowAttributes.push(primaryAttribute);
251
+ }
252
+ return { rowAttributes, columnAttributes: [] };
253
+ }
254
+ function getGeoTableAttributes(insight, buckets, options, layerType) {
255
+ const type = insightVisualizationType(insight);
256
+ const isLegacyGeoPushpin = type === VisualizationTypes.PUSHPIN && !options.settings?.enableNewGeoPushpin;
257
+ const isNewGeoVisualization = isGeoVisualizationUsingNewEngine(type, options.settings);
258
+ if (!layerType && !isLegacyGeoPushpin && !isNewGeoVisualization) {
259
+ return null;
260
+ }
261
+ const primaryAttribute = resolveGeoPrimaryAttribute(options, insight, buckets, layerType);
262
+ return getGeoTableAttributesWithSegmentAndPrimary(buckets, primaryAttribute);
263
+ }
264
+ function resolveGeoPrimaryAttributeByLayerType(layerType, buckets, defaultDisplayFormRefs) {
265
+ const bucketName = layerType === GeoLayerTypes.AREA ? BucketNames.AREA : BucketNames.LOCATION;
266
+ return transformGeoBucketAttributeUsingDefaultDisplayForm(bucketsFind(buckets, bucketName), defaultDisplayFormRefs, "table_default_label");
267
+ }
268
+ function buildTableInsightFromBuckets(insight, buckets, layerType, defaultDisplayFormRefs) {
269
+ const measureBucketIdentifiers = new Set([
270
+ BucketNames.MEASURES,
271
+ BucketNames.SIZE,
272
+ BucketNames.COLOR,
273
+ BucketNames.SECONDARY_MEASURES,
274
+ ]);
275
+ const measures = buckets
276
+ .filter((b) => measureBucketIdentifiers.has(b.localIdentifier ?? ""))
277
+ .flatMap((b) => b.items);
278
+ const { rowAttributes, columnAttributes } = getGeoTableAttributes(insight, buckets, { defaultDisplayFormRefs }, layerType) ?? { rowAttributes: [], columnAttributes: [] };
279
+ const tableBuckets = [
280
+ { localIdentifier: BucketNames.MEASURES, items: measures },
281
+ { localIdentifier: BucketNames.ATTRIBUTE, items: rowAttributes },
282
+ { localIdentifier: BucketNames.COLUMNS, items: columnAttributes },
283
+ ];
284
+ const onlyMeasures = !rowAttributes.length && !columnAttributes.length;
285
+ const propertiesProp = onlyMeasures
286
+ ? { properties: { controls: { measureGroupDimension: "rows" } } }
287
+ : {};
288
+ const tableInsight = {
289
+ ...insight,
290
+ insight: {
291
+ ...insight.insight,
292
+ visualizationUrl: "local:table",
293
+ buckets: tableBuckets,
294
+ ...propertiesProp,
295
+ },
296
+ };
297
+ return {
298
+ ...tableInsight,
299
+ insight: {
300
+ ...tableInsight.insight,
301
+ // Keep only sorts that reference attributes/measures present in this layer table.
302
+ sorts: insightSorts(tableInsight),
303
+ },
304
+ };
305
+ }
306
+ /**
307
+ * Converts a multi-layer geo insight into per-layer table definitions.
308
+ *
309
+ * Returns `undefined` when the insight is not a new-geo type (flags off, non-geo, etc.).
310
+ * Returns an array of {@link ILayerTableDefinition} with root layer first, then
311
+ * additional layers in their original order.
312
+ *
313
+ * @internal
314
+ */
315
+ export function convertGeoInsightToLayerTables(insight, options) {
316
+ if (!options.settings?.["enableGeoChartA11yImprovements"]) {
317
+ return undefined;
318
+ }
319
+ const type = insightVisualizationType(insight);
320
+ if (!isGeoVisualizationUsingNewEngine(type, options.settings)) {
321
+ return undefined;
322
+ }
323
+ const rootLayerType = geoLayerTypeFromVisualizationType(type);
324
+ if (!rootLayerType) {
325
+ return undefined;
326
+ }
327
+ const rootBuckets = insightBuckets(insight);
328
+ const rootDisplayFormRefs = resolveGeoDefaultDisplayFormRefs(rootLayerType, rootBuckets, options.catalogAttributes ?? [], options.preloadedAttributesWithReferences);
329
+ const rootTable = buildTableInsightFromBuckets(insight, rootBuckets, rootLayerType, rootDisplayFormRefs);
330
+ const rootDef = {
331
+ layerId: "root",
332
+ layerName: insight.insight.title,
333
+ layerType: rootLayerType,
334
+ tableInsight: rootTable,
335
+ };
336
+ const layers = insightLayers(insight);
337
+ const layerDefs = layers.flatMap((layer) => {
338
+ if (!isGeoLayerType(layer.type)) {
339
+ return [];
340
+ }
341
+ const layerType = layer.type;
342
+ const displayFormRefs = resolveGeoDefaultDisplayFormRefs(layerType, layer.buckets, options.catalogAttributes ?? [], options.preloadedAttributesWithReferences);
343
+ const tableInsight = buildTableInsightFromBuckets(insight, layer.buckets, layerType, displayFormRefs);
344
+ return [
345
+ {
346
+ layerId: layer.id,
347
+ layerName: layer.name ?? layer.id,
348
+ layerType,
349
+ tableInsight,
350
+ },
351
+ ];
352
+ });
353
+ return [rootDef, ...layerDefs];
354
+ }
355
+ /**
356
+ * Converts an insight to layered table definitions.
357
+ *
358
+ * @remarks
359
+ * Currently supports geo insights only and is gated by `enableGeoChartA11yImprovements`.
360
+ *
361
+ * @internal
362
+ */
363
+ export function convertInsightToLayerTables(insight, options) {
364
+ return convertGeoInsightToLayerTables(insight, options);
365
+ }
366
+ /**
367
+ * Converts any insight (except of type "table", "repeater", or "xirr") to a table insight definition.
368
+ * For table, repeater, or xirr insights, returns the original insight.
369
+ *
370
+ * @param insight - The input insight to convert.
371
+ * @returns IInsight with table visualization or the original insight if conversion is not supported.
372
+ * @internal
373
+ */
374
+ export function convertInsightToTableDefinition(insight, options = {}) {
375
+ const type = insightVisualizationType(insight);
376
+ if (!canConvertToTable(type)) {
377
+ return insight;
378
+ }
379
+ const geoTableInsight = convertGeoInsightToTableDefinitionShared(insight, options);
380
+ if (geoTableInsight) {
381
+ return geoTableInsight;
382
+ }
383
+ // Use sdk-model utils to extract all measures and attributes
384
+ // and build table buckets according to PluggablePivotTable conventions
385
+ // - 'measures' bucket: all measures
386
+ // - 'attributes' bucket: all attributes
387
+ // - 'columns' bucket: empty (can be customized if needed)
388
+ // This is a safe default for generic conversion
389
+ // If more advanced splitting is needed (e.g. from view/stack by), logic can be extended
390
+ //
391
+ // Note: IBucket type is imported from sdk-model
392
+ //
393
+ // The output insight will have only these three buckets
394
+ // Import bucket utilities for splitting attributes
395
+ // PluggablePivotTable convention: row attributes come from the first attribute bucket (view by, trend by, etc),
396
+ // column attributes come from the second attribute bucket (columns, stack by, etc)
397
+ // Measures always from 'measures' bucket
398
+ // See getRowAttributes and getColumnAttributes in PluggablePivotTable
399
+ const buckets = insightBuckets(insight);
400
+ const baseMeasures = insightMeasures(insight);
401
+ // Handle headline comparison: add virtual arithmetic measures for change/difference/ratio
402
+ const comparisonMeasures = [];
403
+ if (isHeadlineWithComparison(insight)) {
404
+ const primaryBucket = bucketsFind(buckets, BucketNames.MEASURES);
405
+ const secondaryBucket = bucketsFind(buckets, BucketNames.SECONDARY_MEASURES);
406
+ const primaryMeasure = primaryBucket && bucketMeasure(primaryBucket);
407
+ const secondaryMeasure = secondaryBucket && bucketMeasure(secondaryBucket);
408
+ if (primaryMeasure && secondaryMeasure) {
409
+ const comparison = getComparisonConfig(insight);
410
+ const calculationType = getCalculationType(secondaryMeasure, comparison);
411
+ comparisonMeasures.push(...createHeadlineComparisonMeasures(primaryMeasure, secondaryMeasure, calculationType));
412
+ }
413
+ }
414
+ const measures = [...baseMeasures, ...comparisonMeasures];
415
+ /**
416
+ * Keep conversion logic aligned with `PluggablePivotTable`:
417
+ * - row attributes: see `getRowAttributes` in `sdk-ui-ext`
418
+ * - column attributes: see `getColumnAttributes` in `sdk-ui-ext`
419
+ *
420
+ * Note: using `BucketNames.*` avoids fragile magic strings.
421
+ */
422
+ const rowBucketIdentifiers = [
423
+ BucketNames.ATTRIBUTE,
424
+ BucketNames.ATTRIBUTES,
425
+ BucketNames.ATTRIBUTE_FROM,
426
+ BucketNames.ATTRIBUTE_TO,
427
+ BucketNames.VIEW,
428
+ BucketNames.TREND,
429
+ BucketNames.LOCATION,
430
+ BucketNames.AREA,
431
+ ];
432
+ const columnBucketIdentifiers = [BucketNames.COLUMNS, BucketNames.STACK, BucketNames.SEGMENT];
433
+ const isRowBucket = (bucket) => rowBucketIdentifiers.includes(bucket.localIdentifier ?? "");
434
+ const isColumnBucket = (bucket) => columnBucketIdentifiers.includes(bucket.localIdentifier ?? "");
435
+ let rowAttributes;
436
+ let columnAttributes;
437
+ const geoAttributes = getGeoTableAttributes(insight, buckets, options);
438
+ if (geoAttributes) {
439
+ rowAttributes = geoAttributes.rowAttributes;
440
+ columnAttributes = geoAttributes.columnAttributes;
441
+ }
442
+ else {
443
+ const rowBuckets = buckets.filter(isRowBucket);
444
+ const columnBuckets = buckets.filter(isColumnBucket);
445
+ rowAttributes = rowBuckets.map((bucket) => bucket.items).flat();
446
+ columnAttributes = columnBuckets.map((bucket) => bucket.items).flat();
447
+ }
448
+ const tableBuckets = [
449
+ {
450
+ localIdentifier: BucketNames.MEASURES,
451
+ items: measures,
452
+ },
453
+ {
454
+ localIdentifier: BucketNames.ATTRIBUTE,
455
+ items: rowAttributes,
456
+ },
457
+ {
458
+ localIdentifier: BucketNames.COLUMNS,
459
+ items: columnAttributes,
460
+ },
461
+ ];
462
+ const onlyMeasures = !rowAttributes.length && !columnAttributes.length;
463
+ const propertiesProp = onlyMeasures
464
+ ? {
465
+ properties: {
466
+ controls: {
467
+ measureGroupDimension: "rows",
468
+ },
469
+ },
470
+ }
471
+ : {};
472
+ const tableInsight = {
473
+ ...insight,
474
+ insight: {
475
+ ...insight.insight,
476
+ visualizationUrl: "local:table",
477
+ buckets: tableBuckets,
478
+ ...propertiesProp,
479
+ },
480
+ };
481
+ return tableInsight;
482
+ }
@@ -5,6 +5,9 @@ import { type IHeaderPredicate } from "@gooddata/sdk-ui";
5
5
  * uris, identifiers and composedFrom uris and identifiers, this function will create instances of
6
6
  * uriMatch(), identifierMatch(), composedFromUri(), composedFromIdentifier() predicates.
7
7
  *
8
+ * An identifier may come as a bare string, matching any object of that identifier, or as a qualifier
9
+ * naming the object type as well, which the matched object then has to carry too.
10
+ *
8
11
  * @param postMessageData - input received via post message
9
12
  * @internal
10
13
  */
@@ -1 +1 @@
1
- {"version":3,"file":"drillablePredicates.d.ts","sourceRoot":"","sources":["../../../src/internal/utils/drillablePredicates.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAoB,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAE3E;;;;;;;GAOG;AACH,wBAAgB,uCAAuC,CAAC,EACpD,IAAI,EACJ,WAAW,EACX,YAAY,GACf,EAAE,0BAA0B,GAAG,gBAAgB,EAAE,CAqBjD;AAED,eAAO,MAAM,wBAAwB;;CAEpC,CAAC"}
1
+ {"version":3,"file":"drillablePredicates.d.ts","sourceRoot":"","sources":["../../../src/internal/utils/drillablePredicates.ts"],"names":[],"mappings":"AAIA,OAAO,EACH,KAAK,0BAA0B,EAGlC,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAoB,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAgB3E;;;;;;;;;;GAUG;AACH,wBAAgB,uCAAuC,CAAC,EACpD,IAAI,EACJ,WAAW,EACX,YAAY,GACf,EAAE,0BAA0B,GAAG,gBAAgB,EAAE,CAsBjD;AAED,eAAO,MAAM,wBAAwB;;CAEpC,CAAC"}
@@ -1,28 +1,37 @@
1
1
  // (C) 2019-2026 GoodData Corporation
2
- import { uniq } from "lodash-es";
2
+ import { uniq, uniqBy } from "lodash-es";
3
3
  import { HeaderPredicates } from "@gooddata/sdk-ui";
4
+ const toQualifier = (identifier) => typeof identifier === "string" ? { identifier } : identifier;
5
+ /**
6
+ * An untyped entry stays distinct from the same identifier typed, and two types of one identifier stay
7
+ * distinct from each other, because each activates drilling on a different object.
8
+ */
9
+ const uniqueQualifiers = (identifiers) => Array.isArray(identifiers)
10
+ ? uniqBy(identifiers.map(toQualifier), ({ identifier, type }) => `${type ?? ""}.${identifier}`)
11
+ : [];
4
12
  /**
5
13
  * Converts post message with drilling specification into header predicates. Given the message with
6
14
  * uris, identifiers and composedFrom uris and identifiers, this function will create instances of
7
15
  * uriMatch(), identifierMatch(), composedFromUri(), composedFromIdentifier() predicates.
8
16
  *
17
+ * An identifier may come as a bare string, matching any object of that identifier, or as a qualifier
18
+ * naming the object type as well, which the matched object then has to carry too.
19
+ *
9
20
  * @param postMessageData - input received via post message
10
21
  * @internal
11
22
  */
12
23
  export function convertPostMessageToDrillablePredicates({ uris, identifiers, composedFrom, }) {
13
24
  const simpleUris = Array.isArray(uris) ? uniq(uris) : [];
14
- const simpleIdentifiers = Array.isArray(identifiers) ? uniq(identifiers) : [];
25
+ const simpleIdentifiers = uniqueQualifiers(identifiers);
15
26
  const composedFromUris = composedFrom?.uris && Array.isArray(composedFrom.uris) ? uniq(composedFrom.uris) : [];
16
- const composedFromIdentifiers = composedFrom?.identifiers && Array.isArray(composedFrom.identifiers)
17
- ? uniq(composedFrom.identifiers)
18
- : [];
27
+ const composedFromIdentifiers = uniqueQualifiers(composedFrom?.identifiers);
19
28
  // note: not passing factory function to maps to make testing assertions simpler (passing factory fun-as-is
20
29
  // will call the factory with 3 args (value, index and all values)
21
30
  return [
22
31
  ...simpleUris.map((uri) => HeaderPredicates.uriMatch(uri)),
23
- ...simpleIdentifiers.map((identifier) => HeaderPredicates.identifierMatch(identifier)),
32
+ ...simpleIdentifiers.map(({ identifier, type }) => HeaderPredicates.identifierMatch(identifier, type)),
24
33
  ...composedFromUris.map((uri) => HeaderPredicates.composedFromUri(uri)),
25
- ...composedFromIdentifiers.map((identifier) => HeaderPredicates.composedFromIdentifier(identifier)),
34
+ ...composedFromIdentifiers.map(({ identifier, type }) => HeaderPredicates.composedFromIdentifier(identifier, type)),
26
35
  ];
27
36
  }
28
37
  export const DrillablePredicatesUtils = {
@@ -1 +1 @@
1
- {"version":3,"file":"dateFilterNaming.d.ts","sourceRoot":"","sources":["../../../src/notificationsPanel/data/dateFilterNaming.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,EAGH,KAAK,WAAW,EAKnB,MAAM,qBAAqB,CAAC;AAa7B,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CA4CpG"}
1
+ {"version":3,"file":"dateFilterNaming.d.ts","sourceRoot":"","sources":["../../../src/notificationsPanel/data/dateFilterNaming.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,EAGH,KAAK,WAAW,EAKnB,MAAM,qBAAqB,CAAC;AAa7B,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAoDpG"}
@@ -7,6 +7,14 @@ export function translateDateFilter(intl, filter, dateFormat) {
7
7
  // - Special case for "All time" with excluded empty values.
8
8
  // - For included empty values, decorate the base representation.
9
9
  // - For "only" empty values, use the dedicated title.
10
+ //
11
+ // Week granularity is the one deliberate divergence: `getDateFilterTitleUsingTranslator` renders an
12
+ // absolute week filter as "Week 15/2026 - Week 17/2026", which needs both the filter's granularity and
13
+ // the workspace week start. The AFM shape carries no granularity at all today, and the week start is a
14
+ // workspace setting this function cannot reach either, so an absolute week filter is spelled out here
15
+ // as the plain day range it resolves to. MC-5254 gives the absolute AFM filter an optional granularity;
16
+ // even then the missing week start keeps this branch on the day range, which is exactly what
17
+ // `getDateFilterTitleUsingTranslator` itself falls back to when no week start reaches it.
10
18
  if (metadata.type === "relative" &&
11
19
  metadata.granularity === "ALL_TIME_GRANULARITY" &&
12
20
  metadata.emptyValueHandling === "exclude") {
@@ -22,12 +22,15 @@ import { Dispatch } from 'react';
22
22
  import { EmbedType } from '@gooddata/sdk-ui-kit';
23
23
  import { ExplicitDrill } from '@gooddata/sdk-ui';
24
24
  import { GeneralAccessValue } from '@gooddata/sdk-ui-kit';
25
+ import { GeoTableConversionOptions } from '@gooddata/sdk-ui';
25
26
  import { GoodDataSdkError } from '@gooddata/sdk-ui';
26
27
  import { IAlertComparisonOperator } from '@gooddata/sdk-model';
27
28
  import { IAlertRelativeArithmeticOperator } from '@gooddata/sdk-model';
28
29
  import { IAlertRelativeOperator } from '@gooddata/sdk-model';
29
30
  import { IAnalyticalBackend } from '@gooddata/sdk-backend-spi';
31
+ import { IAttributeWithReferences } from '@gooddata/sdk-backend-spi';
30
32
  import { IAutomationMetadataObject } from '@gooddata/sdk-model';
33
+ import { ICatalogAttribute } from '@gooddata/sdk-model';
31
34
  import { ICatalogAttributeHierarchy } from '@gooddata/sdk-model';
32
35
  import { IChartConfig } from '@gooddata/sdk-ui-charts';
33
36
  import { IColorPalette } from '@gooddata/sdk-model';
@@ -238,6 +241,16 @@ export declare type AutomationsScope = "workspace" | "organization";
238
241
  */
239
242
  export declare type AutomationsType = Extract<AutomationType, "alert" | "schedule">;
240
243
 
244
+ /**
245
+ * Determines if a visualization type can be converted to table format.
246
+ * This is used for accessibility and export purposes, separate from UI controls.
247
+ *
248
+ * @param insightType - The visualization type to check
249
+ * @returns true if the visualization can be converted to table format
250
+ * @internal
251
+ */
252
+ export declare function canConvertToTable(insightType?: string): boolean;
253
+
241
254
  export { ChartInlineVisualizationType }
242
255
 
243
256
  /**
@@ -296,6 +309,26 @@ export declare type ConditionalFormattingDialogSubmitIntent = {
296
309
  rule: IConditionalFormattingRule;
297
310
  };
298
311
 
312
+ /**
313
+ * Converts an insight to layered table definitions.
314
+ *
315
+ * @remarks
316
+ * Currently supports geo insights only and is gated by `enableGeoChartA11yImprovements`.
317
+ *
318
+ * @internal
319
+ */
320
+ export declare function convertInsightToLayerTables(insight: IInsight, options: ILayerTableConversionOptions): ILayerTableDefinition[] | undefined;
321
+
322
+ /**
323
+ * Converts any insight (except of type "table", "repeater", or "xirr") to a table insight definition.
324
+ * For table, repeater, or xirr insights, returns the original insight.
325
+ *
326
+ * @param insight - The input insight to convert.
327
+ * @returns IInsight with table visualization or the original insight if conversion is not supported.
328
+ * @internal
329
+ */
330
+ export declare function convertInsightToTableDefinition(insight: IInsight, options?: GeoTableConversionOptions): IInsight;
331
+
299
332
  /**
300
333
  * @internal
301
334
  */
@@ -464,6 +497,13 @@ export declare const getComparisonOperatorTitle: (operator: IAlertComparisonOper
464
497
  */
465
498
  export declare function getEffectiveConditionalFormatting(insight: IInsightDefinition, settings: ISettings | undefined, configOverride?: IConditionalFormatting): IConditionalFormatting | undefined;
466
499
 
500
+ /**
501
+ * The display form each geo attribute is read through when the insight states none of its own.
502
+ *
503
+ * @internal
504
+ */
505
+ export declare function getGeoTableDisplayFormRefs(insight: IInsight, settings: ISettings | undefined, catalogAttributes: ICatalogAttribute[], preloadedAttributesWithReferences?: IAttributeWithReferences[]): Map<string, ObjRef> | undefined;
506
+
467
507
  /**
468
508
  * @internal
469
509
  */
@@ -1081,6 +1121,33 @@ export declare interface IInsightViewProps extends Partial<IVisualizationCallbac
1081
1121
  TitleComponent?: ComponentType<IInsightTitleProps>;
1082
1122
  }
1083
1123
 
1124
+ /**
1125
+ * Options steering how a multi-layer geo insight is turned into per-layer tables.
1126
+ *
1127
+ * @internal
1128
+ */
1129
+ export declare interface ILayerTableConversionOptions {
1130
+ settings?: ISettings;
1131
+ catalogAttributes?: ICatalogAttribute[];
1132
+ preloadedAttributesWithReferences?: IAttributeWithReferences[];
1133
+ }
1134
+
1135
+ /**
1136
+ * Defines a single layer's table conversion result for multi-layer geo charts.
1137
+ *
1138
+ * @alpha
1139
+ */
1140
+ export declare interface ILayerTableDefinition {
1141
+ /** Stable id — "root" for root layer, layer.id for additional layers */
1142
+ layerId: string;
1143
+ /** Human-readable name for the tab label */
1144
+ layerName: string;
1145
+ /** Normalized layer type */
1146
+ layerType: string;
1147
+ /** Converted table insight for this layer */
1148
+ tableInsight: IInsight;
1149
+ }
1150
+
1084
1151
  /**
1085
1152
  * Layout descriptor.
1086
1153
  * Provides parameters of used layout.
@@ -2265,6 +2332,16 @@ export declare function summaryOtherGranteeCount(summary: IObjectAccessSummary):
2265
2332
  */
2266
2333
  export declare function summaryToShareLevel(summary: IObjectAccessSummary): ObjectShareLevel;
2267
2334
 
2335
+ /**
2336
+ * Determines if a visualization type supports the "Show as Table" UI button.
2337
+ * This controls whether users can manually toggle table view in the UI.
2338
+ *
2339
+ * @param insightType - The visualization type to check
2340
+ * @returns true if the visualization supports the Show as Table UI feature
2341
+ * @internal
2342
+ */
2343
+ export declare function supportsShowAsTable(insightType?: string): boolean;
2344
+
2268
2345
  /**
2269
2346
  * @internal
2270
2347
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gooddata/sdk-ui-ext",
3
- "version": "11.58.0-alpha.1",
3
+ "version": "11.58.0-alpha.3",
4
4
  "description": "GoodData.UI SDK - Extensions",
5
5
  "license": "LicenseRef-LICENSE",
6
6
  "author": "GoodData Corporation",
@@ -63,20 +63,20 @@
63
63
  "ts-invariant": "0.10.3",
64
64
  "tslib": "2.8.1",
65
65
  "uuid": "11.1.1",
66
- "@gooddata/sdk-backend-base": "11.58.0-alpha.1",
67
- "@gooddata/sdk-backend-spi": "11.58.0-alpha.1",
68
- "@gooddata/sdk-embedding": "11.58.0-alpha.1",
69
- "@gooddata/sdk-ui": "11.58.0-alpha.1",
70
- "@gooddata/sdk-model": "11.58.0-alpha.1",
71
- "@gooddata/sdk-ui-charts": "11.58.0-alpha.1",
72
- "@gooddata/sdk-ui-filters": "11.58.0-alpha.1",
73
- "@gooddata/sdk-ui-geo": "11.58.0-alpha.1",
74
- "@gooddata/sdk-ui-pivot": "11.58.0-alpha.1",
75
- "@gooddata/sdk-ui-kit": "11.58.0-alpha.1",
76
- "@gooddata/sdk-ui-semantic-search": "11.58.0-alpha.1",
77
- "@gooddata/sdk-ui-vis-commons": "11.58.0-alpha.1",
78
- "@gooddata/sdk-ui-theme-provider": "11.58.0-alpha.1",
79
- "@gooddata/util": "11.58.0-alpha.1"
66
+ "@gooddata/sdk-backend-base": "11.58.0-alpha.3",
67
+ "@gooddata/sdk-backend-spi": "11.58.0-alpha.3",
68
+ "@gooddata/sdk-ui": "11.58.0-alpha.3",
69
+ "@gooddata/sdk-model": "11.58.0-alpha.3",
70
+ "@gooddata/sdk-embedding": "11.58.0-alpha.3",
71
+ "@gooddata/sdk-ui-charts": "11.58.0-alpha.3",
72
+ "@gooddata/sdk-ui-filters": "11.58.0-alpha.3",
73
+ "@gooddata/sdk-ui-kit": "11.58.0-alpha.3",
74
+ "@gooddata/sdk-ui-pivot": "11.58.0-alpha.3",
75
+ "@gooddata/sdk-ui-geo": "11.58.0-alpha.3",
76
+ "@gooddata/sdk-ui-semantic-search": "11.58.0-alpha.3",
77
+ "@gooddata/sdk-ui-theme-provider": "11.58.0-alpha.3",
78
+ "@gooddata/sdk-ui-vis-commons": "11.58.0-alpha.3",
79
+ "@gooddata/util": "11.58.0-alpha.3"
80
80
  },
81
81
  "devDependencies": {
82
82
  "@microsoft/api-documenter": "7.30.10",
@@ -116,16 +116,16 @@
116
116
  "react-dom": "19.1.1",
117
117
  "sass": "1.104.1",
118
118
  "stylelint": "16.26.1",
119
- "svgo": "2.8.3",
119
+ "svgo": "2.8.4",
120
120
  "typescript": "7.0.2",
121
- "vitest": "4.1.8",
121
+ "vitest": "4.1.11",
122
122
  "vitest-dom": "0.1.1",
123
- "@gooddata/eslint-config": "11.58.0-alpha.1",
124
- "@gooddata/oxlint-config": "11.58.0-alpha.1",
125
- "@gooddata/i18n-toolkit": "11.58.0-alpha.1",
126
- "@gooddata/reference-workspace": "11.58.0-alpha.1",
127
- "@gooddata/sdk-backend-mockingbird": "11.58.0-alpha.1",
128
- "@gooddata/stylelint-config": "11.58.0-alpha.1"
123
+ "@gooddata/eslint-config": "11.58.0-alpha.3",
124
+ "@gooddata/i18n-toolkit": "11.58.0-alpha.3",
125
+ "@gooddata/oxlint-config": "11.58.0-alpha.3",
126
+ "@gooddata/reference-workspace": "11.58.0-alpha.3",
127
+ "@gooddata/sdk-backend-mockingbird": "11.58.0-alpha.3",
128
+ "@gooddata/stylelint-config": "11.58.0-alpha.3"
129
129
  },
130
130
  "peerDependencies": {
131
131
  "react": "^18.0.0 || ^19.0.0",