diff --git a/NOTICE b/NOTICE index 2f2780b900e..1c8c4e5143b 100644 --- a/NOTICE +++ b/NOTICE @@ -7,9 +7,9 @@ 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. -Date generated: 2026-5-4 +Date generated: 2026-5-12 -Revision ID: 0c39c460e837a54efedde9d37131feb930e4b8a1 +Revision ID: 52d6a5f81cbc391c8c918fe465fad2be3e3de86f ================================================================================ ================================================================================ @@ -376,7 +376,7 @@ Revision ID: 0c39c460e837a54efedde9d37131feb930e4b8a1 - bail (2.0.2) [MIT] - balanced-match (2.0.0) [MIT] - base64-js (1.5.1) [MIT] -- baseline-browser-mapping (2.10.27) [Apache-2.0] +- baseline-browser-mapping (2.10.29) [Apache-2.0] - batch (0.6.1) [MIT] - binary-extensions (2.3.0) [MIT] - bl (4.1.0) [MIT] @@ -710,7 +710,7 @@ Revision ID: 0c39c460e837a54efedde9d37131feb930e4b8a1 - magic-string (0.30.21) [MIT] - make-dir (2.1.0) [MIT] - mapbox-gl (2.15.0) [BSD-3-Clause, MIT] -- maplibre-gl (4.7.1) [MIT, BSD-3-Clause, ISC, 0BSD] +- maplibre-gl (4.7.1) [MIT, BSD-3-Clause, 0BSD, ISC] - markdown-table (3.0.4) [MIT] - matchmediaquery (0.4.2) [MIT] - math-intrinsics (1.1.0) [MIT] @@ -5367,9 +5367,9 @@ MIT -------------------------------------------------------------------------------- -Package Title: baseline-browser-mapping (2.10.27) +Package Title: baseline-browser-mapping (2.10.29) -Package Locator: npm+baseline-browser-mapping$2.10.27 +Package Locator: npm+baseline-browser-mapping$2.10.29 Package Depth: Transitive -------------------------------------------------------------------------------- @@ -9407,7 +9407,7 @@ MIT, BSD-3-Clause * Other Licenses * -ISC, 0BSD +0BSD, ISC -------------------------------------------------------------------------------- @@ -38277,4 +38277,4 @@ POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -Report Generated by FOSSA on 2026-5-4 +Report Generated by FOSSA on 2026-5-12 diff --git a/common/changes/@gooddata/sdk-ui-all/JSVA-F1-2483-move-parameters-per-tab_2026-05-07-10-07.json b/common/changes/@gooddata/sdk-ui-all/JSVA-F1-2483-move-parameters-per-tab_2026-05-07-10-07.json new file mode 100644 index 00000000000..17f4a684c92 --- /dev/null +++ b/common/changes/@gooddata/sdk-ui-all/JSVA-F1-2483-move-parameters-per-tab_2026-05-07-10-07.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "comment": "sdk-model: Add per-tab `IDashboardTab.parameters`; deprecate root `IDashboard.parameters`", + "type": "none", + "packageName": "@gooddata/sdk-ui-all" + } + ], + "packageName": "@gooddata/sdk-ui-all" +} diff --git a/common/changes/@gooddata/sdk-ui-all/JSVA-F1-2483-move-parameters-per-tab_2026-05-07-10-35.json b/common/changes/@gooddata/sdk-ui-all/JSVA-F1-2483-move-parameters-per-tab_2026-05-07-10-35.json new file mode 100644 index 00000000000..678a780fcc7 --- /dev/null +++ b/common/changes/@gooddata/sdk-ui-all/JSVA-F1-2483-move-parameters-per-tab_2026-05-07-10-35.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "comment": "api-client-tiger: Add `ITigerDashboardTab.parameters`", + "type": "none", + "packageName": "@gooddata/sdk-ui-all" + } + ], + "packageName": "@gooddata/sdk-ui-all" +} diff --git a/common/changes/@gooddata/sdk-ui-all/JSVA-F1-2483-move-parameters-per-tab_2026-05-07-11-29.json b/common/changes/@gooddata/sdk-ui-all/JSVA-F1-2483-move-parameters-per-tab_2026-05-07-11-29.json new file mode 100644 index 00000000000..906c3be0b22 --- /dev/null +++ b/common/changes/@gooddata/sdk-ui-all/JSVA-F1-2483-move-parameters-per-tab_2026-05-07-11-29.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "comment": "sdk-backend-tiger: Read/write per-tab `parameters`; V1 root fallback only when no tab declares any", + "type": "none", + "packageName": "@gooddata/sdk-ui-all" + } + ], + "packageName": "@gooddata/sdk-ui-all" +} diff --git a/common/changes/@gooddata/sdk-ui-all/MPAV-LX-2173-delete-filter-context-after-dashboard-tab-deletion.json b/common/changes/@gooddata/sdk-ui-all/MPAV-LX-2173-delete-filter-context-after-dashboard-tab-deletion.json new file mode 100644 index 00000000000..31d0c5dbdb2 --- /dev/null +++ b/common/changes/@gooddata/sdk-ui-all/MPAV-LX-2173-delete-filter-context-after-dashboard-tab-deletion.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@gooddata/sdk-ui-all", + "comment": "sdk-backend-tiger: Prevented creating new orphaned filter contexts on FE.", + "type": "none" + } + ], + "packageName": "@gooddata/sdk-ui-all" +} diff --git a/common/changes/@gooddata/sdk-ui-all/SHA_master_2026-05-12-09-43.json b/common/changes/@gooddata/sdk-ui-all/SHA_master_2026-05-12-09-43.json new file mode 100644 index 00000000000..6d2b0202a0c --- /dev/null +++ b/common/changes/@gooddata/sdk-ui-all/SHA_master_2026-05-12-09-43.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@gooddata/sdk-ui-all", + "comment": "sdk-ui-gen-ai: implement conversation drag and drop using native browser DnD across pinned and rest sections", + "type": "none" + } + ], + "packageName": "@gooddata/sdk-ui-all" +} diff --git a/common/changes/@gooddata/sdk-ui-all/SHA_master_2026-05-12-12-47.json b/common/changes/@gooddata/sdk-ui-all/SHA_master_2026-05-12-12-47.json new file mode 100644 index 00000000000..01cbf739e87 --- /dev/null +++ b/common/changes/@gooddata/sdk-ui-all/SHA_master_2026-05-12-12-47.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@gooddata/sdk-ui-all", + "comment": "sdk-ui-gen-ai: refactor drill state management by replacing useDrillState hook with DrillState component and integrating it into ConversationVisualizationContent", + "type": "none" + } + ], + "packageName": "@gooddata/sdk-ui-all" +} diff --git a/common/changes/@gooddata/sdk-ui-all/pdo-gdai-1732-llm-link-shell-app_2026-05-12-08-00.json b/common/changes/@gooddata/sdk-ui-all/pdo-gdai-1732-llm-link-shell-app_2026-05-12-08-00.json new file mode 100644 index 00000000000..2fdd41cb6a6 --- /dev/null +++ b/common/changes/@gooddata/sdk-ui-all/pdo-gdai-1732-llm-link-shell-app_2026-05-12-08-00.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@gooddata/sdk-ui-all", + "comment": "sdk-ui-gen-ai: build shell-host setting URLs in the AI chat when enableShellApplication is on, so the \"Change LLM model\" link lands on /organization/settings/workspaces/{id}/configuration with the #/ai/change-llm-model deep-link intact", + "type": "none" + } + ], + "packageName": "@gooddata/sdk-ui-all" +} diff --git a/common/changes/@gooddata/sdk-ui-all/pdo-lx-2351-move-spi-types-to-model_2026-05-12-11-44.json b/common/changes/@gooddata/sdk-ui-all/pdo-lx-2351-move-spi-types-to-model_2026-05-12-11-44.json new file mode 100644 index 00000000000..bf9ecbc86a6 --- /dev/null +++ b/common/changes/@gooddata/sdk-ui-all/pdo-lx-2351-move-spi-types-to-model_2026-05-12-11-44.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@gooddata/sdk-ui-all", + "comment": "sdk-model, spi-backend-spi: move ISettings related types from spi to model", + "type": "none" + } + ], + "packageName": "@gooddata/sdk-ui-all" +} diff --git a/common/config/rush/.pnpmfile.cjs b/common/config/rush/.pnpmfile.cjs index 8725da6f96d..b2163c1ec4b 100644 --- a/common/config/rush/.pnpmfile.cjs +++ b/common/config/rush/.pnpmfile.cjs @@ -3,7 +3,7 @@ "use strict"; // baseline-browser-mapping needs to be updated to the latest version every 14 days -const baselineBrowserMappingVersion = "2.10.27"; +const baselineBrowserMappingVersion = "2.10.29"; // browserslist needs to be updated every 6 months const browserslistVersion = "4.28.2"; diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 6b799da641a..c3cb3fad5a4 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -3063,9 +3063,6 @@ importers: ../../libs/sdk-pluggable-application-model: dependencies: - '@gooddata/sdk-backend-spi': - specifier: workspace:* - version: link:../sdk-backend-spi '@gooddata/sdk-model': specifier: workspace:* version: link:../sdk-model @@ -14545,8 +14542,8 @@ packages: /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - /baseline-browser-mapping@2.10.27: - resolution: {integrity: sha512-zEs/ufmZoUd7WftKpKyXaT6RFxpQ5Qm9xytKRHvJfxFV9DFJkZph9RvJ1LcOUi0Z1ZVijMte65JbILeV+8QQEA==} + /baseline-browser-mapping@2.10.29: + resolution: {integrity: sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ==} engines: {node: '>=6.0.0'} hasBin: true @@ -14626,7 +14623,7 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - baseline-browser-mapping: 2.10.27 + baseline-browser-mapping: 2.10.29 caniuse-lite: 1.0.30001787 electron-to-chromium: 1.5.334 node-releases: 2.0.37 diff --git a/common/config/rush/version-policies.json b/common/config/rush/version-policies.json index 362f47a7325..6fcdb69563a 100644 --- a/common/config/rush/version-policies.json +++ b/common/config/rush/version-policies.json @@ -12,14 +12,14 @@ { "definitionName": "lockStepVersion", "policyName": "sdk", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "nextBump": "prerelease", "mainProject": "@gooddata/sdk-ui-all" }, { "definitionName": "lockStepVersion", "policyName": "sdk-examples", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "nextBump": "prerelease", "mainProject": "@gooddata/sdk-ui-all" } diff --git a/examples/sdk-interactive-examples/examples-template/package.json b/examples/sdk-interactive-examples/examples-template/package.json index 27d1273089f..dfed4df447d 100644 --- a/examples/sdk-interactive-examples/examples-template/package.json +++ b/examples/sdk-interactive-examples/examples-template/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-interactive-examples-template", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "private": false, "description": "GoodData interactive example template", "license": "LicenseRef-LICENSE", diff --git a/examples/sdk-interactive-examples/examples/example-attributefilter/package.json b/examples/sdk-interactive-examples/examples/example-attributefilter/package.json index ce7b65b0d22..9d3873a5d12 100644 --- a/examples/sdk-interactive-examples/examples/example-attributefilter/package.json +++ b/examples/sdk-interactive-examples/examples/example-attributefilter/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-interactive-example-attributefilter", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "private": false, "description": "This example demonstrates how to use the AttributeFilter component to filter data in a visualization.", "license": "LicenseRef-LICENSE", diff --git a/examples/sdk-interactive-examples/examples/example-chartconfig/package.json b/examples/sdk-interactive-examples/examples/example-chartconfig/package.json index 0aa611f8cb8..32c6eea2a00 100644 --- a/examples/sdk-interactive-examples/examples/example-chartconfig/package.json +++ b/examples/sdk-interactive-examples/examples/example-chartconfig/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-interactive-example-chartconfig", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "private": false, "description": "This interactive example demonstrates how to manipulate the chart config.", "license": "LicenseRef-LICENSE", diff --git a/examples/sdk-interactive-examples/examples/example-columnchart/package.json b/examples/sdk-interactive-examples/examples/example-columnchart/package.json index 9b1f1c6071c..338c324154e 100644 --- a/examples/sdk-interactive-examples/examples/example-columnchart/package.json +++ b/examples/sdk-interactive-examples/examples/example-columnchart/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-interactive-example-columnchart", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "private": false, "description": "This example demonstrates the usage of the ColumnChart component with the viewBy and stackBy properties.", "license": "LicenseRef-LICENSE", diff --git a/examples/sdk-interactive-examples/examples/example-combochart/package.json b/examples/sdk-interactive-examples/examples/example-combochart/package.json index ce9368dd7b7..11efa2d3d80 100644 --- a/examples/sdk-interactive-examples/examples/example-combochart/package.json +++ b/examples/sdk-interactive-examples/examples/example-combochart/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-interactive-example-combochart", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "private": false, "description": "Example demonstrates ComboChart secondaryMeasures definition. ", "license": "LicenseRef-LICENSE", diff --git a/examples/sdk-interactive-examples/examples/example-dashboard/package.json b/examples/sdk-interactive-examples/examples/example-dashboard/package.json index eb3e68f8047..bcec164f05d 100644 --- a/examples/sdk-interactive-examples/examples/example-dashboard/package.json +++ b/examples/sdk-interactive-examples/examples/example-dashboard/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-interactive-example-dashboard", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "private": false, "description": "This example shows how to use the Dashboard component.", "license": "LicenseRef-LICENSE", diff --git a/examples/sdk-interactive-examples/examples/example-datefilter/package.json b/examples/sdk-interactive-examples/examples/example-datefilter/package.json index 705cf23ce31..0e1b08b30cc 100644 --- a/examples/sdk-interactive-examples/examples/example-datefilter/package.json +++ b/examples/sdk-interactive-examples/examples/example-datefilter/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-interactive-example-datefilter", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "private": false, "description": "Example demonstrates usage of Date Filter component.", "license": "LicenseRef-LICENSE", diff --git a/examples/sdk-interactive-examples/examples/example-dependentfilters/package.json b/examples/sdk-interactive-examples/examples/example-dependentfilters/package.json index 9f254c70bfa..b3bf54a7b46 100644 --- a/examples/sdk-interactive-examples/examples/example-dependentfilters/package.json +++ b/examples/sdk-interactive-examples/examples/example-dependentfilters/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-interactive-example-dependentfilters", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "private": false, "description": "This example demonstrates how to use multiple attribute filters linked together to filter data in a visualization.", "license": "LicenseRef-LICENSE", diff --git a/examples/sdk-interactive-examples/examples/example-execute/package.json b/examples/sdk-interactive-examples/examples/example-execute/package.json index 02dd67f95d6..65db2090836 100644 --- a/examples/sdk-interactive-examples/examples/example-execute/package.json +++ b/examples/sdk-interactive-examples/examples/example-execute/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-interactive-example-execute", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "private": false, "description": "This example demonstrates using Execute component and build custom visualization.", "license": "LicenseRef-LICENSE", diff --git a/examples/sdk-interactive-examples/examples/example-granularity/package.json b/examples/sdk-interactive-examples/examples/example-granularity/package.json index 48ca4be58e7..b70ec2c89e9 100644 --- a/examples/sdk-interactive-examples/examples/example-granularity/package.json +++ b/examples/sdk-interactive-examples/examples/example-granularity/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-interactive-example-granularity", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "private": false, "description": "This example exmplains DateFilter granularity ", "license": "LicenseRef-LICENSE", diff --git a/examples/sdk-interactive-examples/examples/example-headline/package.json b/examples/sdk-interactive-examples/examples/example-headline/package.json index 5be04920f83..0d5e8fc48e0 100644 --- a/examples/sdk-interactive-examples/examples/example-headline/package.json +++ b/examples/sdk-interactive-examples/examples/example-headline/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-interactive-example-headline", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "private": false, "description": "This example shows how to use the Headline component.", "license": "LicenseRef-LICENSE", diff --git a/examples/sdk-interactive-examples/examples/example-pivottable/package.json b/examples/sdk-interactive-examples/examples/example-pivottable/package.json index b60790f610d..365f0c3d546 100644 --- a/examples/sdk-interactive-examples/examples/example-pivottable/package.json +++ b/examples/sdk-interactive-examples/examples/example-pivottable/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-interactive-example-pivottable", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "private": false, "description": "Basic PivotTable manipulation.", "license": "LicenseRef-LICENSE", diff --git a/examples/sdk-interactive-examples/examples/example-relativedatefilter/package.json b/examples/sdk-interactive-examples/examples/example-relativedatefilter/package.json index 4b511b2afe4..f0fd8f6d78d 100644 --- a/examples/sdk-interactive-examples/examples/example-relativedatefilter/package.json +++ b/examples/sdk-interactive-examples/examples/example-relativedatefilter/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-interactive-example-relativedatefilter", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "private": false, "description": "Example demonstrates how to set relative DateFilter for visualization.", "license": "LicenseRef-LICENSE", diff --git a/examples/sdk-interactive-examples/examples/example-repeater/package.json b/examples/sdk-interactive-examples/examples/example-repeater/package.json index 61512b54b26..292e8bfc98a 100644 --- a/examples/sdk-interactive-examples/examples/example-repeater/package.json +++ b/examples/sdk-interactive-examples/examples/example-repeater/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-interactive-example-repeater", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "private": false, "description": "This example demonstrates how to use Repeater component.", "license": "LicenseRef-LICENSE", diff --git a/examples/sdk-interactive-examples/package.json b/examples/sdk-interactive-examples/package.json index ec2324ab678..c3e999b67c4 100644 --- a/examples/sdk-interactive-examples/package.json +++ b/examples/sdk-interactive-examples/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-interactive-examples", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "private": false, "description": "GoodData React interactive examples", "license": "LicenseRef-LICENSE", diff --git a/libs/api-client-tiger/api-extractor.json b/libs/api-client-tiger/api-extractor.json index 607428ee17f..1088f274838 100644 --- a/libs/api-client-tiger/api-extractor.json +++ b/libs/api-client-tiger/api-extractor.json @@ -108,22 +108,7 @@ "default": { "logLevel": "none" // "addToApiReportFile": false - }, - - // workaround for the false negative about - // > The symbol "AutomationAlertCondition_2" needs to be exported by the entry point index.d.ts - // remove this once the above error is not there anymore (bug in API extractor) - "ae-forgotten-export": { - "logLevel": "warning", - "addToApiReportFile": true } - - // "ae-extra-release-tag": { - // "logLevel": "warning", - // "addToApiReportFile": true - // }, - // - // . . . }, /** @@ -136,15 +121,7 @@ "tsdocMessageReporting": { "default": { "logLevel": "none" - // "addToApiReportFile": false } - - // "tsdoc-link-tag-unescaped-text": { - // "logLevel": "warning", - // "addToApiReportFile": true - // }, - // - // . . . } } } diff --git a/libs/api-client-tiger/api/api-client-tiger.api.md b/libs/api-client-tiger/api/api-client-tiger.api.md index 8f580443ae8..8ce7d1cbf73 100644 --- a/libs/api-client-tiger/api/api-client-tiger.api.md +++ b/libs/api-client-tiger/api/api-client-tiger.api.md @@ -51,10 +51,8 @@ export interface AbsoluteDateFilterAbsoluteDateFilter { // @public (undocumented) export type AbsoluteDateFilterAbsoluteDateFilterEmptyValueHandlingEnum = 'INCLUDE' | 'EXCLUDE' | 'ONLY'; -// Warning: (ae-forgotten-export) The symbol "CompoundMeasureValueFilter_2" needs to be exported by the entry point index.d.ts -// // @public -export type AbstractMeasureValueFilter = AfmComparisonMeasureValueFilter | CompoundMeasureValueFilter_2 | AfmRangeMeasureValueFilter | AfmRankingFilter; +export type AbstractMeasureValueFilter = AfmComparisonMeasureValueFilter | AfmCompoundMeasureValueFilter | AfmRangeMeasureValueFilter | AfmRankingFilter; // @public export class ActionsApi extends MetadataBaseApi implements ActionsApiInterface { @@ -144,8 +142,6 @@ export function ActionsApi_InheritedEntityConflicts(axios: AxiosInstance, basePa // @public export function ActionsApi_InheritedEntityPrefixes(axios: AxiosInstance, basePath: string, requestParameters: ActionsApiInheritedEntityPrefixesRequest, options?: AxiosRequestConfig, configuration?: MetadataConfiguration): AxiosPromise>; -// Warning: (ae-forgotten-export) The symbol "ListLlmProviderModelsResponse" needs to be exported by the entry point index.d.ts -// // @public export function ActionsApi_ListLlmProviderModels(axios: AxiosInstance, basePath: string, requestParameters: ActionsApiListLlmProviderModelsRequest, options?: AxiosRequestConfig, configuration?: LabelElementsConfiguration): AxiosPromise; @@ -441,6 +437,24 @@ export interface ActionsApiCancelExecutionsRequest { readonly workspaceId: string; } +// @public +export interface ActionsApiCancelWorkflowRequest { + readonly runId: string; + readonly workspaceId: string; +} + +// @public +export interface ActionsApiChangeAnalysisRequest { + readonly changeAnalysisRequest: AfmChangeAnalysisRequest; + readonly workspaceId: string; +} + +// @public +export interface ActionsApiChangeAnalysisResultRequest { + readonly resultId: string; + readonly workspaceId: string; +} + // @public export interface ActionsApiCheckEntityOverridesRequest { readonly hierarchyObjectIdentification: Array; @@ -484,6 +498,14 @@ export interface ActionsApiComputeLabelElementsPostRequest { readonly workspaceId: string; } +// @public +export interface ActionsApiComputeReportForVisualizationObjectRequest { + readonly skipCache?: boolean; + readonly visualizationObjectExecution?: VisualizationObjectExecution; + readonly visualizationObjectId: string; + readonly workspaceId: string; +} + // @public export interface ActionsApiComputeReportRequest { readonly afmExecution: AfmExecution; @@ -504,6 +526,16 @@ export interface ActionsApiComputeValidObjectsRequest { readonly workspaceId: string; } +// @public +export interface ActionsApiConvertGeoFileRequest { + readonly convertGeoFileRequest: ConvertGeoFileRequest; +} + +// @public +export interface ActionsApiCustomGeoCollectionStagingUploadRequest { + readonly file: File; +} + // @public export interface ActionsApiDashboardPermissionsRequest { readonly dashboardId: string; @@ -550,12 +582,30 @@ export interface ActionsApiForecastResultRequest { readonly workspaceId: string; } +// @public +export interface ActionsApiGenerateDashboardSummaryRequest { + readonly workflowDashboardSummaryRequestDto: WorkflowDashboardSummaryRequestDto; + readonly workspaceId: string; +} + +// @public +export interface ActionsApiGenerateDescriptionRequest { + readonly generateDescriptionRequest: GenerateDescriptionRequest; + readonly workspaceId: string; +} + // @public export interface ActionsApiGenerateLogicalModelRequest { readonly dataSourceId: string; readonly generateLdmRequest: GenerateLdmRequest; } +// @public +export interface ActionsApiGenerateTitleRequest { + readonly generateTitleRequest: GenerateTitleRequest; + readonly workspaceId: string; +} + // @public export interface ActionsApiGetDataSourceSchemataRequest { readonly dataSourceId: string; @@ -584,12 +634,24 @@ export interface ActionsApiGetTranslationTagsRequest { readonly workspaceId: string; } +// @public +export interface ActionsApiGetWorkflowStatusRequest { + readonly runId: string; + readonly workspaceId: string; +} + // @public export interface ActionsApiImportCsvRequest { readonly dataSourceId: string; readonly importCsvRequest: ImportCsvRequest; } +// @public +export interface ActionsApiImportCustomGeoCollectionRequest { + readonly collectionId: string; + readonly importGeoCollectionRequest: ImportGeoCollectionRequest; +} + // @public export interface ActionsApiInheritedEntityConflictsRequest { readonly workspaceId: string; @@ -676,7 +738,6 @@ export interface ActionsApiListLlmProviderModelsByIdRequest { // @public export interface ActionsApiListLlmProviderModelsRequest { - // Warning: (ae-forgotten-export) The symbol "ListLlmProviderModelsRequest" needs to be exported by the entry point index.d.ts readonly listLlmProviderModelsRequest: ListLlmProviderModelsRequest; } @@ -725,6 +786,21 @@ export interface ActionsApiMetadataSyncRequest { readonly workspaceId: string; } +// @public +export interface ActionsApiOutlierDetectionRequest { + readonly outlierDetectionRequest: OutlierDetectionRequest; + readonly skipCache?: boolean; + readonly workspaceId: string; +} + +// @public +export interface ActionsApiOutlierDetectionResultRequest { + readonly limit?: number; + readonly offset?: number; + readonly resultId: string; + readonly workspaceId: string; +} + // @public export interface ActionsApiOverriddenChildEntitiesRequest { readonly workspaceId: string; @@ -772,6 +848,11 @@ export interface ActionsApiResolveLlmEndpointsRequest { readonly workspaceId: string; } +// @public +export interface ActionsApiResolveLlmProvidersRequest { + readonly workspaceId: string; +} + // @public export interface ActionsApiResolveRequestedEntitlementsRequest { readonly entitlementsRequest: EntitlementsRequest; @@ -789,6 +870,13 @@ export interface ActionsApiRetrieveExecutionMetadataRequest { readonly workspaceId: string; } +// @public +export interface ActionsApiRetrieveResultBinaryRequest { + readonly resultId: string; + readonly workspaceId: string; + readonly xGDCCANCELTOKEN?: string; +} + // @public export interface ActionsApiRetrieveResultRequest { readonly excludedTotalDimensions?: Array; @@ -817,6 +905,12 @@ export interface ActionsApiScanSqlRequest { readonly scanSqlRequest: ScanSqlRequest; } +// @public +export interface ActionsApiScanStatisticsRequest { + readonly dataSourceId: string; + readonly tableStatisticsRequest: TableStatisticsRequest; +} + // @public export interface ActionsApiSetCertificationRequest { readonly setCertificationRequest: SetCertificationRequest; @@ -850,6 +944,11 @@ export interface ActionsApiTestDataSourceRequest { readonly testRequest: TestRequest; } +// @public +export interface ActionsApiTrendingObjectsRequest { + readonly workspaceId: string; +} + // @public interface ActionsApiTriggerQualityIssuesCalculationRequest { readonly workspaceId: string; @@ -1228,8 +1327,7 @@ export interface AfmAbsoluteDateFilterAbsoluteDateFilter { 'applyOnResult'?: boolean; // (undocumented) 'dataset': AfmModelObjectIdentifierDataset; - // Warning: (ae-forgotten-export) The symbol "AbsoluteDateFilterAbsoluteDateFilterEmptyValueHandlingEnum_2" needs to be exported by the entry point index.d.ts - 'emptyValueHandling'?: AbsoluteDateFilterAbsoluteDateFilterEmptyValueHandlingEnum_2; + 'emptyValueHandling'?: AfmAbsoluteDateFilterAbsoluteDateFilterEmptyValueHandlingEnum; // (undocumented) 'from': string; // (undocumented) @@ -1238,6 +1336,9 @@ export interface AfmAbsoluteDateFilterAbsoluteDateFilter { 'to': string; } +// @public (undocumented) +export type AfmAbsoluteDateFilterAbsoluteDateFilterEmptyValueHandlingEnum = 'INCLUDE' | 'EXCLUDE' | 'ONLY'; + // @public export class AfmActionsApi extends LabelElementsBaseApi implements AfmActionsApiInterface { aiChat(requestParameters: ActionsApiAiChatRequest, options?: AxiosRequestConfig): AxiosPromise; @@ -1248,23 +1349,16 @@ export class AfmActionsApi extends LabelElementsBaseApi implements AfmActionsApi anomalyDetection(requestParameters: ActionsApiAnomalyDetectionRequest, options?: AxiosRequestConfig): AxiosPromise; anomalyDetectionResult(requestParameters: ActionsApiAnomalyDetectionResultRequest, options?: AxiosRequestConfig): AxiosPromise; cancelExecutions(requestParameters: ActionsApiCancelExecutionsRequest, options?: AxiosRequestConfig): AxiosPromise; - // Warning: (ae-forgotten-export) The symbol "ActionsApiCancelWorkflowRequest" needs to be exported by the entry point index.d.ts - // // (undocumented) cancelWorkflow(requestParameters: ActionsApiCancelWorkflowRequest, options?: AxiosRequestConfig): AxiosPromise<{ [key: string]: string; }>; - // Warning: (ae-forgotten-export) The symbol "ActionsApiChangeAnalysisRequest" needs to be exported by the entry point index.d.ts - // Warning: (ae-forgotten-export) The symbol "ChangeAnalysisResponse" needs to be exported by the entry point index.d.ts changeAnalysis(requestParameters: ActionsApiChangeAnalysisRequest, options?: AxiosRequestConfig): AxiosPromise; - // Warning: (ae-forgotten-export) The symbol "ActionsApiChangeAnalysisResultRequest" needs to be exported by the entry point index.d.ts - // Warning: (ae-forgotten-export) The symbol "ChangeAnalysisResult" needs to be exported by the entry point index.d.ts changeAnalysisResult(requestParameters: ActionsApiChangeAnalysisResultRequest, options?: AxiosRequestConfig): AxiosPromise; clustering(requestParameters: ActionsApiClusteringRequest, options?: AxiosRequestConfig): AxiosPromise; clusteringResult(requestParameters: ActionsApiClusteringResultRequest, options?: AxiosRequestConfig): AxiosPromise; computeLabelElementsPost(requestParameters: ActionsApiComputeLabelElementsPostRequest, options?: AxiosRequestConfig): AxiosPromise; computeReport(requestParameters: ActionsApiComputeReportRequest, options?: AxiosRequestConfig): AxiosPromise; - // Warning: (ae-forgotten-export) The symbol "ActionsApiComputeReportForVisualizationObjectRequest" needs to be exported by the entry point index.d.ts computeReportForVisualizationObject(requestParameters: ActionsApiComputeReportForVisualizationObjectRequest, options?: AxiosRequestConfig): AxiosPromise; computeValidDescendants(requestParameters: ActionsApiComputeValidDescendantsRequest, options?: AxiosRequestConfig): AxiosPromise; computeValidObjects(requestParameters: ActionsApiComputeValidObjectsRequest, options?: AxiosRequestConfig): AxiosPromise; @@ -1272,22 +1366,12 @@ export class AfmActionsApi extends LabelElementsBaseApi implements AfmActionsApi explainAFM(requestParameters: ActionsApiExplainAFMRequest, options?: AxiosRequestConfig): AxiosPromise; forecast(requestParameters: ActionsApiForecastRequest, options?: AxiosRequestConfig): AxiosPromise; forecastResult(requestParameters: ActionsApiForecastResultRequest, options?: AxiosRequestConfig): AxiosPromise; - // Warning: (ae-forgotten-export) The symbol "ActionsApiGenerateDashboardSummaryRequest" needs to be exported by the entry point index.d.ts - // Warning: (ae-forgotten-export) The symbol "WorkflowDashboardSummaryResponseDto" needs to be exported by the entry point index.d.ts - // // (undocumented) generateDashboardSummary(requestParameters: ActionsApiGenerateDashboardSummaryRequest, options?: AxiosRequestConfig): AxiosPromise; - // Warning: (ae-forgotten-export) The symbol "ActionsApiGenerateDescriptionRequest" needs to be exported by the entry point index.d.ts - // Warning: (ae-forgotten-export) The symbol "GenerateDescriptionResponse" needs to be exported by the entry point index.d.ts generateDescription(requestParameters: ActionsApiGenerateDescriptionRequest, options?: AxiosRequestConfig): AxiosPromise; - // Warning: (ae-forgotten-export) The symbol "ActionsApiGenerateTitleRequest" needs to be exported by the entry point index.d.ts - // Warning: (ae-forgotten-export) The symbol "GenerateTitleResponse" needs to be exported by the entry point index.d.ts generateTitle(requestParameters: ActionsApiGenerateTitleRequest, options?: AxiosRequestConfig): AxiosPromise; getQualityIssues(requestParameters: ActionsApiGetQualityIssuesRequest, options?: AxiosRequestConfig): AxiosPromise; getQualityIssuesCalculationStatus(requestParameters: AfmActionsApiGetQualityIssuesCalculationStatusRequest, options?: AxiosRequestConfig): AxiosPromise; - // Warning: (ae-forgotten-export) The symbol "ActionsApiGetWorkflowStatusRequest" needs to be exported by the entry point index.d.ts - // Warning: (ae-forgotten-export) The symbol "WorkflowStatusResponseDto" needs to be exported by the entry point index.d.ts - // // (undocumented) getWorkflowStatus(requestParameters: ActionsApiGetWorkflowStatusRequest, options?: AxiosRequestConfig): AxiosPromise; keyDriverAnalysis(requestParameters: ActionsApiKeyDriverAnalysisRequest, options?: AxiosRequestConfig): AxiosPromise; @@ -1295,27 +1379,17 @@ export class AfmActionsApi extends LabelElementsBaseApi implements AfmActionsApi listLlmProviderModels(requestParameters: ActionsApiListLlmProviderModelsRequest, options?: AxiosRequestConfig): AxiosPromise; listLlmProviderModelsById(requestParameters: ActionsApiListLlmProviderModelsByIdRequest, options?: AxiosRequestConfig): AxiosPromise; memoryCreatedByUsers(requestParameters: GenAiApiMemoryCreatedByUsersRequest, options?: AxiosRequestConfig): AxiosPromise; - // Warning: (ae-forgotten-export) The symbol "ActionsApiOutlierDetectionRequest" needs to be exported by the entry point index.d.ts - // Warning: (ae-forgotten-export) The symbol "OutlierDetectionResponse" needs to be exported by the entry point index.d.ts outlierDetection(requestParameters: ActionsApiOutlierDetectionRequest, options?: AxiosRequestConfig): AxiosPromise; - // Warning: (ae-forgotten-export) The symbol "ActionsApiOutlierDetectionResultRequest" needs to be exported by the entry point index.d.ts - // Warning: (ae-forgotten-export) The symbol "OutlierDetectionResult" needs to be exported by the entry point index.d.ts outlierDetectionResult(requestParameters: ActionsApiOutlierDetectionResultRequest, options?: AxiosRequestConfig): AxiosPromise; // @deprecated resolveLlmEndpoints(requestParameters: ActionsApiResolveLlmEndpointsRequest, options?: AxiosRequestConfig): AxiosPromise; - // Warning: (ae-forgotten-export) The symbol "ActionsApiResolveLlmProvidersRequest" needs to be exported by the entry point index.d.ts - // Warning: (ae-forgotten-export) The symbol "ResolvedLlms" needs to be exported by the entry point index.d.ts resolveLlmProviders(requestParameters: ActionsApiResolveLlmProvidersRequest, options?: AxiosRequestConfig): AxiosPromise; retrieveExecutionMetadata(requestParameters: ActionsApiRetrieveExecutionMetadataRequest, options?: AxiosRequestConfig): AxiosPromise; retrieveResult(requestParameters: ActionsApiRetrieveResultRequest, options?: AxiosRequestConfig): AxiosPromise; - // Warning: (ae-forgotten-export) The symbol "ActionsApiRetrieveResultBinaryRequest" needs to be exported by the entry point index.d.ts retrieveResultBinary(requestParameters: ActionsApiRetrieveResultBinaryRequest, options?: AxiosRequestConfig): AxiosPromise; tags(requestParameters: GenAiApiTagsRequest, options?: AxiosRequestConfig): AxiosPromise; - // Warning: (ae-forgotten-export) The symbol "TestLlmProviderResponse" needs to be exported by the entry point index.d.ts testLlmProvider(requestParameters: GenAiApiTestLlmProviderRequest, options?: AxiosRequestConfig): AxiosPromise; testLlmProviderById(requestParameters: GenAiApiTestLlmProviderByIdRequest, options?: AxiosRequestConfig): AxiosPromise; - // Warning: (ae-forgotten-export) The symbol "ActionsApiTrendingObjectsRequest" needs to be exported by the entry point index.d.ts - // Warning: (ae-forgotten-export) The symbol "TrendingObjectsResult" needs to be exported by the entry point index.d.ts trendingObjects(requestParameters: ActionsApiTrendingObjectsRequest, options?: AxiosRequestConfig): AxiosPromise; triggerQualityIssuesCalculation(requestParameters: ActionsApiTriggerQualityIssuesCalculationRequest, options?: AxiosRequestConfig): AxiosPromise; // @deprecated @@ -1389,6 +1463,47 @@ export interface AfmActionsApiInterface { validateLLMEndpointById(requestParameters: ActionsApiValidateLLMEndpointByIdRequest, options?: AxiosRequestConfig): AxiosPromise; } +// @public +export interface AfmAfmObjectIdentifierParameter { + // (undocumented) + 'identifier': AfmAfmObjectIdentifierParameterIdentifier; +} + +// @public (undocumented) +export interface AfmAfmObjectIdentifierParameterIdentifier { + // (undocumented) + 'id': string; + // (undocumented) + 'type': AfmAfmObjectIdentifierParameterIdentifierTypeEnum; +} + +// @public (undocumented) +export type AfmAfmObjectIdentifierParameterIdentifierTypeEnum = 'parameter'; + +// @public +export interface AfmAllTimeDateFilter { + // (undocumented) + 'allTimeDateFilter': AfmAllTimeDateFilterAllTimeDateFilter; +} + +// @public (undocumented) +export interface AfmAllTimeDateFilterAllTimeDateFilter { + // (undocumented) + 'applyOnResult'?: boolean; + // (undocumented) + 'dataset': AfmModelObjectIdentifierDataset; + 'emptyValueHandling'?: AfmAllTimeDateFilterAllTimeDateFilterEmptyValueHandlingEnum; + 'granularity'?: AfmAllTimeDateFilterAllTimeDateFilterGranularityEnum; + // (undocumented) + 'localIdentifier'?: string; +} + +// @public (undocumented) +export type AfmAllTimeDateFilterAllTimeDateFilterEmptyValueHandlingEnum = 'INCLUDE' | 'EXCLUDE' | 'ONLY'; + +// @public (undocumented) +export type AfmAllTimeDateFilterAllTimeDateFilterGranularityEnum = 'MINUTE' | 'HOUR' | 'DAY' | 'WEEK' | 'MONTH' | 'QUARTER' | 'YEAR' | 'MINUTE_OF_HOUR' | 'HOUR_OF_DAY' | 'DAY_OF_WEEK' | 'DAY_OF_MONTH' | 'DAY_OF_QUARTER' | 'DAY_OF_YEAR' | 'WEEK_OF_YEAR' | 'MONTH_OF_YEAR' | 'QUARTER_OF_YEAR' | 'FISCAL_MONTH' | 'FISCAL_QUARTER' | 'FISCAL_YEAR'; + // @public (undocumented) export interface AfmAnalyticsCatalogCreatedBy { 'reasoning': string; @@ -1423,10 +1538,8 @@ export interface AfmArithmeticMeasureDefinitionArithmeticMeasure { // @public (undocumented) export type AfmArithmeticMeasureDefinitionArithmeticMeasureOperatorEnum = 'SUM' | 'DIFFERENCE' | 'MULTIPLICATION' | 'RATIO' | 'CHANGE'; -// Warning: (ae-forgotten-export) The symbol "MatchAttributeFilter_2" needs to be exported by the entry point index.d.ts -// // @public -export type AfmAttributeFilter = MatchAttributeFilter_2 | AfmNegativeAttributeFilter | AfmPositiveAttributeFilter; +export type AfmAttributeFilter = AfmMatchAttributeFilter | AfmNegativeAttributeFilter | AfmPositiveAttributeFilter; // @public export interface AfmAttributeFilterElements { @@ -1441,6 +1554,48 @@ export interface AfmAttributeItem { 'showAllValues'?: boolean; } +// @public (undocumented) +export interface AfmAwsBedrockAccessKeyAuth { + 'accessKeyId'?: string | null; + 'secretAccessKey'?: string | null; + 'sessionToken'?: string | null; + 'type': AfmAwsBedrockAccessKeyAuthTypeEnum; +} + +// @public (undocumented) +export type AfmAwsBedrockAccessKeyAuthTypeEnum = 'ACCESS_KEY'; + +// @public +export interface AfmAwsBedrockProviderConfig { + // (undocumented) + 'auth': AfmAwsBedrockAccessKeyAuth; + 'region': string; + 'type': AfmAwsBedrockProviderConfigTypeEnum; +} + +// @public (undocumented) +export type AfmAwsBedrockProviderConfigTypeEnum = 'AWS_BEDROCK'; + +// @public (undocumented) +export interface AfmAzureFoundryApiKeyAuth { + 'apiKey'?: string | null; + 'type': AfmAzureFoundryApiKeyAuthTypeEnum; +} + +// @public (undocumented) +export type AfmAzureFoundryApiKeyAuthTypeEnum = 'API_KEY'; + +// @public +export interface AfmAzureFoundryProviderConfig { + // (undocumented) + 'auth': AfmAzureFoundryApiKeyAuth; + 'endpoint': string; + 'type': AfmAzureFoundryProviderConfigTypeEnum; +} + +// @public (undocumented) +export type AfmAzureFoundryProviderConfigTypeEnum = 'AZURE_FOUNDRY'; + // @public export interface AfmBoundedFilter { 'from'?: number | null; @@ -1466,7 +1621,6 @@ export interface AfmChangeAnalysisRequest { // (undocumented) 'dateAttribute': AfmAttributeItem; 'excludeTags'?: Array; - // Warning: (ae-forgotten-export) The symbol "OutlierDetectionRequestFiltersInner" needs to be exported by the entry point index.d.ts 'filters'?: Array; 'includeTags'?: Array; // (undocumented) @@ -1475,6 +1629,23 @@ export interface AfmChangeAnalysisRequest { 'useSmartAttributeSelection'?: boolean; } +// @public +export interface AfmComparisonCondition { + // (undocumented) + 'comparison': AfmComparisonConditionComparison; +} + +// @public (undocumented) +export interface AfmComparisonConditionComparison { + // (undocumented) + 'operator': AfmComparisonConditionComparisonOperatorEnum; + // (undocumented) + 'value': number; +} + +// @public (undocumented) +export type AfmComparisonConditionComparisonOperatorEnum = 'GREATER_THAN' | 'GREATER_THAN_OR_EQUAL_TO' | 'LESS_THAN' | 'LESS_THAN_OR_EQUAL_TO' | 'EQUAL_TO' | 'NOT_EQUAL_TO'; + // @public export interface AfmComparisonMeasureValueFilter { // (undocumented) @@ -1500,10 +1671,27 @@ export interface AfmComparisonMeasureValueFilterComparisonMeasureValueFilter { // @public (undocumented) export type AfmComparisonMeasureValueFilterComparisonMeasureValueFilterOperatorEnum = 'GREATER_THAN' | 'GREATER_THAN_OR_EQUAL_TO' | 'LESS_THAN' | 'LESS_THAN_OR_EQUAL_TO' | 'EQUAL_TO' | 'NOT_EQUAL_TO'; -// Warning: (ae-forgotten-export) The symbol "AllTimeDateFilter_2" needs to be exported by the entry point index.d.ts -// // @public -export type AfmDateFilter = AfmAbsoluteDateFilter | AllTimeDateFilter_2 | AfmRelativeDateFilter; +export interface AfmCompoundMeasureValueFilter { + // (undocumented) + 'compoundMeasureValueFilter': AfmCompoundMeasureValueFilterCompoundMeasureValueFilter; +} + +// @public (undocumented) +export interface AfmCompoundMeasureValueFilterCompoundMeasureValueFilter { + // (undocumented) + 'applyOnResult'?: boolean; + 'conditions': Array; + 'dimensionality'?: Array; + // (undocumented) + 'localIdentifier'?: string; + // (undocumented) + 'measure': AfmModelIdentifier; + 'treatNullValuesAs'?: number; +} + +// @public +export type AfmDateFilter = AfmAbsoluteDateFilter | AfmAllTimeDateFilter | AfmRelativeDateFilter; // @public (undocumented) export interface AfmExecution { @@ -1528,15 +1716,29 @@ export interface AfmExecutionSettings { } // @public -export type AfmFilterDefinition = AfmAbsoluteDateFilter | AllTimeDateFilter_2 | AfmComparisonMeasureValueFilter | CompoundMeasureValueFilter_2 | AfmInlineFilterDefinition | MatchAttributeFilter_2 | AfmNegativeAttributeFilter | AfmPositiveAttributeFilter | AfmRangeMeasureValueFilter | AfmRankingFilter | AfmRelativeDateFilter; +export type AfmFilterDefinition = AfmAbsoluteDateFilter | AfmAllTimeDateFilter | AfmComparisonMeasureValueFilter | AfmCompoundMeasureValueFilter | AfmInlineFilterDefinition | AfmMatchAttributeFilter | AfmNegativeAttributeFilter | AfmPositiveAttributeFilter | AfmRangeMeasureValueFilter | AfmRankingFilter | AfmRelativeDateFilter; // @public export type AfmFilterDefinitionForSimpleMeasure = AfmAttributeFilter | AfmDateFilter; +// @public +export interface AfmGeoAreaConfig { + // (undocumented) + 'collection': AfmGeoCollectionIdentifier; +} + +// @public (undocumented) +export interface AfmGeoCollectionIdentifier { + 'id': string; + 'kind'?: AfmGeoCollectionIdentifierKindEnum; +} + +// @public (undocumented) +export type AfmGeoCollectionIdentifierKindEnum = 'STATIC' | 'CUSTOM'; + // @public (undocumented) export interface AfmGetQualityIssuesResponse { 'issues': Array; - // Warning: (ae-forgotten-export) The symbol "GetQualityIssuesResponseStatusEnum" needs to be exported by the entry point index.d.ts 'status': GetQualityIssuesResponseStatusEnum; 'updatedAt'?: string; } @@ -1576,6 +1778,29 @@ export interface AfmLocalIdentifier { 'localIdentifier': string; } +// @public +export interface AfmMatchAttributeFilter { + // (undocumented) + 'matchAttributeFilter': AfmMatchAttributeFilterMatchAttributeFilter; +} + +// @public (undocumented) +export interface AfmMatchAttributeFilterMatchAttributeFilter { + // (undocumented) + 'applyOnResult'?: boolean; + 'caseSensitive'?: boolean; + // (undocumented) + 'label': AfmModelIdentifier; + 'literal': string; + // (undocumented) + 'localIdentifier'?: string; + 'matchType': AfmMatchAttributeFilterMatchAttributeFilterMatchTypeEnum; + 'negate'?: boolean; +} + +// @public (undocumented) +export type AfmMatchAttributeFilterMatchAttributeFilterMatchTypeEnum = 'STARTS_WITH' | 'ENDS_WITH' | 'CONTAINS'; + // @public export type AfmMeasureDefinition = AfmArithmeticMeasureDefinition | AfmInlineMeasureDefinition | AfmPopMeasureDefinition | AfmSimpleMeasureDefinition; @@ -1586,6 +1811,9 @@ export interface AfmMeasureItem { 'localIdentifier': string; } +// @public +export type AfmMeasureValueCondition = AfmComparisonCondition | AfmRangeCondition; + // @public (undocumented) export interface AfmMemoryItemCreatedByUsers { 'reasoning': string; @@ -1629,7 +1857,6 @@ export interface AfmModel { 'filters': Array; 'measureDefinitionOverrides'?: Array; 'measures': Array; - // Warning: (ae-forgotten-export) The symbol "ParameterItem_2" needs to be exported by the entry point index.d.ts 'parameters'?: Array; } @@ -1848,6 +2075,27 @@ export interface AfmObjectIdentifierParameterIdentifier { // @public (undocumented) export type AfmObjectIdentifierParameterIdentifierTypeEnum = 'parameter'; +// @public (undocumented) +export interface AfmOpenAiApiKeyAuth { + 'apiKey'?: string | null; + 'type': AfmOpenAiApiKeyAuthTypeEnum; +} + +// @public (undocumented) +export type AfmOpenAiApiKeyAuthTypeEnum = 'API_KEY'; + +// @public +export interface AfmOpenAIProviderConfig { + // (undocumented) + 'auth': AfmOpenAiApiKeyAuth; + 'baseUrl'?: string; + 'organization'?: string | null; + 'type': AfmOpenAIProviderConfigTypeEnum; +} + +// @public (undocumented) +export type AfmOpenAIProviderConfigTypeEnum = 'OPENAI'; + // @public export interface AfmPopDataset { // (undocumented) @@ -1918,7 +2166,6 @@ export interface AfmQualityIssue { }; 'id': string; 'objects': Array; - // Warning: (ae-forgotten-export) The symbol "QualityIssueSeverityEnum" needs to be exported by the entry point index.d.ts 'severity': QualityIssueSeverityEnum; } @@ -1940,6 +2187,25 @@ export interface AfmQualityIssuesCalculationStatusResponse { // @public (undocumented) export type AfmQualityIssuesCalculationStatusResponseStatusEnum = 'RUNNING' | 'SYNCING' | 'COMPLETED' | 'FAILED' | 'CANCELLED' | 'NOT_FOUND' | 'DISABLED'; +// @public +export interface AfmRangeCondition { + // (undocumented) + 'range': AfmRangeConditionRange; +} + +// @public (undocumented) +export interface AfmRangeConditionRange { + // (undocumented) + 'from': number; + // (undocumented) + 'operator': AfmRangeConditionRangeOperatorEnum; + // (undocumented) + 'to': number; +} + +// @public (undocumented) +export type AfmRangeConditionRangeOperatorEnum = 'BETWEEN' | 'NOT_BETWEEN'; + // @public export interface AfmRangeMeasureValueFilter { // (undocumented) @@ -2002,8 +2268,7 @@ export interface AfmRelativeDateFilterRelativeDateFilter { 'boundedFilter'?: AfmBoundedFilter; // (undocumented) 'dataset': AfmModelObjectIdentifierDataset; - // Warning: (ae-forgotten-export) The symbol "RelativeDateFilterRelativeDateFilterEmptyValueHandlingEnum_2" needs to be exported by the entry point index.d.ts - 'emptyValueHandling'?: RelativeDateFilterRelativeDateFilterEmptyValueHandlingEnum_2; + 'emptyValueHandling'?: AfmRelativeDateFilterRelativeDateFilterEmptyValueHandlingEnum; 'from': number; 'granularity': AfmRelativeDateFilterRelativeDateFilterGranularityEnum; // (undocumented) @@ -2011,6 +2276,9 @@ export interface AfmRelativeDateFilterRelativeDateFilter { 'to': number; } +// @public (undocumented) +export type AfmRelativeDateFilterRelativeDateFilterEmptyValueHandlingEnum = 'INCLUDE' | 'EXCLUDE' | 'ONLY'; + // @public (undocumented) export type AfmRelativeDateFilterRelativeDateFilterGranularityEnum = 'MINUTE' | 'HOUR' | 'DAY' | 'WEEK' | 'MONTH' | 'QUARTER' | 'YEAR' | 'MINUTE_OF_HOUR' | 'HOUR_OF_DAY' | 'DAY_OF_WEEK' | 'DAY_OF_MONTH' | 'DAY_OF_QUARTER' | 'DAY_OF_YEAR' | 'WEEK_OF_YEAR' | 'MONTH_OF_YEAR' | 'QUARTER_OF_YEAR' | 'FISCAL_MONTH' | 'FISCAL_QUARTER' | 'FISCAL_YEAR'; @@ -2035,7 +2303,6 @@ export type AfmSimpleMeasureDefinitionMeasureAggregationEnum = 'SUM' | 'COUNT' | // @public (undocumented) export interface AfmTriggerQualityIssuesCalculationResponse { 'processId': string; - // Warning: (ae-forgotten-export) The symbol "TriggerQualityIssuesCalculationResponseStatusEnum" needs to be exported by the entry point index.d.ts 'status': TriggerQualityIssuesCalculationResponseStatusEnum; } @@ -2068,22 +2335,16 @@ export interface AfmValidObjectsResponse { 'items': Array; } -// Warning: (ae-forgotten-export) The symbol "BaseAPI" needs to be exported by the entry point index.d.ts -// // @public -export class AgentAi extends BaseAPI implements AgentAiInterface { +export class AgentAi extends AiBaseAPI implements AgentAiInterface { listAvailableSkills(options?: AxiosRequestConfig): AxiosPromise; } -// Warning: (ae-forgotten-export) The symbol "Configuration_2" needs to be exported by the entry point index.d.ts -// // @public -export function AgentAi_ListAvailableSkills(axios: AxiosInstance, basePath: string, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise>; +export function AgentAi_ListAvailableSkills(axios: AxiosInstance, basePath: string, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise>; -// Warning: (ae-forgotten-export) The symbol "RequestArgs" needs to be exported by the entry point index.d.ts -// // @public -export function AgentAiAxiosParamCreator_ListAvailableSkills(options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function AgentAiAxiosParamCreator_ListAvailableSkills(options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public export interface AgentAiInterface { @@ -2682,6 +2943,17 @@ export type AiAttributeSortItemDirectionEnum = 'ASC' | 'DESC'; // @public (undocumented) export type AiAttributeSortItemTypeEnum = 'attribute_sort'; +// @public (undocumented) +export class AiBaseAPI { + constructor(configuration?: AiConfiguration, basePath?: string, axios?: AxiosInstance); + // (undocumented) + protected axios: AxiosInstance; + // (undocumented) + protected basePath: string; + // (undocumented) + protected configuration: AiConfiguration | undefined; +} + // @public (undocumented) export interface AiBucketRefObject { // (undocumented) @@ -2692,6 +2964,40 @@ export interface AiBucketRefObject { export interface AiClusteringAmount { } +// @public (undocumented) +export class AiConfiguration { + constructor(param?: AiConfigurationParameters); + accessToken?: string | Promise | ((name?: string, scopes?: string[]) => string) | ((name?: string, scopes?: string[]) => Promise); + apiKey?: string | Promise | ((name: string) => string) | ((name: string) => Promise); + baseOptions?: any; + basePath?: string; + formDataCtor?: new () => any; + isJsonMime(mime: string): boolean; + password?: string; + serverIndex?: number; + username?: string; +} + +// @public +export interface AiConfigurationParameters { + // (undocumented) + accessToken?: string | Promise | ((name?: string, scopes?: string[]) => string) | ((name?: string, scopes?: string[]) => Promise); + // (undocumented) + apiKey?: string | Promise | ((name: string) => string) | ((name: string) => Promise); + // (undocumented) + baseOptions?: any; + // (undocumented) + basePath?: string; + // (undocumented) + formDataCtor?: new () => any; + // (undocumented) + password?: string; + // (undocumented) + serverIndex?: number; + // (undocumented) + username?: string; +} + // @public export type AiContent = ({ type: 'multipart'; @@ -2760,6 +3066,7 @@ export interface AiConversationResponse { 'isPreview'?: boolean; 'lastActivityAt': string; 'organizationId': string; + 'pinned'?: boolean; // (undocumented) 'title'?: string | null; 'userId': string; @@ -2782,6 +3089,8 @@ export interface AiConversationTurnResponse { // @public export interface AiConversationUpdateRequest { + // (undocumented) + 'pinned'?: boolean | null; // (undocumented) 'title'?: string | null; } @@ -3226,6 +3535,14 @@ export interface AiReasoningContent { // @public (undocumented) export type AiReasoningContentTypeEnum = 'reasoning'; +// @public (undocumented) +export interface AiRequestArgs { + // (undocumented) + options: RawAxiosRequestConfig; + // (undocumented) + url: string; +} + // @public (undocumented) export interface AiResponseFeedback { // (undocumented) @@ -3478,6 +3795,13 @@ export interface AiUploadDocumentResponse { 'success': boolean; } +// @public +export interface AiUsageMetadataItem { + 'counterType': string; + 'currentValue': number; + 'limit': number; +} + // @public (undocumented) export interface AiUserContext { // (undocumented) @@ -4707,10 +5031,8 @@ export interface AttributeHeaderAttributeHeader { 'attributeName': string; // (undocumented) 'format'?: AttributeFormat; - // Warning: (ae-forgotten-export) The symbol "GeoAreaConfig_2" needs to be exported by the entry point index.d.ts - // // (undocumented) - 'geoAreaConfig'?: GeoAreaConfig_2; + 'geoAreaConfig'?: AfmGeoAreaConfig; 'granularity'?: AttributeHeaderAttributeHeaderGranularityEnum; // (undocumented) 'label': RestApiIdentifier; @@ -5108,7 +5430,6 @@ export interface AutomationAbsoluteDateFilterAbsoluteDateFilter { 'applyOnResult'?: boolean; // (undocumented) 'dataset': AutomationAfmObjectIdentifierDataset; - // Warning: (ae-forgotten-export) The symbol "AutomationAbsoluteDateFilterAbsoluteDateFilterEmptyValueHandlingEnum" needs to be exported by the entry point index.d.ts 'emptyValueHandling'?: AutomationAbsoluteDateFilterAbsoluteDateFilterEmptyValueHandlingEnum; // (undocumented) 'from': string; @@ -5118,8 +5439,9 @@ export interface AutomationAbsoluteDateFilterAbsoluteDateFilter { 'to': string; } -// Warning: (ae-forgotten-export) The symbol "AutomationCompoundMeasureValueFilter" needs to be exported by the entry point index.d.ts -// +// @public (undocumented) +export type AutomationAbsoluteDateFilterAbsoluteDateFilterEmptyValueHandlingEnum = 'INCLUDE' | 'EXCLUDE' | 'ONLY'; + // @public export type AutomationAbstractMeasureValueFilter = AutomationComparisonMeasureValueFilter | AutomationCompoundMeasureValueFilter | AutomationRangeMeasureValueFilter | AutomationRankingFilter; @@ -5163,10 +5485,8 @@ export interface AutomationAFM { 'attributes': Array; 'auxMeasures'?: Array; 'filters': Array; - // Warning: (ae-forgotten-export) The symbol "AutomationMetricDefinitionOverride" needs to be exported by the entry point index.d.ts 'measureDefinitionOverrides'?: Array; 'measures': Array; - // Warning: (ae-forgotten-export) The symbol "AutomationParameterItem" needs to be exported by the entry point index.d.ts 'parameters'?: Array; } @@ -5267,12 +5587,27 @@ export interface AutomationAfmObjectIdentifierLabelIdentifier { // @public (undocumented) export type AutomationAfmObjectIdentifierLabelIdentifierTypeEnum = 'label'; +// @public +export interface AutomationAfmObjectIdentifierParameter { + // (undocumented) + 'identifier': AutomationAfmObjectIdentifierParameterIdentifier; +} + +// @public (undocumented) +export interface AutomationAfmObjectIdentifierParameterIdentifier { + // (undocumented) + 'id': string; + // (undocumented) + 'type': AutomationAfmObjectIdentifierParameterIdentifierTypeEnum; +} + +// @public (undocumented) +export type AutomationAfmObjectIdentifierParameterIdentifierTypeEnum = 'parameter'; + // @public (undocumented) export interface AutomationAlert { - // Warning: (ae-forgotten-export) The symbol "AutomationAlertCondition_2" needs to be exported by the entry point index.d.ts - // // (undocumented) - 'condition': AutomationAlertCondition_2; + 'condition': MdAutomationAlertCondition; // (undocumented) 'execution': AlertAfm; 'interval'?: AutomationAlertIntervalEnum; @@ -5287,8 +5622,6 @@ export interface AutomationAlertAfm { 'measures': Array; } -// Warning: (ae-forgotten-export) The symbol "AutomationAnomalyDetectionWrapper" needs to be exported by the entry point index.d.ts -// // @public export type AutomationAlertCondition = AutomationAnomalyDetectionWrapper | AutomationComparisonWrapper | AutomationRangeWrapper | AutomationRelativeWrapper; @@ -5350,6 +5683,52 @@ export type AutomationAlertIntervalEnum = 'DAY' | 'WEEK' | 'MONTH' | 'QUARTER' | // @public (undocumented) export type AutomationAlertTriggerEnum = 'ALWAYS' | 'ONCE' | 'ONCE_PER_INTERVAL'; +// @public +export interface AutomationAllTimeDateFilter { + // (undocumented) + 'allTimeDateFilter': AutomationAllTimeDateFilterAllTimeDateFilter; +} + +// @public (undocumented) +export interface AutomationAllTimeDateFilterAllTimeDateFilter { + // (undocumented) + 'applyOnResult'?: boolean; + // (undocumented) + 'dataset': AutomationAfmObjectIdentifierDataset; + 'emptyValueHandling'?: AutomationAllTimeDateFilterAllTimeDateFilterEmptyValueHandlingEnum; + 'granularity'?: AutomationAllTimeDateFilterAllTimeDateFilterGranularityEnum; + // (undocumented) + 'localIdentifier'?: string; +} + +// @public (undocumented) +export type AutomationAllTimeDateFilterAllTimeDateFilterEmptyValueHandlingEnum = 'INCLUDE' | 'EXCLUDE' | 'ONLY'; + +// @public (undocumented) +export type AutomationAllTimeDateFilterAllTimeDateFilterGranularityEnum = 'MINUTE' | 'HOUR' | 'DAY' | 'WEEK' | 'MONTH' | 'QUARTER' | 'YEAR' | 'MINUTE_OF_HOUR' | 'HOUR_OF_DAY' | 'DAY_OF_WEEK' | 'DAY_OF_MONTH' | 'DAY_OF_QUARTER' | 'DAY_OF_YEAR' | 'WEEK_OF_YEAR' | 'MONTH_OF_YEAR' | 'QUARTER_OF_YEAR' | 'FISCAL_MONTH' | 'FISCAL_QUARTER' | 'FISCAL_YEAR'; + +// @public (undocumented) +export interface AutomationAnomalyDetection { + // (undocumented) + 'dataset': AutomationAfmObjectIdentifierDataset; + 'granularity': AutomationAnomalyDetectionGranularityEnum; + // (undocumented) + 'measure': AutomationLocalIdentifier; + 'sensitivity': AutomationAnomalyDetectionSensitivityEnum; +} + +// @public (undocumented) +export type AutomationAnomalyDetectionGranularityEnum = 'HOUR' | 'DAY' | 'WEEK' | 'MONTH' | 'QUARTER' | 'YEAR'; + +// @public (undocumented) +export type AutomationAnomalyDetectionSensitivityEnum = 'LOW' | 'MEDIUM' | 'HIGH'; + +// @public (undocumented) +export interface AutomationAnomalyDetectionWrapper { + // (undocumented) + 'anomaly': AutomationAnomalyDetection; +} + // @public (undocumented) export interface AutomationArithmeticMeasure { // (undocumented) @@ -5390,8 +5769,6 @@ export interface AutomationAttributeElementsByValue { 'values': Array; } -// Warning: (ae-forgotten-export) The symbol "AutomationMatchAttributeFilter" needs to be exported by the entry point index.d.ts -// // @public export type AutomationAttributeFilter = AutomationMatchAttributeFilter | AutomationNegativeAttributeFilter | AutomationPositiveAttributeFilter; @@ -5430,7 +5807,6 @@ export interface AutomationAutomationAlert { 'condition': AutomationAutomationAlertCondition; // (undocumented) 'execution': AutomationAlertAfm; - // Warning: (ae-forgotten-export) The symbol "AutomationAutomationAlertIntervalEnum" needs to be exported by the entry point index.d.ts 'interval'?: AutomationAutomationAlertIntervalEnum; 'trigger'?: AutomationAutomationAlertTriggerEnum; } @@ -5438,6 +5814,9 @@ export interface AutomationAutomationAlert { // @public export type AutomationAutomationAlertCondition = AutomationAnomalyDetectionWrapper | AutomationComparisonWrapper | AutomationRangeWrapper | AutomationRelativeWrapper; +// @public (undocumented) +export type AutomationAutomationAlertIntervalEnum = 'DAY' | 'WEEK' | 'MONTH' | 'QUARTER' | 'YEAR'; + // @public (undocumented) export type AutomationAutomationAlertTriggerEnum = 'ALWAYS' | 'ONCE' | 'ONCE_PER_INTERVAL'; @@ -5529,6 +5908,23 @@ export interface AutomationComparison { 'right': AutomationAlertConditionOperand; } +// @public +export interface AutomationComparisonCondition { + // (undocumented) + 'comparison': AutomationComparisonConditionComparison; +} + +// @public (undocumented) +export interface AutomationComparisonConditionComparison { + // (undocumented) + 'operator': AutomationComparisonConditionComparisonOperatorEnum; + // (undocumented) + 'value': number; +} + +// @public (undocumented) +export type AutomationComparisonConditionComparisonOperatorEnum = 'GREATER_THAN' | 'GREATER_THAN_OR_EQUAL_TO' | 'LESS_THAN' | 'LESS_THAN_OR_EQUAL_TO' | 'EQUAL_TO' | 'NOT_EQUAL_TO'; + // @public export interface AutomationComparisonMeasureValueFilter { // (undocumented) @@ -5563,6 +5959,25 @@ export interface AutomationComparisonWrapper { 'comparison': AutomationComparison; } +// @public +export interface AutomationCompoundMeasureValueFilter { + // (undocumented) + 'compoundMeasureValueFilter': AutomationCompoundMeasureValueFilterCompoundMeasureValueFilter; +} + +// @public (undocumented) +export interface AutomationCompoundMeasureValueFilterCompoundMeasureValueFilter { + // (undocumented) + 'applyOnResult'?: boolean; + 'conditions': Array; + 'dimensionality'?: Array; + // (undocumented) + 'localIdentifier'?: string; + // (undocumented) + 'measure': AutomationAfmIdentifier; + 'treatNullValuesAs'?: number; +} + // @public (undocumented) export class AutomationConfiguration { constructor(param?: AutomationConfigurationParameters); @@ -5816,8 +6231,6 @@ export interface AutomationDashboardDateFilterDateFilter { 'boundedFilter'?: AutomationRelativeBoundedDateFilter; // (undocumented) 'dataSet'?: AutomationIdentifierRef; - // Warning: (ae-forgotten-export) The symbol "AutomationDashboardDateFilterDateFilterEmptyValueHandlingEnum" needs to be exported by the entry point index.d.ts - // // (undocumented) 'emptyValueHandling'?: AutomationDashboardDateFilterDateFilterEmptyValueHandlingEnum; // (undocumented) @@ -5832,6 +6245,9 @@ export interface AutomationDashboardDateFilterDateFilter { 'type': AutomationDashboardDateFilterDateFilterTypeEnum; } +// @public (undocumented) +export type AutomationDashboardDateFilterDateFilterEmptyValueHandlingEnum = 'include' | 'exclude' | 'only'; + // @public export type AutomationDashboardDateFilterDateFilterFrom = number | string; @@ -5845,12 +6261,16 @@ export type AutomationDashboardDateFilterDateFilterTypeEnum = 'relative' | 'abso export interface AutomationDashboardExportSettings { 'exportInfo'?: boolean; 'mergeHeaders'?: boolean; - // Warning: (ae-forgotten-export) The symbol "AutomationDashboardExportSettingsPageOrientationEnum" needs to be exported by the entry point index.d.ts 'pageOrientation'?: AutomationDashboardExportSettingsPageOrientationEnum; - // Warning: (ae-forgotten-export) The symbol "AutomationDashboardExportSettingsPageSizeEnum" needs to be exported by the entry point index.d.ts 'pageSize'?: AutomationDashboardExportSettingsPageSizeEnum; } +// @public (undocumented) +export type AutomationDashboardExportSettingsPageOrientationEnum = 'PORTRAIT' | 'LANDSCAPE'; + +// @public (undocumented) +export type AutomationDashboardExportSettingsPageSizeEnum = 'A3' | 'A4' | 'LETTER'; + // @public export type AutomationDashboardFilter = AutomationDashboardArbitraryAttributeFilter | AutomationDashboardAttributeFilter | AutomationDashboardDateFilter | AutomationDashboardMatchAttributeFilter; @@ -5904,8 +6324,6 @@ export interface AutomationDashboardTabularExportRequestV2 { // @public (undocumented) export type AutomationDashboardTabularExportRequestV2FormatEnum = 'XLSX' | 'PDF'; -// Warning: (ae-forgotten-export) The symbol "AutomationAllTimeDateFilter" needs to be exported by the entry point index.d.ts -// // @public export type AutomationDateFilter = AutomationAbsoluteDateFilter | AutomationAllTimeDateFilter | AutomationRelativeDateFilter; @@ -6072,6 +6490,29 @@ export interface AutomationLocalIdentifier { 'title'?: string | null; } +// @public +export interface AutomationMatchAttributeFilter { + // (undocumented) + 'matchAttributeFilter': AutomationMatchAttributeFilterMatchAttributeFilter; +} + +// @public (undocumented) +export interface AutomationMatchAttributeFilterMatchAttributeFilter { + // (undocumented) + 'applyOnResult'?: boolean; + 'caseSensitive'?: boolean; + // (undocumented) + 'label': AutomationAfmIdentifier; + 'literal': string; + // (undocumented) + 'localIdentifier'?: string; + 'matchType': AutomationMatchAttributeFilterMatchAttributeFilterMatchTypeEnum; + 'negate'?: boolean; +} + +// @public (undocumented) +export type AutomationMatchAttributeFilterMatchAttributeFilterMatchTypeEnum = 'STARTS_WITH' | 'ENDS_WITH' | 'CONTAINS'; + // @public export type AutomationMeasureDefinition = AutomationArithmeticMeasureDefinition | AutomationInlineMeasureDefinition | AutomationPopMeasureDefinition | AutomationSimpleMeasureDefinition; @@ -6085,6 +6526,9 @@ export interface AutomationMeasureItem { // @public export type AutomationMeasureItemDefinition = AutomationArithmeticMeasureDefinition | AutomationInlineMeasureDefinition | AutomationPopDatasetMeasureDefinition | AutomationPopDateMeasureDefinition | AutomationPopMeasureDefinition | AutomationSimpleMeasureDefinition; +// @public +export type AutomationMeasureValueCondition = AutomationComparisonCondition | AutomationRangeCondition; + // @public export type AutomationMeasureValueFilter = AutomationComparisonMeasureValueFilter | AutomationCompoundMeasureValueFilter | AutomationRangeMeasureValueFilter; @@ -6098,6 +6542,14 @@ export interface AutomationMetadata { 'widget'?: string; } +// @public +export interface AutomationMetricDefinitionOverride { + // (undocumented) + 'definition': AutomationInlineMeasureDefinition; + // (undocumented) + 'item': AutomationAfmObjectIdentifierCore; +} + // @public (undocumented) export interface AutomationMetricRecord { // (undocumented) @@ -6215,6 +6667,13 @@ export interface AutomationOver { 'attributes': Array; } +// @public +export interface AutomationParameterItem { + // (undocumented) + 'parameter': AutomationAfmObjectIdentifierParameter; + 'value': string; +} + // @public export interface AutomationPdfTableStyle { 'properties'?: Array; @@ -6301,6 +6760,25 @@ export interface AutomationRange { 'to': AutomationValue; } +// @public +export interface AutomationRangeCondition { + // (undocumented) + 'range': AutomationRangeConditionRange; +} + +// @public (undocumented) +export interface AutomationRangeConditionRange { + // (undocumented) + 'from': number; + // (undocumented) + 'operator': AutomationRangeConditionRangeOperatorEnum; + // (undocumented) + 'to': number; +} + +// @public (undocumented) +export type AutomationRangeConditionRangeOperatorEnum = 'BETWEEN' | 'NOT_BETWEEN'; + // @public export interface AutomationRangeMeasureValueFilter { // (undocumented) @@ -6437,7 +6915,6 @@ export interface AutomationRelativeDateFilterRelativeDateFilter { 'boundedFilter'?: AutomationBoundedFilter; // (undocumented) 'dataset': AutomationAfmObjectIdentifierDataset; - // Warning: (ae-forgotten-export) The symbol "AutomationRelativeDateFilterRelativeDateFilterEmptyValueHandlingEnum" needs to be exported by the entry point index.d.ts 'emptyValueHandling'?: AutomationRelativeDateFilterRelativeDateFilterEmptyValueHandlingEnum; 'from': number; 'granularity': AutomationRelativeDateFilterRelativeDateFilterGranularityEnum; @@ -6446,6 +6923,9 @@ export interface AutomationRelativeDateFilterRelativeDateFilter { 'to': number; } +// @public (undocumented) +export type AutomationRelativeDateFilterRelativeDateFilterEmptyValueHandlingEnum = 'INCLUDE' | 'EXCLUDE' | 'ONLY'; + // @public (undocumented) export type AutomationRelativeDateFilterRelativeDateFilterGranularityEnum = 'MINUTE' | 'HOUR' | 'DAY' | 'WEEK' | 'MONTH' | 'QUARTER' | 'YEAR' | 'MINUTE_OF_HOUR' | 'HOUR_OF_DAY' | 'DAY_OF_WEEK' | 'DAY_OF_MONTH' | 'DAY_OF_QUARTER' | 'DAY_OF_YEAR' | 'WEEK_OF_YEAR' | 'MONTH_OF_YEAR' | 'QUARTER_OF_YEAR' | 'FISCAL_MONTH' | 'FISCAL_QUARTER' | 'FISCAL_YEAR'; @@ -6858,12 +7338,9 @@ export interface AutomationSchedule { export interface AutomationSettings { 'delimiter'?: string; 'exportInfo'?: boolean; - // Warning: (ae-forgotten-export) The symbol "AutomationSettingsGrandTotalsPositionEnum" needs to be exported by the entry point index.d.ts 'grandTotalsPosition'?: AutomationSettingsGrandTotalsPositionEnum; 'mergeHeaders'?: boolean; - // Warning: (ae-forgotten-export) The symbol "AutomationSettingsPageOrientationEnum" needs to be exported by the entry point index.d.ts 'pageOrientation'?: AutomationSettingsPageOrientationEnum; - // Warning: (ae-forgotten-export) The symbol "AutomationSettingsPageSizeEnum" needs to be exported by the entry point index.d.ts 'pageSize'?: AutomationSettingsPageSizeEnum; // @deprecated 'pdfPageSize'?: string; @@ -6877,6 +7354,15 @@ export interface AutomationSettings { 'showFilters'?: boolean; } +// @public (undocumented) +export type AutomationSettingsGrandTotalsPositionEnum = 'pinnedBottom' | 'pinnedTop' | 'bottom' | 'top'; + +// @public (undocumented) +export type AutomationSettingsPageOrientationEnum = 'PORTRAIT' | 'LANDSCAPE'; + +// @public (undocumented) +export type AutomationSettingsPageSizeEnum = 'A3' | 'A4' | 'LETTER'; + // @public export interface AutomationSimpleMeasureDefinition { // (undocumented) @@ -7209,10 +7695,33 @@ export interface CertificationApiSetCertificationRequest { readonly workspaceId: string; } +// @public +export interface ChangeAnalysisParams { + 'analyzedPeriod': string; + 'attributes': Array; + // (undocumented) + 'dateAttribute': AfmAttributeItem; + 'filters': Array; + // (undocumented) + 'measure': AfmMeasureItem; + 'measureTitle': string; + 'referencePeriod': string; + 'useSmartAttributeSelection': boolean; +} + +// @public +export interface ChangeAnalysisResponse { + // (undocumented) + 'links': ExecutionLinks; +} + +// @public +export interface ChangeAnalysisResult { + 'data': Array; +} + // @public export interface ChatHistoryInteraction { - // Warning: (ae-forgotten-export) The symbol "ChangeAnalysisParams" needs to be exported by the entry point index.d.ts - // // (undocumented) 'changeAnalysisParams'?: ChangeAnalysisParams; 'chatHistoryInteractionId': string; @@ -7223,8 +7732,6 @@ export interface ChatHistoryInteraction { 'foundObjects'?: FoundObjects; 'interactionFinished': boolean; 'question': string; - // Warning: (ae-forgotten-export) The symbol "Reasoning" needs to be exported by the entry point index.d.ts - // // (undocumented) 'reasoning'?: Reasoning; // (undocumented) @@ -7270,7 +7777,6 @@ export interface ChatRequest { 'limitCreate'?: number; 'limitCreateContext'?: number; 'limitSearch'?: number; - // Warning: (ae-forgotten-export) The symbol "ChatRequestObjectTypesEnum" needs to be exported by the entry point index.d.ts 'objectTypes'?: Array; 'question': string; 'relevantScoreThreshold'?: number; @@ -7281,6 +7787,9 @@ export interface ChatRequest { 'userContext'?: UserContext; } +// @public (undocumented) +export type ChatRequestObjectTypesEnum = 'attribute' | 'metric' | 'fact' | 'label' | 'date' | 'dataset' | 'visualization' | 'dashboard'; + // @public (undocumented) export interface ChatResult { // (undocumented) @@ -7299,9 +7808,7 @@ export interface ChatResult { 'semanticSearch'?: SearchResult; 'textResponse'?: string; 'threadIdSuffix'?: string; - // Warning: (ae-forgotten-export) The symbol "ToolCallEventResult" needs to be exported by the entry point index.d.ts 'toolCallEvents'?: Array; - // Warning: (ae-forgotten-export) The symbol "AiUsageMetadataItem" needs to be exported by the entry point index.d.ts 'usage'?: Array; } @@ -7648,7 +8155,7 @@ export interface ContentSlideTemplate { } // @public -export class ConversationsAi extends BaseAPI implements ConversationsAiInterface { +export class ConversationsAi extends AiBaseAPI implements ConversationsAiInterface { deleteConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdDelete(requestParameters: ConversationsAiDeleteConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdDeleteRequest, options?: AxiosRequestConfig): AxiosPromise; getConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdGet(requestParameters: ConversationsAiGetConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdGetRequest, options?: AxiosRequestConfig): AxiosPromise; getConversationsApiV1AiWorkspacesWorkspaceIdChatConversationsGet(requestParameters: ConversationsAiGetConversationsApiV1AiWorkspacesWorkspaceIdChatConversationsGetRequest, options?: AxiosRequestConfig): AxiosPromise; @@ -7658,52 +8165,52 @@ export class ConversationsAi extends BaseAPI implements ConversationsAiInterface } // @public -function ConversationsAi_DeleteConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdDelete(axios: AxiosInstance, basePath: string, requestParameters: ConversationsAiDeleteConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdDeleteRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function ConversationsAi_DeleteConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdDelete(axios: AxiosInstance, basePath: string, requestParameters: ConversationsAiDeleteConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdDeleteRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { ConversationsAi_DeleteConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdDelete } export { ConversationsAi_DeleteConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdDelete as GenAiApi_DeleteConversation } // @public -function ConversationsAi_GetConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdGet(axios: AxiosInstance, basePath: string, requestParameters: ConversationsAiGetConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdGetRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function ConversationsAi_GetConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdGet(axios: AxiosInstance, basePath: string, requestParameters: ConversationsAiGetConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdGetRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { ConversationsAi_GetConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdGet } export { ConversationsAi_GetConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdGet as GenAiApi_GetConversation } // @public -function ConversationsAi_GetConversationsApiV1AiWorkspacesWorkspaceIdChatConversationsGet(axios: AxiosInstance, basePath: string, requestParameters: ConversationsAiGetConversationsApiV1AiWorkspacesWorkspaceIdChatConversationsGetRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function ConversationsAi_GetConversationsApiV1AiWorkspacesWorkspaceIdChatConversationsGet(axios: AxiosInstance, basePath: string, requestParameters: ConversationsAiGetConversationsApiV1AiWorkspacesWorkspaceIdChatConversationsGetRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { ConversationsAi_GetConversationsApiV1AiWorkspacesWorkspaceIdChatConversationsGet } export { ConversationsAi_GetConversationsApiV1AiWorkspacesWorkspaceIdChatConversationsGet as GenAiApi_GetConversations } // @public -function ConversationsAi_PatchConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdPatch(axios: AxiosInstance, basePath: string, requestParameters: ConversationsAiPatchConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdPatchRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function ConversationsAi_PatchConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdPatch(axios: AxiosInstance, basePath: string, requestParameters: ConversationsAiPatchConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdPatchRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { ConversationsAi_PatchConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdPatch } export { ConversationsAi_PatchConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdPatch as GenAiApi_PatchConversation } // @public -function ConversationsAi_PostConversationsApiV1AiWorkspacesWorkspaceIdChatConversationsPost(axios: AxiosInstance, basePath: string, requestParameters: ConversationsAiPostConversationsApiV1AiWorkspacesWorkspaceIdChatConversationsPostRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function ConversationsAi_PostConversationsApiV1AiWorkspacesWorkspaceIdChatConversationsPost(axios: AxiosInstance, basePath: string, requestParameters: ConversationsAiPostConversationsApiV1AiWorkspacesWorkspaceIdChatConversationsPostRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { ConversationsAi_PostConversationsApiV1AiWorkspacesWorkspaceIdChatConversationsPost } export { ConversationsAi_PostConversationsApiV1AiWorkspacesWorkspaceIdChatConversationsPost as GenAiApi_PostConversations } // @public -function ConversationsAi_PostGenerateConversationTitleApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdGenerateTitlePost(axios: AxiosInstance, basePath: string, requestParameters: ConversationsAiPostGenerateConversationTitleApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdGenerateTitlePostRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function ConversationsAi_PostGenerateConversationTitleApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdGenerateTitlePost(axios: AxiosInstance, basePath: string, requestParameters: ConversationsAiPostGenerateConversationTitleApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdGenerateTitlePostRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { ConversationsAi_PostGenerateConversationTitleApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdGenerateTitlePost } export { ConversationsAi_PostGenerateConversationTitleApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdGenerateTitlePost as GenAiApi_PostGenerateConversationTitle } // @public -export function ConversationsAiAxiosParamCreator_DeleteConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdDelete(workspaceId: string, conversationId: string, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function ConversationsAiAxiosParamCreator_DeleteConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdDelete(workspaceId: string, conversationId: string, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public -export function ConversationsAiAxiosParamCreator_GetConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdGet(workspaceId: string, conversationId: string, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function ConversationsAiAxiosParamCreator_GetConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdGet(workspaceId: string, conversationId: string, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public -export function ConversationsAiAxiosParamCreator_GetConversationsApiV1AiWorkspacesWorkspaceIdChatConversationsGet(workspaceId: string, isPreview?: boolean, page?: number, size?: number, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function ConversationsAiAxiosParamCreator_GetConversationsApiV1AiWorkspacesWorkspaceIdChatConversationsGet(workspaceId: string, isPreview?: boolean, page?: number, size?: number, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public -export function ConversationsAiAxiosParamCreator_PatchConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdPatch(workspaceId: string, conversationId: string, aiConversationUpdateRequest: AiConversationUpdateRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function ConversationsAiAxiosParamCreator_PatchConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdPatch(workspaceId: string, conversationId: string, aiConversationUpdateRequest: AiConversationUpdateRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public -export function ConversationsAiAxiosParamCreator_PostConversationsApiV1AiWorkspacesWorkspaceIdChatConversationsPost(workspaceId: string, isPreview?: boolean, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function ConversationsAiAxiosParamCreator_PostConversationsApiV1AiWorkspacesWorkspaceIdChatConversationsPost(workspaceId: string, isPreview?: boolean, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public -export function ConversationsAiAxiosParamCreator_PostGenerateConversationTitleApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdGenerateTitlePost(workspaceId: string, conversationId: string, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function ConversationsAiAxiosParamCreator_PostGenerateConversationTitleApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdGenerateTitlePost(workspaceId: string, conversationId: string, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public interface ConversationsAiDeleteConversationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdDeleteRequest { @@ -7766,6 +8273,16 @@ interface ConversationsAiPostGenerateConversationTitleApiV1AiWorkspacesWorkspace export { ConversationsAiPostGenerateConversationTitleApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdGenerateTitlePostRequest } export { ConversationsAiPostGenerateConversationTitleApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdGenerateTitlePostRequest as GenAiApiPostGenerateConversationTitleRequest } +// @public +export interface ConvertGeoFileRequest { + 'location': string; +} + +// @public +export interface ConvertGeoFileResponse { + 'location': string; +} + // @public export class CookieSecurityConfigurationApi extends MetadataBaseApi implements CookieSecurityConfigurationApiInterface { getEntityCookieSecurityConfigurations(requestParameters: CookieSecurityConfigurationApiGetEntityCookieSecurityConfigurationsRequest, options?: AxiosRequestConfig): AxiosPromise; @@ -8452,6 +8969,12 @@ export interface DashboardAttributeFilterAttributeFilter { // @public (undocumented) export type DashboardAttributeFilterAttributeFilterSelectionModeEnum = 'single' | 'multi'; +// @public +export interface DashboardContext { + 'id': string; + 'widgets': Array; +} + // @public (undocumented) export interface DashboardDateFilter { // (undocumented) @@ -11052,7 +11575,7 @@ export interface DependsOnDateFilter { // @public export interface DependsOnMatchFilter { // (undocumented) - 'matchFilter': MatchAttributeFilter_2; + 'matchFilter': AfmMatchAttributeFilter; } // @public @@ -17920,13 +18443,11 @@ export interface GenAiApiTagsRequest { // @public export interface GenAiApiTestLlmProviderByIdRequest { readonly llmProviderId: string; - // Warning: (ae-forgotten-export) The symbol "TestLlmProviderByIdRequest" needs to be exported by the entry point index.d.ts readonly testLlmProviderByIdRequest?: TestLlmProviderByIdRequest; } // @public export interface GenAiApiTestLlmProviderRequest { - // Warning: (ae-forgotten-export) The symbol "TestLlmProviderDefinitionRequest" needs to be exported by the entry point index.d.ts readonly testLlmProviderDefinitionRequest: TestLlmProviderDefinitionRequest; } @@ -17935,6 +18456,21 @@ export type GenAiApiTrendingObjectsRequest = { readonly workspaceId: string; }; +// @public (undocumented) +export interface GenerateDescriptionRequest { + 'objectId': string; + 'objectType': GenerateDescriptionRequestObjectTypeEnum; +} + +// @public (undocumented) +export type GenerateDescriptionRequestObjectTypeEnum = 'Visualization' | 'Dashboard' | 'Metric' | 'Fact' | 'Attribute'; + +// @public (undocumented) +export interface GenerateDescriptionResponse { + 'description'?: string; + 'note'?: string; +} + // @public export interface GenerateLdmRequest { 'aggregatedFactPrefix'?: string; @@ -17984,6 +18520,21 @@ export interface GenerateLogicalDataModelApiInterface { generateLogicalModel(requestParameters: GenerateLogicalDataModelApiGenerateLogicalModelRequest, options?: AxiosRequestConfig): AxiosPromise; } +// @public (undocumented) +export interface GenerateTitleRequest { + 'objectId': string; + 'objectType': GenerateTitleRequestObjectTypeEnum; +} + +// @public (undocumented) +export type GenerateTitleRequestObjectTypeEnum = 'Visualization' | 'Dashboard' | 'Metric' | 'Fact' | 'Attribute'; + +// @public (undocumented) +export interface GenerateTitleResponse { + 'note'?: string; + 'title'?: string; +} + // @public export interface GeoAreaConfig { // (undocumented) @@ -18094,6 +18645,41 @@ export interface GeographicDataApiUpdateEntityCustomGeoCollectionsRequest { readonly jsonApiCustomGeoCollectionInDocument: JsonApiCustomGeoCollectionInDocument; } +// @public +export interface GeoJsonFeature { + // (undocumented) + 'geometry'?: GeoJsonGeometry; + // (undocumented) + 'id'?: object; + // (undocumented) + 'properties': { + [key: string]: object; + }; + // (undocumented) + 'type': string; +} + +// @public +export interface GeoJsonFeatureCollection { + // (undocumented) + 'bbox'?: Array; + // (undocumented) + 'features': Array; + // (undocumented) + 'type': string; +} + +// @public +export interface GeoJsonGeometry { + // (undocumented) + 'coordinates': object; + // (undocumented) + 'type': string; +} + +// @public (undocumented) +export type GetQualityIssuesResponseStatusEnum = 'RUNNING' | 'SYNCING' | 'COMPLETED' | 'FAILED' | 'CANCELLED' | 'NOT_FOUND' | 'DISABLED'; + // @public export interface GrainIdentifier { 'id': string; @@ -18660,6 +19246,13 @@ export interface ILiveFeatures { }; } +// @public +export interface ILocationStyleListItem { + id: string; + link: string; + title: string; +} + // @public export interface ILocationStyleParams { language?: string; @@ -18777,6 +19370,16 @@ export interface ImportCsvResponse { 'version': number; } +// @public +export interface ImportGeoCollectionRequest { + 'location': string; +} + +// @public +export interface ImportGeoCollectionResponse { + 'version': number; +} + // @public export interface InlineFilterDefinition { // (undocumented) @@ -18973,17 +19576,17 @@ function isVisualizationObject_2(visualizationObject: unknown): visualizationObj export function isVisualizationObjectsItem(visualizationObject: unknown): visualizationObject is JsonApiVisualizationObjectOutWithLinks; // @public -export class ItemsAi extends BaseAPI implements ItemsAiInterface { +export class ItemsAi extends AiBaseAPI implements ItemsAiInterface { getConversationItemsApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdItemsGet(requestParameters: ItemsAiGetConversationItemsApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdItemsGetRequest, options?: AxiosRequestConfig): AxiosPromise; } // @public -function ItemsAi_GetConversationItemsApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdItemsGet(axios: AxiosInstance, basePath: string, requestParameters: ItemsAiGetConversationItemsApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdItemsGetRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function ItemsAi_GetConversationItemsApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdItemsGet(axios: AxiosInstance, basePath: string, requestParameters: ItemsAiGetConversationItemsApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdItemsGetRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { ItemsAi_GetConversationItemsApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdItemsGet as GenAiApi_GetConversationItems } export { ItemsAi_GetConversationItemsApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdItemsGet } // @public -export function ItemsAiAxiosParamCreator_GetConversationItemsApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdItemsGet(workspaceId: string, conversationId: string, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function ItemsAiAxiosParamCreator_GetConversationItemsApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdItemsGet(workspaceId: string, conversationId: string, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public interface ItemsAiGetConversationItemsApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdItemsGetRequest { @@ -18998,6 +19601,40 @@ export interface ItemsAiInterface { getConversationItemsApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdItemsGet(requestParameters: ItemsAiGetConversationItemsApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdItemsGetRequest, options?: AxiosRequestConfig): AxiosPromise; } +// @public +export interface ITigerAbsoluteDateFilter { + // (undocumented) + absoluteDateFilter: { + dataSet: ObjRef; + from: string; + to: string; + localIdentifier?: string; + }; +} + +// @public +export interface ITigerArithmeticMeasure { + // (undocumented) + alias?: string; + // (undocumented) + definition: ITigerArithmeticMeasureDefinition; + // (undocumented) + format?: string; + // (undocumented) + localIdentifier: string; + // (undocumented) + title?: string; +} + +// @public (undocumented) +export interface ITigerArithmeticMeasureDefinition { + // (undocumented) + arithmeticMeasure: { + measureIdentifiers: string[]; + operator: "sum" | "difference" | "multiplication" | "ratio" | "change"; + }; +} + // @public export interface ITigerAttribute { // (undocumented) @@ -19009,6 +19646,21 @@ export interface ITigerAttribute { }; } +// @public (undocumented) +export type ITigerAttributeElements = ITigerAttributeElementsByRef | ITigerAttributeElementsByValue; + +// @public +export interface ITigerAttributeElementsByRef { + // (undocumented) + uris: Array; +} + +// @public +export interface ITigerAttributeElementsByValue { + // (undocumented) + values: Array; +} + // @public export interface ITigerAttributeFilterConfig { // (undocumented) @@ -19053,14 +19705,24 @@ export interface ITigerAttributeSortItem { }; } +// @public +export interface ITigerBaseWidget { + // (undocumented) + localIdentifier?: string; + // (undocumented) + size?: ITigerDashboardLayoutSize; + // (undocumented) + sizeByScreen?: ITigerDashboardLayoutSizeByScreenSize; + // (undocumented) + type: string; +} + // @public export interface ITigerBucket { // (undocumented) items: ITigerAttributeOrMeasure[]; // (undocumented) localIdentifier?: string; - // Warning: (ae-forgotten-export) The symbol "ITigerTotal" needs to be exported by the entry point index.d.ts - // // (undocumented) totals?: ITigerTotal[]; } @@ -19075,8 +19737,6 @@ export interface ITigerClient extends ITigerClientBase { automation: ReturnType; // (undocumented) declarativeLayout: ReturnType; - // Warning: (ae-forgotten-export) The symbol "tigerEntitiesObjectsClientFactory" needs to be exported by the entry point index.d.ts - // // (undocumented) entities: ReturnType; // (undocumented) @@ -19089,8 +19749,6 @@ export interface ITigerClient extends ITigerClientBase { export: ReturnType; // @beta (undocumented) genAI: ReturnType; - // Warning: (ae-forgotten-export) The symbol "tigerGeoCollectionsClientFactory" needs to be exported by the entry point index.d.ts - // // (undocumented) geoCollections: ReturnType; // (undocumented) @@ -19166,6 +19824,14 @@ export interface ITigerDashboardArbitraryAttributeFilter { }; } +// @public +export interface ITigerDashboardAttributeFilterByDate { + // (undocumented) + filterLocalIdentifier: string; + // (undocumented) + isCommonDate: boolean; +} + // @public export interface ITigerDashboardAttributeFilterConfig { // (undocumented) @@ -19187,6 +19853,16 @@ export interface ITigerDashboardAttributeFilterConfig { title?: string; } +// @public +export interface ITigerDashboardAttributeFilterParent { + // (undocumented) + filterLocalIdentifier: string; + // (undocumented) + over: { + attributes: ObjRef[]; + }; +} + // @public export interface ITigerDashboardDateFilterConfig { // (undocumented) @@ -19215,26 +19891,98 @@ export interface ITigerDashboardDateFilterConfig { mode?: "readonly" | "hidden" | "active"; } +// @public +export interface ITigerDashboardFilterGroup { + // (undocumented) + filters: Array<{ + filterLocalIdentifier: string; + }>; + // (undocumented) + localIdentifier?: string; + // (undocumented) + title: string; +} + // @public export interface ITigerDashboardFilterGroupsConfig { - // Warning: (ae-forgotten-export) The symbol "ITigerDashboardFilterGroup" needs to be exported by the entry point index.d.ts - // // (undocumented) groups: ITigerDashboardFilterGroup[]; } -// Warning: (ae-forgotten-export) The symbol "ITigerWidget" needs to be exported by the entry point index.d.ts -// // @public export interface ITigerDashboardLayout { - // Warning: (ae-forgotten-export) The symbol "ITigerDashboardLayoutSection" needs to be exported by the entry point index.d.ts - // // (undocumented) sections?: Array>; // (undocumented) type: "IDashboardLayout"; } +// @public +export interface ITigerDashboardLayoutColumn { + // (undocumented) + items?: Array>; + // (undocumented) + size?: ITigerDashboardLayoutSize; + // (undocumented) + sizeByScreen?: ITigerDashboardLayoutSizeByScreenSize; + // (undocumented) + type: "IDashboardLayoutColumn"; +} + +// @public +export interface ITigerDashboardLayoutItem { + // (undocumented) + size?: ITigerDashboardLayoutSize; + // (undocumented) + sizeByScreen?: ITigerDashboardLayoutSizeByScreenSize; + // (undocumented) + type: "IDashboardLayoutItem"; + // (undocumented) + widget?: TWidget | ITigerDashboardLayout; +} + +// @public +export interface ITigerDashboardLayoutSection { + // (undocumented) + header?: ITigerDashboardLayoutSectionHeader; + // (undocumented) + items?: Array>; + // (undocumented) + type: "IDashboardLayoutSection"; +} + +// @public +export interface ITigerDashboardLayoutSectionHeader { + // (undocumented) + description?: string; + // (undocumented) + title?: string; +} + +// @public +export interface ITigerDashboardLayoutSize { + // (undocumented) + gridHeight?: number; + // (undocumented) + gridWidth: number; + // (undocumented) + heightAsRatio?: number; +} + +// @public +export interface ITigerDashboardLayoutSizeByScreenSize { + // (undocumented) + lg?: ITigerDashboardLayoutSize; + // (undocumented) + md?: ITigerDashboardLayoutSize; + // (undocumented) + sm?: ITigerDashboardLayoutSize; + // (undocumented) + xl?: ITigerDashboardLayoutSize; + // (undocumented) + xs?: ITigerDashboardLayoutSize; +} + // @public export interface ITigerDashboardMatchAttributeFilter { // (undocumented) @@ -19304,16 +20052,12 @@ export interface ITigerDashboardTab { localIdentifier: string; // (undocumented) measureValueFilterConfigs?: ITigerDashboardMeasureValueFilterConfig[]; + // @alpha + parameters?: ITigerDashboardParameter[]; // (undocumented) title: string; } -// Warning: (ae-forgotten-export) The symbol "ITigerAbsoluteDateFilter" needs to be exported by the entry point index.d.ts -// Warning: (ae-forgotten-export) The symbol "ITigerRelativeDateFilter" needs to be exported by the entry point index.d.ts -// Warning: (ae-forgotten-export) The symbol "ITigerPositiveAttributeFilter" needs to be exported by the entry point index.d.ts -// Warning: (ae-forgotten-export) The symbol "ITigerNegativeAttributeFilter" needs to be exported by the entry point index.d.ts -// Warning: (ae-forgotten-export) The symbol "ITigerRankingFilter" needs to be exported by the entry point index.d.ts -// // @public export type ITigerFilter = ITigerAbsoluteDateFilter | ITigerRelativeDateFilter | ITigerPositiveAttributeFilter | ITigerNegativeAttributeFilter | ITigerMeasureValueFilter | ITigerRankingFilter | ITigerDashboardArbitraryAttributeFilter | ITigerDashboardMatchAttributeFilter; @@ -19348,14 +20092,67 @@ export interface ITigerInsightParameterValue { value: number; } -// Warning: (ae-forgotten-export) The symbol "ITigerSimpleMeasure" needs to be exported by the entry point index.d.ts -// Warning: (ae-forgotten-export) The symbol "ITigerArithmeticMeasure" needs to be exported by the entry point index.d.ts -// Warning: (ae-forgotten-export) The symbol "ITigerPopMeasure" needs to be exported by the entry point index.d.ts -// Warning: (ae-forgotten-export) The symbol "ITigerPreviousPeriodMeasure" needs to be exported by the entry point index.d.ts -// +// @public +export interface ITigerInsightWidget extends ITigerBaseWidget { + // (undocumented) + description?: string; + // (undocumented) + drills?: any[]; + // (undocumented) + ignoreDashboardFilters?: Array<{ + type: "attributeFilterReference" | "dateFilterReference"; + displayForm?: ObjRef; + dataSet?: ObjRef; + }>; + // (undocumented) + insight: ObjRef; + // (undocumented) + title?: string; + // (undocumented) + type: "insight"; +} + +// @public +export interface ITigerKpiWidget extends ITigerBaseWidget { + // (undocumented) + description?: string; + // (undocumented) + ignoreDashboardFilters?: Array<{ + type: "attributeFilterReference" | "dateFilterReference"; + displayForm?: ObjRef; + dataSet?: ObjRef; + }>; + // (undocumented) + kpi: ObjRef; + // (undocumented) + title?: string; + // (undocumented) + type: "kpi"; +} + +// @public (undocumented) +export type ITigerLocatorItem = ITigerAttributeLocatorItem | ITigerMeasureLocatorItem | ITigerTotalLocatorItem; + // @public export type ITigerMeasure = ITigerSimpleMeasure | ITigerArithmeticMeasure | ITigerPopMeasure | ITigerPreviousPeriodMeasure; +// @public +export interface ITigerMeasureLocatorItem { + // (undocumented) + measureLocatorItem: { + measureIdentifier: string; + }; +} + +// @public +export interface ITigerMeasureSortItem { + // (undocumented) + measureSortItem: { + direction: "asc" | "desc"; + locators: ITigerLocatorItem[]; + }; +} + // @public export interface ITigerMeasureValueFilter { // (undocumented) @@ -19369,6 +20166,75 @@ export interface ITigerMeasureValueFilter { // @public (undocumented) export type ITigerMeasureValueFilterCondition = ITigerComparisonCondition | ITigerRangeCondition | ITigerCompoundCondition; +// @public +export interface ITigerNegativeAttributeFilter { + // (undocumented) + negativeAttributeFilter: { + displayForm: ObjRef; + notIn: ITigerAttributeElements; + localIdentifier?: string; + }; +} + +// @public +export interface ITigerPopMeasure { + // (undocumented) + alias?: string; + // (undocumented) + definition: ITigerPopMeasureDefinition; + // (undocumented) + format?: string; + // (undocumented) + localIdentifier: string; + // (undocumented) + title?: string; +} + +// @public (undocumented) +export interface ITigerPopMeasureDefinition { + // (undocumented) + popMeasure: { + measureIdentifier: string; + popAttribute: ObjRef; + }; +} + +// @public +export interface ITigerPositiveAttributeFilter { + // (undocumented) + positiveAttributeFilter: { + displayForm: ObjRef; + in: ITigerAttributeElements; + localIdentifier?: string; + }; +} + +// @public +export interface ITigerPreviousPeriodMeasure { + // (undocumented) + alias?: string; + // (undocumented) + definition: ITigerPreviousPeriodMeasureDefinition; + // (undocumented) + format?: string; + // (undocumented) + localIdentifier: string; + // (undocumented) + title?: string; +} + +// @public (undocumented) +export interface ITigerPreviousPeriodMeasureDefinition { + // (undocumented) + previousPeriodMeasure: { + measureIdentifier: string; + dateDataSets: Array<{ + dataSet: ObjRef; + periodsAgo: number; + }>; + }; +} + // @public export interface ITigerRangeCondition { // (undocumented) @@ -19390,16 +20256,95 @@ export interface ITigerRangeConditionInCompound { }; } -// Warning: (ae-forgotten-export) The symbol "ITigerMeasureSortItem" needs to be exported by the entry point index.d.ts -// +// @public +export interface ITigerRankingFilter { + // (undocumented) + rankingFilter: { + measure: ObjRef; + attributes?: ObjRef[]; + operator: "TOP" | "BOTTOM"; + value: number; + localIdentifier?: string; + }; +} + +// @public +export interface ITigerRelativeDateFilter { + // (undocumented) + relativeDateFilter: { + dataSet: ObjRef; + granularity: string; + from: number; + to: number; + localIdentifier?: string; + }; +} + +// @public +export interface ITigerRichTextWidget extends ITigerBaseWidget { + // (undocumented) + content?: string; + // (undocumented) + type: "richText"; +} + +// @public +export interface ITigerSimpleMeasure { + // (undocumented) + alias?: string; + // (undocumented) + definition: ITigerSimpleMeasureDefinition; + // (undocumented) + format?: string; + // (undocumented) + localIdentifier: string; + // (undocumented) + title?: string; +} + +// @public (undocumented) +export interface ITigerSimpleMeasureDefinition { + // (undocumented) + measure: { + item: ObjRef; + aggregation?: "sum" | "count" | "avg" | "min" | "max" | "median" | "runsum"; + filters?: ITigerFilter[]; + computeRatio?: boolean; + }; +} + // @public export type ITigerSortItem = ITigerAttributeSortItem | ITigerMeasureSortItem; +// @public +export interface ITigerTotal { + // (undocumented) + alias?: string; + // (undocumented) + attributeIdentifier: string; + // (undocumented) + measureIdentifier: string; + // (undocumented) + type: "sum" | "avg" | "max" | "min" | "nat" | "med"; +} + +// @public +export interface ITigerTotalLocatorItem { + // (undocumented) + totalLocatorItem: { + attributeIdentifier: string; + totalFunction: string; + }; +} + // @public export type ITigerVisualizationProperties = { [key: string]: any; }; +// @public (undocumented) +export type ITigerWidget = ITigerInsightWidget | ITigerKpiWidget | ITigerRichTextWidget; + // @public @deprecated interface ITotalItem { // (undocumented) @@ -25998,7 +26943,7 @@ export interface KeyDriversResult { } // @public -export class KnowledgeAi extends BaseAPI implements KnowledgeAiInterface { +export class KnowledgeAi extends AiBaseAPI implements KnowledgeAiInterface { createDocument(requestParameters: KnowledgeAiCreateDocumentRequest, options?: AxiosRequestConfig): AxiosPromise; createOrgDocument(requestParameters: KnowledgeAiCreateOrgDocumentRequest, options?: AxiosRequestConfig): AxiosPromise; deleteDocument(requestParameters: KnowledgeAiDeleteDocumentRequest, options?: AxiosRequestConfig): AxiosPromise; @@ -26018,128 +26963,128 @@ export class KnowledgeAi extends BaseAPI implements KnowledgeAiInterface { } // @public -function KnowledgeAi_CreateDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiCreateDocumentRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function KnowledgeAi_CreateDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiCreateDocumentRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { KnowledgeAi_CreateDocument as GenAiApi_CreateKnowledgeDocument } export { KnowledgeAi_CreateDocument } // @public -function KnowledgeAi_CreateOrgDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiCreateOrgDocumentRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function KnowledgeAi_CreateOrgDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiCreateOrgDocumentRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { KnowledgeAi_CreateOrgDocument as GenAiApi_CreateOrgKnowledgeDocument } export { KnowledgeAi_CreateOrgDocument } // @public -function KnowledgeAi_DeleteDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiDeleteDocumentRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function KnowledgeAi_DeleteDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiDeleteDocumentRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { KnowledgeAi_DeleteDocument as GenAiApi_DeleteKnowledgeDocument } export { KnowledgeAi_DeleteDocument } // @public -function KnowledgeAi_DeleteOrgDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiDeleteOrgDocumentRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function KnowledgeAi_DeleteOrgDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiDeleteOrgDocumentRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { KnowledgeAi_DeleteOrgDocument as GenAiApi_DeleteOrgKnowledgeDocument } export { KnowledgeAi_DeleteOrgDocument } // @public -export function KnowledgeAi_DownloadDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiDownloadDocumentRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +export function KnowledgeAi_DownloadDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiDownloadDocumentRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; // @public -export function KnowledgeAi_DownloadOrgDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiDownloadOrgDocumentRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +export function KnowledgeAi_DownloadOrgDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiDownloadOrgDocumentRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; // @public -function KnowledgeAi_GetDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiGetDocumentRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function KnowledgeAi_GetDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiGetDocumentRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { KnowledgeAi_GetDocument as GenAiApi_GetKnowledgeDocument } export { KnowledgeAi_GetDocument } // @public -function KnowledgeAi_GetOrgDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiGetOrgDocumentRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function KnowledgeAi_GetOrgDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiGetOrgDocumentRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { KnowledgeAi_GetOrgDocument as GenAiApi_GetOrgKnowledgeDocument } export { KnowledgeAi_GetOrgDocument } // @public -function KnowledgeAi_ListDocuments(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiListDocumentsRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function KnowledgeAi_ListDocuments(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiListDocumentsRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { KnowledgeAi_ListDocuments as GenAiApi_ListKnowledgeDocuments } export { KnowledgeAi_ListDocuments } // @public -function KnowledgeAi_ListOrgDocuments(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiListOrgDocumentsRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function KnowledgeAi_ListOrgDocuments(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiListOrgDocumentsRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { KnowledgeAi_ListOrgDocuments as GenAiApi_ListOrgKnowledgeDocuments } export { KnowledgeAi_ListOrgDocuments } // @public -function KnowledgeAi_PatchDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiPatchDocumentRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function KnowledgeAi_PatchDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiPatchDocumentRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { KnowledgeAi_PatchDocument as GenAiApi_PatchKnowledgeDocument } export { KnowledgeAi_PatchDocument } // @public -function KnowledgeAi_PatchOrgDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiPatchOrgDocumentRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function KnowledgeAi_PatchOrgDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiPatchOrgDocumentRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { KnowledgeAi_PatchOrgDocument as GenAiApi_PatchOrgKnowledgeDocument } export { KnowledgeAi_PatchOrgDocument } // @public -function KnowledgeAi_SearchKnowledge(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiSearchKnowledgeRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function KnowledgeAi_SearchKnowledge(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiSearchKnowledgeRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { KnowledgeAi_SearchKnowledge as GenAiApi_SearchKnowledge } export { KnowledgeAi_SearchKnowledge } // @public -function KnowledgeAi_SearchOrgKnowledge(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiSearchOrgKnowledgeRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function KnowledgeAi_SearchOrgKnowledge(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiSearchOrgKnowledgeRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { KnowledgeAi_SearchOrgKnowledge as GenAiApi_SearchOrgKnowledge } export { KnowledgeAi_SearchOrgKnowledge } // @public -function KnowledgeAi_UpsertDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiUpsertDocumentRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function KnowledgeAi_UpsertDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiUpsertDocumentRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { KnowledgeAi_UpsertDocument as GenAiApi_UpsertKnowledgeDocument } export { KnowledgeAi_UpsertDocument } // @public -function KnowledgeAi_UpsertOrgDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiUpsertOrgDocumentRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function KnowledgeAi_UpsertOrgDocument(axios: AxiosInstance, basePath: string, requestParameters: KnowledgeAiUpsertOrgDocumentRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { KnowledgeAi_UpsertOrgDocument as GenAiApi_UpsertOrgKnowledgeDocument } export { KnowledgeAi_UpsertOrgDocument } // @public -export function KnowledgeAiAxiosParamCreator_CreateDocument(workspaceId: string, file: File, title?: string, scopes?: Array, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function KnowledgeAiAxiosParamCreator_CreateDocument(workspaceId: string, file: File, title?: string, scopes?: Array, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public -export function KnowledgeAiAxiosParamCreator_CreateOrgDocument(file: File, title?: string, scopes?: Array, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function KnowledgeAiAxiosParamCreator_CreateOrgDocument(file: File, title?: string, scopes?: Array, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public -export function KnowledgeAiAxiosParamCreator_DeleteDocument(workspaceId: string, documentId: string, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function KnowledgeAiAxiosParamCreator_DeleteDocument(workspaceId: string, documentId: string, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public -export function KnowledgeAiAxiosParamCreator_DeleteOrgDocument(documentId: string, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function KnowledgeAiAxiosParamCreator_DeleteOrgDocument(documentId: string, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public -export function KnowledgeAiAxiosParamCreator_DownloadDocument(workspaceId: string, documentId: string, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function KnowledgeAiAxiosParamCreator_DownloadDocument(workspaceId: string, documentId: string, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public -export function KnowledgeAiAxiosParamCreator_DownloadOrgDocument(documentId: string, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function KnowledgeAiAxiosParamCreator_DownloadOrgDocument(documentId: string, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public -export function KnowledgeAiAxiosParamCreator_GetDocument(workspaceId: string, documentId: string, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function KnowledgeAiAxiosParamCreator_GetDocument(workspaceId: string, documentId: string, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public -export function KnowledgeAiAxiosParamCreator_GetOrgDocument(documentId: string, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function KnowledgeAiAxiosParamCreator_GetOrgDocument(documentId: string, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public -export function KnowledgeAiAxiosParamCreator_ListDocuments(workspaceId: string, scopes?: Array, size?: number, pageToken?: string, metaInclude?: string, state?: 'enabled' | 'disabled', query?: string, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function KnowledgeAiAxiosParamCreator_ListDocuments(workspaceId: string, scopes?: Array, size?: number, pageToken?: string, metaInclude?: string, state?: 'enabled' | 'disabled', query?: string, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public -export function KnowledgeAiAxiosParamCreator_ListOrgDocuments(scopes?: Array, size?: number, pageToken?: string, metaInclude?: string, state?: 'enabled' | 'disabled', query?: string, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function KnowledgeAiAxiosParamCreator_ListOrgDocuments(scopes?: Array, size?: number, pageToken?: string, metaInclude?: string, state?: 'enabled' | 'disabled', query?: string, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public -export function KnowledgeAiAxiosParamCreator_PatchDocument(workspaceId: string, documentId: string, aiPatchDocumentRequest: AiPatchDocumentRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function KnowledgeAiAxiosParamCreator_PatchDocument(workspaceId: string, documentId: string, aiPatchDocumentRequest: AiPatchDocumentRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public -export function KnowledgeAiAxiosParamCreator_PatchOrgDocument(documentId: string, aiPatchDocumentRequest: AiPatchDocumentRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function KnowledgeAiAxiosParamCreator_PatchOrgDocument(documentId: string, aiPatchDocumentRequest: AiPatchDocumentRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public -export function KnowledgeAiAxiosParamCreator_SearchKnowledge(workspaceId: string, query: string, limit?: number, minScore?: number, scopes?: Array, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function KnowledgeAiAxiosParamCreator_SearchKnowledge(workspaceId: string, query: string, limit?: number, minScore?: number, scopes?: Array, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public -export function KnowledgeAiAxiosParamCreator_SearchOrgKnowledge(query: string, limit?: number, minScore?: number, scopes?: Array, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function KnowledgeAiAxiosParamCreator_SearchOrgKnowledge(query: string, limit?: number, minScore?: number, scopes?: Array, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public -export function KnowledgeAiAxiosParamCreator_UpsertDocument(workspaceId: string, file: File, title?: string, scopes?: Array, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function KnowledgeAiAxiosParamCreator_UpsertDocument(workspaceId: string, file: File, title?: string, scopes?: Array, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public -export function KnowledgeAiAxiosParamCreator_UpsertOrgDocument(file: File, title?: string, scopes?: Array, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function KnowledgeAiAxiosParamCreator_UpsertOrgDocument(file: File, title?: string, scopes?: Array, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public interface KnowledgeAiCreateDocumentRequest { @@ -27302,6 +28247,19 @@ export interface ListLinks { 'self': string; } +// @public (undocumented) +export interface ListLlmProviderModelsRequest { + // (undocumented) + 'providerConfig': TestLlmProviderByIdRequestProviderConfig; +} + +// @public (undocumented) +export interface ListLlmProviderModelsResponse { + 'message': string; + 'models': Array; + 'success': boolean; +} + // @public export class LlmEndpointControllerApi extends MetadataBaseApi implements LlmEndpointControllerApiInterface { // @deprecated @@ -27516,6 +28474,15 @@ export interface LLMEndpointsApiUpdateEntityLlmEndpointsRequest { readonly jsonApiLlmEndpointInDocument: JsonApiLlmEndpointInDocument; } +// @public +export interface LlmModel { + 'family': LlmModelFamilyEnum; + 'id': string; +} + +// @public (undocumented) +export type LlmModelFamilyEnum = 'OPENAI' | 'ANTHROPIC' | 'META' | 'MISTRAL' | 'AMAZON' | 'GOOGLE' | 'COHERE' | 'UNKNOWN'; + // @public (undocumented) export interface LlmProviderAuth { // (undocumented) @@ -27809,6 +28776,9 @@ export interface MatchAttributeFilterMatchAttributeFilter { // @public (undocumented) export type MatchAttributeFilterMatchAttributeFilterMatchTypeEnum = 'STARTS_WITH' | 'ENDS_WITH' | 'CONTAINS'; +// @public +export type MdAutomationAlertCondition = AnomalyDetectionWrapper | ComparisonWrapper | RangeWrapper | RelativeWrapper; + // @public export type MeasureDefinition = ArithmeticMeasureDefinition | InlineMeasureDefinition | PopMeasureDefinition | SimpleMeasureDefinition; @@ -27847,7 +28817,7 @@ export interface MeasureResultHeader { export type MeasureValueCondition = ComparisonCondition | RangeCondition; // @public -export type MeasureValueFilter = AfmComparisonMeasureValueFilter | CompoundMeasureValueFilter_2 | AfmRangeMeasureValueFilter; +export type MeasureValueFilter = AfmComparisonMeasureValueFilter | AfmCompoundMeasureValueFilter | AfmRangeMeasureValueFilter; // @public export class MemoryItemControllerApi extends MetadataBaseApi implements MemoryItemControllerApiInterface { @@ -27977,17 +28947,17 @@ export interface MemoryItemControllerApiUpdateEntityMemoryItemsRequest { } // @public -export class MessagesAi extends BaseAPI implements MessagesAiInterface { +export class MessagesAi extends AiBaseAPI implements MessagesAiInterface { postMessagesApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdMessagesPost(requestParameters: MessagesAiPostMessagesApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdMessagesPostRequest, options?: AxiosRequestConfig): AxiosPromise; } // @public -function MessagesAi_PostMessagesApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdMessagesPost(axios: AxiosInstance, basePath: string, requestParameters: MessagesAiPostMessagesApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdMessagesPostRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function MessagesAi_PostMessagesApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdMessagesPost(axios: AxiosInstance, basePath: string, requestParameters: MessagesAiPostMessagesApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdMessagesPostRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { MessagesAi_PostMessagesApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdMessagesPost as GenAiApi_PostMessages } export { MessagesAi_PostMessagesApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdMessagesPost } // @public -export function MessagesAiAxiosParamCreator_PostMessagesApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdMessagesPost(workspaceId: string, conversationId: string, aiSendMessageRequest: AiSendMessageRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function MessagesAiAxiosParamCreator_PostMessagesApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdMessagesPost(workspaceId: string, conversationId: string, aiSendMessageRequest: AiSendMessageRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public export interface MessagesAiInterface { @@ -28056,6 +29026,9 @@ export type MetadataGetEntitiesColorPaletteParams = { // @internal export type MetadataGetEntitiesFn = (params: P, options: MetadataGetEntitiesOptions) => AxiosPromise; +// @internal (undocumented) +export type MetadataGetEntitiesFnNew = (axios: AxiosInstance, basePath: string, params: P, options: MetadataGetEntitiesOptions) => AxiosPromise; + // @internal export type MetadataGetEntitiesOptions = { headers?: object; @@ -28132,8 +29105,6 @@ export interface MetadataSyncApiMetadataSyncRequest { // @internal export class MetadataUtilities { static filterValidEntities(result: T): T; - // Warning: (ae-forgotten-export) The symbol "MetadataGetEntitiesFnNew" needs to be exported by the entry point index.d.ts - // // (undocumented) static getAllPagesOf: (client: ITigerClientBase, entitiesGet: MetadataGetEntitiesFnNew, params: P, options?: MetadataGetEntitiesOptions) => Promise; static getAllPagesOfParallel: (client: ITigerClientBase, entitiesGet: MetadataGetEntitiesFnNew, params: P, options?: MetadataGetEntitiesOptions) => Promise; @@ -28458,6 +29429,13 @@ export type ModelFileTranslateEnum = 'YES' | 'NO'; // @public (undocumented) export type ModelFileTrgDirEnum = 'LTR' | 'RTL' | 'AUTO'; +// @public +export interface ModelTestResult { + 'message': string; + 'modelId': string; + 'successful': boolean; +} + // @public export interface NegativeAttributeFilter { // (undocumented) @@ -28893,6 +29871,44 @@ export interface ObjectLinksContainer { 'links'?: ObjectLinks; } +// @public (undocumented) +export interface ObjectReference { + 'id': string; + 'type': ObjectReferenceTypeEnum; +} + +// @public (undocumented) +export interface ObjectReferenceGroup { + // (undocumented) + 'context'?: ObjectReference; + 'objects': Array; +} + +// @public (undocumented) +export type ObjectReferenceTypeEnum = 'WIDGET' | 'METRIC' | 'ATTRIBUTE' | 'DASHBOARD'; + +// @public +export interface OGCAPIFeaturesApiGetCollectionItemsRequest { + readonly bbox?: string; + readonly collectionId: string; + readonly limit?: number; + readonly values?: Array; +} + +// @public +export interface OGCAPIFeaturesApiGetCustomCollectionItemsRequest { + readonly bbox?: string; + readonly collectionId: string; + readonly limit?: number; + readonly values?: Array; +} + +// @public +export interface OGCAPIFeaturesApiInterface { + getCollectionItems(requestParameters: OGCAPIFeaturesApiGetCollectionItemsRequest, options?: AxiosRequestConfig): AxiosPromise; + getCustomCollectionItems(requestParameters: OGCAPIFeaturesApiGetCustomCollectionItemsRequest, options?: AxiosRequestConfig): AxiosPromise; +} + // @public (undocumented) export interface OpenAiApiKeyAuth { 'apiKey'?: string | null; @@ -29256,6 +30272,9 @@ export interface OrganizationEntityControllerApiUpdateEntityOrganizationsRequest // @internal export type OrganizationGetEntitiesFn = (params: P, options: AxiosRequestConfig) => AxiosPromise; +// @internal +export type OrganizationGetEntitiesFnNew = (axios: AxiosInstance, basePath: string, params: P, options: AxiosRequestConfig) => AxiosPromise; + // @internal export type OrganizationGetEntitiesParams = EntitiesApiGetAllEntitiesAttributesRequest | EntitiesApiGetAllEntitiesFactsRequest | EntitiesApiGetAllEntitiesAnalyticalDashboardsRequest | EntitiesApiGetAllEntitiesDashboardPluginsRequest | EntitiesApiGetAllEntitiesVisualizationObjectsRequest | EntitiesApiGetAllEntitiesMetricsRequest | EntitiesApiGetAllEntitiesWorkspacesRequest | EntitiesApiGetAllEntitiesExportDefinitionsRequest; @@ -29373,13 +30392,45 @@ export interface OrganizationSettingControllerApiUpdateEntityOrganizationSetting // @internal export class OrganizationUtilities { - // Warning: (ae-forgotten-export) The symbol "OrganizationGetEntitiesFnNew" needs to be exported by the entry point index.d.ts - // // (undocumented) static getAllPagesOf: (client: ITigerClientBase, entitiesGet: OrganizationGetEntitiesFnNew, params: P, options?: AxiosRequestConfig) => Promise; static mergeEntitiesResults(pages: T[]): T; } +// @public (undocumented) +export interface OutlierDetectionRequest { + 'attributes': Array; + 'auxMeasures'?: Array; + 'filters': Array; + 'granularity': OutlierDetectionRequestGranularityEnum; + // (undocumented) + 'measures': Array; + 'sensitivity': OutlierDetectionRequestSensitivityEnum; +} + +// @public +export type OutlierDetectionRequestFiltersInner = AbstractMeasureValueFilter | AfmFilterDefinitionForSimpleMeasure | AfmInlineFilterDefinition; + +// @public (undocumented) +export type OutlierDetectionRequestGranularityEnum = 'HOUR' | 'DAY' | 'WEEK' | 'MONTH' | 'QUARTER' | 'YEAR'; + +// @public (undocumented) +export type OutlierDetectionRequestSensitivityEnum = 'LOW' | 'MEDIUM' | 'HIGH'; + +// @public (undocumented) +export interface OutlierDetectionResponse { + // (undocumented) + 'links': ExecutionLinks; +} + +// @public (undocumented) +export interface OutlierDetectionResult { + 'attribute': Array | null; + 'values': { + [key: string]: Array | null; + } | null; +} + // @public (undocumented) export interface Over { // (undocumented) @@ -29544,6 +30595,15 @@ export interface ParameterItem { 'value': string; } +// @public +interface ParameterItem_2 { + // (undocumented) + 'parameter': AfmAfmObjectIdentifierParameter; + 'value': string; +} +export { ParameterItem_2 as AfmParameterItem } +export { ParameterItem_2 as LabelElementsParameterItem } + // @public export class ParametersApi extends MetadataBaseApi implements ParametersApiInterface { createEntityParameters(requestParameters: ParametersApiCreateEntityParametersRequest, options?: AxiosRequestConfig): AxiosPromise; @@ -30138,6 +31198,9 @@ export type ProfileApiInterface = { getCurrentWithDetails: () => Promise; }; +// @public (undocumented) +export type QualityIssueSeverityEnum = 'WARNING' | 'INFO'; + // @public (undocumented) interface Range_2 { // (undocumented) @@ -30319,6 +31382,18 @@ export interface ReadCsvFileManifestsResponse { 'version': number; } +// @public +export interface Reasoning { + 'answer'?: string; + 'steps': Array; +} + +// @public +export interface ReasoningStep { + 'thoughts': Array; + 'title': string; +} + // @public export interface ReferenceIdentifier { 'id': string; @@ -30451,6 +31526,23 @@ export interface ResolvedLlmEndpoints { 'data': Array; } +// @public (undocumented) +export interface ResolvedLlmProvider { + 'id': string; + // (undocumented) + 'models': Array; + 'title': string; +} + +// @public (undocumented) +export interface ResolvedLlms { + // (undocumented) + 'data'?: ResolvedLlmsData; +} + +// @public +export type ResolvedLlmsData = ResolvedLlmEndpoint | ResolvedLlmProvider; + // @public export interface ResolvedSetting { 'content'?: object | null; @@ -30468,26 +31560,26 @@ export interface ResolveSettingsRequest { } // @public -export class ResponsesAi extends BaseAPI implements ResponsesAiInterface { +export class ResponsesAi extends AiBaseAPI implements ResponsesAiInterface { getConversationResponsesApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdResponsesGet(requestParameters: ResponsesAiGetConversationResponsesApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdResponsesGetRequest, options?: AxiosRequestConfig): AxiosPromise; patchResponseApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdResponsesResponseIdPatch(requestParameters: ResponsesAiPatchResponseApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdResponsesResponseIdPatchRequest, options?: AxiosRequestConfig): AxiosPromise; } // @public -function ResponsesAi_GetConversationResponsesApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdResponsesGet(axios: AxiosInstance, basePath: string, requestParameters: ResponsesAiGetConversationResponsesApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdResponsesGetRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function ResponsesAi_GetConversationResponsesApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdResponsesGet(axios: AxiosInstance, basePath: string, requestParameters: ResponsesAiGetConversationResponsesApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdResponsesGetRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { ResponsesAi_GetConversationResponsesApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdResponsesGet as GenAiApi_GetConversationResponses } export { ResponsesAi_GetConversationResponsesApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdResponsesGet } // @public -function ResponsesAi_PatchResponseApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdResponsesResponseIdPatch(axios: AxiosInstance, basePath: string, requestParameters: ResponsesAiPatchResponseApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdResponsesResponseIdPatchRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function ResponsesAi_PatchResponseApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdResponsesResponseIdPatch(axios: AxiosInstance, basePath: string, requestParameters: ResponsesAiPatchResponseApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdResponsesResponseIdPatchRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { ResponsesAi_PatchResponseApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdResponsesResponseIdPatch as GenAiApi_PatchConversationResponse } export { ResponsesAi_PatchResponseApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdResponsesResponseIdPatch } // @public -export function ResponsesAiAxiosParamCreator_GetConversationResponsesApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdResponsesGet(workspaceId: string, conversationId: string, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function ResponsesAiAxiosParamCreator_GetConversationResponsesApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdResponsesGet(workspaceId: string, conversationId: string, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public -export function ResponsesAiAxiosParamCreator_PatchResponseApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdResponsesResponseIdPatch(workspaceId: string, conversationId: string, responseId: string, aiResponseFeedbackRequest: AiResponseFeedbackRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function ResponsesAiAxiosParamCreator_PatchResponseApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdResponsesResponseIdPatch(workspaceId: string, conversationId: string, responseId: string, aiResponseFeedbackRequest: AiResponseFeedbackRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public interface ResponsesAiGetConversationResponsesApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdResponsesGetRequest { @@ -30525,16 +31617,10 @@ export interface RestApiIdentifier { export interface ResultActionsApiInterface { analyzeCsv(requestParameters: ActionsApiAnalyzeCsvRequest, options?: AxiosRequestConfig): AxiosPromise>; collectCacheUsage(options?: AxiosRequestConfig): AxiosPromise; - // Warning: (ae-forgotten-export) The symbol "ActionsApiConvertGeoFileRequest" needs to be exported by the entry point index.d.ts - // Warning: (ae-forgotten-export) The symbol "ConvertGeoFileResponse" needs to be exported by the entry point index.d.ts convertGeoFile(requestParameters: ActionsApiConvertGeoFileRequest, options?: AxiosRequestConfig): AxiosPromise; - // Warning: (ae-forgotten-export) The symbol "ActionsApiCustomGeoCollectionStagingUploadRequest" needs to be exported by the entry point index.d.ts - // Warning: (ae-forgotten-export) The symbol "UploadGeoCollectionFileResponse" needs to be exported by the entry point index.d.ts customGeoCollectionStagingUpload(requestParameters: ActionsApiCustomGeoCollectionStagingUploadRequest, options?: AxiosRequestConfig): AxiosPromise; deleteFiles(requestParameters: ActionsApiDeleteFilesRequest, options?: AxiosRequestConfig): AxiosPromise; importCsv(requestParameters: ActionsApiImportCsvRequest, options?: AxiosRequestConfig): AxiosPromise>; - // Warning: (ae-forgotten-export) The symbol "ActionsApiImportCustomGeoCollectionRequest" needs to be exported by the entry point index.d.ts - // Warning: (ae-forgotten-export) The symbol "ImportGeoCollectionResponse" needs to be exported by the entry point index.d.ts importCustomGeoCollection(requestParameters: ActionsApiImportCustomGeoCollectionRequest, options?: AxiosRequestConfig): AxiosPromise; listFiles(requestParameters: ActionsApiListFilesRequest, options?: AxiosRequestConfig): AxiosPromise>; readCsvFileManifests(requestParameters: ActionsApiReadCsvFileManifestsRequest, options?: AxiosRequestConfig): AxiosPromise>; @@ -30643,8 +31729,6 @@ export interface ScanModelActionsApiInterface { getDataSourceSchemata(requestParameters: ActionsApiGetDataSourceSchemataRequest, options?: AxiosRequestConfig): AxiosPromise; scanDataSource(requestParameters: ActionsApiScanDataSourceRequest, options?: AxiosRequestConfig): AxiosPromise; scanSql(requestParameters: ActionsApiScanSqlRequest, options?: AxiosRequestConfig): AxiosPromise; - // Warning: (ae-forgotten-export) The symbol "ActionsApiScanStatisticsRequest" needs to be exported by the entry point index.d.ts - // Warning: (ae-forgotten-export) The symbol "TableStatisticsResponse" needs to be exported by the entry point index.d.ts scanStatistics(requestParameters: ActionsApiScanStatisticsRequest, options?: AxiosRequestConfig): AxiosPromise; testDataSource(requestParameters: ActionsApiTestDataSourceRequest, options?: AxiosRequestConfig): AxiosPromise; testDataSourceDefinition(requestParameters: ActionsApiTestDataSourceDefinitionRequest, options?: AxiosRequestConfig): AxiosPromise; @@ -30661,6 +31745,17 @@ export class ScanModelBaseApi { protected configuration: ScanModelConfiguration | undefined; } +// @public (undocumented) +export interface ScanModelColumnStatisticsEntry { + // (undocumented) + 'columnName': string; + 'dataSize'?: number; + 'max'?: string; + 'min'?: string; + 'ndv'?: number; + 'nullCount'?: number; +} + // @public (undocumented) export class ScanModelConfiguration { constructor(param?: ScanModelConfigurationParameters); @@ -30731,6 +31826,18 @@ export interface ScanModelRequestArgs { url: string; } +// @public (undocumented) +export interface ScanModelTableStatisticsEntry { + // (undocumented) + 'columns': Array; + 'dataSize'?: number; + 'rowCount'?: number; + // (undocumented) + 'schemaName': string; + // (undocumented) + 'tableName': string; +} + // @public export interface ScanRequest { 'scanTables': boolean; @@ -31109,6 +32216,30 @@ export interface TableStatisticsEntry { 'tableName': string; } +// @public (undocumented) +export interface TableStatisticsRequest { + // (undocumented) + 'schemata': Array; + // (undocumented) + 'tableNames'?: Array; +} + +// @public (undocumented) +export interface TableStatisticsResponse { + // (undocumented) + 'tables': Array; + // (undocumented) + 'warnings': Array; +} + +// @public (undocumented) +export interface TableStatisticsWarning { + // (undocumented) + 'message': string; + // (undocumented) + 'tableName'?: string; +} + // @public export interface TableWarning { // (undocumented) @@ -31205,6 +32336,30 @@ export interface TestDefinitionRequest { // @public (undocumented) export type TestDefinitionRequestTypeEnum = 'POSTGRESQL' | 'REDSHIFT' | 'VERTICA' | 'SNOWFLAKE' | 'ADS' | 'BIGQUERY' | 'MSSQL' | 'PRESTO' | 'DREMIO' | 'DRILL' | 'GREENPLUM' | 'AZURESQL' | 'SYNAPSESQL' | 'DATABRICKS' | 'GDSTORAGE' | 'CLICKHOUSE' | 'MYSQL' | 'MARIADB' | 'ORACLE' | 'PINOT' | 'SINGLESTORE' | 'MOTHERDUCK' | 'FLEXCONNECT' | 'STARROCKS' | 'ATHENA' | 'MONGODB' | 'CRATEDB' | 'AILAKEHOUSE'; +// @public (undocumented) +export interface TestLlmProviderByIdRequest { + 'models'?: Array; + // (undocumented) + 'providerConfig'?: TestLlmProviderByIdRequestProviderConfig; +} + +// @public +export type TestLlmProviderByIdRequestProviderConfig = AfmAwsBedrockProviderConfig | AfmAzureFoundryProviderConfig | AfmOpenAIProviderConfig; + +// @public (undocumented) +export interface TestLlmProviderDefinitionRequest { + 'models'?: Array; + // (undocumented) + 'providerConfig': TestLlmProviderByIdRequestProviderConfig; +} + +// @public (undocumented) +export interface TestLlmProviderResponse { + 'modelResults': Array; + 'providerMessage': string; + 'providerReachable': boolean; +} + // @public export interface TestQueryDuration { 'createCacheTable'?: number; @@ -31329,6 +32484,11 @@ export interface ThemeControllerApiUpdateEntityThemesRequest { readonly jsonApiThemeInDocument: JsonApiThemeInDocument; } +// @public +export interface Thought { + 'text': string; +} + // @public (undocumented) export const tigerActionsClientFactory: (axios: AxiosInstance) => ActionsApiInterface; @@ -31347,6 +32507,9 @@ export const tigerClientBaseFactory: (axios: AxiosInstance, basePath?: string) = // @public @deprecated export const tigerClientFactory: (axios: AxiosInstance) => ITigerClient; +// @public (undocumented) +export const tigerEntitiesObjectsClientFactory: (axios: AxiosInstance) => EntitiesApiInterface; + // @public export const tigerExecutionClientFactory: (axios: AxiosInstance) => Pick; @@ -31359,6 +32522,9 @@ export const tigerExportClientFactory: (axios: AxiosInstance) => ActionsExportIn // @public export const tigerGenAIClientFactory: (axios: AxiosInstance) => Pick; +// @public (undocumented) +export const tigerGeoCollectionsClientFactory: (axios: AxiosInstance) => OGCAPIFeaturesApiInterface; + // @public (undocumented) export const tigerLabelElementsClientFactory: (axios: AxiosInstance) => Pick; @@ -31389,6 +32555,13 @@ export const tigerValidDescendantsClientFactory: (axios: AxiosInstance) => Pick< // @public (undocumented) export const tigerValidObjectsClientFactory: (axios: AxiosInstance) => Pick; +// @public +export interface ToolCallEventResult { + 'functionArguments': string; + 'functionName': string; + 'result': string; +} + // @public export interface Total { 'function': TotalFunctionEnum; @@ -31485,11 +32658,54 @@ export interface TranslationsApiSetTranslationsRequest { readonly xliff: Xliff; } +// @public +export interface TrendingObjectItem { + 'createdAt'?: string; + 'createdBy'?: string; + 'datasetId'?: string; + 'datasetTitle'?: string; + 'datasetType'?: string; + 'description'?: string; + 'id': string; + 'isHidden'?: boolean; + 'isHiddenFromKda'?: boolean; + 'metricType'?: string; + 'modifiedAt'?: string; + 'modifiedBy'?: string; + // (undocumented) + 'tags': Array; + 'title': string; + 'type': string; + 'usageCount': number; + 'visualizationUrl'?: string; + 'workspaceId': string; +} + +// @public (undocumented) +export interface TrendingObjectsResult { + // (undocumented) + 'objects': Array; +} + +// @public (undocumented) +export type TriggerQualityIssuesCalculationResponseStatusEnum = 'RUNNING' | 'COMPLETED' | 'FAILED' | 'CANCELLED' | 'DISABLED'; + +// @public +export interface UIContext { + // (undocumented) + 'dashboard'?: DashboardContext; +} + // @public export interface UploadFileResponse { 'location': string; } +// @public +export interface UploadGeoCollectionFileResponse { + 'location': string; +} + // @public export class UsageApi extends MetadataBaseApi implements UsageApiInterface { allPlatformUsage(options?: AxiosRequestConfig): AxiosPromise; @@ -31531,10 +32747,7 @@ export interface UserAssignee { export interface UserContext { // (undocumented) 'activeObject'?: ActiveObjectIdentification; - // Warning: (ae-forgotten-export) The symbol "ObjectReferenceGroup" needs to be exported by the entry point index.d.ts 'referencedObjects'?: Array; - // Warning: (ae-forgotten-export) The symbol "UIContext" needs to be exported by the entry point index.d.ts - // // (undocumented) 'view'?: UIContext; } @@ -33163,6 +34376,13 @@ export interface VisualizationObjectControllerApiUpdateEntityVisualizationObject readonly workspaceId: string; } +// @public (undocumented) +export interface VisualizationObjectExecution { + 'filters'?: Array; + // (undocumented) + 'settings'?: AfmExecutionSettings; +} + declare namespace VisualizationObjectModelV1 { export { isVisualizationObject, @@ -33187,17 +34407,17 @@ declare namespace VisualizationObjectModelV2 { export { VisualizationObjectModelV2 } // @public -export class VisualizationsAi extends BaseAPI implements VisualizationsAiInterface { +export class VisualizationsAi extends AiBaseAPI implements VisualizationsAiInterface { patchVisualizationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdVisualizationsVisualizationIdPatch(requestParameters: VisualizationsAiPatchVisualizationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdVisualizationsVisualizationIdPatchRequest, options?: AxiosRequestConfig): AxiosPromise; } // @public -function VisualizationsAi_PatchVisualizationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdVisualizationsVisualizationIdPatch(axios: AxiosInstance, basePath: string, requestParameters: VisualizationsAiPatchVisualizationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdVisualizationsVisualizationIdPatchRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): AxiosPromise; +function VisualizationsAi_PatchVisualizationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdVisualizationsVisualizationIdPatch(axios: AxiosInstance, basePath: string, requestParameters: VisualizationsAiPatchVisualizationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdVisualizationsVisualizationIdPatchRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): AxiosPromise; export { VisualizationsAi_PatchVisualizationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdVisualizationsVisualizationIdPatch as GenAiApi_PatchVisualization } export { VisualizationsAi_PatchVisualizationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdVisualizationsVisualizationIdPatch } // @public -export function VisualizationsAiAxiosParamCreator_PatchVisualizationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdVisualizationsVisualizationIdPatch(workspaceId: string, conversationId: string, visualizationId: string, aiVisualizationIdUpdateRequest: AiVisualizationIdUpdateRequest, options?: AxiosRequestConfig, configuration?: Configuration_2): Promise; +export function VisualizationsAiAxiosParamCreator_PatchVisualizationApiV1AiWorkspacesWorkspaceIdChatConversationsConversationIdVisualizationsVisualizationIdPatch(workspaceId: string, conversationId: string, visualizationId: string, aiVisualizationIdUpdateRequest: AiVisualizationIdUpdateRequest, options?: AxiosRequestConfig, configuration?: AiConfiguration): Promise; // @public export interface VisualizationsAiInterface { @@ -33246,6 +34466,18 @@ export interface WhatIfScenarioItem { 'label': string; } +// @public +export interface WidgetDescriptor { + // (undocumented) + 'filters'?: Array; + // (undocumented) + 'title': string; + // (undocumented) + 'widgetId': string; + // (undocumented) + 'widgetType': string; +} + // @public export interface WidgetSlidesTemplate { 'appliedOn': Array; @@ -33256,6 +34488,46 @@ export interface WidgetSlidesTemplate { // @public (undocumented) export type WidgetSlidesTemplateAppliedOnEnum = 'PDF' | 'PPTX'; +// @public (undocumented) +export interface WorkflowDashboardSummaryRequestDto { + // (undocumented) + 'customUserPrompt'?: string; + // (undocumented) + 'dashboardId': string; + // (undocumented) + 'keyMetricIds'?: Array; + // (undocumented) + 'referenceQuarter'?: string; +} + +// @public (undocumented) +export interface WorkflowDashboardSummaryResponseDto { + // (undocumented) + 'message': string; + // (undocumented) + 'runId': string; + // (undocumented) + 'status': string; +} + +// @public (undocumented) +export interface WorkflowStatusResponseDto { + // (undocumented) + 'currentPhase'?: string; + // (undocumented) + 'error'?: string; + // (undocumented) + 'message': string; + // (undocumented) + 'result'?: { + [key: string]: object; + }; + // (undocumented) + 'runId': string; + // (undocumented) + 'status': string; +} + // @public (undocumented) export interface WorkspaceAutomationIdentifier { // (undocumented) @@ -34290,10 +35562,4 @@ export interface Xliff { 'version'?: string; } -// Warnings were encountered during analysis: -// -// esm/gd-tiger-model/TigerTypes.d.ts:681:9 - (ae-forgotten-export) The symbol "ITigerDashboardAttributeFilterParent" needs to be exported by the entry point index.d.ts -// esm/gd-tiger-model/TigerTypes.d.ts:682:9 - (ae-forgotten-export) The symbol "ITigerDashboardAttributeFilterByDate" needs to be exported by the entry point index.d.ts -// esm/locationStyle.d.ts:44:5 - (ae-forgotten-export) The symbol "ILocationStyleListItem" needs to be exported by the entry point index.d.ts - ``` diff --git a/libs/api-client-tiger/package.json b/libs/api-client-tiger/package.json index a7bbd0e76d0..217afa149a2 100644 --- a/libs/api-client-tiger/package.json +++ b/libs/api-client-tiger/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/api-client-tiger", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "API Client for GoodData Cloud and GoodData.CN", "license": "MIT", "author": "GoodData", @@ -50,7 +50,7 @@ "build-check": "tsgo", "build-dynamic-files": "bash scripts/build.sh --genFilesOnly", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage *.log tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage temp *.log tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", diff --git a/libs/api-client-tiger/src/endpoints/entitiesObjects/index.ts b/libs/api-client-tiger/src/endpoints/entitiesObjects/index.ts index ba257158142..ebcecf7c829 100644 --- a/libs/api-client-tiger/src/endpoints/entitiesObjects/index.ts +++ b/libs/api-client-tiger/src/endpoints/entitiesObjects/index.ts @@ -51,6 +51,7 @@ export { FilterContextApi_CreateEntityFilterContexts, FilterContextApi_GetEntityFilterContexts, FilterContextApi_UpdateEntityFilterContexts, + FilterContextApi_DeleteEntityFilterContexts, type FilterContextApiCreateEntityFilterContextsRequest, type FilterContextApiGetEntityFilterContextsRequest, type FilterContextApiUpdateEntityFilterContextsRequest, diff --git a/libs/api-client-tiger/src/gd-tiger-model/TigerTypes.ts b/libs/api-client-tiger/src/gd-tiger-model/TigerTypes.ts index 0808841a1e6..adcfb0db396 100644 --- a/libs/api-client-tiger/src/gd-tiger-model/TigerTypes.ts +++ b/libs/api-client-tiger/src/gd-tiger-model/TigerTypes.ts @@ -891,4 +891,9 @@ export interface ITigerDashboardTab { attributeFilterConfigs?: ITigerDashboardAttributeFilterConfig[]; measureValueFilterConfigs?: ITigerDashboardMeasureValueFilterConfig[]; filterGroupsConfig?: ITigerDashboardFilterGroupsConfig; + /** + * Tab-scoped parameter overrides. + * @alpha + */ + parameters?: ITigerDashboardParameter[]; } diff --git a/libs/api-client-tiger/src/generated/ai-json-api/api.ts b/libs/api-client-tiger/src/generated/ai-json-api/api.ts index a4c88966c05..9ee5af69efe 100644 --- a/libs/api-client-tiger/src/generated/ai-json-api/api.ts +++ b/libs/api-client-tiger/src/generated/ai-json-api/api.ts @@ -160,6 +160,10 @@ export interface AiConversationResponse { * Whether this is a preview conversation. */ 'isPreview'?: boolean; + /** + * Whether this conversation is pinned by the user. + */ + 'pinned'?: boolean; /** * Conversation creation timestamp (ISO-8601 UTC). */ @@ -199,6 +203,7 @@ export interface AiConversationTurnResponse { */ export interface AiConversationUpdateRequest { 'title'?: string | null; + 'pinned'?: boolean | null; } export interface AiDateFilterAbsolute { diff --git a/libs/api-client-tiger/src/generated/ai-json-api/openapi-spec.json b/libs/api-client-tiger/src/generated/ai-json-api/openapi-spec.json index 6e8da6bf6c9..28be123a7e4 100644 --- a/libs/api-client-tiger/src/generated/ai-json-api/openapi-spec.json +++ b/libs/api-client-tiger/src/generated/ai-json-api/openapi-spec.json @@ -2219,6 +2219,12 @@ "description": "Whether this is a preview conversation.", "default": false }, + "pinned": { + "type": "boolean", + "title": "Pinned", + "description": "Whether this conversation is pinned by the user.", + "default": false + }, "createdAt": { "type": "string", "title": "Createdat", @@ -2324,6 +2330,17 @@ } ], "title": "Title" + }, + "pinned": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Pinned" } }, "type": "object", diff --git a/libs/api-client-tiger/src/index.ts b/libs/api-client-tiger/src/index.ts index 746f09bc158..0a6085afc4c 100644 --- a/libs/api-client-tiger/src/index.ts +++ b/libs/api-client-tiger/src/index.ts @@ -54,9 +54,13 @@ export { export { Configuration as LabelElementsConfiguration, type ConfigurationParameters as LabelElementsConfigurationParameters, + type ParameterItem as LabelElementsParameterItem, } from "./generated/afm-rest-api/index.js"; -export type { ActionsApiInterface as ResultActionsApiInterface } from "./generated/result-json-api/index.js"; +export type { + ActionsApiInterface as ResultActionsApiInterface, + OGCAPIFeaturesApiInterface, +} from "./generated/result-json-api/index.js"; // ----------------------------------------------------------------------------- // Specific API Interfaces @@ -66,6 +70,7 @@ export { type LocationStyleApiInterface, type LocationStyleDocument, type ILocationStyleParams, + type ILocationStyleListItem, tigerLocationStyleClientFactory, } from "./locationStyle.js"; @@ -84,7 +89,7 @@ export { // Client Factories // ----------------------------------------------------------------------------- -// export { tigerEntitiesObjectsClientFactory } from "./entitiesObjects.js"; +export { tigerEntitiesObjectsClientFactory } from "./entitiesObjects.js"; export { tigerClientBaseFactory, type ITigerClient, type ITigerClientBase, tigerClientFactory }; export { tigerActionsClientFactory } from "./actions.js"; @@ -96,7 +101,7 @@ export { tigerExecutionResultClientFactory } from "./executionResult.js"; export { tigerExportClientFactory } from "./export.js"; export { tigerLabelElementsClientFactory } from "./labelElements.js"; export { tigerLayoutClientFactory } from "./layout.js"; -export { tigerResultClientFactory } from "./result.js"; +export { tigerResultClientFactory, tigerGeoCollectionsClientFactory } from "./result.js"; export { tigerScanModelClientFactory } from "./scanModel.js"; export { tigerSmartFunctionsClientFactory } from "./smartFunctions.js"; export { tigerUserManagementClientFactory } from "./userManagement.js"; @@ -108,9 +113,14 @@ export { tigerValidObjectsClientFactory } from "./validObjects.js"; // ----------------------------------------------------------------------------- export * from "./generated/ai-json-api/api.js"; + +export { BaseAPI as AiBaseAPI, type RequestArgs as AiRequestArgs } from "./generated/ai-json-api/base.js"; export { tigerGenAIClientFactory } from "./genAI.js"; export * from "./endpoints/genAI/index.js"; - +export type { + Configuration as AiConfiguration, + ConfigurationParameters as AiConfigurationParameters, +} from "./generated/ai-json-api/configuration.js"; // ----------------------------------------------------------------------------- // GD Tiger Model // ----------------------------------------------------------------------------- @@ -148,6 +158,41 @@ export type { ITigerInsightLayerDefinition, ITigerInsightParameterValue, ITigerMeasure, + ITigerSimpleMeasure, + ITigerSimpleMeasureDefinition, + ITigerArithmeticMeasure, + ITigerArithmeticMeasureDefinition, + ITigerPopMeasure, + ITigerPopMeasureDefinition, + ITigerPreviousPeriodMeasure, + ITigerPreviousPeriodMeasureDefinition, + ITigerTotal, + ITigerAbsoluteDateFilter, + ITigerRelativeDateFilter, + ITigerPositiveAttributeFilter, + ITigerNegativeAttributeFilter, + ITigerRankingFilter, + ITigerMeasureSortItem, + ITigerWidget, + ITigerDashboardLayoutSection, + ITigerDashboardFilterGroup, + ITigerDashboardAttributeFilterParent, + ITigerDashboardAttributeFilterByDate, + ITigerAttributeElements, + ITigerLocatorItem, + ITigerInsightWidget, + ITigerKpiWidget, + ITigerRichTextWidget, + ITigerDashboardLayoutSectionHeader, + ITigerDashboardLayoutColumn, + ITigerAttributeElementsByRef, + ITigerAttributeElementsByValue, + ITigerMeasureLocatorItem, + ITigerTotalLocatorItem, + ITigerBaseWidget, + ITigerDashboardLayoutSize, + ITigerDashboardLayoutSizeByScreenSize, + ITigerDashboardLayoutItem, ITigerMeasureValueFilter, ITigerMeasureValueFilterCondition, ITigerRangeCondition, @@ -184,6 +229,18 @@ export { export { newAxios, setAxiosAuthorizationToken, setGlobalAuthorizationToken }; export type { + GeoAreaConfig as AfmGeoAreaConfig, + MatchAttributeFilter as AfmMatchAttributeFilter, + CompoundMeasureValueFilter as AfmCompoundMeasureValueFilter, + AbsoluteDateFilterAbsoluteDateFilterEmptyValueHandlingEnum as AfmAbsoluteDateFilterAbsoluteDateFilterEmptyValueHandlingEnum, + ParameterItem as AfmParameterItem, + AllTimeDateFilter as AfmAllTimeDateFilter, + GeoCollectionIdentifier as AfmGeoCollectionIdentifier, + AfmObjectIdentifierParameter as AfmAfmObjectIdentifierParameter, + MatchAttributeFilterMatchAttributeFilter as AfmMatchAttributeFilterMatchAttributeFilter, + GeoCollectionIdentifierKindEnum as AfmGeoCollectionIdentifierKindEnum, + AllTimeDateFilterAllTimeDateFilter as AfmAllTimeDateFilterAllTimeDateFilter, + AfmObjectIdentifierParameterIdentifier as AfmAfmObjectIdentifierParameterIdentifier, AFM as AfmModel, AfmIdentifier as AfmModelIdentifier, AfmLocalIdentifier as AfmModelLocalIdentifier, @@ -425,13 +482,98 @@ export type { SearchRequestObjectTypesEnum, CreatedVisualizationVisualizationTypeEnum, MetricAggFunctionEnum, + AfmObjectIdentifierParameterIdentifierTypeEnum as AfmAfmObjectIdentifierParameterIdentifierTypeEnum, + AllTimeDateFilterAllTimeDateFilterEmptyValueHandlingEnum as AfmAllTimeDateFilterAllTimeDateFilterEmptyValueHandlingEnum, + AllTimeDateFilterAllTimeDateFilterGranularityEnum as AfmAllTimeDateFilterAllTimeDateFilterGranularityEnum, + CompoundMeasureValueFilterCompoundMeasureValueFilter as AfmCompoundMeasureValueFilterCompoundMeasureValueFilter, + MatchAttributeFilterMatchAttributeFilterMatchTypeEnum as AfmMatchAttributeFilterMatchAttributeFilterMatchTypeEnum, + RelativeDateFilterRelativeDateFilterEmptyValueHandlingEnum as AfmRelativeDateFilterRelativeDateFilterEmptyValueHandlingEnum, + OutlierDetectionRequestFiltersInner, + ChangeAnalysisParams, + Reasoning, + ChatRequestObjectTypesEnum, + ToolCallEventResult, + AiUsageMetadataItem, + GetQualityIssuesResponseStatusEnum, + QualityIssueSeverityEnum, + TriggerQualityIssuesCalculationResponseStatusEnum, + UIContext, + ObjectReferenceGroup, + ListLlmProviderModelsResponse, + ListLlmProviderModelsRequest, + TestLlmProviderDefinitionRequest, + TestLlmProviderByIdRequest, + ActionsApiCancelWorkflowRequest, + ActionsApiChangeAnalysisRequest, + ChangeAnalysisResponse, + ActionsApiChangeAnalysisResultRequest, + ChangeAnalysisResult, + ActionsApiComputeReportForVisualizationObjectRequest, + ActionsApiGenerateDashboardSummaryRequest, + WorkflowDashboardSummaryResponseDto, + ActionsApiGenerateDescriptionRequest, + GenerateDescriptionResponse, + ActionsApiGenerateTitleRequest, + GenerateTitleResponse, + ActionsApiGetWorkflowStatusRequest, + WorkflowStatusResponseDto, + ActionsApiOutlierDetectionRequest, + OutlierDetectionResponse, + ActionsApiOutlierDetectionResultRequest, + OutlierDetectionResult, + ActionsApiResolveLlmProvidersRequest, + ResolvedLlms, + ActionsApiRetrieveResultBinaryRequest, + TestLlmProviderResponse, + ActionsApiTrendingObjectsRequest, + TrendingObjectsResult, + MeasureValueCondition as AfmMeasureValueCondition, + TestLlmProviderByIdRequestProviderConfig, + LlmModel, + ObjectReference, + ReasoningStep, + ResolvedLlmsData, + ModelTestResult, + TrendingObjectItem, + DashboardContext, + VisualizationObjectExecution, + WorkflowDashboardSummaryRequestDto, + GenerateDescriptionRequest, + GenerateTitleRequest, + OutlierDetectionRequest, + WidgetDescriptor, + GenerateDescriptionRequestObjectTypeEnum, + GenerateTitleRequestObjectTypeEnum, + LlmModelFamilyEnum, + ComparisonCondition as AfmComparisonCondition, + RangeCondition as AfmRangeCondition, + ObjectReferenceTypeEnum, + OutlierDetectionRequestSensitivityEnum, + OutlierDetectionRequestGranularityEnum, + Thought, + ResolvedLlmProvider, + AwsBedrockProviderConfig as AfmAwsBedrockProviderConfig, + AzureFoundryProviderConfig as AfmAzureFoundryProviderConfig, + OpenAIProviderConfig as AfmOpenAIProviderConfig, + AwsBedrockAccessKeyAuth as AfmAwsBedrockAccessKeyAuth, + AwsBedrockProviderConfigTypeEnum as AfmAwsBedrockProviderConfigTypeEnum, + AzureFoundryApiKeyAuth as AfmAzureFoundryApiKeyAuth, + AzureFoundryProviderConfigTypeEnum as AfmAzureFoundryProviderConfigTypeEnum, + ComparisonConditionComparison as AfmComparisonConditionComparison, + OpenAiApiKeyAuth as AfmOpenAiApiKeyAuth, + OpenAIProviderConfigTypeEnum as AfmOpenAIProviderConfigTypeEnum, + RangeConditionRange as AfmRangeConditionRange, + AwsBedrockAccessKeyAuthTypeEnum as AfmAwsBedrockAccessKeyAuthTypeEnum, + AzureFoundryApiKeyAuthTypeEnum as AfmAzureFoundryApiKeyAuthTypeEnum, + ComparisonConditionComparisonOperatorEnum as AfmComparisonConditionComparisonOperatorEnum, + OpenAiApiKeyAuthTypeEnum as AfmOpenAiApiKeyAuthTypeEnum, + RangeConditionRangeOperatorEnum as AfmRangeConditionRangeOperatorEnum, } from "./generated/afm-rest-api/api.js"; export type { ActionsApiInterface as AuthActionsApiInterface, ActionsApiProcessInvitationRequest, Invitation, } from "./generated/auth-json-api/api.js"; -// export { ActionsApiFactory as AuthActionsApiFactory } from "./generated/auth-json-api/api.js"; export { type ConfigurationParameters, Configuration } from "./generated/auth-json-api/configuration.js"; export type { AutomationNotificationFilter, @@ -631,21 +773,49 @@ export type { AutomationRelativeBoundedDateFilterGranularityEnum, AutomationRelativeDateFilterRelativeDateFilterGranularityEnum, AutomationsAutomation, - //AutomationsAutomationFactory, - // AutomationsAutomationAxiosParamCreator, - // AutomationsAutomationFp, AutomationSlidesExportRequestFormatEnum, AutomationSmtpPortEnum, AutomationSmtpTypeEnum, AutomationTabularExportRequestFormatEnum, AutomationWebhookTypeEnum, AutomationSimpleMeasureDefinitionMeasureAggregationEnum, - //NotificationChannelsAutomationAxiosParamCreator, - // NotificationChannelsAutomationFactory, NotificationChannelsAutomation, - //NotificationChannelsAutomationFp, Configuration as AutomationConfiguration, ConfigurationParameters as AutomationConfigurationParameters, + AutomationParameterItem, + AutomationMetricDefinitionOverride, + AutomationAbsoluteDateFilterAbsoluteDateFilterEmptyValueHandlingEnum, + AutomationCompoundMeasureValueFilter, + AutomationAnomalyDetectionWrapper, + AutomationMatchAttributeFilter, + AutomationAutomationAlertIntervalEnum, + AutomationDashboardDateFilterDateFilterEmptyValueHandlingEnum, + AutomationDashboardExportSettingsPageSizeEnum, + AutomationDashboardExportSettingsPageOrientationEnum, + AutomationAllTimeDateFilter, + AutomationRelativeDateFilterRelativeDateFilterEmptyValueHandlingEnum, + AutomationSettingsPageSizeEnum, + AutomationSettingsPageOrientationEnum, + AutomationSettingsGrandTotalsPositionEnum, + AutomationAllTimeDateFilterAllTimeDateFilter, + AutomationAnomalyDetection, + AutomationCompoundMeasureValueFilterCompoundMeasureValueFilter, + AutomationMatchAttributeFilterMatchAttributeFilter, + AutomationAfmObjectIdentifierParameter, + AutomationAfmObjectIdentifierParameterIdentifier, + AutomationAllTimeDateFilterAllTimeDateFilterEmptyValueHandlingEnum, + AutomationAllTimeDateFilterAllTimeDateFilterGranularityEnum, + AutomationAnomalyDetectionSensitivityEnum, + AutomationAnomalyDetectionGranularityEnum, + AutomationMeasureValueCondition, + AutomationMatchAttributeFilterMatchAttributeFilterMatchTypeEnum, + AutomationAfmObjectIdentifierParameterIdentifierTypeEnum, + AutomationComparisonCondition, + AutomationRangeCondition, + AutomationComparisonConditionComparison, + AutomationRangeConditionRange, + AutomationComparisonConditionComparisonOperatorEnum, + AutomationRangeConditionRangeOperatorEnum, } from "./generated/automation-json-api/index.js"; export type { BaseAPI as AutomationBaseAPI, @@ -653,6 +823,7 @@ export type { } from "./generated/automation-json-api/base.js"; export * from "./generated/metadata-json-api/api.js"; +export type { AutomationAlertCondition as MdAutomationAlertCondition } from "./generated/metadata-json-api/api.js"; export type { ActionsApiGetDataSourceSchemataRequest, @@ -695,6 +866,12 @@ export type { SqlColumnDataTypeEnum as ScanApiSqlColumnDataTypeEnum, ColumnStatisticTypeEnum, ColumnStatisticsRequestStatisticsEnum, + ActionsApiScanStatisticsRequest, + TableStatisticsResponse, + TableStatisticsEntry as ScanModelTableStatisticsEntry, + TableStatisticsWarning, + TableStatisticsRequest, + ColumnStatisticsEntry as ScanModelColumnStatisticsEntry, } from "./generated/scan-json-api/api.js"; export type { @@ -735,6 +912,19 @@ export type { WorkspaceCacheUsage, WorkspaceCurrentCacheUsage, GdStorageFileTypeEnum, + ActionsApiConvertGeoFileRequest, + ConvertGeoFileResponse, + ActionsApiCustomGeoCollectionStagingUploadRequest, + UploadGeoCollectionFileResponse, + ActionsApiImportCustomGeoCollectionRequest, + ImportGeoCollectionResponse, + ConvertGeoFileRequest, + ImportGeoCollectionRequest, + OGCAPIFeaturesApiGetCollectionItemsRequest, + GeoJsonFeatureCollection, + OGCAPIFeaturesApiGetCustomCollectionItemsRequest, + GeoJsonFeature, + GeoJsonGeometry, } from "./generated/result-json-api/api.js"; export type * from "./generated/export-json-api/index.js"; @@ -752,6 +942,7 @@ export { jsonApiHeaders, JSON_API_HEADER_VALUE, ValidateRelationsHeader } from " export { type MetadataGetEntitiesResult, type MetadataGetEntitiesFn, + type MetadataGetEntitiesFnNew, type MetadataGetEntitiesOptions, type MetadataGetEntitiesParams, type MetadataGetEntitiesThemeParams, @@ -765,6 +956,7 @@ export { type OrganizationGetEntitiesResult, type OrganizationGetEntitiesSupportingIncludedResult, type OrganizationGetEntitiesFn, + type OrganizationGetEntitiesFnNew, type OrganizationGetEntitiesParams, OrganizationUtilities, } from "./organizationUtilities.js"; diff --git a/libs/api-client-tiger/src/metadataUtilities.ts b/libs/api-client-tiger/src/metadataUtilities.ts index 0a3b2abe1f7..20765de87f4 100644 --- a/libs/api-client-tiger/src/metadataUtilities.ts +++ b/libs/api-client-tiger/src/metadataUtilities.ts @@ -138,6 +138,9 @@ export type MetadataGetEntitiesFn< P extends MetadataGetEntitiesParams, > = (params: P, options: MetadataGetEntitiesOptions) => AxiosPromise; +/** + * @internal + */ export type MetadataGetEntitiesFnNew< T extends MetadataGetEntitiesResult, P extends MetadataGetEntitiesParams, diff --git a/libs/sdk-backend-base/package.json b/libs/sdk-backend-base/package.json index 2b693ede9da..6efdc98f8af 100644 --- a/libs/sdk-backend-base/package.json +++ b/libs/sdk-backend-base/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-backend-base", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData.UI SDK - Base for backend implementations", "license": "MIT", "author": "GoodData", @@ -28,7 +28,7 @@ "build": "npm-run-all -p build-check build-ts && npm run api-extractor", "build-check": "tsgo", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage *.log tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage temp *.log tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", diff --git a/libs/sdk-backend-mockingbird/package.json b/libs/sdk-backend-mockingbird/package.json index 4aa6963e01a..7bd6fe13ac7 100644 --- a/libs/sdk-backend-mockingbird/package.json +++ b/libs/sdk-backend-mockingbird/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-backend-mockingbird", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "Mock GoodData Backend SPI implementation", "license": "MIT", "author": "GoodData", @@ -28,7 +28,7 @@ "build": "npm-run-all -p build-check build-ts && npm run api-extractor", "build-check": "tsgo", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage *.log tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage temp *.log tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", diff --git a/libs/sdk-backend-spi/api/sdk-backend-spi.api.md b/libs/sdk-backend-spi/api/sdk-backend-spi.api.md index 797a3b8c2b4..941e43e8c62 100644 --- a/libs/sdk-backend-spi/api/sdk-backend-spi.api.md +++ b/libs/sdk-backend-spi/api/sdk-backend-spi.api.md @@ -141,6 +141,8 @@ import { IThemeDefinition } from '@gooddata/sdk-model'; import { IThemeMetadataObject } from '@gooddata/sdk-model'; import { IUser } from '@gooddata/sdk-model'; import { IUserGroup } from '@gooddata/sdk-model'; +import { IUserSettings } from '@gooddata/sdk-model'; +import { IUserWorkspaceSettings } from '@gooddata/sdk-model'; import type { IVisualizationClass } from '@gooddata/sdk-model'; import { IWhiteLabeling } from '@gooddata/sdk-model'; import { IWidget } from '@gooddata/sdk-model'; @@ -151,6 +153,7 @@ import { IWorkspaceDataFilter } from '@gooddata/sdk-model'; import { IWorkspaceDataFilterDefinition } from '@gooddata/sdk-model'; import { IWorkspacePermissionAssignment } from '@gooddata/sdk-model'; import { IWorkspacePermissions } from '@gooddata/sdk-model'; +import { IWorkspaceSettings } from '@gooddata/sdk-model'; import { IWorkspaceUser } from '@gooddata/sdk-model'; import { IWorkspaceUserGroup } from '@gooddata/sdk-model'; import { LlmEndpointOpenAIPatch } from '@gooddata/sdk-model'; @@ -654,6 +657,7 @@ export type IChatConversation = { createdAt: string; updatedAt: string; title?: string; + pinned?: boolean; }; // @internal @@ -729,7 +733,7 @@ export interface IChatConversations { getConversation(conversationId: string): Promise; getConversationItemsQuery(): IChatConversationItemsQuery; getConversationThread(conversationId: string): IChatConversationThread; - update(conversationId: string, update: Partial>): Promise; + update(conversationId: string, update: Partial>): Promise; } // @internal @@ -2439,12 +2443,7 @@ export interface IUserService { settings(): IUserSettingsService; } -// @public -export interface IUserSettings extends ISettings { - locale: string; - separators: ISeparators; - userId: string; -} +export { IUserSettings } // @public export interface IUserSettingsService { @@ -2455,9 +2454,7 @@ export interface IUserSettingsService { setSeparators(separators: ISeparators): Promise; } -// @public -export interface IUserWorkspaceSettings extends IUserSettings, IWorkspaceSettings { -} +export { IUserWorkspaceSettings } // @alpha export interface IWidgetAlertCount { @@ -2779,12 +2776,7 @@ export interface IWorkspacePermissionsService { getPermissionsForCurrentUser(): Promise; } -// @public -export interface IWorkspaceSettings extends ISettings { - agGridToken?: string; - mapboxToken?: string; - workspace: string; -} +export { IWorkspaceSettings } // @public export interface IWorkspaceSettingsService { diff --git a/libs/sdk-backend-spi/package.json b/libs/sdk-backend-spi/package.json index 056441c68a9..7179ea77c3d 100644 --- a/libs/sdk-backend-spi/package.json +++ b/libs/sdk-backend-spi/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-backend-spi", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData Backend SPI abstraction interfaces", "license": "MIT", "author": "GoodData", @@ -28,7 +28,7 @@ "build": "npm-run-all -p build-check build-ts && npm run api-extractor", "build-check": "tsgo", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage *.log tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage temp *.log tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", diff --git a/libs/sdk-backend-spi/src/common/settings.ts b/libs/sdk-backend-spi/src/common/settings.ts index 680b333f518..8e1c3df3a44 100644 --- a/libs/sdk-backend-spi/src/common/settings.ts +++ b/libs/sdk-backend-spi/src/common/settings.ts @@ -1,53 +1,5 @@ -// (C) 2020-2025 GoodData Corporation -import { type ISeparators, type ISettings } from "@gooddata/sdk-model"; +// (C) 2020-2026 GoodData Corporation -/** - * Settings for particular user. - * - * @public - */ -export interface IUserSettings extends ISettings { - /** - * User to which the settings belong. - */ - userId: string; +/* oxlint-disable no-barrel-files/no-barrel-files */ - /** - * User locale - */ - locale: string; - - /** - * Regional number formatting - */ - separators: ISeparators; -} - -/** - * Settings for particular workspace. - * - * @public - */ -export interface IWorkspaceSettings extends ISettings { - /** - * Workspace to which the settings belong. - */ - workspace: string; - - /** - * Stores Mapbox token used for WS - */ - mapboxToken?: string; - - /** - * Stores AgGrid token used for WS - */ - agGridToken?: string; -} - -/** - * Settings for particular combination of user and workspace. - * - * @public - */ -export interface IUserWorkspaceSettings extends IUserSettings, IWorkspaceSettings {} +export type { IUserSettings, IWorkspaceSettings, IUserWorkspaceSettings } from "@gooddata/sdk-model"; diff --git a/libs/sdk-backend-spi/src/workspace/genAI/index.ts b/libs/sdk-backend-spi/src/workspace/genAI/index.ts index 94ad364c471..a817fdabbc5 100644 --- a/libs/sdk-backend-spi/src/workspace/genAI/index.ts +++ b/libs/sdk-backend-spi/src/workspace/genAI/index.ts @@ -732,7 +732,7 @@ export interface IChatConversations { */ update( conversationId: string, - update: Partial>, + update: Partial>, ): Promise; /** @@ -816,6 +816,10 @@ export type IChatConversation = { * Conversation title */ title?: string; + /** + * Conversation pinned status + */ + pinned?: boolean; }; /** diff --git a/libs/sdk-backend-tiger/package.json b/libs/sdk-backend-tiger/package.json index b2a447e0aa2..08b671b3f6e 100644 --- a/libs/sdk-backend-tiger/package.json +++ b/libs/sdk-backend-tiger/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-backend-tiger", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData Backend SPI implementation for GoodData Cloud and GoodData.CN", "license": "MIT", "author": "GoodData", @@ -29,7 +29,7 @@ "build-check": "tsgo", "build-dynamic-files": "bash scripts/build.sh --genFilesOnly", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage *.log tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage temp *.log tsconfig.tsbuildinfo", "clear-recordings": "./scripts/clear-recordings.sh", "create-ref-workspaces": "node ./tests/reference_workspace/create_test_workspaces.mjs", "delete-ref-workspaces": "node ./tests/reference_workspace/delete_test_workspaces.mjs", diff --git a/libs/sdk-backend-tiger/src/backend/workspace/dashboards/index.ts b/libs/sdk-backend-tiger/src/backend/workspace/dashboards/index.ts index 4076fa9bacd..8b463c0a2c1 100644 --- a/libs/sdk-backend-tiger/src/backend/workspace/dashboards/index.ts +++ b/libs/sdk-backend-tiger/src/backend/workspace/dashboards/index.ts @@ -1,6 +1,6 @@ // (C) 2020-2026 GoodData Corporation -import { isEmpty, isEqual } from "lodash-es"; +import { differenceBy, isEmpty, isEqual } from "lodash-es"; import { invariant } from "ts-invariant"; import { v4 as uuid } from "uuid"; @@ -37,6 +37,7 @@ import { EntitiesApi_GetEntityDashboardPlugins, EntitiesApi_GetEntityWorkspaces, FilterContextApi_CreateEntityFilterContexts, + FilterContextApi_DeleteEntityFilterContexts, FilterContextApi_GetEntityFilterContexts, FilterContextApi_UpdateEntityFilterContexts, FilterViewsApi_CreateEntityFilterViews, @@ -88,6 +89,7 @@ import { type IDashboardPermissions, type IDashboardPlugin, type IDashboardPluginDefinition, + type IDashboardTab, type IDashboardWidget, type IDateFilter, type IExecutionDefinition, @@ -141,6 +143,10 @@ import { type TigerDashboardPermissionType, buildDashboardPermissions } from "./ import { DashboardsQuery } from "./dashboardsQuery.js"; import { resolveWidgetFilters, resolveWidgetFiltersWithMultipleDateFilters } from "./widgetFilters.js"; +export function getDeletedDashboardTabs(originalTabs: IDashboardTab[], updatedTabs: IDashboardTab[]) { + return differenceBy(originalTabs, updatedTabs, "localIdentifier"); +} + export class TigerWorkspaceDashboards implements IWorkspaceDashboardsService { constructor( private readonly authCall: TigerAuthenticatedCallGuard, @@ -508,7 +514,31 @@ export class TigerWorkspaceDashboards implements IWorkspaceDashboardsService { * and return just `convertDashboard(result.data, filterContext);` below */ const { id, type } = result.data.data; - return this.getDashboard(idRef(id, type)); + + // This should ideally be named `updatedDashboard`, but this name is already taken above. + const dashboard = await this.getDashboard(idRef(id, type)); + + /** + * Perform a side-effect cleanup that deletes filter contexts of the deleted dashboard tabs. This should ideally be done + * on the backend, but due to complicated implementation it has been agreed per LX-2173 to be done on the frontend for now. + * Remove this if the backend handles this cleanup properly in the future. + * + * Currently the backend only cleans up filter contexts of tabs when the dashboard is deleted, but not when individual + * dashboard tabs are deleted, leaving orphaned filter contexts in the DB. Note that such orphans persist even when + * the whole dashboard is deleted, because on dashboard deletion, the backend cleans only filter contexts of _current_ tabs. + * + * The following code prevents the creation of new filter-context orphans. + */ + getDeletedDashboardTabs(originalDashboard.tabs ?? [], dashboard.tabs ?? []) + .map(({ filterContext }) => filterContext) + .filter(isFilterContext) + .forEach((filterContext) => { + this.deleteFilterContext(filterContext).catch((error) => { + console.warn(`Failed to cleanup orphaned filter context`, filterContext.ref, error); + }); + }); + + return dashboard; }; /** @@ -1525,6 +1555,16 @@ export class TigerWorkspaceDashboards implements IWorkspaceDashboardsService { return convertFilterContextFromBackend(result.data); }; + private deleteFilterContext = async (filterContext: IFilterContext): Promise => { + await this.authCall((client) => + FilterContextApi_DeleteEntityFilterContexts(client.axios, client.basePath, { + workspaceId: this.workspace, + // Note that `this.authCall` is not actually used. See `objRefToIdentifier()` implementation for details. + objectId: objRefToIdentifier(filterContext.ref, this.authCall), + }), + ); + }; + private getFilterContext = async (filterContextRef: ObjRef) => { const filterContextId = objRefToIdentifier(filterContextRef, this.authCall); const result = await this.authCall((client) => { diff --git a/libs/sdk-backend-tiger/src/backend/workspace/dashboards/tests/index.test.ts b/libs/sdk-backend-tiger/src/backend/workspace/dashboards/tests/index.test.ts new file mode 100644 index 00000000000..9ba525f44e8 --- /dev/null +++ b/libs/sdk-backend-tiger/src/backend/workspace/dashboards/tests/index.test.ts @@ -0,0 +1,38 @@ +// (C) 2026 GoodData Corporation + +import { describe, expect, it } from "vitest"; + +import { type IDashboardTab } from "@gooddata/sdk-model"; + +import { getDeletedDashboardTabs } from "../index.js"; + +function makeDashboardTab(overrides: Partial): IDashboardTab { + return { + localIdentifier: "some-id", + title: "Example tab", + ...overrides, + }; +} + +describe("getDeletedDashboardTabs", () => { + it("correctly identifies deleted dashboard tabs", () => { + const originalTabs = [ + makeDashboardTab({ localIdentifier: "kept" }), + makeDashboardTab({ localIdentifier: "removed-1" }), + makeDashboardTab({ localIdentifier: "removed-2" }), + ]; + const updatedTabs = [ + makeDashboardTab({ localIdentifier: "added-1" }), + makeDashboardTab({ localIdentifier: "added-2" }), + makeDashboardTab({ localIdentifier: "kept" }), + ]; + const expected = [ + makeDashboardTab({ localIdentifier: "removed-1" }), + makeDashboardTab({ localIdentifier: "removed-2" }), + ]; + + const actual = getDeletedDashboardTabs(originalTabs, updatedTabs); + + expect(actual).toEqual(expected); + }); +}); diff --git a/libs/sdk-backend-tiger/src/backend/workspace/genAI/ChatConversations.ts b/libs/sdk-backend-tiger/src/backend/workspace/genAI/ChatConversations.ts index bbf936f11ca..69eca7efc2e 100644 --- a/libs/sdk-backend-tiger/src/backend/workspace/genAI/ChatConversations.ts +++ b/libs/sdk-backend-tiger/src/backend/workspace/genAI/ChatConversations.ts @@ -75,7 +75,7 @@ export class ChatConversationsService implements IChatConversations { async update( conversationId: string, - update: Partial>, + update: Partial>, ): Promise { return await this.authCall(async (client) => { const response = await GenAiApi_PatchConversation(client.axios, client.basePath, { diff --git a/libs/sdk-backend-tiger/src/convertors/fromBackend/analyticalDashboards/v2/AnalyticalDashboardConverter.ts b/libs/sdk-backend-tiger/src/convertors/fromBackend/analyticalDashboards/v2/AnalyticalDashboardConverter.ts index 19f2e21ae3d..613ae8dccd2 100644 --- a/libs/sdk-backend-tiger/src/convertors/fromBackend/analyticalDashboards/v2/AnalyticalDashboardConverter.ts +++ b/libs/sdk-backend-tiger/src/convertors/fromBackend/analyticalDashboards/v2/AnalyticalDashboardConverter.ts @@ -201,6 +201,7 @@ function convertDashboardTabContent( IDashboardMeasureValueFilterConfig[] | undefined >(tab.measureValueFilterConfigs), filterGroupsConfig: cloneWithSanitizedIds(tab.filterGroupsConfig), + parameters: tab.parameters?.map(convertDashboardParameter), }; } diff --git a/libs/sdk-backend-tiger/src/convertors/fromBackend/genAIConvertor.ts b/libs/sdk-backend-tiger/src/convertors/fromBackend/genAIConvertor.ts index e40c592d8fc..f7f366d7050 100644 --- a/libs/sdk-backend-tiger/src/convertors/fromBackend/genAIConvertor.ts +++ b/libs/sdk-backend-tiger/src/convertors/fromBackend/genAIConvertor.ts @@ -52,6 +52,7 @@ export function convertChatConversationFromBackend(conversation: AiConversationR createdAt: conversation.createdAt, updatedAt: conversation.lastActivityAt, title: conversation.title ?? undefined, + pinned: conversation.pinned, }; } diff --git a/libs/sdk-backend-tiger/src/convertors/fromBackend/tests/genAIConvertor.test.ts b/libs/sdk-backend-tiger/src/convertors/fromBackend/tests/genAIConvertor.test.ts index d7df5b85bfa..0d10d02b3d7 100644 --- a/libs/sdk-backend-tiger/src/convertors/fromBackend/tests/genAIConvertor.test.ts +++ b/libs/sdk-backend-tiger/src/convertors/fromBackend/tests/genAIConvertor.test.ts @@ -10,6 +10,7 @@ import { import { convertChatConversationErrorFromBackend, + convertChatConversationFromBackend, convertChatConversationItemFromBackend, convertChatSuggestionItemFromBackend, } from "../genAIConvertor.js"; @@ -17,6 +18,30 @@ import { describe("genAIConvertor", () => { const dateNormalizer = vi.fn((val) => val); + describe("convertChatConversationFromBackend", () => { + it("should propagate pinned status", () => { + const converted = convertChatConversationFromBackend({ + conversationId: "conv-1", + workspaceId: "ws-1", + organizationId: "org-1", + userId: "user-1", + createdAt: "2024-01-01T00:00:00Z", + lastActivityAt: "2024-01-02T00:00:00Z", + title: "My conversation", + pinned: true, + isPreview: false, + }); + + expect(converted).toEqual({ + id: "conv-1", + createdAt: "2024-01-01T00:00:00Z", + updatedAt: "2024-01-02T00:00:00Z", + title: "My conversation", + pinned: true, + }); + }); + }); + describe("convertWhatIf", () => { it("should correctly convert AiWhatIfScenario to IChatWhatIfDefinition", () => { const item: AiConversationItemResponse = { diff --git a/libs/sdk-backend-tiger/src/convertors/tests/DashboardParameterConverter.test.ts b/libs/sdk-backend-tiger/src/convertors/tests/DashboardParameterConverter.test.ts index e5e6c926bab..7183e312d68 100644 --- a/libs/sdk-backend-tiger/src/convertors/tests/DashboardParameterConverter.test.ts +++ b/libs/sdk-backend-tiger/src/convertors/tests/DashboardParameterConverter.test.ts @@ -6,7 +6,12 @@ import { type AnalyticalDashboardModelV2, type JsonApiAnalyticalDashboardOutDocument, } from "@gooddata/api-client-tiger"; -import { type IDashboardDefinition, type IDashboardParameter, idRef } from "@gooddata/sdk-model"; +import { + type IDashboardDefinition, + type IDashboardParameter, + type IDashboardTab, + idRef, +} from "@gooddata/sdk-model"; import { convertDashboard } from "../fromBackend/analyticalDashboards/v2/AnalyticalDashboardConverter.js"; import { convertAnalyticalDashboard } from "../toBackend/AnalyticalDashboardConverter.js"; @@ -28,27 +33,54 @@ function makeDashboardDocument( }; } -function makeTigerContent( +function makeTigerContentRootOnly( parameters: AnalyticalDashboardModelV2.IAnalyticalDashboard["parameters"], ): AnalyticalDashboardModelV2.IAnalyticalDashboard { return { version: "2", parameters }; } -function makeDashboardDefinition(parameters: IDashboardParameter[]): IDashboardDefinition { +function makeTigerContentWithTabs( + tabs: AnalyticalDashboardModelV2.IDashboardTab[], +): AnalyticalDashboardModelV2.IAnalyticalDashboard { + return { version: "2", tabs }; +} + +function makeTigerTab( + localIdentifier: string, + parameters?: AnalyticalDashboardModelV2.IDashboardTab["parameters"], +): AnalyticalDashboardModelV2.IDashboardTab { + return { + localIdentifier, + title: "", + layout: { type: "IDashboardLayout", sections: [] } as never, + filterContextRef: {} as never, + ...(parameters ? { parameters } : {}), + }; +} + +function makeDashboardDefinitionWithTabs(tabs: IDashboardTab[]): IDashboardDefinition { return { type: "IDashboard", title: "", description: "", shareStatus: "private", - parameters, + tabs, } as IDashboardDefinition; } +function makeTab(localIdentifier: string, parameters?: IDashboardParameter[]): IDashboardTab { + return { + localIdentifier, + title: "", + ...(parameters ? { parameters } : {}), + } as IDashboardTab; +} + describe("dashboard parameter converters", () => { describe("from backend", () => { - it("converts a fully-specified parameter entry", () => { + it("V1: reads root parameters when no tabs[]", () => { const doc = makeDashboardDocument( - makeTigerContent([ + makeTigerContentRootOnly([ { ref: tigerRef as never, parameterType: "NUMBER", @@ -72,48 +104,95 @@ describe("dashboard parameter converters", () => { ]); }); - it("defaults mode to active when omitted", () => { + it("V2: reads each tab's parameters per tab", () => { const doc = makeDashboardDocument( - makeTigerContent([ - { - ref: tigerRef as never, - parameterType: "NUMBER", - }, + makeTigerContentWithTabs([ + makeTigerTab("tab-A", [{ ref: tigerRef as never, parameterType: "NUMBER", value: 25 }]), + makeTigerTab("tab-B"), ]), ); const dashboard = convertDashboard(doc); - expect(dashboard.parameters).toEqual([ + expect(dashboard.tabs?.[0]?.parameters).toEqual([ { ref: idRef("topN", "parameter"), parameterType: "NUMBER", + value: 25, mode: "active", }, ]); + expect(dashboard.tabs?.[1]?.parameters).toBeUndefined(); + }); + + it("defaults mode to active when omitted on a tab parameter", () => { + const doc = makeDashboardDocument( + makeTigerContentWithTabs([ + makeTigerTab("tab-A", [{ ref: tigerRef as never, parameterType: "NUMBER" }]), + ]), + ); + + const dashboard = convertDashboard(doc); + + expect(dashboard.tabs?.[0]?.parameters?.[0]?.mode).toBe("active"); }); - it("returns undefined parameters when content has none", () => { + it("returns undefined parameters when neither root nor any tab has them", () => { const doc = makeDashboardDocument({ version: "2" }); const dashboard = convertDashboard(doc); expect(dashboard.parameters).toBeUndefined(); + expect(dashboard.tabs).toBeUndefined(); }); }); describe("to backend", () => { - it("preserves a fully-specified parameter entry", () => { - const definition = makeDashboardDefinition([ - { - ref: idRef("topN", "parameter"), - parameterType: "NUMBER", - value: 25, - label: "Top N", - mode: "readonly", - }, + it("V2: writes parameters per tab and mirrors tabs[0] to root for V1 readers", () => { + const definition = makeDashboardDefinitionWithTabs([ + makeTab("tab-A", [ + { + ref: idRef("topN", "parameter"), + parameterType: "NUMBER", + value: 25, + label: "Top N", + mode: "readonly", + }, + ]), + makeTab("tab-B"), ]); const result = convertAnalyticalDashboard(definition); + const tigerTopN = { + ref: tigerRef, + parameterType: "NUMBER", + value: 25, + label: "Top N", + mode: "readonly", + }; + expect(result.parameters).toEqual([tigerTopN]); + expect(result.tabs?.[0]?.parameters).toEqual([tigerTopN]); + expect(result.tabs?.[1]?.parameters).toBeUndefined(); + }); + + it("V2: writes root parameters when definition has no tabs (legacy root-only)", () => { + const definition = { + type: "IDashboard", + title: "", + description: "", + shareStatus: "private", + parameters: [ + { + ref: idRef("topN", "parameter"), + parameterType: "NUMBER", + value: 25, + label: "Top N", + mode: "readonly", + }, + ], + } as IDashboardDefinition; + + const result = convertAnalyticalDashboard(definition); + expect(result.parameters).toEqual([ { ref: tigerRef, @@ -123,20 +202,23 @@ describe("dashboard parameter converters", () => { mode: "readonly", }, ]); + expect(result.tabs).toBeUndefined(); }); - it("omits mode field when set to active", () => { - const definition = makeDashboardDefinition([ - { - ref: idRef("topN", "parameter"), - parameterType: "NUMBER", - mode: "active", - }, + it("omits mode field when set to active on a tab parameter", () => { + const definition = makeDashboardDefinitionWithTabs([ + makeTab("tab-A", [ + { + ref: idRef("topN", "parameter"), + parameterType: "NUMBER", + mode: "active", + }, + ]), ]); const result = convertAnalyticalDashboard(definition); - expect(result.parameters).toEqual([ + expect(result.tabs?.[0]?.parameters).toEqual([ { ref: tigerRef, parameterType: "NUMBER", @@ -144,44 +226,42 @@ describe("dashboard parameter converters", () => { ]); }); - it("emits no parameters field when none defined", () => { - const definition = makeDashboardDefinition([]); - const result = convertAnalyticalDashboard({ ...definition, parameters: undefined }); + it("emits no parameters field when no tab declares any", () => { + const definition = makeDashboardDefinitionWithTabs([makeTab("tab-A")]); + const result = convertAnalyticalDashboard(definition); expect(result.parameters).toBeUndefined(); + expect(result.tabs?.[0]?.parameters).toBeUndefined(); }); }); describe("round-trip", () => { - it("preserves explicit value and label across to->from converters", () => { - const definition = makeDashboardDefinition([ - { - ref: idRef("topN", "parameter"), - parameterType: "NUMBER", - value: 25, - label: "Top N", - mode: "active", - }, - ]); - - const tigerContent = convertAnalyticalDashboard(definition); - const dashboard = convertDashboard(makeDashboardDocument(tigerContent)); - - expect(dashboard.parameters).toEqual(definition.parameters); - }); - - it("preserves a minimal entry (only ref+parameterType+active mode)", () => { - const definition = makeDashboardDefinition([ - { - ref: idRef("topN", "parameter"), - parameterType: "NUMBER", - mode: "active", - }, + it("preserves per-tab parameters across to->from converters", () => { + const definition = makeDashboardDefinitionWithTabs([ + makeTab("tab-A", [ + { + ref: idRef("topN", "parameter"), + parameterType: "NUMBER", + value: 25, + label: "Top N", + mode: "active", + }, + ]), + makeTab("tab-B", [ + { + ref: idRef("topN", "parameter"), + parameterType: "NUMBER", + mode: "active", + }, + ]), ]); const tigerContent = convertAnalyticalDashboard(definition); const dashboard = convertDashboard(makeDashboardDocument(tigerContent)); - expect(dashboard.parameters).toEqual(definition.parameters); + expect(dashboard.tabs?.[0]?.parameters).toEqual(definition.tabs?.[0]?.parameters); + expect(dashboard.tabs?.[1]?.parameters).toEqual(definition.tabs?.[1]?.parameters); + // Root mirrors tabs[0] for V1 readers; on read-back, both root and tabs[0] are populated. + expect(dashboard.parameters).toEqual(definition.tabs?.[0]?.parameters); }); }); }); diff --git a/libs/sdk-backend-tiger/src/convertors/toBackend/AnalyticalDashboardConverter.ts b/libs/sdk-backend-tiger/src/convertors/toBackend/AnalyticalDashboardConverter.ts index d5054f82451..36d51926ea4 100644 --- a/libs/sdk-backend-tiger/src/convertors/toBackend/AnalyticalDashboardConverter.ts +++ b/libs/sdk-backend-tiger/src/convertors/toBackend/AnalyticalDashboardConverter.ts @@ -136,6 +136,7 @@ function convertDashboardTabToBackend( ITigerDashboardMeasureValueFilterConfig[] | undefined >(tab.measureValueFilterConfigs), filterGroupsConfig: cloneWithSanitizedIds(tab.filterGroupsConfig), + parameters: tab.parameters?.map(convertDashboardParameterToBackend), }; } @@ -161,6 +162,7 @@ export function convertAnalyticalDashboard( let effectiveDateFilterConfigs = dashboard.dateFilterConfigs; let effectiveAttributeFilterConfigs = dashboard.attributeFilterConfigs; let effectiveMeasureValueFilterConfigs = dashboard.measureValueFilterConfigs; + let effectiveParameters = dashboard.parameters; if (dashboard.tabs && dashboard.tabs.length > 0) { const effectiveTab = dashboard.tabs[0]; @@ -171,6 +173,7 @@ export function convertAnalyticalDashboard( effectiveDateFilterConfigs = effectiveTab.dateFilterConfigs; effectiveAttributeFilterConfigs = effectiveTab.attributeFilterConfigs; effectiveMeasureValueFilterConfigs = effectiveTab.measureValueFilterConfigs; + effectiveParameters = effectiveTab.parameters; } const layout = convertLayout( @@ -197,7 +200,7 @@ export function convertAnalyticalDashboard( layout, ), plugins: dashboard.plugins?.map(convertDashboardPluginLinkToBackend), - parameters: dashboard.parameters?.map(convertDashboardParameterToBackend), + parameters: effectiveParameters?.map(convertDashboardParameterToBackend), disableCrossFiltering: dashboard.disableCrossFiltering, disableUserFilterReset: dashboard.disableUserFilterReset, disableUserFilterSave: dashboard.disableUserFilterSave, diff --git a/libs/sdk-code-convertors/api-extractor.json b/libs/sdk-code-convertors/api-extractor.json index 0ec228476fa..7835123bd5e 100644 --- a/libs/sdk-code-convertors/api-extractor.json +++ b/libs/sdk-code-convertors/api-extractor.json @@ -1,17 +1,5 @@ { "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", "extends": "../../common/config/api-extractor/api-extractor.json", - "mainEntryPointFilePath": "/esm/index.d.ts", - "messages": { - "extractorMessageReporting": { - "ae-missing-release-tag": { - "logLevel": "warning", - "addToApiReportFile": true - }, - "ae-forgotten-export": { - "logLevel": "warning", - "addToApiReportFile": true - } - } - } + "mainEntryPointFilePath": "/esm/index.d.ts" } diff --git a/libs/sdk-code-convertors/api/sdk-code-convertors.api.md b/libs/sdk-code-convertors/api/sdk-code-convertors.api.md index ff86d40cd13..f13791ba927 100644 --- a/libs/sdk-code-convertors/api/sdk-code-convertors.api.md +++ b/libs/sdk-code-convertors/api/sdk-code-convertors.api.md @@ -40,6 +40,7 @@ import { IAttributeFilterConfigs } from '@gooddata/sdk-model'; import { IAttributeSortItem } from '@gooddata/sdk-model'; import { IBucket } from '@gooddata/sdk-model'; import { IDashboardAttributeFilterConfig } from '@gooddata/sdk-model'; +import { IDashboardDateFilter } from '@gooddata/sdk-model'; import { IDashboardDateFilterConfig } from '@gooddata/sdk-model'; import { IDashboardDateFilterConfigItem } from '@gooddata/sdk-model'; import { IDashboardDefinition } from '@gooddata/sdk-model'; @@ -136,46 +137,328 @@ export type AacSection = Section; // @public (undocumented) export type AacVisualisation = Visualisation; -// Warning: (ae-missing-release-tag) "AllTypes" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export const AllTypes: string[]; -// Warning: (ae-missing-release-tag) "areaChart" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const areaChart: { - load: typeof load_5; - save: typeof save_5; - DEFAULTS: ConfigDefaults; +// @internal (undocumented) +export const AREA_CHART_DEFAULTS: ConfigDefaults; + +// @internal @deprecated (undocumented) +export const areaChart: IAreaChartConfig; + +// @internal (undocumented) +export type AreaChartConfigProperties = { + colorMapping: Array; + distinctPointShapes: { + enabled: boolean; + pointShapeMapping?: Record; + }; + chartFill: { + type: ChartFillType; + measureToPatternName?: Record; + }; + dataLabels: { + visible: boolean | "auto"; + style: "auto" | "backplate"; + }; + dataPoints: { + visible: boolean | "auto"; + }; + legend: { + enabled: boolean; + position: "top" | "bottom" | "left" | "right" | "auto"; + }; + stackMeasures: boolean; + stackMeasuresToPercent: boolean; + xaxis: { + name: { + visible: boolean; + position: "center" | "left" | "right" | "auto"; + }; + labelsEnabled: boolean; + rotation: "0" | "30" | "60" | "90" | "auto"; + visible: boolean; + }; + yaxis: { + format: "inherit" | "auto"; + max: number | string; + min: number | string; + name: { + visible: boolean; + position: "center" | "left" | "right" | "auto"; + }; + labelsEnabled: boolean; + rotation: "0" | "30" | "60" | "90" | "auto"; + visible: boolean; + }; + grid: { + enabled: boolean; + }; + disableDrillDown: boolean; + disableAlerts: boolean; + disableScheduledExports: boolean; }; +// @internal (undocumented) +export function areaChartLoad(props: VisualisationConfig): Pair, any> | null; + +// @internal (undocumented) +export function areaChartSave(_fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined): { + colorMapping: ColorMapping[] | undefined; + distinctPointShapes: { + enabled: boolean | undefined; + pointShapeMapping: Record | undefined; + } | undefined; + chartFill: { + type: ChartFillType | undefined; + measureToPatternName: Record | undefined; + } | undefined; + dataLabels: { + visible: "auto" | boolean | undefined; + style: "auto" | "backplate" | undefined; + } | undefined; + dataPoints: { + visible: "auto" | boolean | undefined; + } | undefined; + legend: { + enabled: boolean | undefined; + position: string | undefined; + } | undefined; + stackMeasuresToPercent: boolean | undefined; + stackMeasures: boolean | undefined; + xaxis: { + name: { + position: string | undefined; + visible: boolean | undefined; + } | undefined; + rotation: string | undefined; + visible: boolean | undefined; + labelsEnabled: boolean | undefined; + } | undefined; + yaxis: { + format: string | undefined; + max: string | number | undefined; + min: string | number | undefined; + name: { + position: string | undefined; + visible: boolean | undefined; + } | undefined; + rotation: string | undefined; + visible: boolean | undefined; + labelsEnabled: boolean | undefined; + } | undefined; + grid: { + enabled: boolean | undefined; + } | undefined; + disableDrillDown: boolean | undefined; + disableAlerts: boolean | undefined; + disableScheduledExports: boolean | undefined; +} | undefined; + // @public (undocumented) export function assertUnreachable(x: never): never; -// Warning: (ae-missing-release-tag) "AttributeHierarchyTypes" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export const AttributeHierarchyTypes: string[]; -// Warning: (ae-missing-release-tag) "barChart" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const barChart: { - load: typeof load_2; - save: typeof save_2; - DEFAULTS: ConfigDefaults; +// @internal (undocumented) +export const BAR_CHART_DEFAULTS: ConfigDefaults; + +// @internal @deprecated (undocumented) +export const barChart: IBarChartConfig; + +// @internal (undocumented) +export type BarChartConfigProperties = { + colorMapping: Array; + dataLabels: { + totalsVisible: boolean | "auto"; + visible: boolean | "auto"; + style: "auto" | "backplate"; + }; + chartFill: { + type: ChartFillType; + measureToPatternName?: Record; + }; + legend: { + enabled: boolean; + position: "top" | "bottom" | "left" | "right" | "auto"; + }; + stackMeasures: boolean; + stackMeasuresToPercent: boolean; + xaxis: { + format: "inherit" | "auto"; + max: number | string; + min: number | string; + name: { + visible: boolean; + position: "center" | "left" | "right" | "auto"; + }; + labelsEnabled: boolean; + rotation: "0" | "30" | "60" | "90" | "auto"; + visible: boolean; + }; + yaxis: { + name: { + visible: boolean; + position: "center" | "left" | "right" | "auto"; + }; + labelsEnabled: boolean; + rotation: "0" | "30" | "60" | "90" | "auto"; + visible: boolean; + }; + grid: { + enabled: boolean; + }; + disableDrillDown: boolean; + disableAlerts: boolean; + disableScheduledExports: boolean; }; -// Warning: (ae-missing-release-tag) "bubbleChart" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const bubbleChart: { - load: typeof load_7; - save: typeof save_7; - DEFAULTS: ConfigDefaults; +// @internal (undocumented) +export function barChartLoad(props: VisualisationConfig): Pair, any> | null; + +// @internal (undocumented) +export function barChartSave(_fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined): { + colorMapping: ColorMapping[] | undefined; + dataLabels: { + totalsVisible: "auto" | boolean | undefined; + visible: "auto" | boolean | undefined; + style: "auto" | "backplate" | undefined; + } | undefined; + chartFill: { + type: ChartFillType | undefined; + measureToPatternName: Record | undefined; + } | undefined; + legend: { + enabled: boolean | undefined; + position: string | undefined; + } | undefined; + stackMeasuresToPercent: boolean | undefined; + stackMeasures: boolean | undefined; + xaxis: { + format: string | undefined; + max: string | number | undefined; + min: string | number | undefined; + name: { + position: string | undefined; + visible: boolean | undefined; + } | undefined; + rotation: string | undefined; + visible: boolean | undefined; + labelsEnabled: boolean | undefined; + } | undefined; + yaxis: { + name: { + position: string | undefined; + visible: boolean | undefined; + } | undefined; + rotation: string | undefined; + visible: boolean | undefined; + labelsEnabled: boolean | undefined; + } | undefined; + grid: { + enabled: boolean | undefined; + } | undefined; + disableDrillDown: boolean | undefined; + disableAlerts: boolean | undefined; + disableScheduledExports: boolean | undefined; +} | undefined; + +// @internal (undocumented) +export const BUBBLE_CHART_DEFAULTS: ConfigDefaults; + +// @internal @deprecated (undocumented) +export const bubbleChart: IBubbleChartConfig; + +// @internal (undocumented) +export type BubbleChartConfigProperties = { + colorMapping: Array; + dataLabels: { + visible: boolean | "auto"; + style: "auto" | "backplate"; + }; + legend: { + enabled: boolean; + position: "top" | "bottom" | "left" | "right" | "auto"; + }; + xaxis: { + format: "inherit" | "auto"; + max: number | string; + min: number | string; + name: { + visible: boolean; + position: "center" | "left" | "right" | "auto"; + }; + labelsEnabled: boolean; + rotation: "0" | "30" | "60" | "90" | "auto"; + visible: boolean; + }; + yaxis: { + format: "inherit" | "auto"; + max: number | string; + min: number | string; + name: { + visible: boolean; + position: "center" | "left" | "right" | "auto"; + }; + labelsEnabled: boolean; + rotation: "0" | "30" | "60" | "90" | "auto"; + visible: boolean; + }; + grid: { + enabled: boolean; + }; + disableDrillDown: boolean; + disableAlerts: boolean; + disableScheduledExports: boolean; }; +// @internal (undocumented) +export function bubbleChartLoad(props: VisualisationConfig): Pair, any> | null; + +// @internal (undocumented) +export function bubbleChartSave(_fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined): { + colorMapping: ColorMapping[] | undefined; + dataLabels: { + visible: "auto" | boolean | undefined; + style: "auto" | "backplate" | undefined; + } | undefined; + legend: { + enabled: boolean | undefined; + position: string | undefined; + } | undefined; + xaxis: { + format: string | undefined; + max: string | number | undefined; + min: string | number | undefined; + name: { + position: string | undefined; + visible: boolean | undefined; + } | undefined; + rotation: string | undefined; + visible: boolean | undefined; + labelsEnabled: boolean | undefined; + } | undefined; + yaxis: { + format: string | undefined; + max: string | number | undefined; + min: string | number | undefined; + name: { + position: string | undefined; + visible: boolean | undefined; + } | undefined; + rotation: string | undefined; + visible: boolean | undefined; + labelsEnabled: boolean | undefined; + } | undefined; + grid: { + enabled: boolean | undefined; + } | undefined; + disableDrillDown: boolean | undefined; + disableAlerts: boolean | undefined; + disableScheduledExports: boolean | undefined; +} | undefined; + // @public (undocumented) export enum BucketsType { // (undocumented) @@ -213,38 +496,108 @@ export enum BucketsType { // @public (undocumented) export function buildAfmExecution(entities: ExportEntities, query: Query): ToExecutionResults; -// Warning: (ae-missing-release-tag) "buildAttributeLabels" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public +// @internal (undocumented) export function buildAttributeLabels(labels?: Attribute["labels"], isAuxiliaryDataset?: boolean): DeclarativeLabel[]; -// Warning: (ae-missing-release-tag) "buildAttributes" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public +// @internal (undocumented) export function buildAttributes(fields?: Fields, isAuxiliaryDataset?: boolean): DeclarativeAttribute[]; -// Warning: (ae-missing-release-tag) "buildFacts" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public +// @internal (undocumented) export function buildFacts(fields?: Fields): DeclarativeFact[]; -// Warning: (ae-missing-release-tag) "buildReferences" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public +// @internal (undocumented) export function buildReferences(entities: ExportEntities, refs?: Dataset["references"]): DeclarativeReference[]; -// Warning: (ae-missing-release-tag) "bulletChart" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const bulletChart: { - load: typeof load_14; - save: typeof save_14; - DEFAULTS: ConfigDefaults; +// @internal (undocumented) +export const BULLET_CHART_DEFAULTS: ConfigDefaults; + +// @internal @deprecated (undocumented) +export const bulletChart: IBulletChartConfig; + +// @internal (undocumented) +export type BulletChartConfigProperties = { + colorMapping: Array; + legend: { + enabled: boolean; + position: "top" | "bottom" | "left" | "right" | "auto"; + }; + chartFill: { + type: ChartFillType; + measureToPatternName?: Record; + }; + xaxis: { + format: "inherit" | "auto"; + max: number | string; + min: number | string; + name: { + visible: boolean; + position: "center" | "left" | "right" | "auto"; + }; + labelsEnabled: boolean; + rotation: "0" | "30" | "60" | "90" | "auto"; + visible: boolean; + }; + yaxis: { + name: { + visible: boolean; + position: "center" | "left" | "right" | "auto"; + }; + labelsEnabled: boolean; + rotation: "0" | "30" | "60" | "90" | "auto"; + visible: boolean; + }; + grid: { + enabled: boolean; + }; + disableDrillDown: boolean; + disableAlerts: boolean; + disableScheduledExports: boolean; }; -// Warning: (ae-missing-release-tag) "IChartFill" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) +export function bulletChartLoad(props: VisualisationConfig): Pair, any> | null; + +// @internal (undocumented) +export function bulletChartSave(_fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined): { + colorMapping: ColorMapping[] | undefined; + legend: { + enabled: boolean | undefined; + position: string | undefined; + } | undefined; + chartFill: { + type: ChartFillType | undefined; + measureToPatternName: Record | undefined; + } | undefined; + xaxis: { + format: string | undefined; + max: string | number | undefined; + min: string | number | undefined; + name: { + position: string | undefined; + visible: boolean | undefined; + } | undefined; + rotation: string | undefined; + visible: boolean | undefined; + labelsEnabled: boolean | undefined; + } | undefined; + yaxis: { + name: { + position: string | undefined; + visible: boolean | undefined; + } | undefined; + rotation: string | undefined; + visible: boolean | undefined; + labelsEnabled: boolean | undefined; + } | undefined; + grid: { + enabled: boolean | undefined; + } | undefined; + disableDrillDown: boolean | undefined; + disableAlerts: boolean | undefined; + disableScheduledExports: boolean | undefined; +} | undefined; + +// @internal (undocumented) export interface ChartFill { // (undocumented) measureToPatternName?: Record; @@ -252,13 +605,9 @@ export interface ChartFill { type: ChartFillType; } -// Warning: (ae-missing-release-tag) "ChartFillType" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export type ChartFillType = "solid" | "pattern" | "outline"; -// Warning: (ae-missing-release-tag) "ColorMapping" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public (undocumented) export type ColorMapping = { id: string; @@ -275,41 +624,280 @@ export type ColorMapping = { }; }; -// Warning: (ae-missing-release-tag) "columnChart" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const columnChart: { - load: typeof load_3; - save: typeof save_3; - DEFAULTS: ConfigDefaults; +// @internal (undocumented) +export const COLUMN_CHART_DEFAULTS: ConfigDefaults; + +// @internal @deprecated (undocumented) +export const columnChart: IColumnChartConfig; + +// @internal (undocumented) +export type ColumnChartConfigProperties = { + colorMapping: Array; + dataLabels: { + totalsVisible: boolean | "auto"; + visible: boolean | "auto"; + style: "auto" | "backplate"; + }; + chartFill: { + type: ChartFillType; + measureToPatternName?: Record; + }; + legend: { + enabled: boolean; + position: "top" | "bottom" | "left" | "right" | "auto"; + }; + stackMeasures: boolean; + stackMeasuresToPercent: boolean; + xaxis: { + name: { + visible: boolean; + position: "center" | "left" | "right" | "auto"; + }; + labelsEnabled: boolean; + rotation: "0" | "30" | "60" | "90" | "auto"; + visible: boolean; + }; + yaxis: { + format: "inherit" | "auto"; + max: number | string; + min: number | string; + name: { + visible: boolean; + position: "center" | "left" | "right" | "auto"; + }; + labelsEnabled: boolean; + rotation: "0" | "30" | "60" | "90" | "auto"; + visible: boolean; + }; + grid: { + enabled: boolean; + }; + disableDrillDown: boolean; + disableAlerts: boolean; + disableScheduledExports: boolean; }; -// Warning: (ae-missing-release-tag) "ColumnLocator" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// +// @internal (undocumented) +export function columnChartLoad(props: VisualisationConfig): Pair, any> | null; + +// @internal (undocumented) +export function columnChartSave(_fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined): { + colorMapping: ColorMapping[] | undefined; + dataLabels: { + totalsVisible: "auto" | boolean | undefined; + visible: "auto" | boolean | undefined; + style: "auto" | "backplate" | undefined; + } | undefined; + chartFill: { + type: ChartFillType | undefined; + measureToPatternName: Record | undefined; + } | undefined; + legend: { + enabled: boolean | undefined; + position: string | undefined; + } | undefined; + stackMeasuresToPercent: boolean | undefined; + stackMeasures: boolean | undefined; + xaxis: { + name: { + position: string | undefined; + visible: boolean | undefined; + } | undefined; + rotation: string | undefined; + visible: boolean | undefined; + labelsEnabled: boolean | undefined; + } | undefined; + yaxis: { + format: string | undefined; + max: string | number | undefined; + min: string | number | undefined; + name: { + position: string | undefined; + visible: boolean | undefined; + } | undefined; + rotation: string | undefined; + visible: boolean | undefined; + labelsEnabled: boolean | undefined; + } | undefined; + grid: { + enabled: boolean | undefined; + } | undefined; + disableDrillDown: boolean | undefined; + disableAlerts: boolean | undefined; + disableScheduledExports: boolean | undefined; +} | undefined; + // @public (undocumented) export type ColumnLocator = IAttributeColumnLocator | IMeasureColumnLocator | ITotalColumnLocator; -// Warning: (ae-missing-release-tag) "ColumnWidth" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public (undocumented) export type ColumnWidth = IAbsoluteColumnWidth | IAutoColumnWidth; -// Warning: (ae-missing-release-tag) "ColumnWidthItem" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public (undocumented) export type ColumnWidthItem = IAttributeColumnWidthItem | IMeasureColumnWidthItem | ISliceMeasureColumnWidthItem | IMixedValuesColumnWidthItem | IAllMeasureColumnWidthItem | IWeakMeasureColumnWidthItem; -// Warning: (ae-missing-release-tag) "comboChart" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const comboChart: { - load: typeof load_19; - save: typeof save_19; - DEFAULTS: ConfigDefaults; +// @internal (undocumented) +export const COMBO_CHART_DEFAULTS: ConfigDefaults; + +// @internal @deprecated (undocumented) +export const comboChart: IComboChartConfig; + +// @internal (undocumented) +export type ComboChartConfigProperties = { + colorMapping: Array; + continuousLine: { + enabled: boolean; + }; + distinctPointShapes: { + enabled: boolean; + pointShapeMapping?: Record; + }; + chartFill: { + type: ChartFillType; + measureToPatternName?: Record; + }; + dataLabels: { + visible: boolean | "auto"; + style: "auto" | "backplate"; + }; + dataPoints: { + visible: boolean | "auto"; + }; + legend: { + enabled: boolean; + position: "top" | "bottom" | "left" | "right" | "auto"; + }; + dualAxis: boolean; + primaryChartType: "column" | "area" | "line"; + secondaryChartType: "column" | "area" | "line"; + stackMeasures: boolean; + stackMeasuresToPercent: boolean; + xaxis: { + name: { + visible: boolean; + position: "center" | "left" | "right" | "auto"; + }; + labelsEnabled: boolean; + rotation: "0" | "30" | "60" | "90" | "auto"; + visible: boolean; + }; + yaxis: { + format: "inherit" | "auto"; + max: number | string; + min: number | string; + name: { + visible: boolean; + position: "center" | "left" | "right" | "auto"; + }; + labelsEnabled: boolean; + rotation: "0" | "30" | "60" | "90" | "auto"; + visible: boolean; + }; + secondary_yaxis: { + measures: string[]; + format: "inherit" | "auto"; + max: number | string; + min: number | string; + name: { + visible: boolean; + position: "center" | "left" | "right" | "auto"; + }; + labelsEnabled: boolean; + rotation: "0" | "30" | "60" | "90" | "auto"; + visible: boolean; + }; + grid: { + enabled: boolean; + }; + disableDrillDown: boolean; + disableAlerts: boolean; + disableScheduledExports: boolean; + thresholdMeasures: string[]; + thresholdExcludedMeasures: string[]; +}; + +// @internal (undocumented) +export function comboChartLoad(props: VisualisationConfig): Pair, any> | null; + +// @internal (undocumented) +export function comboChartSave(_fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, buckets?: Bucket[]): { + colorMapping: ColorMapping[] | undefined; + continuousLine: { + enabled: boolean | undefined; + } | undefined; + distinctPointShapes: { + enabled: boolean | undefined; + pointShapeMapping: Record | undefined; + } | undefined; + chartFill: { + type: ChartFillType | undefined; + measureToPatternName: Record | undefined; + } | undefined; + dataPoints: { + visible: "auto" | boolean | undefined; + } | undefined; + dataLabels: { + visible: "auto" | boolean | undefined; + style: "auto" | "backplate" | undefined; + } | undefined; + legend: { + enabled: boolean | undefined; + position: string | undefined; + } | undefined; + stackMeasuresToPercent: boolean | undefined; + stackMeasures: boolean | undefined; + xaxis: { + name: { + position: string | undefined; + visible: boolean | undefined; + } | undefined; + rotation: string | undefined; + visible: boolean | undefined; + labelsEnabled: boolean | undefined; + } | undefined; + primaryChartType: "area" | "column" | "line" | undefined; + yaxis: { + format: string | undefined; + max: string | number | undefined; + min: string | number | undefined; + name: { + position: string | undefined; + visible: boolean | undefined; + } | undefined; + rotation: string | undefined; + visible: boolean | undefined; + labelsEnabled: boolean | undefined; + } | undefined; + secondaryChartType: "area" | "column" | "line" | undefined; + secondary_yaxis: { + measures: string[] | undefined; + format: string | undefined; + max: string | number | undefined; + min: string | number | undefined; + name: { + position: string | undefined; + visible: boolean | undefined; + } | undefined; + rotation: string | undefined; + visible: boolean | undefined; + labelsEnabled: boolean | undefined; + } | undefined; + dualAxis: boolean | undefined; + grid: { + enabled: boolean | undefined; + } | undefined; + disableDrillDown: boolean | undefined; + disableAlerts: boolean | undefined; + disableScheduledExports: boolean | undefined; + thresholdMeasures: string[] | undefined; + thresholdExcludedMeasures: string[] | undefined; +} | undefined; + +// @internal (undocumented) +export type ConfigDefaults = { + [key in keyof T]: T[key]; }; -// Warning: (ae-forgotten-export) The symbol "FullFields" needs to be exported by the entry point index.d.ts -// // @public (undocumented) export function convertBucketToTitle(entities: ExportEntities, query: Query, field: FullFields, location?: boolean): string | null; @@ -353,6 +941,14 @@ export function createIdentifier(data: string, { forceM forceType?: "user" | "userGroup" | "dataset" | "date" | "attribute" | "label" | "measure" | "workspaceDataFilter" | "visualizationObject" | "analyticalDashboard" | "dashboardPlugin" | "filterContext"; }): T | null; +// @internal (undocumented) +export type DashboardDefinition = Pick & { + version: string; +}; + +// @internal (undocumented) +export type DashboardSection = Required["layout"]["sections"][number]; + // @public (undocumented) export type DashboardTab = { localIdentifier: string; @@ -366,29 +962,22 @@ export type DashboardTab = { filterGroupsConfig?: IDashboardFilterGroupsConfig; }; -// Warning: (ae-missing-release-tag) "DashboardTypes" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export const DashboardTypes: string[]; -// Warning: (ae-missing-release-tag) "DatasetTypes" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) +export type DashboardWidget = DashboardSection["items"][number]; + +// @internal (undocumented) export const DatasetTypes: string[]; -// Warning: (ae-missing-release-tag) "DateDatasetTypes" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export const DateDatasetTypes: string[]; -// Warning: (ae-missing-release-tag) "declarativeAbsoluteDateFilterToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function declarativeAbsoluteDateFilterToYaml(absoluteDateFilter: IAbsoluteDateFilter["absoluteDateFilter"], connectedAttributeFilters: IFilter[] | undefined, entities: FromEntities, getUniqueKey: (baseKey: string) => string, errorContext?: IErrorContext): YAMLMap; -// Warning: (ae-missing-release-tag) "declarativeArithmeticMetricToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function declarativeArithmeticMetricToYaml(def: IMeasureBody, arithmeticDefinition: IArithmeticMeasureDefinition): YAMLMap; // @public (undocumented) @@ -397,21 +986,14 @@ export function declarativeAttributeHierarchyToYaml(hierarchy: DeclarativeAttrib json: AttributeHierarchy; }; -// Warning: (ae-missing-release-tag) "declarativeAttributeSortToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function declarativeAttributeSortToYaml(sort: IAttributeSortItem): YAMLMap; -// Warning: (ae-missing-release-tag) "declarativeAttributeToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function declarativeAttributeToYaml(def: IAttributeBody, errorContext?: IErrorContext): YAMLMap; -// Warning: (ae-forgotten-export) The symbol "Buckets" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "declarativeBucketsToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export function declarativeBucketsToYaml(entities: FromEntities, buckets: IBucket[], errorContext?: IErrorContext): Buckets; +// @internal (undocumented) +export function declarativeBucketsToYaml(entities: FromEntities, buckets: IBucket[], errorContext?: IErrorContext): YamlBuckets; // @public (undocumented) export function declarativeDashboardToYaml(entities: FromEntities, dashboard: DeclarativeAnalyticalDashboard, filterContexts?: DeclarativeFilterContext[], context?: IErrorContext): { @@ -431,14 +1013,10 @@ export function declarativeDateInstanceToYaml(dataset: DeclarativeDateDataset): json: DateDataset; }; -// Warning: (ae-missing-release-tag) "declarativeDrillToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function declarativeDrillToYaml(drill: InsightDrillDefinition, entities?: FromEntities, sourceVisualizationId?: string, errorContext?: IErrorContext): YAMLMap; -// Warning: (ae-missing-release-tag) "declarativeFilterContextToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function declarativeFilterContextToYaml(dateFilterConfig?: IDashboardDateFilterConfig, filterContext?: DeclarativeFilterContext, errorContext?: IErrorContext): { filters: YAMLMap; filtersMap: { @@ -446,30 +1024,19 @@ export function declarativeFilterContextToYaml(dateFilterConfig?: IDashboardDate }; }; -// Warning: (ae-missing-release-tag) "declarativeFiltersConfigToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function declarativeFiltersConfigToYaml(filtersMap: Record, dateFilterConfig?: IDashboardDateFilterConfig, dateFilterConfigs?: IDashboardDateFilterConfigItem[], attributeFilterConfigs?: IDashboardAttributeFilterConfig[], measureValueFilterConfigs?: IDashboardMeasureValueFilterConfig[], errorContext?: IErrorContext): void; -// Warning: (ae-forgotten-export) The symbol "Filters" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "declarativeFiltersToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export function declarativeFiltersToYaml(entities: FromEntities, filters: IFilter[], errorContext?: IErrorContext): Filters; +// @internal (undocumented) +export function declarativeFiltersToYaml(entities: FromEntities, filters: IFilter[], errorContext?: IErrorContext): YamlFilters; -// Warning: (ae-missing-release-tag) "declarativeInlineMetricToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function declarativeInlineMetricToYaml(def: IMeasureBody, inlineDef: IInlineMeasureDefinition): YAMLMap; -// Warning: (ae-missing-release-tag) "declarativeMeasureSortToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function declarativeMeasureSortToYaml(sort: IMeasureSortItem): YAMLMap; -// Warning: (ae-missing-release-tag) "declarativeMeasureValueFilterToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function declarativeMeasureValueFilterToYaml(measureValueFilter: IMeasureValueFilterBody, errorContext?: IErrorContext): YAMLMap; // @public (undocumented) @@ -478,20 +1045,13 @@ export function declarativeMetricToYaml(metric: DeclarativeMetric): { json: Metric; }; -// Warning: (ae-missing-release-tag) "declarativeNegativeAttributeFilterToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function declarativeNegativeAttributeFilterToYaml(entities: FromEntities, attributeFilter: INegativeAttributeFilterBody, errorContext?: IErrorContext): YAMLMap; -// Warning: (ae-forgotten-export) The symbol "PostProcessors" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "declarativeNormalMetricToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export function declarativeNormalMetricToYaml(def: IMeasureBody, metricDefinition: IMeasureDefinition, postProcessors: PostProcessors, errorContext?: IErrorContext): YAMLMap; +// @internal (undocumented) +export function declarativeNormalMetricToYaml(def: IMeasureBody, metricDefinition: IMeasureDefinition, postProcessors: YamlPostProcessors, errorContext?: IErrorContext): YAMLMap; -// Warning: (ae-missing-release-tag) "declarativePluginsToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function declarativePluginsToYaml(dashboard: IDashboardDefinition, errorContext?: IErrorContext): YAMLSeq | undefined; // @public (undocumented) @@ -500,58 +1060,37 @@ export function declarativePluginToYaml(plugin: DeclarativeDashboardPlugin): { json: Plugin_2; }; -// Warning: (ae-missing-release-tag) "declarativePoPMetricToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function declarativePoPMetricToYaml(def: IMeasureBody, popDefinition: IPoPMeasureDefinition, errorContext?: IErrorContext): YAMLMap; -// Warning: (ae-missing-release-tag) "declarativePositiveAttributeFilterToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function declarativePositiveAttributeFilterToYaml(entities: FromEntities, attributeFilter: IPositiveAttributeFilterBody, errorContext?: IErrorContext): YAMLMap; -// Warning: (ae-missing-release-tag) "declarativePreviousPeriodMetricToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function declarativePreviousPeriodMetricToYaml(def: IMeasureBody, previousDefinition: IPreviousPeriodMeasureDefinition, errorContext?: IErrorContext): YAMLMap; -// Warning: (ae-missing-release-tag) "declarativeRankingFilterToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function declarativeRankingFilterToYaml(rankingFilter: IRankingFilterBody, errorContext?: IErrorContext): YAMLMap; -// Warning: (ae-missing-release-tag) "declarativeRelativeDateFilterToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function declarativeRelativeDateFilterToYaml(relativeDateFilter: IRelativeDateFilter["relativeDateFilter"], connectedAttributeFilters: IFilter[] | undefined, entities: FromEntities, getUniqueKey: (baseKey: string) => string, errorContext?: IErrorContext): YAMLMap; -// Warning: (ae-missing-release-tag) "declarativeSectionsToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function declarativeSectionsToYaml(layout?: IDashboardLayout, entities?: FromEntities, errorContext?: IErrorContext): YAMLSeq | undefined; -// Warning: (ae-forgotten-export) The symbol "Sorts_2" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "declarativeSortsToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export function declarativeSortsToYaml(sorts: ISortItem[], _errorContext?: IErrorContext): Sorts_2; +// @internal (undocumented) +export function declarativeSortsToYaml(sorts: ISortItem[], _errorContext?: IErrorContext): YamlSorts; -// Warning: (ae-missing-release-tag) "declarativeTabsToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function declarativeTabsToYaml(tabs: DashboardTab[], filterContexts?: DeclarativeFilterContext[], entities?: FromEntities, errorContext?: IErrorContext): YAMLSeq | undefined; -// Warning: (ae-missing-release-tag) "declarativeTotalToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function declarativeTotalToYaml(total: ITotal, _errorContext?: IErrorContext): { totalMap: YAMLMap; attribute: string; }; -// Warning: (ae-missing-release-tag) "declarativeVisTypeToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function declarativeVisTypeToYaml(def: IInsightDefinition["insight"]): string | null; // @public (undocumented) @@ -560,29 +1099,100 @@ export function declarativeVisualisationToYaml(entities: FromEntities, visualisa json?: Visualisation; }; -// Warning: (ae-missing-release-tag) "declarativeWidgetToYaml" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function declarativeWidgetToYaml(widget?: IDashboardWidget | null, size?: IDashboardLayoutItem["size"], entities?: FromEntities, errorContext?: IErrorContext): YAMLMap | undefined; -// Warning: (ae-missing-release-tag) "dependencyWheelChart" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const dependencyWheelChart: { - load: typeof load_16; - save: typeof save_16; - DEFAULTS: ConfigDefaults; +// @internal (undocumented) +export const DEPENDENCY_WHEEL_CHART_DEFAULTS: ConfigDefaults; + +// @internal @deprecated (undocumented) +export const dependencyWheelChart: IDependencyWheelChartConfig; + +// @internal (undocumented) +export type DependencyWheelChartConfigProperties = { + colorMapping: Array; + dataLabels: { + visible: boolean | "auto"; + }; + legend: { + enabled: boolean; + position: "top" | "bottom" | "left" | "right" | "auto"; + }; + disableDrillDown: boolean; + disableAlerts: boolean; + disableScheduledExports: boolean; }; -// Warning: (ae-missing-release-tag) "donutChart" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const donutChart: { - load: typeof load_9; - save: typeof save_9; - DEFAULTS: ConfigDefaults; +// @internal (undocumented) +export function dependencyWheelChartLoad(props: VisualisationConfig): Pair, any> | null; + +// @internal (undocumented) +export function dependencyWheelChartSave(_fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined): { + colorMapping: ColorMapping[] | undefined; + dataLabels: { + visible: "auto" | boolean | undefined; + } | undefined; + legend: { + enabled: boolean | undefined; + position: string | undefined; + } | undefined; + disableDrillDown: boolean | undefined; + disableAlerts: boolean | undefined; + disableScheduledExports: boolean | undefined; +} | undefined; + +// @internal (undocumented) +export const DONUT_CHART_DEFAULTS: ConfigDefaults; + +// @internal @deprecated (undocumented) +export const donutChart: IDonutChartConfig; + +// @internal (undocumented) +export type DonutChartConfigProperties = { + colorMapping: Array; + dataLabels: { + visible: boolean | "auto"; + style: "auto" | "backplate"; + }; + chartFill: { + type: ChartFillType; + measureToPatternName?: Record; + }; + legend: { + enabled: boolean; + position: "top" | "bottom" | "left" | "right" | "auto"; + }; + disableDrillDown: boolean; + disableAlerts: boolean; + disableScheduledExports: boolean; }; +// @internal (undocumented) +export function donutChartLoad(props: VisualisationConfig): Pair, any> | null; + +// @internal (undocumented) +export function donutChartSave(_fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined): { + colorMapping: ColorMapping[] | undefined; + dataLabels: { + visible: "auto" | boolean | undefined; + style: "auto" | "backplate" | undefined; + } | undefined; + chartFill: { + type: ChartFillType | undefined; + measureToPatternName: Record | undefined; + } | undefined; + legend: { + enabled: boolean | undefined; + position: string | undefined; + } | undefined; + disableDrillDown: boolean | undefined; + disableAlerts: boolean | undefined; + disableScheduledExports: boolean | undefined; +} | undefined; + +// @internal (undocumented) +export type EmptyValueHandling = NonNullable; + // @public (undocumented) export type ExportEntities = Array<{ id: string; @@ -603,9 +1213,12 @@ export type FileNamesUsed = { // @public (undocumented) export type FilePath = string[] | string; -// Warning: (ae-missing-release-tag) "FilterContextItem" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) +export type FilterContextDefinition = Pick & { + version: string; +}; + +// @internal (undocumented) export type FilterContextItem = { yaml: YAMLMap; filter: IFilterContextDefinition["filters"][number]; @@ -622,15 +1235,58 @@ export type FromEntities = Array<{ data?: Dataset | DateDataset | Metric | Visualisation | Dashboard | Plugin_2 | AttributeHierarchy; }>; -// Warning: (ae-missing-release-tag) "funnelChart" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public (undocumented) -export const funnelChart: { - load: typeof load_12; - save: typeof save_12; - DEFAULTS: ConfigDefaults; +export type FullFields = AttributeField | MetricField | CalculatedMetricField | InlineMetricField | ArithmeticMetricField | PoPMetricField | PreviousPeriodMetricField; + +// @internal (undocumented) +export const FUNNEL_CHART_DEFAULTS: ConfigDefaults; + +// @internal @deprecated (undocumented) +export const funnelChart: IFunnelChartConfig; + +// @internal (undocumented) +export type FunnelChartConfigProperties = { + colorMapping: Array; + dataLabels: { + visible: boolean | "auto"; + style: "auto" | "backplate"; + }; + chartFill: { + type: ChartFillType; + measureToPatternName?: Record; + }; + legend: { + enabled: boolean; + position: "top" | "bottom" | "left" | "right" | "auto"; + }; + disableDrillDown: boolean; + disableAlerts: boolean; + disableScheduledExports: boolean; }; +// @internal (undocumented) +export function funnelChartLoad(props: VisualisationConfig): Pair, any> | null; + +// @internal (undocumented) +export function funnelChartSave(_fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined): { + colorMapping: ColorMapping[] | undefined; + dataLabels: { + visible: "auto" | boolean | undefined; + style: "auto" | "backplate" | undefined; + } | undefined; + chartFill: { + type: ChartFillType | undefined; + measureToPatternName: Record | undefined; + } | undefined; + legend: { + enabled: boolean | undefined; + position: string | undefined; + } | undefined; + disableDrillDown: boolean | undefined; + disableAlerts: boolean | undefined; + disableScheduledExports: boolean | undefined; +} | undefined; + // @public (undocumented) export function generateFileName(used: FileNamesUsed, base: string[], id: string, title?: string | null): string; @@ -654,50 +1310,324 @@ export type GenericAssigneeRulePermission = { // @public (undocumented) export type GenericPermission = GenericAssigneePermission | GenericAssigneeRulePermission; -// Warning: (ae-missing-release-tag) "geoAreaChart" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const geoAreaChart: { - load: typeof load_21; - save: typeof save_21; - DEFAULTS: ConfigDefaults; +// @internal (undocumented) +export const GEO_AREA_CHART_DEFAULTS: ConfigDefaults; + +// @internal (undocumented) +export const GEO_CHART_DEFAULTS: ConfigDefaults; + +// @internal @deprecated (undocumented) +export const geoAreaChart: IGeoAreaChartConfig; + +// @internal (undocumented) +export type GeoAreaChartConfigProperties = { + colorMapping: Array; + legend: { + enabled: boolean; + position: "top" | "bottom" | "left" | "right" | "auto" | "top-left" | "top-right" | "bottom-left" | "bottom-right"; + }; + tooltipText: string; + basemap: string; + viewport: { + area: "auto" | "continent_af" | "continent_as" | "continent_au" | "continent_eu" | "continent_na" | "continent_sa" | "world" | "custom"; + navigation: { + pan: boolean; + zoom: boolean; + }; + }; + center: { + lat: number; + lng: number; + }; + zoom: number; + bounds: { + northEast: { + lat: number; + lng: number; + }; + southWest: { + lat: number; + lng: number; + }; + }; + disableAlerts: boolean; + disableScheduledExports: boolean; }; -// Warning: (ae-missing-release-tag) "geoChart" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const geoChart: { - load: typeof load_20; - save: typeof save_20; - DEFAULTS: ConfigDefaults; +// @internal (undocumented) +export function geoAreaChartLoad(props: VisualisationConfig): Pair, any> | null; + +// @internal (undocumented) +export function geoAreaChartSave(_fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, _positions: Array<{ + longitude: string; + latitude: string; +}>): { + colorMapping: ColorMapping[] | undefined; + legend: { + enabled: boolean | undefined; + position: string | undefined; + } | undefined; + tooltipText: string | undefined; + basemap: string | undefined; + viewport: { + area: "auto" | "continent_af" | "continent_as" | "continent_au" | "continent_eu" | "continent_na" | "continent_sa" | "custom" | "world" | undefined; + navigation: { + pan: boolean | undefined; + zoom: boolean | undefined; + } | undefined; + } | undefined; + center: { + lat: number | undefined; + lng: number | undefined; + } | undefined; + zoom: number | undefined; + bounds: { + northEast: { + lat: number | undefined; + lng: number | undefined; + } | undefined; + southWest: { + lat: number | undefined; + lng: number | undefined; + } | undefined; + } | undefined; + disableAlerts: boolean | undefined; + disableScheduledExports: boolean | undefined; +} | undefined; + +// @internal @deprecated (undocumented) +export const geoChart: IGeoChartConfig; + +// @internal (undocumented) +export type GeoChartConfigProperties = { + colorMapping: Array; + legend: { + enabled: boolean; + position: "top" | "bottom" | "left" | "right" | "auto" | "top-left" | "top-right" | "bottom-left" | "bottom-right"; + }; + longitude: string; + latitude: string; + tooltipText: string; + basemap: string; + viewport: { + area: "auto" | "continent_af" | "continent_as" | "continent_au" | "continent_eu" | "continent_na" | "continent_sa" | "world" | "custom"; + navigation: { + pan: boolean; + zoom: boolean; + }; + }; + center: { + lat: number; + lng: number; + }; + zoom: number; + bounds: { + northEast: { + lat: number; + lng: number; + }; + southWest: { + lat: number; + lng: number; + }; + }; + points: { + groupNearbyPoints: boolean; + maxSize: "0.5x" | "0.75x" | "normal" | "1.25x" | "1.5x" | "default"; + minSize: "0.5x" | "0.75x" | "normal" | "1.25x" | "1.5x" | "default"; + shapeType: "circle" | "iconByValue" | "oneIcon"; + icon: string; + }; + disableAlerts: boolean; + disableScheduledExports: boolean; }; +// @internal (undocumented) +export function geoChartLoad(props: VisualisationConfig): Pair, any> | null; + +// @internal (undocumented) +export function geoChartSave(_fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, positions: Array<{ + longitude: string; + latitude: string; +}>): { + longitude: string; + latitude: string; +} | undefined; + // @public (undocumented) export function getIdentifier(obj: ObjRef | ObjRefInScope | AfmObjectIdentifier, untype?: boolean, errorContext?: IErrorContext): string; // @public (undocumented) export function getValueOrDefault(value: T, defaultValue: T, type?: ValueType, undefinedAsDefault?: boolean): T | undefined; -// Warning: (ae-missing-release-tag) "headlineChart" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const headlineChart: { - load: typeof load_18; - save: typeof save_18; - DEFAULTS: ConfigDefaults; +// @internal (undocumented) +export const HEADLINE_CHART_DEFAULTS: ConfigDefaults; + +// @internal @deprecated (undocumented) +export const headlineChart: IHeadlineChartConfig; + +// @internal (undocumented) +export type HeadlineChartConfigProperties = { + comparison: { + enabled: boolean; + calculationType: "change" | "change_difference" | "ratio" | "difference"; + format: "inherit" | string; + position: "right" | "left" | "top" | "auto"; + isArrowEnabled: boolean; + colorConfig?: { + disabled: boolean; + equals: ColorMapping["color"] | undefined; + negative: ColorMapping["color"] | undefined; + positive: ColorMapping["color"] | undefined; + }; + labelConfig?: { + isConditional: boolean; + unconditionalValue: string; + equals: string; + negative: string; + positive: string; + }; + }; + disableAlerts: boolean; + disableScheduledExports: boolean; }; -// Warning: (ae-missing-release-tag) "heatmapChart" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const heatmapChart: { - load: typeof load_13; - save: typeof save_13; - DEFAULTS: ConfigDefaults; +// @internal (undocumented) +export function headlineChartLoad(props: VisualisationConfig): Pair, any> | null; + +// @internal (undocumented) +export function headlineChartSave(_fields: Visualisation["query"]["fields"] | undefined, config?: Visualisation["config"] | undefined): { + comparison: { + calculationType: string | undefined; + format: string | undefined; + enabled: boolean | undefined; + position: string | undefined; + isArrowEnabled: boolean | undefined; + labelConfig: { + isConditional: boolean | undefined; + unconditionalValue: string | undefined; + equals: string | undefined; + negative: string | undefined; + positive: string | undefined; + } | undefined; + colorConfig: { + disabled: boolean | undefined; + equals: { + type: "guid"; + value: string; + } | { + type: "rgb"; + value: { + r: number; + g: number; + b: number; + }; + } | undefined; + negative: { + type: "guid"; + value: string; + } | { + type: "rgb"; + value: { + r: number; + g: number; + b: number; + }; + } | undefined; + positive: { + type: "guid"; + value: string; + } | { + type: "rgb"; + value: { + r: number; + g: number; + b: number; + }; + } | undefined; + } | undefined; + } | undefined; + disableAlerts: boolean | undefined; + disableScheduledExports: boolean | undefined; +} | undefined; + +// @internal (undocumented) +export const HEATMAP_CHART_DEFAULTS: ConfigDefaults; + +// @internal @deprecated (undocumented) +export const heatmapChart: IHeatmapChartConfig; + +// @internal (undocumented) +export type HeatmapChartConfigProperties = { + colorMapping: Array; + dataLabels: { + visible: boolean | "auto"; + style: "auto" | "backplate"; + }; + legend: { + enabled: boolean; + position: "top" | "bottom" | "left" | "right" | "auto"; + }; + xaxis: { + name: { + visible: boolean; + position: "center" | "left" | "right" | "auto"; + }; + labelsEnabled: boolean; + rotation: "0" | "30" | "60" | "90" | "auto"; + visible: boolean; + }; + yaxis: { + name: { + visible: boolean; + position: "center" | "left" | "right" | "auto"; + }; + labelsEnabled: boolean; + rotation: "0" | "30" | "60" | "90" | "auto"; + visible: boolean; + }; + disableDrillDown: boolean; + disableAlerts: boolean; + disableScheduledExports: boolean; }; -// Warning: (ae-missing-release-tag) "IAbsoluteColumnWidth" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// +// @internal (undocumented) +export function heatmapChartLoad(props: VisualisationConfig): Pair, any> | null; + +// @internal (undocumented) +export function heatmapChartSave(_fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined): { + colorMapping: ColorMapping[] | undefined; + dataLabels: { + visible: "auto" | boolean | undefined; + style: "auto" | "backplate" | undefined; + } | undefined; + legend: { + enabled: boolean | undefined; + position: string | undefined; + } | undefined; + xaxis: { + name: { + position: string | undefined; + visible: boolean | undefined; + } | undefined; + rotation: string | undefined; + visible: boolean | undefined; + labelsEnabled: boolean | undefined; + } | undefined; + yaxis: { + name: { + position: string | undefined; + visible: boolean | undefined; + } | undefined; + rotation: string | undefined; + visible: boolean | undefined; + labelsEnabled: boolean | undefined; + } | undefined; + disableDrillDown: boolean | undefined; + disableAlerts: boolean | undefined; + disableScheduledExports: boolean | undefined; +} | undefined; + // @public (undocumented) export interface IAbsoluteColumnWidth { // (undocumented) @@ -706,32 +1636,34 @@ export interface IAbsoluteColumnWidth { value: number; } -// Warning: (ae-missing-release-tag) "IAllMeasureColumnWidthItem" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public (undocumented) export interface IAllMeasureColumnWidthItem { // (undocumented) measureColumnWidthItem: IAllMeasureColumnWidthItemBody; } -// Warning: (ae-missing-release-tag) "IAllMeasureColumnWidthItemBody" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public (undocumented) export interface IAllMeasureColumnWidthItemBody { // (undocumented) width: IAbsoluteColumnWidth; } -// Warning: (ae-missing-release-tag) "IAttributeColumnLocator" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// +// @internal @deprecated (undocumented) +export interface IAreaChartConfig { + // (undocumented) + DEFAULTS: ConfigDefaults; + // (undocumented) + load: typeof areaChartLoad; + // (undocumented) + save: typeof areaChartSave; +} + // @public (undocumented) export interface IAttributeColumnLocator { // (undocumented) attributeLocatorItem: IAttributeColumnLocatorBody; } -// Warning: (ae-missing-release-tag) "IAttributeColumnLocatorBody" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public (undocumented) export interface IAttributeColumnLocatorBody { // (undocumented) @@ -740,16 +1672,12 @@ export interface IAttributeColumnLocatorBody { element?: string | null; } -// Warning: (ae-missing-release-tag) "IAttributeColumnWidthItem" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public (undocumented) export interface IAttributeColumnWidthItem { // (undocumented) attributeColumnWidthItem: IAttributeColumnWidthItemBody; } -// Warning: (ae-missing-release-tag) "IAttributeColumnWidthItemBody" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public (undocumented) export interface IAttributeColumnWidthItemBody { // (undocumented) @@ -758,14 +1686,62 @@ export interface IAttributeColumnWidthItemBody { width: IAbsoluteColumnWidth; } -// Warning: (ae-missing-release-tag) "IAutoColumnWidth" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public (undocumented) export interface IAutoColumnWidth { // (undocumented) value: "auto"; } +// @internal @deprecated (undocumented) +export interface IBarChartConfig { + // (undocumented) + DEFAULTS: ConfigDefaults; + // (undocumented) + load: typeof barChartLoad; + // (undocumented) + save: typeof barChartSave; +} + +// @internal @deprecated (undocumented) +export interface IBubbleChartConfig { + // (undocumented) + DEFAULTS: ConfigDefaults; + // (undocumented) + load: typeof bubbleChartLoad; + // (undocumented) + save: typeof bubbleChartSave; +} + +// @internal @deprecated (undocumented) +export interface IBulletChartConfig { + // (undocumented) + DEFAULTS: ConfigDefaults; + // (undocumented) + load: typeof bulletChartLoad; + // (undocumented) + save: typeof bulletChartSave; +} + +// @internal @deprecated (undocumented) +export interface IColumnChartConfig { + // (undocumented) + DEFAULTS: ConfigDefaults; + // (undocumented) + load: typeof columnChartLoad; + // (undocumented) + save: typeof columnChartSave; +} + +// @internal @deprecated (undocumented) +export interface IComboChartConfig { + // (undocumented) + DEFAULTS: ConfigDefaults; + // (undocumented) + load: typeof comboChartLoad; + // (undocumented) + save: typeof comboChartSave; +} + // @public (undocumented) export interface ICoreError extends Error { // (undocumented) @@ -776,6 +1752,26 @@ export interface ICoreError extends Error { type: (typeof CoreErrorTypes)[keyof typeof CoreErrorTypes]; } +// @internal @deprecated (undocumented) +export interface IDependencyWheelChartConfig { + // (undocumented) + DEFAULTS: ConfigDefaults; + // (undocumented) + load: typeof dependencyWheelChartLoad; + // (undocumented) + save: typeof dependencyWheelChartSave; +} + +// @internal @deprecated (undocumented) +export interface IDonutChartConfig { + // (undocumented) + DEFAULTS: ConfigDefaults; + // (undocumented) + load: typeof donutChartLoad; + // (undocumented) + save: typeof donutChartSave; +} + // @public (undocumented) export interface IErrorContext { // (undocumented) @@ -786,32 +1782,84 @@ export interface IErrorContext { type?: string; } -// Warning: (ae-missing-release-tag) "IMeasureColumnLocator" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// +// @internal @deprecated (undocumented) +export interface IFunnelChartConfig { + // (undocumented) + DEFAULTS: ConfigDefaults; + // (undocumented) + load: typeof funnelChartLoad; + // (undocumented) + save: typeof funnelChartSave; +} + +// @internal @deprecated (undocumented) +export interface IGeoAreaChartConfig { + // (undocumented) + DEFAULTS: ConfigDefaults; + // (undocumented) + load: typeof geoAreaChartLoad; + // (undocumented) + save: typeof geoAreaChartSave; +} + +// @internal @deprecated (undocumented) +export interface IGeoChartConfig { + // (undocumented) + DEFAULTS: ConfigDefaults; + // (undocumented) + load: typeof geoChartLoad; + // (undocumented) + save: typeof geoChartSave; +} + +// @internal @deprecated (undocumented) +export interface IHeadlineChartConfig { + // (undocumented) + DEFAULTS: ConfigDefaults; + // (undocumented) + load: typeof headlineChartLoad; + // (undocumented) + save: typeof headlineChartSave; +} + +// @internal @deprecated (undocumented) +export interface IHeatmapChartConfig { + // (undocumented) + DEFAULTS: ConfigDefaults; + // (undocumented) + load: typeof heatmapChartLoad; + // (undocumented) + save: typeof heatmapChartSave; +} + +// @internal @deprecated (undocumented) +export interface ILineChartConfig { + // (undocumented) + DEFAULTS: ConfigDefaults; + // (undocumented) + load: typeof lineChartLoad; + // (undocumented) + save: typeof lineChartSave; +} + // @public (undocumented) export interface IMeasureColumnLocator { // (undocumented) measureLocatorItem: IMeasureColumnLocatorBody; } -// Warning: (ae-missing-release-tag) "IMeasureColumnLocatorBody" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public (undocumented) export interface IMeasureColumnLocatorBody { // (undocumented) measureIdentifier: string; } -// Warning: (ae-missing-release-tag) "IMeasureColumnWidthItem" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public (undocumented) export interface IMeasureColumnWidthItem { // (undocumented) measureColumnWidthItem: IMeasureColumnWidthItemBody; } -// Warning: (ae-missing-release-tag) "IMeasureColumnWidthItemBody" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public (undocumented) export interface IMeasureColumnWidthItemBody { // (undocumented) @@ -820,16 +1868,12 @@ export interface IMeasureColumnWidthItemBody { width: ColumnWidth; } -// Warning: (ae-missing-release-tag) "IMixedValuesColumnWidthItem" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public (undocumented) export interface IMixedValuesColumnWidthItem { // (undocumented) mixedValuesColumnWidthItem: IMixedValuesColumnWidthItemBody; } -// Warning: (ae-missing-release-tag) "IMixedValuesColumnWidthItemBody" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public (undocumented) export interface IMixedValuesColumnWidthItemBody { // (undocumented) @@ -838,23 +1882,69 @@ export interface IMixedValuesColumnWidthItemBody { width: ColumnWidth; } -// Warning: (ae-missing-release-tag) "InlineVisualizations" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export type InlineVisualizations = Record; -// Warning: (ae-missing-release-tag) "ISliceMeasureColumnWidthItem" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// +// @internal @deprecated (undocumented) +export interface IPieChartConfig { + // (undocumented) + DEFAULTS: ConfigDefaults; + // (undocumented) + load: typeof pieChartLoad; + // (undocumented) + save: typeof pieChartSave; +} + +// @internal @deprecated (undocumented) +export interface IPyramidChartConfig { + // (undocumented) + DEFAULTS: ConfigDefaults; + // (undocumented) + load: typeof pyramidChartLoad; + // (undocumented) + save: typeof pyramidChartSave; +} + +// @internal @deprecated (undocumented) +export interface IRepeaterChartConfig { + // (undocumented) + DEFAULTS: ConfigDefaults; + // (undocumented) + load: typeof repeaterChartLoad; + // (undocumented) + save: typeof repeaterChartSave; + // (undocumented) + saveInlineVisualizations: typeof saveInlineVisualizations; +} + +// @internal @deprecated (undocumented) +export interface ISankeyChartConfig { + // (undocumented) + DEFAULTS: ConfigDefaults; + // (undocumented) + load: typeof sankeyChartLoad; + // (undocumented) + save: typeof sankeyChartSave; +} + +// @internal @deprecated (undocumented) +export interface IScatterChartConfig { + // (undocumented) + DEFAULTS: ConfigDefaults; + // (undocumented) + load: typeof scatterChartLoad; + // (undocumented) + save: typeof scatterChartSave; +} + // @public (undocumented) export interface ISliceMeasureColumnWidthItem { // (undocumented) sliceMeasureColumnWidthItem: ISliceMeasureColumnWidthItemBody; } -// Warning: (ae-missing-release-tag) "ISliceMeasureColumnWidthItemBody" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public (undocumented) export interface ISliceMeasureColumnWidthItemBody { // (undocumented) @@ -863,16 +1953,22 @@ export interface ISliceMeasureColumnWidthItemBody { width: ColumnWidth; } -// Warning: (ae-missing-release-tag) "ITotalColumnLocator" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// +// @internal @deprecated (undocumented) +export interface ITableConfig { + // (undocumented) + DEFAULTS: ConfigDefaults; + // (undocumented) + load: typeof tableLoad; + // (undocumented) + save: typeof tableSave; +} + // @public (undocumented) export interface ITotalColumnLocator { // (undocumented) totalLocatorItem: ITotalColumnLocatorBody; } -// Warning: (ae-missing-release-tag) "ITotalColumnLocatorBody" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public (undocumented) export interface ITotalColumnLocatorBody { // (undocumented) @@ -881,16 +1977,32 @@ export interface ITotalColumnLocatorBody { totalFunction: string; } -// Warning: (ae-missing-release-tag) "IWeakMeasureColumnWidthItem" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// +// @internal @deprecated (undocumented) +export interface ITreemapChartConfig { + // (undocumented) + DEFAULTS: ConfigDefaults; + // (undocumented) + load: typeof treemapChartLoad; + // (undocumented) + save: typeof treemapChartSave; +} + +// @internal @deprecated (undocumented) +export interface IWaterfallChartConfig { + // (undocumented) + DEFAULTS: ConfigDefaults; + // (undocumented) + load: typeof waterfallChartLoad; + // (undocumented) + save: typeof waterfallChartSave; +} + // @public (undocumented) export interface IWeakMeasureColumnWidthItem { // (undocumented) measureColumnWidthItem: IWeakMeasureColumnWidthItemBody; } -// Warning: (ae-missing-release-tag) "IWeakMeasureColumnWidthItemBody" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public (undocumented) export interface IWeakMeasureColumnWidthItemBody { // (undocumented) @@ -899,38 +2011,160 @@ export interface IWeakMeasureColumnWidthItemBody { width: IAbsoluteColumnWidth; } -// Warning: (ae-missing-release-tag) "lineChart" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const lineChart: { - load: typeof load_4; - save: typeof save_4; - DEFAULTS: ConfigDefaults; +// @internal (undocumented) +export const LINE_CHART_DEFAULTS: ConfigDefaults; + +// @internal @deprecated (undocumented) +export const lineChart: ILineChartConfig; + +// @internal (undocumented) +export type LineChartConfigProperties = { + colorMapping: Array; + continuousLine: { + enabled: boolean; + }; + distinctPointShapes: { + enabled: boolean; + pointShapeMapping?: Record; + }; + dataLabels: { + visible: boolean | "auto"; + style: "auto" | "backplate"; + }; + dataPoints: { + visible: boolean | "auto"; + }; + legend: { + enabled: boolean; + position: "top" | "bottom" | "left" | "right" | "auto"; + }; + xaxis: { + name: { + visible: boolean; + position: "center" | "left" | "right" | "auto"; + }; + labelsEnabled: boolean; + rotation: "0" | "30" | "60" | "90" | "auto"; + visible: boolean; + }; + yaxis: { + format: "inherit" | "auto"; + max: number | string; + min: number | string; + name: { + visible: boolean; + position: "center" | "left" | "right" | "auto"; + }; + labelsEnabled: boolean; + rotation: "0" | "30" | "60" | "90" | "auto"; + visible: boolean; + }; + grid: { + enabled: boolean; + }; + forecast: { + enabled: boolean; + confidence: number; + period: number; + seasonal: boolean; + }; + anomalies: { + enabled: boolean; + sensitivity: "low" | "medium" | "high"; + size: "small" | "medium" | "big"; + color: string | number; + }; + disableDrillDown: boolean; + disableAlerts: boolean; + disableScheduledExports: boolean; + thresholdMeasures: string[]; + thresholdExcludedMeasures: string[]; }; +// @internal (undocumented) +export function lineChartLoad(props: VisualisationConfig): Pair, any> | null; + +// @internal (undocumented) +export function lineChartSave(_fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined): { + colorMapping: ColorMapping[] | undefined; + continuousLine: { + enabled: boolean | undefined; + } | undefined; + distinctPointShapes: { + enabled: boolean | undefined; + pointShapeMapping: Record | undefined; + } | undefined; + dataLabels: { + visible: "auto" | boolean | undefined; + style: "auto" | "backplate" | undefined; + } | undefined; + dataPoints: { + visible: "auto" | boolean | undefined; + } | undefined; + legend: { + enabled: boolean | undefined; + position: string | undefined; + } | undefined; + xaxis: { + name: { + position: string | undefined; + visible: boolean | undefined; + } | undefined; + rotation: string | undefined; + visible: boolean | undefined; + labelsEnabled: boolean | undefined; + } | undefined; + yaxis: { + format: string | undefined; + max: string | number | undefined; + min: string | number | undefined; + name: { + position: string | undefined; + visible: boolean | undefined; + } | undefined; + rotation: string | undefined; + visible: boolean | undefined; + labelsEnabled: boolean | undefined; + } | undefined; + grid: { + enabled: boolean | undefined; + } | undefined; + forecast: { + enabled: boolean | undefined; + confidence: number | undefined; + period: number | undefined; + seasonal: boolean | undefined; + } | undefined; + anomalies: { + enabled: boolean | undefined; + sensitivity: "high" | "low" | "medium" | undefined; + size: "big" | "medium" | "small" | undefined; + color: string | number | undefined; + } | undefined; + disableDrillDown: boolean | undefined; + disableAlerts: boolean | undefined; + disableScheduledExports: boolean | undefined; + thresholdMeasures: string[] | undefined; + thresholdExcludedMeasures: string[] | undefined; +} | undefined; + // @public (undocumented) export function loadColorMapping(mappings: Array): YAMLMap; // @public (undocumented) export function loadColumnsWidth(widths: Array): YAMLMap[] | undefined; -// Warning: (ae-missing-release-tag) "MetricTypes" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export const MetricTypes: string[]; -// Warning: (ae-missing-release-tag) "OverrideDashboardDefinition" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export type OverrideDashboardDefinition = Omit & { filterContextRef?: AfmObjectIdentifier; tabs?: DashboardTab[]; activeTabLocalIdentifier?: string; }; -// Warning: (ae-missing-release-tag) "PatternFillName" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export type PatternFillName = "diagonal_grid_small" | "vertical_lines_small" | "grid_small" | "horizontal_lines_small" | "circle_small" | "flag_small" | "waffle_small" | "dot_small" | "pyramid_small" | "needle_small" | "diamond_small" | "pizza_small" | "diagonal_grid_medium" | "vertical_lines_medium" | "grid_large" | "horizontal_lines_medium" | "circle_medium" | "flag_medium" | "waffle_medium" | "dot_medium" | "pyramid_medium" | "needle_medium" | "diamond_medium" | "pizza_medium"; // @public (undocumented) @@ -943,23 +2177,59 @@ type Permissions_2 = { }; export { Permissions_2 as Permissions } -// Warning: (ae-missing-release-tag) "pieChart" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const pieChart: { - load: typeof load_8; - save: typeof save_8; - DEFAULTS: ConfigDefaults; +// @internal (undocumented) +export const PIE_CHART_DEFAULTS: ConfigDefaults; + +// @internal @deprecated (undocumented) +export const pieChart: IPieChartConfig; + +// @internal (undocumented) +export type PieChartConfigProperties = { + colorMapping: Array; + dataLabels: { + visible: boolean | "auto"; + style: "auto" | "backplate"; + }; + chartFill: { + type: ChartFillType; + measureToPatternName?: Record; + }; + legend: { + enabled: boolean; + position: "top" | "bottom" | "left" | "right" | "auto"; + }; + disableDrillDown: boolean; + disableAlerts: boolean; + disableScheduledExports: boolean; }; -// Warning: (ae-missing-release-tag) "PluginTypes" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) +export function pieChartLoad(props: VisualisationConfig): Pair, any> | null; + +// @internal (undocumented) +export function pieChartSave(_fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined): { + colorMapping: ColorMapping[] | undefined; + dataLabels: { + visible: "auto" | boolean | undefined; + style: "auto" | "backplate" | undefined; + } | undefined; + chartFill: { + type: ChartFillType | undefined; + measureToPatternName: Record | undefined; + } | undefined; + legend: { + enabled: boolean | undefined; + position: string | undefined; + } | undefined; + disableDrillDown: boolean | undefined; + disableAlerts: boolean | undefined; + disableScheduledExports: boolean | undefined; +} | undefined; + +// @internal (undocumented) export const PluginTypes: string[]; -// Warning: (ae-missing-release-tag) "PointShapeSymbol" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export type PointShapeSymbol = "circle" | "square" | "diamond" | "triangle" | "triangle-down"; // @public (undocumented) @@ -970,61 +2240,301 @@ export type Profile = { data_source?: string; }; -// Warning: (ae-missing-release-tag) "pyramidChart" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const pyramidChart: { - load: typeof load_11; - save: typeof save_11; - DEFAULTS: ConfigDefaults; +// @internal (undocumented) +export const PYRAMID_CHART_DEFAULTS: ConfigDefaults; + +// @internal @deprecated (undocumented) +export const pyramidChart: IPyramidChartConfig; + +// @internal (undocumented) +export type PyramidChartConfigProperties = { + colorMapping: Array; + dataLabels: { + visible: boolean | "auto"; + style: "auto" | "backplate"; + }; + chartFill: { + type: ChartFillType; + measureToPatternName?: Record; + }; + legend: { + enabled: boolean; + position: "top" | "bottom" | "left" | "right" | "auto"; + }; + disableDrillDown: boolean; + disableAlerts: boolean; + disableScheduledExports: boolean; }; -// Warning: (ae-missing-release-tag) "repeaterChart" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const repeaterChart: { - load: typeof load_22; - save: typeof save_22; - saveInlineVisualizations: typeof saveInlineVisualizations; - DEFAULTS: ConfigDefaults; +// @internal (undocumented) +export function pyramidChartLoad(props: VisualisationConfig): Pair, any> | null; + +// @internal (undocumented) +export function pyramidChartSave(_fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined): { + colorMapping: ColorMapping[] | undefined; + dataLabels: { + visible: "auto" | boolean | undefined; + style: "auto" | "backplate" | undefined; + } | undefined; + chartFill: { + type: ChartFillType | undefined; + measureToPatternName: Record | undefined; + } | undefined; + legend: { + enabled: boolean | undefined; + position: string | undefined; + } | undefined; + disableDrillDown: boolean | undefined; + disableAlerts: boolean | undefined; + disableScheduledExports: boolean | undefined; +} | undefined; + +// @internal (undocumented) +export const REPEATER_CHART_DEFAULTS: ConfigDefaults; + +// @internal @deprecated (undocumented) +export const repeaterChart: IRepeaterChartConfig; + +// @internal (undocumented) +export type RepeaterChartConfigProperties = { + colorMapping: Array; + columnWidths: Array; + cellImageSizing: "fit" | "fill"; + cellTextWrapping: "clip" | "wrap"; + cellVerticalAlign: "top" | "middle" | "bottom"; + rowHeight: "small" | "medium" | "large"; + disableAlerts: boolean; + disableScheduledExports: boolean; }; +// @internal (undocumented) +export function repeaterChartLoad(props: VisualisationConfig): Pair, any> | null; + +// @internal (undocumented) +export function repeaterChartSave(fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined): { + columnWidths: ColumnWidthItem[] | undefined; + colorMapping: ColorMapping[] | undefined; + rowHeight: "large" | "medium" | "small" | undefined; + cellVerticalAlign: "bottom" | "middle" | "top" | undefined; + cellTextWrapping: "clip" | "wrap" | undefined; + cellImageSizing: "fill" | "fit" | undefined; + disableAlerts: boolean | undefined; + disableScheduledExports: boolean | undefined; +} | undefined; + // @public (undocumented) export function resolveIdFromFileName(fileName: FilePath): string; -// Warning: (ae-missing-release-tag) "sankeyChart" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const sankeyChart: { - load: typeof load_17; - save: typeof save_17; - DEFAULTS: ConfigDefaults; +// @internal (undocumented) +export const SANKEY_CHART_DEFAULTS: ConfigDefaults; + +// @internal @deprecated (undocumented) +export const sankeyChart: ISankeyChartConfig; + +// @internal (undocumented) +export type SankeyChartConfigProperties = { + colorMapping: Array; + dataLabels: { + visible: boolean | "auto"; + style: "auto" | "backplate"; + }; + legend: { + enabled: boolean; + position: "top" | "bottom" | "left" | "right" | "auto"; + }; + disableDrillDown: boolean; + disableAlerts: boolean; + disableScheduledExports: boolean; }; +// @internal (undocumented) +export function sankeyChartLoad(props: VisualisationConfig): Pair, any> | null; + +// @internal (undocumented) +export function sankeyChartSave(_fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined): { + colorMapping: ColorMapping[] | undefined; + dataLabels: { + visible: "auto" | boolean | undefined; + style: "auto" | "backplate" | undefined; + } | undefined; + legend: { + enabled: boolean | undefined; + position: string | undefined; + } | undefined; + disableDrillDown: boolean | undefined; + disableAlerts: boolean | undefined; + disableScheduledExports: boolean | undefined; +} | undefined; + // @public (undocumented) export function saveColorMapping(mapping: ListOfColors): Array | undefined; // @public (undocumented) export function saveColumnWidths(fields: Visualisation["query"]["fields"], widths: Width[] | undefined): ColumnWidthItem[] | undefined; -// Warning: (ae-missing-release-tag) "scatterChart" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const scatterChart: { - load: typeof load_6; - save: typeof save_6; - DEFAULTS: ConfigDefaults; +// @internal (undocumented) +export function saveInlineVisualizations(metrics?: Bucket[]): InlineVisualizations; + +// @internal (undocumented) +export const SCATTER_CHART_DEFAULTS: ConfigDefaults; + +// @internal @deprecated (undocumented) +export const scatterChart: IScatterChartConfig; + +// @internal (undocumented) +export type ScatterChartConfigProperties = { + colorMapping: Array; + dataLabels: { + visible: boolean | "auto"; + style: "auto" | "backplate"; + }; + xaxis: { + format: "inherit" | "auto"; + max: number | string; + min: number | string; + name: { + visible: boolean; + position: "center" | "left" | "right" | "auto"; + }; + labelsEnabled: boolean; + rotation: "0" | "30" | "60" | "90" | "auto"; + visible: boolean; + }; + yaxis: { + format: "inherit" | "auto"; + max: number | string; + min: number | string; + name: { + visible: boolean; + position: "center" | "left" | "right" | "auto"; + }; + labelsEnabled: boolean; + rotation: "0" | "30" | "60" | "90" | "auto"; + visible: boolean; + }; + grid: { + enabled: boolean; + }; + clustering: { + enabled: boolean; + numberOfClusters: number; + threshold: number; + }; + disableDrillDown: boolean; + disableAlerts: boolean; + disableScheduledExports: boolean; }; -// Warning: (ae-missing-release-tag) "table" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const table: { - load: typeof load; - save: typeof save; - DEFAULTS: ConfigDefaults; +// @internal (undocumented) +export function scatterChartLoad(props: VisualisationConfig): Pair, any> | null; + +// @internal (undocumented) +export function scatterChartSave(_fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined): { + colorMapping: ColorMapping[] | undefined; + dataLabels: { + visible: "auto" | boolean | undefined; + style: "auto" | "backplate" | undefined; + } | undefined; + xaxis: { + format: string | undefined; + max: string | number | undefined; + min: string | number | undefined; + name: { + position: string | undefined; + visible: boolean | undefined; + } | undefined; + rotation: string | undefined; + visible: boolean | undefined; + labelsEnabled: boolean | undefined; + } | undefined; + yaxis: { + format: string | undefined; + max: string | number | undefined; + min: string | number | undefined; + name: { + position: string | undefined; + visible: boolean | undefined; + } | undefined; + rotation: string | undefined; + visible: boolean | undefined; + labelsEnabled: boolean | undefined; + } | undefined; + grid: { + enabled: boolean | undefined; + } | undefined; + clustering: { + enabled: boolean | undefined; + numberOfClusters: number | undefined; + threshold: number | undefined; + } | undefined; + disableDrillDown: boolean | undefined; + disableAlerts: boolean | undefined; + disableScheduledExports: boolean | undefined; +} | undefined; + +// @internal @deprecated (undocumented) +export const table: ITableConfig; + +// @internal (undocumented) +export const TABLE_DEFAULTS: ConfigDefaults; + +// @internal (undocumented) +export type TableConfigProperties = { + columnWidths: Array; + measureGroupDimension: "columns" | "rows"; + columnHeadersPosition: "top" | "left"; + disableDrillDown: boolean; + disableDrillIntoURL: boolean; + disableAlerts: boolean; + disableScheduledExports: boolean; + textWrapping: { + wrapText: boolean; + wrapHeaderText: boolean; + columnOverrides: Array<{ + locators: ColumnLocator[]; + wrapText: boolean; + wrapHeaderText: boolean; + matchType: "column" | "pivotGroup"; + }>; + }; + enableAccessibility: boolean; + pagination: { + enabled: boolean; + }; + pageSize: number; + grandTotalsPosition: "pinnedBottom" | "pinnedTop" | "bottom" | "top"; }; +// @internal (undocumented) +export function tableLoad(props: VisualisationConfig): Pair, any> | null; + +// @internal (undocumented) +export function tableSave(fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined): { + columnWidths: ColumnWidthItem[] | undefined; + columnHeadersPosition: string | undefined; + measureGroupDimension: string | undefined; + disableDrillDown: boolean | undefined; + disableDrillIntoURL: boolean | undefined; + disableAlerts: boolean | undefined; + disableScheduledExports: boolean | undefined; + textWrapping: { + wrapText: boolean; + wrapHeaderText: boolean; + columnOverrides: { + locators: ColumnLocator[]; + wrapText: boolean; + wrapHeaderText: boolean; + matchType: "column" | "pivotGroup"; + }[]; + } | undefined; + enableAccessibility: boolean | undefined; + pagination: { + enabled: boolean; + } | undefined; + pageSize: number | undefined; + grandTotalsPosition: "bottom" | "pinnedBottom" | "pinnedTop" | "top" | undefined; +} | undefined; + // @public (undocumented) export const toDeclarativePermissions: (permissions?: { VIEW?: Permission | undefined; @@ -1041,15 +2551,55 @@ export type ToExecutionResults = { sorting: Record; }; -// Warning: (ae-missing-release-tag) "treemapChart" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const treemapChart: { - load: typeof load_10; - save: typeof save_10; - DEFAULTS: ConfigDefaults; +// @internal (undocumented) +export const TREEMAP_CHART_DEFAULTS: ConfigDefaults; + +// @internal @deprecated (undocumented) +export const treemapChart: ITreemapChartConfig; + +// @internal (undocumented) +export type TreemapChartConfigProperties = { + colorMapping: Array; + dataLabels: { + visible: boolean | "auto"; + style: "auto" | "backplate"; + }; + chartFill: { + type: ChartFillType; + measureToPatternName?: Record; + }; + legend: { + enabled: boolean; + position: "top" | "bottom" | "left" | "right" | "auto"; + }; + disableDrillDown: boolean; + disableAlerts: boolean; + disableScheduledExports: boolean; }; +// @internal (undocumented) +export function treemapChartLoad(props: VisualisationConfig): Pair, any> | null; + +// @internal (undocumented) +export function treemapChartSave(_fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined): { + colorMapping: ColorMapping[] | undefined; + dataLabels: { + visible: "auto" | boolean | undefined; + style: "auto" | "backplate" | undefined; + } | undefined; + chartFill: { + type: ChartFillType | undefined; + measureToPatternName: Record | undefined; + } | undefined; + legend: { + enabled: boolean | undefined; + position: string | undefined; + } | undefined; + disableDrillDown: boolean | undefined; + disableAlerts: boolean | undefined; + disableScheduledExports: boolean | undefined; +} | undefined; + // @public (undocumented) export type ValueType = "string" | "bool" | "number" | "bool_auto" | "array"; @@ -1058,26 +2608,151 @@ export type VisualisationConfig = { controls?: T; }; -// Warning: (ae-missing-release-tag) "VisualisationsTypes" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) +export type VisualisationDefinition = Pick & { + version: string; +}; + +// @internal (undocumented) export const VisualisationsTypes: string[]; -// Warning: (ae-missing-release-tag) "waterfallChart" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const waterfallChart: { - load: typeof load_15; - save: typeof save_15; - DEFAULTS: ConfigDefaults; +// @internal (undocumented) +export const WATERFALL_CHART_DEFAULTS: ConfigDefaults; + +// @internal @deprecated (undocumented) +export const waterfallChart: IWaterfallChartConfig; + +// @internal (undocumented) +export type WaterfallChartConfigProperties = { + colorMapping: Array; + dataLabels: { + visible: boolean | "auto"; + style: "auto" | "backplate"; + }; + chartFill: { + type: ChartFillType; + measureToPatternName?: Record; + }; + orientation: { + position: "horizontal" | "vertical"; + }; + total: { + enabled: boolean; + name: string; + }; + legend: { + enabled: boolean; + position: "top" | "bottom" | "left" | "right" | "auto"; + }; + xaxis: { + format: "inherit" | "auto"; + max: number | string; + min: number | string; + name: { + visible: boolean; + position: "center" | "left" | "right" | "auto"; + }; + labelsEnabled: boolean; + rotation: "0" | "30" | "60" | "90" | "auto"; + visible: boolean; + }; + yaxis: { + name: { + visible: boolean; + position: "center" | "left" | "right" | "auto"; + }; + labelsEnabled: boolean; + rotation: "0" | "30" | "60" | "90" | "auto"; + visible: boolean; + }; + grid: { + enabled: boolean; + }; + disableDrillDown: boolean; + disableAlerts: boolean; + disableScheduledExports: boolean; }; +// @internal (undocumented) +export function waterfallChartLoad(props: VisualisationConfig): Pair, any> | null; + +// @internal (undocumented) +export function waterfallChartSave(_fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined): { + colorMapping: ColorMapping[] | undefined; + dataLabels: { + visible: "auto" | boolean | undefined; + style: "auto" | "backplate" | undefined; + } | undefined; + chartFill: { + type: ChartFillType | undefined; + measureToPatternName: Record | undefined; + } | undefined; + orientation: { + position: string | undefined; + } | undefined; + total: { + enabled: boolean | undefined; + name: string | undefined; + } | undefined; + legend: { + enabled: boolean | undefined; + position: string | undefined; + } | undefined; + xaxis: { + format: string | undefined; + max: string | number | undefined; + min: string | number | undefined; + name: { + position: string | undefined; + visible: boolean | undefined; + } | undefined; + rotation: string | undefined; + visible: boolean | undefined; + labelsEnabled: boolean | undefined; + } | undefined; + yaxis: { + name: { + position: string | undefined; + visible: boolean | undefined; + } | undefined; + rotation: string | undefined; + visible: boolean | undefined; + labelsEnabled: boolean | undefined; + } | undefined; + grid: { + enabled: boolean | undefined; + } | undefined; + disableDrillDown: boolean | undefined; + disableAlerts: boolean | undefined; + disableScheduledExports: boolean | undefined; +} | undefined; + // @public (undocumented) export function yamlAttributeHierarchyToDeclarative(input: AttributeHierarchy): DeclarativeAttributeHierarchy; -// Warning: (ae-missing-release-tag) "yamlBucketsToDeclarative" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) +export type YamlBucketGroup = { + type: BucketsType; + items: YamlBucketGroupItems; +}; + +// @internal (undocumented) +export type YamlBucketGroupItems = Array<{ + field: string; + format?: string; + totals?: YAMLMap[]; + axis?: "primary" | "secondary"; + display_as?: "metric" | "line" | "column"; +} | null>; + +// @internal (undocumented) +export type YamlBuckets = { + fieldsMap: YAMLMap; + groups: YamlBucketGroup[]; + postProcessors: YamlPostProcessors; +}; + +// @internal (undocumented) export function yamlBucketsToDeclarative(entities: ExportEntities, input: Visualisation): { buckets: VisualisationDefinition["buckets"]; positions: Array<{ @@ -1100,9 +2775,13 @@ export function yamlDatasetToDeclarative(entities: ExportEntities, input: Datase // @public (undocumented) export function yamlDateDatesetToDeclarative(input: DateDataset): DeclarativeDateDataset; -// Warning: (ae-missing-release-tag) "yamlFilterContextToDeclarative" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) +export type YamlFieldData = { + format?: string; + axis?: "primary" | "secondary"; +}; + +// @internal (undocumented) export function yamlFilterContextToDeclarative(baseId: string, yamlFilters: DashboardFilters | undefined): { filterContext: DeclarativeFilterContext; dateFilterConfig: IDashboardDateFilterConfig | undefined; @@ -1112,33 +2791,45 @@ export function yamlFilterContextToDeclarative(baseId: string, yamlFilters: Dash filterGroupsConfig: IDashboardFilterGroupsConfig | undefined; }; -// Warning: (ae-missing-release-tag) "yamlFiltersToDeclarative" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) +export type YamlFilterMapEntry = { + yaml: YAMLMap; + filter: IFilter; +}; + +// @internal (undocumented) +export type YamlFilters = { + filtersMap: Record; + filtersArray: YAMLMap; +}; + +// @internal (undocumented) export function yamlFiltersToDeclarative(entities: ExportEntities, filters_by: QueryFilters | Filter[] | undefined, attributeFilterConfigs?: IAttributeFilterConfigs): { filters: IFilter[]; attributeFilterConfigs: IAttributeFilterConfigs | undefined; }; -// Warning: (ae-missing-release-tag) "yamlInteractionToDeclarative" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function yamlInteractionToDeclarative(entities: ExportEntities, visualisation: string, input: Interaction): IDrillToInsight | IDrillToDashboard | IDrillToCustomUrl | IDrillToAttributeUrl | null; // @public (undocumented) export function yamlMetricToDeclarative(input: Metric): DeclarativeMetric; -// Warning: (ae-missing-release-tag) "yamlPluginsToDeclarative" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function yamlPluginsToDeclarative(plugins: Dashboard["plugins"]): IDashboardPluginLink[] | undefined; // @public (undocumented) export function yamlPluginToDeclarative(input: Plugin_2): DeclarativeDashboardPlugin; -// Warning: (ae-missing-release-tag) "yamlReportToDeclarative" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) +export type YamlPostProcessors = { + filters: Array<{ + item: YAMLMap; + filters: IFilter[]; + }>; +}; + +// @internal (undocumented) export function yamlReportToDeclarative(entities: ExportEntities, input: Visualisation): { buckets: VisualisationDefinition["buckets"]; sorts: VisualisationDefinition["sorts"]; @@ -1150,14 +2841,15 @@ export function yamlReportToDeclarative(entities: ExportEntities, input: Visuali attributeFilterConfigs?: IAttributeFilterConfigs; }; -// Warning: (ae-missing-release-tag) "yamlReportTotalToDeclarative" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function yamlReportTotalToDeclarative(totals: Total[] | undefined, attributeIdentifier: string): ITotal[]; -// Warning: (ae-missing-release-tag) "yamlSortsToDeclarative" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) +export type YamlSorts = { + sortsArray: YAMLMap[]; +}; + +// @internal (undocumented) export function yamlSortsToDeclarative(sort_by: Sorts | undefined, fields: Visualisation["query"]["fields"]): ISortItem[]; // @public (undocumented) @@ -1166,89 +2858,12 @@ export function yamlVisualisationToDeclarative(entities: ExportEntities, input: // @public (undocumented) export function yamlVisualisationToMetadataObject(entities: ExportEntities, input: Visualisation): JsonApiVisualizationObjectOut; -// Warning: (ae-forgotten-export) The symbol "DashboardWidget" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "yamlWidgetItemToDeclarative" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function yamlWidgetItemToDeclarative(entities: ExportEntities, input: Widget, enableSectionHeaders?: boolean): DashboardWidget | null; -// Warning: (ae-missing-release-tag) "yamlWidgetToDeclarative" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @internal (undocumented) export function yamlWidgetToDeclarative(entities: ExportEntities, input: VisualisationWidget | RichTextWidget | VisualizationSwitcherWidget | ContainerWidget, enableSectionHeaders?: boolean): DashboardWidget["widget"]; -// Warnings were encountered during analysis: -// -// esm/configs/areaChart.d.ts:108:5 - (ae-forgotten-export) The symbol "load_5" needs to be exported by the entry point index.d.ts -// esm/configs/areaChart.d.ts:109:5 - (ae-forgotten-export) The symbol "save_5" needs to be exported by the entry point index.d.ts -// esm/configs/areaChart.d.ts:110:5 - (ae-forgotten-export) The symbol "ConfigDefaults" needs to be exported by the entry point index.d.ts -// esm/configs/areaChart.d.ts:110:5 - (ae-forgotten-export) The symbol "DefaultProperties_5" needs to be exported by the entry point index.d.ts -// esm/configs/barChart.d.ts:96:5 - (ae-forgotten-export) The symbol "load_2" needs to be exported by the entry point index.d.ts -// esm/configs/barChart.d.ts:97:5 - (ae-forgotten-export) The symbol "save_2" needs to be exported by the entry point index.d.ts -// esm/configs/barChart.d.ts:98:5 - (ae-forgotten-export) The symbol "DefaultProperties_2" needs to be exported by the entry point index.d.ts -// esm/configs/bubbleChart.d.ts:88:5 - (ae-forgotten-export) The symbol "load_7" needs to be exported by the entry point index.d.ts -// esm/configs/bubbleChart.d.ts:89:5 - (ae-forgotten-export) The symbol "save_7" needs to be exported by the entry point index.d.ts -// esm/configs/bubbleChart.d.ts:90:5 - (ae-forgotten-export) The symbol "DefaultProperties_7" needs to be exported by the entry point index.d.ts -// esm/configs/bulletChart.d.ts:82:5 - (ae-forgotten-export) The symbol "load_14" needs to be exported by the entry point index.d.ts -// esm/configs/bulletChart.d.ts:83:5 - (ae-forgotten-export) The symbol "save_14" needs to be exported by the entry point index.d.ts -// esm/configs/bulletChart.d.ts:84:5 - (ae-forgotten-export) The symbol "DefaultProperties_14" needs to be exported by the entry point index.d.ts -// esm/configs/columnChart.d.ts:96:5 - (ae-forgotten-export) The symbol "load_3" needs to be exported by the entry point index.d.ts -// esm/configs/columnChart.d.ts:97:5 - (ae-forgotten-export) The symbol "save_3" needs to be exported by the entry point index.d.ts -// esm/configs/columnChart.d.ts:98:5 - (ae-forgotten-export) The symbol "DefaultProperties_3" needs to be exported by the entry point index.d.ts -// esm/configs/comboChart.d.ts:150:5 - (ae-forgotten-export) The symbol "load_19" needs to be exported by the entry point index.d.ts -// esm/configs/comboChart.d.ts:151:5 - (ae-forgotten-export) The symbol "save_19" needs to be exported by the entry point index.d.ts -// esm/configs/comboChart.d.ts:152:5 - (ae-forgotten-export) The symbol "DefaultProperties_19" needs to be exported by the entry point index.d.ts -// esm/configs/dependencyWheelChart.d.ts:32:5 - (ae-forgotten-export) The symbol "load_16" needs to be exported by the entry point index.d.ts -// esm/configs/dependencyWheelChart.d.ts:33:5 - (ae-forgotten-export) The symbol "save_16" needs to be exported by the entry point index.d.ts -// esm/configs/dependencyWheelChart.d.ts:34:5 - (ae-forgotten-export) The symbol "DefaultProperties_16" needs to be exported by the entry point index.d.ts -// esm/configs/donutChart.d.ts:42:5 - (ae-forgotten-export) The symbol "load_9" needs to be exported by the entry point index.d.ts -// esm/configs/donutChart.d.ts:43:5 - (ae-forgotten-export) The symbol "save_9" needs to be exported by the entry point index.d.ts -// esm/configs/donutChart.d.ts:44:5 - (ae-forgotten-export) The symbol "DefaultProperties_9" needs to be exported by the entry point index.d.ts -// esm/configs/funnelChart.d.ts:42:5 - (ae-forgotten-export) The symbol "load_12" needs to be exported by the entry point index.d.ts -// esm/configs/funnelChart.d.ts:43:5 - (ae-forgotten-export) The symbol "save_12" needs to be exported by the entry point index.d.ts -// esm/configs/funnelChart.d.ts:44:5 - (ae-forgotten-export) The symbol "DefaultProperties_12" needs to be exported by the entry point index.d.ts -// esm/configs/geoAreaChart.d.ts:75:5 - (ae-forgotten-export) The symbol "load_21" needs to be exported by the entry point index.d.ts -// esm/configs/geoAreaChart.d.ts:76:5 - (ae-forgotten-export) The symbol "save_21" needs to be exported by the entry point index.d.ts -// esm/configs/geoAreaChart.d.ts:77:5 - (ae-forgotten-export) The symbol "DefaultProperties_21" needs to be exported by the entry point index.d.ts -// esm/configs/geoChart.d.ts:55:5 - (ae-forgotten-export) The symbol "load_20" needs to be exported by the entry point index.d.ts -// esm/configs/geoChart.d.ts:56:5 - (ae-forgotten-export) The symbol "save_20" needs to be exported by the entry point index.d.ts -// esm/configs/geoChart.d.ts:57:5 - (ae-forgotten-export) The symbol "DefaultProperties_20" needs to be exported by the entry point index.d.ts -// esm/configs/headlineChart.d.ts:84:5 - (ae-forgotten-export) The symbol "load_18" needs to be exported by the entry point index.d.ts -// esm/configs/headlineChart.d.ts:85:5 - (ae-forgotten-export) The symbol "save_18" needs to be exported by the entry point index.d.ts -// esm/configs/headlineChart.d.ts:86:5 - (ae-forgotten-export) The symbol "DefaultProperties_18" needs to be exported by the entry point index.d.ts -// esm/configs/heatmapChart.d.ts:70:5 - (ae-forgotten-export) The symbol "load_13" needs to be exported by the entry point index.d.ts -// esm/configs/heatmapChart.d.ts:71:5 - (ae-forgotten-export) The symbol "save_13" needs to be exported by the entry point index.d.ts -// esm/configs/heatmapChart.d.ts:72:5 - (ae-forgotten-export) The symbol "DefaultProperties_13" needs to be exported by the entry point index.d.ts -// esm/configs/lineChart.d.ts:130:5 - (ae-forgotten-export) The symbol "load_4" needs to be exported by the entry point index.d.ts -// esm/configs/lineChart.d.ts:131:5 - (ae-forgotten-export) The symbol "save_4" needs to be exported by the entry point index.d.ts -// esm/configs/lineChart.d.ts:132:5 - (ae-forgotten-export) The symbol "DefaultProperties_4" needs to be exported by the entry point index.d.ts -// esm/configs/pieChart.d.ts:42:5 - (ae-forgotten-export) The symbol "load_8" needs to be exported by the entry point index.d.ts -// esm/configs/pieChart.d.ts:43:5 - (ae-forgotten-export) The symbol "save_8" needs to be exported by the entry point index.d.ts -// esm/configs/pieChart.d.ts:44:5 - (ae-forgotten-export) The symbol "DefaultProperties_8" needs to be exported by the entry point index.d.ts -// esm/configs/pyramidChart.d.ts:42:5 - (ae-forgotten-export) The symbol "load_11" needs to be exported by the entry point index.d.ts -// esm/configs/pyramidChart.d.ts:43:5 - (ae-forgotten-export) The symbol "save_11" needs to be exported by the entry point index.d.ts -// esm/configs/pyramidChart.d.ts:44:5 - (ae-forgotten-export) The symbol "DefaultProperties_11" needs to be exported by the entry point index.d.ts -// esm/configs/repeaterChart.d.ts:30:5 - (ae-forgotten-export) The symbol "load_22" needs to be exported by the entry point index.d.ts -// esm/configs/repeaterChart.d.ts:31:5 - (ae-forgotten-export) The symbol "save_22" needs to be exported by the entry point index.d.ts -// esm/configs/repeaterChart.d.ts:32:5 - (ae-forgotten-export) The symbol "saveInlineVisualizations" needs to be exported by the entry point index.d.ts -// esm/configs/repeaterChart.d.ts:33:5 - (ae-forgotten-export) The symbol "DefaultProperties_22" needs to be exported by the entry point index.d.ts -// esm/configs/sankeyChart.d.ts:34:5 - (ae-forgotten-export) The symbol "load_17" needs to be exported by the entry point index.d.ts -// esm/configs/sankeyChart.d.ts:35:5 - (ae-forgotten-export) The symbol "save_17" needs to be exported by the entry point index.d.ts -// esm/configs/sankeyChart.d.ts:36:5 - (ae-forgotten-export) The symbol "DefaultProperties_17" needs to be exported by the entry point index.d.ts -// esm/configs/scatterChart.d.ts:90:5 - (ae-forgotten-export) The symbol "load_6" needs to be exported by the entry point index.d.ts -// esm/configs/scatterChart.d.ts:91:5 - (ae-forgotten-export) The symbol "save_6" needs to be exported by the entry point index.d.ts -// esm/configs/scatterChart.d.ts:92:5 - (ae-forgotten-export) The symbol "DefaultProperties_6" needs to be exported by the entry point index.d.ts -// esm/configs/table.d.ts:56:5 - (ae-forgotten-export) The symbol "load" needs to be exported by the entry point index.d.ts -// esm/configs/table.d.ts:57:5 - (ae-forgotten-export) The symbol "save" needs to be exported by the entry point index.d.ts -// esm/configs/table.d.ts:58:5 - (ae-forgotten-export) The symbol "DefaultProperties" needs to be exported by the entry point index.d.ts -// esm/configs/treemapChart.d.ts:42:5 - (ae-forgotten-export) The symbol "load_10" needs to be exported by the entry point index.d.ts -// esm/configs/treemapChart.d.ts:43:5 - (ae-forgotten-export) The symbol "save_10" needs to be exported by the entry point index.d.ts -// esm/configs/treemapChart.d.ts:44:5 - (ae-forgotten-export) The symbol "DefaultProperties_10" needs to be exported by the entry point index.d.ts -// esm/configs/waterfallChart.d.ts:104:5 - (ae-forgotten-export) The symbol "load_15" needs to be exported by the entry point index.d.ts -// esm/configs/waterfallChart.d.ts:105:5 - (ae-forgotten-export) The symbol "save_15" needs to be exported by the entry point index.d.ts -// esm/configs/waterfallChart.d.ts:106:5 - (ae-forgotten-export) The symbol "DefaultProperties_15" needs to be exported by the entry point index.d.ts -// esm/to/yamlVisualisationToDeclarative.d.ts:29:5 - (ae-forgotten-export) The symbol "VisualisationDefinition" needs to be exported by the entry point index.d.ts - // (No @packageDocumentation comment for this package) ``` diff --git a/libs/sdk-code-convertors/package.json b/libs/sdk-code-convertors/package.json index 18650cc2108..cd1a1277a38 100644 --- a/libs/sdk-code-convertors/package.json +++ b/libs/sdk-code-convertors/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-code-convertors", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData AAC declarative converters", "license": "MIT", "author": "GoodData", @@ -33,7 +33,7 @@ "build-ts": "tsgo -p tsconfig.build.json", "build-wasm": "bash wasm/build.sh", "check-python-types": "node scripts/check-python-types.mjs", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf esm coverage *.log tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf esm coverage temp *.log tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", diff --git a/libs/sdk-code-convertors/python/pyproject.toml b/libs/sdk-code-convertors/python/pyproject.toml index c5cfd6abce8..340b1c3988f 100644 --- a/libs/sdk-code-convertors/python/pyproject.toml +++ b/libs/sdk-code-convertors/python/pyproject.toml @@ -2,7 +2,7 @@ [project] name = "gooddata-code-convertors" -version = "11.35.0a5" +version = "11.35.0a6" description = "GoodData AAC YAML / Declarative API code converters (WASM-powered)" readme = "README.md" license = { file = "LICENSE" } diff --git a/libs/sdk-code-convertors/src/configs/areaChart.ts b/libs/sdk-code-convertors/src/configs/areaChart.ts index 3c99888932b..02dc1ad2cea 100644 --- a/libs/sdk-code-convertors/src/configs/areaChart.ts +++ b/libs/sdk-code-convertors/src/configs/areaChart.ts @@ -18,7 +18,8 @@ import { saveConfigObject, } from "./utils.js"; -type DefaultProperties = { +/** @internal */ +export type AreaChartConfigProperties = { colorMapping: Array; distinctPointShapes: { enabled: boolean; @@ -70,7 +71,8 @@ type DefaultProperties = { disableScheduledExports: boolean; }; -const DEFAULTS: ConfigDefaults = { +/** @internal */ +const DEFAULTS: ConfigDefaults = { colorMapping: [], distinctPointShapes: { enabled: false, @@ -120,7 +122,11 @@ const DEFAULTS: ConfigDefaults = { disableScheduledExports: false, }; -function load(props: VisualisationConfig) { +/** @internal */ +export const AREA_CHART_DEFAULTS = DEFAULTS; + +/** @internal */ +export function areaChartLoad(props: VisualisationConfig) { return loadConfig(props, (key, value) => { switch (key) { case "colorMapping": @@ -242,7 +248,8 @@ function load(props: VisualisationConfig) { }); } -function save( +/** @internal */ +export function areaChartSave( _fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, ) { @@ -314,8 +321,22 @@ function save( }); } -export const areaChart = { - load, - save, +/** + * @internal + * @deprecated Use areaChartLoad and areaChartSave instead. + */ +export interface IAreaChartConfig { + load: typeof areaChartLoad; + save: typeof areaChartSave; + DEFAULTS: ConfigDefaults; +} + +/** + * @internal + * @deprecated Use areaChartLoad and areaChartSave instead. + */ +export const areaChart: IAreaChartConfig = { + load: areaChartLoad, + save: areaChartSave, DEFAULTS, }; diff --git a/libs/sdk-code-convertors/src/configs/barChart.ts b/libs/sdk-code-convertors/src/configs/barChart.ts index c19f8d80f07..229d4674d8d 100644 --- a/libs/sdk-code-convertors/src/configs/barChart.ts +++ b/libs/sdk-code-convertors/src/configs/barChart.ts @@ -13,7 +13,8 @@ import { saveConfigObject, } from "./utils.js"; -type DefaultProperties = { +/** @internal */ +export type BarChartConfigProperties = { colorMapping: Array; dataLabels: { totalsVisible: boolean | "auto"; @@ -59,7 +60,8 @@ type DefaultProperties = { disableScheduledExports: boolean; }; -const DEFAULTS: ConfigDefaults = { +/** @internal */ +const DEFAULTS: ConfigDefaults = { colorMapping: [], dataLabels: { totalsVisible: "auto", @@ -104,7 +106,11 @@ const DEFAULTS: ConfigDefaults = { disableScheduledExports: false, }; -function load(props: VisualisationConfig) { +/** @internal */ +export const BAR_CHART_DEFAULTS = DEFAULTS; + +/** @internal */ +export function barChartLoad(props: VisualisationConfig) { return loadConfig(props, (key, value) => { switch (key) { case "colorMapping": @@ -215,7 +221,8 @@ function load(props: VisualisationConfig) { }); } -function save( +/** @internal */ +export function barChartSave( _fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, ) { @@ -279,8 +286,22 @@ function save( }); } -export const barChart = { - load, - save, +/** + * @internal + * @deprecated Use barChartLoad and barChartSave instead. + */ +export interface IBarChartConfig { + load: typeof barChartLoad; + save: typeof barChartSave; + DEFAULTS: ConfigDefaults; +} + +/** + * @internal + * @deprecated Use barChartLoad and barChartSave instead. + */ +export const barChart: IBarChartConfig = { + load: barChartLoad, + save: barChartSave, DEFAULTS, }; diff --git a/libs/sdk-code-convertors/src/configs/bubbleChart.ts b/libs/sdk-code-convertors/src/configs/bubbleChart.ts index 0bfd123a060..96e131daf28 100644 --- a/libs/sdk-code-convertors/src/configs/bubbleChart.ts +++ b/libs/sdk-code-convertors/src/configs/bubbleChart.ts @@ -13,7 +13,8 @@ import { saveConfigObject, } from "./utils.js"; -type DefaultProperties = { +/** @internal */ +export type BubbleChartConfigProperties = { colorMapping: Array; dataLabels: { visible: boolean | "auto"; @@ -55,7 +56,8 @@ type DefaultProperties = { disableScheduledExports: boolean; }; -const DEFAULTS: ConfigDefaults = { +/** @internal */ +const DEFAULTS: ConfigDefaults = { colorMapping: [], dataLabels: { visible: false, @@ -97,7 +99,11 @@ const DEFAULTS: ConfigDefaults = { disableScheduledExports: false, }; -function load(props: VisualisationConfig) { +/** @internal */ +export const BUBBLE_CHART_DEFAULTS = DEFAULTS; + +/** @internal */ +export function bubbleChartLoad(props: VisualisationConfig) { return loadConfig(props, (key, value) => { switch (key) { case "colorMapping": @@ -188,7 +194,8 @@ function load(props: VisualisationConfig) { }); } -function save( +/** @internal */ +export function bubbleChartSave( _fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, ) { @@ -243,8 +250,22 @@ function save( }); } -export const bubbleChart = { - load, - save, +/** + * @internal + * @deprecated Use bubbleChartLoad and bubbleChartSave instead. + */ +export interface IBubbleChartConfig { + load: typeof bubbleChartLoad; + save: typeof bubbleChartSave; + DEFAULTS: ConfigDefaults; +} + +/** + * @internal + * @deprecated Use bubbleChartLoad and bubbleChartSave instead. + */ +export const bubbleChart: IBubbleChartConfig = { + load: bubbleChartLoad, + save: bubbleChartSave, DEFAULTS, }; diff --git a/libs/sdk-code-convertors/src/configs/bulletChart.ts b/libs/sdk-code-convertors/src/configs/bulletChart.ts index 58b9d3b8623..ac7a83df7a7 100644 --- a/libs/sdk-code-convertors/src/configs/bulletChart.ts +++ b/libs/sdk-code-convertors/src/configs/bulletChart.ts @@ -13,7 +13,8 @@ import { saveConfigObject, } from "./utils.js"; -type DefaultProperties = { +/** @internal */ +export type BulletChartConfigProperties = { colorMapping: Array; legend: { enabled: boolean; @@ -52,7 +53,8 @@ type DefaultProperties = { disableScheduledExports: boolean; }; -const DEFAULTS: ConfigDefaults = { +/** @internal */ +const DEFAULTS: ConfigDefaults = { colorMapping: [], legend: { enabled: true, @@ -90,7 +92,11 @@ const DEFAULTS: ConfigDefaults = { disableScheduledExports: false, }; -function load(props: VisualisationConfig) { +/** @internal */ +export const BULLET_CHART_DEFAULTS = DEFAULTS; + +/** @internal */ +export function bulletChartLoad(props: VisualisationConfig) { return loadConfig(props, (key, value) => { switch (key) { case "colorMapping": @@ -179,7 +185,8 @@ function load(props: VisualisationConfig) { }); } -function save( +/** @internal */ +export function bulletChartSave( _fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, ) { @@ -228,8 +235,22 @@ function save( }); } -export const bulletChart = { - load, - save, +/** + * @internal + * @deprecated Use bulletChartLoad and bulletChartSave instead. + */ +export interface IBulletChartConfig { + load: typeof bulletChartLoad; + save: typeof bulletChartSave; + DEFAULTS: ConfigDefaults; +} + +/** + * @internal + * @deprecated Use bulletChartLoad and bulletChartSave instead. + */ +export const bulletChart: IBulletChartConfig = { + load: bulletChartLoad, + save: bulletChartSave, DEFAULTS, }; diff --git a/libs/sdk-code-convertors/src/configs/columnChart.ts b/libs/sdk-code-convertors/src/configs/columnChart.ts index 9c457f360d7..74a9363bb09 100644 --- a/libs/sdk-code-convertors/src/configs/columnChart.ts +++ b/libs/sdk-code-convertors/src/configs/columnChart.ts @@ -13,7 +13,8 @@ import { saveConfigObject, } from "./utils.js"; -type DefaultProperties = { +/** @internal */ +export type ColumnChartConfigProperties = { colorMapping: Array; dataLabels: { totalsVisible: boolean | "auto"; @@ -59,7 +60,8 @@ type DefaultProperties = { disableScheduledExports: boolean; }; -const DEFAULTS: ConfigDefaults = { +/** @internal */ +const DEFAULTS: ConfigDefaults = { colorMapping: [], dataLabels: { totalsVisible: "auto", @@ -104,7 +106,11 @@ const DEFAULTS: ConfigDefaults = { disableScheduledExports: false, }; -function load(props: VisualisationConfig) { +/** @internal */ +export const COLUMN_CHART_DEFAULTS = DEFAULTS; + +/** @internal */ +export function columnChartLoad(props: VisualisationConfig) { return loadConfig(props, (key, value) => { switch (key) { case "colorMapping": @@ -215,7 +221,8 @@ function load(props: VisualisationConfig) { }); } -function save( +/** @internal */ +export function columnChartSave( _fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, ) { @@ -279,8 +286,22 @@ function save( }); } -export const columnChart = { - load, - save, +/** + * @internal + * @deprecated Use columnChartLoad and columnChartSave instead. + */ +export interface IColumnChartConfig { + load: typeof columnChartLoad; + save: typeof columnChartSave; + DEFAULTS: ConfigDefaults; +} + +/** + * @internal + * @deprecated Use columnChartLoad and columnChartSave instead. + */ +export const columnChart: IColumnChartConfig = { + load: columnChartLoad, + save: columnChartSave, DEFAULTS, }; diff --git a/libs/sdk-code-convertors/src/configs/comboChart.ts b/libs/sdk-code-convertors/src/configs/comboChart.ts index be98f0819ab..3bfb2914fed 100644 --- a/libs/sdk-code-convertors/src/configs/comboChart.ts +++ b/libs/sdk-code-convertors/src/configs/comboChart.ts @@ -19,7 +19,8 @@ import { saveConfigObject, } from "./utils.js"; -type DefaultProperties = { +/** @internal */ +export type ComboChartConfigProperties = { colorMapping: Array; continuousLine: { enabled: boolean; @@ -92,7 +93,8 @@ type DefaultProperties = { thresholdExcludedMeasures: string[]; }; -const DEFAULTS: ConfigDefaults = { +/** @internal */ +const DEFAULTS: ConfigDefaults = { colorMapping: [], continuousLine: { enabled: false, @@ -163,7 +165,11 @@ const DEFAULTS: ConfigDefaults = { thresholdExcludedMeasures: [], }; -function load(props: VisualisationConfig) { +/** @internal */ +export const COMBO_CHART_DEFAULTS = DEFAULTS; + +/** @internal */ +export function comboChartLoad(props: VisualisationConfig) { return loadConfig(props, (key, value) => { switch (key) { case "colorMapping": @@ -359,7 +365,8 @@ function load(props: VisualisationConfig) { }); } -function save( +/** @internal */ +export function comboChartSave( _fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, buckets: Bucket[] = [], @@ -504,8 +511,22 @@ function save( }); } -export const comboChart = { - load, - save, +/** + * @internal + * @deprecated Use comboChartLoad and comboChartSave instead. + */ +export interface IComboChartConfig { + load: typeof comboChartLoad; + save: typeof comboChartSave; + DEFAULTS: ConfigDefaults; +} + +/** + * @internal + * @deprecated Use comboChartLoad and comboChartSave instead. + */ +export const comboChart: IComboChartConfig = { + load: comboChartLoad, + save: comboChartSave, DEFAULTS, }; diff --git a/libs/sdk-code-convertors/src/configs/dependencyWheelChart.ts b/libs/sdk-code-convertors/src/configs/dependencyWheelChart.ts index 570c5fd142b..87eedd56df4 100644 --- a/libs/sdk-code-convertors/src/configs/dependencyWheelChart.ts +++ b/libs/sdk-code-convertors/src/configs/dependencyWheelChart.ts @@ -13,7 +13,8 @@ import { saveConfigObject, } from "./utils.js"; -type DefaultProperties = { +/** @internal */ +export type DependencyWheelChartConfigProperties = { colorMapping: Array; dataLabels: { visible: boolean | "auto"; @@ -27,7 +28,8 @@ type DefaultProperties = { disableScheduledExports: boolean; }; -const DEFAULTS: ConfigDefaults = { +/** @internal */ +const DEFAULTS: ConfigDefaults = { colorMapping: [], dataLabels: { visible: "auto", @@ -41,7 +43,11 @@ const DEFAULTS: ConfigDefaults = { disableScheduledExports: false, }; -function load(props: VisualisationConfig) { +/** @internal */ +export const DEPENDENCY_WHEEL_CHART_DEFAULTS = DEFAULTS; + +/** @internal */ +export function dependencyWheelChartLoad(props: VisualisationConfig) { return loadConfig(props, (key, value) => { switch (key) { case "colorMapping": @@ -83,7 +89,8 @@ function load(props: VisualisationConfig) { }); } -function save( +/** @internal */ +export function dependencyWheelChartSave( _fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, ) { @@ -110,8 +117,22 @@ function save( }); } -export const dependencyWheelChart = { - load, - save, +/** + * @internal + * @deprecated Use dependencyWheelChartLoad and dependencyWheelChartSave instead. + */ +export interface IDependencyWheelChartConfig { + load: typeof dependencyWheelChartLoad; + save: typeof dependencyWheelChartSave; + DEFAULTS: ConfigDefaults; +} + +/** + * @internal + * @deprecated Use dependencyWheelChartLoad and dependencyWheelChartSave instead. + */ +export const dependencyWheelChart: IDependencyWheelChartConfig = { + load: dependencyWheelChartLoad, + save: dependencyWheelChartSave, DEFAULTS, }; diff --git a/libs/sdk-code-convertors/src/configs/donutChart.ts b/libs/sdk-code-convertors/src/configs/donutChart.ts index 50414601ea9..be281078b21 100644 --- a/libs/sdk-code-convertors/src/configs/donutChart.ts +++ b/libs/sdk-code-convertors/src/configs/donutChart.ts @@ -13,7 +13,8 @@ import { saveConfigObject, } from "./utils.js"; -type DefaultProperties = { +/** @internal */ +export type DonutChartConfigProperties = { colorMapping: Array; dataLabels: { visible: boolean | "auto"; @@ -32,7 +33,8 @@ type DefaultProperties = { disableScheduledExports: boolean; }; -const DEFAULTS: ConfigDefaults = { +/** @internal */ +const DEFAULTS: ConfigDefaults = { colorMapping: [], dataLabels: { visible: false, @@ -50,7 +52,11 @@ const DEFAULTS: ConfigDefaults = { disableScheduledExports: false, }; -function load(props: VisualisationConfig) { +/** @internal */ +export const DONUT_CHART_DEFAULTS = DEFAULTS; + +/** @internal */ +export function donutChartLoad(props: VisualisationConfig) { return loadConfig(props, (key, value) => { switch (key) { case "colorMapping": @@ -101,7 +107,8 @@ function load(props: VisualisationConfig) { }); } -function save( +/** @internal */ +export function donutChartSave( _fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, ) { @@ -130,8 +137,22 @@ function save( }); } -export const donutChart = { - load, - save, +/** + * @internal + * @deprecated Use donutChartLoad and donutChartSave instead. + */ +export interface IDonutChartConfig { + load: typeof donutChartLoad; + save: typeof donutChartSave; + DEFAULTS: ConfigDefaults; +} + +/** + * @internal + * @deprecated Use donutChartLoad and donutChartSave instead. + */ +export const donutChart: IDonutChartConfig = { + load: donutChartLoad, + save: donutChartSave, DEFAULTS, }; diff --git a/libs/sdk-code-convertors/src/configs/funnelChart.ts b/libs/sdk-code-convertors/src/configs/funnelChart.ts index b7aa44f4a5d..c08c0b57997 100644 --- a/libs/sdk-code-convertors/src/configs/funnelChart.ts +++ b/libs/sdk-code-convertors/src/configs/funnelChart.ts @@ -13,7 +13,8 @@ import { saveConfigObject, } from "./utils.js"; -type DefaultProperties = { +/** @internal */ +export type FunnelChartConfigProperties = { colorMapping: Array; dataLabels: { visible: boolean | "auto"; @@ -32,7 +33,8 @@ type DefaultProperties = { disableScheduledExports: boolean; }; -const DEFAULTS: ConfigDefaults = { +/** @internal */ +const DEFAULTS: ConfigDefaults = { colorMapping: [], dataLabels: { visible: "auto", @@ -50,7 +52,11 @@ const DEFAULTS: ConfigDefaults = { disableScheduledExports: false, }; -function load(props: VisualisationConfig) { +/** @internal */ +export const FUNNEL_CHART_DEFAULTS = DEFAULTS; + +/** @internal */ +export function funnelChartLoad(props: VisualisationConfig) { return loadConfig(props, (key, value) => { switch (key) { case "colorMapping": @@ -101,7 +107,8 @@ function load(props: VisualisationConfig) { }); } -function save( +/** @internal */ +export function funnelChartSave( _fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, ) { @@ -130,8 +137,22 @@ function save( }); } -export const funnelChart = { - load, - save, +/** + * @internal + * @deprecated Use funnelChartLoad and funnelChartSave instead. + */ +export interface IFunnelChartConfig { + load: typeof funnelChartLoad; + save: typeof funnelChartSave; + DEFAULTS: ConfigDefaults; +} + +/** + * @internal + * @deprecated Use funnelChartLoad and funnelChartSave instead. + */ +export const funnelChart: IFunnelChartConfig = { + load: funnelChartLoad, + save: funnelChartSave, DEFAULTS, }; diff --git a/libs/sdk-code-convertors/src/configs/geoAreaChart.ts b/libs/sdk-code-convertors/src/configs/geoAreaChart.ts index 416e66b5d77..cbd6051d1c4 100644 --- a/libs/sdk-code-convertors/src/configs/geoAreaChart.ts +++ b/libs/sdk-code-convertors/src/configs/geoAreaChart.ts @@ -13,7 +13,8 @@ import { saveConfigObject, } from "./utils.js"; -type DefaultProperties = { +/** @internal */ +export type GeoAreaChartConfigProperties = { colorMapping: Array; legend: { enabled: boolean; @@ -59,7 +60,8 @@ type DefaultProperties = { disableScheduledExports: boolean; }; -const DEFAULTS: ConfigDefaults = { +/** @internal */ +const DEFAULTS: ConfigDefaults = { colorMapping: [], legend: { enabled: true, @@ -87,7 +89,7 @@ const DEFAULTS: ConfigDefaults = { disableScheduledExports: false, }; -function sanitizeControls(controls: DefaultProperties): DefaultProperties { +function sanitizeControls(controls: GeoAreaChartConfigProperties): GeoAreaChartConfigProperties { const sanitized = { ...controls }; // Strip center/zoom when bounds are present (bounds is canonical for custom viewport) @@ -114,7 +116,11 @@ function sanitizeControls(controls: DefaultProperties): DefaultProperties { return sanitized; } -function load(props: VisualisationConfig) { +/** @internal */ +export const GEO_AREA_CHART_DEFAULTS = DEFAULTS; + +/** @internal */ +export function geoAreaChartLoad(props: VisualisationConfig) { const sanitizedProps = props.controls ? { controls: sanitizeControls(props.controls) } : props; return loadConfig(sanitizedProps, (key, value) => { switch (key) { @@ -195,7 +201,8 @@ function load(props: VisualisationConfig) { }); } -function save( +/** @internal */ +export function geoAreaChartSave( _fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, _positions: Array<{ longitude: string; latitude: string }>, @@ -284,8 +291,22 @@ function save( }); } -export const geoAreaChart = { - load, - save, +/** + * @internal + * @deprecated Use geoAreaChartLoad and geoAreaChartSave instead. + */ +export interface IGeoAreaChartConfig { + load: typeof geoAreaChartLoad; + save: typeof geoAreaChartSave; + DEFAULTS: ConfigDefaults; +} + +/** + * @internal + * @deprecated Use geoAreaChartLoad and geoAreaChartSave instead. + */ +export const geoAreaChart: IGeoAreaChartConfig = { + load: geoAreaChartLoad, + save: geoAreaChartSave, DEFAULTS, }; diff --git a/libs/sdk-code-convertors/src/configs/geoChart.ts b/libs/sdk-code-convertors/src/configs/geoChart.ts index f4541bd70e1..be5f8a92b7f 100644 --- a/libs/sdk-code-convertors/src/configs/geoChart.ts +++ b/libs/sdk-code-convertors/src/configs/geoChart.ts @@ -13,7 +13,8 @@ import { saveConfigObject, } from "./utils.js"; -type DefaultProperties = { +/** @internal */ +export type GeoChartConfigProperties = { colorMapping: Array; legend: { enabled: boolean; @@ -68,7 +69,8 @@ type DefaultProperties = { disableScheduledExports: boolean; }; -const DEFAULTS: ConfigDefaults = { +/** @internal */ +const DEFAULTS: ConfigDefaults = { colorMapping: [], legend: { enabled: true, @@ -105,7 +107,7 @@ const DEFAULTS: ConfigDefaults = { disableScheduledExports: false, }; -function sanitizeControls(controls: DefaultProperties): DefaultProperties { +function sanitizeControls(controls: GeoChartConfigProperties): GeoChartConfigProperties { const sanitized = { ...controls }; // Strip icon when shapeType is not "oneIcon" @@ -138,7 +140,11 @@ function sanitizeControls(controls: DefaultProperties): DefaultProperties { return sanitized; } -function load(props: VisualisationConfig) { +/** @internal */ +export const GEO_CHART_DEFAULTS = DEFAULTS; + +/** @internal */ +export function geoChartLoad(props: VisualisationConfig) { const sanitizedProps = props.controls ? { controls: sanitizeControls(props.controls) } : props; return loadConfig(sanitizedProps, (key, value) => { switch (key) { @@ -234,7 +240,8 @@ function load(props: VisualisationConfig) { }); } -function save( +/** @internal */ +export function geoChartSave( _fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, positions: Array<{ longitude: string; latitude: string }>, @@ -349,8 +356,22 @@ function save( }); } -export const geoChart = { - load, - save, +/** + * @internal + * @deprecated Use geoChartLoad and geoChartSave instead. + */ +export interface IGeoChartConfig { + load: typeof geoChartLoad; + save: typeof geoChartSave; + DEFAULTS: ConfigDefaults; +} + +/** + * @internal + * @deprecated Use geoChartLoad and geoChartSave instead. + */ +export const geoChart: IGeoChartConfig = { + load: geoChartLoad, + save: geoChartSave, DEFAULTS, }; diff --git a/libs/sdk-code-convertors/src/configs/headlineChart.ts b/libs/sdk-code-convertors/src/configs/headlineChart.ts index 829f05e41d3..2386377d3f2 100644 --- a/libs/sdk-code-convertors/src/configs/headlineChart.ts +++ b/libs/sdk-code-convertors/src/configs/headlineChart.ts @@ -13,7 +13,8 @@ import { saveConfigObject, } from "./utils.js"; -type DefaultProperties = { +/** @internal */ +export type HeadlineChartConfigProperties = { comparison: { enabled: boolean; calculationType: "change" | "change_difference" | "ratio" | "difference"; @@ -38,7 +39,8 @@ type DefaultProperties = { disableScheduledExports: boolean; }; -const DEFAULTS: ConfigDefaults = { +/** @internal */ +const DEFAULTS: ConfigDefaults = { comparison: { calculationType: "ratio", format: "#,##0%", @@ -63,7 +65,11 @@ const DEFAULTS: ConfigDefaults = { disableScheduledExports: false, }; -function load(props: VisualisationConfig) { +/** @internal */ +export const HEADLINE_CHART_DEFAULTS = DEFAULTS; + +/** @internal */ +export function headlineChartLoad(props: VisualisationConfig) { return loadConfig(props, (key, value) => { switch (key) { case "comparison": { @@ -142,7 +148,8 @@ function load(props: VisualisationConfig) { }); } -function save( +/** @internal */ +export function headlineChartSave( _fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined = {}, ) { @@ -187,8 +194,22 @@ function save( }); } -export const headlineChart = { - load, - save, +/** + * @internal + * @deprecated Use headlineChartLoad and headlineChartSave instead. + */ +export interface IHeadlineChartConfig { + load: typeof headlineChartLoad; + save: typeof headlineChartSave; + DEFAULTS: ConfigDefaults; +} + +/** + * @internal + * @deprecated Use headlineChartLoad and headlineChartSave instead. + */ +export const headlineChart: IHeadlineChartConfig = { + load: headlineChartLoad, + save: headlineChartSave, DEFAULTS, }; diff --git a/libs/sdk-code-convertors/src/configs/heatmapChart.ts b/libs/sdk-code-convertors/src/configs/heatmapChart.ts index ae0bb86cc9b..abc574c90c2 100644 --- a/libs/sdk-code-convertors/src/configs/heatmapChart.ts +++ b/libs/sdk-code-convertors/src/configs/heatmapChart.ts @@ -13,7 +13,8 @@ import { saveConfigObject, } from "./utils.js"; -type DefaultProperties = { +/** @internal */ +export type HeatmapChartConfigProperties = { colorMapping: Array; dataLabels: { visible: boolean | "auto"; @@ -46,7 +47,8 @@ type DefaultProperties = { disableScheduledExports: boolean; }; -const DEFAULTS: ConfigDefaults = { +/** @internal */ +const DEFAULTS: ConfigDefaults = { colorMapping: [], dataLabels: { visible: "auto", @@ -79,7 +81,11 @@ const DEFAULTS: ConfigDefaults = { disableScheduledExports: false, }; -function load(props: VisualisationConfig) { +/** @internal */ +export const HEATMAP_CHART_DEFAULTS = DEFAULTS; + +/** @internal */ +export function heatmapChartLoad(props: VisualisationConfig) { return loadConfig(props, (key, value) => { switch (key) { case "colorMapping": @@ -160,7 +166,8 @@ function load(props: VisualisationConfig) { }); } -function save( +/** @internal */ +export function heatmapChartSave( _fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, ) { @@ -206,8 +213,22 @@ function save( }); } -export const heatmapChart = { - load, - save, +/** + * @internal + * @deprecated Use heatmapChartLoad and heatmapChartSave instead. + */ +export interface IHeatmapChartConfig { + load: typeof heatmapChartLoad; + save: typeof heatmapChartSave; + DEFAULTS: ConfigDefaults; +} + +/** + * @internal + * @deprecated Use heatmapChartLoad and heatmapChartSave instead. + */ +export const heatmapChart: IHeatmapChartConfig = { + load: heatmapChartLoad, + save: heatmapChartSave, DEFAULTS, }; diff --git a/libs/sdk-code-convertors/src/configs/lineChart.ts b/libs/sdk-code-convertors/src/configs/lineChart.ts index 9b7864579b0..4749b505798 100644 --- a/libs/sdk-code-convertors/src/configs/lineChart.ts +++ b/libs/sdk-code-convertors/src/configs/lineChart.ts @@ -13,7 +13,8 @@ import { saveConfigObject, } from "./utils.js"; -type DefaultProperties = { +/** @internal */ +export type LineChartConfigProperties = { colorMapping: Array; continuousLine: { enabled: boolean; @@ -76,7 +77,8 @@ type DefaultProperties = { thresholdExcludedMeasures: string[]; }; -const DEFAULTS: ConfigDefaults = { +/** @internal */ +const DEFAULTS: ConfigDefaults = { colorMapping: [], continuousLine: { enabled: false, @@ -138,7 +140,11 @@ const DEFAULTS: ConfigDefaults = { thresholdExcludedMeasures: [], }; -function load(props: VisualisationConfig) { +/** @internal */ +export const LINE_CHART_DEFAULTS = DEFAULTS; + +/** @internal */ +export function lineChartLoad(props: VisualisationConfig) { return loadConfig(props, (key, value) => { switch (key) { case "colorMapping": @@ -296,7 +302,8 @@ function load(props: VisualisationConfig) { }); } -function save( +/** @internal */ +export function lineChartSave( _fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, ) { @@ -389,8 +396,22 @@ function save( }); } -export const lineChart = { - load, - save, +/** + * @internal + * @deprecated Use lineChartLoad and lineChartSave instead. + */ +export interface ILineChartConfig { + load: typeof lineChartLoad; + save: typeof lineChartSave; + DEFAULTS: ConfigDefaults; +} + +/** + * @internal + * @deprecated Use lineChartLoad and lineChartSave instead. + */ +export const lineChart: ILineChartConfig = { + load: lineChartLoad, + save: lineChartSave, DEFAULTS, }; diff --git a/libs/sdk-code-convertors/src/configs/pieChart.ts b/libs/sdk-code-convertors/src/configs/pieChart.ts index aab9c143e19..2bc2309f945 100644 --- a/libs/sdk-code-convertors/src/configs/pieChart.ts +++ b/libs/sdk-code-convertors/src/configs/pieChart.ts @@ -13,7 +13,8 @@ import { saveConfigObject, } from "./utils.js"; -type DefaultProperties = { +/** @internal */ +export type PieChartConfigProperties = { colorMapping: Array; dataLabels: { visible: boolean | "auto"; @@ -32,7 +33,8 @@ type DefaultProperties = { disableScheduledExports: boolean; }; -const DEFAULTS: ConfigDefaults = { +/** @internal */ +const DEFAULTS: ConfigDefaults = { colorMapping: [], dataLabels: { visible: false, @@ -50,7 +52,11 @@ const DEFAULTS: ConfigDefaults = { disableScheduledExports: false, }; -function load(props: VisualisationConfig) { +/** @internal */ +export const PIE_CHART_DEFAULTS = DEFAULTS; + +/** @internal */ +export function pieChartLoad(props: VisualisationConfig) { return loadConfig(props, (key, value) => { switch (key) { case "colorMapping": @@ -101,7 +107,8 @@ function load(props: VisualisationConfig) { }); } -function save( +/** @internal */ +export function pieChartSave( _fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, ) { @@ -130,8 +137,22 @@ function save( }); } -export const pieChart = { - load, - save, +/** + * @internal + * @deprecated Use pieChartLoad and pieChartSave instead. + */ +export interface IPieChartConfig { + load: typeof pieChartLoad; + save: typeof pieChartSave; + DEFAULTS: ConfigDefaults; +} + +/** + * @internal + * @deprecated Use pieChartLoad and pieChartSave instead. + */ +export const pieChart: IPieChartConfig = { + load: pieChartLoad, + save: pieChartSave, DEFAULTS, }; diff --git a/libs/sdk-code-convertors/src/configs/pyramidChart.ts b/libs/sdk-code-convertors/src/configs/pyramidChart.ts index 3ced301ced1..5be2bc62131 100644 --- a/libs/sdk-code-convertors/src/configs/pyramidChart.ts +++ b/libs/sdk-code-convertors/src/configs/pyramidChart.ts @@ -13,7 +13,8 @@ import { saveConfigObject, } from "./utils.js"; -type DefaultProperties = { +/** @internal */ +export type PyramidChartConfigProperties = { colorMapping: Array; dataLabels: { visible: boolean | "auto"; @@ -32,7 +33,8 @@ type DefaultProperties = { disableScheduledExports: boolean; }; -const DEFAULTS: ConfigDefaults = { +/** @internal */ +const DEFAULTS: ConfigDefaults = { colorMapping: [], dataLabels: { visible: "auto", @@ -50,7 +52,11 @@ const DEFAULTS: ConfigDefaults = { disableScheduledExports: false, }; -function load(props: VisualisationConfig) { +/** @internal */ +export const PYRAMID_CHART_DEFAULTS = DEFAULTS; + +/** @internal */ +export function pyramidChartLoad(props: VisualisationConfig) { return loadConfig(props, (key, value) => { switch (key) { case "colorMapping": @@ -101,7 +107,8 @@ function load(props: VisualisationConfig) { }); } -function save( +/** @internal */ +export function pyramidChartSave( _fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, ) { @@ -130,8 +137,22 @@ function save( }); } -export const pyramidChart = { - load, - save, +/** + * @internal + * @deprecated Use pyramidChartLoad and pyramidChartSave instead. + */ +export interface IPyramidChartConfig { + load: typeof pyramidChartLoad; + save: typeof pyramidChartSave; + DEFAULTS: ConfigDefaults; +} + +/** + * @internal + * @deprecated Use pyramidChartLoad and pyramidChartSave instead. + */ +export const pyramidChart: IPyramidChartConfig = { + load: pyramidChartLoad, + save: pyramidChartSave, DEFAULTS, }; diff --git a/libs/sdk-code-convertors/src/configs/repeaterChart.ts b/libs/sdk-code-convertors/src/configs/repeaterChart.ts index 0a77802eeb1..5dfb9039718 100644 --- a/libs/sdk-code-convertors/src/configs/repeaterChart.ts +++ b/libs/sdk-code-convertors/src/configs/repeaterChart.ts @@ -19,7 +19,8 @@ import { saveConfigObject, } from "./utils.js"; -type DefaultProperties = { +/** @internal */ +export type RepeaterChartConfigProperties = { colorMapping: Array; columnWidths: Array; cellImageSizing: "fit" | "fill"; @@ -30,6 +31,7 @@ type DefaultProperties = { disableScheduledExports: boolean; }; +/** @internal */ export type InlineVisualizations = Record< string, { @@ -37,7 +39,8 @@ export type InlineVisualizations = Record< } >; -const DEFAULTS: ConfigDefaults = { +/** @internal */ +const DEFAULTS: ConfigDefaults = { colorMapping: [], columnWidths: [], rowHeight: "small", @@ -48,7 +51,11 @@ const DEFAULTS: ConfigDefaults = { disableScheduledExports: false, }; -function load(props: VisualisationConfig) { +/** @internal */ +export const REPEATER_CHART_DEFAULTS = DEFAULTS; + +/** @internal */ +export function repeaterChartLoad(props: VisualisationConfig) { return loadConfig(props, (key, value) => { switch (key) { case "columnWidths": { @@ -115,7 +122,8 @@ function load(props: VisualisationConfig) { }); } -function save( +/** @internal */ +export function repeaterChartSave( fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, ) { @@ -139,7 +147,8 @@ function save( }); } -function saveInlineVisualizations(metrics: Bucket[] = []) { +/** @internal */ +export function saveInlineVisualizations(metrics: Bucket[] = []) { return metrics?.reduce((map, b) => { const bucket = getFullBucket(b); if (bucket.display_as && bucket.field) { @@ -151,9 +160,24 @@ function saveInlineVisualizations(metrics: Bucket[] = []) { }, {}); } -export const repeaterChart = { - load, - save, +/** + * @internal + * @deprecated Use repeaterChartLoad and repeaterChartSave instead. + */ +export interface IRepeaterChartConfig { + load: typeof repeaterChartLoad; + save: typeof repeaterChartSave; + saveInlineVisualizations: typeof saveInlineVisualizations; + DEFAULTS: ConfigDefaults; +} + +/** + * @internal + * @deprecated Use repeaterChartLoad and repeaterChartSave instead. + */ +export const repeaterChart: IRepeaterChartConfig = { + load: repeaterChartLoad, + save: repeaterChartSave, saveInlineVisualizations, DEFAULTS, }; diff --git a/libs/sdk-code-convertors/src/configs/sankeyChart.ts b/libs/sdk-code-convertors/src/configs/sankeyChart.ts index db190729270..0938c052ee9 100644 --- a/libs/sdk-code-convertors/src/configs/sankeyChart.ts +++ b/libs/sdk-code-convertors/src/configs/sankeyChart.ts @@ -13,7 +13,8 @@ import { saveConfigObject, } from "./utils.js"; -type DefaultProperties = { +/** @internal */ +export type SankeyChartConfigProperties = { colorMapping: Array; dataLabels: { visible: boolean | "auto"; @@ -28,7 +29,8 @@ type DefaultProperties = { disableScheduledExports: boolean; }; -const DEFAULTS: ConfigDefaults = { +/** @internal */ +const DEFAULTS: ConfigDefaults = { colorMapping: [], dataLabels: { visible: "auto", @@ -43,7 +45,11 @@ const DEFAULTS: ConfigDefaults = { disableScheduledExports: false, }; -function load(props: VisualisationConfig) { +/** @internal */ +export const SANKEY_CHART_DEFAULTS = DEFAULTS; + +/** @internal */ +export function sankeyChartLoad(props: VisualisationConfig) { return loadConfig(props, (key, value) => { switch (key) { case "colorMapping": @@ -86,7 +92,8 @@ function load(props: VisualisationConfig) { }); } -function save( +/** @internal */ +export function sankeyChartSave( _fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, ) { @@ -114,8 +121,22 @@ function save( }); } -export const sankeyChart = { - load, - save, +/** + * @internal + * @deprecated Use sankeyChartLoad and sankeyChartSave instead. + */ +export interface ISankeyChartConfig { + load: typeof sankeyChartLoad; + save: typeof sankeyChartSave; + DEFAULTS: ConfigDefaults; +} + +/** + * @internal + * @deprecated Use sankeyChartLoad and sankeyChartSave instead. + */ +export const sankeyChart: ISankeyChartConfig = { + load: sankeyChartLoad, + save: sankeyChartSave, DEFAULTS, }; diff --git a/libs/sdk-code-convertors/src/configs/scatterChart.ts b/libs/sdk-code-convertors/src/configs/scatterChart.ts index f4d741311cb..f370561f07f 100644 --- a/libs/sdk-code-convertors/src/configs/scatterChart.ts +++ b/libs/sdk-code-convertors/src/configs/scatterChart.ts @@ -13,7 +13,8 @@ import { saveConfigObject, } from "./utils.js"; -type DefaultProperties = { +/** @internal */ +export type ScatterChartConfigProperties = { colorMapping: Array; dataLabels: { visible: boolean | "auto"; @@ -56,7 +57,8 @@ type DefaultProperties = { disableScheduledExports: boolean; }; -const DEFAULTS: ConfigDefaults = { +/** @internal */ +const DEFAULTS: ConfigDefaults = { colorMapping: [], dataLabels: { visible: false, @@ -99,7 +101,11 @@ const DEFAULTS: ConfigDefaults = { disableScheduledExports: false, }; -function load(props: VisualisationConfig) { +/** @internal */ +export const SCATTER_CHART_DEFAULTS = DEFAULTS; + +/** @internal */ +export function scatterChartLoad(props: VisualisationConfig) { return loadConfig(props, (key, value) => { switch (key) { case "colorMapping": @@ -204,7 +210,8 @@ function load(props: VisualisationConfig) { }); } -function save( +/** @internal */ +export function scatterChartSave( _fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, ) { @@ -268,8 +275,22 @@ function save( }); } -export const scatterChart = { - load, - save, +/** + * @internal + * @deprecated Use scatterChartLoad and scatterChartSave instead. + */ +export interface IScatterChartConfig { + load: typeof scatterChartLoad; + save: typeof scatterChartSave; + DEFAULTS: ConfigDefaults; +} + +/** + * @internal + * @deprecated Use scatterChartLoad and scatterChartSave instead. + */ +export const scatterChart: IScatterChartConfig = { + load: scatterChartLoad, + save: scatterChartSave, DEFAULTS, }; diff --git a/libs/sdk-code-convertors/src/configs/table.ts b/libs/sdk-code-convertors/src/configs/table.ts index c139cd8efa1..cf371df2821 100644 --- a/libs/sdk-code-convertors/src/configs/table.ts +++ b/libs/sdk-code-convertors/src/configs/table.ts @@ -13,7 +13,8 @@ import { saveConfigObject, } from "./utils.js"; -type DefaultProperties = { +/** @internal */ +export type TableConfigProperties = { columnWidths: Array; measureGroupDimension: "columns" | "rows"; columnHeadersPosition: "top" | "left"; @@ -39,7 +40,8 @@ type DefaultProperties = { grandTotalsPosition: "pinnedBottom" | "pinnedTop" | "bottom" | "top"; }; -const DEFAULTS: ConfigDefaults = { +/** @internal */ +const DEFAULTS: ConfigDefaults = { columnWidths: [], measureGroupDimension: "columns", columnHeadersPosition: "top", @@ -60,7 +62,7 @@ const DEFAULTS: ConfigDefaults = { grandTotalsPosition: "pinnedBottom", }; -type TextWrapping = DefaultProperties["textWrapping"]; +type TextWrapping = TableConfigProperties["textWrapping"]; type TextWrappingOverride = TextWrapping["columnOverrides"][number]; function loadTextWrapping(value: TextWrapping | undefined): object | undefined { @@ -142,7 +144,11 @@ function saveTextWrapping(value: YamlTextWrapping | undefined): TextWrapping | u }; } -function load(props: VisualisationConfig) { +/** @internal */ +export const TABLE_DEFAULTS = DEFAULTS; + +/** @internal */ +export function tableLoad(props: VisualisationConfig) { return loadConfig(props, (key, value) => { switch (key) { case "columnWidths": { @@ -208,7 +214,8 @@ function load(props: VisualisationConfig) { }); } -function save( +/** @internal */ +export function tableSave( fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, ) { @@ -244,8 +251,22 @@ function save( }); } -export const table = { - load, - save, +/** + * @internal + * @deprecated Use tableLoad and tableSave instead. + */ +export interface ITableConfig { + load: typeof tableLoad; + save: typeof tableSave; + DEFAULTS: ConfigDefaults; +} + +/** + * @internal + * @deprecated Use tableLoad and tableSave instead. + */ +export const table: ITableConfig = { + load: tableLoad, + save: tableSave, DEFAULTS, }; diff --git a/libs/sdk-code-convertors/src/configs/treemapChart.ts b/libs/sdk-code-convertors/src/configs/treemapChart.ts index de5055892cc..216ae222566 100644 --- a/libs/sdk-code-convertors/src/configs/treemapChart.ts +++ b/libs/sdk-code-convertors/src/configs/treemapChart.ts @@ -13,7 +13,8 @@ import { saveConfigObject, } from "./utils.js"; -type DefaultProperties = { +/** @internal */ +export type TreemapChartConfigProperties = { colorMapping: Array; dataLabels: { visible: boolean | "auto"; @@ -32,7 +33,8 @@ type DefaultProperties = { disableScheduledExports: boolean; }; -const DEFAULTS: ConfigDefaults = { +/** @internal */ +const DEFAULTS: ConfigDefaults = { colorMapping: [], dataLabels: { visible: "auto", @@ -50,7 +52,11 @@ const DEFAULTS: ConfigDefaults = { disableScheduledExports: false, }; -function load(props: VisualisationConfig) { +/** @internal */ +export const TREEMAP_CHART_DEFAULTS = DEFAULTS; + +/** @internal */ +export function treemapChartLoad(props: VisualisationConfig) { return loadConfig(props, (key, value) => { switch (key) { case "colorMapping": @@ -101,7 +107,8 @@ function load(props: VisualisationConfig) { }); } -function save( +/** @internal */ +export function treemapChartSave( _fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, ) { @@ -130,8 +137,22 @@ function save( }); } -export const treemapChart = { - load, - save, +/** + * @internal + * @deprecated Use treemapChartLoad and treemapChartSave instead. + */ +export interface ITreemapChartConfig { + load: typeof treemapChartLoad; + save: typeof treemapChartSave; + DEFAULTS: ConfigDefaults; +} + +/** + * @internal + * @deprecated Use treemapChartLoad and treemapChartSave instead. + */ +export const treemapChart: ITreemapChartConfig = { + load: treemapChartLoad, + save: treemapChartSave, DEFAULTS, }; diff --git a/libs/sdk-code-convertors/src/configs/types.ts b/libs/sdk-code-convertors/src/configs/types.ts index 506bb3d5c08..00f42694bc7 100644 --- a/libs/sdk-code-convertors/src/configs/types.ts +++ b/libs/sdk-code-convertors/src/configs/types.ts @@ -1,5 +1,6 @@ // (C) 2023-2026 GoodData Corporation +/** @public */ export type ColorMapping = { id: string; color: @@ -17,15 +18,19 @@ export type ColorMapping = { }; }; +/** @internal */ export type PointShapeSymbol = "circle" | "square" | "diamond" | "triangle" | "triangle-down"; +/** @internal */ export interface IChartFill { type: ChartFillType; measureToPatternName?: Record; } +/** @internal */ export type ChartFillType = "solid" | "pattern" | "outline"; +/** @internal */ export type PatternFillName = | "diagonal_grid_small" | "vertical_lines_small" @@ -52,98 +57,121 @@ export type PatternFillName = | "diamond_medium" | "pizza_medium"; +/** @public */ export type ColumnLocator = IAttributeColumnLocator | IMeasureColumnLocator | ITotalColumnLocator; +/** @public */ export interface IAttributeColumnLocatorBody { attributeIdentifier: string; element?: string | null; } +/** @public */ export interface ITotalColumnLocatorBody { attributeIdentifier: string; totalFunction: string; } +/** @public */ export interface IAttributeColumnLocator { attributeLocatorItem: IAttributeColumnLocatorBody; } +/** @public */ export interface ITotalColumnLocator { totalLocatorItem: ITotalColumnLocatorBody; } +/** @public */ export interface IAttributeColumnWidthItem { attributeColumnWidthItem: IAttributeColumnWidthItemBody; } +/** @public */ export interface IAttributeColumnWidthItemBody { width: IAbsoluteColumnWidth; attributeIdentifier: string; } +/** @public */ export interface IMeasureColumnWidthItemBody { width: ColumnWidth; locators: ColumnLocator[]; } +/** @public */ export interface IMeasureColumnWidthItem { measureColumnWidthItem: IMeasureColumnWidthItemBody; } +/** @public */ export interface ISliceMeasureColumnWidthItemBody { width: ColumnWidth; locators: IMeasureColumnLocator[]; } +/** @public */ export interface ISliceMeasureColumnWidthItem { sliceMeasureColumnWidthItem: ISliceMeasureColumnWidthItemBody; } +/** @public */ export interface IMixedValuesColumnWidthItemBody { width: ColumnWidth; locators: IMeasureColumnLocator[]; } +/** @public */ export interface IAbsoluteColumnWidth { value: number; allowGrowToFit?: boolean; } +/** @public */ export type ColumnWidth = IAbsoluteColumnWidth | IAutoColumnWidth; +/** @public */ export interface IAutoColumnWidth { value: "auto"; } +/** @public */ export interface IMixedValuesColumnWidthItem { mixedValuesColumnWidthItem: IMixedValuesColumnWidthItemBody; } +/** @public */ export interface IAllMeasureColumnWidthItemBody { width: IAbsoluteColumnWidth; } +/** @public */ export interface IAllMeasureColumnWidthItem { measureColumnWidthItem: IAllMeasureColumnWidthItemBody; } +/** @public */ export interface IWeakMeasureColumnWidthItemBody { width: IAbsoluteColumnWidth; locator: IMeasureColumnLocator; } +/** @public */ export interface IWeakMeasureColumnWidthItem { measureColumnWidthItem: IWeakMeasureColumnWidthItemBody; } +/** @public */ export interface IMeasureColumnLocatorBody { measureIdentifier: string; } +/** @public */ export interface IMeasureColumnLocator { measureLocatorItem: IMeasureColumnLocatorBody; } +/** @public */ export type ColumnWidthItem = | IAttributeColumnWidthItem | IMeasureColumnWidthItem diff --git a/libs/sdk-code-convertors/src/configs/utils.ts b/libs/sdk-code-convertors/src/configs/utils.ts index 2856884cdf0..c12cea197fa 100644 --- a/libs/sdk-code-convertors/src/configs/utils.ts +++ b/libs/sdk-code-convertors/src/configs/utils.ts @@ -9,6 +9,7 @@ export type VisualisationConfig = { controls?: T; }; +/** @internal */ export type ConfigDefaults = { [key in keyof T]: T[key]; }; diff --git a/libs/sdk-code-convertors/src/configs/waterfallChart.ts b/libs/sdk-code-convertors/src/configs/waterfallChart.ts index ad7fc58b97e..5f86d2eee3c 100644 --- a/libs/sdk-code-convertors/src/configs/waterfallChart.ts +++ b/libs/sdk-code-convertors/src/configs/waterfallChart.ts @@ -18,7 +18,8 @@ import { saveConfigObject, } from "./utils.js"; -type DefaultProperties = { +/** @internal */ +export type WaterfallChartConfigProperties = { colorMapping: Array; dataLabels: { visible: boolean | "auto"; @@ -68,7 +69,8 @@ type DefaultProperties = { disableScheduledExports: boolean; }; -const DEFAULTS: ConfigDefaults = { +/** @internal */ +const DEFAULTS: ConfigDefaults = { colorMapping: [], dataLabels: { visible: "auto", @@ -117,7 +119,11 @@ const DEFAULTS: ConfigDefaults = { disableScheduledExports: false, }; -function load(props: VisualisationConfig) { +/** @internal */ +export const WATERFALL_CHART_DEFAULTS = DEFAULTS; + +/** @internal */ +export function waterfallChartLoad(props: VisualisationConfig) { return loadConfig(props, (key, value) => { switch (key) { case "colorMapping": @@ -224,7 +230,8 @@ function load(props: VisualisationConfig) { }); } -function save( +/** @internal */ +export function waterfallChartSave( _fields: Visualisation["query"]["fields"] | undefined, config: Visualisation["config"] | undefined, ) { @@ -284,8 +291,22 @@ function save( }); } -export const waterfallChart = { - load, - save, +/** + * @internal + * @deprecated Use waterfallChartLoad and waterfallChartSave instead. + */ +export interface IWaterfallChartConfig { + load: typeof waterfallChartLoad; + save: typeof waterfallChartSave; + DEFAULTS: ConfigDefaults; +} + +/** + * @internal + * @deprecated Use waterfallChartLoad and waterfallChartSave instead. + */ +export const waterfallChart: IWaterfallChartConfig = { + load: waterfallChartLoad, + save: waterfallChartSave, DEFAULTS, }; diff --git a/libs/sdk-code-convertors/src/conts.ts b/libs/sdk-code-convertors/src/conts.ts index 751ecb24443..d1e6513fcc2 100644 --- a/libs/sdk-code-convertors/src/conts.ts +++ b/libs/sdk-code-convertors/src/conts.ts @@ -1,17 +1,24 @@ // (C) 2024-2026 GoodData Corporation +/** @internal */ export const DatasetTypes = ["dataset"]; +/** @internal */ export const DateDatasetTypes = ["date"]; +/** @internal */ export const MetricTypes = ["metric"]; +/** @internal */ export const DashboardTypes = ["dashboard"]; +/** @internal */ export const PluginTypes = ["plugin"]; +/** @internal */ export const AttributeHierarchyTypes = ["attribute_hierarchy"]; +/** @internal */ export const VisualisationsTypes = [ "table", "bar_chart", @@ -37,6 +44,7 @@ export const VisualisationsTypes = [ "repeater_chart", ]; +/** @internal */ export const AllTypes = [ ...DatasetTypes, ...DateDatasetTypes, diff --git a/libs/sdk-code-convertors/src/from/declarativeDashboardToYaml.ts b/libs/sdk-code-convertors/src/from/declarativeDashboardToYaml.ts index cfa451279ab..f291ac5aba1 100644 --- a/libs/sdk-code-convertors/src/from/declarativeDashboardToYaml.ts +++ b/libs/sdk-code-convertors/src/from/declarativeDashboardToYaml.ts @@ -68,6 +68,7 @@ import { getIdentifier, } from "../utils/yamlUtils.js"; +/** @internal */ export type OverrideDashboardDefinition = Omit & { filterContextRef?: AfmObjectIdentifier; tabs?: DashboardTab[]; @@ -237,6 +238,7 @@ export function declarativeDashboardToYaml( }; } +/** @internal */ export function declarativeTabsToYaml( tabs: DashboardTab[], filterContexts?: DeclarativeFilterContext[], @@ -308,6 +310,7 @@ export function declarativeTabsToYaml( return yamlTabs; } +/** @internal */ export function declarativeSectionsToYaml( layout?: IDashboardLayout, entities?: FromEntities, @@ -355,6 +358,7 @@ export function declarativeSectionsToYaml( return sections; } +/** @internal */ export function declarativeWidgetToYaml( widget?: IDashboardWidget | null, size?: IDashboardLayoutItem["size"], @@ -696,6 +700,7 @@ export function declarativeContainerWidgetToYaml( return yamlWidget; } +/** @internal */ export function declarativeDrillToYaml( drill: InsightDrillDefinition, entities?: FromEntities, @@ -994,6 +999,7 @@ function sourceMeasureFilterRefsToYaml( .filter(Boolean) as string[]; } +/** @internal */ export type FilterContextItem = { yaml: YAMLMap; filter: IFilterContextDefinition["filters"][number] }; type EmptyValueHandling = NonNullable; @@ -1005,6 +1011,7 @@ function getDateFilterEmptyValueHandling(filter: IDashboardDateFilter): EmptyVal return undefined; } +/** @internal */ export function declarativeFilterContextToYaml( dateFilterConfig?: IDashboardDateFilterConfig, filterContext?: DeclarativeFilterContext, @@ -1367,6 +1374,7 @@ function declarativeMeasureValueFilterToYaml( return measureValueFilter; } +/** @internal */ export function declarativeFiltersConfigToYaml( filtersMap: Record, dateFilterConfig?: IDashboardDateFilterConfig, @@ -1531,6 +1539,7 @@ function getFilterGroupIdBase({ title, localIdentifier }: IDashboardFilterGroup) .toLowerCase(); } +/** @internal */ export function declarativePluginsToYaml(dashboard: IDashboardDefinition, errorContext?: IErrorContext) { if (!dashboard.plugins?.length) { return; diff --git a/libs/sdk-code-convertors/src/from/declarativeVisualisationToYaml.ts b/libs/sdk-code-convertors/src/from/declarativeVisualisationToYaml.ts index d5d971afdbe..ef5fd5e5324 100644 --- a/libs/sdk-code-convertors/src/from/declarativeVisualisationToYaml.ts +++ b/libs/sdk-code-convertors/src/from/declarativeVisualisationToYaml.ts @@ -177,7 +177,7 @@ export function declarativeVisualisationToYaml( type Report = { report: YAMLMap; - derivedBuckets: BucketGroup[]; + derivedBuckets: YamlBucketGroup[]; }; function declarativeReportToYaml( @@ -266,7 +266,7 @@ function declarativeReportToYaml( function appendLayerFieldsToReport( fieldsMap: YAMLMap, - postProcessors: PostProcessors, + postProcessors: YamlPostProcessors, entities: FromEntities, layers?: IInsightLayerDefinition[], errorContext?: IErrorContext, @@ -340,7 +340,7 @@ function getPairKeyValue(pair: Pair): string | undefined { export function declarativeFiltersConfigToYaml( insight: IInsightDefinition["insight"], - filtersMap: Record, + filtersMap: Record, errorContext?: IErrorContext, ) { Object.keys(insight.attributeFilterConfigs ?? {}).forEach((key) => { @@ -367,6 +367,7 @@ export function declarativeFiltersConfigToYaml( }); } +/** @internal */ export function declarativeVisTypeToYaml(def: IInsightDefinition["insight"]): string | null { switch (def.visualizationUrl) { case "local:table": @@ -506,17 +507,20 @@ function declarativeVisToYaml( //buckets -type PostProcessors = { +/** @internal */ +export type YamlPostProcessors = { filters: Array<{ item: YAMLMap; filters: IFilter[] }>; }; -type Buckets = { +/** @internal */ +export type YamlBuckets = { fieldsMap: YAMLMap; - groups: BucketGroup[]; - postProcessors: PostProcessors; + groups: YamlBucketGroup[]; + postProcessors: YamlPostProcessors; }; -type BucketGroupItems = Array<{ +/** @internal */ +export type YamlBucketGroupItems = Array<{ field: string; format?: string; totals?: YAMLMap[]; @@ -524,28 +528,36 @@ type BucketGroupItems = Array<{ display_as?: "metric" | "line" | "column"; } | null>; -type BucketGroup = { +/** @internal */ +export type YamlBucketGroup = { type: BucketsType; - items: BucketGroupItems; + items: YamlBucketGroupItems; }; -type FieldData = { +/** @internal */ +export type YamlFieldData = { format?: string; axis?: "primary" | "secondary"; }; +/** @internal */ export function declarativeBucketsToYaml( entities: FromEntities, buckets: IBucket[], errorContext?: IErrorContext, -): Buckets { +): YamlBuckets { const fullFieldsMap = new YAMLMap(); - const groups: BucketGroup[] = []; - const postProcessors: PostProcessors = { + const groups: YamlBucketGroup[] = []; + const postProcessors: YamlPostProcessors = { filters: [], }; - const addField = (local: string, def: YAMLMap, group: BucketGroup, { format, axis }: FieldData = {}) => { + const addField = ( + local: string, + def: YAMLMap, + group: YamlBucketGroup, + { format, axis }: YamlFieldData = {}, + ) => { fullFieldsMap.add(new Pair(local, def)); group.items.push(createBucketGroupItem(local, format, axis)); }; @@ -553,7 +565,7 @@ export function declarativeBucketsToYaml( //create buckets buckets.forEach((bucket, bi) => { if (isBucket(bucket)) { - const group: BucketGroup = { items: [], type: bucket.localIdentifier as BucketsType }; + const group: YamlBucketGroup = { items: [], type: bucket.localIdentifier as BucketsType }; const attributesMap: Record = {}; const isLocation = bucket.localIdentifier === BucketsType.Location; @@ -679,6 +691,7 @@ export function declarativeBucketsToYaml( }; } +/** @internal */ export function declarativeAttributeToYaml(def: IAttributeBody, errorContext?: IErrorContext): YAMLMap { const map = new YAMLMap(); @@ -701,6 +714,7 @@ export function declarativeAttributeToYaml(def: IAttributeBody, errorContext?: I return map; } +/** @internal */ export function declarativeInlineMetricToYaml( def: IMeasureBody, inlineDef: IInlineMeasureDefinition, @@ -715,10 +729,11 @@ export function declarativeInlineMetricToYaml( return map; } +/** @internal */ export function declarativeNormalMetricToYaml( def: IMeasureBody, metricDefinition: IMeasureDefinition, - postProcessors: PostProcessors, + postProcessors: YamlPostProcessors, errorContext?: IErrorContext, ): YAMLMap { const map = new YAMLMap(); @@ -748,6 +763,7 @@ export function declarativeNormalMetricToYaml( return map; } +/** @internal */ export function declarativeArithmeticMetricToYaml( def: IMeasureBody, arithmeticDefinition: IArithmeticMeasureDefinition, @@ -763,6 +779,7 @@ export function declarativeArithmeticMetricToYaml( return map; } +/** @internal */ export function declarativePoPMetricToYaml( def: IMeasureBody, popDefinition: IPoPMeasureDefinition, @@ -789,6 +806,7 @@ export function declarativePoPMetricToYaml( return map; } +/** @internal */ export function declarativePreviousPeriodMetricToYaml( def: IMeasureBody, previousDefinition: IPreviousPeriodMeasureDefinition, @@ -841,7 +859,7 @@ function createBucketGroupItem( field: string, format?: string, axis?: "primary" | "secondary", -): BucketGroupItems[number] { +): YamlBucketGroupItems[number] { return { field, ...(format ? { format } : {}), @@ -861,13 +879,15 @@ function getShortenedBucket(def: YAMLMap): string | false { //filters -type FilterMapEntry = { +/** @internal */ +export type YamlFilterMapEntry = { yaml: YAMLMap; filter: IFilter; }; -type Filters = { - filtersMap: Record; +/** @internal */ +export type YamlFilters = { + filtersMap: Record; filtersArray: YAMLMap; }; @@ -985,13 +1005,14 @@ function groupFiltersByDateFilter(filters: IFilter[]): { return result; } +/** @internal */ export function declarativeFiltersToYaml( entities: FromEntities, filters: IFilter[], errorContext?: IErrorContext, -): Filters { +): YamlFilters { const filtersArray: Array = []; - const filtersMap: Record = {}; + const filtersMap: Record = {}; const usedKeys = new Set(); const getUniqueKey = (baseKey: string) => { @@ -1233,6 +1254,7 @@ function processConnectedAttributeFilters( }); } +/** @internal */ export function declarativeAbsoluteDateFilterToYaml( absoluteDateFilter: IAbsoluteDateFilter["absoluteDateFilter"], connectedAttributeFilters: IFilter[] = [], @@ -1279,6 +1301,7 @@ function isRelativeDateFilterAllTime( return granularity === "GDC.time.year" && from === undefined && to === undefined; } +/** @internal */ export function declarativeRelativeDateFilterToYaml( relativeDateFilter: IRelativeDateFilter["relativeDateFilter"], connectedAttributeFilters: IFilter[] = [], @@ -1319,6 +1342,7 @@ export function declarativeRelativeDateFilterToYaml( return map; } +/** @internal */ export function declarativePositiveAttributeFilterToYaml( entities: FromEntities, attributeFilter: IPositiveAttributeFilterBody, @@ -1347,6 +1371,7 @@ export function declarativePositiveAttributeFilterToYaml( return map; } +/** @internal */ export function declarativeNegativeAttributeFilterToYaml( entities: FromEntities, attributeFilter: INegativeAttributeFilterBody, @@ -1473,6 +1498,7 @@ function addConditionToYamlMap(conditionMap: YAMLMap, condition: MeasureValueFil return hasTreatNullValues; } +/** @internal */ export function declarativeMeasureValueFilterToYaml( measureValueFilter: IMeasureValueFilterBody, errorContext?: IErrorContext, @@ -1541,6 +1567,7 @@ export function declarativeMeasureValueFilterToYaml( return map; } +/** @internal */ export function declarativeRankingFilterToYaml( rankingFilter: IRankingFilterBody, errorContext?: IErrorContext, @@ -1588,11 +1615,13 @@ export function declarativeRankingFilterToYaml( //sorts -type Sorts = { +/** @internal */ +export type YamlSorts = { sortsArray: YAMLMap[]; }; -export function declarativeSortsToYaml(sorts: ISortItem[], _errorContext?: IErrorContext): Sorts { +/** @internal */ +export function declarativeSortsToYaml(sorts: ISortItem[], _errorContext?: IErrorContext): YamlSorts { const sortsArray: YAMLMap[] = []; sorts.forEach((sort) => { @@ -1609,6 +1638,7 @@ export function declarativeSortsToYaml(sorts: ISortItem[], _errorContext?: IErro }; } +/** @internal */ export function declarativeAttributeSortToYaml(sort: IAttributeSortItem): YAMLMap { const { attributeIdentifier, aggregation, direction } = sort.attributeSortItem; const map = new YAMLMap(); @@ -1623,6 +1653,7 @@ export function declarativeAttributeSortToYaml(sort: IAttributeSortItem): YAMLMa return map; } +/** @internal */ export function declarativeMeasureSortToYaml(sort: IMeasureSortItem): YAMLMap { const { locators, direction } = sort.measureSortItem; const map = new YAMLMap(); @@ -1810,7 +1841,7 @@ function declarativeVisScatterToYaml( //buckets const metrics1 = report.derivedBuckets.find((item) => item.type === BucketsType.Measures); const metrics2 = report.derivedBuckets.find((item) => item.type === BucketsType.SecondaryMeasures); - const metrics: BucketGroup = { + const metrics: YamlBucketGroup = { items: cleanUpItems([ ...(metrics1?.items.length ? metrics1.items : [null]), ...(metrics2?.items.length ? metrics2.items : [null]), @@ -1846,7 +1877,7 @@ function declarativeVisBubbleToYaml( //buckets const metrics1 = report.derivedBuckets.find((item) => item.type === BucketsType.Measures); const metrics2 = report.derivedBuckets.find((item) => item.type === BucketsType.SecondaryMeasures); - const metrics: BucketGroup = { + const metrics: YamlBucketGroup = { items: cleanUpItems([ ...(metrics1?.items.length ? metrics1.items : [null]), ...(metrics2?.items.length ? metrics2.items : [null]), @@ -2031,7 +2062,7 @@ function declarativeVisBulletToYaml( const metrics1 = report.derivedBuckets.find((item) => item.type === BucketsType.Measures); const metrics2 = report.derivedBuckets.find((item) => item.type === BucketsType.SecondaryMeasures); const metrics3 = report.derivedBuckets.find((item) => item.type === BucketsType.TertiaryMeasures); - const metrics: BucketGroup = { + const metrics: YamlBucketGroup = { items: cleanUpItems([ ...(metrics1?.items.length ? metrics1.items : [null]), ...(metrics2?.items.length ? metrics2.items : [null]), @@ -2091,7 +2122,7 @@ function declarativeVisDependencyWheelToYaml( const from = report.derivedBuckets.find((item) => item.type === BucketsType.AttributeFrom); const to = report.derivedBuckets.find((item) => item.type === BucketsType.AttributeTo); - const view: BucketGroup = { + const view: YamlBucketGroup = { items: cleanUpItems([ ...(from?.items.length ? from.items : [null]), ...(to?.items.length ? to.items : [null]), @@ -2123,7 +2154,7 @@ function declarativeVisSankeyToYaml( const from = report.derivedBuckets.find((item) => item.type === BucketsType.AttributeFrom); const to = report.derivedBuckets.find((item) => item.type === BucketsType.AttributeTo); - const view: BucketGroup = { + const view: YamlBucketGroup = { items: cleanUpItems([ ...(from?.items.length ? from.items : [null]), ...(to?.items.length ? to.items : [null]), @@ -2150,7 +2181,7 @@ function declarativeVisHeadlineToYaml( //buckets const metrics1 = report.derivedBuckets.find((item) => item.type === BucketsType.Measures); const metrics2 = report.derivedBuckets.find((item) => item.type === BucketsType.SecondaryMeasures); - const metrics: BucketGroup = { + const metrics: YamlBucketGroup = { items: [...(metrics1?.items ?? [null]), ...(metrics2?.items ?? [])], type: BucketsType.Measures, }; @@ -2180,7 +2211,7 @@ function declarativeVisComboToYaml( "secondary", ); - const metrics: BucketGroup = { + const metrics: YamlBucketGroup = { items: [...(metrics1?.items ?? []), ...(metrics2?.items ?? [])], type: BucketsType.Measures, }; @@ -2199,11 +2230,11 @@ function declarativeVisComboToYaml( } } -function addPushpinBucketsToYaml(target: Document | YAMLMap, groups: BucketGroup[]) { +function addPushpinBucketsToYaml(target: Document | YAMLMap, groups: YamlBucketGroup[]) { const sizeBucket = groups.find((item) => item.type === BucketsType.Size); const colorBucket = groups.find((item) => item.type === BucketsType.Color); - const metrics: BucketGroup = { + const metrics: YamlBucketGroup = { items: cleanUpItems([ ...(sizeBucket?.items.length ? sizeBucket.items : [null]), ...(colorBucket?.items ? colorBucket.items : [null]), @@ -2226,10 +2257,10 @@ function addPushpinBucketsToYaml(target: Document | YAMLMap, groups: BucketGroup } } -function addGeoAreaBucketsToYaml(target: Document | YAMLMap, groups: BucketGroup[]) { +function addGeoAreaBucketsToYaml(target: Document | YAMLMap, groups: YamlBucketGroup[]) { const colorBucket = groups.find((item) => item.type === BucketsType.Color); - const metrics: BucketGroup = { + const metrics: YamlBucketGroup = { items: cleanUpItems([...(colorBucket?.items.length ? colorBucket.items : [null])]), type: BucketsType.Measures, }; @@ -2334,6 +2365,7 @@ function declarativeVisRepeaterToYaml( //TOTALS +/** @internal */ export function declarativeTotalToYaml(total: ITotal, _errorContext?: IErrorContext) { const map = new YAMLMap(); @@ -2350,7 +2382,7 @@ export function declarativeTotalToYaml(total: ITotal, _errorContext?: IErrorCont }; } -function groupToYaml(group: BucketGroup) { +function groupToYaml(group: YamlBucketGroup) { return group.items.map((item) => { if (!item) { return null; @@ -2380,7 +2412,7 @@ function groupToYaml(group: BucketGroup) { }); } -function addAxisTypeToGroup(group: BucketGroup | undefined, axis: "primary" | "secondary") { +function addAxisTypeToGroup(group: YamlBucketGroup | undefined, axis: "primary" | "secondary") { if (!group) { return undefined; } @@ -2399,7 +2431,7 @@ function addAxisTypeToGroup(group: BucketGroup | undefined, axis: "primary" | "s } function addChartTypeToGroup( - group: BucketGroup | undefined, + group: YamlBucketGroup | undefined, config: IInsightDefinition["insight"]["properties"], ) { if (!group || !config) { @@ -2482,7 +2514,7 @@ function resolveLayerExportKind(rawLayerType?: string, errorContext?: IErrorCont function appendLayerBucketsForKind( layerMap: YAMLMap, - groups: BucketGroup[], + groups: YamlBucketGroup[], kind: LayerExportKind, errorContext?: IErrorContext, ) { diff --git a/libs/sdk-code-convertors/src/index.ts b/libs/sdk-code-convertors/src/index.ts index a5154a77a4a..f17e293608c 100644 --- a/libs/sdk-code-convertors/src/index.ts +++ b/libs/sdk-code-convertors/src/index.ts @@ -46,6 +46,7 @@ export { yamlReportToDeclarative, yamlReportTotalToDeclarative, yamlSortsToDeclarative, + type VisualisationDefinition, } from "./to/yamlVisualisationToDeclarative.js"; export { yamlDashboardToDeclarative, @@ -54,6 +55,11 @@ export { yamlPluginsToDeclarative, yamlWidgetItemToDeclarative, yamlWidgetToDeclarative, + type DashboardDefinition, + type DashboardSection, + type DashboardWidget, + type EmptyValueHandling, + type FilterContextDefinition, } from "./to/yamlDashboardToDeclarative.js"; export { yamlPluginToDeclarative } from "./to/yamlPluginToDeclarative.js"; export { yamlAttributeHierarchyToDeclarative } from "./to/yamlAttributeHierarchyToDeclarative.js"; @@ -83,6 +89,14 @@ export { declarativeRelativeDateFilterToYaml, declarativeSortsToYaml, declarativeTotalToYaml, + type YamlSorts, + type YamlPostProcessors, + type YamlBuckets, + type YamlBucketGroup, + type YamlBucketGroupItems, + type YamlFieldData, + type YamlFilterMapEntry, + type YamlFilters, } from "./from/declarativeVisualisationToYaml.js"; export { declarativeDashboardToYaml, @@ -115,28 +129,185 @@ export { } from "./conts.js"; // Configs -export { table } from "./configs/table.js"; -export { barChart } from "./configs/barChart.js"; -export { columnChart } from "./configs/columnChart.js"; -export { lineChart } from "./configs/lineChart.js"; -export { areaChart } from "./configs/areaChart.js"; -export { scatterChart } from "./configs/scatterChart.js"; -export { bubbleChart } from "./configs/bubbleChart.js"; -export { pieChart } from "./configs/pieChart.js"; -export { donutChart } from "./configs/donutChart.js"; -export { treemapChart } from "./configs/treemapChart.js"; -export { pyramidChart } from "./configs/pyramidChart.js"; -export { funnelChart } from "./configs/funnelChart.js"; -export { heatmapChart } from "./configs/heatmapChart.js"; -export { bulletChart } from "./configs/bulletChart.js"; -export { waterfallChart } from "./configs/waterfallChart.js"; -export { dependencyWheelChart } from "./configs/dependencyWheelChart.js"; -export { sankeyChart } from "./configs/sankeyChart.js"; -export { headlineChart } from "./configs/headlineChart.js"; -export { comboChart } from "./configs/comboChart.js"; -export { geoChart } from "./configs/geoChart.js"; -export { geoAreaChart } from "./configs/geoAreaChart.js"; -export { repeaterChart, type InlineVisualizations } from "./configs/repeaterChart.js"; +export { + table, + tableLoad, + tableSave, + TABLE_DEFAULTS, + type ITableConfig, + type TableConfigProperties, +} from "./configs/table.js"; +export { + barChart, + barChartLoad, + barChartSave, + BAR_CHART_DEFAULTS, + type IBarChartConfig, + type BarChartConfigProperties, +} from "./configs/barChart.js"; +export { + columnChart, + columnChartLoad, + columnChartSave, + COLUMN_CHART_DEFAULTS, + type IColumnChartConfig, + type ColumnChartConfigProperties, +} from "./configs/columnChart.js"; +export { + lineChart, + lineChartLoad, + lineChartSave, + LINE_CHART_DEFAULTS, + type ILineChartConfig, + type LineChartConfigProperties, +} from "./configs/lineChart.js"; +export { + areaChart, + areaChartLoad, + areaChartSave, + AREA_CHART_DEFAULTS, + type IAreaChartConfig, + type AreaChartConfigProperties, +} from "./configs/areaChart.js"; + +export { + scatterChart, + scatterChartLoad, + scatterChartSave, + SCATTER_CHART_DEFAULTS, + type IScatterChartConfig, + type ScatterChartConfigProperties, +} from "./configs/scatterChart.js"; +export { + bubbleChart, + bubbleChartLoad, + bubbleChartSave, + BUBBLE_CHART_DEFAULTS, + type IBubbleChartConfig, + type BubbleChartConfigProperties, +} from "./configs/bubbleChart.js"; +export { + pieChart, + pieChartLoad, + pieChartSave, + PIE_CHART_DEFAULTS, + type IPieChartConfig, + type PieChartConfigProperties, +} from "./configs/pieChart.js"; +export { + donutChart, + donutChartLoad, + donutChartSave, + DONUT_CHART_DEFAULTS, + type IDonutChartConfig, + type DonutChartConfigProperties, +} from "./configs/donutChart.js"; +export { + treemapChart, + treemapChartLoad, + treemapChartSave, + TREEMAP_CHART_DEFAULTS, + type ITreemapChartConfig, + type TreemapChartConfigProperties, +} from "./configs/treemapChart.js"; +export { + pyramidChart, + pyramidChartLoad, + pyramidChartSave, + PYRAMID_CHART_DEFAULTS, + type IPyramidChartConfig, + type PyramidChartConfigProperties, +} from "./configs/pyramidChart.js"; +export { + funnelChart, + funnelChartLoad, + funnelChartSave, + FUNNEL_CHART_DEFAULTS, + type IFunnelChartConfig, + type FunnelChartConfigProperties, +} from "./configs/funnelChart.js"; +export { + heatmapChart, + heatmapChartLoad, + heatmapChartSave, + HEATMAP_CHART_DEFAULTS, + type IHeatmapChartConfig, + type HeatmapChartConfigProperties, +} from "./configs/heatmapChart.js"; +export { + bulletChart, + bulletChartLoad, + bulletChartSave, + BULLET_CHART_DEFAULTS, + type IBulletChartConfig, + type BulletChartConfigProperties, +} from "./configs/bulletChart.js"; +export { + waterfallChart, + waterfallChartLoad, + waterfallChartSave, + WATERFALL_CHART_DEFAULTS, + type IWaterfallChartConfig, + type WaterfallChartConfigProperties, +} from "./configs/waterfallChart.js"; +export { + dependencyWheelChart, + dependencyWheelChartLoad, + dependencyWheelChartSave, + DEPENDENCY_WHEEL_CHART_DEFAULTS, + type IDependencyWheelChartConfig, + type DependencyWheelChartConfigProperties, +} from "./configs/dependencyWheelChart.js"; +export { + sankeyChart, + sankeyChartLoad, + sankeyChartSave, + SANKEY_CHART_DEFAULTS, + type ISankeyChartConfig, + type SankeyChartConfigProperties, +} from "./configs/sankeyChart.js"; +export { + headlineChart, + headlineChartLoad, + headlineChartSave, + HEADLINE_CHART_DEFAULTS, + type IHeadlineChartConfig, + type HeadlineChartConfigProperties, +} from "./configs/headlineChart.js"; +export { + comboChart, + comboChartLoad, + comboChartSave, + COMBO_CHART_DEFAULTS, + type IComboChartConfig, + type ComboChartConfigProperties, +} from "./configs/comboChart.js"; +export { + geoChart, + geoChartLoad, + geoChartSave, + GEO_CHART_DEFAULTS, + type IGeoChartConfig, + type GeoChartConfigProperties, +} from "./configs/geoChart.js"; +export { + geoAreaChart, + geoAreaChartLoad, + geoAreaChartSave, + GEO_AREA_CHART_DEFAULTS, + type IGeoAreaChartConfig, + type GeoAreaChartConfigProperties, +} from "./configs/geoAreaChart.js"; +export { + repeaterChart, + repeaterChartLoad, + repeaterChartSave, + REPEATER_CHART_DEFAULTS, + saveInlineVisualizations, + type IRepeaterChartConfig, + type RepeaterChartConfigProperties, + type InlineVisualizations, +} from "./configs/repeaterChart.js"; export type { IChartFill as ChartFill, ChartFillType, @@ -167,11 +338,16 @@ export type { PatternFillName, PointShapeSymbol, } from "./configs/types.js"; -export { getValueOrDefault, type VisualisationConfig, type ValueType } from "./configs/utils.js"; +export { + getValueOrDefault, + type ConfigDefaults, + type VisualisationConfig, + type ValueType, +} from "./configs/utils.js"; // Utils needed by orchestrators export { generateFileName, resolveIdFromFileName, type FileNamesUsed } from "./utils/nameUtils.js"; -export { assertUnreachable, type FilePath } from "./utils/sharedUtils.js"; +export { assertUnreachable, type FilePath, type FullFields } from "./utils/sharedUtils.js"; export { convertBucketToTitle } from "./utils/convertBucketToTitle.js"; export { createIdentifier, getIdentifier } from "./utils/yamlUtils.js"; export { diff --git a/libs/sdk-code-convertors/src/to/yamlDashboardToDeclarative.ts b/libs/sdk-code-convertors/src/to/yamlDashboardToDeclarative.ts index 4a3b0d58880..d00b4e012aa 100644 --- a/libs/sdk-code-convertors/src/to/yamlDashboardToDeclarative.ts +++ b/libs/sdk-code-convertors/src/to/yamlDashboardToDeclarative.ts @@ -90,7 +90,8 @@ import { } from "../utils/typeGuards.js"; import { createIdentifier, createLocalIdentifier } from "../utils/yamlUtils.js"; -type DashboardDefinition = Pick< +/** @internal */ +export type DashboardDefinition = Pick< OverrideDashboardDefinition, | "layout" | "plugins" @@ -108,12 +109,17 @@ type DashboardDefinition = Pick< > & { version: string; }; -type FilterContextDefinition = Pick & { + +/** @internal */ +export type FilterContextDefinition = Pick & { version: string; }; -type DashboardSection = Required["layout"]["sections"][number]; -type DashboardWidget = DashboardSection["items"][number]; -type EmptyValueHandling = NonNullable; +/** @internal */ +export type DashboardSection = Required["layout"]["sections"][number]; +/** @internal */ +export type DashboardWidget = DashboardSection["items"][number]; +/** @internal */ +export type EmptyValueHandling = NonNullable; function extractDashboardEmptyValueHandling(filter: unknown): EmptyValueHandling | undefined { const value = (filter as { empty_values?: unknown }).empty_values; @@ -349,6 +355,7 @@ function yamlSectionToDeclarative( }; } +/** @internal */ export function yamlWidgetItemToDeclarative( entities: ExportEntities, input: Widget, @@ -420,6 +427,7 @@ function yamlInsightWidgetToDeclarative( }; } +/** @internal */ export function yamlWidgetToDeclarative( entities: ExportEntities, input: VisualisationWidget | RichTextWidget | VisualizationSwitcherWidget | ContainerWidget, @@ -554,6 +562,7 @@ function yamlWidgetPropertiesToDeclarative(input: VisualisationWidget): any { return {}; } +/** @internal */ export function yamlInteractionToDeclarative( entities: ExportEntities, visualisation: string, @@ -800,6 +809,7 @@ function yamlIgnoredFilterToDeclarative(input: string): IDashboardFilterReferenc return null; } +/** @internal */ export function yamlPluginsToDeclarative(plugins: Dashboard["plugins"]) { return plugins?.map((plugin) => yamlPluginToDeclarative(plugin)); } @@ -870,6 +880,7 @@ function flattenFilters( return result; } +/** @internal */ export function yamlFilterContextToDeclarative( baseId: string, yamlFilters: DashboardFilters | undefined, diff --git a/libs/sdk-code-convertors/src/to/yamlDatasetToDeclarative.ts b/libs/sdk-code-convertors/src/to/yamlDatasetToDeclarative.ts index 5f02c0f9045..834c0efe65b 100644 --- a/libs/sdk-code-convertors/src/to/yamlDatasetToDeclarative.ts +++ b/libs/sdk-code-convertors/src/to/yamlDatasetToDeclarative.ts @@ -181,6 +181,7 @@ export function buildGrain(entities: ExportEntities, primaryKey?: string | strin /** * Build declarative references */ +/** @internal */ export function buildReferences( entities: ExportEntities, refs: Dataset["references"] = [], @@ -262,6 +263,7 @@ export function buildWorkspaceDataFilterReferences( /** * Build declarative facts out of AaC fields */ +/** @internal */ export function buildFacts(fields?: Fields): DeclarativeFact[] { if (!fields) { return []; @@ -364,6 +366,7 @@ export function buildAggregatedFacts( /** * Build declarative attributes out of AaC fields */ +/** @internal */ export function buildAttributes(fields?: Fields, isAuxiliaryDataset = false): DeclarativeAttribute[] { if (!fields) { return []; @@ -432,6 +435,7 @@ export function buildAttributes(fields?: Fields, isAuxiliaryDataset = false): De /** * Build declarative attribute labels out of AaC labels */ +/** @internal */ export function buildAttributeLabels( labels?: Attribute["labels"], isAuxiliaryDataset = false, diff --git a/libs/sdk-code-convertors/src/to/yamlVisualisationToDeclarative.ts b/libs/sdk-code-convertors/src/to/yamlVisualisationToDeclarative.ts index ca7071da45e..2bba5ee373d 100644 --- a/libs/sdk-code-convertors/src/to/yamlVisualisationToDeclarative.ts +++ b/libs/sdk-code-convertors/src/to/yamlVisualisationToDeclarative.ts @@ -101,7 +101,8 @@ import { } from "../utils/typeGuards.js"; import { createIdentifier, createLocalIdentifier } from "../utils/yamlUtils.js"; -type VisualisationDefinition = Pick< +/** @internal */ +export type VisualisationDefinition = Pick< IInsight["insight"], "visualizationUrl" | "properties" | "filters" | "buckets" | "sorts" | "attributeFilterConfigs" > & { @@ -305,6 +306,7 @@ function yamlConfigToDeclarative( //REPORT +/** @internal */ export function yamlReportToDeclarative( entities: ExportEntities, input: Visualisation, @@ -595,6 +597,7 @@ function resolveField(localName: string, field?: Field) { //SORTS +/** @internal */ export function yamlSortsToDeclarative( sort_by: Sorts | undefined, fields: Visualisation["query"]["fields"], @@ -1120,6 +1123,7 @@ function mergeDeclarativeResults(...results: YamlFilterToDeclarativeResult[]): Y }; } +/** @internal */ export function yamlFiltersToDeclarative( entities: ExportEntities, filters_by: QueryFilters | Filter[] | undefined, @@ -1150,6 +1154,7 @@ export function yamlFiltersToDeclarative( //TOTALS +/** @internal */ export function yamlReportTotalToDeclarative(totals: Total[] = [], attributeIdentifier: string): ITotal[] { return totals.map((total) => { return { @@ -1163,6 +1168,7 @@ export function yamlReportTotalToDeclarative(totals: Total[] = [], attributeIden //BUCKETS +/** @internal */ export function yamlBucketsToDeclarative( entities: ExportEntities, input: Visualisation, diff --git a/libs/sdk-code-convertors/src/utils/sharedUtils.ts b/libs/sdk-code-convertors/src/utils/sharedUtils.ts index f23349f4a63..35e5b64c4eb 100644 --- a/libs/sdk-code-convertors/src/utils/sharedUtils.ts +++ b/libs/sdk-code-convertors/src/utils/sharedUtils.ts @@ -75,6 +75,7 @@ export function convertIdOrTitleToId(id: string, title?: string | null): string return id; } +/** @public */ export type FullFields = | AttributeField | MetricField diff --git a/libs/sdk-code-schemas/package.json b/libs/sdk-code-schemas/package.json index 482f0b0f303..59680ef6dc9 100644 --- a/libs/sdk-code-schemas/package.json +++ b/libs/sdk-code-schemas/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-code-schemas", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData AAC JSON Schema types and compiled schemas", "license": "MIT", "author": "GoodData", @@ -36,7 +36,7 @@ "build": "npm-run-all -p build-check build-ts && npm run api-extractor", "build-check": "tsgo", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf esm coverage *.log tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf esm coverage temp *.log tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", diff --git a/libs/sdk-e2e-utils/package.json b/libs/sdk-e2e-utils/package.json index e310a64382d..d3f578049f7 100644 --- a/libs/sdk-e2e-utils/package.json +++ b/libs/sdk-e2e-utils/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-e2e-utils", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData utility functions for Playwright E2E tests", "license": "MIT", "author": "GoodData", @@ -29,7 +29,7 @@ "build": "npm-run-all -p build-check build-ts && npm run api-extractor", "build-check": "tsgo", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf esm api temp", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf esm temp", "format-check": "oxfmt --check .", "format-write": "oxfmt .", "lint": "oxlint . --type-aware --quiet && eslint .", diff --git a/libs/sdk-embedding/package.json b/libs/sdk-embedding/package.json index ed75c3fda9c..fe88ba64a5d 100644 --- a/libs/sdk-embedding/package.json +++ b/libs/sdk-embedding/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-embedding", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData Embedding APIs", "license": "MIT", "author": "GoodData", @@ -33,7 +33,7 @@ "build": "npm-run-all -p build-check build-ts && npm run api-extractor", "build-check": "tsgo", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage *.log tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage temp *.log tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", diff --git a/libs/sdk-model/api/sdk-model.api.md b/libs/sdk-model/api/sdk-model.api.md index ca7ed9eeca1..56b389342cb 100644 --- a/libs/sdk-model/api/sdk-model.api.md +++ b/libs/sdk-model/api/sdk-model.api.md @@ -2011,6 +2011,7 @@ export interface IDashboardTab { layout?: IDashboardLayout; localIdentifier: string; measureValueFilterConfigs?: IDashboardMeasureValueFilterConfig[]; + parameters?: IDashboardParameter[]; title: string; } @@ -5744,9 +5745,20 @@ export interface IUserGroupDataFilterDefinition extends IUserDataFilterDefinitio // @alpha export type IUserGroupWorkspaceAccessGrantee = IWorkspaceAccess & IGranularUserGroupAccessGrantee; +// @public +export interface IUserSettings extends ISettings { + locale: string; + separators: ISeparators; + userId: string; +} + // @alpha export type IUserWorkspaceAccessGrantee = IWorkspaceAccess & IGranularUserAccessGrantee; +// @public +export interface IUserWorkspaceSettings extends IUserSettings, IWorkspaceSettings { +} + // @public export interface IVariableMetadataObject extends IMetadataObject { // (undocumented) @@ -5958,6 +5970,13 @@ export type IWorkspacePermissions = { [permission in WorkspacePermission]: boolean; }; +// @public +export interface IWorkspaceSettings extends ISettings { + agGridToken?: string; + mapboxToken?: string; + workspace: string; +} + // @public export interface IWorkspaceUser { email: string; diff --git a/libs/sdk-model/package.json b/libs/sdk-model/package.json index dd4b712eaaf..bb542b87ee4 100644 --- a/libs/sdk-model/package.json +++ b/libs/sdk-model/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-model", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData Model definitions used by UI components and Backend SPI", "license": "MIT", "author": "GoodData", @@ -32,7 +32,7 @@ "build": "npm-run-all -p build-check build-ts && npm run api-extractor", "build-check": "tsgo", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage *.log tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage temp *.log tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", diff --git a/libs/sdk-model/src/dashboard/dashboard.ts b/libs/sdk-model/src/dashboard/dashboard.ts index f44d3243391..cf50ce99221 100644 --- a/libs/sdk-model/src/dashboard/dashboard.ts +++ b/libs/sdk-model/src/dashboard/dashboard.ts @@ -286,6 +286,16 @@ export interface IDashboardTab { * If not defined, filters are displayed ungrouped as defined in single context. */ filterGroupsConfig?: IDashboardFilterGroupsConfig; + + /** + * Tab-scoped parameter overrides. Each entry references a workspace parameter and optionally + * pins a dashboard-scope value, label, and mode. A parameter affects only the widgets on the + * tab where it is configured; the same ref may be added independently to multiple tabs with + * independent values, labels, and modes. + * + * @alpha + */ + parameters?: IDashboardParameter[]; } /** @@ -486,9 +496,9 @@ export interface IDashboard readonly measureValueFilterConfigs?: IDashboardMeasureValueFilterConfig[]; /** - * Dashboard-level parameter overrides. Each entry references a workspace parameter and - * optionally pins a dashboard-scope value, label, and mode. See {@link IDashboardParameter} - * for smart-persistence rules. + * Legacy dashboard-level parameters. Preserved as a read-only fallback for legacy metadata; + * saves emit parameters per tab on {@link IDashboardTab.parameters} instead. Honored on load + * only when no tab carries parameters. * * @alpha */ @@ -584,7 +594,9 @@ export interface IDashboardDefinition readonly measureValueFilterConfigs?: IDashboardMeasureValueFilterConfig[]; /** - * Dashboard-level parameter overrides. See {@link IDashboardParameter}. + * Legacy dashboard-level parameters. Preserved as a read-only fallback for legacy metadata; + * saves emit parameters per tab on {@link IDashboardTab.parameters} instead. Honored on load + * only when no tab carries parameters. * * @alpha */ diff --git a/libs/sdk-model/src/index.ts b/libs/sdk-model/src/index.ts index 71f063cbb33..d6d4a4e9483 100644 --- a/libs/sdk-model/src/index.ts +++ b/libs/sdk-model/src/index.ts @@ -976,7 +976,12 @@ export { isDashboardParameter, } from "./dashboard/parameter.js"; -export { type ISettings } from "./settings/index.js"; +export { + type ISettings, + type IUserSettings, + type IWorkspaceSettings, + type IUserWorkspaceSettings, +} from "./settings/index.js"; export { type ISeparators, diff --git a/libs/sdk-model/src/settings/index.ts b/libs/sdk-model/src/settings/index.ts index 976aa615f0d..50a4dedc715 100644 --- a/libs/sdk-model/src/settings/index.ts +++ b/libs/sdk-model/src/settings/index.ts @@ -2,7 +2,7 @@ import { type RemotePluggableApplicationsRegistry } from "../pluggableApplication/index.js"; -import { type IFeatureFlags, type IPermanentSettings } from "./settings.js"; +import { type IFeatureFlags, type IPermanentSettings, type ISeparators } from "./settings.js"; /** * Settings are obtained from the backend and are effectively a collection of feature flags or settings with @@ -27,3 +27,54 @@ export interface ISettings extends IPermanentSettings, IFeatureFlags { [key: string]: number | boolean | string | object | undefined | null; } + +/** + * Settings for a particular user. + * + * @public + */ +export interface IUserSettings extends ISettings { + /** + * User to which the settings belong. + */ + userId: string; + + /** + * User locale + */ + locale: string; + + /** + * Regional number formatting + */ + separators: ISeparators; +} + +/** + * Settings for a particular workspace. + * + * @public + */ +export interface IWorkspaceSettings extends ISettings { + /** + * Workspace to which the settings belong. + */ + workspace: string; + + /** + * Stores Mapbox token used for WS + */ + mapboxToken?: string; + + /** + * Stores AgGrid token used for WS + */ + agGridToken?: string; +} + +/** + * Settings for a particular combination of user and workspace. + * + * @public + */ +export interface IUserWorkspaceSettings extends IUserSettings, IWorkspaceSettings {} diff --git a/libs/sdk-pluggable-application-model/api/sdk-pluggable-application-model.api.md b/libs/sdk-pluggable-application-model/api/sdk-pluggable-application-model.api.md index cbe5b23e17b..1e5e1b66df4 100644 --- a/libs/sdk-pluggable-application-model/api/sdk-pluggable-application-model.api.md +++ b/libs/sdk-pluggable-application-model/api/sdk-pluggable-application-model.api.md @@ -9,7 +9,7 @@ import { IEntitlementDescriptor } from '@gooddata/sdk-model'; import { ILocale } from '@gooddata/sdk-model'; import { ITheme } from '@gooddata/sdk-model'; import { IUser } from '@gooddata/sdk-model'; -import { IUserSettings } from '@gooddata/sdk-backend-spi'; +import { IUserSettings } from '@gooddata/sdk-model'; import { IWhiteLabeling } from '@gooddata/sdk-model'; import { IWorkspacePermissions } from '@gooddata/sdk-model'; import { ObjRef } from '@gooddata/sdk-model'; diff --git a/libs/sdk-pluggable-application-model/package.json b/libs/sdk-pluggable-application-model/package.json index 3365cc78838..4fc651bcc91 100644 --- a/libs/sdk-pluggable-application-model/package.json +++ b/libs/sdk-pluggable-application-model/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-pluggable-application-model", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData SDK model contracts for pluggable applications", "license": "MIT", "author": "GoodData Corporation", @@ -28,7 +28,7 @@ "build": "npm-run-all -p build-check build-ts && npm run api-extractor", "build-check": "tsgo", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage *.log tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage temp *.log tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", @@ -40,7 +40,6 @@ "validate-esm": "node --input-type=module --eval 'import \"@gooddata/sdk-pluggable-application-model\"'" }, "dependencies": { - "@gooddata/sdk-backend-spi": "workspace:*", "@gooddata/sdk-model": "workspace:*", "ts-invariant": "0.10.3", "tslib": "2.8.1" diff --git a/libs/sdk-pluggable-application-model/src/platformContext.ts b/libs/sdk-pluggable-application-model/src/platformContext.ts index d802236adcf..98281fb1402 100644 --- a/libs/sdk-pluggable-application-model/src/platformContext.ts +++ b/libs/sdk-pluggable-application-model/src/platformContext.ts @@ -1,12 +1,12 @@ // (C) 2026 GoodData Corporation -import { type IUserSettings } from "@gooddata/sdk-backend-spi"; import { type ApplicationScope, type IEntitlementDescriptor, type ILocale, type ITheme, type IUser, + type IUserSettings, type IWhiteLabeling, type IWorkspacePermissions, type ObjRef, diff --git a/libs/sdk-ui-all/package.json b/libs/sdk-ui-all/package.json index cd7ef3bec01..22cc32913cf 100644 --- a/libs/sdk-ui-all/package.json +++ b/libs/sdk-ui-all/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-ui-all", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData SDK - All-In-One", "license": "LicenseRef-LICENSE", "author": "GoodData", @@ -29,7 +29,7 @@ "build": "npm-run-all -p build-check build-ts && npm run api-extractor", "build-check": "tsgo", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage *.log tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage temp *.log tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", diff --git a/libs/sdk-ui-catalog/package.json b/libs/sdk-ui-catalog/package.json index 6f83aa6fc4a..8942a5aadef 100644 --- a/libs/sdk-ui-catalog/package.json +++ b/libs/sdk-ui-catalog/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-ui-catalog", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData SDK - Analytics Catalog", "license": "MIT", "author": "GoodData Corporation", @@ -38,7 +38,7 @@ "build-check": "tsgo", "build-dynamic-files": "bash scripts/build.sh --genFilesOnly", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage *.log styles/css tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage temp *.log styles/css tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", diff --git a/libs/sdk-ui-charts/package.json b/libs/sdk-ui-charts/package.json index aa57aebed6f..46501306361 100644 --- a/libs/sdk-ui-charts/package.json +++ b/libs/sdk-ui-charts/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-ui-charts", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData.UI SDK - Charts", "license": "LicenseRef-LICENSE", "author": "GoodData Corporation", @@ -57,7 +57,7 @@ "build": "bash scripts/build.sh", "build-check": "tsgo", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage styles/css *.log tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage temp styles/css *.log tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", diff --git a/libs/sdk-ui-dashboard/api/sdk-ui-dashboard.api.md b/libs/sdk-ui-dashboard/api/sdk-ui-dashboard.api.md index 4933804a084..a6104d0b235 100644 --- a/libs/sdk-ui-dashboard/api/sdk-ui-dashboard.api.md +++ b/libs/sdk-ui-dashboard/api/sdk-ui-dashboard.api.md @@ -1289,7 +1289,6 @@ export type DashboardState = { automations: IAutomationsState; users: IUsersState; notificationChannels: INotificationChannelsState; - parameters: IParametersState; dashboardSummaryWorkflow: DashboardSummaryWorkflowState; renderMode: IRenderModeState; ui: IUiState; @@ -8590,6 +8589,8 @@ export interface ITabState { // (undocumented) measureValueFilterConfigs?: IMeasureValueFilterConfigsState; // (undocumented) + parameters?: IParametersState; + // (undocumented) title?: string; } @@ -9706,14 +9707,6 @@ export type ParameterDraggableItem = { ref: ObjRef; }; -// @internal (undocumented) -export const parametersActions: { - addParameter: ActionCreatorWithPayload; - setParameterRuntimeValue: ActionCreatorWithPayload; - removeParameter: ActionCreatorWithPayload; - setParameterEntries: ActionCreatorWithPayload; -}; - // @beta (undocumented) export type PdfConfiguration = { pageSize?: "A3" | "A4" | "LETTER"; @@ -12477,6 +12470,18 @@ readonly removeMeasureValueFilterConfig: (state: WritableDraft, acti payload: string; type: string; }) => void | ITabsState | WritableDraft; +readonly addParameter: (state: WritableDraft, action: { +payload: IAddParameterPayload; +type: string; +}) => void | ITabsState | WritableDraft; +readonly setParameterRuntimeValue: (state: WritableDraft, action: { +payload: ISetParameterRuntimeValuePayload; +type: string; +}) => void | ITabsState | WritableDraft; +readonly removeParameter: (state: WritableDraft, action: { +payload: IRemoveParameterPayload; +type: string; +}) => void | ITabsState | WritableDraft; }, "tabs">; // @alpha (undocumented) diff --git a/libs/sdk-ui-dashboard/package.json b/libs/sdk-ui-dashboard/package.json index c73f91eacf8..f7df07b62b7 100644 --- a/libs/sdk-ui-dashboard/package.json +++ b/libs/sdk-ui-dashboard/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-ui-dashboard", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData SDK - Dashboard Component", "license": "LicenseRef-LICENSE", "author": "GoodData Corporation", @@ -42,7 +42,7 @@ "build-check": "tsgo", "build-dynamic-files": "bash scripts/build.sh --genFilesOnly", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage *.log styles/css tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage temp *.log styles/css tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", diff --git a/libs/sdk-ui-dashboard/src/index.ts b/libs/sdk-ui-dashboard/src/index.ts index 20b0dbe4c6b..86c90b57a73 100644 --- a/libs/sdk-ui-dashboard/src/index.ts +++ b/libs/sdk-ui-dashboard/src/index.ts @@ -1645,20 +1645,22 @@ export type { SetCatalogMeasuresAndFactsPayload, SetCatalogItemsPayload, } from "./model/store/catalog/catalogReducers.js"; -export { parametersActions } from "./model/store/parameters/index.js"; export type { IAddParameterPayload, IRemoveParameterPayload, ISetParameterRuntimeValuePayload, -} from "./model/store/parameters/parametersReducers.js"; -export type { IDashboardParameterEntry, IParametersState } from "./model/store/parameters/parametersState.js"; +} from "./model/store/tabs/parameters/parametersReducers.js"; +export type { + IDashboardParameterEntry, + IParametersState, +} from "./model/store/tabs/parameters/parametersState.js"; export { selectDashboardParameterEntries, selectDashboardParameters, selectEffectiveParameterValuesForWidget, selectIsParametersChanged, selectParameterRuntimeOverrideByRef, -} from "./model/store/parameters/parametersSelectors.js"; +} from "./model/store/tabs/parameters/parametersSelectors.js"; export { drillActions } from "./model/store/drill/index.js"; export { selectDrillableItems, diff --git a/libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/common/parameterHydration.ts b/libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/common/parameterHydration.ts index 2b164c8f45a..638fca2b464 100644 --- a/libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/common/parameterHydration.ts +++ b/libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/common/parameterHydration.ts @@ -2,12 +2,17 @@ import { type IDashboardParameter, + type IDashboardTab, type IParameterMetadataObject, isNumberParameterDefinition, objRefToString, } from "@gooddata/sdk-model"; -import { type IDashboardParameterEntry } from "../../../store/parameters/parametersState.js"; +import { + type IDashboardParameterEntry, + pickTabParametersSource, +} from "../../../store/tabs/parameters/parametersState.js"; +import { DEFAULT_TAB_ID } from "../../../store/tabs/tabsState.js"; /** * Builds the parameter slice entries from the dashboard's persisted parameters and the @@ -40,3 +45,27 @@ export function hydrateParameterEntries( return { parameter, runtimeOverride: workspaceDefault }; }); } + +/** + * Distributes the dashboard's persisted parameters into per-tab hydrated entry lists, applying + * the V1 → per-tab migration rule (see {@link pickTabParametersSource}). Each tab's parameter + * list is hydrated against the workspace catalog via {@link hydrateParameterEntries}. + * + * For legacy single-tab dashboards (no `tabs[]`), a synthetic tab with `DEFAULT_TAB_ID` is used + * so the V1 root-level `parameters` migrate transparently. + */ +export function distributeParametersToTabs( + tabs: IDashboardTab[] | undefined, + rootParameters: IDashboardParameter[] | undefined, + workspaceParameters: IParameterMetadataObject[], +): Record { + const effectiveTabs: IDashboardTab[] = tabs ?? [ + { localIdentifier: DEFAULT_TAB_ID, title: "", parameters: rootParameters }, + ]; + const result: Record = {}; + for (const tab of effectiveTabs) { + const source = pickTabParametersSource(tab, effectiveTabs, rootParameters); + result[tab.localIdentifier] = hydrateParameterEntries(source, workspaceParameters); + } + return result; +} diff --git a/libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/common/stateInitializers.ts b/libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/common/stateInitializers.ts index f94224a57e8..9381df9b6a4 100644 --- a/libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/common/stateInitializers.ts +++ b/libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/common/stateInitializers.ts @@ -52,7 +52,6 @@ import { drillActions } from "../../../store/drill/index.js"; import { insightsActions } from "../../../store/insights/index.js"; import { metaActions } from "../../../store/meta/index.js"; import { selectIsNewDashboard } from "../../../store/meta/metaSelectors.js"; -import { parametersActions } from "../../../store/parameters/index.js"; import { type FilterContextState, filterContextInitialState, @@ -73,7 +72,7 @@ import { resolveFilterDisplayForms } from "../../../utils/filterResolver.js"; import { EmptyDashboardLayout, dashboardInitialize } from "./dashboardInitialize.js"; import { loadAvailableDisplayFormRefs } from "./loadAvailableDisplayFormRefs.js"; import { mergedMigratedAttributeFilters } from "./migratedAttributeFilters.js"; -import { hydrateParameterEntries } from "./parameterHydration.js"; +import { distributeParametersToTabs } from "./parameterHydration.js"; /** * Processes a single tab's filterContext and returns initialized FilterContextState. @@ -262,86 +261,49 @@ export function* actionsToInitializeNewDashboard( dateFilterConfigs: [], attributeFilterConfigs: [], layout: dashboardLayout ?? EmptyDashboardLayout, + parameters: dashboard?.parameters, }, ]; + const parametersByTab = distributeParametersToTabs(tabs, dashboard?.parameters, workspaceParameters); // Prepare tabs action with complete filterContext for each tab - const tabsAction = tabs - ? [ - tabsActions.setTabs({ - tabs: tabs.map((tab: IDashboardTab) => ({ - title: tab.title, - localIdentifier: tab.localIdentifier, - filterContext: { - ...filterContextInitialState, - filterContextDefinition, - originalFilterContextDefinition, - filterContextIdentity, - attributeFilterDisplayForms, - }, - dateFilterConfig: { - dateFilterConfig: tab.dateFilterConfig, - effectiveDateFilterConfig: dateFilterConfig, - isUsingDashboardOverrides: false, - dateFilterConfigValidationWarnings: undefined, - }, - dateFilterConfigs: { - dateFilterConfigs: tab.dateFilterConfigs ?? [], - }, - attributeFilterConfigs: { - attributeFilterConfigs: tab.attributeFilterConfigs ?? [], - }, - measureValueFilterConfigs: { - measureValueFilterConfigs: tab.measureValueFilterConfigs ?? [], - }, - layout: { - ...layoutInitialState, - layout: tab.layout ?? dashboardLayout ?? EmptyDashboardLayout, - }, - filterGroupsConfig: tab.filterGroupsConfig, - })), - activeTabLocalIdentifier: - initialTabId ?? dashboard?.activeTabLocalIdentifier ?? DEFAULT_TAB_ID, - }), - ] - : [ - // For dashboards without tabs, create a single default tab - tabsActions.setTabs({ - tabs: [ - { - localIdentifier: DEFAULT_TAB_ID, - title: "", - filterContext: { - ...filterContextInitialState, - filterContextDefinition, - originalFilterContextDefinition, - filterContextIdentity, - attributeFilterDisplayForms, - }, - layout: { - ...layoutInitialState, - layout: dashboardLayout ?? EmptyDashboardLayout, - }, - dateFilterConfig: { - dateFilterConfig: dashboard?.dateFilterConfig, - effectiveDateFilterConfig: dateFilterConfig, - isUsingDashboardOverrides: false, - dateFilterConfigValidationWarnings: undefined, - }, - dateFilterConfigs: { - dateFilterConfigs: dashboard?.dateFilterConfigs ?? [], - }, - attributeFilterConfigs: { - attributeFilterConfigs: dashboard?.attributeFilterConfigs ?? [], - }, - measureValueFilterConfigs: { - measureValueFilterConfigs: dashboard?.measureValueFilterConfigs ?? [], - }, - }, - ], - activeTabLocalIdentifier: DEFAULT_TAB_ID, - }), - ]; + const tabsAction = [ + tabsActions.setTabs({ + tabs: tabs.map((tab: IDashboardTab) => ({ + title: tab.title, + localIdentifier: tab.localIdentifier, + filterContext: { + ...filterContextInitialState, + filterContextDefinition, + originalFilterContextDefinition, + filterContextIdentity, + attributeFilterDisplayForms, + }, + dateFilterConfig: { + dateFilterConfig: tab.dateFilterConfig, + effectiveDateFilterConfig: dateFilterConfig, + isUsingDashboardOverrides: false, + dateFilterConfigValidationWarnings: undefined, + }, + dateFilterConfigs: { + dateFilterConfigs: tab.dateFilterConfigs ?? [], + }, + attributeFilterConfigs: { + attributeFilterConfigs: tab.attributeFilterConfigs ?? [], + }, + measureValueFilterConfigs: { + measureValueFilterConfigs: tab.measureValueFilterConfigs ?? [], + }, + layout: { + ...layoutInitialState, + layout: tab.layout ?? dashboardLayout ?? EmptyDashboardLayout, + }, + filterGroupsConfig: tab.filterGroupsConfig, + parameters: { parameters: parametersByTab[tab.localIdentifier] ?? [] }, + })), + activeTabLocalIdentifier: initialTabId ?? dashboard?.activeTabLocalIdentifier ?? DEFAULT_TAB_ID, + }), + ]; return { initActions: [ @@ -363,9 +325,6 @@ export function* actionsToInitializeNewDashboard( insightsActions.setInsights(insights), drillActions.resetCrossFiltering(), ]), - parametersActions.setParameterEntries( - hydrateParameterEntries(dashboard?.parameters, workspaceParameters), - ), ], dashboard: initialContent ? dashboard : undefined, insights: initialContent ? insights : [], @@ -684,6 +643,13 @@ export function* actionsToInitializeExistingDashboard( const screen: SagaReturnType = yield select(selectScreen); + const parameterSourceDashboard = persistedDashboard ?? dashboard; + const parametersByTab = distributeParametersToTabs( + parameterSourceDashboard.tabs, + parameterSourceDashboard.parameters, + workspaceParameters, + ); + // Process tabs with complete filterContext initialization for each tab let tabsAction = null; const validationResults: ValidationResult[] = []; @@ -753,6 +719,7 @@ export function* actionsToInitializeExistingDashboard( layout: tabLayout, screen, // Preserve only screen from current state }, + parameters: { parameters: parametersByTab[tab.localIdentifier] ?? [] }, }; processedTabs.push(tabState); @@ -826,6 +793,7 @@ export function* actionsToInitializeExistingDashboard( measureValueFilterConfigs: dashboard.measureValueFilterConfigs, } : undefined, + parameters: { parameters: parametersByTab[tabIdentifier] ?? [] }, }; tabsAction = tabsActions.setTabs({ @@ -846,9 +814,6 @@ export function* actionsToInitializeExistingDashboard( uiActions.setWidgetsOverlay(modifiedWidgets), validationResults.length > 0 ? uiActions.setIncompatibleDefaultFiltersOverrideMessage() : null, drillActions.resetCrossFiltering(), - parametersActions.setParameterEntries( - hydrateParameterEntries((persistedDashboard ?? dashboard).parameters, workspaceParameters), - ), ]); } diff --git a/libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/common/tests/parameterHydration.test.ts b/libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/common/tests/parameterHydration.test.ts new file mode 100644 index 00000000000..ab06cf477a2 --- /dev/null +++ b/libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/common/tests/parameterHydration.test.ts @@ -0,0 +1,96 @@ +// (C) 2026 GoodData Corporation + +import { describe, expect, it } from "vitest"; + +import { + type IDashboardParameter, + type IDashboardTab, + type IParameterMetadataObject, + idRef, +} from "@gooddata/sdk-model"; + +import { DEFAULT_TAB_ID } from "../../../../store/tabs/tabsState.js"; +import { distributeParametersToTabs } from "../parameterHydration.js"; + +const topNRef = idRef("topN", "parameter"); +const sampleRef = idRef("sampleSize", "parameter"); + +const topNParameter: IDashboardParameter = { + ref: topNRef, + parameterType: "NUMBER", + mode: "active", +}; + +const sampleParameter: IDashboardParameter = { + ref: sampleRef, + parameterType: "NUMBER", + mode: "active", +}; + +const topNWorkspace: IParameterMetadataObject = { + type: "parameter", + id: "topN", + uri: "/topN", + ref: topNRef, + title: "Top N", + description: "", + production: true, + deprecated: false, + unlisted: false, + definition: { type: "NUMBER", defaultValue: 10 }, +}; + +function tab(localIdentifier: string, parameters?: IDashboardParameter[]): IDashboardTab { + return { + localIdentifier, + title: "", + ...(parameters === undefined ? {} : { parameters }), + } as IDashboardTab; +} + +describe("distributeParametersToTabs (V1 → per-tab migration)", () => { + it("V1 root parameters, no tabs[] in source — synthesizes DEFAULT_TAB_ID and gets the root array", () => { + const distributed = distributeParametersToTabs(undefined, [topNParameter], [topNWorkspace]); + + expect(Object.keys(distributed)).toEqual([DEFAULT_TAB_ID]); + expect(distributed[DEFAULT_TAB_ID]).toEqual([{ parameter: topNParameter, runtimeOverride: 10 }]); + }); + + it("V1 root parameters + multi-tab tabs[] without per-tab parameters — root copies to every tab", () => { + // V1 → per-tab migration on load: when no tab has parameters set, root array seeds every tab. + const tabs: IDashboardTab[] = [tab("tab-A"), tab("tab-B"), tab("tab-C")]; + + const distributed = distributeParametersToTabs(tabs, [topNParameter], [topNWorkspace]); + + expect(distributed["tab-A"]).toEqual([{ parameter: topNParameter, runtimeOverride: 10 }]); + expect(distributed["tab-B"]).toEqual([{ parameter: topNParameter, runtimeOverride: 10 }]); + expect(distributed["tab-C"]).toEqual([{ parameter: topNParameter, runtimeOverride: 10 }]); + }); + + it("V2 dashboards with explicit per-tab parameters — root fallback ignored", () => { + const tabs: IDashboardTab[] = [tab("tab-A", [topNParameter]), tab("tab-B", [sampleParameter])]; + + const distributed = distributeParametersToTabs(tabs, [topNParameter], [topNWorkspace]); + + expect(distributed["tab-A"]).toEqual([{ parameter: topNParameter, runtimeOverride: 10 }]); + expect(distributed["tab-B"]).toEqual([{ parameter: sampleParameter, runtimeOverride: undefined }]); + }); + + it("explicit empty array on a tab honored — not overwritten by root fallback", () => { + const tabs: IDashboardTab[] = [tab("tab-A", []), tab("tab-B", [topNParameter])]; + + const distributed = distributeParametersToTabs(tabs, [sampleParameter], [topNWorkspace]); + + expect(distributed["tab-A"]).toEqual([]); + expect(distributed["tab-B"]).toEqual([{ parameter: topNParameter, runtimeOverride: 10 }]); + }); + + it("no root parameters AND no tab parameters — every tab gets empty entries", () => { + const tabs: IDashboardTab[] = [tab("tab-A"), tab("tab-B")]; + + const distributed = distributeParametersToTabs(tabs, undefined, [topNWorkspace]); + + expect(distributed["tab-A"]).toEqual([]); + expect(distributed["tab-B"]).toEqual([]); + }); +}); diff --git a/libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/saveAsDashboardHandler.ts b/libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/saveAsDashboardHandler.ts index 5e948fadf99..5b06832a1e5 100644 --- a/libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/saveAsDashboardHandler.ts +++ b/libs/sdk-ui-dashboard/src/model/commandHandlers/dashboard/saveAsDashboardHandler.ts @@ -9,6 +9,7 @@ import { type IAccessControlAware, type IDashboard, type IDashboardDefinition, + type IDashboardParameter, type IDashboardTab, type IFilterContext, type ITempFilterContext, @@ -36,7 +37,6 @@ import { selectPersistedDashboard, selectPersistedDashboardFilterContextAsFilterContextDefinition, } from "../../store/meta/metaSelectors.js"; -import { selectSmartPersistedDashboardParameters } from "../../store/parameters/parametersSelectors.js"; import { selectIsInViewMode } from "../../store/renderMode/renderModeSelectors.js"; import { savingActions } from "../../store/saving/index.js"; import { selectAttributeFilterConfigsOverrides } from "../../store/tabs/attributeFilterConfigs/attributeFilterConfigsSelectors.js"; @@ -49,6 +49,7 @@ import { import { tabsActions } from "../../store/tabs/index.js"; import { filterOutCustomWidgets, selectBasicLayout } from "../../store/tabs/layout/layoutSelectors.js"; import { selectMeasureValueFilterConfigsOverrides } from "../../store/tabs/measureValueFilterConfigs/measureValueFilterConfigsSelectors.js"; +import { selectSmartPersistedTabsParameters } from "../../store/tabs/parameters/parametersSelectors.js"; import { selectTabs } from "../../store/tabs/tabsSelectors.js"; import { type ITabState } from "../../store/tabs/tabsState.js"; import { selectCurrentUser } from "../../store/user/userSelectors.js"; @@ -99,6 +100,7 @@ function createDashboard(ctx: DashboardContext, saveAsCtx: DashboardSaveAsContex */ function processExistingTabsForSaveAs( tabs: ITabState[], + parametersByTab: Record, useOriginalFilterContext?: boolean, ): IDashboardTab[] { return tabs.map((tab) => { @@ -130,6 +132,8 @@ function processExistingTabsForSaveAs( } as IFilterContext | ITempFilterContext) : undefined; + const tabParameters = parametersByTab[tab.localIdentifier] ?? []; + const result: IDashboardTab = { // explicitly type the result to avoid type errors caused by spread operators localIdentifier: tab.localIdentifier, @@ -141,6 +145,9 @@ function processExistingTabsForSaveAs( ...dateFilterConfigsProp, ...attributeFilterConfigsProp, ...measureValueFilterConfigsProp, + // Always persist `parameters` (incl. `[]`) so V1 root fallback never re-hydrates stale + // root parameters when every tab has been emptied. + parameters: tabParameters, }; return result; @@ -208,8 +215,8 @@ function* createDashboardSaveAsContext(cmd: SaveDashboardAs): SagaIterator = yield select(selectTabs); - const parameters: ReturnType = yield select( - selectSmartPersistedDashboardParameters, + const parametersByTab: ReturnType = yield select( + selectSmartPersistedTabsParameters, ); const capabilities: ReturnType = @@ -219,7 +226,9 @@ function* createDashboardSaveAsContext(cmd: SaveDashboardAs): SagaIterator 0 ? processExistingTabsForSaveAs(tabs, useOriginalFilterContext) : undefined; + tabs && tabs.length > 0 + ? processExistingTabsForSaveAs(tabs, parametersByTab, useOriginalFilterContext) + : undefined; const dashboardFromState: IDashboardDefinition = { type: "IDashboard", @@ -233,7 +242,6 @@ function* createDashboardSaveAsContext(cmd: SaveDashboardAs): SagaIterator, +): IDashboardTab[] { return tabs.map((tab) => { const dateFilterConfig = tab.dateFilterConfig?.dateFilterConfig; @@ -168,6 +173,8 @@ function processExistingTabs(tabs: ITabState[]): IDashboardTab[] { } as IFilterContext | ITempFilterContext) : undefined; + const tabParameters = parametersByTab[tab.localIdentifier] ?? []; + const result: IDashboardTab = { // explicitly type the result to avoid type errors caused by spread operators localIdentifier: tab.localIdentifier, @@ -180,6 +187,9 @@ function processExistingTabs(tabs: ITabState[]): IDashboardTab[] { ...attributeFilterConfigsProp, ...measureValueFilterConfigsProp, ...filterGroupsConfigProp, + // Always persist `parameters` (incl. `[]`) so V1 root fallback never re-hydrates stale + // root parameters when every tab has been emptied. + parameters: tabParameters, }; return result; }); @@ -235,6 +245,7 @@ function resolveProcessedTabs( attributeFilterConfigs: IDashboardDefinition["attributeFilterConfigs"], dateFilterConfigs: IDashboardDefinition["dateFilterConfigs"], measureValueFilterConfigs: IDashboardDefinition["measureValueFilterConfigs"], + parametersByTab: Record, ): IDashboardTab[] | undefined { // If no tabs exist, create a default tab with root-level properties const shouldCreateDefaultTab = !tabs || tabs.length === 0; @@ -251,7 +262,7 @@ function resolveProcessedTabs( } if (tabs) { - return processExistingTabs(tabs); + return processExistingTabs(tabs, parametersByTab); } return undefined; @@ -289,8 +300,8 @@ function* createDashboardSaveContext( const measureValueFilterConfigs: ReturnType = yield select(selectMeasureValueFilterConfigsOverrides); const tabs: ReturnType = yield select(selectTabs); - const parameters: ReturnType = yield select( - selectSmartPersistedDashboardParameters, + const parametersByTab: ReturnType = yield select( + selectSmartPersistedTabsParameters, ); const capabilities: ReturnType = yield select(selectBackendCapabilities); @@ -324,6 +335,7 @@ function* createDashboardSaveContext( attributeFilterConfigs, dateFilterConfigs, measureValueFilterConfigs, + parametersByTab, ); const locale: ReturnType = yield select(selectLocale); @@ -349,7 +361,6 @@ function* createDashboardSaveContext( measureValueFilterConfigs, ), ...(processedTabs ? { tabs: processedTabs } : {}), - ...(parameters.length > 0 ? { parameters } : {}), ...pluginsProp, }; diff --git a/libs/sdk-ui-dashboard/src/model/store/dashboardStore.ts b/libs/sdk-ui-dashboard/src/model/store/dashboardStore.ts index 4bada4e3271..88b2c67eb08 100644 --- a/libs/sdk-ui-dashboard/src/model/store/dashboardStore.ts +++ b/libs/sdk-ui-dashboard/src/model/store/dashboardStore.ts @@ -47,7 +47,6 @@ import { listedDashboardsSliceReducer } from "./listedDashboards/index.js"; import { loadingSliceReducer } from "./loading/index.js"; import { metaSliceReducer } from "./meta/index.js"; import { notificationChannelsSliceReducer } from "./notificationChannels/index.js"; -import { parametersSliceReducer } from "./parameters/index.js"; import { permissionsSliceReducer } from "./permissions/index.js"; import { renderModeSliceReducer } from "./renderMode/index.js"; import { savingSliceReducer } from "./saving/index.js"; @@ -324,7 +323,6 @@ export function createDashboardRootReducer({ dashboardPermissions: dashboardPermissionsSliceReducer, showWidgetAsTable: showWidgetAsTableSliceReducer, notificationChannels: notificationChannelsSliceReducer, - parameters: parametersSliceReducer, automations: automationsSliceReducer, users: usersSliceReducer, filterViews: filterViewsSliceReducer, diff --git a/libs/sdk-ui-dashboard/src/model/store/meta/metaSelectors.ts b/libs/sdk-ui-dashboard/src/model/store/meta/metaSelectors.ts index df6c42da14e..1241003f58d 100644 --- a/libs/sdk-ui-dashboard/src/model/store/meta/metaSelectors.ts +++ b/libs/sdk-ui-dashboard/src/model/store/meta/metaSelectors.ts @@ -36,10 +36,6 @@ import { uriRef, } from "@gooddata/sdk-model"; -import { - selectIsParametersChanged, - selectSmartPersistedDashboardParameters, -} from "../parameters/parametersSelectors.js"; import { selectAttributeFilterConfigsOverridesByTab } from "../tabs/attributeFilterConfigs/attributeFilterConfigsSelectors.js"; import { selectDateFilterConfigOverrides, @@ -57,6 +53,10 @@ import { selectBasicLayoutByTab, } from "../tabs/layout/layoutSelectors.js"; import { selectMeasureValueFilterConfigsOverridesByTab } from "../tabs/measureValueFilterConfigs/measureValueFilterConfigsSelectors.js"; +import { + selectIsParametersChanged, + selectSmartPersistedTabsParameters, +} from "../tabs/parameters/parametersSelectors.js"; import { selectActiveTabLocalIdentifier, selectTabs } from "../tabs/tabsSelectors.js"; import { DEFAULT_TAB_ID, type ITabState } from "../tabs/tabsState.js"; import { type DashboardSelector, type DashboardState } from "../types.js"; @@ -142,6 +142,7 @@ export const selectPersistedDashboardTabs = createSelector(selectSelf, (state): dateFilterConfig: persistedDashboard.dateFilterConfig, dateFilterConfigs: persistedDashboard.dateFilterConfigs, layout: persistedDashboard.layout, + parameters: persistedDashboard.parameters, }, ]; }); @@ -1175,7 +1176,7 @@ export const selectDashboardWorkingDefinition: DashboardSelector { const dashboardIdentity: Partial = { ref: persistedDashboard?.ref, @@ -1204,7 +1205,6 @@ export const selectDashboardWorkingDefinition: DashboardSelector 0 ? { parameters } : {}), ...(tabs ? { tabs: tabs.map( @@ -1226,6 +1226,7 @@ export const selectDashboardWorkingDefinition: DashboardSelector = parametersSlice.reducer; - -/** - * @internal - */ -export const parametersActions = { ...parametersSlice.actions }; diff --git a/libs/sdk-ui-dashboard/src/model/store/parameters/parametersSelectors.ts b/libs/sdk-ui-dashboard/src/model/store/parameters/parametersSelectors.ts deleted file mode 100644 index 49c5eefed0f..00000000000 --- a/libs/sdk-ui-dashboard/src/model/store/parameters/parametersSelectors.ts +++ /dev/null @@ -1,199 +0,0 @@ -// (C) 2026 GoodData Corporation - -import { createSelector } from "@reduxjs/toolkit"; -import { isEqual } from "lodash-es"; - -import { - type IDashboardParameter, - type IInsightParameterValue, - type IParameterMetadataObject, - type ObjRef, - areObjRefsEqual, - insightParameters, - isNumberParameterDefinition, - objRefToString, -} from "@gooddata/sdk-model"; - -import { createMemoizedSelector } from "../_infra/selectors.js"; -import { selectCatalogParameters, selectCatalogParametersIsLoaded } from "../catalog/catalogSelectors.js"; -import { selectEnableParameters } from "../config/configSelectors.js"; -import { selectInsightByWidgetRef } from "../insights/insightsSelectors.js"; -import { type DashboardSelector, type DashboardState } from "../types.js"; - -import { type IDashboardParameterEntry } from "./parametersState.js"; - -const selectSelf = (state: DashboardState) => state.parameters; - -const EMPTY_PARAMETERS: IDashboardParameter[] = []; - -const selectPersistedParametersFromMeta: DashboardSelector = (state) => - state.meta?.persistedDashboard?.parameters ?? EMPTY_PARAMETERS; - -/** - * Returns the persisted-shape parameter entries currently held by the dashboard. - * - * @alpha - */ -export const selectDashboardParameters: DashboardSelector = createSelector( - selectSelf, - (state) => state.parameters.map((entry) => entry.parameter), -); - -/** - * Returns currently active parameter references. - * - * @alpha - */ -export const selectActiveParameterRefKeys: DashboardSelector> = createSelector( - selectDashboardParameters, - (parameters) => new Set(parameters.map((parameter) => objRefToString(parameter.ref))), -); - -/** - * Returns the full per-parameter entries (persisted shape + ephemeral `runtimeOverride`). - * - * @internal - */ -export const selectDashboardParameterEntries: DashboardSelector = createSelector( - selectSelf, - (state) => state.parameters, -); - -/** - * Returns a selector that yields the entry held by the dashboard for a given parameter ref, - * or `undefined` if no such entry exists. - * - * @alpha - */ -export const selectDashboardParameterEntryByRef: ( - ref: ObjRef, -) => DashboardSelector = createMemoizedSelector((ref: ObjRef) => - createSelector(selectSelf, (state) => - state.parameters.find((item) => areObjRefsEqual(item.parameter.ref, ref)), - ), -); - -/** - * Returns a selector that yields the current `runtimeOverride` for a given parameter ref, - * or `undefined` if the dashboard does not hold an entry for that ref. - * - * @alpha - */ -export const selectParameterRuntimeOverrideByRef: (ref: ObjRef) => DashboardSelector = - createMemoizedSelector((ref: ObjRef) => - createSelector(selectDashboardParameterEntryByRef(ref), (entry) => entry?.runtimeOverride), - ); - -/** - * Computes the dashboard parameters in the shape that would be persisted on save right now. - * - * @remarks - * For resolved entries (catalog parameters loaded AND ref present), applies smart persistence: - * `value` is dropped when equal to the workspace default and `label` is dropped when equal - * to the parameter title. For non-resolved entries (catalog not loaded, gated off, or ref - * missing), the persisted entry is passed through verbatim so we never compare against an - * unknown workspace default. - * - * @internal - */ -export const selectSmartPersistedDashboardParameters: DashboardSelector = - createSelector( - selectDashboardParameterEntries, - selectCatalogParameters, - selectCatalogParametersIsLoaded, - selectPersistedParametersFromMeta, - (entries, workspaceParameters, isCatalogLoaded, persistedParameters) => { - const persistedByRef = new Map( - persistedParameters.map((parameter) => [objRefToString(parameter.ref), parameter]), - ); - const workspaceByRef = new Map(workspaceParameters.map((wp) => [objRefToString(wp.ref), wp])); - return entries.map((entry) => { - const refKey = objRefToString(entry.parameter.ref); - const workspaceParameter = isCatalogLoaded ? workspaceByRef.get(refKey) : undefined; - if (!workspaceParameter) { - return persistedByRef.get(refKey) ?? entry.parameter; - } - return smartPersistResolvedEntry(entry, workspaceParameter); - }); - }, - ); - -/** - * Returns true if the dashboard parameters that would be persisted differ from the persisted version. - * - * @alpha - */ -export const selectIsParametersChanged: DashboardSelector = createSelector( - selectSmartPersistedDashboardParameters, - selectPersistedParametersFromMeta, - (smartPersisted, persisted) => !isEqual(smartPersisted, persisted), -); - -/** - * Returns the parameter values to inject into the widget's `IExecutionConfig.parameterValues`. - * - * @remarks - * The result is the intersection of dashboard parameter entries and the parameters referenced - * by the widget's insight (per `insightParameters`). Dashboard parameters not referenced by the - * widget's insight are excluded so that adding/removing unrelated parameters does not invalidate - * the widget's `defFingerprint`. Returns an empty array when `enableParameters` is off so - * persisted parameter values cannot silently affect execution while the UI is hidden. - * - * @alpha - */ -export const selectEffectiveParameterValuesForWidget: ( - ref: ObjRef | undefined, -) => DashboardSelector = createMemoizedSelector((ref: ObjRef | undefined) => - createSelector( - selectDashboardParameterEntries, - selectInsightByWidgetRef(ref), - selectEnableParameters, - (entries, insight, isEnabled) => { - if (!isEnabled || !insight) { - return []; - } - const referencedRefs = new Set( - insightParameters(insight).map((parameter) => objRefToString(parameter.ref)), - ); - const result: IInsightParameterValue[] = []; - for (const entry of entries) { - if (entry.runtimeOverride === undefined) { - continue; - } - if (referencedRefs.has(objRefToString(entry.parameter.ref))) { - result.push({ ref: entry.parameter.ref, value: entry.runtimeOverride }); - } - } - return result; - }, - ), -); - -function smartPersistResolvedEntry( - entry: IDashboardParameterEntry, - workspaceParameter: IParameterMetadataObject, -): IDashboardParameter { - const workspaceDefault = isNumberParameterDefinition(workspaceParameter.definition) - ? workspaceParameter.definition.defaultValue - : undefined; - const result: IDashboardParameter = { - ref: entry.parameter.ref, - parameterType: entry.parameter.parameterType, - mode: entry.parameter.mode, - ...labelOverride(entry, workspaceParameter), - }; - if (entry.runtimeOverride === undefined || entry.runtimeOverride === workspaceDefault) { - return result; - } - return { ...result, value: entry.runtimeOverride }; -} - -function labelOverride( - entry: IDashboardParameterEntry, - workspaceParameter: IParameterMetadataObject, -): { label?: string } { - if (entry.parameter.label && entry.parameter.label !== workspaceParameter.title) { - return { label: entry.parameter.label }; - } - return {}; -} diff --git a/libs/sdk-ui-dashboard/src/model/store/parameters/tests/parametersReducers.test.ts b/libs/sdk-ui-dashboard/src/model/store/parameters/tests/parametersReducers.test.ts deleted file mode 100644 index 8d5bc62a70a..00000000000 --- a/libs/sdk-ui-dashboard/src/model/store/parameters/tests/parametersReducers.test.ts +++ /dev/null @@ -1,121 +0,0 @@ -// (C) 2026 GoodData Corporation - -import { describe, expect, it } from "vitest"; - -import { type IDashboardParameter, idRef } from "@gooddata/sdk-model"; - -import { parametersActions, parametersSliceReducer } from "../index.js"; -import { type IParametersState, parametersInitialState } from "../parametersState.js"; - -const topNRef = idRef("topN", "parameter"); -const sampleRef = idRef("sampleSize", "parameter"); - -const topNParameter: IDashboardParameter = { - ref: topNRef, - parameterType: "NUMBER", - mode: "active", -}; - -const topNPinned: IDashboardParameter = { - ref: topNRef, - parameterType: "NUMBER", - mode: "active", - value: 25, -}; - -function reduce( - state: IParametersState, - action: ReturnType<(typeof parametersActions)[keyof typeof parametersActions]>, -) { - return parametersSliceReducer(state, action); -} - -describe("parameters slice", () => { - describe("addParameter", () => { - it("adds entry initialized to workspace default when value not pinned", () => { - const next = reduce( - parametersInitialState, - parametersActions.addParameter({ parameter: topNParameter, workspaceDefault: 10 }), - ); - - expect(next.parameters).toEqual([{ parameter: topNParameter, runtimeOverride: 10 }]); - }); - - it("adds entry initialized to pinned value when present", () => { - const next = reduce( - parametersInitialState, - parametersActions.addParameter({ parameter: topNPinned, workspaceDefault: 10 }), - ); - - expect(next.parameters).toEqual([{ parameter: topNPinned, runtimeOverride: 25 }]); - }); - - it("ignores duplicate refs (picker dedup)", () => { - const once = reduce( - parametersInitialState, - parametersActions.addParameter({ parameter: topNParameter, workspaceDefault: 10 }), - ); - const twice = reduce( - once, - parametersActions.addParameter({ parameter: topNParameter, workspaceDefault: 50 }), - ); - - expect(twice.parameters).toHaveLength(1); - expect(twice.parameters[0]?.runtimeOverride).toBe(10); - }); - }); - - describe("setParameterRuntimeValue", () => { - it("updates only runtimeOverride, leaves persisted entry untouched", () => { - const initial = reduce( - parametersInitialState, - parametersActions.addParameter({ parameter: topNParameter, workspaceDefault: 10 }), - ); - - const next = reduce( - initial, - parametersActions.setParameterRuntimeValue({ ref: topNRef, value: 99 }), - ); - - expect(next.parameters[0]?.parameter).toEqual(topNParameter); - expect(next.parameters[0]?.runtimeOverride).toBe(99); - }); - - it("is a no-op when ref is unknown", () => { - const initial = reduce( - parametersInitialState, - parametersActions.addParameter({ parameter: topNParameter, workspaceDefault: 10 }), - ); - - const next = reduce( - initial, - parametersActions.setParameterRuntimeValue({ ref: sampleRef, value: 99 }), - ); - - expect(next.parameters).toEqual(initial.parameters); - }); - }); - - describe("removeParameter", () => { - it("filters out the entry by ref", () => { - const seeded = reduce( - parametersInitialState, - parametersActions.addParameter({ parameter: topNParameter, workspaceDefault: 10 }), - ); - - const next = reduce(seeded, parametersActions.removeParameter({ ref: topNRef })); - - expect(next.parameters).toEqual([]); - }); - }); - - describe("setParameterEntries", () => { - it("replaces entries (used on dashboard load)", () => { - const replacement = [{ parameter: topNPinned, runtimeOverride: 25 }]; - - const next = reduce(parametersInitialState, parametersActions.setParameterEntries(replacement)); - - expect(next.parameters).toEqual(replacement); - }); - }); -}); diff --git a/libs/sdk-ui-dashboard/src/model/store/parameters/tests/parametersSelectors.test.ts b/libs/sdk-ui-dashboard/src/model/store/parameters/tests/parametersSelectors.test.ts deleted file mode 100644 index f5aac5bf67b..00000000000 --- a/libs/sdk-ui-dashboard/src/model/store/parameters/tests/parametersSelectors.test.ts +++ /dev/null @@ -1,312 +0,0 @@ -// (C) 2026 GoodData Corporation - -import { describe, expect, it, vi } from "vitest"; - -import { - type IDashboard, - type IDashboardParameter, - type IInsight, - type IInsightParameterValue, - type IParameterMetadataObject, - idRef, -} from "@gooddata/sdk-model"; - -vi.mock("../../insights/insightsSelectors.js", () => ({ - selectInsightByWidgetRef: (widgetRef: { identifier: string } | undefined) => () => { - if (!widgetRef) return undefined; - return WIDGET_INSIGHT_MAP[widgetRef.identifier]; - }, -})); - -const WIDGET_INSIGHT_MAP: Record = {}; - -import { type DashboardState } from "../../types.js"; -import { - selectDashboardParameterEntries, - selectDashboardParameters, - selectEffectiveParameterValuesForWidget, - selectIsParametersChanged, - selectParameterRuntimeOverrideByRef, - selectSmartPersistedDashboardParameters, -} from "../parametersSelectors.js"; -import { type IDashboardParameterEntry } from "../parametersState.js"; - -const topNRef = idRef("topN", "parameter"); -const otherRef = idRef("sampleSize", "parameter"); - -const topNParameter: IDashboardParameter = { - ref: topNRef, - parameterType: "NUMBER", - mode: "active", -}; - -const topNWorkspace: IParameterMetadataObject = { - type: "parameter", - id: "topN", - uri: "/topN", - ref: topNRef, - title: "Top N", - description: "", - production: true, - deprecated: false, - unlisted: false, - definition: { type: "NUMBER", defaultValue: 10 }, -}; - -const entry: IDashboardParameterEntry = { - parameter: topNParameter, - runtimeOverride: 25, -}; - -function makeState(parameters: IDashboardParameterEntry[]): DashboardState { - return { parameters: { parameters } } as DashboardState; -} - -interface IFullStateOptions { - entries: IDashboardParameterEntry[]; - workspaceParameters?: IParameterMetadataObject[]; - catalogStatus?: "loaded" | "loading" | "failed" | "gated-off" | "uninitialized"; - persistedDashboardParameters?: IDashboardParameter[]; - enableParameters?: boolean; -} - -function makeFullState({ - entries, - workspaceParameters = [], - catalogStatus = "loaded", - persistedDashboardParameters, - enableParameters = true, -}: IFullStateOptions): DashboardState { - const persistedDashboard: Partial | undefined = - persistedDashboardParameters === undefined - ? undefined - : ({ parameters: persistedDashboardParameters } as Partial); - return { - parameters: { parameters: entries }, - catalog: { - parameters: { status: catalogStatus, parameters: workspaceParameters }, - }, - meta: { persistedDashboard }, - config: { config: { settings: { enableParameters } } }, - } as unknown as DashboardState; -} - -describe("parameter selectors", () => { - it("selectDashboardParameters returns persisted-shape entries", () => { - expect(selectDashboardParameters(makeState([entry]))).toEqual([topNParameter]); - }); - - it("selectDashboardParameterEntries returns full entries", () => { - expect(selectDashboardParameterEntries(makeState([entry]))).toEqual([entry]); - }); - - it("selectParameterRuntimeOverrideByRef returns runtimeOverride for matching ref", () => { - const select = selectParameterRuntimeOverrideByRef(topNRef); - expect(select(makeState([entry]))).toBe(25); - }); - - it("selectParameterRuntimeOverrideByRef returns undefined when ref absent", () => { - const select = selectParameterRuntimeOverrideByRef(otherRef); - expect(select(makeState([entry]))).toBeUndefined(); - }); - - describe("selectSmartPersistedDashboardParameters", () => { - it("omits value when runtimeOverride equals workspace default", () => { - const state = makeFullState({ - entries: [{ parameter: topNParameter, runtimeOverride: 10 }], - workspaceParameters: [topNWorkspace], - }); - expect(selectSmartPersistedDashboardParameters(state)).toEqual([ - { ref: topNRef, parameterType: "NUMBER", mode: "active" }, - ]); - }); - - it("emits value when runtimeOverride differs from workspace default", () => { - const state = makeFullState({ - entries: [{ parameter: topNParameter, runtimeOverride: 25 }], - workspaceParameters: [topNWorkspace], - }); - expect(selectSmartPersistedDashboardParameters(state)).toEqual([ - { ref: topNRef, parameterType: "NUMBER", mode: "active", value: 25 }, - ]); - }); - - it("omits label when equal to workspace title", () => { - const state = makeFullState({ - entries: [ - { - parameter: { ...topNParameter, label: "Top N" }, - runtimeOverride: 10, - }, - ], - workspaceParameters: [topNWorkspace], - }); - expect(selectSmartPersistedDashboardParameters(state)).toEqual([ - { ref: topNRef, parameterType: "NUMBER", mode: "active" }, - ]); - }); - - it("preserves label when different from workspace title", () => { - const state = makeFullState({ - entries: [ - { - parameter: { ...topNParameter, label: "Custom Label" }, - runtimeOverride: 10, - }, - ], - workspaceParameters: [topNWorkspace], - }); - expect(selectSmartPersistedDashboardParameters(state)).toEqual([ - { ref: topNRef, parameterType: "NUMBER", mode: "active", label: "Custom Label" }, - ]); - }); - - it("emits non-resolved entry verbatim from persistedDashboard when catalog status is not loaded", () => { - const persisted: IDashboardParameter = { - ref: topNRef, - parameterType: "NUMBER", - mode: "active", - value: 99, - }; - const state = makeFullState({ - entries: [{ parameter: topNParameter, runtimeOverride: 25 }], - catalogStatus: "gated-off", - persistedDashboardParameters: [persisted], - }); - expect(selectSmartPersistedDashboardParameters(state)).toEqual([persisted]); - }); - - it("emits non-resolved entry verbatim when ref absent from loaded catalog", () => { - const persisted: IDashboardParameter = { - ref: topNRef, - parameterType: "NUMBER", - mode: "active", - value: 99, - }; - const state = makeFullState({ - entries: [{ parameter: topNParameter, runtimeOverride: 25 }], - workspaceParameters: [], - persistedDashboardParameters: [persisted], - }); - expect(selectSmartPersistedDashboardParameters(state)).toEqual([persisted]); - }); - }); - - describe("selectIsParametersChanged", () => { - it("is false when smart-persisted matches persisted", () => { - const state = makeFullState({ - entries: [{ parameter: topNParameter, runtimeOverride: 10 }], - workspaceParameters: [topNWorkspace], - persistedDashboardParameters: [{ ref: topNRef, parameterType: "NUMBER", mode: "active" }], - }); - expect(selectIsParametersChanged(state)).toBe(false); - }); - - it("is true when runtimeOverride diverges from persisted value", () => { - const state = makeFullState({ - entries: [{ parameter: topNParameter, runtimeOverride: 99 }], - workspaceParameters: [topNWorkspace], - persistedDashboardParameters: [{ ref: topNRef, parameterType: "NUMBER", mode: "active" }], - }); - expect(selectIsParametersChanged(state)).toBe(true); - }); - - it("is true when entry added", () => { - const state = makeFullState({ - entries: [{ parameter: topNParameter, runtimeOverride: 10 }], - workspaceParameters: [topNWorkspace], - persistedDashboardParameters: [], - }); - expect(selectIsParametersChanged(state)).toBe(true); - }); - - it("is false when no persisted dashboard and no entries", () => { - const state = makeFullState({ - entries: [], - workspaceParameters: [], - }); - expect(selectIsParametersChanged(state)).toBe(false); - }); - }); - - describe("selectEffectiveParameterValuesForWidget", () => { - const widgetRef = idRef("w-1", "insight"); - const sampleSizeRef = idRef("sampleSize", "parameter"); - - function setInsight(parameterValues: IInsightParameterValue[]): IInsight { - const insight = { - insight: { - parameters: parameterValues, - }, - } as unknown as IInsight; - WIDGET_INSIGHT_MAP[widgetRef.identifier] = insight; - return insight; - } - - it("returns runtimeOverride for parameters referenced by the insight", () => { - setInsight([{ ref: topNRef, value: 0 }]); - const state = makeFullState({ - entries: [{ parameter: topNParameter, runtimeOverride: 25 }], - }); - expect(selectEffectiveParameterValuesForWidget(widgetRef)(state)).toEqual([ - { ref: topNRef, value: 25 }, - ]); - }); - - it("excludes dashboard parameters not referenced by the insight", () => { - setInsight([{ ref: topNRef, value: 0 }]); - const sampleSize: IDashboardParameter = { - ref: sampleSizeRef, - parameterType: "NUMBER", - mode: "active", - }; - const state = makeFullState({ - entries: [ - { parameter: topNParameter, runtimeOverride: 25 }, - { parameter: sampleSize, runtimeOverride: 99 }, - ], - }); - expect(selectEffectiveParameterValuesForWidget(widgetRef)(state)).toEqual([ - { ref: topNRef, value: 25 }, - ]); - }); - - it("returns identical reference when an unrelated parameter is added (defFingerprint stability)", () => { - setInsight([{ ref: topNRef, value: 0 }]); - const stateWithoutUnrelated = makeFullState({ - entries: [{ parameter: topNParameter, runtimeOverride: 25 }], - }); - const sampleSize: IDashboardParameter = { - ref: sampleSizeRef, - parameterType: "NUMBER", - mode: "active", - }; - const stateWithUnrelated = makeFullState({ - entries: [ - { parameter: topNParameter, runtimeOverride: 25 }, - { parameter: sampleSize, runtimeOverride: 99 }, - ], - }); - expect(selectEffectiveParameterValuesForWidget(widgetRef)(stateWithoutUnrelated)).toEqual( - selectEffectiveParameterValuesForWidget(widgetRef)(stateWithUnrelated), - ); - }); - - it("returns empty array when widget has no insight", () => { - const missingRef = idRef("missing", "insight"); - const state = makeFullState({ - entries: [{ parameter: topNParameter, runtimeOverride: 25 }], - }); - expect(selectEffectiveParameterValuesForWidget(missingRef)(state)).toEqual([]); - }); - - it("returns empty array when enableParameters is off", () => { - setInsight([{ ref: topNRef, value: 0 }]); - const state = makeFullState({ - entries: [{ parameter: topNParameter, runtimeOverride: 25 }], - enableParameters: false, - }); - expect(selectEffectiveParameterValuesForWidget(widgetRef)(state)).toEqual([]); - }); - }); -}); diff --git a/libs/sdk-ui-dashboard/src/model/store/tabs/index.ts b/libs/sdk-ui-dashboard/src/model/store/tabs/index.ts index 359fe086a41..1cea4dd2a9e 100644 --- a/libs/sdk-ui-dashboard/src/model/store/tabs/index.ts +++ b/libs/sdk-ui-dashboard/src/model/store/tabs/index.ts @@ -8,6 +8,7 @@ import { dateFilterConfigsReducers } from "./dateFilterConfigs/dateFilterConfigs import { filterContextReducers } from "./filterContext/filterContextReducers.js"; import { layoutReducers } from "./layout/layoutReducers.js"; import { measureValueFilterConfigsReducers } from "./measureValueFilterConfigs/measureValueFilterConfigsReducers.js"; +import { parametersReducers } from "./parameters/parametersReducers.js"; import { tabsReducers } from "./tabsReducers.js"; import { tabsInitialState } from "./tabsState.js"; @@ -19,6 +20,7 @@ const allReducers = { ...measureValueFilterConfigsReducers, ...filterContextReducers, ...layoutReducers, + ...parametersReducers, } as const; const tabsSlice = createSlice({ diff --git a/libs/sdk-ui-dashboard/src/model/store/parameters/parametersReducers.ts b/libs/sdk-ui-dashboard/src/model/store/tabs/parameters/parametersReducers.ts similarity index 50% rename from libs/sdk-ui-dashboard/src/model/store/parameters/parametersReducers.ts rename to libs/sdk-ui-dashboard/src/model/store/tabs/parameters/parametersReducers.ts index abd27105964..cc5024c9e5a 100644 --- a/libs/sdk-ui-dashboard/src/model/store/parameters/parametersReducers.ts +++ b/libs/sdk-ui-dashboard/src/model/store/tabs/parameters/parametersReducers.ts @@ -4,12 +4,14 @@ import { type Action, type CaseReducer, type PayloadAction } from "@reduxjs/tool import { type IDashboardParameter, type ObjRef, areObjRefsEqual } from "@gooddata/sdk-model"; -import { type IDashboardParameterEntry, type IParametersState } from "./parametersState.js"; +import { type ITabsState, getActiveTab } from "../tabsState.js"; -type ParametersReducer = CaseReducer; +import { parametersInitialState } from "./parametersState.js"; + +type ParametersReducer = CaseReducer; /** - * Add a parameter to the dashboard. Initial `runtimeOverride` is `parameter.value` + * Add a parameter to the active tab. Initial `runtimeOverride` is `parameter.value` * (when pinned) otherwise the workspace default supplied by the caller. * * @alpha @@ -20,14 +22,21 @@ export interface IAddParameterPayload { } const addParameter: ParametersReducer> = (state, action) => { + const activeTab = getActiveTab(state); + if (!activeTab) { + return; + } const { parameter, workspaceDefault } = action.payload; - if (state.parameters.some((entry) => areObjRefsEqual(entry.parameter.ref, parameter.ref))) { + const tabParameters = activeTab.parameters ?? parametersInitialState; + if (tabParameters.parameters.some((entry) => areObjRefsEqual(entry.parameter.ref, parameter.ref))) { return; } - state.parameters.push({ - parameter, - runtimeOverride: parameter.value ?? workspaceDefault, - }); + activeTab.parameters = { + parameters: [ + ...tabParameters.parameters, + { parameter, runtimeOverride: parameter.value ?? workspaceDefault }, + ], + }; }; /** @@ -42,8 +51,12 @@ const setParameterRuntimeValue: ParametersReducer { + const activeTab = getActiveTab(state); + if (!activeTab?.parameters) { + return; + } const { ref, value } = action.payload; - const entry = state.parameters.find((item) => areObjRefsEqual(item.parameter.ref, ref)); + const entry = activeTab.parameters.parameters.find((item) => areObjRefsEqual(item.parameter.ref, ref)); if (entry) { entry.runtimeOverride = value; } @@ -57,23 +70,19 @@ export interface IRemoveParameterPayload { } const removeParameter: ParametersReducer> = (state, action) => { - state.parameters = state.parameters.filter( - (entry) => !areObjRefsEqual(entry.parameter.ref, action.payload.ref), - ); -}; - -/** - * Replace the entire entry list. Used when (re-)loading a persisted dashboard. - * - * @alpha - */ -const setParameterEntries: ParametersReducer> = (state, action) => { - state.parameters = action.payload; + const activeTab = getActiveTab(state); + if (!activeTab?.parameters) { + return; + } + activeTab.parameters = { + parameters: activeTab.parameters.parameters.filter( + (entry) => !areObjRefsEqual(entry.parameter.ref, action.payload.ref), + ), + }; }; export const parametersReducers = { addParameter, setParameterRuntimeValue, removeParameter, - setParameterEntries, }; diff --git a/libs/sdk-ui-dashboard/src/model/store/tabs/parameters/parametersSelectors.ts b/libs/sdk-ui-dashboard/src/model/store/tabs/parameters/parametersSelectors.ts new file mode 100644 index 00000000000..486ffb3fb69 --- /dev/null +++ b/libs/sdk-ui-dashboard/src/model/store/tabs/parameters/parametersSelectors.ts @@ -0,0 +1,361 @@ +// (C) 2026 GoodData Corporation + +import { createSelector } from "@reduxjs/toolkit"; +import { isEqual } from "lodash-es"; + +import { + type IDashboardLayout, + type IDashboardParameter, + type IDashboardTab, + type IInsightParameterValue, + type IInsightWidget, + type IParameterMetadataObject, + type ObjRef, + areObjRefsEqual, + insightParameters, + isDashboardLayout, + isInsightWidget, + isNumberParameterDefinition, + isVisualizationSwitcherWidget, + objRefToString, +} from "@gooddata/sdk-model"; + +import { type ExtendedDashboardWidget } from "../../../types/layoutTypes.js"; +import { createMemoizedSelector } from "../../_infra/selectors.js"; +import { selectCatalogParameters, selectCatalogParametersIsLoaded } from "../../catalog/catalogSelectors.js"; +import { selectEnableParameters } from "../../config/configSelectors.js"; +import { selectInsightsMap } from "../../insights/insightsSelectors.js"; +import { type DashboardSelector } from "../../types.js"; +import { selectActiveTab, selectTabs } from "../tabsSelectors.js"; +import { DEFAULT_TAB_ID, type ITabState } from "../tabsState.js"; + +import { + type IDashboardParameterEntry, + parametersInitialState, + pickTabParametersSource, +} from "./parametersState.js"; + +const EMPTY_PARAMETERS: IDashboardParameter[] = []; +const EMPTY_TABS: IDashboardTab[] = []; + +const selectParametersState = createSelector( + selectActiveTab, + (activeTab) => activeTab?.parameters ?? parametersInitialState, +); + +const selectPersistedParametersFromMeta: DashboardSelector = (state) => + state.meta?.persistedDashboard?.parameters ?? EMPTY_PARAMETERS; + +const selectPersistedDashboardTabsRaw: DashboardSelector = (state) => + state.meta?.persistedDashboard?.tabs ?? EMPTY_TABS; + +/** + * Returns the persisted-shape parameter entries currently held by the active tab. + * + * @alpha + */ +export const selectDashboardParameters: DashboardSelector = createSelector( + selectParametersState, + (state) => state.parameters.map((entry) => entry.parameter), +); + +/** + * Returns currently active parameter references on the active tab. + * + * @alpha + */ +export const selectActiveParameterRefKeys: DashboardSelector> = createSelector( + selectDashboardParameters, + (parameters) => new Set(parameters.map((parameter) => objRefToString(parameter.ref))), +); + +/** + * Returns the full per-parameter entries (persisted shape + ephemeral `runtimeOverride`) for the + * active tab. + * + * @internal + */ +export const selectDashboardParameterEntries: DashboardSelector = createSelector( + selectParametersState, + (state) => state.parameters, +); + +/** + * Returns a selector that yields the entry held by the active tab for a given parameter ref, + * or `undefined` if no such entry exists. + * + * @alpha + */ +export const selectDashboardParameterEntryByRef: ( + ref: ObjRef, +) => DashboardSelector = createMemoizedSelector((ref: ObjRef) => + createSelector(selectParametersState, (state) => + state.parameters.find((item) => areObjRefsEqual(item.parameter.ref, ref)), + ), +); + +/** + * Returns a selector that yields the current `runtimeOverride` for a given parameter ref on the + * active tab, or `undefined` if the active tab does not hold an entry for that ref. + * + * @alpha + */ +export const selectParameterRuntimeOverrideByRef: (ref: ObjRef) => DashboardSelector = + createMemoizedSelector((ref: ObjRef) => + createSelector(selectDashboardParameterEntryByRef(ref), (entry) => entry?.runtimeOverride), + ); + +/** + * Computes the dashboard parameters keyed by tab `localIdentifier` in the shape that would be + * persisted on save right now. + * + * @remarks + * Smart persistence applies independently per tab: `value` is dropped when equal to the + * workspace default, `label` is dropped when equal to the parameter title, all per tab. + * Non-resolved entries (catalog not loaded, gated off, ref missing) are emitted verbatim from + * the previously persisted entry on the same tab when available. V1 fallback applies when no + * tab in the persisted dashboard carries `parameters` — the persisted root array is used as the + * persistence source for every tab. + * + * @internal + */ +export const selectSmartPersistedTabsParameters: DashboardSelector> = + createSelector( + selectTabs, + selectCatalogParameters, + selectCatalogParametersIsLoaded, + selectPersistedDashboardTabsRaw, + selectPersistedParametersFromMeta, + (tabs, workspaceParameters, isCatalogLoaded, persistedTabs, rootPersistedParameters) => { + const result: Record = {}; + if (!tabs) { + return result; + } + const workspaceByRef = new Map(workspaceParameters.map((wp) => [objRefToString(wp.ref), wp])); + const persistedByTabAndRef = buildPersistedByTabAndRef(persistedTabs, rootPersistedParameters); + for (const tab of tabs) { + const entries = tab.parameters?.parameters ?? []; + const persistedForTab = persistedByTabAndRef.get(tab.localIdentifier) ?? new Map(); + result[tab.localIdentifier] = entries.map((entry) => { + const refKey = objRefToString(entry.parameter.ref); + const workspaceParameter = isCatalogLoaded ? workspaceByRef.get(refKey) : undefined; + if (!workspaceParameter) { + return persistedForTab.get(refKey) ?? entry.parameter; + } + return smartPersistResolvedEntry(entry, workspaceParameter); + }); + } + return result; + }, + ); + +/** + * Returns persisted parameters from `meta.persistedDashboard`, keyed by tab `localIdentifier`. + * Honors V1 → per-tab migration: when no tab in the persisted dashboard carries `parameters`, + * the persisted root `parameters` is used as fallback for every tab. For legacy single-tab + * dashboards (no `tabs[]` in persistedDashboard), the synthetic `DEFAULT_TAB_ID` tab carries + * the persisted root parameters. + * + * @internal + */ +const selectPersistedTabsParametersFromMeta: DashboardSelector> = + createSelector( + selectPersistedDashboardTabsRaw, + selectPersistedParametersFromMeta, + (persistedTabs, rootPersistedParameters) => { + const result: Record = {}; + if (persistedTabs.length === 0) { + result[DEFAULT_TAB_ID] = rootPersistedParameters; + return result; + } + for (const tab of persistedTabs) { + result[tab.localIdentifier] = + pickTabParametersSource(tab, persistedTabs, rootPersistedParameters) ?? EMPTY_PARAMETERS; + } + return result; + }, + ); + +/** + * Returns true if the dashboard parameters that would be persisted differ from the persisted + * version on any tab. + * + * @alpha + */ +export const selectIsParametersChanged: DashboardSelector = createSelector( + selectSmartPersistedTabsParameters, + selectPersistedTabsParametersFromMeta, + (smartPersistedByTab, persistedByTab) => { + const allTabIds = new Set([...Object.keys(smartPersistedByTab), ...Object.keys(persistedByTab)]); + for (const tabId of allTabIds) { + const smart = smartPersistedByTab[tabId] ?? EMPTY_PARAMETERS; + const persisted = persistedByTab[tabId] ?? EMPTY_PARAMETERS; + if (!isEqual(smart, persisted)) { + return true; + } + } + return false; + }, +); + +/** + * Returns the parameter values to inject into the widget's `IExecutionConfig.parameterValues`. + * + * @remarks + * The widget's owning tab is resolved from layout, then the result is the intersection of that + * tab's parameter entries and the parameters referenced by the widget's insight (per + * `insightParameters`). Dashboard parameters not referenced by the widget's insight are excluded + * so that adding/removing unrelated parameters does not invalidate the widget's `defFingerprint`. + * Returns an empty array when `enableParameters` is off so persisted parameter values cannot + * silently affect execution while the UI is hidden. + * + * @alpha + */ +export const selectEffectiveParameterValuesForWidget: ( + ref: ObjRef | undefined, +) => DashboardSelector = createMemoizedSelector((ref: ObjRef | undefined) => + createSelector( + selectParameterExecutionContextByWidgetRef(ref), + selectInsightsMap, + selectEnableParameters, + (context, insights, isEnabled) => { + if (!isEnabled || !context) { + return []; + } + const insight = insights.get(context.widget.insight); + if (!insight) { + return []; + } + const entries = context.tab.parameters?.parameters ?? parametersInitialState.parameters; + const referencedRefs = new Set( + insightParameters(insight).map((parameter) => objRefToString(parameter.ref)), + ); + const result: IInsightParameterValue[] = []; + for (const entry of entries) { + if (entry.runtimeOverride === undefined) { + continue; + } + if (referencedRefs.has(objRefToString(entry.parameter.ref))) { + result.push({ ref: entry.parameter.ref, value: entry.runtimeOverride }); + } + } + return result; + }, + ), +); + +interface IParameterExecutionContext { + tab: ITabState; + widget: IInsightWidget; +} + +const selectParameterExecutionContextByWidgetRef: ( + ref: ObjRef | undefined, +) => DashboardSelector = createMemoizedSelector( + (ref: ObjRef | undefined) => + createSelector(selectTabs, (tabs) => findParameterExecutionContext(tabs, ref)), +); + +function findParameterExecutionContext( + tabs: ITabState[] | undefined, + ref: ObjRef | undefined, +): IParameterExecutionContext | undefined { + if (!ref || !tabs) { + return undefined; + } + + for (const tab of tabs) { + const layout = tab.layout?.layout; + if (!layout) { + continue; + } + + const widget = findInsightWidgetInLayout(layout, ref); + if (widget) { + return { tab, widget }; + } + } + + return undefined; +} + +function findInsightWidgetInLayout( + layout: IDashboardLayout, + ref: ObjRef, +): IInsightWidget | undefined { + for (const section of layout.sections) { + for (const item of section.items) { + const widget = item.widget; + if (!widget) { + continue; + } + + if (isInsightWidget(widget) && areObjRefsEqual(widget.ref, ref)) { + return widget; + } + + if (isDashboardLayout(widget)) { + const nestedWidget = findInsightWidgetInLayout(widget, ref); + if (nestedWidget) { + return nestedWidget; + } + } + + if (isVisualizationSwitcherWidget(widget)) { + const visualization = widget.visualizations.find((visualization) => + areObjRefsEqual(visualization.ref, ref), + ); + if (visualization) { + return visualization; + } + } + } + } + + return undefined; +} + +function buildPersistedByTabAndRef( + persistedTabs: ReadonlyArray, + rootPersistedParameters: IDashboardParameter[], +): Map> { + const result = new Map>(); + for (const tab of persistedTabs) { + const sourceParameters = + pickTabParametersSource(tab, persistedTabs, rootPersistedParameters) ?? EMPTY_PARAMETERS; + result.set( + tab.localIdentifier, + new Map(sourceParameters.map((parameter) => [objRefToString(parameter.ref), parameter])), + ); + } + return result; +} + +function smartPersistResolvedEntry( + entry: IDashboardParameterEntry, + workspaceParameter: IParameterMetadataObject, +): IDashboardParameter { + const workspaceDefault = isNumberParameterDefinition(workspaceParameter.definition) + ? workspaceParameter.definition.defaultValue + : undefined; + const result: IDashboardParameter = { + ref: entry.parameter.ref, + parameterType: entry.parameter.parameterType, + mode: entry.parameter.mode, + ...labelOverride(entry, workspaceParameter), + }; + if (entry.runtimeOverride === undefined || entry.runtimeOverride === workspaceDefault) { + return result; + } + return { ...result, value: entry.runtimeOverride }; +} + +function labelOverride( + entry: IDashboardParameterEntry, + workspaceParameter: IParameterMetadataObject, +): { label?: string } { + if (entry.parameter.label && entry.parameter.label !== workspaceParameter.title) { + return { label: entry.parameter.label }; + } + return {}; +} diff --git a/libs/sdk-ui-dashboard/src/model/store/parameters/parametersState.ts b/libs/sdk-ui-dashboard/src/model/store/tabs/parameters/parametersState.ts similarity index 57% rename from libs/sdk-ui-dashboard/src/model/store/parameters/parametersState.ts rename to libs/sdk-ui-dashboard/src/model/store/tabs/parameters/parametersState.ts index 39f3156814b..7803b9e30b5 100644 --- a/libs/sdk-ui-dashboard/src/model/store/parameters/parametersState.ts +++ b/libs/sdk-ui-dashboard/src/model/store/tabs/parameters/parametersState.ts @@ -1,6 +1,6 @@ // (C) 2026 GoodData Corporation -import { type IDashboardParameter } from "@gooddata/sdk-model"; +import { type IDashboardParameter, type IDashboardTab } from "@gooddata/sdk-model"; /** * Per-parameter state tracked by the dashboard store. @@ -33,3 +33,24 @@ export interface IParametersState { export const parametersInitialState: IParametersState = { parameters: [], }; + +/** + * Picks a tab's persisted parameter source under the V1 → per-tab migration rule. + * + * - If the tab has its own `parameters` (including `[]`) → return it. + * - Else if every tab's `parameters === undefined` AND root `parameters` is defined → root array. + * - Else → `undefined`. + * + * @internal + */ +export function pickTabParametersSource( + tab: IDashboardTab, + allTabs: ReadonlyArray, + rootParameters: IDashboardParameter[] | undefined, +): IDashboardParameter[] | undefined { + if (tab.parameters !== undefined) { + return tab.parameters; + } + const everyTabUndefined = allTabs.length > 0 && allTabs.every((other) => other.parameters === undefined); + return everyTabUndefined ? rootParameters : undefined; +} diff --git a/libs/sdk-ui-dashboard/src/model/store/tabs/parameters/tests/parametersReducers.test.ts b/libs/sdk-ui-dashboard/src/model/store/tabs/parameters/tests/parametersReducers.test.ts new file mode 100644 index 00000000000..f790757ce83 --- /dev/null +++ b/libs/sdk-ui-dashboard/src/model/store/tabs/parameters/tests/parametersReducers.test.ts @@ -0,0 +1,191 @@ +// (C) 2026 GoodData Corporation + +import { produce } from "immer"; +import { describe, expect, it } from "vitest"; + +import { type IDashboardParameter, idRef } from "@gooddata/sdk-model"; + +import { tabsActions } from "../../index.js"; +import { type ITabsState } from "../../tabsState.js"; +import { parametersReducers } from "../parametersReducers.js"; +import { type IParametersState } from "../parametersState.js"; + +const topNRef = idRef("topN", "parameter"); +const sampleRef = idRef("sampleSize", "parameter"); + +const topNParameter: IDashboardParameter = { + ref: topNRef, + parameterType: "NUMBER", + mode: "active", +}; + +const topNPinned: IDashboardParameter = { + ref: topNRef, + parameterType: "NUMBER", + mode: "active", + value: 25, +}; + +function makeState(parameters?: IParametersState["parameters"]): ITabsState { + return { + tabs: [ + { + localIdentifier: "tab-1", + title: "Tab 1", + parameters: parameters ? { parameters } : undefined, + }, + ], + activeTabLocalIdentifier: "tab-1", + }; +} + +function activeParameters(state: ITabsState): IParametersState["parameters"] { + return state.tabs?.[0]?.parameters?.parameters ?? []; +} + +describe("parameters reducers (per tab)", () => { + describe("addParameter", () => { + it("adds entry initialized to workspace default when value not pinned", () => { + const initial = makeState(); + + const next = produce(initial, (draft) => + parametersReducers.addParameter( + draft, + tabsActions.addParameter({ parameter: topNParameter, workspaceDefault: 10 }), + ), + ); + + expect(activeParameters(next as ITabsState)).toEqual([ + { parameter: topNParameter, runtimeOverride: 10 }, + ]); + }); + + it("adds entry initialized to pinned value when present", () => { + const initial = makeState(); + + const next = produce(initial, (draft) => + parametersReducers.addParameter( + draft, + tabsActions.addParameter({ parameter: topNPinned, workspaceDefault: 10 }), + ), + ); + + expect(activeParameters(next as ITabsState)).toEqual([ + { parameter: topNPinned, runtimeOverride: 25 }, + ]); + }); + + it("ignores duplicate refs (picker dedup) within the active tab", () => { + const initial = makeState(); + + const once = produce(initial, (draft) => + parametersReducers.addParameter( + draft, + tabsActions.addParameter({ parameter: topNParameter, workspaceDefault: 10 }), + ), + ); + const twice = produce(once, (draft) => + parametersReducers.addParameter( + draft, + tabsActions.addParameter({ parameter: topNParameter, workspaceDefault: 50 }), + ), + ); + + expect(activeParameters(twice as ITabsState)).toHaveLength(1); + expect(activeParameters(twice as ITabsState)[0]?.runtimeOverride).toBe(10); + }); + + it("only writes to the active tab", () => { + const initial: ITabsState = { + tabs: [ + { localIdentifier: "tab-1", title: "Tab 1" }, + { localIdentifier: "tab-2", title: "Tab 2" }, + ], + activeTabLocalIdentifier: "tab-2", + }; + + const next = produce(initial, (draft) => + parametersReducers.addParameter( + draft, + tabsActions.addParameter({ parameter: topNParameter, workspaceDefault: 10 }), + ), + ); + + expect(next.tabs?.[0]?.parameters).toBeUndefined(); + expect(next.tabs?.[1]?.parameters?.parameters).toEqual([ + { parameter: topNParameter, runtimeOverride: 10 }, + ]); + }); + }); + + describe("setParameterRuntimeValue", () => { + it("updates only runtimeOverride on the active tab, leaves persisted entry untouched", () => { + const initial = makeState([{ parameter: topNParameter, runtimeOverride: 10 }]); + + const next = produce(initial, (draft) => + parametersReducers.setParameterRuntimeValue( + draft, + tabsActions.setParameterRuntimeValue({ ref: topNRef, value: 99 }), + ), + ); + + expect(activeParameters(next as ITabsState)[0]?.parameter).toEqual(topNParameter); + expect(activeParameters(next as ITabsState)[0]?.runtimeOverride).toBe(99); + }); + + it("is a no-op when ref is unknown on the active tab", () => { + const initial = makeState([{ parameter: topNParameter, runtimeOverride: 10 }]); + + const next = produce(initial, (draft) => + parametersReducers.setParameterRuntimeValue( + draft, + tabsActions.setParameterRuntimeValue({ ref: sampleRef, value: 99 }), + ), + ); + + expect(activeParameters(next as ITabsState)).toEqual([ + { parameter: topNParameter, runtimeOverride: 10 }, + ]); + }); + + it("setting runtime override on tab A does not change tab B's value for the same ref", () => { + const initial: ITabsState = { + tabs: [ + { + localIdentifier: "tab-A", + title: "Tab A", + parameters: { parameters: [{ parameter: topNParameter, runtimeOverride: 10 }] }, + }, + { + localIdentifier: "tab-B", + title: "Tab B", + parameters: { parameters: [{ parameter: topNParameter, runtimeOverride: 10 }] }, + }, + ], + activeTabLocalIdentifier: "tab-A", + }; + + const next = produce(initial, (draft) => + parametersReducers.setParameterRuntimeValue( + draft, + tabsActions.setParameterRuntimeValue({ ref: topNRef, value: 99 }), + ), + ); + + expect(next.tabs?.[0]?.parameters?.parameters[0]?.runtimeOverride).toBe(99); + expect(next.tabs?.[1]?.parameters?.parameters[0]?.runtimeOverride).toBe(10); + }); + }); + + describe("removeParameter", () => { + it("filters out the entry by ref from the active tab", () => { + const initial = makeState([{ parameter: topNParameter, runtimeOverride: 10 }]); + + const next = produce(initial, (draft) => + parametersReducers.removeParameter(draft, tabsActions.removeParameter({ ref: topNRef })), + ); + + expect(activeParameters(next as ITabsState)).toEqual([]); + }); + }); +}); diff --git a/libs/sdk-ui-dashboard/src/model/store/tabs/parameters/tests/parametersSelectors.test.ts b/libs/sdk-ui-dashboard/src/model/store/tabs/parameters/tests/parametersSelectors.test.ts new file mode 100644 index 00000000000..be14761095c --- /dev/null +++ b/libs/sdk-ui-dashboard/src/model/store/tabs/parameters/tests/parametersSelectors.test.ts @@ -0,0 +1,598 @@ +// (C) 2026 GoodData Corporation + +import { describe, expect, it } from "vitest"; + +import { + type IDashboard, + type IDashboardParameter, + type IInsight, + type IInsightParameterValue, + type IParameterMetadataObject, + type ObjRef, + idRef, + objRefToString, +} from "@gooddata/sdk-model"; + +import { insightsAdapter } from "../../../insights/insightsEntityAdapter.js"; +import { type DashboardState } from "../../../types.js"; +import { + selectActiveParameterRefKeys, + selectDashboardParameterEntries, + selectDashboardParameters, + selectEffectiveParameterValuesForWidget, + selectIsParametersChanged, + selectParameterRuntimeOverrideByRef, + selectSmartPersistedTabsParameters, +} from "../parametersSelectors.js"; +import { type IDashboardParameterEntry } from "../parametersState.js"; + +function makeInsight(ref: ObjRef, parameters: IInsightParameterValue[]): IInsight { + const identifier = (ref as { identifier?: string }).identifier ?? "insight"; + return { + insight: { + ref, + identifier, + uri: `/insights/${identifier}`, + title: identifier, + visualizationUrl: "local:test", + buckets: [], + filters: [], + sorts: [], + properties: {}, + parameters, + }, + } as unknown as IInsight; +} + +function makeInsightsSliceState(insights: IInsight[]) { + return insightsAdapter.setAll(insightsAdapter.getInitialState(), insights); +} + +const BACKEND_CAPABILITIES: DashboardState["backendCapabilities"] = { + backendCapabilities: { + hasTypeScopedIdentifiers: false, + } as DashboardState["backendCapabilities"]["backendCapabilities"], +}; + +const topNRef = idRef("topN", "parameter"); +const otherRef = idRef("sampleSize", "parameter"); + +const topNParameter: IDashboardParameter = { + ref: topNRef, + parameterType: "NUMBER", + mode: "active", +}; + +const topNWorkspace: IParameterMetadataObject = { + type: "parameter", + id: "topN", + uri: "/topN", + ref: topNRef, + title: "Top N", + description: "", + production: true, + deprecated: false, + unlisted: false, + definition: { type: "NUMBER", defaultValue: 10 }, +}; + +const entry: IDashboardParameterEntry = { + parameter: topNParameter, + runtimeOverride: 25, +}; + +function makeState(parameters: IDashboardParameterEntry[]): DashboardState { + return { + tabs: { + tabs: [ + { + localIdentifier: "tab-1", + title: "Tab 1", + parameters: { parameters }, + }, + ], + activeTabLocalIdentifier: "tab-1", + }, + } as unknown as DashboardState; +} + +interface IFullStateOptions { + entries: IDashboardParameterEntry[]; + workspaceParameters?: IParameterMetadataObject[]; + catalogStatus?: "loaded" | "loading" | "failed" | "gated-off" | "uninitialized"; + persistedDashboardParameters?: IDashboardParameter[]; + enableParameters?: boolean; + insights?: IInsight[]; +} + +const TAB_ID = "tab-1"; +const W1_REF = { identifier: "w-1", type: "insight" } as const; +const W1_INSIGHT_REF = idRef("insight-1", "insight"); + +function makeFullState({ + entries, + workspaceParameters = [], + catalogStatus = "loaded", + persistedDashboardParameters, + enableParameters = true, + insights = [], +}: IFullStateOptions): DashboardState { + const persistedDashboard: Partial | undefined = + persistedDashboardParameters === undefined + ? undefined + : ({ + parameters: persistedDashboardParameters, + tabs: [ + { + localIdentifier: TAB_ID, + title: "Tab 1", + parameters: persistedDashboardParameters, + }, + ], + } as Partial); + return { + tabs: { + tabs: [ + { + localIdentifier: TAB_ID, + title: "Tab 1", + parameters: { parameters: entries }, + layout: { + layout: { + type: "IDashboardLayout", + sections: [ + { + type: "IDashboardLayoutSection", + items: [ + { + type: "IDashboardLayoutItem", + size: { xl: { gridWidth: 12 } }, + widget: { + type: "insight", + identifier: "w-1", + ref: W1_REF, + insight: W1_INSIGHT_REF, + }, + }, + ], + }, + ], + }, + }, + }, + ], + activeTabLocalIdentifier: TAB_ID, + }, + insights: makeInsightsSliceState(insights), + backendCapabilities: BACKEND_CAPABILITIES, + catalog: { + parameters: { status: catalogStatus, parameters: workspaceParameters }, + }, + meta: { persistedDashboard }, + config: { config: { settings: { enableParameters } } }, + } as unknown as DashboardState; +} + +describe("parameter selectors (per tab)", () => { + it("selectDashboardParameters returns persisted-shape entries from active tab", () => { + expect(selectDashboardParameters(makeState([entry]))).toEqual([topNParameter]); + }); + + it("selectDashboardParameterEntries returns full entries from active tab", () => { + expect(selectDashboardParameterEntries(makeState([entry]))).toEqual([entry]); + }); + + it("selectParameterRuntimeOverrideByRef returns runtimeOverride for matching ref", () => { + const select = selectParameterRuntimeOverrideByRef(topNRef); + expect(select(makeState([entry]))).toBe(25); + }); + + it("selectParameterRuntimeOverrideByRef returns undefined when ref absent", () => { + const select = selectParameterRuntimeOverrideByRef(otherRef); + expect(select(makeState([entry]))).toBeUndefined(); + }); + + describe("selectSmartPersistedTabsParameters", () => { + it("omits value when runtimeOverride equals workspace default (per tab)", () => { + const state = makeFullState({ + entries: [{ parameter: topNParameter, runtimeOverride: 10 }], + workspaceParameters: [topNWorkspace], + }); + expect(selectSmartPersistedTabsParameters(state)).toEqual({ + [TAB_ID]: [{ ref: topNRef, parameterType: "NUMBER", mode: "active" }], + }); + }); + + it("emits value when runtimeOverride differs from workspace default (per tab)", () => { + const state = makeFullState({ + entries: [{ parameter: topNParameter, runtimeOverride: 25 }], + workspaceParameters: [topNWorkspace], + }); + expect(selectSmartPersistedTabsParameters(state)).toEqual({ + [TAB_ID]: [{ ref: topNRef, parameterType: "NUMBER", mode: "active", value: 25 }], + }); + }); + + it("omits label when equal to workspace title", () => { + const state = makeFullState({ + entries: [{ parameter: { ...topNParameter, label: "Top N" }, runtimeOverride: 10 }], + workspaceParameters: [topNWorkspace], + }); + expect(selectSmartPersistedTabsParameters(state)).toEqual({ + [TAB_ID]: [{ ref: topNRef, parameterType: "NUMBER", mode: "active" }], + }); + }); + + it("preserves label when different from workspace title", () => { + const state = makeFullState({ + entries: [{ parameter: { ...topNParameter, label: "Custom Label" }, runtimeOverride: 10 }], + workspaceParameters: [topNWorkspace], + }); + expect(selectSmartPersistedTabsParameters(state)).toEqual({ + [TAB_ID]: [{ ref: topNRef, parameterType: "NUMBER", mode: "active", label: "Custom Label" }], + }); + }); + + it("emits non-resolved entry verbatim from persisted when catalog status is not loaded", () => { + const persisted: IDashboardParameter = { + ref: topNRef, + parameterType: "NUMBER", + mode: "active", + value: 99, + }; + const state = makeFullState({ + entries: [{ parameter: topNParameter, runtimeOverride: 25 }], + catalogStatus: "gated-off", + persistedDashboardParameters: [persisted], + }); + expect(selectSmartPersistedTabsParameters(state)).toEqual({ [TAB_ID]: [persisted] }); + }); + + it("emits non-resolved entry verbatim when ref absent from loaded catalog", () => { + const persisted: IDashboardParameter = { + ref: topNRef, + parameterType: "NUMBER", + mode: "active", + value: 99, + }; + const state = makeFullState({ + entries: [{ parameter: topNParameter, runtimeOverride: 25 }], + workspaceParameters: [], + persistedDashboardParameters: [persisted], + }); + expect(selectSmartPersistedTabsParameters(state)).toEqual({ [TAB_ID]: [persisted] }); + }); + + it("falls back to live entry when non-resolved and no persisted entry on the same tab", () => { + const state = makeFullState({ + entries: [{ parameter: topNParameter, runtimeOverride: 25 }], + catalogStatus: "gated-off", + }); + expect(selectSmartPersistedTabsParameters(state)).toEqual({ [TAB_ID]: [topNParameter] }); + }); + }); + + describe("selectIsParametersChanged", () => { + it("is false when smart-persisted matches persisted", () => { + const state = makeFullState({ + entries: [{ parameter: topNParameter, runtimeOverride: 10 }], + workspaceParameters: [topNWorkspace], + persistedDashboardParameters: [{ ref: topNRef, parameterType: "NUMBER", mode: "active" }], + }); + expect(selectIsParametersChanged(state)).toBe(false); + }); + + it("is true when runtimeOverride diverges from persisted value", () => { + const state = makeFullState({ + entries: [{ parameter: topNParameter, runtimeOverride: 99 }], + workspaceParameters: [topNWorkspace], + persistedDashboardParameters: [{ ref: topNRef, parameterType: "NUMBER", mode: "active" }], + }); + expect(selectIsParametersChanged(state)).toBe(true); + }); + + it("is true when entry added", () => { + const state = makeFullState({ + entries: [{ parameter: topNParameter, runtimeOverride: 10 }], + workspaceParameters: [topNWorkspace], + persistedDashboardParameters: [], + }); + expect(selectIsParametersChanged(state)).toBe(true); + }); + + it("is false when no persisted dashboard and no entries", () => { + const state = makeFullState({ + entries: [], + workspaceParameters: [], + }); + expect(selectIsParametersChanged(state)).toBe(false); + }); + }); + + describe("selectEffectiveParameterValuesForWidget", () => { + const widgetRef = W1_REF; + const sampleSizeRef = idRef("sampleSize", "parameter"); + const insightWithTopN: IInsight = makeInsight(W1_INSIGHT_REF, [{ ref: topNRef, value: 0 }]); + + it("returns runtimeOverride for parameters referenced by the insight", () => { + const state = makeFullState({ + entries: [{ parameter: topNParameter, runtimeOverride: 25 }], + insights: [insightWithTopN], + }); + expect(selectEffectiveParameterValuesForWidget(widgetRef)(state)).toEqual([ + { ref: topNRef, value: 25 }, + ]); + }); + + it("excludes dashboard parameters not referenced by the insight", () => { + const sampleSize: IDashboardParameter = { + ref: sampleSizeRef, + parameterType: "NUMBER", + mode: "active", + }; + const state = makeFullState({ + entries: [ + { parameter: topNParameter, runtimeOverride: 25 }, + { parameter: sampleSize, runtimeOverride: 99 }, + ], + insights: [insightWithTopN], + }); + expect(selectEffectiveParameterValuesForWidget(widgetRef)(state)).toEqual([ + { ref: topNRef, value: 25 }, + ]); + }); + + it("returns identical reference when an unrelated parameter is added (defFingerprint stability)", () => { + const stateWithoutUnrelated = makeFullState({ + entries: [{ parameter: topNParameter, runtimeOverride: 25 }], + insights: [insightWithTopN], + }); + const sampleSize: IDashboardParameter = { + ref: sampleSizeRef, + parameterType: "NUMBER", + mode: "active", + }; + const stateWithUnrelated = makeFullState({ + entries: [ + { parameter: topNParameter, runtimeOverride: 25 }, + { parameter: sampleSize, runtimeOverride: 99 }, + ], + insights: [insightWithTopN], + }); + expect(selectEffectiveParameterValuesForWidget(widgetRef)(stateWithoutUnrelated)).toEqual( + selectEffectiveParameterValuesForWidget(widgetRef)(stateWithUnrelated), + ); + }); + + it("returns empty array when widget has no insight", () => { + const missingRef = idRef("missing", "insight"); + const state = makeFullState({ + entries: [{ parameter: topNParameter, runtimeOverride: 25 }], + }); + expect(selectEffectiveParameterValuesForWidget(missingRef)(state)).toEqual([]); + }); + + it("returns empty array when enableParameters is off", () => { + const state = makeFullState({ + entries: [{ parameter: topNParameter, runtimeOverride: 25 }], + enableParameters: false, + insights: [insightWithTopN], + }); + expect(selectEffectiveParameterValuesForWidget(widgetRef)(state)).toEqual([]); + }); + + it("resolves the owning tab for an insight nested in a visualization switcher", () => { + const switcherChildRef = idRef("switcher-child", "insight"); + const switcherChildInsightRef = idRef("switcher-child-insight", "insight"); + const state = { + tabs: { + tabs: [ + { + localIdentifier: TAB_ID, + title: "Tab 1", + parameters: { + parameters: [{ parameter: topNParameter, runtimeOverride: 42 }], + }, + layout: { + layout: { + type: "IDashboardLayout", + sections: [ + { + type: "IDashboardLayoutSection", + items: [ + { + type: "IDashboardLayoutItem", + size: { xl: { gridWidth: 12 } }, + widget: { + type: "visualizationSwitcher", + identifier: "switcher-1", + ref: { identifier: "switcher-1", type: "insight" }, + visualizations: [ + { + type: "insight", + identifier: "switcher-child", + ref: switcherChildRef, + insight: switcherChildInsightRef, + }, + ], + }, + }, + ], + }, + ], + }, + }, + }, + ], + activeTabLocalIdentifier: TAB_ID, + }, + insights: makeInsightsSliceState([ + makeInsight(switcherChildInsightRef, [{ ref: topNRef, value: 0 }]), + ]), + backendCapabilities: BACKEND_CAPABILITIES, + catalog: { parameters: { status: "loaded", parameters: [] } }, + meta: { persistedDashboard: undefined }, + config: { config: { settings: { enableParameters: true } } }, + } as unknown as DashboardState; + + expect(selectEffectiveParameterValuesForWidget(switcherChildRef)(state)).toEqual([ + { ref: topNRef, value: 42 }, + ]); + }); + }); + + describe("per-tab independence (acceptance tests)", () => { + const widgetA = { identifier: "w-A", type: "insight" } as const; + const widgetB = { identifier: "w-B", type: "insight" } as const; + const insightARef = idRef("insight-A", "insight"); + const insightBRef = idRef("insight-B", "insight"); + const insightAWithTopN = makeInsight(insightARef, [{ ref: topNRef, value: 0 }]); + const insightBWithTopN = makeInsight(insightBRef, [{ ref: topNRef, value: 0 }]); + + function makeTwoTabState({ + tabAEntries, + tabBEntries, + workspaceParameters = [topNWorkspace], + enableParameters = true, + insights = [], + }: { + tabAEntries: IDashboardParameterEntry[]; + tabBEntries: IDashboardParameterEntry[]; + workspaceParameters?: IParameterMetadataObject[]; + enableParameters?: boolean; + insights?: IInsight[]; + }): DashboardState { + return { + tabs: { + tabs: [ + { + localIdentifier: "tab-A", + title: "Tab A", + parameters: { parameters: tabAEntries }, + layout: { + layout: { + type: "IDashboardLayout", + sections: [ + { + type: "IDashboardLayoutSection", + items: [ + { + type: "IDashboardLayoutItem", + size: { xl: { gridWidth: 12 } }, + widget: { + type: "insight", + identifier: "w-A", + ref: widgetA, + insight: insightARef, + }, + }, + ], + }, + ], + }, + }, + }, + { + localIdentifier: "tab-B", + title: "Tab B", + parameters: { parameters: tabBEntries }, + layout: { + layout: { + type: "IDashboardLayout", + sections: [ + { + type: "IDashboardLayoutSection", + items: [ + { + type: "IDashboardLayoutItem", + size: { xl: { gridWidth: 12 } }, + widget: { + type: "insight", + identifier: "w-B", + ref: widgetB, + insight: insightBRef, + }, + }, + ], + }, + ], + }, + }, + }, + ], + activeTabLocalIdentifier: "tab-A", + }, + insights: makeInsightsSliceState(insights), + backendCapabilities: BACKEND_CAPABILITIES, + catalog: { parameters: { status: "loaded", parameters: workspaceParameters } }, + meta: { persistedDashboard: undefined }, + config: { config: { settings: { enableParameters } } }, + } as unknown as DashboardState; + } + + it("per-tab widget execution — widget on tab A consumes tab A's runtime, widget on tab B does not", () => { + // Both widgets reference param topN via insight, but only tab A has it added. + const state = makeTwoTabState({ + tabAEntries: [{ parameter: topNParameter, runtimeOverride: 25 }], + tabBEntries: [], + insights: [insightAWithTopN, insightBWithTopN], + }); + + expect(selectEffectiveParameterValuesForWidget(widgetA)(state)).toEqual([ + { ref: topNRef, value: 25 }, + ]); + expect(selectEffectiveParameterValuesForWidget(widgetB)(state)).toEqual([]); + }); + + it("widgets on different tabs see their own tab's runtimeOverride", () => { + const state = makeTwoTabState({ + tabAEntries: [{ parameter: topNParameter, runtimeOverride: 25 }], + tabBEntries: [{ parameter: topNParameter, runtimeOverride: 99 }], + insights: [insightAWithTopN, insightBWithTopN], + }); + + expect(selectEffectiveParameterValuesForWidget(widgetA)(state)).toEqual([ + { ref: topNRef, value: 25 }, + ]); + expect(selectEffectiveParameterValuesForWidget(widgetB)(state)).toEqual([ + { ref: topNRef, value: 99 }, + ]); + }); + + it("resolves insight for a widget on a non-active tab (cross-tab insight lookup)", () => { + // Regression: widget B lives on tab B (not active). With active-only insight resolution, + // the selector would return [] regardless of tab B's runtimeOverride. Cross-tab lookup + // must return the override defined on tab B. + const state = makeTwoTabState({ + tabAEntries: [], + tabBEntries: [{ parameter: topNParameter, runtimeOverride: 77 }], + insights: [insightAWithTopN, insightBWithTopN], + }); + + expect(selectEffectiveParameterValuesForWidget(widgetB)(state)).toEqual([ + { ref: topNRef, value: 77 }, + ]); + }); + + it("per-tab picker deduplication — active tab dedup ignores other tabs", () => { + // selectActiveParameterRefKeys reflects only the active tab's parameters. + const stateActiveOnA = makeTwoTabState({ + tabAEntries: [{ parameter: topNParameter, runtimeOverride: 25 }], + tabBEntries: [], + }); + const tabAKeys = selectActiveParameterRefKeys(stateActiveOnA); + expect(tabAKeys.has(objRefToString(topNRef))).toBe(true); + + // Switching active tab — same selector now returns tab B's keys (empty). + const stateActiveOnB: DashboardState = { + ...stateActiveOnA, + tabs: { + ...(stateActiveOnA.tabs as unknown as Record), + activeTabLocalIdentifier: "tab-B", + }, + } as unknown as DashboardState; + const tabBKeys = selectActiveParameterRefKeys(stateActiveOnB); + expect(tabBKeys.has(objRefToString(topNRef))).toBe(false); + }); + }); +}); diff --git a/libs/sdk-ui-dashboard/src/model/store/tabs/tabsState.ts b/libs/sdk-ui-dashboard/src/model/store/tabs/tabsState.ts index 503164ba1d2..126044d3869 100644 --- a/libs/sdk-ui-dashboard/src/model/store/tabs/tabsState.ts +++ b/libs/sdk-ui-dashboard/src/model/store/tabs/tabsState.ts @@ -9,6 +9,7 @@ import { type IDateFilterConfigsState } from "./dateFilterConfigs/dateFilterConf import type { FilterContextState } from "./filterContext/filterContextState.js"; import type { ILayoutState } from "./layout/layoutState.js"; import { type IMeasureValueFilterConfigsState } from "./measureValueFilterConfigs/measureValueFilterConfigsState.js"; +import { type IParametersState } from "./parameters/parametersState.js"; /** * Identifier used for dashboards without explicit tabs support and the first tab created automatically. @@ -57,6 +58,7 @@ export interface ITabState { filterContext?: FilterContextState; filterGroupsConfig?: IDashboardFilterGroupsConfig; layout?: ILayoutState; + parameters?: IParametersState; /** * UI-only flag indicating the tab is currently being renamed. diff --git a/libs/sdk-ui-dashboard/src/model/store/types.ts b/libs/sdk-ui-dashboard/src/model/store/types.ts index 01810b8a9a4..6caac603397 100644 --- a/libs/sdk-ui-dashboard/src/model/store/types.ts +++ b/libs/sdk-ui-dashboard/src/model/store/types.ts @@ -22,7 +22,6 @@ import { type IFilterViewsState } from "./filterViews/filterViewsState.js"; import { type ILoadingState } from "./loading/loadingState.js"; import { type IDashboardMetaState } from "./meta/metaState.js"; import { type INotificationChannelsState } from "./notificationChannels/notificationChannelsState.js"; -import { type IParametersState } from "./parameters/parametersState.js"; import { type PermissionsState } from "./permissions/permissionsState.js"; import { type IRenderModeState } from "./renderMode/renderModeState.js"; import { type SavingState } from "./saving/savingState.js"; @@ -92,12 +91,6 @@ export type DashboardState = { /** @alpha */ notificationChannels: INotificationChannelsState; - /** - * Dashboard-level parameter overrides slice. - * @alpha - */ - parameters: IParametersState; - /** * Internal state for dashboard summary AI workflow. * diff --git a/libs/sdk-ui-dashboard/src/presentation/dragAndDrop/draggableParameterFilter/DefaultParameterDraggingComponent.tsx b/libs/sdk-ui-dashboard/src/presentation/dragAndDrop/draggableParameterFilter/DefaultParameterDraggingComponent.tsx index f210513623f..e797146f0ab 100644 --- a/libs/sdk-ui-dashboard/src/presentation/dragAndDrop/draggableParameterFilter/DefaultParameterDraggingComponent.tsx +++ b/libs/sdk-ui-dashboard/src/presentation/dragAndDrop/draggableParameterFilter/DefaultParameterDraggingComponent.tsx @@ -4,7 +4,7 @@ import { ParameterControlButton } from "@gooddata/sdk-ui-kit"; import { useDashboardSelector } from "../../../model/react/DashboardStoreProvider.js"; import { selectCatalogParameterByRef } from "../../../model/store/catalog/catalogSelectors.js"; -import { selectDashboardParameterEntryByRef } from "../../../model/store/parameters/parametersSelectors.js"; +import { selectDashboardParameterEntryByRef } from "../../../model/store/tabs/parameters/parametersSelectors.js"; import { type ParameterDraggableItem } from "../types.js"; /** diff --git a/libs/sdk-ui-dashboard/src/presentation/dragAndDrop/useFilterDeleteDrop.ts b/libs/sdk-ui-dashboard/src/presentation/dragAndDrop/useFilterDeleteDrop.ts index 7895f3ada86..1077540ca7a 100644 --- a/libs/sdk-ui-dashboard/src/presentation/dragAndDrop/useFilterDeleteDrop.ts +++ b/libs/sdk-ui-dashboard/src/presentation/dragAndDrop/useFilterDeleteDrop.ts @@ -11,7 +11,7 @@ import { removeMeasureValueFilter, } from "../../model/commands/filters.js"; import { useDashboardDispatch } from "../../model/react/DashboardStoreProvider.js"; -import { parametersActions } from "../../model/store/parameters/index.js"; +import { tabsActions } from "../../model/store/tabs/index.js"; import { isAttributeFilterDraggableItem, @@ -42,7 +42,7 @@ export function useFilterDeleteDrop() { const identifier = dashboardFilterLocalIdentifier(item.filter)!; dispatch(removeMeasureValueFilter(identifier)); } else if (isParameterDraggableItem(item)) { - dispatch(parametersActions.removeParameter({ ref: item.ref })); + dispatch(tabsActions.removeParameter({ ref: item.ref })); } }, }, diff --git a/libs/sdk-ui-dashboard/src/presentation/filterBar/filterBar/DefaultFilterBar.tsx b/libs/sdk-ui-dashboard/src/presentation/filterBar/filterBar/DefaultFilterBar.tsx index 430e807a357..c0b99d2a280 100644 --- a/libs/sdk-ui-dashboard/src/presentation/filterBar/filterBar/DefaultFilterBar.tsx +++ b/libs/sdk-ui-dashboard/src/presentation/filterBar/filterBar/DefaultFilterBar.tsx @@ -50,7 +50,6 @@ import { selectIsApplyFiltersAllAtOnceEnabledAndSet, selectIsExport, } from "../../../model/store/config/configSelectors.js"; -import { selectDashboardParameters } from "../../../model/store/parameters/parametersSelectors.js"; import { selectIsInEditMode } from "../../../model/store/renderMode/renderModeSelectors.js"; import { selectEffectiveAttributeFiltersModeMap } from "../../../model/store/tabs/attributeFilterConfigs/attributeFilterConfigsSelectors.js"; import { @@ -66,6 +65,7 @@ import { } from "../../../model/store/tabs/filterContext/filterContextSelectors.js"; import { selectFilterGroupsConfig } from "../../../model/store/tabs/filterGroups/filterGroupsSelectors.js"; import { selectEffectiveMeasureValueFiltersModeMap } from "../../../model/store/tabs/measureValueFilterConfigs/measureValueFilterConfigsSelectors.js"; +import { selectDashboardParameters } from "../../../model/store/tabs/parameters/parametersSelectors.js"; import { useDashboardComponentsContext } from "../../dashboardContexts/DashboardComponentsContext.js"; import { DraggableFilterDropZone } from "../../dragAndDrop/draggableFilterDropZone/DraggableFilterDropZone.js"; import { DraggableFilterDropZoneHint } from "../../dragAndDrop/draggableFilterDropZone/DraggableFilterDropZoneHint.js"; diff --git a/libs/sdk-ui-dashboard/src/presentation/filterBar/parameterFilter/DashboardParameterFilter.tsx b/libs/sdk-ui-dashboard/src/presentation/filterBar/parameterFilter/DashboardParameterFilter.tsx index 03742c70940..b536d842889 100644 --- a/libs/sdk-ui-dashboard/src/presentation/filterBar/parameterFilter/DashboardParameterFilter.tsx +++ b/libs/sdk-ui-dashboard/src/presentation/filterBar/parameterFilter/DashboardParameterFilter.tsx @@ -12,9 +12,9 @@ import { Dropdown, ParameterControlButton, ParameterControlDropdown } from "@goo import { useDashboardDispatch, useDashboardSelector } from "../../../model/react/DashboardStoreProvider.js"; import { selectCatalogParameterByRef } from "../../../model/store/catalog/catalogSelectors.js"; -import { parametersActions } from "../../../model/store/parameters/index.js"; -import { selectParameterRuntimeOverrideByRef } from "../../../model/store/parameters/parametersSelectors.js"; import { selectIsInEditMode } from "../../../model/store/renderMode/renderModeSelectors.js"; +import { tabsActions } from "../../../model/store/tabs/index.js"; +import { selectParameterRuntimeOverrideByRef } from "../../../model/store/tabs/parameters/parametersSelectors.js"; import { DraggableChipSource } from "../../dragAndDrop/DraggableChipSource.js"; /** @@ -80,9 +80,7 @@ export function DashboardParameterFilter({ parameter }: IDashboardParameterFilte value={runtimeOverride} constraints={constraints} onApply={(value) => { - dispatch( - parametersActions.setParameterRuntimeValue({ ref: parameter.ref, value }), - ); + dispatch(tabsActions.setParameterRuntimeValue({ ref: parameter.ref, value })); closeDropdown(); }} onCancel={closeDropdown} diff --git a/libs/sdk-ui-dashboard/src/presentation/filterBar/parameterFilter/DashboardParameterPicker.tsx b/libs/sdk-ui-dashboard/src/presentation/filterBar/parameterFilter/DashboardParameterPicker.tsx index 991f0058009..55e9c6eadf3 100644 --- a/libs/sdk-ui-dashboard/src/presentation/filterBar/parameterFilter/DashboardParameterPicker.tsx +++ b/libs/sdk-ui-dashboard/src/presentation/filterBar/parameterFilter/DashboardParameterPicker.tsx @@ -10,8 +10,8 @@ import { selectCatalogParameters, selectCatalogParametersStatus, } from "../../../model/store/catalog/catalogSelectors.js"; -import { parametersActions } from "../../../model/store/parameters/index.js"; -import { selectActiveParameterRefKeys } from "../../../model/store/parameters/parametersSelectors.js"; +import { tabsActions } from "../../../model/store/tabs/index.js"; +import { selectActiveParameterRefKeys } from "../../../model/store/tabs/parameters/parametersSelectors.js"; const PICKER_MAX_LIST_HEIGHT = 320; @@ -48,7 +48,7 @@ export function DashboardParameterPicker({ onAdd, onCancel }: IDashboardParamete continue; } dispatch( - parametersActions.addParameter({ + tabsActions.addParameter({ parameter: { ref, parameterType: "NUMBER", diff --git a/libs/sdk-ui-dashboard/src/presentation/widget/insight/ViewModeDashboardInsight/Insight/DashboardInsight.tsx b/libs/sdk-ui-dashboard/src/presentation/widget/insight/ViewModeDashboardInsight/Insight/DashboardInsight.tsx index bb8165a159a..4b85a4308ec 100644 --- a/libs/sdk-ui-dashboard/src/presentation/widget/insight/ViewModeDashboardInsight/Insight/DashboardInsight.tsx +++ b/libs/sdk-ui-dashboard/src/presentation/widget/insight/ViewModeDashboardInsight/Insight/DashboardInsight.tsx @@ -53,12 +53,12 @@ import { selectCrossFilteringSelectedPointsByWidgetRef, selectDrillableItems, } from "../../../../../model/store/drill/drillSelectors.js"; -import { selectEffectiveParameterValuesForWidget } from "../../../../../model/store/parameters/parametersSelectors.js"; import { selectPermissions } from "../../../../../model/store/permissions/permissionsSelectors.js"; import { selectIsInEditMode, selectIsInExportMode, } from "../../../../../model/store/renderMode/renderModeSelectors.js"; +import { selectEffectiveParameterValuesForWidget } from "../../../../../model/store/tabs/parameters/parametersSelectors.js"; import { selectExecutionTimestamp } from "../../../../../model/store/ui/uiSelectors.js"; import { useDashboardComponentsContext } from "../../../../dashboardContexts/DashboardComponentsContext.js"; import { useMinimalSizeValidation } from "../../../../export/hooks/useMinimalSizeValidation.js"; diff --git a/libs/sdk-ui-ext/package.json b/libs/sdk-ui-ext/package.json index d48eac742d3..6373307ac31 100644 --- a/libs/sdk-ui-ext/package.json +++ b/libs/sdk-ui-ext/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-ui-ext", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData.UI SDK - Extensions", "license": "LicenseRef-LICENSE", "author": "GoodData Corporation", @@ -44,7 +44,7 @@ "build-check": "tsgo", "build-dynamic-files": "bash scripts/build.sh --genFilesOnly", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage *.log styles/css tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage temp *.log styles/css tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", diff --git a/libs/sdk-ui-filters/package.json b/libs/sdk-ui-filters/package.json index ea4fdbc48aa..1fc46f534bd 100644 --- a/libs/sdk-ui-filters/package.json +++ b/libs/sdk-ui-filters/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-ui-filters", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData.UI SDK - Filter Components", "license": "MIT", "author": "GoodData Corporation", @@ -38,7 +38,7 @@ "build": "bash scripts/build.sh", "build-check": "tsgo", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage *.log styles/css tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage temp *.log styles/css tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", diff --git a/libs/sdk-ui-gen-ai/api/sdk-ui-gen-ai.api.md b/libs/sdk-ui-gen-ai/api/sdk-ui-gen-ai.api.md index 0b343a13e2f..31edf2adfb1 100644 --- a/libs/sdk-ui-gen-ai/api/sdk-ui-gen-ai.api.md +++ b/libs/sdk-ui-gen-ai/api/sdk-ui-gen-ai.api.md @@ -13,6 +13,7 @@ import type { GenAIChatInteractionUserFeedback } from '@gooddata/sdk-model'; import type { GenAIChatRoutingUseCase } from '@gooddata/sdk-model'; import { GenAIObjectType } from '@gooddata/sdk-model'; import { IAnalyticalBackend } from '@gooddata/sdk-backend-spi'; +import { IChatConversation } from '@gooddata/sdk-backend-spi'; import { IChatConversationContent } from '@gooddata/sdk-backend-spi'; import { IChatConversationError } from '@gooddata/sdk-backend-spi'; import { IChatConversationItem } from '@gooddata/sdk-backend-spi'; @@ -68,6 +69,33 @@ export type ChatClosedEvent = BaseEvent & { type: "chatClosed"; }; +// @public +export type ChatConversationDeletedErrorEvent = BaseEvent & { + type: "chatConversationDeletedError"; + conversation: IChatConversation; + error: Error; +}; + +// @public +export type ChatConversationDeletedEvent = BaseEvent & { + type: "chatConversationDeleted"; + conversation: IChatConversation; +}; + +// @public +export type ChatConversationPinErrorEvent = BaseEvent & { + type: "chatConversationPinError"; + conversationId: string; + error: Error; +}; + +// @public +export type ChatConversationPinnedEvent = BaseEvent & { + type: "chatConversationPinned"; + conversationId: string; + pinned: boolean; +}; + // @public export type ChatCopyToClipboardEvent = BaseEvent & { type: "chatCopyToClipboard"; @@ -75,7 +103,7 @@ export type ChatCopyToClipboardEvent = BaseEvent & { }; // @public -export type ChatEvent = ChatOpenedEvent | ChatClosedEvent | ChatResetEvent | ChatUserMessageEvent | ChatAssistantMessageEvent | ChatFeedbackEvent | ChatFeedbackErrorEvent | ChatCopyToClipboardEvent | ChatVisualizationErrorEvent | ChatSaveVisualizationErrorEvent | ChatSaveVisualizationSuccessEvent; +export type ChatEvent = ChatOpenedEvent | ChatClosedEvent | ChatResetEvent | ChatConversationPinnedEvent | ChatConversationPinErrorEvent | ChatConversationDeletedEvent | ChatConversationDeletedErrorEvent | ChatUserMessageEvent | ChatAssistantMessageEvent | ChatFeedbackEvent | ChatFeedbackErrorEvent | ChatCopyToClipboardEvent | ChatVisualizationErrorEvent | ChatSaveVisualizationErrorEvent | ChatSaveVisualizationSuccessEvent; // @public export type ChatEventHandler = { @@ -273,6 +301,18 @@ export const isChatAssistantMessageEvent: (event: ChatEvent) => event is ChatAss // @public export const isChatClosedEvent: (event: ChatEvent) => event is ChatClosedEvent; +// @public +export const isChatConversationDeletedErrorEvent: (event: ChatEvent) => event is ChatConversationDeletedErrorEvent; + +// @public +export const isChatConversationDeletedEvent: (event: ChatEvent) => event is ChatConversationDeletedEvent; + +// @public +export const isChatConversationPinErrorEvent: (event: ChatEvent) => event is ChatConversationPinErrorEvent; + +// @public +export const isChatConversationPinnedEvent: (event: ChatEvent) => event is ChatConversationPinnedEvent; + // @public export const isChatCopyToClipboardEvent: (event: ChatEvent) => event is ChatCopyToClipboardEvent; diff --git a/libs/sdk-ui-gen-ai/package.json b/libs/sdk-ui-gen-ai/package.json index 4c68350e034..0235542a2a6 100644 --- a/libs/sdk-ui-gen-ai/package.json +++ b/libs/sdk-ui-gen-ai/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-ui-gen-ai", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData GenAI SDK", "license": "MIT", "author": "GoodData Corporation", @@ -41,7 +41,7 @@ "build-check": "tsgo", "build-dynamic-files": "bash scripts/build.sh --genFilesOnly", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage *.log styles/css tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage temp *.log styles/css tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", diff --git a/libs/sdk-ui-gen-ai/src/components/GenAIChatConversations.tsx b/libs/sdk-ui-gen-ai/src/components/GenAIChatConversations.tsx index 7dad5ef4a81..50754ccbe1b 100644 --- a/libs/sdk-ui-gen-ai/src/components/GenAIChatConversations.tsx +++ b/libs/sdk-ui-gen-ai/src/components/GenAIChatConversations.tsx @@ -1,6 +1,15 @@ // (C) 2026 GoodData Corporation -import { type FC, type RefObject, useCallback, useMemo, useRef, useState } from "react"; +import { + type DragEvent, + type FC, + type KeyboardEvent, + type RefObject, + useCallback, + useMemo, + useRef, + useState, +} from "react"; import cx from "classnames"; import { FormattedMessage, useIntl } from "react-intl"; @@ -8,6 +17,7 @@ import { connect, useSelector } from "react-redux"; import { DefaultUiMenuInteractiveItemWrapper, + Dropdown, type IUiMenuItem, UiDrawer, UiIcon, @@ -19,7 +29,11 @@ import { type IChatConversationLocal } from "../model.js"; import { catalogItemsSelector } from "../store/chatWindow/chatWindowSelectors.js"; import { setHistoryAction } from "../store/chatWindow/chatWindowSlice.js"; import { conversationSelector, conversationsSelector } from "../store/messages/messagesSelectors.js"; -import { deleteConversationAction, setCurrentConversationAction } from "../store/messages/messagesSlice.js"; +import { + deleteConversationAction, + pinConversationAction, + setCurrentConversationAction, +} from "../store/messages/messagesSlice.js"; import { type RootState } from "../store/types.js"; import { generateTemporaryTitle } from "../utils.js"; @@ -38,14 +52,18 @@ type GenAIChatConversationsDispatchProps = { setHistory: typeof setHistoryAction; loadConversation: typeof setCurrentConversationAction; deleteConversation: typeof deleteConversationAction; + pinConversation: typeof pinConversationAction; }; export type GenAIChatConversationsProps = GenAIChatConversationsStateProps & GenAIChatConversationsDispatchProps; +type ConversationDropZone = "pin" | "unpin" | "body"; + function GenAIChatConversationsComponent({ setHistory, deleteConversation, + pinConversation, loadConversation, conversations, conversation: currentConversation, @@ -56,6 +74,9 @@ function GenAIChatConversationsComponent({ const { isFullscreen, isSmallScreen } = useFullscreenCheck(); const { isHistory } = useHistoryCheck(); const [conversationToDelete, setConversationToDelete] = useState(); + const [openedId, setOpenedId] = useState(); + const [draggedConversationId, setDraggedConversationId] = useState(); + const [activeDropZone, setActiveDropZone] = useState(); const catalogItems = useSelector(catalogItemsSelector); @@ -78,20 +99,106 @@ function GenAIChatConversationsComponent({ data: conversation, iconRight: (
- { - event.preventDefault(); - event.stopPropagation(); - setConversationToDelete(conversation); + { + setOpenedId(openedId ? undefined : conversation.id); }} - tabIndex={-1} - icon="trash" + isOpen={openedId === conversation.id} + alignPoints={[{ align: "bl tl" }]} + renderButton={({ + toggleDropdown, + buttonRef, + ariaAttributes, + accessibilityConfig, + }) => ( + { + buttonRef.current = element; + }} + size="medium" + variant="tertiary" + label={intl.formatMessage({ + id: "gd.gen-ai.conversations.menu.aria-label", + })} + onClick={(event) => { + event.preventDefault(); + event.stopPropagation(); + toggleDropdown(); + }} + accessibilityConfig={{ + ...accessibilityConfig, + ariaExpanded: ariaAttributes["aria-expanded"], + ariaHaspopup: ariaAttributes["aria-haspopup"], + ariaControls: ariaAttributes["aria-controls"], + }} + tabIndex={-1} + icon="ellipsis" + /> + )} + renderBody={({ closeDropdown, ariaAttributes }) => ( + + ) : ( + + ), + data: conversation, + }, + { + type: "static", + id: "delete-separator", + data: ( +
+ ), + }, + { + type: "interactive", + id: "delete", + stringTitle: intl.formatMessage({ + id: "gd.gen-ai.conversations.delete-dialog.submit", + }), + isDestructive: true, + iconLeft: , + data: { + ...conversation, + action: "delete", + }, + }, + ]} + onSelect={(item, event) => { + const selectedConversation = + item.data as IChatConversationLocal & { + action?: "delete"; + }; + if (selectedConversation.action === "delete") { + setConversationToDelete(conversation); + } else { + pinConversation({ + conversationId: selectedConversation.id, + pinned: !selectedConversation.pinned, + }); + } + event.preventDefault(); + event.stopPropagation(); + }} + onClose={closeDropdown} + ariaAttributes={ariaAttributes} + /> + )} + closeOnEscape + autofocusOnOpen />
), @@ -99,7 +206,12 @@ function GenAIChatConversationsComponent({ currentConversation === "new" ? false : conversation.id === currentConversation?.id, })), })), - [groupedConversations, intl, catalogItems, currentConversation], + [groupedConversations, intl, catalogItems, openedId, currentConversation, pinConversation], + ); + + const draggedConversation = useMemo( + () => conversations?.find((conversation) => conversation.id === draggedConversationId), + [conversations, draggedConversationId], ); const handleDeleteCancel = useCallback(() => { @@ -121,6 +233,79 @@ function GenAIChatConversationsComponent({ setConversationToDelete(undefined); }, [conversationToDelete, deleteConversation]); + const handleDragStart = useCallback((conversationId: string, event: DragEvent) => { + event.dataTransfer.effectAllowed = "move"; + event.dataTransfer.setData("text/plain", conversationId); + setDraggedConversationId(conversationId); + setActiveDropZone("body"); + }, []); + + const handleDragEnd = useCallback(() => { + setDraggedConversationId(undefined); + setActiveDropZone(undefined); + }, []); + + const handleDropZoneDragOver = useCallback( + (dropZone: ConversationDropZone, event: DragEvent) => { + if (!draggedConversation) { + return; + } + + const canDrop = dropZone === "pin" ? !draggedConversation.pinned : draggedConversation.pinned; + if (!canDrop) { + return; + } + + event.preventDefault(); + event.dataTransfer.dropEffect = "move"; + setActiveDropZone(dropZone); + }, + [draggedConversation], + ); + + const handleDropZoneDragLeave = useCallback((event: DragEvent) => { + const nextTarget = event.relatedTarget as Node | null; + + if (nextTarget && event.currentTarget.contains(nextTarget)) { + return; + } + + setActiveDropZone("body"); + }, []); + + const handleDropZoneDrop = useCallback( + (dropZone: ConversationDropZone, event: DragEvent) => { + event.preventDefault(); + + if (!draggedConversation) { + return; + } + + const shouldBePinned = dropZone === "pin"; + if (draggedConversation.pinned !== shouldBePinned) { + pinConversation({ + conversationId: draggedConversation.id, + pinned: shouldBePinned, + }); + } + + setDraggedConversationId(undefined); + setActiveDropZone(undefined); + }, + [draggedConversation, pinConversation], + ); + + const handleMenuUnhandledKeyDown = useCallback( + (event: KeyboardEvent, { focusedItem }: { focusedItem?: IUiMenuItem }) => { + if (event.key === "Delete" && focusedItem) { + event.preventDefault(); + event.stopPropagation(); + setConversationToDelete(focusedItem.data as IChatConversationLocal); + } + }, + [], + ); + return ( <>
}>
@@ -148,66 +333,20 @@ function GenAIChatConversationsComponent({ "gd-gen-ai-chat__window__conversations--isSmallScreen": isSmallScreen, })} > - {(conversations ?? []).length === 0 ? ( -
- -
- , - }} - /> -
-
- ) : ( -
- { - if (event.key === "Delete" && focusedItem) { - event.preventDefault(); - event.stopPropagation(); - setConversationToDelete(focusedItem.data as IChatConversationLocal); - } - }} - InteractiveItemWrapper={(props) => { - const data = props.item.data as IChatConversationLocal; - return ( -
- -
- ); - }} - items={menuItems} - onSelect={(item, event) => { - handleSelect(item.data as IChatConversationLocal); - event.stopPropagation(); - event.preventDefault(); - }} - shouldCloseOnSelect={false} - size="small" - ariaAttributes={{ - id: "gd-gen-ai-conversations-menu", - "aria-label": intl.formatMessage({ id: "gd.gen-ai.conversations.title" }), - }} - /> -
- )} +
{conversationToDelete ? ( @@ -221,6 +360,218 @@ function GenAIChatConversationsComponent({ ); } +interface IDrawerContentProps { + openedId: string | undefined; + conversations: IChatConversationLocal[]; + menuItems: IUiMenuItem[]; + handleSelect: (conversation: IChatConversationLocal) => void; + draggedConversation: IChatConversationLocal | undefined; + activeDropZone: ConversationDropZone | undefined; + onDragStart: (conversationId: string, event: DragEvent) => void; + onDragEnd: () => void; + onDropZoneDragOver: (dropZone: ConversationDropZone, event: DragEvent) => void; + onDropZoneDragLeave: (event: DragEvent) => void; + onDropZoneDrop: (dropZone: ConversationDropZone, event: DragEvent) => void; + onMenuUnhandledKeyDown: (event: KeyboardEvent, context: { focusedItem?: IUiMenuItem }) => void; +} + +function DrawerContent({ + openedId, + conversations, + menuItems, + handleSelect, + draggedConversation, + activeDropZone, + onDragStart, + onDragEnd, + onDropZoneDragOver, + onDropZoneDragLeave, + onDropZoneDrop, + onMenuUnhandledKeyDown, +}: IDrawerContentProps) { + const intl = useIntl(); + + const pinnedItems = useMemo(() => { + return menuItems.filter((item) => item.id === ConversationDateGroup.PINNED); + }, [menuItems]); + + const restItems = useMemo(() => { + return menuItems.filter((item) => item.id !== ConversationDateGroup.PINNED); + }, [menuItems]); + + return ( + <> + {(conversations ?? []).length === 0 ? ( +
+ +
+ , + }} + /> +
+
+ ) : ( +
+
onDropZoneDragOver("pin", event)} + onDrop={(event) => onDropZoneDrop("pin", event)} + > +
+
+ {intl.formatMessage({ + id: "gd.gen-ai.conversations.dnd.pin-placeholder", + })} +
+
+ +
+
onDropZoneDragOver("unpin", event)} + onDragLeave={onDropZoneDragLeave} + onDrop={(event) => onDropZoneDrop("unpin", event)} + > +
+
+ {intl.formatMessage({ + id: "gd.gen-ai.conversations.dnd.unpin-placeholder", + })} +
+
+ +
+ {draggedConversation ? ( +
+ ) : null} +
+ )} + + ); +} + +interface IConversationListProps { + id: string; + openedId: string | undefined; + listItems: IUiMenuItem[]; + onDragStart: (conversationId: string, event: DragEvent) => void; + onDragEnd: () => void; + onMenuUnhandledKeyDown: (event: KeyboardEvent, context: { focusedItem?: IUiMenuItem }) => void; + handleSelect: (conversation: IChatConversationLocal) => void; +} + +function ConversationsList({ + id, + openedId, + listItems, + handleSelect, + onDragStart, + onDragEnd, + onMenuUnhandledKeyDown, +}: IConversationListProps) { + const intl = useIntl(); + + return useMemo(() => { + return ( + ( + + )} + items={listItems} + onSelect={(item, event) => { + handleSelect(item.data as IChatConversationLocal); + event.stopPropagation(); + event.preventDefault(); + }} + shouldCloseOnSelect={false} + size="small" + ariaAttributes={{ + id, + "aria-label": intl.formatMessage({ id: "gd.gen-ai.conversations.title" }), + }} + /> + ); + }, [id, handleSelect, intl, listItems, onDragEnd, onDragStart, onMenuUnhandledKeyDown, openedId]); +} + +type DraggableConversationItemProps = Parameters[0] & { + intl: ReturnType; + openedId: string | undefined; + onDragStart: (conversationId: string, event: DragEvent) => void; + onDragEnd: () => void; +}; + +function DraggableConversationItem(props: DraggableConversationItemProps) { + const data = props.item.data as IChatConversationLocal; + + return ( +
{ + event.currentTarget.classList.add("dragging"); + props.onDragStart(data.id, event); + }} + onDragEnd={(event) => { + event.currentTarget.classList.remove("dragging"); + props.onDragEnd(); + }} + > + +
+ ); +} + const mapStateToProps = (state: RootState): GenAIChatConversationsStateProps => ({ conversation: conversationSelector(state), conversations: conversationsSelector(state), @@ -229,6 +580,7 @@ const mapStateToProps = (state: RootState): GenAIChatConversationsStateProps => const mapDispatchToProps: GenAIChatConversationsDispatchProps = { setHistory: setHistoryAction, deleteConversation: deleteConversationAction, + pinConversation: pinConversationAction, loadConversation: setCurrentConversationAction, }; @@ -239,6 +591,8 @@ export const GenAIChatConversations: FC = connect( function getConversationGroupLabel(group: ConversationDateGroup, intl: ReturnType): string { switch (group) { + case ConversationDateGroup.PINNED: + return intl.formatMessage({ id: "gd.gen-ai.conversations.group.pinned" }); case ConversationDateGroup.TODAY: return intl.formatMessage({ id: "gd.gen-ai.conversations.group.today" }); case ConversationDateGroup.LAST_7_DAYS: diff --git a/libs/sdk-ui-gen-ai/src/components/GenAIChatWrapper.tsx b/libs/sdk-ui-gen-ai/src/components/GenAIChatWrapper.tsx index 93a1dde011b..0f978276550 100644 --- a/libs/sdk-ui-gen-ai/src/components/GenAIChatWrapper.tsx +++ b/libs/sdk-ui-gen-ai/src/components/GenAIChatWrapper.tsx @@ -18,8 +18,12 @@ import { cancelAsyncAction, clearThreadAction, loadThreadAction } from "../store import { type RootState } from "../store/types.js"; import { getAbsoluteSettingHref, + getAbsoluteShellAppOrgSettingHref, + getAbsoluteShellAppWorkspaceSettingHref, getAbsoluteWorkspaceSettingHref, getSettingHref, + getShellAppOrgSettingHref, + getShellAppWorkspaceSettingHref, getWorkspaceSettingHref, } from "../utils.js"; @@ -96,16 +100,27 @@ export function GenAIChatWrapperComponent({ tabIndex: -1, }); + // When the shell host is enabled, the standalone home-ui at `/settings` or + // `/workspaces/{id}/settings` is bounced to the host base path, dropping the + // workspaceId and hash. Switch to host-shaped URLs so the deep-link + // (e.g. `#/ai/change-llm-model`) reaches the settings page intact. + const useShellAppUrls = Boolean(settings?.enableShellApplication); const onSettingClick = useCallback( (type: "change-model" | "create") => (e: MouseEvent) => { switch (type) { case "change-model": if (allowNativeLinks) { - window.location.href = getAbsoluteWorkspaceSettingHref( - workspaceId, - GEN_AI_SECTION, - CHANGE_LLM_MODEL_ACTION, - ); + window.location.href = useShellAppUrls + ? getAbsoluteShellAppWorkspaceSettingHref( + workspaceId, + GEN_AI_SECTION, + CHANGE_LLM_MODEL_ACTION, + ) + : getAbsoluteWorkspaceSettingHref( + workspaceId, + GEN_AI_SECTION, + CHANGE_LLM_MODEL_ACTION, + ); } else { linkHandler?.({ id: CHANGE_LLM_MODEL_ACTION, @@ -114,21 +129,26 @@ export function GenAIChatWrapperComponent({ newTab: e.metaKey, section: GEN_AI_SECTION, preventDefault: e.preventDefault.bind(e), - itemUrl: getWorkspaceSettingHref( - workspaceId, - GEN_AI_SECTION, - CHANGE_LLM_MODEL_ACTION, - ), + itemUrl: useShellAppUrls + ? getShellAppWorkspaceSettingHref( + workspaceId, + GEN_AI_SECTION, + CHANGE_LLM_MODEL_ACTION, + ) + : getWorkspaceSettingHref( + workspaceId, + GEN_AI_SECTION, + CHANGE_LLM_MODEL_ACTION, + ), }); e.stopPropagation(); } break; case "create": if (allowNativeLinks) { - window.location.href = getAbsoluteSettingHref( - GEN_AI_SECTION, - CREATE_LLM_PROVIDER_ACTION, - ); + window.location.href = useShellAppUrls + ? getAbsoluteShellAppOrgSettingHref(GEN_AI_SECTION, CREATE_LLM_PROVIDER_ACTION) + : getAbsoluteSettingHref(GEN_AI_SECTION, CREATE_LLM_PROVIDER_ACTION); } else { linkHandler?.({ id: CREATE_LLM_PROVIDER_ACTION, @@ -137,14 +157,16 @@ export function GenAIChatWrapperComponent({ newTab: e.metaKey, section: GEN_AI_SECTION, preventDefault: e.preventDefault.bind(e), - itemUrl: getSettingHref(GEN_AI_SECTION, CREATE_LLM_PROVIDER_ACTION), + itemUrl: useShellAppUrls + ? getShellAppOrgSettingHref(GEN_AI_SECTION, CREATE_LLM_PROVIDER_ACTION) + : getSettingHref(GEN_AI_SECTION, CREATE_LLM_PROVIDER_ACTION), }); e.stopPropagation(); } break; } }, - [allowNativeLinks, linkHandler, workspaceId], + [allowNativeLinks, linkHandler, workspaceId, useShellAppUrls], ); if (evaluated && hasUnsupportedOpenAiModel) { diff --git a/libs/sdk-ui-gen-ai/src/components/messages/conversationContents/ConversationVisualizationContent.tsx b/libs/sdk-ui-gen-ai/src/components/messages/conversationContents/ConversationVisualizationContent.tsx index eb8774ba21b..e7c0e412179 100644 --- a/libs/sdk-ui-gen-ai/src/components/messages/conversationContents/ConversationVisualizationContent.tsx +++ b/libs/sdk-ui-gen-ai/src/components/messages/conversationContents/ConversationVisualizationContent.tsx @@ -119,11 +119,11 @@ function ConversationVisualizationContentCore({ const [isTable, setIsTable] = useState(false); const moreButtonDescId = useId(); - const { setDrillState, DrillOverlay, DrillChooser } = useDrillState({ - containerRef, - filters: [], - setKeyDriverAnalysis, - }); + const [drillState, setDrillState] = useState<{ + keyDriverData: IDashboardKeyDriverCombinationItem[]; + event: IDrillEvent; + } | null>(null); + const { setSaveDialogOpen, SaveDialog } = useSaveDialog({ message, part, @@ -166,7 +166,12 @@ function ConversationVisualizationContentCore({ return (
- + - - +
); @@ -561,103 +565,97 @@ function VisualizationErrorReport({ error }: IVisualizationErrorReportProps) { //hooks -interface IUseDrillStateProps { +interface IDrillStateProps { containerRef: RefObject; - filters: IFilter[]; + drillState: { + keyDriverData: IDashboardKeyDriverCombinationItem[]; + event: IDrillEvent; + } | null; + setDrillState: ( + state: { keyDriverData: IDashboardKeyDriverCombinationItem[]; event: IDrillEvent } | null, + ) => void; + filters?: IFilter[]; setKeyDriverAnalysis?: typeof setKeyDriverAnalysisAction; + children?: ReactNode; } -function useDrillState({ containerRef, filters, setKeyDriverAnalysis }: IUseDrillStateProps) { +function DrillState({ + containerRef, + filters, + setKeyDriverAnalysis, + children, + drillState, + setDrillState, +}: IDrillStateProps) { const intl = useIntl(); - const [drillState, setDrillState] = useState<{ - keyDriverData: IDashboardKeyDriverCombinationItem[]; - event: IDrillEvent; - } | null>(null); const catalogItems = useSelector(catalogItemsSelector); - const DrillChooser = useCallback( - ({ children }: { children: ReactNode }) => { - return ( - { - if (!state) { + return ( + { + if (!state) { + setDrillState(null); + } + }} + closeOnEscape + closeOnParentScroll + alignPoints={[ + { + align: "tl tl", + offset: calculateOffset(containerRef.current, drillState?.event), + }, + { + align: "tl tr", + offset: calculateOffset(containerRef.current, drillState?.event), + }, + ]} + renderBody={() => { + return ( + { + const data = item.data.context as IDashboardKeyDriverCombinationItem; + const event = drillState?.event; + + if (!event) { + return; + } + + const allFilters = mergeFilters( + convertIntersectionToAttributeFilters(event.drillContext.intersection ?? []), + (filters?.map(getDashboardAttributeFilter).filter(Boolean) ?? + []) as IDashboardAttributeFilter[], + ); + + const definition = createKdaDefinitionFromDrill( + catalogItems, + intl.locale, + data, + event, + allFilters, + ); + setKeyDriverAnalysis?.({ keyDriverAnalysis: definition }); + }} + onClose={() => { setDrillState(null); - } - }} - closeOnEscape - closeOnParentScroll - alignPoints={[ - { - align: "tl tl", - offset: calculateOffset(containerRef.current, drillState?.event), - }, - { - align: "tl tr", - offset: calculateOffset(containerRef.current, drillState?.event), - }, - ]} - renderBody={() => { - return ( - { - const data = item.data.context as IDashboardKeyDriverCombinationItem; - const event = drillState?.event; - - if (!event) { - return; - } - - const allFilters = mergeFilters( - convertIntersectionToAttributeFilters( - event.drillContext.intersection ?? [], - ), - filters - .map(getDashboardAttributeFilter) - .filter(Boolean) as IDashboardAttributeFilter[], - ); - - const definition = createKdaDefinitionFromDrill( - catalogItems, - intl.locale, - data, - event, - allFilters, - ); - setKeyDriverAnalysis?.({ keyDriverAnalysis: definition }); - }} - onClose={() => { - setDrillState(null); - }} - /> - ); - }} - renderButton={() => <>{children}} - /> - ); - }, - [catalogItems, containerRef, drillState, filters, intl.locale, setKeyDriverAnalysis], - ); - - const DrillOverlay = useCallback( - () => ( - <> - {drillState ? ( -
- ) : null} - - ), - [drillState], + }} + /> + ); + }} + renderButton={() => ( + <> + {children} + <> + {drillState ? ( +
+ ) : null} + + + )} + /> ); - - return { - DrillOverlay, - DrillChooser, - setDrillState, - drillState, - }; } function calculateOffset(container?: HTMLDivElement | null, drillEvent?: IDrillEvent) { diff --git a/libs/sdk-ui-gen-ai/src/components/utils/conversationGrouper.ts b/libs/sdk-ui-gen-ai/src/components/utils/conversationGrouper.ts index ac261615221..8c66e35e840 100644 --- a/libs/sdk-ui-gen-ai/src/components/utils/conversationGrouper.ts +++ b/libs/sdk-ui-gen-ai/src/components/utils/conversationGrouper.ts @@ -3,6 +3,7 @@ import { type IChatConversationLocal } from "../../model.js"; export enum ConversationDateGroup { + PINNED = "PINNED", TODAY = "TODAY", LAST_7_DAYS = "LAST_7_DAYS", OLDER = "OLDER", @@ -19,6 +20,7 @@ export type ConversationDateBucket = { }; export const DEFAULT_CONVERSATION_DATE_GROUPS: ConversationDateGroupConfig[] = [ + { group: ConversationDateGroup.PINNED, maxAgeDays: Number.POSITIVE_INFINITY }, { group: ConversationDateGroup.TODAY, maxAgeDays: 0 }, { group: ConversationDateGroup.LAST_7_DAYS, maxAgeDays: 6 }, { group: ConversationDateGroup.OLDER, maxAgeDays: Number.POSITIVE_INFINITY }, @@ -40,10 +42,16 @@ export function groupConversationsByDate( .sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime()); sorted.forEach((conversation) => { + if (conversation.pinned) { + conversationGroups.get(ConversationDateGroup.PINNED)?.push(conversation); + return; + } + const updatedAt = new Date(conversation.updatedAt); const ageInDays = getAgeInDays(updatedAt, now); const targetGroup = groups + .filter((group) => group.group !== ConversationDateGroup.PINNED) .filter((group) => ageInDays <= group.maxAgeDays) .sort((a, b) => a.maxAgeDays - b.maxAgeDays)[0]?.group ?? groups[groups.length - 1].group; diff --git a/libs/sdk-ui-gen-ai/src/components/utils/tests/conversationGrouper.test.ts b/libs/sdk-ui-gen-ai/src/components/utils/tests/conversationGrouper.test.ts index 03de1de8395..747fd200310 100644 --- a/libs/sdk-ui-gen-ai/src/components/utils/tests/conversationGrouper.test.ts +++ b/libs/sdk-ui-gen-ai/src/components/utils/tests/conversationGrouper.test.ts @@ -71,4 +71,28 @@ describe("groupConversationsByDate", () => { }, ]); }); + + it("should put pinned conversations to pinned bucket first", () => { + const conversations: IChatConversationLocal[] = [ + { + ...createConversation("unpinned", daysAgoIso(0, now)), + pinned: false, + }, + { + ...createConversation("pinned", daysAgoIso(14, now)), + pinned: true, + }, + ]; + + expect(groupConversationsByDate(conversations, undefined, now)).toEqual([ + { + group: ConversationDateGroup.PINNED, + conversations: [conversations[1]], + }, + { + group: ConversationDateGroup.TODAY, + conversations: [conversations[0]], + }, + ]); + }); }); diff --git a/libs/sdk-ui-gen-ai/src/index.ts b/libs/sdk-ui-gen-ai/src/index.ts index d9b0fa5390e..baea0a3fb38 100644 --- a/libs/sdk-ui-gen-ai/src/index.ts +++ b/libs/sdk-ui-gen-ai/src/index.ts @@ -55,6 +55,10 @@ export { type ChatSaveVisualizationErrorEvent, type ChatSaveVisualizationSuccessEvent, type ChatCopyToClipboardEvent, + type ChatConversationPinnedEvent, + type ChatConversationDeletedEvent, + type ChatConversationPinErrorEvent, + type ChatConversationDeletedErrorEvent, isChatAssistantMessageEvent, isChatUserMessageEvent, isChatClosedEvent, @@ -66,6 +70,10 @@ export { isChatSaveVisualizationErrorEvent, isChatSaveVisualizationSuccessEvent, isChatCopyToClipboardEvent, + isChatConversationDeletedEvent, + isChatConversationPinnedEvent, + isChatConversationPinErrorEvent, + isChatConversationDeletedErrorEvent, } from "./store/events.js"; export { clearThreadAction, newMessageAction } from "./store/messages/messagesSlice.js"; diff --git a/libs/sdk-ui-gen-ai/src/localization/bundles/en-US.json b/libs/sdk-ui-gen-ai/src/localization/bundles/en-US.json index bbbc7a4ff64..125c9afd73d 100644 --- a/libs/sdk-ui-gen-ai/src/localization/bundles/en-US.json +++ b/libs/sdk-ui-gen-ai/src/localization/bundles/en-US.json @@ -243,9 +243,29 @@ "text": "Older", "crowdinContext": "Header for conversations older than 7 days" }, - "gd.gen-ai.conversations.delete-button.aria-label": { - "text": "Delete conversation", - "crowdinContext": "Aria label for button that opens delete confirmation for a conversation in history list" + "gd.gen-ai.conversations.group.pinned": { + "text": "Pinned", + "crowdinContext": "Menu option to pin a conversation to the top of the conversation history list" + }, + "gd.gen-ai.conversations.menu.pin": { + "text": "Pin", + "crowdinContext": "Menu option to pin a conversation to the top of the conversation history list" + }, + "gd.gen-ai.conversations.menu.unpin": { + "text": "Unpin", + "crowdinContext": "Menu option to unpin a conversation from the top of the conversation history list" + }, + "gd.gen-ai.conversations.menu.aria-label": { + "text": "Conversation menu", + "crowdinContext": "Accessibility label for the conversation menu" + }, + "gd.gen-ai.conversations.dnd.pin-placeholder": { + "text": "Drop to pin", + "crowdinContext": "Drop placeholder shown while dragging an unpinned conversation to pin it" + }, + "gd.gen-ai.conversations.dnd.unpin-placeholder": { + "text": "Drop to unpin", + "crowdinContext": "Drop placeholder shown while dragging a pinned conversation to unpin it" }, "gd.gen-ai.conversations.delete-dialog.title": { "text": "Delete conversation?", diff --git a/libs/sdk-ui-gen-ai/src/store/events.ts b/libs/sdk-ui-gen-ai/src/store/events.ts index 319c1d759b5..4dd3073f0c3 100644 --- a/libs/sdk-ui-gen-ai/src/store/events.ts +++ b/libs/sdk-ui-gen-ai/src/store/events.ts @@ -1,5 +1,6 @@ // (C) 2024-2026 GoodData Corporation +import { type IChatConversation } from "@gooddata/sdk-backend-spi"; import { type SdkErrorType } from "@gooddata/sdk-ui"; import { type TextContentObject } from "../model.js"; @@ -60,6 +61,79 @@ export const isChatResetEvent = (event: ChatEvent): event is ChatResetEvent => { return event.type === "chatReset"; }; +/** + * A chat conversation pinned state change event. + * @public + */ +export type ChatConversationPinnedEvent = BaseEvent & { + type: "chatConversationPinned"; + conversationId: string; + pinned: boolean; +}; + +/** + * Type guard for the ChatConversationPinnedEvent. + * @public + */ +export const isChatConversationPinnedEvent = (event: ChatEvent): event is ChatConversationPinnedEvent => { + return event.type === "chatConversationPinned"; +}; + +/** + * A chat conversation pinned state change error event. + * @public + */ +export type ChatConversationPinErrorEvent = BaseEvent & { + type: "chatConversationPinError"; + conversationId: string; + error: Error; +}; + +/** + * Type guard for the ChatConversationPinnedEvent. + * @public + */ +export const isChatConversationPinErrorEvent = (event: ChatEvent): event is ChatConversationPinErrorEvent => { + return event.type === "chatConversationPinError"; +}; + +/** + * A chat conversation deleted event. + * @public + */ +export type ChatConversationDeletedEvent = BaseEvent & { + type: "chatConversationDeleted"; + conversation: IChatConversation; +}; + +/** + * Type guard for the ChatConversationDeletedEvent. + * @public + */ +export const isChatConversationDeletedEvent = (event: ChatEvent): event is ChatConversationDeletedEvent => { + return event.type === "chatConversationDeleted"; +}; + +/** + * A chat conversation deleted error event. + * @public + */ +export type ChatConversationDeletedErrorEvent = BaseEvent & { + type: "chatConversationDeletedError"; + conversation: IChatConversation; + error: Error; +}; + +/** + * Type guard for the ChatConversationDeletedEvent. + * @public + */ +export const isChatConversationDeletedErrorEvent = ( + event: ChatEvent, +): event is ChatConversationDeletedErrorEvent => { + return event.type === "chatConversationDeletedError"; +}; + /** * A chat user message event. * @public @@ -215,6 +289,10 @@ export type ChatEvent = | ChatOpenedEvent | ChatClosedEvent | ChatResetEvent + | ChatConversationPinnedEvent + | ChatConversationPinErrorEvent + | ChatConversationDeletedEvent + | ChatConversationDeletedErrorEvent | ChatUserMessageEvent | ChatAssistantMessageEvent | ChatFeedbackEvent diff --git a/libs/sdk-ui-gen-ai/src/store/messages/messagesSlice.ts b/libs/sdk-ui-gen-ai/src/store/messages/messagesSlice.ts index 3d2e44b826c..c3f342971e6 100644 --- a/libs/sdk-ui-gen-ai/src/store/messages/messagesSlice.ts +++ b/libs/sdk-ui-gen-ai/src/store/messages/messagesSlice.ts @@ -882,6 +882,59 @@ const messagesSlice = createSlice({ errorMessage?: string; }>, ) => state, + pinConversationAction: ( + state, + _action: PayloadAction<{ + conversationId: string; + pinned: boolean; + }>, + ) => state, + pinConversationSuccessAction: ( + state, + { payload }: PayloadAction<{ conversationId: string; pinned: boolean }>, + ) => { + state.conversations = state.conversations?.map((conversation) => + conversation.id === payload.conversationId + ? { + ...conversation, + pinned: payload.pinned, + } + : conversation, + ); + + if ( + state.currentConversation !== "new" && + state.currentConversation?.id === payload.conversationId + ) { + state.currentConversation = { + ...state.currentConversation, + pinned: payload.pinned, + }; + } + }, + pinConversationFailureAction: ( + state, + { payload }: PayloadAction<{ conversationId: string; error: Error; pinned?: boolean }>, + ) => { + state.conversations = state.conversations?.map((conversation) => + conversation.id === payload.conversationId + ? { + ...conversation, + pinned: payload.pinned, + } + : conversation, + ); + + if ( + state.currentConversation !== "new" && + state.currentConversation?.id === payload.conversationId + ) { + state.currentConversation = { + ...state.currentConversation, + pinned: payload.pinned, + }; + } + }, deleteConversationAction: (state, _action: PayloadAction<{ conversationId: string }>) => state, deleteConversationStartAction: (state, { payload }: PayloadAction<{ conversationId: string }>) => { if ( @@ -897,7 +950,10 @@ const messagesSlice = createSlice({ (conversation) => conversation.id !== payload.conversationId, ); }, - deleteConversationSuccessAction: (state, _action: PayloadAction<{ conversationId: string }>) => state, + deleteConversationSuccessAction: ( + state, + _action: PayloadAction<{ conversation: IChatConversationLocal }>, + ) => state, deleteConversationFailureAction: ( state, { payload }: PayloadAction<{ conversation: IChatConversationLocal; error: Error }>, @@ -944,6 +1000,9 @@ export const { visualizationErrorAction, startNewConversationAction, setCurrentConversationAction, + pinConversationAction, + pinConversationSuccessAction, + pinConversationFailureAction, deleteConversationAction, deleteConversationStartAction, deleteConversationSuccessAction, diff --git a/libs/sdk-ui-gen-ai/src/store/sideEffects/index.ts b/libs/sdk-ui-gen-ai/src/store/sideEffects/index.ts index dd35c7e059f..c7c176150cd 100644 --- a/libs/sdk-ui-gen-ai/src/store/sideEffects/index.ts +++ b/libs/sdk-ui-gen-ai/src/store/sideEffects/index.ts @@ -8,6 +8,7 @@ import { evaluateMessageUpdateAction, loadThreadAction, newMessageAction, + pinConversationAction, saveVisualisationRenderStatusAction, saveVisualizationAction, saveVisualizationSuccessAction, @@ -19,6 +20,7 @@ import { loadCatalogItems } from "./loadCatalogItems.js"; import { loadColorPalette } from "./loadColorPalette.js"; import { loadSettings } from "./loadSettings.js"; import { onConversationDelete } from "./onConversationDelete.js"; +import { onConversationPin } from "./onConversationPin.js"; import { onEvent } from "./onEvent.js"; import { onThreadClear } from "./onThreadClear.js"; import { onThreadLoad } from "./onThreadLoad.js"; @@ -44,6 +46,7 @@ export function* rootSaga() { yield takeEvery(saveVisualizationSuccessAction.type, onVisualizationSuccessSave); yield takeEvery(saveVisualisationRenderStatusAction.type, onVisualisationRender); //conversations API + yield takeEvery(pinConversationAction.type, onConversationPin); yield takeEvery(deleteConversationAction.type, onConversationDelete); yield takeEvery(evaluateMessageUpdateAction.type, onUserMessageUpdate); //others diff --git a/libs/sdk-ui-gen-ai/src/store/sideEffects/onConversationDelete.ts b/libs/sdk-ui-gen-ai/src/store/sideEffects/onConversationDelete.ts index a85b6165ed9..258c6165fd0 100644 --- a/libs/sdk-ui-gen-ai/src/store/sideEffects/onConversationDelete.ts +++ b/libs/sdk-ui-gen-ai/src/store/sideEffects/onConversationDelete.ts @@ -44,7 +44,7 @@ export function* onConversationDelete({ yield put( deleteConversationSuccessAction({ - conversationId: payload.conversationId, + conversation: conversation, }), ); } catch (e) { diff --git a/libs/sdk-ui-gen-ai/src/store/sideEffects/onConversationPin.ts b/libs/sdk-ui-gen-ai/src/store/sideEffects/onConversationPin.ts new file mode 100644 index 00000000000..102770165ac --- /dev/null +++ b/libs/sdk-ui-gen-ai/src/store/sideEffects/onConversationPin.ts @@ -0,0 +1,53 @@ +// (C) 2024-2026 GoodData Corporation + +import { type PayloadAction } from "@reduxjs/toolkit"; +import { call, getContext, put, select } from "redux-saga/effects"; + +import { type IAnalyticalBackend } from "@gooddata/sdk-backend-spi"; + +import { type IChatConversationLocal } from "../../model.js"; +import { conversationByIdSelector } from "../messages/messagesSelectors.js"; +import { + type pinConversationAction, + pinConversationFailureAction, + pinConversationSuccessAction, +} from "../messages/messagesSlice.js"; + +export function* onConversationPin({ + payload, +}: ReturnType | PayloadAction<{ conversationId: string; pinned: boolean }>) { + const backend: IAnalyticalBackend = yield getContext("backend"); + const workspace: string = yield getContext("workspace"); + const isPreview: boolean | undefined = yield getContext("isPreview"); + + const conversation: IChatConversationLocal | undefined = yield select( + conversationByIdSelector, + payload.conversationId, + ); + + if (!conversation) { + return; + } + + try { + yield put( + pinConversationSuccessAction({ + conversationId: payload.conversationId, + pinned: payload.pinned, + }), + ); + + const chatConversations = backend.workspace(workspace).genAI().getChatConversations({ isPreview }); + const updateConversationCall = chatConversations.update.bind(chatConversations); + yield call(updateConversationCall, payload.conversationId, { pinned: payload.pinned }); + } catch (e) { + console.error("Failed to update pinned state of conversation", e); + yield put( + pinConversationFailureAction({ + conversationId: payload.conversationId, + error: e as Error, + pinned: conversation.pinned, + }), + ); + } +} diff --git a/libs/sdk-ui-gen-ai/src/store/sideEffects/onEvent.ts b/libs/sdk-ui-gen-ai/src/store/sideEffects/onEvent.ts index 70cbacbb10e..acab1e387cb 100644 --- a/libs/sdk-ui-gen-ai/src/store/sideEffects/onEvent.ts +++ b/libs/sdk-ui-gen-ai/src/store/sideEffects/onEvent.ts @@ -27,10 +27,14 @@ import { } from "../messages/messagesSelectors.js"; import { clearThreadAction, + deleteConversationFailureAction, + deleteConversationSuccessAction, evaluateMessageCompleteAction, loadConversationSuccessAction, loadThreadSuccessAction, newMessageAction, + pinConversationFailureAction, + pinConversationSuccessAction, saveVisualizationErrorAction, saveVisualizationSuccessAction, setUserFeedback, @@ -51,6 +55,65 @@ export function* onEvent() { yield takeEvery(saveVisualizationErrorAction.type, onSaveVisualizationError); yield takeEvery(saveVisualizationSuccessAction.type, onSaveVisualizationSuccess); yield takeEvery(copyToClipboardAction.type, onCopyToClipboard); + yield takeEvery(pinConversationSuccessAction.type, onConversationPinUpdated); + yield takeEvery(pinConversationFailureAction.type, onConversationPinError); + yield takeEvery(deleteConversationSuccessAction.type, onConversationDeletedSuccess); + yield takeEvery(deleteConversationFailureAction.type, onConversationDeletedError); +} + +function* onConversationPinUpdated({ + payload: { conversationId, pinned }, +}: ReturnType) { + const eventDispatcher: EventDispatcher = yield getContext("eventDispatcher"); + const threadId: string | undefined = yield select(threadIdSelector); + + eventDispatcher.dispatch({ + type: "chatConversationPinned", + threadId, + conversationId, + pinned, + }); +} + +function* onConversationPinError({ + payload: { conversationId, error }, +}: ReturnType) { + const eventDispatcher: EventDispatcher = yield getContext("eventDispatcher"); + const threadId: string | undefined = yield select(threadIdSelector); + + eventDispatcher.dispatch({ + type: "chatConversationPinError", + threadId, + conversationId, + error, + }); +} + +function* onConversationDeletedSuccess({ + payload: { conversation }, +}: ReturnType) { + const eventDispatcher: EventDispatcher = yield getContext("eventDispatcher"); + const threadId: string | undefined = yield select(threadIdSelector); + + eventDispatcher.dispatch({ + type: "chatConversationDeleted", + threadId, + conversation, + }); +} + +function* onConversationDeletedError({ + payload: { conversation, error }, +}: ReturnType) { + const eventDispatcher: EventDispatcher = yield getContext("eventDispatcher"); + const threadId: string | undefined = yield select(threadIdSelector); + + eventDispatcher.dispatch({ + type: "chatConversationDeletedError", + threadId, + conversation, + error, + }); } function* persistMessages() { diff --git a/libs/sdk-ui-gen-ai/src/store/sideEffects/utils.ts b/libs/sdk-ui-gen-ai/src/store/sideEffects/utils.ts index 080f9d58b71..a57eda0a656 100644 --- a/libs/sdk-ui-gen-ai/src/store/sideEffects/utils.ts +++ b/libs/sdk-ui-gen-ai/src/store/sideEffects/utils.ts @@ -11,10 +11,6 @@ export function extractError(e: unknown) { return `${e.name}: ${message}`; } - if (typeof e === "object" && e !== null && "detail" in e) { - return String(e.detail); - } - return String(e); } diff --git a/libs/sdk-ui-gen-ai/src/utils.ts b/libs/sdk-ui-gen-ai/src/utils.ts index f60fe1a6e75..6b8d4c9f6f3 100644 --- a/libs/sdk-ui-gen-ai/src/utils.ts +++ b/libs/sdk-ui-gen-ai/src/utils.ts @@ -37,6 +37,37 @@ export function getAbsoluteWorkspaceSettingHref(workspaceId: string, section: st return `${window.location.origin}${getWorkspaceSettingHref(workspaceId, section, action)}`; } +// Shell-host route shape: the host serves the home-ui module under +// `/organization/settings`, and uses `configuration` (not `settings`) for the +// workspace detail route. Used when `enableShellApplication` is on, so +// standalone `/settings`/`/workspaces/{id}/settings` URLs aren't bounced to the +// workspaces list. +export function getShellAppOrgSettingHref(section: string, action?: string) { + if (!action) { + return `/organization/settings/configuration#/${section}`; + } + return `/organization/settings/configuration#/${section}/${action}`; +} + +export function getAbsoluteShellAppOrgSettingHref(section: string, action?: string) { + return `${window.location.origin}${getShellAppOrgSettingHref(section, action)}`; +} + +export function getShellAppWorkspaceSettingHref(workspaceId: string, section: string, action?: string) { + if (!action) { + return `/organization/settings/workspaces/${workspaceId}/configuration#/${section}`; + } + return `/organization/settings/workspaces/${workspaceId}/configuration#/${section}/${action}`; +} + +export function getAbsoluteShellAppWorkspaceSettingHref( + workspaceId: string, + section: string, + action?: string, +) { + return `${window.location.origin}${getShellAppWorkspaceSettingHref(workspaceId, section, action)}`; +} + export function getHeadlineComparison(metrics: IAttributeOrMeasure[]) { return { comparison: { diff --git a/libs/sdk-ui-gen-ai/styles/scss/conversations.scss b/libs/sdk-ui-gen-ai/styles/scss/conversations.scss index 20db708c4dd..55745be4276 100644 --- a/libs/sdk-ui-gen-ai/styles/scss/conversations.scss +++ b/libs/sdk-ui-gen-ai/styles/scss/conversations.scss @@ -24,6 +24,7 @@ min-width: 220px; position: relative; margin: -5px; + height: calc(100% + 10px); &#{$root}--isFullscreen { width: 300px; @@ -42,6 +43,13 @@ background-color: kit-variables.$gd-border-color; } + &__divider_menu { + width: calc(100% - 20px); + height: 1px; + margin: 0 10px; + background-color: kit-variables.$gd-border-color; + } + &__empty { display: flex; padding: 20px 0; @@ -62,6 +70,49 @@ line-height: 20px; } + &__drop-placeholder { + z-index: 1; + position: absolute; + display: none; + text-transform: uppercase; + inset: 0; + margin: 0 10px; + padding: 4px 4px; + border: 2px dashed kit-variables.$gd-palette-primary-base; + background-color: kit-variables.$gd-palette-primary-dimmed; + border-radius: 5px; + color: kit-variables.$gd-color-text; + font-size: 12px; + font-weight: 700; + line-height: 14px; + text-align: center; + + &.isDragging, + &.isDraggingOver { + display: block; + } + + & &__content { + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + border-radius: 3px; + } + + &.isDraggingOver &__content { + background-color: kit-variables.$gd-palette-primary-base; + color: kit-variables.$gd-color-white; + } + } + + &__drop-overlay { + position: absolute; + inset: 0; + pointer-events: none; + } + &__list { $list-root: &; @@ -72,11 +123,21 @@ align-items: stretch; gap: 10px; align-self: stretch; + height: 100%; .gd-ui-kit-menu { + max-height: none; + .gd-ui-kit-menu__item-wrapper { + cursor: grab; + } + + .gd-ui-kit-menu__item-wrapper:active { + cursor: grabbing; + } + #{$list-root}__delete-button { position: absolute; - right: 10px; + right: 0; } #{$list-root}__delete-button button { opacity: 0; @@ -93,22 +154,37 @@ pointer-events: auto; } - .gd-ui-kit-menu__item-wrapper:has(#{$list-root}__delete-button button:hover) - .gd-ui-kit-menu__item, - .gd-ui-kit-menu__item-wrapper:has(#{$list-root}__delete-button button:focus-visible) - .gd-ui-kit-menu__item { - background-color: kit-variables.$gd-palette-error-dimmed; - color: kit-variables.$gd-palette-error-base; - } - .gd-ui-kit-menu__group-title-container { padding: 10px 10px 0 10px; } } + &__item.openedMenu { + .gd-ui-kit-menu__item-wrapper #{$list-root}__delete-button button { + opacity: 1; + pointer-events: auto; + } + .gd-ui-kit-menu__item { + background-color: kit-variables.$is-focused-background; + color: kit-variables.$gd-color-dark; + } + .gd-ui-kit-menu__item.gd-ui-kit-menu__item--isSelected { + background-color: kit-variables.$gd-palette-primary-dimmed; + color: kit-variables.$gd-palette-primary-base; + } + } + &__item.generatingTitle .gd-ui-kit-menu__item-title { @include variables.gd-reasoning(); } + + &__item.dragging { + opacity: 0.45; + } + } + + &__drop-group { + position: relative; } &__delete-button { diff --git a/libs/sdk-ui-gen-ai/styles/scss/messages.scss b/libs/sdk-ui-gen-ai/styles/scss/messages.scss index 7b6ca8a910d..05fa34dce1f 100644 --- a/libs/sdk-ui-gen-ai/styles/scss/messages.scss +++ b/libs/sdk-ui-gen-ai/styles/scss/messages.scss @@ -1283,6 +1283,10 @@ color: kit-variables.$gd-palette-error-base; } } + + &--visualization { + position: relative; + } } .gd-gen-ai-chat__conversation__item__feedback { diff --git a/libs/sdk-ui-geo/package.json b/libs/sdk-ui-geo/package.json index ff6c2094ce1..6b8ac73c5fc 100644 --- a/libs/sdk-ui-geo/package.json +++ b/libs/sdk-ui-geo/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-ui-geo", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData.UI SDK - Geo Charts", "license": "MIT", "author": "GoodData Corporation", @@ -39,7 +39,7 @@ "build": "bash scripts/build.sh", "build-check": "tsgo", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm styles/css coverage *.log tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm styles/css coverage temp *.log tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", diff --git a/libs/sdk-ui-geo/src/next/context/GeoLayersContext.tsx b/libs/sdk-ui-geo/src/next/context/GeoLayersContext.tsx index a3d8a2cbf49..102bfdff7b0 100644 --- a/libs/sdk-ui-geo/src/next/context/GeoLayersContext.tsx +++ b/libs/sdk-ui-geo/src/next/context/GeoLayersContext.tsx @@ -7,6 +7,7 @@ import { type IColorStrategy } from "@gooddata/sdk-ui-vis-commons"; import type { ILayerPreparedData } from "../hooks/layers/useLayersPrepare.js"; import type { GeoJSONSourceSpecification } from "../layers/common/mapFacade.js"; +import type { ITooltipReferenceMaps } from "../layers/registry/adapterTypes.js"; import { type IAvailableLegends, type IGeoLegendItem } from "../types/common/legends.js"; import { type IAreaGeoData } from "../types/geoData/area.js"; import { type IPushpinGeoData } from "../types/geoData/pushpin.js"; @@ -76,6 +77,11 @@ export interface IGeoLayerData { * Initial viewport hint derived from the layer data. */ initialViewport: Partial | null; + + /** + * Reference id maps for custom-tooltip resolution. + */ + tooltipReferenceMaps?: ITooltipReferenceMaps; } /** @@ -140,6 +146,7 @@ export function GeoLayersProvider({ baseLegendItems: prepared.output?.legend.items ?? EMPTY_LEGEND_ITEMS, availableLegends: prepared.output?.legend.available ?? EMPTY_AVAILABLE_LEGENDS, initialViewport: prepared.output?.initialViewport ?? null, + tooltipReferenceMaps: prepared.output?.tooltipReferenceMaps, }); } } diff --git a/libs/sdk-ui-geo/src/next/context/tests/GeoLayersContext.test.tsx b/libs/sdk-ui-geo/src/next/context/tests/GeoLayersContext.test.tsx new file mode 100644 index 00000000000..1c2252254da --- /dev/null +++ b/libs/sdk-ui-geo/src/next/context/tests/GeoLayersContext.test.tsx @@ -0,0 +1,81 @@ +// (C) 2026 GoodData Corporation + +import { type ReactNode } from "react"; + +import { renderHook } from "@testing-library/react"; +import { describe, expect, it } from "vitest"; + +import { type DataViewFacade } from "@gooddata/sdk-ui"; +import { type IColorStrategy } from "@gooddata/sdk-ui-vis-commons"; + +import type { ILayerPreparedData } from "../../hooks/layers/useLayersPrepare.js"; +import type { GeoJSONSourceSpecification } from "../../layers/common/mapFacade.js"; +import type { IGeoLayerOutput, ITooltipReferenceMaps } from "../../layers/registry/adapterTypes.js"; +import type { IPushpinGeoData } from "../../types/geoData/pushpin.js"; +import type { ILayerExecutionRecord } from "../../types/props/geoChart/internal.js"; +import { GeoLayersProvider, useGeoLayers } from "../GeoLayersContext.js"; + +const testSource: GeoJSONSourceSpecification = { + type: "geojson", + data: { type: "FeatureCollection", features: [] }, +}; + +function makePrepared(overrides: Partial = {}): ILayerPreparedData { + return { + layerId: "L1", + dataView: {} as DataViewFacade, + output: { + source: testSource, + legend: { + items: [], + available: { + hasCategoryLegend: false, + hasColorLegend: false, + hasSizeLegend: false, + }, + }, + geoData: {} as IPushpinGeoData, + colorStrategy: {} as IColorStrategy, + initialViewport: null, + ...overrides, + }, + }; +} + +const layerExecutions: ILayerExecutionRecord[] = [ + { layerId: "L1", layer: { type: "pushpin" } as ILayerExecutionRecord["layer"] } as ILayerExecutionRecord, +]; + +function wrapperWith(layerOutputs: Map) { + return ({ children }: { children: ReactNode }) => ( + + {children} + + ); +} + +describe("GeoLayersContext", () => { + it("propagates tooltipReferenceMaps from prepared output to IGeoLayerData", () => { + const tooltipReferenceMaps: ITooltipReferenceMaps = { + measures: { m_local: "f_population" }, + attributes: { "df.city": "attr.city" }, + }; + const layerOutputs = new Map([["L1", makePrepared({ tooltipReferenceMaps })]]); + + const { result } = renderHook(() => useGeoLayers(), { + wrapper: wrapperWith(layerOutputs), + }); + + expect(result.current.layers.get("L1")?.tooltipReferenceMaps).toBe(tooltipReferenceMaps); + }); + + it("leaves tooltipReferenceMaps undefined when prepared output omits it", () => { + const layerOutputs = new Map([["L1", makePrepared()]]); + + const { result } = renderHook(() => useGeoLayers(), { + wrapper: wrapperWith(layerOutputs), + }); + + expect(result.current.layers.get("L1")?.tooltipReferenceMaps).toBeUndefined(); + }); +}); diff --git a/libs/sdk-ui-geo/src/next/layers/registry/output.ts b/libs/sdk-ui-geo/src/next/layers/registry/output.ts index 1b679784696..243bdbd6500 100644 --- a/libs/sdk-ui-geo/src/next/layers/registry/output.ts +++ b/libs/sdk-ui-geo/src/next/layers/registry/output.ts @@ -23,5 +23,6 @@ export function buildOutputFromLayerData(layerData: IGeoLayerData): IGeoLayerOut geoData: layerData.geoData, colorStrategy: layerData.colorStrategy, initialViewport: layerData.initialViewport, + tooltipReferenceMaps: layerData.tooltipReferenceMaps, }; } diff --git a/libs/sdk-ui-geo/src/next/layers/registry/tests/output.test.ts b/libs/sdk-ui-geo/src/next/layers/registry/tests/output.test.ts index 3c8d13b2590..6adfcbc404d 100644 --- a/libs/sdk-ui-geo/src/next/layers/registry/tests/output.test.ts +++ b/libs/sdk-ui-geo/src/next/layers/registry/tests/output.test.ts @@ -1,4 +1,4 @@ -// (C) 2025 GoodData Corporation +// (C) 2025-2026 GoodData Corporation import { describe, expect, it } from "vitest"; @@ -72,4 +72,14 @@ describe("buildOutputFromLayerData", () => { expect(output?.legend.available).toBe(availableLegends); expect(output?.source).toBe(testSource); }); + + it("propagates tooltipReferenceMaps from layer data to output", () => { + const tooltipReferenceMaps = { + measures: { m_local: "f_population" }, + attributes: { "df.city": "attr.city" }, + }; + const output = buildOutputFromLayerData(createLayerData({ tooltipReferenceMaps })); + + expect(output?.tooltipReferenceMaps).toBe(tooltipReferenceMaps); + }); }); diff --git a/libs/sdk-ui-kit/api/sdk-ui-kit.api.md b/libs/sdk-ui-kit/api/sdk-ui-kit.api.md index ed667759808..006e092ae8d 100644 --- a/libs/sdk-ui-kit/api/sdk-ui-kit.api.md +++ b/libs/sdk-ui-kit/api/sdk-ui-kit.api.md @@ -1861,7 +1861,7 @@ export function IconTrash({ color, className, width, height }: IIconProps): JSX. export function IconTreeMap({ className, width, height, color, ariaHidden }: IIconProps): JSX.Element; // @internal (undocumented) -export type IconType = "aiAgent" | "aiAgentDisabled" | "brain" | "brainDisabled" | "check" | "checkCircle" | "certification" | "plus" | "plusCircle" | "sync" | "alert" | "alertPaused" | "close" | "cross" | "edit" | "crossCircle" | "question" | "chevronUp" | "chevronRight" | "chevronDown" | "chevronLeft" | "date" | "navigateUp" | "navigateDown" | "navigateRight" | "navigateLeft" | "download" | "slack" | "expand" | "exclamationCircle" | "book" | "visible" | "invisible" | "lock" | "unlock" | "ai" | "aiFill" | "drawer" | "drawerEmpty" | "prohibited" | "dropDown" | "dropRight" | "clock" | "clockPaused" | "questionMark" | "upload" | "expandRectangle" | "file" | "number" | "code" | "user" | "userPlus" | "users" | "magic" | "tab" | "pauseCircle" | "filter" | "timer" | "mail" | "envelope" | "copy" | "rain" | "earth" | "geoCollection" | "geoCollectionUpload" | "minimize" | "shrink" | "copyright" | "ellipsis" | "pencil" | "folder" | "folderPlus" | "trash" | "arrowUp" | "arrowRight" | "arrowDown" | "arrowLeft" | "undo" | "redo" | "trendDown" | "trendUp" | "save" | "minus" | "minusCircle" | "percent" | "enter" | "enterRight" | "money" | "ghost" | "warning" | "home" | "settings" | "search" | "university" | "printer" | "picture" | "visualization" | "dashboard" | "metric" | "fact" | "ldmAttribute" | "sharp" | "attribute" | "horn" | "cw" | "ccw" | "table" | "directionColumn" | "directionRow" | "header" | "genai" | "genai2" | "explainai" | "hiddenForAi" | "box" | "ellipsisVertical" | "list" | "drillTo" | "hierarchy" | "history" | "history2" | "thumbsUp" | "thumbsDown" | "send" | "visualizationArea" | "visualizationTable" | "visualizationTreemap" | "visualizationScatter" | "visualizationDonut" | "visualizationHeadline" | "visualizationColumn" | "visualizationLine" | "visualizationPyramid" | "visualizationFunnel" | "visualizationHeatmap" | "visualizationBubble" | "visualizationPie" | "visualizationBar" | "visualizationCombo" | "visualizationBullet" | "visualizationWaterfall" | "visualizationDependencywheel" | "visualizationSankey" | "visualizationPushpin" | "visualizationRepeater" | "visualizationXirr" | "link" | "externalLink" | "click" | "fileXlsx" | "filePptx" | "filePdf" | "fileImage" | "fileCsvFormatted" | "fileCsvRaw" | "aiDocument" | "recommendation" | "streamUp" | "streamDown" | "stream" | "density" | "parameter"; +export type IconType = "aiAgent" | "aiAgentDisabled" | "brain" | "brainDisabled" | "check" | "checkCircle" | "certification" | "plus" | "plusCircle" | "sync" | "alert" | "alertPaused" | "close" | "cross" | "edit" | "crossCircle" | "question" | "chevronUp" | "chevronRight" | "chevronDown" | "chevronLeft" | "date" | "navigateUp" | "navigateDown" | "navigateRight" | "navigateLeft" | "download" | "slack" | "expand" | "exclamationCircle" | "book" | "visible" | "invisible" | "lock" | "unlock" | "ai" | "aiFill" | "drawer" | "drawerEmpty" | "prohibited" | "dropDown" | "dropRight" | "clock" | "clockPaused" | "questionMark" | "upload" | "expandRectangle" | "file" | "number" | "code" | "user" | "userPlus" | "users" | "magic" | "tab" | "pauseCircle" | "filter" | "timer" | "mail" | "envelope" | "copy" | "rain" | "earth" | "geoCollection" | "geoCollectionUpload" | "minimize" | "shrink" | "copyright" | "ellipsis" | "pencil" | "folder" | "folderPlus" | "trash" | "arrowUp" | "arrowRight" | "arrowDown" | "arrowLeft" | "undo" | "redo" | "trendDown" | "trendUp" | "save" | "minus" | "minusCircle" | "percent" | "enter" | "enterRight" | "money" | "ghost" | "warning" | "home" | "settings" | "search" | "university" | "printer" | "picture" | "visualization" | "dashboard" | "metric" | "fact" | "ldmAttribute" | "sharp" | "attribute" | "horn" | "cw" | "ccw" | "table" | "directionColumn" | "directionRow" | "header" | "genai" | "genai2" | "explainai" | "hiddenForAi" | "box" | "ellipsisVertical" | "list" | "drillTo" | "hierarchy" | "history" | "history2" | "thumbsUp" | "thumbsDown" | "send" | "visualizationArea" | "visualizationTable" | "visualizationTreemap" | "visualizationScatter" | "visualizationDonut" | "visualizationHeadline" | "visualizationColumn" | "visualizationLine" | "visualizationPyramid" | "visualizationFunnel" | "visualizationHeatmap" | "visualizationBubble" | "visualizationPie" | "visualizationBar" | "visualizationCombo" | "visualizationBullet" | "visualizationWaterfall" | "visualizationDependencywheel" | "visualizationSankey" | "visualizationPushpin" | "visualizationRepeater" | "visualizationXirr" | "link" | "externalLink" | "click" | "fileXlsx" | "filePptx" | "filePdf" | "fileImage" | "fileCsvFormatted" | "fileCsvRaw" | "aiDocument" | "recommendation" | "streamUp" | "streamDown" | "stream" | "density" | "parameter" | "pin" | "unpin"; // @internal (undocumented) export function IconUndo({ color, className, width, height, ariaHidden }: IIconProps): JSX.Element; diff --git a/libs/sdk-ui-kit/package.json b/libs/sdk-ui-kit/package.json index ebbb15d8d95..a49f2f2b61c 100644 --- a/libs/sdk-ui-kit/package.json +++ b/libs/sdk-ui-kit/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-ui-kit", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData SDK - UI Building Components", "license": "MIT", "author": "GoodData Corporation", @@ -42,7 +42,7 @@ "build": "bash scripts/build.sh", "build-check": "tsgo", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage styles/css *.log tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage temp styles/css *.log tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", diff --git a/libs/sdk-ui-kit/src/@ui/@types/icon.ts b/libs/sdk-ui-kit/src/@ui/@types/icon.ts index b35eb824021..7eeed79e910 100644 --- a/libs/sdk-ui-kit/src/@ui/@types/icon.ts +++ b/libs/sdk-ui-kit/src/@ui/@types/icon.ts @@ -165,4 +165,6 @@ export type IconType = | "streamDown" | "stream" | "density" - | "parameter"; + | "parameter" + | "pin" + | "unpin"; diff --git a/libs/sdk-ui-kit/src/@ui/UiIcon/icons.tsx b/libs/sdk-ui-kit/src/@ui/UiIcon/icons.tsx index 78faa3a10ea..fa714cf4d69 100644 --- a/libs/sdk-ui-kit/src/@ui/UiIcon/icons.tsx +++ b/libs/sdk-ui-kit/src/@ui/UiIcon/icons.tsx @@ -960,4 +960,18 @@ export const iconPaths: Record = { history2: ( ), + pin: ( + + ), + unpin: ( + + + + + + ), }; diff --git a/libs/sdk-ui-kit/src/@ui/UiMenu/hooks.tsx b/libs/sdk-ui-kit/src/@ui/UiMenu/hooks.tsx index 8c6b3c4f94b..6b98772e210 100644 --- a/libs/sdk-ui-kit/src/@ui/UiMenu/hooks.tsx +++ b/libs/sdk-ui-kit/src/@ui/UiMenu/hooks.tsx @@ -223,39 +223,69 @@ export function useUiMenuContextValue ({ + controlType, + setControlType, + setFocusedId, + focusedItem, + setShownCustomContentItemId, + shownCustomContentItemId, + pushShownSubview, + popShownSubview, + shownSubview, + onClose, + items, + size, + onSelect: handleSelectItem, + itemDataTestId, + isItemFocusable, + makeItemId, + scrollToView, + menuComponentRef: menuComponentRef, + itemsContainerRef: itemsContainerRef, + + InteractiveItemWrapper: InteractiveItemWrapperComponent, + InteractiveItem: InteractiveItemComponent, + + StaticItem: StaticItemComponent, + GroupItem: GroupItemComponent, + MenuHeader: MenuHeaderComponent, + ContentItemWrapper: ContentItemWrapperComponent, + ContentItem: ContentItemComponent, + Content: ContentComponent, + ItemComponent: Item, + menuCtxData, + }), + [ + ContentComponent, + ContentItemComponent, + ContentItemWrapperComponent, + GroupItemComponent, + InteractiveItemComponent, + InteractiveItemWrapperComponent, + MenuHeaderComponent, + StaticItemComponent, + controlType, + focusedItem, + handleSelectItem, + isItemFocusable, + itemDataTestId, + items, + itemsContainerRef, + makeItemId, + menuComponentRef, + menuCtxData, + onClose, + popShownSubview, + pushShownSubview, + scrollToView, + setFocusedId, + shownCustomContentItemId, + shownSubview, + size, + ], + ); } /** diff --git a/libs/sdk-ui-loaders/package.json b/libs/sdk-ui-loaders/package.json index 3dcc950ccf0..1aebb46b2c0 100644 --- a/libs/sdk-ui-loaders/package.json +++ b/libs/sdk-ui-loaders/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-ui-loaders", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData SDK Runtime Component Loaders", "license": "LicenseRef-LICENSE", "author": "GoodData Corporation", @@ -32,7 +32,7 @@ "build": "npm-run-all -p build-check build-ts && npm run api-extractor", "build-check": "tsgo", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage *.log styles/css tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage temp *.log styles/css tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", diff --git a/libs/sdk-ui-pivot/package.json b/libs/sdk-ui-pivot/package.json index 78312410779..e5bdb9798e5 100644 --- a/libs/sdk-ui-pivot/package.json +++ b/libs/sdk-ui-pivot/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-ui-pivot", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData.UI SDK - Pivot Table", "license": "MIT", "author": "GoodData Corporation", @@ -39,7 +39,7 @@ "build": "bash scripts/build.sh", "build-check": "tsgo", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage *.log styles/css tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage temp *.log styles/css tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", diff --git a/libs/sdk-ui-pluggable-application/package.json b/libs/sdk-ui-pluggable-application/package.json index c72806ce51b..ba5f698b551 100644 --- a/libs/sdk-ui-pluggable-application/package.json +++ b/libs/sdk-ui-pluggable-application/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-ui-pluggable-application", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData SDK React helpers for pluggable applications", "license": "MIT", "author": "GoodData Corporation", @@ -28,7 +28,7 @@ "build": "npm-run-all -p build-check build-ts && npm run api-extractor", "build-check": "tsgo", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage *.log tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage temp *.log tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", diff --git a/libs/sdk-ui-semantic-search/package.json b/libs/sdk-ui-semantic-search/package.json index 8b7260bae99..138c6ae74c6 100644 --- a/libs/sdk-ui-semantic-search/package.json +++ b/libs/sdk-ui-semantic-search/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-ui-semantic-search", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData SDK TypeScript & React skeleton", "license": "MIT", "author": "GoodData Corporation", @@ -39,7 +39,7 @@ "build-check": "tsgo", "build-dynamic-files": "bash scripts/build.sh --genFilesOnly", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage *.log styles/css tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage temp *.log styles/css tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", diff --git a/libs/sdk-ui-tests-e2e/recordings/mappings/TIGER/mapping-insightOnDashboard.spec.ts.json b/libs/sdk-ui-tests-e2e/recordings/mappings/TIGER/mapping-insightOnDashboard.spec.ts.json index 775f0c94df9..418174984ac 100644 --- a/libs/sdk-ui-tests-e2e/recordings/mappings/TIGER/mapping-insightOnDashboard.spec.ts.json +++ b/libs/sdk-ui-tests-e2e/recordings/mappings/TIGER/mapping-insightOnDashboard.spec.ts.json @@ -5559,7 +5559,7 @@ "method": "PUT", "bodyPatterns": [ { - "equalToJson": "{\"data\":{\"attributes\":{\"content\":{\"filterContextRef\":{\"identifier\":{\"id\":\"882c3455-5c89-4577-a9c2-aa60ca875d19\",\"type\":\"filterContext\"}},\"layout\":{\"sections\":[{\"items\":[{\"size\":{\"xl\":{\"gridWidth\":6}},\"type\":\"IDashboardLayoutItem\",\"widget\":{\"dateDataSet\":{\"identifier\":{\"id\":\"dt_closedate_timestamp\",\"type\":\"dataset\"}},\"description\":\"\",\"drills\":[],\"ignoreDashboardFilters\":[],\"insight\":{\"identifier\":{\"id\":\"a40866ab-5272-4f2c-9b5a-dd255b1e5d42\",\"type\":\"visualizationObject\"}},\"localIdentifier\":\"test_widget_local_identifier_0\",\"properties\":{},\"title\":\"\\u003cbutton\\u003ehello\\u003c/button\\u003e\",\"type\":\"insight\"}}],\"type\":\"IDashboardLayoutSection\"}],\"type\":\"IDashboardLayout\"},\"tabs\":[{\"filterContextRef\":{\"identifier\":{\"id\":\"882c3455-5c89-4577-a9c2-aa60ca875d19\",\"type\":\"filterContext\"}},\"layout\":{\"sections\":[{\"items\":[{\"size\":{\"xl\":{\"gridWidth\":6}},\"type\":\"IDashboardLayoutItem\",\"widget\":{\"dateDataSet\":{\"identifier\":{\"id\":\"dt_closedate_timestamp\",\"type\":\"dataset\"}},\"description\":\"\",\"drills\":[],\"ignoreDashboardFilters\":[],\"insight\":{\"identifier\":{\"id\":\"a40866ab-5272-4f2c-9b5a-dd255b1e5d42\",\"type\":\"visualizationObject\"}},\"localIdentifier\":\"test_widget_local_identifier_1\",\"properties\":{},\"title\":\"\\u003cbutton\\u003ehello\\u003c/button\\u003e\",\"type\":\"insight\"}}],\"type\":\"IDashboardLayoutSection\"}],\"type\":\"IDashboardLayout\"},\"localIdentifier\":\"defaultTabId\",\"title\":\"\"}],\"version\":\"2\"},\"description\":\"\",\"tags\":[],\"title\":\"Insight on dashboard\"},\"id\":\"46dbb7b3-468c-436f-a2ff-85fbf4e8d5ad\",\"type\":\"analyticalDashboard\"}}", + "equalToJson": "{\"data\":{\"attributes\":{\"content\":{\"filterContextRef\":{\"identifier\":{\"id\":\"882c3455-5c89-4577-a9c2-aa60ca875d19\",\"type\":\"filterContext\"}},\"layout\":{\"sections\":[{\"items\":[{\"size\":{\"xl\":{\"gridWidth\":6}},\"type\":\"IDashboardLayoutItem\",\"widget\":{\"dateDataSet\":{\"identifier\":{\"id\":\"dt_closedate_timestamp\",\"type\":\"dataset\"}},\"description\":\"\",\"drills\":[],\"ignoreDashboardFilters\":[],\"insight\":{\"identifier\":{\"id\":\"a40866ab-5272-4f2c-9b5a-dd255b1e5d42\",\"type\":\"visualizationObject\"}},\"localIdentifier\":\"test_widget_local_identifier_0\",\"properties\":{},\"title\":\"\\u003cbutton\\u003ehello\\u003c/button\\u003e\",\"type\":\"insight\"}}],\"type\":\"IDashboardLayoutSection\"}],\"type\":\"IDashboardLayout\"},\"parameters\":[],\"tabs\":[{\"filterContextRef\":{\"identifier\":{\"id\":\"882c3455-5c89-4577-a9c2-aa60ca875d19\",\"type\":\"filterContext\"}},\"layout\":{\"sections\":[{\"items\":[{\"size\":{\"xl\":{\"gridWidth\":6}},\"type\":\"IDashboardLayoutItem\",\"widget\":{\"dateDataSet\":{\"identifier\":{\"id\":\"dt_closedate_timestamp\",\"type\":\"dataset\"}},\"description\":\"\",\"drills\":[],\"ignoreDashboardFilters\":[],\"insight\":{\"identifier\":{\"id\":\"a40866ab-5272-4f2c-9b5a-dd255b1e5d42\",\"type\":\"visualizationObject\"}},\"localIdentifier\":\"test_widget_local_identifier_1\",\"properties\":{},\"title\":\"\\u003cbutton\\u003ehello\\u003c/button\\u003e\",\"type\":\"insight\"}}],\"type\":\"IDashboardLayoutSection\"}],\"type\":\"IDashboardLayout\"},\"localIdentifier\":\"defaultTabId\",\"parameters\":[],\"title\":\"\"}],\"version\":\"2\"},\"description\":\"\",\"tags\":[],\"title\":\"Insight on dashboard\"},\"id\":\"46dbb7b3-468c-436f-a2ff-85fbf4e8d5ad\",\"type\":\"analyticalDashboard\"}}", "ignoreArrayOrder": false, "ignoreExtraElements": false } diff --git a/libs/sdk-ui-tests-storybook/neobackstop/output/reference/storybook_chromium_15_Ui_UiIcon_-_full-featured_icon_0_document_0_desktop.png b/libs/sdk-ui-tests-storybook/neobackstop/output/reference/storybook_chromium_15_Ui_UiIcon_-_full-featured_icon_0_document_0_desktop.png index 3a65d9a7656..3ee7ccea62d 100644 Binary files a/libs/sdk-ui-tests-storybook/neobackstop/output/reference/storybook_chromium_15_Ui_UiIcon_-_full-featured_icon_0_document_0_desktop.png and b/libs/sdk-ui-tests-storybook/neobackstop/output/reference/storybook_chromium_15_Ui_UiIcon_-_full-featured_icon_0_document_0_desktop.png differ diff --git a/libs/sdk-ui-tests-storybook/neobackstop/output/reference/storybook_chromium_15_Ui_UiIcon_-_themed_0_document_0_desktop.png b/libs/sdk-ui-tests-storybook/neobackstop/output/reference/storybook_chromium_15_Ui_UiIcon_-_themed_0_document_0_desktop.png index 19914df8e22..1ed3b58f327 100644 Binary files a/libs/sdk-ui-tests-storybook/neobackstop/output/reference/storybook_chromium_15_Ui_UiIcon_-_themed_0_document_0_desktop.png and b/libs/sdk-ui-tests-storybook/neobackstop/output/reference/storybook_chromium_15_Ui_UiIcon_-_themed_0_document_0_desktop.png differ diff --git a/libs/sdk-ui-theme-provider/package.json b/libs/sdk-ui-theme-provider/package.json index 640ead479ef..003cf518e52 100644 --- a/libs/sdk-ui-theme-provider/package.json +++ b/libs/sdk-ui-theme-provider/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-ui-theme-provider", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData SDK - Theme provider", "license": "MIT", "author": "GoodData Corporation", @@ -31,7 +31,7 @@ "build": "npm-run-all -p build-check build-ts && npm run api-extractor", "build-check": "tsgo", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage *.log tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage temp *.log tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", diff --git a/libs/sdk-ui-vis-commons/package.json b/libs/sdk-ui-vis-commons/package.json index be5ae2b661e..74133ef2693 100644 --- a/libs/sdk-ui-vis-commons/package.json +++ b/libs/sdk-ui-vis-commons/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-ui-vis-commons", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData.UI SDK - common functionality for different types of visualizations", "license": "MIT", "author": "GoodData Corporation", @@ -36,7 +36,7 @@ "build": "npm-run-all -p build-check build-ts && npm run api-extractor", "build-check": "tsgo", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage styles/css *.log tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage temp styles/css *.log tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", diff --git a/libs/sdk-ui/package.json b/libs/sdk-ui/package.json index 6fe66a286c3..e6957103200 100644 --- a/libs/sdk-ui/package.json +++ b/libs/sdk-ui/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/sdk-ui", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData.UI SDK - Core", "license": "MIT", "author": "GoodData Corporation", @@ -39,7 +39,7 @@ "build-check": "tsgo", "build-dynamic-files": "bash scripts/build.sh --genFilesOnly", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage *.log tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage temp *.log tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", diff --git a/libs/util/package.json b/libs/util/package.json index d7459664283..f2e2aeeca93 100644 --- a/libs/util/package.json +++ b/libs/util/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/util", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData Utility Functions", "license": "MIT", "author": "GoodData", @@ -28,7 +28,7 @@ "build": "npm-run-all -p build-check build-ts && npm run api-extractor", "build-check": "tsgo", "build-ts": "tsgo -p tsconfig.build.json", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage *.log tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm coverage temp *.log tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", diff --git a/tools/app-toolkit/package.json b/tools/app-toolkit/package.json index 52b9d525e96..959365bfcd9 100644 --- a/tools/app-toolkit/package.json +++ b/tools/app-toolkit/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/app-toolkit", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "CLI with useful tools for creating and maintaining GoodData web applications.", "license": "LicenseRef-LICENSE", "author": "GoodData", @@ -30,7 +30,7 @@ "_phase:validate": "npm run build-dynamic-files && npm run validate", "build": "bash scripts/build.sh && tsgo", "build-dynamic-files": "bash scripts/build.sh --genFilesOnly", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm build coverage *.log tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm build coverage temp *.log tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", diff --git a/tools/catalog-export/package.json b/tools/catalog-export/package.json index 5fda27981f2..6d0ea500e53 100644 --- a/tools/catalog-export/package.json +++ b/tools/catalog-export/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/catalog-export", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData SDK Catalog Export tooling", "license": "MIT", "author": "GoodData", diff --git a/tools/eslint-config/package.json b/tools/eslint-config/package.json index e06f1966c37..ec2aab85366 100644 --- a/tools/eslint-config/package.json +++ b/tools/eslint-config/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/eslint-config", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "license": "MIT", "author": "GoodData", "repository": { diff --git a/tools/i18n-toolkit/package.json b/tools/i18n-toolkit/package.json index 5b83f45f8b0..faeef9071e5 100644 --- a/tools/i18n-toolkit/package.json +++ b/tools/i18n-toolkit/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/i18n-toolkit", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "Localization validator to validate localization complexity and intl and html format.", "license": "MIT", "author": "GoodData", diff --git a/tools/lint-config/package.json b/tools/lint-config/package.json index 910ba543690..f327ab6f8b3 100644 --- a/tools/lint-config/package.json +++ b/tools/lint-config/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/lint-config", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "Linter-agnostic shared rules for @gooddata/eslint-config and @gooddata/oxlint-config", "license": "MIT", "author": "GoodData", diff --git a/tools/mock-handling/package.json b/tools/mock-handling/package.json index 27b16f49bf8..ba547f8634e 100644 --- a/tools/mock-handling/package.json +++ b/tools/mock-handling/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/mock-handling", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData SDK Mock data capture and management tool", "license": "MIT", "author": "GoodData", diff --git a/tools/oxlint-config/package.json b/tools/oxlint-config/package.json index 4fb72e1ec2e..fc5489a8759 100644 --- a/tools/oxlint-config/package.json +++ b/tools/oxlint-config/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/oxlint-config", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "license": "MIT", "author": "GoodData", "repository": { diff --git a/tools/plugin-toolkit/package.json b/tools/plugin-toolkit/package.json index 797b3d02749..f61df969251 100644 --- a/tools/plugin-toolkit/package.json +++ b/tools/plugin-toolkit/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/plugin-toolkit", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData Set of Tools for working with Plugins", "license": "LicenseRef-LICENSE", "author": "GoodData", @@ -31,7 +31,7 @@ "_phase:validate": "npm run build-dynamic-files && npm run validate", "build": "bash scripts/build.sh && tsgo", "build-dynamic-files": "bash scripts/build.sh --genFilesOnly", - "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm build coverage *.log tsconfig.tsbuildinfo", + "clean": "../../common/scripts/clean-command-state.sh && rm -rf ci dist esm build coverage temp *.log tsconfig.tsbuildinfo", "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/", "format-check": "oxfmt --check .", "format-write": "oxfmt .", diff --git a/tools/reference-workspace/package.json b/tools/reference-workspace/package.json index d12fe9e1266..e90cf0d7a47 100644 --- a/tools/reference-workspace/package.json +++ b/tools/reference-workspace/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/reference-workspace", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData SDK - Reference Workspace for tests", "license": "MIT", "author": "GoodData", diff --git a/tools/stylelint-config/package.json b/tools/stylelint-config/package.json index eb4d8c84d9e..13369bc9d95 100644 --- a/tools/stylelint-config/package.json +++ b/tools/stylelint-config/package.json @@ -1,6 +1,6 @@ { "name": "@gooddata/stylelint-config", - "version": "11.35.0-alpha.5", + "version": "11.35.0-alpha.6", "description": "GoodData CSS Style Guide", "keywords": [ "config",