diff --git a/NOTICE b/NOTICE index 39bd766e568..28e5fd2eaa3 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-1-5 +Date generated: 2026-1-6 -Revision ID: 22b75f31e0d2730f300e9445fd06681255a06c86 +Revision ID: 138e5d8e2a41f60c653af27d0263208a4259a1ea ================================================================================ ================================================================================ @@ -939,7 +939,7 @@ Revision ID: 22b75f31e0d2730f300e9445fd06681255a06c86 - tslib (2.8.1) [ISC] - type-fest (0.21.3) [Multi-license: MIT OR CC0-1.0] - type-is (1.6.18) [MIT] -- typescript (5.8.3) [Apache-2.0, MIT, Unicode-DFS-2020, CC-BY-4.0, BSD-3-Clause, W3C-20150513] +- typescript (5.9.3) [Apache-2.0, MIT, Unicode-DFS-2020, CC-BY-4.0, BSD-3-Clause, W3C-20150513] - typescript-compare (0.0.2) [MIT] - typescript-logic (0.0.0) [MIT] - typescript-tuple (2.2.1) [MIT] @@ -12085,9 +12085,9 @@ MIT -------------------------------------------------------------------------------- -Package Title: typescript (5.8.3) +Package Title: typescript (5.9.3) -Package Locator: npm+typescript$5.8.3 +Package Locator: npm+typescript$5.9.3 Package Depth: Transitive -------------------------------------------------------------------------------- @@ -35462,4 +35462,4 @@ POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -Report Generated by FOSSA on 2026-1-5 +Report Generated by FOSSA on 2026-1-6 diff --git a/common/changes/@gooddata/sdk-ui-all/JSVA-GDAI-1140-async-kda_2026-01-06-08-06.json b/common/changes/@gooddata/sdk-ui-all/JSVA-GDAI-1140-async-kda_2026-01-06-08-06.json new file mode 100644 index 00000000000..aa04096ac45 --- /dev/null +++ b/common/changes/@gooddata/sdk-ui-all/JSVA-GDAI-1140-async-kda_2026-01-06-08-06.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@gooddata/sdk-ui-all", + "comment": "sdk-ui-dashboard,sdk-ui-gen-ai: Introduce async Key Driver Analysis UX flow.", + "type": "none" + } + ], + "packageName": "@gooddata/sdk-ui-all" +} diff --git a/common/changes/@gooddata/sdk-ui-all/mnaj-upgrade-typescript_2026-01-06-10-31.json b/common/changes/@gooddata/sdk-ui-all/mnaj-upgrade-typescript_2026-01-06-10-31.json new file mode 100644 index 00000000000..418f7451040 --- /dev/null +++ b/common/changes/@gooddata/sdk-ui-all/mnaj-upgrade-typescript_2026-01-06-10-31.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@gooddata/sdk-ui-all", + "comment": "chore: Upgrade typescript to 5.9.3", + "type": "none" + } + ], + "packageName": "@gooddata/sdk-ui-all" +} diff --git a/common/changes/@gooddata/sdk-ui-all/nen-lx-1533_2025-12-16-10-28.json b/common/changes/@gooddata/sdk-ui-all/nen-lx-1533_2025-12-16-10-28.json new file mode 100644 index 00000000000..6b6ac52864d --- /dev/null +++ b/common/changes/@gooddata/sdk-ui-all/nen-lx-1533_2025-12-16-10-28.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@gooddata/sdk-ui-all", + "comment": "Changed: Feature flag enableChartAccessibilityFeatures has been removed.", + "type": "none" + } + ], + "packageName": "@gooddata/sdk-ui-all" +} diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 022e0c00d69..bf2d564f682 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -84,10 +84,10 @@ importers: version: 19.1.7(@types/react@19.1.11) '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) '@vitejs/plugin-react': specifier: ^4.6.0 version: 4.7.0(vite@6.3.6) @@ -158,8 +158,8 @@ importers: specifier: 2.8.1 version: 2.8.1 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vite: specifier: ^6.3.6 version: 6.3.6(@types/node@22.18.5)(sass@1.70.0) @@ -232,10 +232,10 @@ importers: version: 19.1.7(@types/react@19.1.11) '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) '@vitejs/plugin-react-swc': specifier: ^3.11.0 version: 3.11.0(vite@6.3.6) @@ -282,8 +282,8 @@ importers: specifier: ^0.11.10 version: 0.11.10 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vite: specifier: ^6.3.6 version: 6.3.6(@types/node@22.18.5)(sass@1.70.0) @@ -353,10 +353,10 @@ importers: version: 19.1.7(@types/react@19.1.11) '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) '@vitejs/plugin-react-swc': specifier: ^3.11.0 version: 3.11.0(vite@6.3.6) @@ -403,8 +403,8 @@ importers: specifier: ^0.11.10 version: 0.11.10 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vite: specifier: ^6.3.6 version: 6.3.6(@types/node@22.18.5)(sass@1.70.0) @@ -474,10 +474,10 @@ importers: version: 19.1.7(@types/react@19.1.11) '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) '@vitejs/plugin-react-swc': specifier: ^3.11.0 version: 3.11.0(vite@6.3.6) @@ -524,8 +524,8 @@ importers: specifier: ^0.11.10 version: 0.11.10 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vite: specifier: ^6.3.6 version: 6.3.6(@types/node@22.18.5)(sass@1.70.0) @@ -595,10 +595,10 @@ importers: version: 19.1.7(@types/react@19.1.11) '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) '@vitejs/plugin-react-swc': specifier: ^3.11.0 version: 3.11.0(vite@6.3.6) @@ -645,8 +645,8 @@ importers: specifier: ^0.11.10 version: 0.11.10 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vite: specifier: ^6.3.6 version: 6.3.6(@types/node@22.18.5)(sass@1.70.0) @@ -716,10 +716,10 @@ importers: version: 19.1.7(@types/react@19.1.11) '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) '@vitejs/plugin-react-swc': specifier: ^3.11.0 version: 3.11.0(vite@6.3.6) @@ -766,8 +766,8 @@ importers: specifier: ^0.11.10 version: 0.11.10 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vite: specifier: ^6.3.6 version: 6.3.6(@types/node@22.18.5)(sass@1.70.0) @@ -837,10 +837,10 @@ importers: version: 19.1.7(@types/react@19.1.11) '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) '@vitejs/plugin-react-swc': specifier: ^3.11.0 version: 3.11.0(vite@6.3.6) @@ -887,8 +887,8 @@ importers: specifier: ^0.11.10 version: 0.11.10 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vite: specifier: ^6.3.6 version: 6.3.6(@types/node@22.18.5)(sass@1.70.0) @@ -958,10 +958,10 @@ importers: version: 19.1.7(@types/react@19.1.11) '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) '@vitejs/plugin-react-swc': specifier: ^3.11.0 version: 3.11.0(vite@6.3.6) @@ -1008,8 +1008,8 @@ importers: specifier: ^0.11.10 version: 0.11.10 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vite: specifier: ^6.3.6 version: 6.3.6(@types/node@22.18.5)(sass@1.70.0) @@ -1079,10 +1079,10 @@ importers: version: 19.1.7(@types/react@19.1.11) '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) '@vitejs/plugin-react-swc': specifier: ^3.11.0 version: 3.11.0(vite@6.3.6) @@ -1129,8 +1129,8 @@ importers: specifier: ^0.11.10 version: 0.11.10 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vite: specifier: ^6.3.6 version: 6.3.6(@types/node@22.18.5)(sass@1.70.0) @@ -1209,10 +1209,10 @@ importers: version: 19.1.7(@types/react@19.1.11) '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) '@vitejs/plugin-react-swc': specifier: ^3.11.0 version: 3.11.0(vite@6.3.6) @@ -1259,8 +1259,8 @@ importers: specifier: ^0.11.10 version: 0.11.10 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vite: specifier: ^6.3.6 version: 6.3.6(@types/node@22.18.5)(sass@1.70.0) @@ -1330,10 +1330,10 @@ importers: version: 19.1.7(@types/react@19.1.11) '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) '@vitejs/plugin-react-swc': specifier: ^3.11.0 version: 3.11.0(vite@6.3.6) @@ -1380,8 +1380,8 @@ importers: specifier: ^0.11.10 version: 0.11.10 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vite: specifier: ^6.3.6 version: 6.3.6(@types/node@22.18.5)(sass@1.70.0) @@ -1451,10 +1451,10 @@ importers: version: 19.1.7(@types/react@19.1.11) '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) '@vitejs/plugin-react-swc': specifier: ^3.11.0 version: 3.11.0(vite@6.3.6) @@ -1501,8 +1501,8 @@ importers: specifier: ^0.11.10 version: 0.11.10 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vite: specifier: ^6.3.6 version: 6.3.6(@types/node@22.18.5)(sass@1.70.0) @@ -1572,10 +1572,10 @@ importers: version: 19.1.7(@types/react@19.1.11) '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) '@vitejs/plugin-react-swc': specifier: ^3.11.0 version: 3.11.0(vite@6.3.6) @@ -1622,8 +1622,8 @@ importers: specifier: ^0.11.10 version: 0.11.10 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vite: specifier: ^6.3.6 version: 6.3.6(@types/node@22.18.5)(sass@1.70.0) @@ -1693,10 +1693,10 @@ importers: version: 19.1.7(@types/react@19.1.11) '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) '@vitejs/plugin-react-swc': specifier: ^3.11.0 version: 3.11.0(vite@6.3.6) @@ -1743,8 +1743,8 @@ importers: specifier: ^0.11.10 version: 0.11.10 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vite: specifier: ^6.3.6 version: 6.3.6(@types/node@22.18.5)(sass@1.70.0) @@ -1814,10 +1814,10 @@ importers: version: 19.1.7(@types/react@19.1.11) '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) '@vitejs/plugin-react-swc': specifier: ^3.11.0 version: 3.11.0(vite@6.3.6) @@ -1864,8 +1864,8 @@ importers: specifier: ^0.11.10 version: 0.11.10 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vite: specifier: ^6.3.6 version: 6.3.6(@types/node@22.18.5)(sass@1.70.0) @@ -1911,10 +1911,10 @@ importers: version: 4.17.12 '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) commander: specifier: ^8.1.0 version: 8.3.0 @@ -1967,8 +1967,8 @@ importers: specifier: ^3.6.2 version: 3.6.2 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vitest: specifier: 3.2.4 version: 3.2.4(happy-dom@18.0.1)(sass@1.70.0) @@ -2029,10 +2029,10 @@ importers: version: 3.0.5 '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) dependency-cruiser: specifier: ^14.1.2 version: 14.1.2 @@ -2073,8 +2073,8 @@ importers: specifier: ^3.6.2 version: 3.6.2 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vitest: specifier: 3.2.4 version: 3.2.4(happy-dom@18.0.1)(sass@1.70.0) @@ -2123,10 +2123,10 @@ importers: version: 4.17.12 '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) dependency-cruiser: specifier: ^14.1.2 version: 14.1.2 @@ -2167,8 +2167,8 @@ importers: specifier: ^3.6.2 version: 3.6.2 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vitest: specifier: 3.2.4 version: 3.2.4(happy-dom@18.0.1)(sass@1.70.0) @@ -2202,10 +2202,10 @@ importers: version: 4.17.12 '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) dependency-cruiser: specifier: ^14.1.2 version: 14.1.2 @@ -2246,8 +2246,8 @@ importers: specifier: ^3.6.2 version: 3.6.2 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vitest: specifier: 3.2.4 version: 3.2.4(happy-dom@18.0.1)(sass@1.70.0) @@ -2332,10 +2332,10 @@ importers: version: 3.0.5 '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) dependency-cruiser: specifier: ^14.1.2 version: 14.1.2 @@ -2379,8 +2379,8 @@ importers: specifier: ^3.6.2 version: 3.6.2 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vitest: specifier: 3.2.4 version: 3.2.4(happy-dom@18.0.1)(sass@1.70.0) @@ -2414,10 +2414,10 @@ importers: version: 4.17.12 '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) dependency-cruiser: specifier: ^14.1.2 version: 14.1.2 @@ -2458,8 +2458,8 @@ importers: specifier: ^3.6.2 version: 3.6.2 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vitest: specifier: 3.2.4 version: 3.2.4(happy-dom@18.0.1)(sass@1.70.0) @@ -2508,10 +2508,10 @@ importers: version: 3.3.1 '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) dependency-cruiser: specifier: ^14.1.2 version: 14.1.2 @@ -2552,8 +2552,8 @@ importers: specifier: ^3.6.2 version: 3.6.2 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vitest: specifier: 3.2.4 version: 3.2.4(happy-dom@18.0.1)(sass@1.70.0) @@ -2592,7 +2592,7 @@ importers: version: 3.2.2 react-intl: specifier: 7.1.11 - version: 7.1.11(react@19.1.1)(typescript@5.8.3) + version: 7.1.11(react@19.1.1)(typescript@5.9.3) ts-invariant: specifier: ^0.7.5 version: 0.7.5 @@ -2653,13 +2653,13 @@ importers: version: 19.1.7(@types/react@19.1.11) '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) '@vitest/eslint-plugin': specifier: 1.3.5 - version: 1.3.5(eslint@8.57.1)(typescript@5.8.3)(vitest@3.2.4) + version: 1.3.5(eslint@8.57.1)(typescript@5.9.3)(vitest@3.2.4) dependency-cruiser: specifier: ^14.1.2 version: 14.1.2 @@ -2733,8 +2733,8 @@ importers: specifier: ^0.32.0 version: 0.32.0 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vitest: specifier: 3.2.4 version: 3.2.4(@types/node@22.18.5)(happy-dom@18.0.1) @@ -2783,10 +2783,10 @@ importers: version: 7.52.13(@types/node@22.18.5) '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) dependency-cruiser: specifier: ^14.1.2 version: 14.1.2 @@ -2827,8 +2827,8 @@ importers: specifier: ^3.6.2 version: 3.6.2 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 ../../libs/sdk-ui-catalog: dependencies: @@ -2861,7 +2861,7 @@ importers: version: 4.17.21 react-intl: specifier: 7.1.11 - version: 7.1.11(react@19.1.1)(typescript@5.8.3) + version: 7.1.11(react@19.1.1)(typescript@5.9.3) tslib: specifier: 2.8.1 version: 2.8.1 @@ -2901,13 +2901,13 @@ importers: version: 19.1.7(@types/react@19.1.11) '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) '@vitest/eslint-plugin': specifier: 1.3.5 - version: 1.3.5(eslint@8.57.1)(typescript@5.8.3)(vitest@3.2.4) + version: 1.3.5(eslint@8.57.1)(typescript@5.9.3)(vitest@3.2.4) dependency-cruiser: specifier: ^14.1.2 version: 14.1.2 @@ -2978,8 +2978,8 @@ importers: specifier: ^9.0.5 version: 9.0.5(stylelint@13.13.1) typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vitest: specifier: 3.2.4 version: 3.2.4(happy-dom@18.0.1)(sass@1.70.0) @@ -3054,7 +3054,7 @@ importers: version: 3.7.2 react-intl: specifier: 7.1.11 - version: 7.1.11(react@19.1.1)(typescript@5.8.3) + version: 7.1.11(react@19.1.1)(typescript@5.9.3) react-measure: specifier: ^2.5.2 version: 2.5.2(react-dom@19.1.1)(react@19.1.1) @@ -3118,13 +3118,13 @@ importers: version: 2.0.12 '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) '@vitest/eslint-plugin': specifier: 1.3.5 - version: 1.3.5(eslint@8.57.1)(typescript@5.8.3)(vitest@3.2.4) + version: 1.3.5(eslint@8.57.1)(typescript@5.9.3)(vitest@3.2.4) dependency-cruiser: specifier: ^14.1.2 version: 14.1.2 @@ -3198,8 +3198,8 @@ importers: specifier: ^9.0.5 version: 9.0.5(stylelint@13.13.1) typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vitest: specifier: 3.2.4 version: 3.2.4(@types/node@22.18.5)(happy-dom@18.0.1)(sass@1.70.0) @@ -3292,7 +3292,7 @@ importers: version: 14.1.0 react-intl: specifier: 7.1.11 - version: 7.1.11(react@19.1.1)(typescript@5.8.3) + version: 7.1.11(react@19.1.1)(typescript@5.9.3) react-lines-ellipsis: specifier: ^0.16.1 version: 0.16.1(react-dom@19.1.1)(react@19.1.1) @@ -3380,13 +3380,13 @@ importers: version: 7.1.34 '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) '@vitest/eslint-plugin': specifier: 1.3.5 - version: 1.3.5(eslint@8.57.1)(typescript@5.8.3)(vitest@3.2.4) + version: 1.3.5(eslint@8.57.1)(typescript@5.9.3)(vitest@3.2.4) dependency-cruiser: specifier: ^14.1.2 version: 14.1.2 @@ -3460,8 +3460,8 @@ importers: specifier: ^2.8.0 version: 2.8.0 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vitest: specifier: 3.2.4 version: 3.2.4(@types/node@22.18.5)(happy-dom@18.0.1)(sass@1.70.0) @@ -3569,7 +3569,7 @@ importers: version: 0.5.35 react-intl: specifier: 7.1.11 - version: 7.1.11(react@19.1.1)(typescript@5.8.3) + version: 7.1.11(react@19.1.1)(typescript@5.9.3) react-lines-ellipsis: specifier: ^0.16.1 version: 0.16.1(react-dom@19.1.1)(react@19.1.1) @@ -3654,13 +3654,13 @@ importers: version: 2.0.12 '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) '@vitest/eslint-plugin': specifier: 1.3.5 - version: 1.3.5(eslint@8.57.1)(typescript@5.8.3)(vitest@3.2.4) + version: 1.3.5(eslint@8.57.1)(typescript@5.9.3)(vitest@3.2.4) dependency-cruiser: specifier: ^14.1.2 version: 14.1.2 @@ -3737,8 +3737,8 @@ importers: specifier: ^2.8.0 version: 2.8.0 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vitest: specifier: 3.2.4 version: 3.2.4(@types/node@22.18.5)(happy-dom@18.0.1)(sass@1.70.0) @@ -3795,7 +3795,7 @@ importers: version: 9.9.0(react@19.1.1) react-intl: specifier: 7.1.11 - version: 7.1.11(react@19.1.1)(typescript@5.8.3) + version: 7.1.11(react@19.1.1)(typescript@5.9.3) react-responsive: specifier: ^10.0.1 version: 10.0.1(react@19.1.1) @@ -3856,13 +3856,13 @@ importers: version: 19.1.7(@types/react@19.1.11) '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) '@vitest/eslint-plugin': specifier: 1.3.5 - version: 1.3.5(eslint@8.57.1)(typescript@5.8.3)(vitest@3.2.4) + version: 1.3.5(eslint@8.57.1)(typescript@5.9.3)(vitest@3.2.4) dependency-cruiser: specifier: ^14.1.2 version: 14.1.2 @@ -3936,8 +3936,8 @@ importers: specifier: ^9.0.5 version: 9.0.5(stylelint@13.13.1) typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vitest: specifier: 3.2.4 version: 3.2.4(@types/node@22.18.5)(happy-dom@18.0.1)(sass@1.70.0) @@ -4018,7 +4018,7 @@ importers: version: 4.17.21 react-intl: specifier: 7.1.11 - version: 7.1.11(react@19.1.1)(typescript@5.8.3) + version: 7.1.11(react@19.1.1)(typescript@5.9.3) react-loading-skeleton: specifier: ^3.4.0 version: 3.5.0(react@19.1.1) @@ -4094,13 +4094,13 @@ importers: version: 7.1.34 '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) '@vitest/eslint-plugin': specifier: 1.3.5 - version: 1.3.5(eslint@8.57.1)(typescript@5.8.3)(vitest@3.2.4) + version: 1.3.5(eslint@8.57.1)(typescript@5.9.3)(vitest@3.2.4) dependency-cruiser: specifier: ^14.1.2 version: 14.1.2 @@ -4174,8 +4174,8 @@ importers: specifier: ^2.8.0 version: 2.8.0 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vitest: specifier: 3.2.4 version: 3.2.4(@types/node@22.18.5)(happy-dom@18.0.1)(sass@1.70.0) @@ -4223,7 +4223,7 @@ importers: version: 4.7.1 react-intl: specifier: 7.1.11 - version: 7.1.11(react@19.1.1)(typescript@5.8.3) + version: 7.1.11(react@19.1.1)(typescript@5.9.3) react-measure: specifier: ^2.5.2 version: 2.5.2(react-dom@19.1.1)(react@19.1.1) @@ -4284,13 +4284,13 @@ importers: version: 2.0.12 '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) '@vitest/eslint-plugin': specifier: 1.3.5 - version: 1.3.5(eslint@8.57.1)(typescript@5.8.3)(vitest@3.2.4) + version: 1.3.5(eslint@8.57.1)(typescript@5.9.3)(vitest@3.2.4) dependency-cruiser: specifier: ^14.1.2 version: 14.1.2 @@ -4358,8 +4358,8 @@ importers: specifier: ^9.0.5 version: 9.0.5(stylelint@13.13.1) typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vitest: specifier: 3.2.4 version: 3.2.4(@types/node@22.18.5)(happy-dom@18.0.1)(sass@1.70.0) @@ -4467,7 +4467,7 @@ importers: version: 3.2.2 react-intl: specifier: 7.1.11 - version: 7.1.11(react@19.1.1)(typescript@5.8.3) + version: 7.1.11(react@19.1.1)(typescript@5.9.3) react-loading-skeleton: specifier: ^3.4.0 version: 3.5.0(react@19.1.1) @@ -4564,13 +4564,13 @@ importers: version: 1.4.6 '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) '@vitest/eslint-plugin': specifier: 1.3.5 - version: 1.3.5(eslint@8.57.1)(typescript@5.8.3)(vitest@3.2.4) + version: 1.3.5(eslint@8.57.1)(typescript@5.9.3)(vitest@3.2.4) dependency-cruiser: specifier: ^14.1.2 version: 14.1.2 @@ -4647,8 +4647,8 @@ importers: specifier: ^2.8.0 version: 2.8.0 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vitest: specifier: 3.2.4 version: 3.2.4(@types/node@22.18.5)(happy-dom@18.0.1)(sass@1.70.0) @@ -4678,7 +4678,7 @@ importers: version: 4.17.21 react-intl: specifier: 7.1.11 - version: 7.1.11(react@19.1.1)(typescript@5.8.3) + version: 7.1.11(react@19.1.1)(typescript@5.9.3) semver: specifier: ^7.3.5 version: 7.7.2 @@ -4718,10 +4718,10 @@ importers: version: 7.7.1 '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) dependency-cruiser: specifier: ^14.1.2 version: 14.1.2 @@ -4777,8 +4777,8 @@ importers: specifier: 19.1.1 version: 19.1.1(react@19.1.1) typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 ../../libs/sdk-ui-pivot: dependencies: @@ -4823,7 +4823,7 @@ importers: version: 4.17.21 react-intl: specifier: 7.1.11 - version: 7.1.11(react@19.1.1)(typescript@5.8.3) + version: 7.1.11(react@19.1.1)(typescript@5.9.3) ts-invariant: specifier: ^0.7.5 version: 0.7.5 @@ -4878,13 +4878,13 @@ importers: version: 19.1.7(@types/react@19.1.11) '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) '@vitest/eslint-plugin': specifier: 1.3.5 - version: 1.3.5(eslint@8.57.1)(typescript@5.8.3)(vitest@3.2.4) + version: 1.3.5(eslint@8.57.1)(typescript@5.9.3)(vitest@3.2.4) dependency-cruiser: specifier: ^14.1.2 version: 14.1.2 @@ -4958,8 +4958,8 @@ importers: specifier: ^9.0.5 version: 9.0.5(stylelint@13.13.1) typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vitest: specifier: 3.2.4 version: 3.2.4(@types/node@22.18.5)(happy-dom@18.0.1)(sass@1.70.0) @@ -4995,7 +4995,7 @@ importers: version: 4.17.21 react-intl: specifier: 7.1.11 - version: 7.1.11(react@19.1.1)(typescript@5.8.3) + version: 7.1.11(react@19.1.1)(typescript@5.9.3) tslib: specifier: 2.8.1 version: 2.8.1 @@ -5035,13 +5035,13 @@ importers: version: 19.1.7(@types/react@19.1.11) '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) '@vitest/eslint-plugin': specifier: 1.3.5 - version: 1.3.5(eslint@8.57.1)(typescript@5.8.3)(vitest@3.2.4) + version: 1.3.5(eslint@8.57.1)(typescript@5.9.3)(vitest@3.2.4) dependency-cruiser: specifier: ^14.1.2 version: 14.1.2 @@ -5112,8 +5112,8 @@ importers: specifier: ^9.0.5 version: 9.0.5(stylelint@13.13.1) typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vitest: specifier: 3.2.4 version: 3.2.4(happy-dom@18.0.1)(sass@1.70.0) @@ -5215,7 +5215,7 @@ importers: version: 1.0.3(css-loader@6.11.0)(sass-loader@10.5.2)(style-loader@3.3.4) '@storybook/react-vite': specifier: ^10.0.6 - version: 10.0.6(react-dom@19.1.1)(react@19.1.1)(storybook@10.0.6)(typescript@5.8.3)(vite@6.3.6)(webpack@5.93.0) + version: 10.0.6(react-dom@19.1.1)(react@19.1.1)(storybook@10.0.6)(typescript@5.9.3)(vite@6.3.6)(webpack@5.93.0) '@testing-library/dom': specifier: 10.4.0 version: 10.4.0 @@ -5239,13 +5239,13 @@ importers: version: 3.0.5 '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) '@vitest/eslint-plugin': specifier: 1.3.5 - version: 1.3.5(eslint@8.57.1)(typescript@5.8.3)(vitest@3.2.4) + version: 1.3.5(eslint@8.57.1)(typescript@5.9.3)(vitest@3.2.4) babel-loader: specifier: ^8.0.5 version: 8.4.1(@babel/core@7.28.4)(webpack@5.93.0) @@ -5299,7 +5299,7 @@ importers: version: 0.16.0(eslint@8.57.1) eslint-plugin-storybook: specifier: ^10.0.6 - version: 10.0.6(eslint@8.57.1)(storybook@10.0.6)(typescript@5.8.3) + version: 10.0.6(eslint@8.57.1)(storybook@10.0.6)(typescript@5.9.3) eslint-plugin-tsdoc: specifier: 0.2.14 version: 0.2.14 @@ -5332,7 +5332,7 @@ importers: version: 19.1.1(react@19.1.1) react-intl: specifier: 7.1.11 - version: 7.1.11(react@19.1.1)(typescript@5.8.3) + version: 7.1.11(react@19.1.1)(typescript@5.9.3) react-responsive: specifier: ^10.0.1 version: 10.0.1(react@19.1.1) @@ -5368,13 +5368,13 @@ importers: version: 0.7.5 ts-loader: specifier: ^8.3.0 - version: 8.4.0(typescript@5.8.3)(webpack@5.93.0) + version: 8.4.0(typescript@5.9.3)(webpack@5.93.0) tslib: specifier: 2.8.1 version: 2.8.1 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 uuid: specifier: ^11.1.0 version: 11.1.0 @@ -5479,10 +5479,10 @@ importers: version: 5.3.3 '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) '@vitejs/plugin-react': specifier: ^4.6.0 version: 4.7.0(vite@6.3.6) @@ -5587,7 +5587,7 @@ importers: version: 19.1.1(react@19.1.1) react-intl: specifier: 7.1.11 - version: 7.1.11(react@19.1.1)(typescript@5.8.3) + version: 7.1.11(react@19.1.1)(typescript@5.9.3) react-router-dom: specifier: ^5.2.0 version: 5.3.4(react@19.1.1) @@ -5601,8 +5601,8 @@ importers: specifier: 2.8.1 version: 2.8.1 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vite: specifier: ^6.3.6 version: 6.3.6(@types/node@22.18.5)(sass@1.70.0) @@ -5690,13 +5690,13 @@ importers: version: 19.1.7(@types/react@19.1.11) '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) '@vitest/eslint-plugin': specifier: 1.3.5 - version: 1.3.5(eslint@8.57.1)(typescript@5.8.3)(vitest@3.2.4) + version: 1.3.5(eslint@8.57.1)(typescript@5.9.3)(vitest@3.2.4) dependency-cruiser: specifier: ^14.1.2 version: 14.1.2 @@ -5755,8 +5755,8 @@ importers: specifier: 19.1.1 version: 19.1.1(react@19.1.1) typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vitest: specifier: 3.2.4 version: 3.2.4(@types/node@22.18.5)(happy-dom@18.0.1) @@ -5792,7 +5792,7 @@ importers: version: 4.17.21 react-intl: specifier: 7.1.11 - version: 7.1.11(react@19.1.1)(typescript@5.8.3) + version: 7.1.11(react@19.1.1)(typescript@5.9.3) react-measure: specifier: ^2.5.2 version: 2.5.2(react-dom@19.1.1)(react@19.1.1) @@ -5841,13 +5841,13 @@ importers: version: 2.0.12 '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) '@vitest/eslint-plugin': specifier: 1.3.5 - version: 1.3.5(eslint@8.57.1)(typescript@5.8.3)(vitest@3.2.4) + version: 1.3.5(eslint@8.57.1)(typescript@5.9.3)(vitest@3.2.4) dependency-cruiser: specifier: ^14.1.2 version: 14.1.2 @@ -5918,8 +5918,8 @@ importers: specifier: ^9.0.5 version: 9.0.5(stylelint@13.13.1) typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vitest: specifier: 3.2.4 version: 3.2.4(@types/node@22.18.5)(happy-dom@18.0.1)(sass@1.70.0) @@ -5970,7 +5970,7 @@ importers: version: 4.17.21 react-intl: specifier: 7.1.11 - version: 7.1.11(react@19.1.1)(typescript@5.8.3) + version: 7.1.11(react@19.1.1)(typescript@5.9.3) ts-invariant: specifier: ^0.7.5 version: 0.7.5 @@ -6007,13 +6007,13 @@ importers: version: 19.1.7(@types/react@19.1.11) '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) '@vitest/eslint-plugin': specifier: 1.3.5 - version: 1.3.5(eslint@8.57.1)(typescript@5.8.3)(vitest@3.2.4) + version: 1.3.5(eslint@8.57.1)(typescript@5.9.3)(vitest@3.2.4) dependency-cruiser: specifier: ^14.1.2 version: 14.1.2 @@ -6072,8 +6072,8 @@ importers: specifier: ^4.51.0 version: 4.54.0 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vite: specifier: ^6.3.6 version: 6.3.6(@types/node@22.18.5)(sass@1.70.0) @@ -6116,10 +6116,10 @@ importers: version: 4.17.12 '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) dependency-cruiser: specifier: ^14.1.2 version: 14.1.2 @@ -6160,8 +6160,8 @@ importers: specifier: ^3.6.2 version: 3.6.2 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vitest: specifier: 3.2.4 version: 3.2.4(happy-dom@18.0.1)(sass@1.70.0) @@ -6189,10 +6189,10 @@ importers: version: 4.17.12 '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) dependency-cruiser: specifier: ^14.1.2 version: 14.1.2 @@ -6230,8 +6230,8 @@ importers: specifier: ^3.6.2 version: 3.6.2 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vitest: specifier: 3.2.4 version: 3.2.4(happy-dom@18.0.1)(sass@1.70.0) @@ -6243,7 +6243,7 @@ importers: version: 4.17.21 react-intl: specifier: 7.1.11 - version: 7.1.11(react@19.1.1)(typescript@5.8.3) + version: 7.1.11(react@19.1.1)(typescript@5.9.3) tslib: specifier: 2.8.1 version: 2.8.1 @@ -6277,10 +6277,10 @@ importers: version: 19.1.7(@types/react@19.1.11) '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) dependency-cruiser: specifier: ^14.1.2 version: 14.1.2 @@ -6333,8 +6333,8 @@ importers: specifier: 19.1.1 version: 19.1.1(react@19.1.1) typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vitest: specifier: 3.2.4 version: 3.2.4(happy-dom@18.0.1)(sass@1.70.0) @@ -6440,10 +6440,10 @@ importers: version: 6.1.13 '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) dependency-cruiser: specifier: ^14.1.2 version: 14.1.2 @@ -6484,8 +6484,8 @@ importers: specifier: ^3.6.2 version: 3.6.2 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vitest: specifier: 3.2.4 version: 3.2.4(@types/node@22.18.5)(happy-dom@18.0.1) @@ -6518,10 +6518,10 @@ importers: version: 2.4.4 '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) blessed: specifier: ^0.1.81 version: 0.1.81 @@ -6583,8 +6583,8 @@ importers: specifier: 2.8.1 version: 2.8.1 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vitest: specifier: 3.2.4 version: 3.2.4(@types/node@22.18.5)(happy-dom@18.0.1) @@ -6663,10 +6663,10 @@ importers: version: 1.18.4 '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) dependency-cruiser: specifier: ^14.1.2 version: 14.1.2 @@ -6707,8 +6707,8 @@ importers: specifier: 18.0.1 version: 18.0.1 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vitest: specifier: 3.2.4 version: 3.2.4(@types/node@22.18.5)(happy-dom@18.0.1) @@ -6796,10 +6796,10 @@ importers: version: 19.1.7(@types/react@19.1.11) '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) babel-loader: specifier: ^8.0.5 version: 8.4.1(@babel/core@7.28.4)(webpack@5.93.0) @@ -6877,7 +6877,7 @@ importers: version: 19.1.1(react@19.1.1) react-intl: specifier: 7.1.11 - version: 7.1.11(react@19.1.1)(typescript@5.8.3) + version: 7.1.11(react@19.1.1)(typescript@5.9.3) source-map-loader: specifier: ^4.0.0 version: 4.0.2(webpack@5.93.0) @@ -6886,10 +6886,10 @@ importers: version: 3.3.4(webpack@5.93.0) ts-loader: specifier: ^8.3.0 - version: 8.4.0(typescript@5.8.3)(webpack@5.93.0) + version: 8.4.0(typescript@5.9.3)(webpack@5.93.0) typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vitest: specifier: 3.2.4 version: 3.2.4(@types/node@22.18.5)(happy-dom@18.0.1) @@ -6916,13 +6916,13 @@ importers: version: 22.18.5 '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) '@vitest/eslint-plugin': specifier: 1.3.5 - version: 1.3.5(eslint@8.57.1)(typescript@5.8.3)(vitest@3.2.4) + version: 1.3.5(eslint@8.57.1)(typescript@5.9.3)(vitest@3.2.4) eslint: specifier: ^8.57.1 version: 8.57.1 @@ -6970,7 +6970,7 @@ importers: version: 0.16.0(eslint@8.57.1) eslint-plugin-storybook: specifier: ^10.0.6 - version: 10.0.6(eslint@8.57.1)(storybook@10.0.6)(typescript@5.8.3) + version: 10.0.6(eslint@8.57.1)(storybook@10.0.6)(typescript@5.9.3) eslint-plugin-tsdoc: specifier: 0.2.14 version: 0.2.14 @@ -6987,8 +6987,8 @@ importers: specifier: ^10.0.6 version: 10.0.6(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.1.1)(react@19.1.1)(vite@6.3.6) typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vite-node: specifier: ^3.2.4 version: 3.2.4(@types/node@22.18.5)(sass@1.70.0) @@ -7040,10 +7040,10 @@ importers: version: 22.18.5 '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) dependency-cruiser: specifier: ^14.1.2 version: 14.1.2 @@ -7090,8 +7090,8 @@ importers: specifier: ^3.6.2 version: 3.6.2 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vitest: specifier: 3.2.4 version: 3.2.4(@types/node@22.18.5)(happy-dom@18.0.1) @@ -7152,10 +7152,10 @@ importers: version: 1.18.4 '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) dependency-cruiser: specifier: ^14.1.2 version: 14.1.2 @@ -7193,8 +7193,8 @@ importers: specifier: 0.2.14 version: 0.2.14 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vitest: specifier: 3.2.4 version: 3.2.4(@types/node@22.18.5)(happy-dom@18.0.1) @@ -7294,10 +7294,10 @@ importers: version: 6.1.13 '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) dependency-cruiser: specifier: ^14.1.2 version: 14.1.2 @@ -7338,8 +7338,8 @@ importers: specifier: ^3.6.2 version: 3.6.2 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vitest: specifier: 3.2.4 version: 3.2.4(@types/node@22.18.5)(happy-dom@18.0.1) @@ -7415,10 +7415,10 @@ importers: version: 19.1.7(@types/react@19.1.11) '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) case-sensitive-paths-webpack-plugin: specifier: ^2.4.0 version: 2.4.0 @@ -7490,10 +7490,10 @@ importers: version: 3.3.4(webpack@5.93.0) ts-loader: specifier: ^8.3.0 - version: 8.4.0(typescript@5.8.3)(webpack@5.93.0) + version: 8.4.0(typescript@5.9.3)(webpack@5.93.0) typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 util: specifier: ^0.12.3 version: 0.12.5 @@ -7533,10 +7533,10 @@ importers: version: 22.18.5 '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) dependency-cruiser: specifier: ^14.1.2 version: 14.1.2 @@ -7577,8 +7577,8 @@ importers: specifier: ^3.6.2 version: 3.6.2 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 ../../tools/reference-workspace-mgmt: dependencies: @@ -7609,10 +7609,10 @@ importers: version: 22.18.5 '@typescript-eslint/eslint-plugin': specifier: 8.46.0 - version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.46.0 - version: 8.46.0(eslint@8.57.1)(typescript@5.8.3) + version: 8.46.0(eslint@8.57.1)(typescript@5.9.3) dependency-cruiser: specifier: ^14.1.2 version: 14.1.2 @@ -7653,8 +7653,8 @@ importers: specifier: ^3.6.2 version: 3.6.2 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 vitest: specifier: 3.2.4 version: 3.2.4(@types/node@22.18.5)(happy-dom@18.0.1) @@ -9481,7 +9481,7 @@ packages: json-stable-stringify: 1.3.0 loud-rejection: 2.2.0 tslib: 2.8.1 - typescript: 5.8.3 + typescript: 5.9.3 transitivePeerDependencies: - ts-jest dev: false @@ -9552,7 +9552,7 @@ packages: dependencies: tslib: 2.8.1 - /@formatjs/intl@3.1.6(typescript@5.8.3): + /@formatjs/intl@3.1.6(typescript@5.9.3): resolution: {integrity: sha512-tDkXnA4qpIFcDWac8CyVJq6oW8DR7W44QDUBsfXWIIJD/FYYen0QoH46W7XsVMFfPOVKkvbufjboZrrWbEfmww==} peerDependencies: typescript: ^5.6.0 @@ -9565,7 +9565,7 @@ packages: '@formatjs/icu-messageformat-parser': 2.11.2 intl-messageformat: 10.7.16 tslib: 2.8.1 - typescript: 5.8.3 + typescript: 5.9.3 /@formatjs/ts-transformer@3.13.23: resolution: {integrity: sha512-9ufpij2uHlc/yzb2WDOswaslTQQ7nOIE7aDLWErmc7Kpm5uPU6MihSuEa//DVoNoOD+fywYkbqsZnDjvXeLuAQ==} @@ -9581,7 +9581,7 @@ packages: chalk: 4.1.2 json-stable-stringify: 1.3.0 tslib: 2.8.1 - typescript: 5.8.3 + typescript: 5.9.3 dev: false /@gooddata/api-client-bear@8.12.3: @@ -9778,7 +9778,7 @@ packages: '@sinclair/typebox': 0.27.8 dev: true - /@joshwooding/vite-plugin-react-docgen-typescript@0.6.1(typescript@5.8.3)(vite@6.3.6): + /@joshwooding/vite-plugin-react-docgen-typescript@0.6.1(typescript@5.9.3)(vite@6.3.6): resolution: {integrity: sha512-J4BaTocTOYFkMHIra1JDWrMWpNmBl4EkplIwHEsV8aeUOtdWjwSnln9U7twjMFTAEB7mptNtSKyVi1Y2W9sDJw==} peerDependencies: typescript: '>= 4.3.x' @@ -9789,8 +9789,8 @@ packages: dependencies: glob: 10.4.5 magic-string: 0.30.19 - react-docgen-typescript: 2.4.0(typescript@5.8.3) - typescript: 5.8.3 + react-docgen-typescript: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 vite: 6.3.6(@types/node@22.18.5)(sass@1.70.0) dev: true @@ -10748,7 +10748,7 @@ packages: storybook: 10.0.6(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.1.1)(react@19.1.1)(vite@6.3.6) dev: true - /@storybook/react-vite@10.0.6(react-dom@19.1.1)(react@19.1.1)(storybook@10.0.6)(typescript@5.8.3)(vite@6.3.6)(webpack@5.93.0): + /@storybook/react-vite@10.0.6(react-dom@19.1.1)(react@19.1.1)(storybook@10.0.6)(typescript@5.9.3)(vite@6.3.6)(webpack@5.93.0): resolution: {integrity: sha512-zDnOk89LDOpN0yhTCYRb8bkm6LdchGMfcCxKLQhEnSmkMmPwXsj/CADUc1Oipqih7D0JR/gxuadx+3y41znmSg==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -10756,10 +10756,10 @@ packages: storybook: ^10.0.6 vite: ^5.0.0 || ^6.0.0 || ^7.0.0 dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.1(typescript@5.8.3)(vite@6.3.6) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.1(typescript@5.9.3)(vite@6.3.6) '@rollup/pluginutils': 5.3.0 '@storybook/builder-vite': 10.0.6(storybook@10.0.6)(vite@6.3.6)(webpack@5.93.0) - '@storybook/react': 10.0.6(react-dom@19.1.1)(react@19.1.1)(storybook@10.0.6)(typescript@5.8.3) + '@storybook/react': 10.0.6(react-dom@19.1.1)(react@19.1.1)(storybook@10.0.6)(typescript@5.9.3) empathic: 2.0.0 magic-string: 0.30.19 react: 19.1.1 @@ -10777,7 +10777,7 @@ packages: - webpack dev: true - /@storybook/react@10.0.6(react-dom@19.1.1)(react@19.1.1)(storybook@10.0.6)(typescript@5.8.3): + /@storybook/react@10.0.6(react-dom@19.1.1)(react@19.1.1)(storybook@10.0.6)(typescript@5.9.3): resolution: {integrity: sha512-17SMthmwPDzX6Ex5MNnXhDS8DirGyo2I9g8VV/VtnXFWIl2r/+ZSAHjAM4NG0Tv3qia7l/jQxwL1YKk9qVRZxw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -10793,7 +10793,7 @@ packages: react: 19.1.1 react-dom: 19.1.1(react@19.1.1) storybook: 10.0.6(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.1.1)(react@19.1.1)(vite@6.3.6) - typescript: 5.8.3 + typescript: 5.9.3 dev: true /@stylelint/postcss-css-in-js@0.37.3(postcss-syntax@0.36.2)(postcss@7.0.39): @@ -11570,7 +11570,7 @@ packages: dev: true optional: true - /@typescript-eslint/eslint-plugin@8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.8.3): + /@typescript-eslint/eslint-plugin@8.46.0(@typescript-eslint/parser@8.46.0)(eslint@8.57.1)(typescript@5.9.3): resolution: {integrity: sha512-hA8gxBq4ukonVXPy0OKhiaUh/68D0E88GSmtC1iAEnGaieuDi38LhS7jdCHRLi6ErJBNDGCzvh5EnzdPwUc0DA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: @@ -11579,22 +11579,22 @@ packages: typescript: '>=4.8.4 <6.0.0' dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.46.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/parser': 8.46.0(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/scope-manager': 8.46.0 - '@typescript-eslint/type-utils': 8.46.0(eslint@8.57.1)(typescript@5.8.3) - '@typescript-eslint/utils': 8.46.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/type-utils': 8.46.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.0(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.46.0 eslint: 8.57.1 graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.8.3): + /@typescript-eslint/parser@8.46.0(eslint@8.57.1)(typescript@5.9.3): resolution: {integrity: sha512-n1H6IcDhmmUEG7TNVSspGmiHHutt7iVKtZwRppD7e04wha5MrkV1h3pti9xQLcCMt6YWsncpoT0HMjkH1FNwWQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: @@ -11603,25 +11603,25 @@ packages: dependencies: '@typescript-eslint/scope-manager': 8.46.0 '@typescript-eslint/types': 8.46.0 - '@typescript-eslint/typescript-estree': 8.46.0(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 8.46.0(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.46.0 debug: 4.4.3(supports-color@8.1.1) eslint: 8.57.1 - typescript: 5.8.3 + typescript: 5.9.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/project-service@8.46.0(typescript@5.8.3): + /@typescript-eslint/project-service@8.46.0(typescript@5.9.3): resolution: {integrity: sha512-OEhec0mH+U5Je2NZOeK1AbVCdm0ChyapAyTeXVIYTPXDJ3F07+cu87PPXcGoYqZ7M9YJVvFnfpGg1UmCIqM+QQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' dependencies: - '@typescript-eslint/tsconfig-utils': 8.46.0(typescript@5.8.3) + '@typescript-eslint/tsconfig-utils': 8.46.0(typescript@5.9.3) '@typescript-eslint/types': 8.46.0 debug: 4.4.3(supports-color@8.1.1) - typescript: 5.8.3 + typescript: 5.9.3 transitivePeerDependencies: - supports-color dev: true @@ -11634,16 +11634,16 @@ packages: '@typescript-eslint/visitor-keys': 8.46.0 dev: true - /@typescript-eslint/tsconfig-utils@8.46.0(typescript@5.8.3): + /@typescript-eslint/tsconfig-utils@8.46.0(typescript@5.9.3): resolution: {integrity: sha512-WrYXKGAHY836/N7zoK/kzi6p8tXFhasHh8ocFL9VZSAkvH956gfeRfcnhs3xzRy8qQ/dq3q44v1jvQieMFg2cw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' dependencies: - typescript: 5.8.3 + typescript: 5.9.3 dev: true - /@typescript-eslint/type-utils@8.46.0(eslint@8.57.1)(typescript@5.8.3): + /@typescript-eslint/type-utils@8.46.0(eslint@8.57.1)(typescript@5.9.3): resolution: {integrity: sha512-hy+lvYV1lZpVs2jRaEYvgCblZxUoJiPyCemwbQZ+NGulWkQRy0HRPYAoef/CNSzaLt+MLvMptZsHXHlkEilaeg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: @@ -11651,12 +11651,12 @@ packages: typescript: '>=4.8.4 <6.0.0' dependencies: '@typescript-eslint/types': 8.46.0 - '@typescript-eslint/typescript-estree': 8.46.0(typescript@5.8.3) - '@typescript-eslint/utils': 8.46.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 8.46.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.0(eslint@8.57.1)(typescript@5.9.3) debug: 4.4.3(supports-color@8.1.1) eslint: 8.57.1 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color dev: true @@ -11666,14 +11666,14 @@ packages: engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dev: true - /@typescript-eslint/typescript-estree@8.46.0(typescript@5.8.3): + /@typescript-eslint/typescript-estree@8.46.0(typescript@5.9.3): resolution: {integrity: sha512-ekDCUfVpAKWJbRfm8T1YRrCot1KFxZn21oV76v5Fj4tr7ELyk84OS+ouvYdcDAwZL89WpEkEj2DKQ+qg//+ucg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' dependencies: - '@typescript-eslint/project-service': 8.46.0(typescript@5.8.3) - '@typescript-eslint/tsconfig-utils': 8.46.0(typescript@5.8.3) + '@typescript-eslint/project-service': 8.46.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.46.0(typescript@5.9.3) '@typescript-eslint/types': 8.46.0 '@typescript-eslint/visitor-keys': 8.46.0 debug: 4.4.3(supports-color@8.1.1) @@ -11681,13 +11681,13 @@ packages: is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.2 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils@8.46.0(eslint@8.57.1)(typescript@5.8.3): + /@typescript-eslint/utils@8.46.0(eslint@8.57.1)(typescript@5.9.3): resolution: {integrity: sha512-nD6yGWPj1xiOm4Gk0k6hLSZz2XkNXhuYmyIrOWcHoPuAhjT9i5bAG+xbWPgFeNR8HPHHtpNKdYUXJl/D3x7f5g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: @@ -11697,9 +11697,9 @@ packages: '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) '@typescript-eslint/scope-manager': 8.46.0 '@typescript-eslint/types': 8.46.0 - '@typescript-eslint/typescript-estree': 8.46.0(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 8.46.0(typescript@5.9.3) eslint: 8.57.1 - typescript: 5.8.3 + typescript: 5.9.3 transitivePeerDependencies: - supports-color dev: true @@ -11898,7 +11898,7 @@ packages: - supports-color dev: true - /@vitest/eslint-plugin@1.3.5(eslint@8.57.1)(typescript@5.8.3)(vitest@3.2.4): + /@vitest/eslint-plugin@1.3.5(eslint@8.57.1)(typescript@5.9.3)(vitest@3.2.4): resolution: {integrity: sha512-vdQL1s+Yb9i7xXFur0qRpECwkafrp+L84EXppg3Xs+Iu+5M8smkh5I2rD5opD7cEaSBE3UEebB3xbDANqALpKA==} peerDependencies: eslint: '>= 8.57.0' @@ -11911,9 +11911,9 @@ packages: optional: true dependencies: '@typescript-eslint/scope-manager': 8.46.0 - '@typescript-eslint/utils': 8.46.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/utils': 8.46.0(eslint@8.57.1)(typescript@5.9.3) eslint: 8.57.1 - typescript: 5.8.3 + typescript: 5.9.3 vitest: 3.2.4(@types/node@22.18.5)(happy-dom@18.0.1) transitivePeerDependencies: - supports-color @@ -14669,13 +14669,13 @@ packages: eslint: 8.57.1 dev: true - /eslint-plugin-storybook@10.0.6(eslint@8.57.1)(storybook@10.0.6)(typescript@5.8.3): + /eslint-plugin-storybook@10.0.6(eslint@8.57.1)(storybook@10.0.6)(typescript@5.9.3): resolution: {integrity: sha512-llPShAqO86PgjswUDXwkxq1hGBjM7NiZE+nScbTjM3NVx0XwqbSZ+FRV2p5nv6vrZeREfhhY/KJF2WuSaYkXiQ==} peerDependencies: eslint: '>=8' storybook: ^10.0.6 dependencies: - '@typescript-eslint/utils': 8.46.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/utils': 8.46.0(eslint@8.57.1)(typescript@5.9.3) eslint: 8.57.1 storybook: 10.0.6(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.1.1)(react@19.1.1)(vite@6.3.6) transitivePeerDependencies: @@ -18700,12 +18700,12 @@ packages: dnd-core: 14.0.1 dev: false - /react-docgen-typescript@2.4.0(typescript@5.8.3): + /react-docgen-typescript@2.4.0(typescript@5.9.3): resolution: {integrity: sha512-ZtAp5XTO5HRzQctjPU0ybY0RRCQO19X/8fxn3w7y2VVTUbGHDKULPTL4ky3vB05euSgG5NpALhEhDPvQ56wvXg==} peerDependencies: typescript: '>= 4.3.x' dependencies: - typescript: 5.8.3 + typescript: 5.9.3 dev: true /react-docgen@8.0.1: @@ -18738,7 +18738,7 @@ packages: resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} dev: false - /react-intl@7.1.11(react@19.1.1)(typescript@5.8.3): + /react-intl@7.1.11(react@19.1.1)(typescript@5.9.3): resolution: {integrity: sha512-tnVoRCWvW5Ie2ikYSdPF7z3+880yCe/9xPmitFeRPw3RYDcCfR4m8ZYa4MBq19W4adt9Z+PQA4FaMBCJ7E+HCQ==} peerDependencies: react: 16 || 17 || 18 || 19 @@ -18749,14 +18749,14 @@ packages: dependencies: '@formatjs/ecma402-abstract': 2.3.4 '@formatjs/icu-messageformat-parser': 2.11.2 - '@formatjs/intl': 3.1.6(typescript@5.8.3) + '@formatjs/intl': 3.1.6(typescript@5.9.3) '@types/hoist-non-react-statics': 3.3.7(@types/react@19.1.11) '@types/react': 19.1.11 hoist-non-react-statics: 3.3.2 intl-messageformat: 10.7.16 react: 19.1.1 tslib: 2.8.1 - typescript: 5.8.3 + typescript: 5.9.3 /react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} @@ -20695,13 +20695,13 @@ packages: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} dev: false - /ts-api-utils@2.1.0(typescript@5.8.3): + /ts-api-utils@2.1.0(typescript@5.9.3): resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' dependencies: - typescript: 5.8.3 + typescript: 5.9.3 dev: true /ts-dedent@2.2.0: @@ -20715,7 +20715,7 @@ packages: dependencies: tslib: 2.8.1 - /ts-loader@8.4.0(typescript@5.8.3)(webpack@5.93.0): + /ts-loader@8.4.0(typescript@5.9.3)(webpack@5.93.0): resolution: {integrity: sha512-6nFY3IZ2//mrPc+ImY3hNWx1vCHyEhl6V+wLmL4CZcm6g1CqX7UKrkc6y0i4FwcfOhxyMPCfaEvh20f4r9GNpw==} engines: {node: '>=10.0.0'} peerDependencies: @@ -20730,7 +20730,7 @@ packages: loader-utils: 2.0.4 micromatch: 4.0.8 semver: 7.7.2 - typescript: 5.8.3 + typescript: 5.9.3 webpack: 5.93.0(webpack-cli@6.0.1) dev: true @@ -20906,8 +20906,8 @@ packages: hasBin: true dev: true - /typescript@5.8.3: - resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + /typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} hasBin: true diff --git a/examples/playground/package.json b/examples/playground/package.json index 1b2613fa7a6..2d21cca7fc6 100644 --- a/examples/playground/package.json +++ b/examples/playground/package.json @@ -79,7 +79,7 @@ "sass": "1.70.0", "ts-invariant": "^0.7.5", "tslib": "2.8.1", - "typescript": "5.8.3", + "typescript": "5.9.3", "vite": "^6.3.6" }, "dependenciesInfo": "This is package is SDk tool and is not distributed all dependencies must be defined as devDependencies due to FOSSA automated report generation" diff --git a/examples/sdk-interactive-examples/examples-template/package.json b/examples/sdk-interactive-examples/examples-template/package.json index 75f224fee63..392b669f1c6 100644 --- a/examples/sdk-interactive-examples/examples-template/package.json +++ b/examples/sdk-interactive-examples/examples-template/package.json @@ -62,7 +62,7 @@ "eslint-plugin-tsdoc": "0.2.14", "prettier": "^3.6.2", "process": "^0.11.10", - "typescript": "5.8.3", + "typescript": "5.9.3", "vite": "^6.3.6", "vite-plugin-html": "~3.2.0" }, diff --git a/examples/sdk-interactive-examples/examples/example-attributefilter/package.json b/examples/sdk-interactive-examples/examples/example-attributefilter/package.json index 53374f95670..299894f5d35 100644 --- a/examples/sdk-interactive-examples/examples/example-attributefilter/package.json +++ b/examples/sdk-interactive-examples/examples/example-attributefilter/package.json @@ -62,7 +62,7 @@ "eslint-plugin-tsdoc": "0.2.14", "prettier": "^3.6.2", "process": "^0.11.10", - "typescript": "5.8.3", + "typescript": "5.9.3", "vite": "^6.3.6", "vite-plugin-html": "~3.2.0" }, diff --git a/examples/sdk-interactive-examples/examples/example-chartconfig/package.json b/examples/sdk-interactive-examples/examples/example-chartconfig/package.json index fe577437e85..78205ef0799 100644 --- a/examples/sdk-interactive-examples/examples/example-chartconfig/package.json +++ b/examples/sdk-interactive-examples/examples/example-chartconfig/package.json @@ -62,7 +62,7 @@ "eslint-plugin-tsdoc": "0.2.14", "prettier": "^3.6.2", "process": "^0.11.10", - "typescript": "5.8.3", + "typescript": "5.9.3", "vite": "^6.3.6", "vite-plugin-html": "~3.2.0" }, diff --git a/examples/sdk-interactive-examples/examples/example-columnchart/package.json b/examples/sdk-interactive-examples/examples/example-columnchart/package.json index 81775e65844..ec8aeada0f4 100644 --- a/examples/sdk-interactive-examples/examples/example-columnchart/package.json +++ b/examples/sdk-interactive-examples/examples/example-columnchart/package.json @@ -62,7 +62,7 @@ "eslint-plugin-tsdoc": "0.2.14", "prettier": "^3.6.2", "process": "^0.11.10", - "typescript": "5.8.3", + "typescript": "5.9.3", "vite": "^6.3.6", "vite-plugin-html": "~3.2.0" }, diff --git a/examples/sdk-interactive-examples/examples/example-combochart/package.json b/examples/sdk-interactive-examples/examples/example-combochart/package.json index 3addde7eebc..20274b3fcfd 100644 --- a/examples/sdk-interactive-examples/examples/example-combochart/package.json +++ b/examples/sdk-interactive-examples/examples/example-combochart/package.json @@ -62,7 +62,7 @@ "eslint-plugin-tsdoc": "0.2.14", "prettier": "^3.6.2", "process": "^0.11.10", - "typescript": "5.8.3", + "typescript": "5.9.3", "vite": "^6.3.6", "vite-plugin-html": "~3.2.0" }, diff --git a/examples/sdk-interactive-examples/examples/example-dashboard/package.json b/examples/sdk-interactive-examples/examples/example-dashboard/package.json index 50aae531199..0fa6ae074f1 100644 --- a/examples/sdk-interactive-examples/examples/example-dashboard/package.json +++ b/examples/sdk-interactive-examples/examples/example-dashboard/package.json @@ -62,7 +62,7 @@ "eslint-plugin-tsdoc": "0.2.14", "prettier": "^3.6.2", "process": "^0.11.10", - "typescript": "5.8.3", + "typescript": "5.9.3", "vite": "^6.3.6", "vite-plugin-html": "~3.2.0" }, diff --git a/examples/sdk-interactive-examples/examples/example-datefilter/package.json b/examples/sdk-interactive-examples/examples/example-datefilter/package.json index 71482583454..3c4b4329624 100644 --- a/examples/sdk-interactive-examples/examples/example-datefilter/package.json +++ b/examples/sdk-interactive-examples/examples/example-datefilter/package.json @@ -62,7 +62,7 @@ "eslint-plugin-tsdoc": "0.2.14", "prettier": "^3.6.2", "process": "^0.11.10", - "typescript": "5.8.3", + "typescript": "5.9.3", "vite": "^6.3.6", "vite-plugin-html": "~3.2.0" }, diff --git a/examples/sdk-interactive-examples/examples/example-dependentfilters/package.json b/examples/sdk-interactive-examples/examples/example-dependentfilters/package.json index 5c7ec2d0a09..472b1d82da9 100644 --- a/examples/sdk-interactive-examples/examples/example-dependentfilters/package.json +++ b/examples/sdk-interactive-examples/examples/example-dependentfilters/package.json @@ -62,7 +62,7 @@ "eslint-plugin-tsdoc": "0.2.14", "prettier": "^3.6.2", "process": "^0.11.10", - "typescript": "5.8.3", + "typescript": "5.9.3", "vite": "^6.3.6", "vite-plugin-html": "~3.2.0" }, diff --git a/examples/sdk-interactive-examples/examples/example-execute/package.json b/examples/sdk-interactive-examples/examples/example-execute/package.json index f951eb0e22c..5519dae91c7 100644 --- a/examples/sdk-interactive-examples/examples/example-execute/package.json +++ b/examples/sdk-interactive-examples/examples/example-execute/package.json @@ -65,7 +65,7 @@ "eslint-plugin-tsdoc": "0.2.14", "prettier": "^3.6.2", "process": "^0.11.10", - "typescript": "5.8.3", + "typescript": "5.9.3", "vite": "^6.3.6", "vite-plugin-html": "~3.2.0" }, diff --git a/examples/sdk-interactive-examples/examples/example-granularity/package.json b/examples/sdk-interactive-examples/examples/example-granularity/package.json index 44bcffd2c34..418c5f7ec21 100644 --- a/examples/sdk-interactive-examples/examples/example-granularity/package.json +++ b/examples/sdk-interactive-examples/examples/example-granularity/package.json @@ -62,7 +62,7 @@ "eslint-plugin-tsdoc": "0.2.14", "prettier": "^3.6.2", "process": "^0.11.10", - "typescript": "5.8.3", + "typescript": "5.9.3", "vite": "^6.3.6", "vite-plugin-html": "~3.2.0" }, diff --git a/examples/sdk-interactive-examples/examples/example-headline/package.json b/examples/sdk-interactive-examples/examples/example-headline/package.json index e6833159384..84402926428 100644 --- a/examples/sdk-interactive-examples/examples/example-headline/package.json +++ b/examples/sdk-interactive-examples/examples/example-headline/package.json @@ -62,7 +62,7 @@ "eslint-plugin-tsdoc": "0.2.14", "prettier": "^3.6.2", "process": "^0.11.10", - "typescript": "5.8.3", + "typescript": "5.9.3", "vite": "^6.3.6", "vite-plugin-html": "~3.2.0" }, diff --git a/examples/sdk-interactive-examples/examples/example-pivottable/package.json b/examples/sdk-interactive-examples/examples/example-pivottable/package.json index 1785d55d7b8..11c1cc1af8e 100644 --- a/examples/sdk-interactive-examples/examples/example-pivottable/package.json +++ b/examples/sdk-interactive-examples/examples/example-pivottable/package.json @@ -62,7 +62,7 @@ "eslint-plugin-tsdoc": "0.2.14", "prettier": "^3.6.2", "process": "^0.11.10", - "typescript": "5.8.3", + "typescript": "5.9.3", "vite": "^6.3.6", "vite-plugin-html": "~3.2.0" }, diff --git a/examples/sdk-interactive-examples/examples/example-relativedatefilter/package.json b/examples/sdk-interactive-examples/examples/example-relativedatefilter/package.json index b4fe23361f2..8c880cd8352 100644 --- a/examples/sdk-interactive-examples/examples/example-relativedatefilter/package.json +++ b/examples/sdk-interactive-examples/examples/example-relativedatefilter/package.json @@ -62,7 +62,7 @@ "eslint-plugin-tsdoc": "0.2.14", "prettier": "^3.6.2", "process": "^0.11.10", - "typescript": "5.8.3", + "typescript": "5.9.3", "vite": "^6.3.6", "vite-plugin-html": "~3.2.0" }, diff --git a/examples/sdk-interactive-examples/examples/example-repeater/package.json b/examples/sdk-interactive-examples/examples/example-repeater/package.json index 1ad64b29756..e77f865b5fc 100644 --- a/examples/sdk-interactive-examples/examples/example-repeater/package.json +++ b/examples/sdk-interactive-examples/examples/example-repeater/package.json @@ -62,7 +62,7 @@ "eslint-plugin-tsdoc": "0.2.14", "prettier": "^3.6.2", "process": "^0.11.10", - "typescript": "5.8.3", + "typescript": "5.9.3", "vite": "^6.3.6", "vite-plugin-html": "~3.2.0" }, diff --git a/libs/api-client-tiger/package.json b/libs/api-client-tiger/package.json index 74e5b7cba57..ca4347fd02f 100644 --- a/libs/api-client-tiger/package.json +++ b/libs/api-client-tiger/package.json @@ -97,7 +97,7 @@ "fix-esm-import-path": "^1.4.0", "mkdirp": "^1.0.4", "prettier": "^3.6.2", - "typescript": "5.8.3", + "typescript": "5.9.3", "vitest": "3.2.4" } } diff --git a/libs/sdk-backend-base/package.json b/libs/sdk-backend-base/package.json index e39ec514cb7..cf934e9537d 100644 --- a/libs/sdk-backend-base/package.json +++ b/libs/sdk-backend-base/package.json @@ -75,7 +75,7 @@ "eslint-plugin-sonarjs": "0.16.0", "eslint-plugin-tsdoc": "0.2.14", "prettier": "^3.6.2", - "typescript": "5.8.3", + "typescript": "5.9.3", "vitest": "3.2.4" } } diff --git a/libs/sdk-backend-mockingbird/package.json b/libs/sdk-backend-mockingbird/package.json index 4b6ea1642a4..27e8686045b 100644 --- a/libs/sdk-backend-mockingbird/package.json +++ b/libs/sdk-backend-mockingbird/package.json @@ -71,7 +71,7 @@ "eslint-plugin-sonarjs": "0.16.0", "eslint-plugin-tsdoc": "0.2.14", "prettier": "^3.6.2", - "typescript": "5.8.3", + "typescript": "5.9.3", "vitest": "3.2.4" } } diff --git a/libs/sdk-backend-spi/package.json b/libs/sdk-backend-spi/package.json index 229c324475d..fe284e9a304 100644 --- a/libs/sdk-backend-spi/package.json +++ b/libs/sdk-backend-spi/package.json @@ -66,7 +66,7 @@ "eslint-plugin-sonarjs": "0.16.0", "eslint-plugin-tsdoc": "0.2.14", "prettier": "^3.6.2", - "typescript": "5.8.3", + "typescript": "5.9.3", "vitest": "3.2.4" } } diff --git a/libs/sdk-backend-tiger/package.json b/libs/sdk-backend-tiger/package.json index 969268edc3f..980fbef6c35 100644 --- a/libs/sdk-backend-tiger/package.json +++ b/libs/sdk-backend-tiger/package.json @@ -97,7 +97,7 @@ "eslint-plugin-sonarjs": "0.16.0", "eslint-plugin-tsdoc": "0.2.14", "prettier": "^3.6.2", - "typescript": "5.8.3", + "typescript": "5.9.3", "vitest": "3.2.4" } } diff --git a/libs/sdk-backend-tiger/src/backend/features/feature.ts b/libs/sdk-backend-tiger/src/backend/features/feature.ts index ae201643341..5f5663395f0 100644 --- a/libs/sdk-backend-tiger/src/backend/features/feature.ts +++ b/libs/sdk-backend-tiger/src/backend/features/feature.ts @@ -1,4 +1,4 @@ -// (C) 2020-2025 GoodData Corporation +// (C) 2020-2026 GoodData Corporation import { FeatureFlagsValues, type ITigerFeatureFlags, TigerFeaturesNames } from "../uiFeatures.js"; import { convertState } from "./state.js"; @@ -576,13 +576,6 @@ export function mapFeatures(features: FeaturesMap): Partial "BOOLEAN", FeatureFlagsValues.enableRawExports, ), - ...loadFeature( - features, - TigerFeaturesNames.EnableChartAccessibilityFeatures, - "enableChartAccessibilityFeatures", - "BOOLEAN", - FeatureFlagsValues.enableChartAccessibilityFeatures, - ), ...loadFeature( features, TigerFeaturesNames.EnableExecutionCancelling, @@ -660,13 +653,6 @@ export function mapFeatures(features: FeaturesMap): Partial "BOOLEAN", FeatureFlagsValues.enableAlertsEvaluationFrequencySetup, ), - ...loadFeature( - features, - TigerFeaturesNames.EnableRichTooManyDatapointsErrors, - "enableRichTooManyDatapointsErrors", - "BOOLEAN", - FeatureFlagsValues.enableRichTooManyDatapointsErrors, - ), ...loadFeature( features, TigerFeaturesNames.EnableLineChartTrendThreshold, diff --git a/libs/sdk-backend-tiger/src/backend/uiFeatures.ts b/libs/sdk-backend-tiger/src/backend/uiFeatures.ts index 86ed89efdf5..47037058b62 100644 --- a/libs/sdk-backend-tiger/src/backend/uiFeatures.ts +++ b/libs/sdk-backend-tiger/src/backend/uiFeatures.ts @@ -1,4 +1,4 @@ -// (C) 2020-2025 GoodData Corporation +// (C) 2020-2026 GoodData Corporation import { type IEarlyAccessFeaturesConfig, type IProductionFeaturesConfig } from "@gooddata/sdk-model"; @@ -90,7 +90,6 @@ export enum TigerFeaturesNames { EnableAmplitudeTracker = "enableAmplitudeTracker", EnableSlideshowExports = "enableSlideshowExports", EnableRawExports = "enableRawExports", - EnableChartAccessibilityFeatures = "enableChartAccessibilityFeatures", EnableExecutionCancelling = "enableExecutionCancelling", EnableDashboardTabularExport = "enableDashboardTabularExport", EnableOrchestratedTabularExports = "enableOrchestratedTabularExports", @@ -102,7 +101,6 @@ export enum TigerFeaturesNames { EnableAutomationFilterContext = "enableAutomationFilterContext", EnableDateFilterIdentifiersRollout = "enableDateFilterIdentifiersRollout", EnableAlertsEvaluationFrequencySetup = "enableAlertsEvaluationFrequencySetup", - EnableRichTooManyDatapointsErrors = "enableRichTooManyDatapointsErrors", EnableLineChartTrendThreshold = "enableLineChartTrendThreshold", EnableKDRespectLegendPosition = "enableKDRespectLegendPosition", EnableWorkspaceSettingsAppHeaderMenuItem = "enableWorkspaceSettingsAppHeaderMenuItem", @@ -223,13 +221,11 @@ export type ITigerFeatureFlags = { enableAnalyticalDesignerCatalogSideload: (typeof FeatureFlagsValues)["enableAnalyticalDesignerCatalogSideload"][number]; enableDashboardShareLink: (typeof FeatureFlagsValues)["enableDashboardShareLink"][number]; enableHighchartsAccessibility: (typeof FeatureFlagsValues)["enableHighchartsAccessibility"][number]; - enableChartAccessibilityFeatures: (typeof FeatureFlagsValues)["enableChartAccessibilityFeatures"][number]; enableAccessibleChartTooltip: (typeof FeatureFlagsValues)["enableAccessibleChartTooltip"][number]; enableExecutionTimestamp: (typeof FeatureFlagsValues)["enableExecutionTimestamp"][number]; enableAutomationFilterContext: (typeof FeatureFlagsValues)["enableAutomationFilterContext"][number]; enableDateFilterIdentifiersRollout: (typeof FeatureFlagsValues)["enableDateFilterIdentifiersRollout"][number]; enableAlertsEvaluationFrequencySetup: (typeof FeatureFlagsValues)["enableAlertsEvaluationFrequencySetup"][number]; - enableRichTooManyDatapointsErrors: (typeof FeatureFlagsValues)["enableRichTooManyDatapointsErrors"][number]; enableLineChartTrendThreshold: (typeof FeatureFlagsValues)["enableLineChartTrendThreshold"][number]; enableKDRespectLegendPosition: (typeof FeatureFlagsValues)["enableKDRespectLegendPosition"][number]; enableWorkspaceSettingsAppHeaderMenuItem: (typeof FeatureFlagsValues)["enableWorkspaceSettingsAppHeaderMenuItem"][number]; @@ -350,13 +346,11 @@ export const DefaultFeatureFlags: ITigerFeatureFlags = { enableAnalyticalDesignerCatalogSideload: false, enableDashboardShareLink: true, enableHighchartsAccessibility: true, - enableChartAccessibilityFeatures: true, enableAccessibleChartTooltip: false, enableExecutionTimestamp: true, enableAutomationFilterContext: true, enableDateFilterIdentifiersRollout: true, enableAlertsEvaluationFrequencySetup: true, - enableRichTooManyDatapointsErrors: false, enableLineChartTrendThreshold: true, enableKDRespectLegendPosition: true, enableWorkspaceSettingsAppHeaderMenuItem: false, @@ -473,7 +467,6 @@ export const FeatureFlagsValues = { enableSlideshowExports: [true, false] as const, enableRawExports: [true, false] as const, enableHighchartsAccessibility: [true, false] as const, - enableChartAccessibilityFeatures: [true, false] as const, enableAccessibleChartTooltip: [true, false] as const, enableExecutionCancelling: [true, false] as const, enableImmediateAttributeFilterDisplayAsLabelMigration: [true, false] as const, @@ -484,7 +477,6 @@ export const FeatureFlagsValues = { enableAutomationFilterContext: [true, false] as const, enableDateFilterIdentifiersRollout: [true, false] as const, enableAlertsEvaluationFrequencySetup: [true, false] as const, - enableRichTooManyDatapointsErrors: [true, false] as const, enableLineChartTrendThreshold: [true, false] as const, enableKDRespectLegendPosition: [true, false] as const, enableWorkspaceSettingsAppHeaderMenuItem: [true, false] as const, diff --git a/libs/sdk-embedding/package.json b/libs/sdk-embedding/package.json index 5b4eaf27fef..6f3e33100bb 100644 --- a/libs/sdk-embedding/package.json +++ b/libs/sdk-embedding/package.json @@ -71,7 +71,7 @@ "eslint-plugin-sonarjs": "0.16.0", "eslint-plugin-tsdoc": "0.2.14", "prettier": "^3.6.2", - "typescript": "5.8.3", + "typescript": "5.9.3", "vitest": "3.2.4" } } diff --git a/libs/sdk-model/api/sdk-model.api.md b/libs/sdk-model/api/sdk-model.api.md index 998b6094df6..bb8faff4228 100644 --- a/libs/sdk-model/api/sdk-model.api.md +++ b/libs/sdk-model/api/sdk-model.api.md @@ -3771,7 +3771,6 @@ export interface ISettings { enableAutomationFilterContext?: boolean; enableAutomationManagement?: boolean; enableChangeAnalysis?: boolean; - enableChartAccessibilityFeatures?: boolean; enableComparisonInAlerting?: boolean; enableCompositeGrain?: boolean; enableCreateUser?: boolean; diff --git a/libs/sdk-model/package.json b/libs/sdk-model/package.json index 697dec8492f..3bdaf22112b 100644 --- a/libs/sdk-model/package.json +++ b/libs/sdk-model/package.json @@ -75,7 +75,7 @@ "eslint-plugin-sonarjs": "0.16.0", "eslint-plugin-tsdoc": "0.2.14", "prettier": "^3.6.2", - "typescript": "5.8.3", + "typescript": "5.9.3", "vitest": "3.2.4" } } diff --git a/libs/sdk-model/src/settings/index.ts b/libs/sdk-model/src/settings/index.ts index b6762df2fe0..7926959f040 100644 --- a/libs/sdk-model/src/settings/index.ts +++ b/libs/sdk-model/src/settings/index.ts @@ -162,11 +162,6 @@ export interface ISettings { */ enableAccessibleChartTooltip?: boolean; - /** - * Enables additional chart accessibility features configurable in AD. - */ - enableChartAccessibilityFeatures?: boolean; - /** * Headline component will not be underlined when it is set up with drilling. */ diff --git a/libs/sdk-ui-all/package.json b/libs/sdk-ui-all/package.json index 694c8b6ae88..f06e84960c3 100644 --- a/libs/sdk-ui-all/package.json +++ b/libs/sdk-ui-all/package.json @@ -68,6 +68,6 @@ "eslint-plugin-sonarjs": "0.16.0", "eslint-plugin-tsdoc": "0.2.14", "prettier": "^3.6.2", - "typescript": "5.8.3" + "typescript": "5.9.3" } } diff --git a/libs/sdk-ui-catalog/package.json b/libs/sdk-ui-catalog/package.json index 66fd3be623a..7bc88cfc503 100644 --- a/libs/sdk-ui-catalog/package.json +++ b/libs/sdk-ui-catalog/package.json @@ -109,7 +109,7 @@ "stylelint": "^13.8.0", "stylelint-checkstyle-formatter": "^0.1.2", "stylelint-config-prettier": "^9.0.5", - "typescript": "5.8.3", + "typescript": "5.9.3", "vitest": "3.2.4", "vitest-dom": "0.1.1" }, diff --git a/libs/sdk-ui-catalog/src/localization/bundles/en-US.json b/libs/sdk-ui-catalog/src/localization/bundles/en-US.json index 9147a647700..890140dc8ac 100644 --- a/libs/sdk-ui-catalog/src/localization/bundles/en-US.json +++ b/libs/sdk-ui-catalog/src/localization/bundles/en-US.json @@ -1,486 +1,486 @@ { "analyticsCatalog.title": { - "value": "Analytics catalog", - "comment": "Title of the Analytics Catalog" + "text": "Analytics catalog", + "crowdinContext": "Title of the Analytics Catalog" }, "analyticsCatalog.showMore": { - "value": "show more", - "comment": "Show more button label" + "text": "show more", + "crowdinContext": "Show more button label" }, "analyticsCatalog.showLess": { - "value": "show less", - "comment": "Show less button label" + "text": "show less", + "crowdinContext": "Show less button label" }, "analyticsCatalog.objectType.title": { - "value": "Object types", - "comment": "Title of the header section containing the object type selection." + "text": "Object types", + "crowdinContext": "Title of the header section containing the object type selection." }, "analyticsCatalog.objectType.dashboard.button.ariaLabel": { - "value": "Dashboard: {count}", - "comment": "ARIA label for the Dashboard object type" + "text": "Dashboard: {count}", + "crowdinContext": "ARIA label for the Dashboard object type" }, "analyticsCatalog.objectType.visualization.button.ariaLabel": { - "value": "Visualization: {count}", - "comment": "ARIA label for the Visualization object type" + "text": "Visualization: {count}", + "crowdinContext": "ARIA label for the Visualization object type" }, "analyticsCatalog.objectType.metric.button.ariaLabel": { - "value": "Metric: {count}", - "comment": "ARIA label for the Metric object type" + "text": "Metric: {count}", + "crowdinContext": "ARIA label for the Metric object type" }, "analyticsCatalog.objectType.fact.button.ariaLabel": { - "value": "Fact: {count}", - "comment": "ARIA label for the Fact object type" + "text": "Fact: {count}", + "crowdinContext": "ARIA label for the Fact object type" }, "analyticsCatalog.objectType.attribute.button.ariaLabel": { - "value": "Attribute: {count}", - "comment": "ARIA label for the Attribute object type" + "text": "Attribute: {count}", + "crowdinContext": "ARIA label for the Attribute object type" }, "analyticsCatalog.objectType.dateDataset.button.ariaLabel": { - "value": "Date dataset: {count}", - "comment": "ARIA label for the Date dataset object type filter button, showing the number of matching date datasets. Example: 'Date dataset: 6'." + "text": "Date dataset: {count}", + "crowdinContext": "ARIA label for the Date dataset object type filter button, showing the number of matching date datasets. Example: 'Date dataset: 6'." }, "analyticsCatalog.objectType.dashboard.tooltip": { - "value": "Dashboard", - "comment": "Tooltip label shown when hovering the dashboard object type indicator (e.g., in the catalog table or the detail header)." + "text": "Dashboard", + "crowdinContext": "Tooltip label shown when hovering the dashboard object type indicator (e.g., in the catalog table or the detail header)." }, "analyticsCatalog.objectType.visualization.tooltip": { - "value": "Visualization", - "comment": "Tooltip label shown when hovering the visualization object type indicator when the specific visualization type is not available." + "text": "Visualization", + "crowdinContext": "Tooltip label shown when hovering the visualization object type indicator when the specific visualization type is not available." }, "analyticsCatalog.objectType.metric.tooltip": { - "value": "Metric", - "comment": "Tooltip label shown when hovering the metric object type indicator." + "text": "Metric", + "crowdinContext": "Tooltip label shown when hovering the metric object type indicator." }, "analyticsCatalog.objectType.attribute.tooltip": { - "value": "Attribute", - "comment": "Tooltip label shown when hovering the attribute object type indicator." + "text": "Attribute", + "crowdinContext": "Tooltip label shown when hovering the attribute object type indicator." }, "analyticsCatalog.objectType.fact.tooltip": { - "value": "Fact", - "comment": "Tooltip label shown when hovering the fact object type indicator." + "text": "Fact", + "crowdinContext": "Tooltip label shown when hovering the fact object type indicator." }, "analyticsCatalog.objectType.dateDataset.tooltip": { - "value": "Date dataset", - "comment": "Tooltip label shown when hovering the date dataset object type indicator." + "text": "Date dataset", + "crowdinContext": "Tooltip label shown when hovering the date dataset object type indicator." }, "analyticsCatalog.visualizationType.table.tooltip": { - "value": "Table", - "comment": "Tooltip label shown when hovering a visualization item for insights of type table." + "text": "Table", + "crowdinContext": "Tooltip label shown when hovering a visualization item for insights of type table." }, "analyticsCatalog.visualizationType.area.tooltip": { - "value": "Area chart", - "comment": "Tooltip label shown when hovering a visualization item for insights of type area chart." + "text": "Area chart", + "crowdinContext": "Tooltip label shown when hovering a visualization item for insights of type area chart." }, "analyticsCatalog.visualizationType.treemap.tooltip": { - "value": "Treemap chart", - "comment": "Tooltip label shown when hovering a visualization item for insights of type treemap chart." + "text": "Treemap chart", + "crowdinContext": "Tooltip label shown when hovering a visualization item for insights of type treemap chart." }, "analyticsCatalog.visualizationType.scatter.tooltip": { - "value": "Scatter plot", - "comment": "Tooltip label shown when hovering a visualization item for insights of type scatter plot." + "text": "Scatter plot", + "crowdinContext": "Tooltip label shown when hovering a visualization item for insights of type scatter plot." }, "analyticsCatalog.visualizationType.donut.tooltip": { - "value": "Donut chart", - "comment": "Tooltip label shown when hovering a visualization item for insights of type donut chart." + "text": "Donut chart", + "crowdinContext": "Tooltip label shown when hovering a visualization item for insights of type donut chart." }, "analyticsCatalog.visualizationType.headline.tooltip": { - "value": "Headline", - "comment": "Tooltip label shown when hovering a visualization item for insights of type headline." + "text": "Headline", + "crowdinContext": "Tooltip label shown when hovering a visualization item for insights of type headline." }, "analyticsCatalog.visualizationType.column.tooltip": { - "value": "Column chart", - "comment": "Tooltip label shown when hovering a visualization item for insights of type column chart." + "text": "Column chart", + "crowdinContext": "Tooltip label shown when hovering a visualization item for insights of type column chart." }, "analyticsCatalog.visualizationType.line.tooltip": { - "value": "Line chart", - "comment": "Tooltip label shown when hovering a visualization item for insights of type line chart." + "text": "Line chart", + "crowdinContext": "Tooltip label shown when hovering a visualization item for insights of type line chart." }, "analyticsCatalog.visualizationType.pyramid.tooltip": { - "value": "Pyramid chart", - "comment": "Tooltip label shown when hovering a visualization item for insights of type pyramid chart." + "text": "Pyramid chart", + "crowdinContext": "Tooltip label shown when hovering a visualization item for insights of type pyramid chart." }, "analyticsCatalog.visualizationType.funnel.tooltip": { - "value": "Funnel chart", - "comment": "Tooltip label shown when hovering a visualization item for insights of type funnel chart." + "text": "Funnel chart", + "crowdinContext": "Tooltip label shown when hovering a visualization item for insights of type funnel chart." }, "analyticsCatalog.visualizationType.heatmap.tooltip": { - "value": "Heatmap", - "comment": "Tooltip label shown when hovering a visualization item for insights of type heatmap." + "text": "Heatmap", + "crowdinContext": "Tooltip label shown when hovering a visualization item for insights of type heatmap." }, "analyticsCatalog.visualizationType.bubble.tooltip": { - "value": "Bubble chart", - "comment": "Tooltip label shown when hovering a visualization item for insights of type bubble chart." + "text": "Bubble chart", + "crowdinContext": "Tooltip label shown when hovering a visualization item for insights of type bubble chart." }, "analyticsCatalog.visualizationType.pie.tooltip": { - "value": "Pie chart", - "comment": "Tooltip label shown when hovering a visualization item for insights of type pie chart." + "text": "Pie chart", + "crowdinContext": "Tooltip label shown when hovering a visualization item for insights of type pie chart." }, "analyticsCatalog.visualizationType.bar.tooltip": { - "value": "Bar chart", - "comment": "Tooltip label shown when hovering a visualization item for insights of type bar chart." + "text": "Bar chart", + "crowdinContext": "Tooltip label shown when hovering a visualization item for insights of type bar chart." }, "analyticsCatalog.visualizationType.combo.tooltip": { - "value": "Combo chart", - "comment": "Tooltip label shown when hovering a visualization item for insights of type combo chart." + "text": "Combo chart", + "crowdinContext": "Tooltip label shown when hovering a visualization item for insights of type combo chart." }, "analyticsCatalog.visualizationType.bullet.tooltip": { - "value": "Bullet chart", - "comment": "Tooltip label shown when hovering a visualization item for insights of type bullet chart." + "text": "Bullet chart", + "crowdinContext": "Tooltip label shown when hovering a visualization item for insights of type bullet chart." }, "analyticsCatalog.visualizationType.waterfall.tooltip": { - "value": "Waterfall chart", - "comment": "Tooltip label shown when hovering a visualization item for insights of type waterfall chart." + "text": "Waterfall chart", + "crowdinContext": "Tooltip label shown when hovering a visualization item for insights of type waterfall chart." }, "analyticsCatalog.visualizationType.dependencywheel.tooltip": { - "value": "Dependency wheel chart", - "comment": "Tooltip label shown when hovering a visualization item for insights of type dependency wheel chart." + "text": "Dependency wheel chart", + "crowdinContext": "Tooltip label shown when hovering a visualization item for insights of type dependency wheel chart." }, "analyticsCatalog.visualizationType.sankey.tooltip": { - "value": "Sankey chart", - "comment": "Tooltip label shown when hovering a visualization item for insights of type Sankey chart." + "text": "Sankey chart", + "crowdinContext": "Tooltip label shown when hovering a visualization item for insights of type Sankey chart." }, "analyticsCatalog.visualizationType.pushpin.tooltip": { - "value": "Pushpin", - "comment": "Tooltip label shown when hovering a visualization item for insights of type pushpin (map)." + "text": "Pushpin", + "crowdinContext": "Tooltip label shown when hovering a visualization item for insights of type pushpin (map)." }, "analyticsCatalog.visualizationType.repeater.tooltip": { - "value": "Repeater", - "comment": "Tooltip label shown when hovering a visualization item for insights of type repeater." + "text": "Repeater", + "crowdinContext": "Tooltip label shown when hovering a visualization item for insights of type repeater." }, "analyticsCatalog.filter.title": { - "value": "Filters", - "comment": "Title of the header section containing the filter group." + "text": "Filters", + "crowdinContext": "Title of the header section containing the filter group." }, "analyticsCatalog.filter.refresh": { - "value": "Refresh", - "comment": "Button label for retrying when the filter data is still syncing." + "text": "Refresh", + "crowdinContext": "Button label for retrying when the filter data is still syncing." }, "analyticsCatalog.filter.createdBy.title": { - "value": "Created by", - "comment": "Title of the header section containing the created by filter." + "text": "Created by", + "crowdinContext": "Title of the header section containing the created by filter." }, "analyticsCatalog.filter.createdBy.noOptions": { - "value": "No creators available", - "comment": "Label for the no options state in the created by filter." + "text": "No creators available", + "crowdinContext": "Label for the no options state in the created by filter." }, "analyticsCatalog.filter.tags.title": { - "value": "Tags", - "comment": "Title of the header section containing the tags filter." + "text": "Tags", + "crowdinContext": "Title of the header section containing the tags filter." }, "analyticsCatalog.filter.tags.noOptions": { - "value": "No tags available", - "comment": "Label for the no options state in the tags filter." + "text": "No tags available", + "crowdinContext": "Label for the no options state in the tags filter." }, "analyticsCatalog.filter.origin.title": { - "value": "Origin", - "comment": "Title of the header section containing the origin filter." + "text": "Origin", + "crowdinContext": "Title of the header section containing the origin filter." }, "analyticsCatalog.filter.origin.parents": { - "value": "Parent", - "comment": "Label for the parents option in the origin filter." + "text": "Parent", + "crowdinContext": "Label for the parents option in the origin filter." }, "analyticsCatalog.filter.origin.native": { - "value": "Current workspace", - "comment": "Label for the native option in the origin filter." + "text": "Current workspace", + "crowdinContext": "Label for the native option in the origin filter." }, "analyticsCatalog.filter.visibility.title": { - "value": "AI visibility", - "comment": "Title of the header section containing the AI visibility filter." + "text": "AI visibility", + "crowdinContext": "Title of the header section containing the AI visibility filter." }, "analyticsCatalog.filter.visibility.visible": { - "value": "Visible in AI results", - "comment": "Label for the visible option in the AI visibility filter." + "text": "Visible in AI results", + "crowdinContext": "Label for the visible option in the AI visibility filter." }, "analyticsCatalog.filter.visibility.hidden": { - "value": "Hidden from AI results", - "comment": "Label for the hidden option in the AI visibility filter." + "text": "Hidden from AI results", + "crowdinContext": "Label for the hidden option in the AI visibility filter." }, "analyticsCatalog.filter.qualityCodes.title": { - "value": "Validations", - "comment": "Title of the header section containing the quality codes filter." + "text": "Validations", + "crowdinContext": "Title of the header section containing the quality codes filter." }, "analyticsCatalog.filter.qualityCodes.noOptions": { - "value": "No validations available", - "comment": "Label for the no options state in the validations filter." + "text": "No validations available", + "crowdinContext": "Label for the no options state in the validations filter." }, "analyticsCatalog.filter.reset": { - "value": "Reset filters", - "comment": "Label for the button that resets all applied filters." + "text": "Reset filters", + "crowdinContext": "Label for the button that resets all applied filters." }, "analyticsCatalog.column.title.label": { - "value": "Title", - "comment": "Title of the column containing the title of the object." + "text": "Title", + "crowdinContext": "Title of the column containing the title of the object." }, "analyticsCatalog.column.title.dataSet": { - "value": "Dataset", - "comment": "Title of the column containing the dataSet of the object." + "text": "Dataset", + "crowdinContext": "Title of the column containing the dataSet of the object." }, "analyticsCatalog.column.title.createdBy": { - "value": "Created by", - "comment": "Title of the column containing the name of the creator of the object." + "text": "Created by", + "crowdinContext": "Title of the column containing the name of the creator of the object." }, "analyticsCatalog.column.title.createdAt": { - "value": "Created at", - "comment": "Title of the column containing the creation date of the object." + "text": "Created at", + "crowdinContext": "Title of the column containing the creation date of the object." }, "analyticsCatalog.column.title.tags": { - "value": "Tags", - "comment": "Title of the column containing the tags of the object." + "text": "Tags", + "crowdinContext": "Title of the column containing the tags of the object." }, "analyticsCatalog.column.title.updatedAt": { - "value": "Last modified at", - "comment": "Title of the column containing the last modified date of the object." + "text": "Last modified at", + "crowdinContext": "Title of the column containing the last modified date of the object." }, "analyticsCatalog.column.title.updatedBy": { - "value": "Last modified by", - "comment": "Title of the column containing the name of the last modifier of the object." + "text": "Last modified by", + "crowdinContext": "Title of the column containing the name of the last modifier of the object." }, "analyticsCatalog.column.title.isHidden": { - "value": "Show in AI results", - "comment": "Title of the field indicating whether the object is hidden in AI results." + "text": "Show in AI results", + "crowdinContext": "Title of the field indicating whether the object is hidden in AI results." }, "analyticsCatalog.column.title.granularities": { - "value": "Granularities", - "comment": "Label for the granularities field in the catalog item details (metadata tab), listing the available date granularities for a date dataset." + "text": "Granularities", + "crowdinContext": "Label for the granularities field in the catalog item details (metadata tab), listing the available date granularities for a date dataset." }, "analyticsCatalog.column.isHidden.icon.tooltip": { - "value": "Hidden from Smart Search and AI Assistant results for all users.", - "comment": "Tooltip content displayed on the hidden icon that appears only when the catalog item's visibility is set to hidden (in table view)." + "text": "Hidden from Smart Search and AI Assistant results for all users.", + "crowdinContext": "Tooltip content displayed on the hidden icon that appears only when the catalog item's visibility is set to hidden (in table view)." }, "analyticsCatalog.column.isHidden.field.tooltip": { - "value": "Include in Smart Search and AI Assistant results for all users.", - "comment": "Tooltip content for the field indicating whether the object is hidden in AI results." + "text": "Include in Smart Search and AI Assistant results for all users.", + "crowdinContext": "Tooltip content for the field indicating whether the object is hidden in AI results." }, "analyticsCatalog.tags.manager.label.more": { - "value": "More tags", - "comment": "Label for the button that opens more tags in tags manager component." + "text": "More tags", + "crowdinContext": "Label for the button that opens more tags in tags manager component." }, "analyticsCatalog.tags.manager.label.noTags": { - "value": "No tags", - "comment": "Label for the message shown when there are no tags in tags manager component." + "text": "No tags", + "crowdinContext": "Label for the message shown when there are no tags in tags manager component." }, "analyticsCatalog.tags.manager.label.close": { - "value": "Close", - "comment": "Label for the button that closes tags manager component." + "text": "Close", + "crowdinContext": "Label for the button that closes tags manager component." }, "analyticsCatalog.tags.manager.label.addLabel": { - "value": "Add tag", - "comment": "Label for the button that opens add tag modal in tags manager component." + "text": "Add tag", + "crowdinContext": "Label for the button that opens add tag modal in tags manager component." }, "analyticsCatalog.tags.manager.label.nameLabel": { - "value": "Name", - "comment": "Label for the name input in add tag modal in tags manager component." + "text": "Name", + "crowdinContext": "Label for the name input in add tag modal in tags manager component." }, "analyticsCatalog.tags.manager.label.cancelLabel": { - "value": "Cancel", - "comment": "Label for the cancel button in add tag modal in tags manager component." + "text": "Cancel", + "crowdinContext": "Label for the cancel button in add tag modal in tags manager component." }, "analyticsCatalog.tags.manager.label.saveLabel": { - "value": "Save", - "comment": "Label for the save button in add tag modal in tags manager component." + "text": "Save", + "crowdinContext": "Label for the save button in add tag modal in tags manager component." }, "analyticsCatalog.tags.manager.label.removeLabel": { - "value": "Remove", - "comment": "Label for the remove button in tags manager component." + "text": "Remove", + "crowdinContext": "Label for the remove button in tags manager component." }, "analyticsCatalog.error.unknown.message": { - "value": "Unknown error", - "comment": "Generic error message for unidentified or unexpected errors" + "text": "Unknown error", + "crowdinContext": "Generic error message for unidentified or unexpected errors" }, "analyticsCatalog.error.unknown.description": { - "value": "We’re not quite sure what went wrong. Please try again later.", - "comment": "Instructions for users when encountering unknown errors" + "text": "We’re not quite sure what went wrong. Please try again later.", + "crowdinContext": "Instructions for users when encountering unknown errors" }, "analyticsCatalog.error.unauthorized.message": { - "value": "Unauthorized", - "comment": "Error message shown when the user does not have permission to view the analytics catalog or its data." + "text": "Unauthorized", + "crowdinContext": "Error message shown when the user does not have permission to view the analytics catalog or its data." }, "analyticsCatalog.error.unauthorized.description": { - "value": "Sorry you don't have access to the analytics catalog. Ask your administrator to grant you permissions.", - "comment": "Explanation shown when the user lacks permissions to view the analytics catalog, providing instructions for resolution." + "text": "Sorry you don't have access to the analytics catalog. Ask your administrator to grant you permissions.", + "crowdinContext": "Explanation shown when the user lacks permissions to view the analytics catalog, providing instructions for resolution." }, "analyticsCatalog.catalogItem.closeButtonLabel": { - "value": "Close", - "comment": "Label for the close button in the catalog item overlay." + "text": "Close", + "crowdinContext": "Label for the close button in the catalog item overlay." }, "analyticsCatalog.catalogItem.overlayLabel": { - "value": "Catalog item details", - "comment": "Label for the catalog item overlay." + "text": "Catalog item details", + "crowdinContext": "Label for the catalog item overlay." }, "analyticsCatalog.catalogItem.title.add": { - "value": "Add title…", - "comment": "Catalog item title placeholder." + "text": "Add title…", + "crowdinContext": "Catalog item title placeholder." }, "analyticsCatalog.catalogItem.description": { - "value": "Description", - "comment": "Catalog item description label." + "text": "Description", + "crowdinContext": "Catalog item description label." }, "analyticsCatalog.catalogItem.description.add": { - "value": "Add description…", - "comment": "Catalog item description placeholder." + "text": "Add description…", + "crowdinContext": "Catalog item description placeholder." }, "analyticsCatalog.catalogItem.update.failed": { - "value": "Failed to update catalog item. Try again later.", - "comment": "Catalog item update failed message." + "text": "Failed to update catalog item. Try again later.", + "crowdinContext": "Catalog item update failed message." }, "analyticsCatalog.catalogItem.id": { - "value": "Id", - "comment": "Catalog item id label." + "text": "Id", + "crowdinContext": "Catalog item id label." }, "analyticsCatalog.catalogItem.open": { - "value": "Open", - "comment": "Catalog item open button label." + "text": "Open", + "crowdinContext": "Catalog item open button label." }, "analyticsCatalog.catalogItem.tab.details": { - "value": "Details", - "comment": "Catalog item tab label." + "text": "Details", + "crowdinContext": "Catalog item tab label." }, "analyticsCatalog.catalogItem.tab.quality": { - "value": "Validations {count}", - "comment": "Catalog item tab label." + "text": "Validations {count}", + "crowdinContext": "Catalog item tab label." }, "analyticsCatalog.catalogItem.tab.quality.empty": { - "value": "No validation issues found.", - "comment": "Catalog item tab label." + "text": "No validation issues found.", + "crowdinContext": "Catalog item tab label." }, "analyticsCatalog.catalogItem.lock": { - "value": "You can't edit or delete this catalog item — it was created in the parent workspace. To make changes, open the parent workspace.", - "comment": "Tooltip content for lock icon indicating the catalog item is locked and cannot be edited." + "text": "You can't edit or delete this catalog item — it was created in the parent workspace. To make changes, open the parent workspace.", + "crowdinContext": "Tooltip content for lock icon indicating the catalog item is locked and cannot be edited." }, "analyticsCatalog.tooltip.content": { - "value": "Centralized catalog of dashboards, metrics, visualizations, facts, and attributes. Explore, manage, and update all objects in one place to support consistent governance, quicker insights, and improved collaboration.", - "comment": "Tooltip content for the help icon in the header." + "text": "Centralized catalog of dashboards, metrics, visualizations, facts, and attributes. Explore, manage, and update all objects in one place to support consistent governance, quicker insights, and improved collaboration.", + "crowdinContext": "Tooltip content for the help icon in the header." }, "analyticsCatalog.search.label": { - "value": "Search by title or description…", - "comment": "Accessible label for the search input." + "text": "Search by title or description…", + "crowdinContext": "Accessible label for the search input." }, "analyticsCatalog.empty.search.title": { - "value": "No match found", - "comment": "Title of the empty state when search input is filled." + "text": "No match found", + "crowdinContext": "Title of the empty state when search input is filled." }, "analyticsCatalog.empty.search.description": { - "value": "Check the spelling or adjust filters.", - "comment": "Description of the empty state when search input is filled." + "text": "Check the spelling or adjust filters.", + "crowdinContext": "Description of the empty state when search input is filled." }, "analyticsCatalog.empty.filters.title": { - "value": "No match found", - "comment": "Title of the empty state when filters are applied but search input is empty." + "text": "No match found", + "crowdinContext": "Title of the empty state when filters are applied but search input is empty." }, "analyticsCatalog.empty.filters.description": { - "value": "No matching items found for the selected filters.", - "comment": "Description of the empty state when filters are applied but search input is empty." + "text": "No matching items found for the selected filters.", + "crowdinContext": "Description of the empty state when filters are applied but search input is empty." }, "analyticsCatalog.quality.tooltip.title": { - "value": "Validation {count, plural, one {finding} other {findings}}:", - "comment": "Title for the quality tooltip." + "text": "Validation {count, plural, one {finding} other {findings}}:", + "crowdinContext": "Title for the quality tooltip." }, "analyticsCatalog.quality.tooltip.identicalTitle": { - "value": "There {count, plural, one {is # field} other {are # fields}} with the same title", - "comment": "Title for quality issue tooltip when multiple catalog items have identical titles." + "text": "There {count, plural, one {is # field} other {are # fields}} with the same title", + "crowdinContext": "Title for quality issue tooltip when multiple catalog items have identical titles." }, "analyticsCatalog.quality.tooltip.identicalDescription": { - "value": "There {count, plural, one {is # field} other {are # fields}} with the same description", - "comment": "Title for quality issue tooltip when multiple catalog items have identical descriptions." + "text": "There {count, plural, one {is # field} other {are # fields}} with the same description", + "crowdinContext": "Title for quality issue tooltip when multiple catalog items have identical descriptions." }, "analyticsCatalog.quality.tooltip.similarTitle": { - "value": "There {count, plural, one {is # field} other {are # fields}} with similar title", - "comment": "Title for quality issue tooltip when multiple catalog items have similar titles." + "text": "There {count, plural, one {is # field} other {are # fields}} with similar title", + "crowdinContext": "Title for quality issue tooltip when multiple catalog items have similar titles." }, "analyticsCatalog.quality.tooltip.similarDescription": { - "value": "There {count, plural, one {is # field} other {are # fields}} with similar description", - "comment": "Title for quality issue tooltip when multiple catalog items have similar descriptions." + "text": "There {count, plural, one {is # field} other {are # fields}} with similar description", + "crowdinContext": "Title for quality issue tooltip when multiple catalog items have similar descriptions." }, "analyticsCatalog.quality.tooltip.unknownAbbreviation": { - "value": "There {count, plural, one {is # abbreviation that is not recognized} other {are # abbreviations that are not recognized}}", - "comment": "Title for quality issue tooltip when a catalog item contains unknown abbreviation." + "text": "There {count, plural, one {is # abbreviation that is not recognized} other {are # abbreviations that are not recognized}}", + "crowdinContext": "Title for quality issue tooltip when a catalog item contains unknown abbreviation." }, "analyticsCatalog.quality.title.identicalTitle": { - "value": "Identical title", - "comment": "Title for quality issue when multiple catalog items have identical titles." + "text": "Identical title", + "crowdinContext": "Title for quality issue when multiple catalog items have identical titles." }, "analyticsCatalog.quality.title.identicalDescription": { - "value": "Identical description", - "comment": "Title for quality issue when multiple catalog items have identical descriptions." + "text": "Identical description", + "crowdinContext": "Title for quality issue when multiple catalog items have identical descriptions." }, "analyticsCatalog.quality.title.similarTitle": { - "value": "Similar title", - "comment": "Title for quality issue when multiple catalog items have similar titles." + "text": "Similar title", + "crowdinContext": "Title for quality issue when multiple catalog items have similar titles." }, "analyticsCatalog.quality.title.similarDescription": { - "value": "Similar description", - "comment": "Title for quality issue when multiple catalog items have similar descriptions." + "text": "Similar description", + "crowdinContext": "Title for quality issue when multiple catalog items have similar descriptions." }, "analyticsCatalog.quality.title.unknownAbbreviation": { - "value": "Unknown abbreviation", - "comment": "Title for quality issue when a catalog item contains unknown abbreviation." + "text": "Unknown abbreviation", + "crowdinContext": "Title for quality issue when a catalog item contains unknown abbreviation." }, "analyticsCatalog.quality.title.none": { - "value": "Without issues", - "comment": "Title for the filter option that shows catalog items without quality issues." + "text": "Without issues", + "crowdinContext": "Title for the filter option that shows catalog items without quality issues." }, "analyticsCatalog.quality.description.identicalTitle": { - "value": "Same title is used by other {count, plural, one {object} other {objects}}. Rename this or the following {count, plural, one {object} other {objects}} title to avoid confusion.", - "comment": "Description for quality issue when multiple catalog items have identical titles." + "text": "Same title is used by other {count, plural, one {object} other {objects}}. Rename this or the following {count, plural, one {object} other {objects}} title to avoid confusion.", + "crowdinContext": "Description for quality issue when multiple catalog items have identical titles." }, "analyticsCatalog.quality.description.identicalDescription": { - "value": "Same description is used by other {count, plural, one {object} other {objects}}. Rename this or the following {count, plural, one {object} other {objects}} description to avoid confusion.", - "comment": "Description for quality issue when multiple catalog items have identical descriptions." + "text": "Same description is used by other {count, plural, one {object} other {objects}}. Rename this or the following {count, plural, one {object} other {objects}} description to avoid confusion.", + "crowdinContext": "Description for quality issue when multiple catalog items have identical descriptions." }, "analyticsCatalog.quality.description.similarTitle": { - "value": "The title is similar to other {count, plural, one {object} other {objects}}. Distinguish it in its description to improve AI accuracy.", - "comment": "Description for quality issue when multiple catalog items have similar titles." + "text": "The title is similar to other {count, plural, one {object} other {objects}}. Distinguish it in its description to improve AI accuracy.", + "crowdinContext": "Description for quality issue when multiple catalog items have similar titles." }, "analyticsCatalog.quality.description.similarDescription": { - "value": "The description is similar to other {count, plural, one {object} other {objects}}. Distinguish it in its title to improve AI accuracy.", - "comment": "Description for quality issue when multiple catalog items have similar descriptions." + "text": "The description is similar to other {count, plural, one {object} other {objects}}. Distinguish it in its title to improve AI accuracy.", + "crowdinContext": "Description for quality issue when multiple catalog items have similar descriptions." }, "analyticsCatalog.quality.description.unknownAbbreviation": { - "value": "The abbreviation {abbreviation} is not recognized. Replace it with the full form to improve AI accuracy.", - "comment": "Description for quality issue when a catalog item contains unknown abbreviation." + "text": "The abbreviation {abbreviation} is not recognized. Replace it with the full form to improve AI accuracy.", + "crowdinContext": "Description for quality issue when a catalog item contains unknown abbreviation." }, "analyticsCatalog.quality.issue.edit": { - "value": "Edit{attributeName, select, TITLE { title} DESCRIPTION { description} other {}}", - "comment": "Label for the edit button in quality issue component. The button allows users to edit either the title or description field of a catalog item based on the quality issue. Example output: if attributeName is 'TITLE', output is 'Edit title'; if attributeName is 'DESCRIPTION', output is 'Edit description'." + "text": "Edit{attributeName, select, TITLE { title} DESCRIPTION { description} other {}}", + "crowdinContext": "Label for the edit button in quality issue component. The button allows users to edit either the title or description field of a catalog item based on the quality issue. Example output: if attributeName is 'TITLE', output is 'Edit title'; if attributeName is 'DESCRIPTION', output is 'Edit description'." }, "analyticsCatalog.quality.scoreCard.title": { - "value": "Semantic quality", - "comment": "Title of the quality score card." + "text": "Semantic quality", + "crowdinContext": "Title of the quality score card." }, "analyticsCatalog.quality.scoreCard.runCheck": { - "value": "Run check", - "comment": "Label for the button that runs the quality check." + "text": "Run check", + "crowdinContext": "Label for the button that runs the quality check." }, "analyticsCatalog.quality.scoreCard.action.empty": { - "value": "No findings", - "comment": "Label for the empty state of the quality score card action." + "text": "No findings", + "crowdinContext": "Label for the empty state of the quality score card action." }, "analyticsCatalog.quality.scoreCard.action.loading": { - "value": "Running...", - "comment": "Label for the loading state of the quality score card action." + "text": "Running...", + "crowdinContext": "Label for the loading state of the quality score card action." }, "analyticsCatalog.quality.scoreCard.action.success": { - "value": "Show objects", - "comment": "Label for the success state of the quality score card action." + "text": "Show objects", + "crowdinContext": "Label for the success state of the quality score card action." }, "analyticsCatalog.quality.scoreCard.lastCheck": { - "value": "Last checked: {date}", - "comment": "Text that is prepended to the date of the last check of the quality score card." + "text": "Last checked: {date}", + "crowdinContext": "Text that is prepended to the date of the last check of the quality score card." }, "metricComponent.metricType.label": { - "value": "Metric type", - "comment": "Analytics Catalog detail drawer: Label for the dropdown that selects whether a measure is treated as currency or left unspecified." + "text": "Metric type", + "crowdinContext": "Analytics Catalog detail drawer: Label for the dropdown that selects whether a measure is treated as currency or left unspecified." }, "metricComponent.metricType.unspecified": { - "value": "Unspecified", - "comment": "Analytics Catalog detail drawer: Dropdown option indicating that the metric does not enforce a dedicated semantic type." + "text": "Unspecified", + "crowdinContext": "Analytics Catalog detail drawer: Dropdown option indicating that the metric does not enforce a dedicated semantic type." }, "metricComponent.metricType.currency": { - "value": "Currency", - "comment": "Analytics Catalog detail drawer: Dropdown option indicating that the metric should be treated as currency." + "text": "Currency", + "crowdinContext": "Analytics Catalog detail drawer: Dropdown option indicating that the metric should be treated as currency." }, "metricComponent.numberFormat.label": { - "value": "Number format", - "comment": "Analytics Catalog detail drawer: Heading for the number format editor that defines how metric values are rendered." + "text": "Number format", + "crowdinContext": "Analytics Catalog detail drawer: Heading for the number format editor that defines how metric values are rendered." } } diff --git a/libs/sdk-ui-charts/package.json b/libs/sdk-ui-charts/package.json index fc10e621653..5b7cc44cd43 100644 --- a/libs/sdk-ui-charts/package.json +++ b/libs/sdk-ui-charts/package.json @@ -149,7 +149,7 @@ "stylelint": "^13.8.0", "stylelint-checkstyle-formatter": "^0.1.2", "stylelint-config-prettier": "^9.0.5", - "typescript": "5.8.3", + "typescript": "5.9.3", "vitest": "3.2.4", "vitest-dom": "0.1.1" }, diff --git a/libs/sdk-ui-dashboard/package.json b/libs/sdk-ui-dashboard/package.json index be0900de6d8..1271cc962ba 100644 --- a/libs/sdk-ui-dashboard/package.json +++ b/libs/sdk-ui-dashboard/package.json @@ -151,7 +151,7 @@ "stylelint-checkstyle-formatter": "^0.1.2", "stylelint-config-prettier": "^9.0.5", "svgo": "^2.8.0", - "typescript": "5.8.3", + "typescript": "5.9.3", "vitest": "3.2.4", "vitest-dom": "0.1.1" }, diff --git a/libs/sdk-ui-dashboard/src/kdaDialog/const.ts b/libs/sdk-ui-dashboard/src/kdaDialog/const.ts index 0340ab2e833..3891d93ada8 100644 --- a/libs/sdk-ui-dashboard/src/kdaDialog/const.ts +++ b/libs/sdk-ui-dashboard/src/kdaDialog/const.ts @@ -1,6 +1,9 @@ -// (C) 2025 GoodData Corporation +// (C) 2025-2026 GoodData Corporation export const DEFAULT_MEASURE_FORMAT = "#,##0.00"; // Z index of all overlays in kda dialogs export const KDA_DIALOG_OVERS_Z_INDEX = 6100; + +// Z index of replace confirmation dialog overlay (must be above KDA dialog overlays and floating status bar). +export const KDA_DIALOG_REPLACE_CONFIRMATION_OVERS_Z_INDEX = KDA_DIALOG_OVERS_Z_INDEX + 1; diff --git a/libs/sdk-ui-dashboard/src/kdaDialog/dialog/KdaDialog.tsx b/libs/sdk-ui-dashboard/src/kdaDialog/dialog/KdaDialog.tsx index 21578d3edaa..ce7f7188d80 100644 --- a/libs/sdk-ui-dashboard/src/kdaDialog/dialog/KdaDialog.tsx +++ b/libs/sdk-ui-dashboard/src/kdaDialog/dialog/KdaDialog.tsx @@ -1,6 +1,6 @@ -// (C) 2025 GoodData Corporation +// (C) 2025-2026 GoodData Corporation -import { useId } from "react"; +import { useId, useMemo } from "react"; import cx from "classnames"; @@ -8,6 +8,7 @@ import { ErrorComponent } from "@gooddata/sdk-ui"; import { Dialog, OverlayController, OverlayControllerProvider } from "@gooddata/sdk-ui-kit"; import { useKdaDialogAccessibility } from "./hooks/useKdaDialogAccessibility.js"; +import { KdaDialogFloatingStatusBar } from "./KdaDialogFloatingStatusBar.js"; import { KdaDialogSections } from "./KdaDialogSections.js"; import { KdaContent } from "../components/KdaContent.js"; import { KdaFooter } from "../components/KdaFooter.js"; @@ -23,6 +24,7 @@ import { type IKdaDialogProps } from "../types.js"; import { useChangeAnalysis } from "./hooks/useChangeAnalysis.js"; import { useKdaDialogTooltipsOverride } from "./hooks/useKdaDialogTooltipsOverride.js"; import { useValidAttributes } from "./hooks/useValidAttributes.js"; +import { KdaDialogControls } from "./KdaDialogControls.js"; const overlayController = OverlayController.getInstance(KDA_DIALOG_OVERS_Z_INDEX); @@ -31,63 +33,91 @@ const overlayController = OverlayController.getInstance(KDA_DIALOG_OVERS_Z_INDEX */ export function KdaDialog({ className, showCloseButton = true, onClose }: IKdaDialogProps) { const { state } = useKdaState(); + const { isMinimized } = state; const metric = state.definition?.metric.measure; const title = metric?.alias ?? metric?.title ?? ""; - - const accessibilityConfig = useKdaDialogAccessibility(title); const detailsId = useId(); + const minimizedAlignPoints = useMemo( + () => (isMinimized ? [{ align: "tc tc", offset: { x: 0, y: 30 } }] : undefined), + [isMinimized], + ); + + const accessibilityConfig = useKdaDialogAccessibility(title, isMinimized); + + const dialogBaseClassName = cx(accessibilityConfig.dialogId, className); + const displayCloseButton = showCloseButton ? !isMinimized : undefined; + useChangeAnalysis(); useValidAttributes(); useKdaDialogTooltipsOverride(); return ( - - - - - - } - /> - } - content={ - } - leftLoader={} - leftError={ - - } - rightContent={} - rightLoader={} - rightError={ - - } - /> - } - footer={} onClose={onClose} />} - /> - + {isMinimized ? ( + + + + ) : ( + + + + + + } + /> + } + content={ + } + leftLoader={} + leftError={ + + } + rightContent={} + rightLoader={} + rightError={ + + } + /> + } + footer={} onClose={onClose} />} + /> + + )} ); } diff --git a/libs/sdk-ui-dashboard/src/kdaDialog/dialog/KdaDialogActionButtons.tsx b/libs/sdk-ui-dashboard/src/kdaDialog/dialog/KdaDialogActionButtons.tsx new file mode 100644 index 00000000000..7b065d86318 --- /dev/null +++ b/libs/sdk-ui-dashboard/src/kdaDialog/dialog/KdaDialogActionButtons.tsx @@ -0,0 +1,102 @@ +// (C) 2025-2026 GoodData Corporation + +import cx from "classnames"; +import { useIntl } from "react-intl"; + +import { UiIconButton } from "@gooddata/sdk-ui-kit"; + +import { useKdaState } from "../providers/KdaState.js"; + +export type KdaDialogActionButtonsSize = "small" | "medium"; + +export interface IKdaDialogActionButtonsProps { + size: KdaDialogActionButtonsSize; + onClose?: () => void; + className?: string; +} + +/** + * Renders the KDA dialog actions (expand/minimize toggle + divider + close). + * + * @internal + */ +export function KdaDialogActionButtons({ size, onClose, className }: IKdaDialogActionButtonsProps) { + const intl = useIntl(); + const { state, setState } = useKdaState(); + const { isMinimized } = state; + + const expandLabel = intl.formatMessage({ id: "kdaDialog.floatingStatus.expand" }); + const shrinkLabel = intl.formatMessage({ id: "kdaDialog.floatingStatus.minimize" }); + const closeLabel = intl.formatMessage({ id: "kdaDialog.dialog.closeLabel" }); + + const handleToggle = () => { + setState({ isMinimized: !isMinimized }); + }; + + return ( + + ); +} + +interface IKdaDialogActionButtonsViewProps extends IKdaDialogActionButtonsProps { + isMinimized: boolean; + expandLabel: string; + shrinkLabel: string; + closeLabel: string; + onToggle: () => void; +} + +function KdaDialogActionButtonsView(props: IKdaDialogActionButtonsViewProps) { + const { size, isMinimized, expandLabel, shrinkLabel, closeLabel, onToggle, onClose, className } = props; + return ( +
+
+ +
+
+
+ +
+
+ ); +} diff --git a/libs/sdk-ui-dashboard/src/kdaDialog/dialog/KdaDialogArbiter.ts b/libs/sdk-ui-dashboard/src/kdaDialog/dialog/KdaDialogArbiter.ts new file mode 100644 index 00000000000..82f7b95106e --- /dev/null +++ b/libs/sdk-ui-dashboard/src/kdaDialog/dialog/KdaDialogArbiter.ts @@ -0,0 +1,65 @@ +// (C) 2025-2026 GoodData Corporation + +import type { IKdaDefinition } from "../types.js"; + +type OwnerId = string; + +type OpenRequestListener = (definition: IKdaDefinition) => void; + +/** + * Lightweight in-memory arbiter to prevent multiple {@link KdaDialogController} instances from opening at once. + * + * @remarks + * This is an internal short-term mitigation. Ideal solution is a single host. + */ +export class KdaDialogArbiter { + private static instance: KdaDialogArbiter | undefined; + + static getInstance(): KdaDialogArbiter { + if (!KdaDialogArbiter.instance) { + KdaDialogArbiter.instance = new KdaDialogArbiter(); + } + return KdaDialogArbiter.instance; + } + + private activeOwnerId: OwnerId | null = null; + private openRequestListeners = new Map(); + + private constructor() {} + + registerOwner(ownerId: OwnerId, onOpenRequested: OpenRequestListener): () => void { + this.openRequestListeners.set(ownerId, onOpenRequested); + return () => { + this.openRequestListeners.delete(ownerId); + this.release(ownerId); + }; + } + + tryAcquire(ownerId: OwnerId): boolean { + if (this.activeOwnerId === null || this.activeOwnerId === ownerId) { + this.activeOwnerId = ownerId; + return true; + } + return false; + } + + requestOpen(ownerId: OwnerId, definition: IKdaDefinition): boolean { + if (this.tryAcquire(ownerId)) { + return true; + } + + const activeOwnerId = this.activeOwnerId; + if (!activeOwnerId) { + return false; + } + + this.openRequestListeners.get(activeOwnerId)?.(definition); + return false; + } + + release(ownerId: OwnerId): void { + if (this.activeOwnerId === ownerId) { + this.activeOwnerId = null; + } + } +} diff --git a/libs/sdk-ui-dashboard/src/kdaDialog/dialog/KdaDialogController.tsx b/libs/sdk-ui-dashboard/src/kdaDialog/dialog/KdaDialogController.tsx new file mode 100644 index 00000000000..f0b2659209a --- /dev/null +++ b/libs/sdk-ui-dashboard/src/kdaDialog/dialog/KdaDialogController.tsx @@ -0,0 +1,119 @@ +// (C) 2025-2026 GoodData Corporation + +import { useCallback, useEffect, useState } from "react"; + +import { v4 as uuid } from "uuid"; + +import type { ISeparators } from "@gooddata/sdk-model"; + +import { KdaProvider } from "../providers/Kda.js"; +import type { IKdaDefinition, IKdaDialogProps } from "../types.js"; +import { KdaDialog } from "./KdaDialog.js"; +import { KdaDialogArbiter } from "./KdaDialogArbiter.js"; +import { KdaReplaceConfirmationDialog } from "./KdaReplaceConfirmationDialog.js"; + +const arbiter = KdaDialogArbiter.getInstance(); + +export interface IKdaDialogControllerProps extends IKdaDialogProps { + separators?: ISeparators; + /** + * Latest requested definition. When a dialog is already open and this differs from the active definition, + * confirmation is shown before the active definition is replaced. + */ + requestedDefinition?: IKdaDefinition; + /** + * Optional callback allowing the controller to sync the host's requested definition. + * Used to revert the host back to active definition on "Stay" and to clear it on close. + */ + onRequestedDefinitionChange?: (definition?: IKdaDefinition) => void; +} + +export function KdaDialogController({ + requestedDefinition, + separators, + onRequestedDefinitionChange, + ...dialogProps +}: IKdaDialogControllerProps) { + const [activeDefinition, setActiveDefinition] = useState(undefined); + const [pendingDefinition, setPendingDefinition] = useState(undefined); + + const isReplaceConfirmationOpen = !!pendingDefinition; + + const [ownerId] = useState(() => uuid()); + + const handleDelegatedOpen = useCallback( + (definition: IKdaDefinition) => { + onRequestedDefinitionChange?.(definition); + }, + [onRequestedDefinitionChange], + ); + + useEffect(() => { + return arbiter.registerOwner(ownerId, handleDelegatedOpen); + }, [ownerId, handleDelegatedOpen]); + + useEffect(() => { + if (!requestedDefinition) { + setActiveDefinition(undefined); + setPendingDefinition(undefined); + arbiter.release(ownerId); + return; + } + if (!activeDefinition) { + const granted = arbiter.requestOpen(ownerId, requestedDefinition); + if (!granted) { + // Request delegated to another active controller. Clear the host request to avoid re-trigger loops. + onRequestedDefinitionChange?.(undefined); + return; + } + setActiveDefinition(requestedDefinition); + return; + } + // Whenever a dialog is already open and a *different* request arrives, always ask for confirmation. + // This prevents showing confirmation immediately on the initial open (where active === requested). + if (!pendingDefinition && requestedDefinition !== activeDefinition) { + setPendingDefinition(requestedDefinition); + } + }, [activeDefinition, ownerId, onRequestedDefinitionChange, pendingDefinition, requestedDefinition]); + + const onCloseInternal = useCallback(() => { + setActiveDefinition(undefined); + setPendingDefinition(undefined); + arbiter.release(ownerId); + onRequestedDefinitionChange?.(undefined); + dialogProps.onClose?.(); + }, [dialogProps, ownerId, onRequestedDefinitionChange]); + + const onCancelReplace = useCallback(() => { + setPendingDefinition(undefined); + if (activeDefinition) { + onRequestedDefinitionChange?.(activeDefinition); + } + }, [activeDefinition, onRequestedDefinitionChange]); + + const onConfirmReplace = useCallback(() => { + if (!pendingDefinition) { + return; + } + setActiveDefinition(pendingDefinition); + setPendingDefinition(undefined); + onRequestedDefinitionChange?.(pendingDefinition); + }, [onRequestedDefinitionChange, pendingDefinition]); + + if (!activeDefinition) { + return null; + } + + return ( + <> + + + + + + ); +} diff --git a/libs/sdk-ui-dashboard/src/kdaDialog/dialog/KdaDialogControls.tsx b/libs/sdk-ui-dashboard/src/kdaDialog/dialog/KdaDialogControls.tsx new file mode 100644 index 00000000000..3e3ca33588a --- /dev/null +++ b/libs/sdk-ui-dashboard/src/kdaDialog/dialog/KdaDialogControls.tsx @@ -0,0 +1,23 @@ +// (C) 2025-2026 GoodData Corporation + +import { memo } from "react"; + +import cx from "classnames"; + +import { type IDialogCloseButtonProps } from "@gooddata/sdk-ui-kit"; + +import { KdaDialogActionButtons } from "./KdaDialogActionButtons.js"; + +/** + * @internal + */ +export const KdaDialogControls = memo(function KdaDialogControls(props: IDialogCloseButtonProps) { + const { className, onClose } = props; + return ( + + ); +}); diff --git a/libs/sdk-ui-dashboard/src/kdaDialog/dialog/KdaDialogFloatingStatusBar.tsx b/libs/sdk-ui-dashboard/src/kdaDialog/dialog/KdaDialogFloatingStatusBar.tsx new file mode 100644 index 00000000000..95998a0d003 --- /dev/null +++ b/libs/sdk-ui-dashboard/src/kdaDialog/dialog/KdaDialogFloatingStatusBar.tsx @@ -0,0 +1,81 @@ +// (C) 2025-2026 GoodData Corporation + +import { type MessageDescriptor, defineMessages, useIntl } from "react-intl"; + +import { LoadingSpinner, UiIcon } from "@gooddata/sdk-ui-kit"; + +import type { KdaAsyncStatus } from "../internalTypes.js"; +import { KdaDialogActionButtons } from "./KdaDialogActionButtons.js"; +import { useKdaState } from "../providers/KdaState.js"; + +type KdaFloatingStatus = "step01" | "step02" | "done" | "error"; + +const floatingStatusMessages: Record = defineMessages({ + step01: { id: "kdaDialog.floatingStatus.step1" }, + step02: { id: "kdaDialog.floatingStatus.step2" }, + done: { id: "kdaDialog.floatingStatus.done" }, + error: { id: "kdaDialog.floatingStatus.error" }, +}); + +interface IKdaDialogFloatingStatusBarProps { + titleElementId: string; + onClose?: () => void; +} + +/** + * @internal + */ +export function KdaDialogFloatingStatusBar({ onClose, titleElementId }: IKdaDialogFloatingStatusBarProps) { + const intl = useIntl(); + const { state } = useKdaState(); + + const status = getFloatingStatus(state.relevantStatus, state.itemsStatus, state.selectedStatus); + const statusText = intl.formatMessage(floatingStatusMessages[status]); + + return ( +
+
+ {status === "done" || status === "error" ? statusText : null} +
+
+ +

+ {statusText} +

+
+ +
+ ); +} + +function StatusIndicator({ status }: { status: KdaFloatingStatus }) { + if (status === "error") { + return ; + } + if (status === "done") { + return ; + } + return ; +} + +function getFloatingStatus( + relevantStatus: KdaAsyncStatus, + itemsStatus: KdaAsyncStatus, + selectedStatus: KdaAsyncStatus, +): KdaFloatingStatus { + if (relevantStatus === "error" || itemsStatus === "error" || selectedStatus === "error") { + return "error"; + } + if (relevantStatus === "pending" || relevantStatus === "loading") { + return "step01"; + } + if ( + itemsStatus === "pending" || + itemsStatus === "loading" || + selectedStatus === "pending" || + selectedStatus === "loading" + ) { + return "step02"; + } + return "done"; +} diff --git a/libs/sdk-ui-dashboard/src/kdaDialog/dialog/KdaReplaceConfirmationDialog.tsx b/libs/sdk-ui-dashboard/src/kdaDialog/dialog/KdaReplaceConfirmationDialog.tsx new file mode 100644 index 00000000000..c4c90bdf90c --- /dev/null +++ b/libs/sdk-ui-dashboard/src/kdaDialog/dialog/KdaReplaceConfirmationDialog.tsx @@ -0,0 +1,40 @@ +// (C) 2025-2026 GoodData Corporation + +import { useIntl } from "react-intl"; + +import { ConfirmDialog, OverlayController, OverlayControllerProvider } from "@gooddata/sdk-ui-kit"; + +import { KDA_DIALOG_REPLACE_CONFIRMATION_OVERS_Z_INDEX } from "../const.js"; + +const overlayController = OverlayController.getInstance(KDA_DIALOG_REPLACE_CONFIRMATION_OVERS_Z_INDEX); + +interface IKdaReplaceConfirmationDialogProps { + isOpen: boolean; + onCancel: () => void; + onConfirm: () => void; +} + +export function KdaReplaceConfirmationDialog(props: IKdaReplaceConfirmationDialogProps) { + const { isOpen, onCancel, onConfirm } = props; + const intl = useIntl(); + + if (!isOpen) { + return null; + } + + return ( + + + {intl.formatMessage({ id: "kdaDialog.replaceConfirmation.message" })} + + + ); +} diff --git a/libs/sdk-ui-dashboard/src/kdaDialog/dialog/hooks/useChangeAnalysis.ts b/libs/sdk-ui-dashboard/src/kdaDialog/dialog/hooks/useChangeAnalysis.ts index 6f0360bd217..1e679966b88 100644 --- a/libs/sdk-ui-dashboard/src/kdaDialog/dialog/hooks/useChangeAnalysis.ts +++ b/libs/sdk-ui-dashboard/src/kdaDialog/dialog/hooks/useChangeAnalysis.ts @@ -1,4 +1,4 @@ -// (C) 2025 GoodData Corporation +// (C) 2025-2026 GoodData Corporation import { useEffect, useMemo } from "react"; @@ -68,44 +68,43 @@ function useChangeAnalysisResults( .join(); }, [attrFilters]); + const dateAttribute = dateAttributeFinder(definition?.dateAttribute); + const shouldComputeChangeAnalysis = !!definition && !!dateAttribute && !loading; + return useCancelablePromise( { - promise: () => { - const dateAttribute = dateAttributeFinder(definition?.dateAttribute); - - if (!definition || !dateAttribute || loading) { - return Promise.resolve(undefined); - } + promise: shouldComputeChangeAnalysis + ? () => { + const granularity = dateAttribute.granularity; + const attributes = attrs + .map((ref) => { + const attr = attributeFinder(ref); + return attr ? newAttribute(ref) : null; + }) + .filter(Boolean) as IAttribute[]; + const filters = attrFilters + .filter((f) => !isAllValuesDashboardAttributeFilter(f)) + .map(dashboardAttributeFilterToAttributeFilter); - const granularity = dateAttribute.granularity; - const attributes = attrs - .map((ref) => { - const attr = attributeFinder(ref); - return attr ? newAttribute(ref) : null; - }) - .filter(Boolean) as IAttribute[]; - const filters = attrFilters - .filter((f) => !isAllValuesDashboardAttributeFilter(f)) - .map(dashboardAttributeFilterToAttributeFilter); - - return backend - .workspace(workspace) - .keyDriverAnalysis() - .computeChangeAnalysis( - { - measure: definition.metric as IMeasure, - auxMeasures: definition.metrics as IMeasure[], - attributes, - filters, - }, - { - dateAttribute: newAttribute(dateAttribute.defaultDisplayForm.ref), - from: from ?? "", - to: to ?? "", - granularity, - }, - ); - }, + return backend + .workspace(workspace) + .keyDriverAnalysis() + .computeChangeAnalysis( + { + measure: definition.metric as IMeasure, + auxMeasures: definition.metrics as IMeasure[], + attributes, + filters, + }, + { + dateAttribute: newAttribute(dateAttribute.defaultDisplayForm.ref), + from: from ?? "", + to: to ?? "", + granularity, + }, + ); + } + : undefined, }, [ backend, @@ -115,7 +114,7 @@ function useChangeAnalysisResults( from, to, loading, - dateAttributeFinder, + dateAttribute, attributeFiltersFingerprint, ], ); diff --git a/libs/sdk-ui-dashboard/src/kdaDialog/dialog/hooks/useKdaDialogAccessibility.ts b/libs/sdk-ui-dashboard/src/kdaDialog/dialog/hooks/useKdaDialogAccessibility.ts index 244fe3446a0..51ce2a135d9 100644 --- a/libs/sdk-ui-dashboard/src/kdaDialog/dialog/hooks/useKdaDialogAccessibility.ts +++ b/libs/sdk-ui-dashboard/src/kdaDialog/dialog/hooks/useKdaDialogAccessibility.ts @@ -1,10 +1,10 @@ -// (C) 2025 GoodData Corporation +// (C) 2025-2026 GoodData Corporation import { useId, useMemo } from "react"; import { useIntl } from "react-intl"; -export function useKdaDialogAccessibility(metric: string) { +export function useKdaDialogAccessibility(metric: string, isMinimized: boolean) { const intl = useIntl(); const titleElementId = useId(); @@ -19,7 +19,7 @@ export function useKdaDialogAccessibility(metric: string) { metric, }, ), - isModal: true, + isModal: !isMinimized, dialogId: "gd-kda-dialog", closeButton: { ariaLabel: intl.formatMessage({ @@ -27,5 +27,5 @@ export function useKdaDialogAccessibility(metric: string) { }), }, }; - }, [intl, metric, titleElementId]); + }, [intl, metric, titleElementId, isMinimized]); } diff --git a/libs/sdk-ui-dashboard/src/kdaDialog/dialog/hooks/useValidAttributes.ts b/libs/sdk-ui-dashboard/src/kdaDialog/dialog/hooks/useValidAttributes.ts index e98fef7ceea..0ae49fda460 100644 --- a/libs/sdk-ui-dashboard/src/kdaDialog/dialog/hooks/useValidAttributes.ts +++ b/libs/sdk-ui-dashboard/src/kdaDialog/dialog/hooks/useValidAttributes.ts @@ -1,4 +1,4 @@ -// (C) 2025 GoodData Corporation +// (C) 2025-2026 GoodData Corporation import { useEffect } from "react"; @@ -31,16 +31,15 @@ function useValidObjectsResults(definition: DeepReadonly | null) return useCancelablePromise( { - promise: () => { - if (!metric) { - return Promise.resolve(undefined); - } - return backend - .workspace(workspace) - .measures() - .getConnectedAttributes(metric as IMeasure, metrics as IMeasure[]); - }, + promise: metric + ? () => { + return backend + .workspace(workspace) + .measures() + .getConnectedAttributes(metric as IMeasure, metrics as IMeasure[]); + } + : undefined, }, - [], + [backend, workspace, metric, metrics], ); } diff --git a/libs/sdk-ui-dashboard/src/kdaDialog/internal.ts b/libs/sdk-ui-dashboard/src/kdaDialog/internal.ts index b094e6081d0..8840ab8368a 100644 --- a/libs/sdk-ui-dashboard/src/kdaDialog/internal.ts +++ b/libs/sdk-ui-dashboard/src/kdaDialog/internal.ts @@ -1,7 +1,8 @@ -// (C) 2025 GoodData Corporation +// (C) 2025-2026 GoodData Corporation export type * from "./internalTypes.js"; export * from "./providers/KdaState.js"; export * from "./providers/KdaStore.js"; export * from "./providers/Kda.js"; -export * from "./dialog/KdaDialog.js"; +export { KdaDialog } from "./dialog/KdaDialog.js"; +export { KdaDialogController } from "./dialog/KdaDialogController.js"; diff --git a/libs/sdk-ui-dashboard/src/kdaDialog/internalTypes.ts b/libs/sdk-ui-dashboard/src/kdaDialog/internalTypes.ts index 37a4e9bb4ba..2bc38111bb2 100644 --- a/libs/sdk-ui-dashboard/src/kdaDialog/internalTypes.ts +++ b/libs/sdk-ui-dashboard/src/kdaDialog/internalTypes.ts @@ -1,4 +1,4 @@ -// (C) 2025 GoodData Corporation +// (C) 2025-2026 GoodData Corporation import { type ICatalogDateAttribute, @@ -50,7 +50,9 @@ export interface KdaState { definition: DeepReadonly | null; fromValue: IKdaDataPoint | undefined; toValue: IKdaDataPoint | undefined; - definitionStatus: "loading" | "success" | "error" | "pending"; + definitionStatus: KdaAsyncStatus; + //ui + isMinimized: boolean; //states attributesDropdownOpen: boolean; addFilterDropdownOpen: boolean; @@ -59,12 +61,14 @@ export interface KdaState { //rest selectedTrend: ("up" | "down")[]; selectedItem: IUiListboxInteractiveItem | "summary"; - selectedStatus: "loading" | "success" | "error" | "pending"; + selectedStatus: KdaAsyncStatus; attributeFilters: IDashboardAttributeFilter[]; items: IUiListboxInteractiveItem[]; - itemsStatus: "loading" | "success" | "error" | "pending"; + itemsStatus: KdaAsyncStatus; selectedAttributes: ObjRef[]; - relevantStatus: "loading" | "success" | "error" | "pending"; + relevantStatus: KdaAsyncStatus; relevantAttributes: ObjRef[]; selectedUpdated: number; } + +export type KdaAsyncStatus = "loading" | "success" | "error" | "pending"; diff --git a/libs/sdk-ui-dashboard/src/kdaDialog/providers/Kda.tsx b/libs/sdk-ui-dashboard/src/kdaDialog/providers/Kda.tsx index a7b287c2862..2aa901e25c2 100644 --- a/libs/sdk-ui-dashboard/src/kdaDialog/providers/Kda.tsx +++ b/libs/sdk-ui-dashboard/src/kdaDialog/providers/Kda.tsx @@ -1,4 +1,4 @@ -// (C) 2025 GoodData Corporation +// (C) 2025-2026 GoodData Corporation import { type ReactNode, useMemo } from "react"; @@ -22,6 +22,7 @@ export function KdaProvider({ children, definition, separators }: KdaProps) { fromValue: { ...definition?.range[0] }, toValue: { ...definition?.range[1] }, definitionStatus: "success", + isMinimized: true, attributeFilters: (definition.filters?.slice() ?? []).filter( (f) => !isAllValuesDashboardAttributeFilter(f), ), diff --git a/libs/sdk-ui-dashboard/src/kdaDialog/providers/KdaState.tsx b/libs/sdk-ui-dashboard/src/kdaDialog/providers/KdaState.tsx index 80ce018426b..d5597c41785 100644 --- a/libs/sdk-ui-dashboard/src/kdaDialog/providers/KdaState.tsx +++ b/libs/sdk-ui-dashboard/src/kdaDialog/providers/KdaState.tsx @@ -1,17 +1,8 @@ -// (C) 2025 GoodData Corporation +// (C) 2025-2026 GoodData Corporation -import { - type Dispatch, - type ReactNode, - type SetStateAction, - createContext, - useCallback, - useContext, - useMemo, - useState, -} from "react"; +import { type ReactNode, createContext, useCallback, useContext, useEffect, useMemo, useState } from "react"; -import { type KdaState } from "../internalTypes.js"; +import type { KdaState } from "../internalTypes.js"; const defaultState: KdaState = { //main items @@ -19,6 +10,7 @@ const defaultState: KdaState = { toValue: undefined, fromValue: undefined, definitionStatus: "pending", + isMinimized: true, items: [], itemsStatus: "pending", //states @@ -37,22 +29,25 @@ const defaultState: KdaState = { relevantStatus: "pending", }; -const KdaStateContext = createContext<{ +type KdaStateContextType = { state: KdaState; - setState: Dispatch>>; -}>({ + setState: (newState: Partial) => void; +}; + +const KdaStateContext = createContext({ state: defaultState, - setState: () => {}, + setState: () => undefined, }); export function KdaStateProvider({ children, value }: { children: ReactNode; value?: Partial }) { - const [state, setStateInternal] = useState({ - ...defaultState, - ...value, - }); + const [state, setStateInternal] = useState({ ...defaultState, ...value }); + + useEffect(() => { + setStateInternal({ ...defaultState, ...value }); + }, [value]); - const setState = useCallback((newState: SetStateAction>) => { - setStateInternal((prev) => ({ ...prev, ...newState })); + const setState: KdaStateContextType["setState"] = useCallback((newState) => { + setStateInternal((prevState) => ({ ...prevState, ...newState })); }, []); const providerValue = useMemo(() => { diff --git a/libs/sdk-ui-dashboard/src/model/store/widgetDrills/widgetDrillSelectors.ts b/libs/sdk-ui-dashboard/src/model/store/widgetDrills/widgetDrillSelectors.ts index 0856ffdd1c4..e3da503ec72 100644 --- a/libs/sdk-ui-dashboard/src/model/store/widgetDrills/widgetDrillSelectors.ts +++ b/libs/sdk-ui-dashboard/src/model/store/widgetDrills/widgetDrillSelectors.ts @@ -1,12 +1,14 @@ -// (C) 2020-2025 GoodData Corporation +// (C) 2020-2026 GoodData Corporation import { createSelector } from "@reduxjs/toolkit"; import { compact } from "lodash-es"; import { UnexpectedError } from "@gooddata/sdk-backend-spi"; import { + type AttributeDisplayFormType, type DrillDefinition, type DrillOrigin, + type IAttributeDisplayFormMetadataObject, type ICatalogAttribute, type ICatalogAttributeHierarchy, type ICatalogDateAttribute, @@ -18,6 +20,7 @@ import { areObjRefsEqual, getHierarchyAttributes, getHierarchyRef, + isCatalogAttribute, isDrillFromAttribute, isDrillFromMeasure, isIdentifierRef, @@ -110,6 +113,27 @@ function drillDefinitionToPredicates(drill: DrillDefinition): IHeaderPredicate[] ]); } +/** + * Resolves the preferred display form for a drill target. + * If drillTargetDisplayFormType is specified (e.g., for geo charts), finds a matching display form. + * Falls back to the default display form if no matching type is found. + */ +function getDrillAttributeDisplayForm( + catalogAttribute: ICatalogAttribute | ICatalogDateAttribute, + drillTargetDisplayFormType?: AttributeDisplayFormType, +): IAttributeDisplayFormMetadataObject { + if (drillTargetDisplayFormType && isCatalogAttribute(catalogAttribute)) { + const preferredDisplayForm = catalogAttribute.displayForms.find( + (df) => df.displayFormType === drillTargetDisplayFormType, + ); + if (preferredDisplayForm) { + return preferredDisplayForm; + } + } + + return catalogAttribute.defaultDisplayForm; +} + function createDrillDefinition( drill: IAvailableDrillTargetAttribute, descendantRef: ObjRef, @@ -123,9 +147,13 @@ function createDrillDefinition( * On Bear, the drilldown is defined as "Attr --\> specific display form" (= drill target implicitly) */ const drillTargetAttributeFromCatalog = allCatalogAttributesMap.get(descendantRef); + const drillTargetDescriptionObj = drillTargetAttributeFromCatalog ? { - target: drillTargetAttributeFromCatalog.defaultDisplayForm.ref, + target: getDrillAttributeDisplayForm( + drillTargetAttributeFromCatalog, + drill.drillTargetDisplayFormType, + ).ref, title: drillTargetAttributeFromCatalog.attribute.title, // title is used to distinguish between multiple drill-downs } : { diff --git a/libs/sdk-ui-dashboard/src/presentation/drill/types.ts b/libs/sdk-ui-dashboard/src/presentation/drill/types.ts index ca35a1e20bc..f9b42d0901d 100644 --- a/libs/sdk-ui-dashboard/src/presentation/drill/types.ts +++ b/libs/sdk-ui-dashboard/src/presentation/drill/types.ts @@ -1,4 +1,4 @@ -// (C) 2019-2025 GoodData Corporation +// (C) 2019-2026 GoodData Corporation import { isEmpty } from "lodash-es"; @@ -291,6 +291,7 @@ export enum AttributeDisplayFormType { GEO_PUSHPIN = "GDC.geo.pin", GEO_PUSHPIN_LATITUDE = "GDC.geo.pin_latitude", GEO_PUSHPIN_LONGITUDE = "GDC.geo.pin_longitude", + GEO_AREA = "GDC.geo.area", } export interface IAttributeDisplayForm { diff --git a/libs/sdk-ui-dashboard/src/presentation/localization/bundles/en-US.json b/libs/sdk-ui-dashboard/src/presentation/localization/bundles/en-US.json index bd806bec637..508039dfc98 100644 --- a/libs/sdk-ui-dashboard/src/presentation/localization/bundles/en-US.json +++ b/libs/sdk-ui-dashboard/src/presentation/localization/bundles/en-US.json @@ -1,3030 +1,3070 @@ { "loading": { - "value": "Loading…", - "comment": "Text shown during content loading operations" + "text": "Loading…", + "crowdinContext": "Text shown during content loading operations" }, "untitled": { - "value": "Untitled", - "comment": "Default title for untitled dashboards or widgets" + "text": "Untitled", + "crowdinContext": "Default title for untitled dashboards or widgets" }, "empty_value": { - "value": "empty value", - "comment": "Display text when a value is empty or not available" + "text": "empty value", + "crowdinContext": "Display text when a value is empty or not available" }, "gs.list.cancel": { - "value": "Cancel", - "comment": "Button label to cancel the current action" + "text": "Cancel", + "crowdinContext": "Button label to cancel the current action" }, "gs.list.apply": { - "value": "Apply", - "comment": "Button label to apply the current selection or changes" + "text": "Apply", + "crowdinContext": "Button label to apply the current selection or changes" }, "messages.dashboardSaveSuccess": { - "value": "Great. We saved your dashboard.", - "comment": "Success notification shown after successfully saving a dashboard" + "text": "Great. We saved your dashboard.", + "crowdinContext": "Success notification shown after successfully saving a dashboard" }, "options.menu.save.as": { - "value": "Save as new", - "comment": "Menu option to save the current dashboard as a new dashboard" + "text": "Save as new", + "crowdinContext": "Menu option to save the current dashboard as a new dashboard" }, "options.menu.save.as.tooltip": { - "value": "Empty dashboard cannot be saved.", - "comment": "Tooltip shown when trying to save an empty dashboard" + "text": "Empty dashboard cannot be saved.", + "crowdinContext": "Tooltip shown when trying to save an empty dashboard" }, "options.menu.settings": { - "value": "Settings", - "comment": "Menu option to open the dashboard settings dialog" + "text": "Settings", + "crowdinContext": "Menu option to open the dashboard settings dialog" }, "messages.dashboardSaveFailed": { - "value": "Dashboard save failed. Remove any unavailable visualizations, then try again, or contact your administrator.", - "comment": "Error notification shown when saving a dashboard fails" + "text": "Dashboard save failed. Remove any unavailable visualizations, then try again, or contact your administrator.", + "crowdinContext": "Error notification shown when saving a dashboard fails" }, "messages.dashboard.incompatibleDefaultFilters.title": { - "value": "Warning Some dashboard filters couldn’t be applied. Check the filters to make sure you’re viewing the right data.", - "comment": "Title of the warning message shown if default filter overrides are incompatible with the current dashboard filters." + "text": "Warning Some dashboard filters couldn’t be applied. Check the filters to make sure you’re viewing the right data.", + "crowdinContext": "Title of the warning message shown if default filter overrides are incompatible with the current dashboard filters." }, "messages.dashboard.invalidDrills.title": { - "value": "Some interactions were removed", - "comment": "Warning notification title when dashboard interactions were removed due to changes in data" + "text": "Some interactions were removed", + "crowdinContext": "Warning notification title when dashboard interactions were removed due to changes in data" }, "messages.dashboard.invalidDrills.body.modern": { - "value": "One or more dashboard/visualization/metric/attribute has been changed or deleted causing some interactions to be removed from following widgets: {listOfWidgetTitles}", - "comment": "Warning message details for invalid drill interactions using metrics with list of affected widgets" + "text": "One or more dashboard/visualization/metric/attribute has been changed or deleted causing some interactions to be removed from following widgets: {listOfWidgetTitles}", + "crowdinContext": "Warning message details for invalid drill interactions using metrics with list of affected widgets" }, "messages.dashboard.invalidCustomUrlDrills.title": { - "value": "Some of the drill-into-URL interactions are not working", - "comment": "Title of the warning message shown while editing KPI dashboard with some invalid drills." + "text": "Some of the drill-into-URL interactions are not working", + "crowdinContext": "Title of the warning message shown while editing KPI dashboard with some invalid drills." }, "messages.dashboard.invalidCustomUrlDrills.body.modern": { - "value": "Invalid URL parameters in your custom URLs are causing drill-into-URL interactions to fail on these widgets: {listOfWidgetTitles}", - "comment": "Warning message explaining URL drill failures with list of affected widgets" + "text": "Invalid URL parameters in your custom URLs are causing drill-into-URL interactions to fail on these widgets: {listOfWidgetTitles}", + "crowdinContext": "Warning message explaining URL drill failures with list of affected widgets" }, "messages.dashboard.expandable.showMore": { - "value": "Show more", - "comment": "Title of the link to show more text of a notification message." + "text": "Show more", + "crowdinContext": "Title of the link to show more text of a notification message." }, "messages.dashboard.expandable.showLess": { - "value": "Show less", - "comment": "Title of the link to collapse text of a notification message." + "text": "Show less", + "crowdinContext": "Title of the link to collapse text of a notification message." }, "messages.drill.InteractionConfiguredSuccess": { - "value": "Interaction configured.", - "comment": "Success message shown after creating a new drill interaction" + "text": "Interaction configured.", + "crowdinContext": "Success message shown after creating a new drill interaction" }, "messages.drill.InteractionUpdatedSuccess": { - "value": "Interaction updated.", - "comment": "Success message shown after modifying an existing drill interaction" + "text": "Interaction updated.", + "crowdinContext": "Success message shown after modifying an existing drill interaction" }, "filterBar.label": { - "value": "Filters", - "comment": "Label for the filter bar section" + "text": "Filters", + "crowdinContext": "Label for the filter bar section" }, "filterBar.showAll": { - "value": "Show all", - "comment": "Link text to expand and show all available filters" + "text": "Show all", + "crowdinContext": "Link text to expand and show all available filters" }, "filterBar.showLess": { - "value": "Show less", - "comment": "Link text to collapse the expanded filter list" + "text": "Show less", + "crowdinContext": "Link text to collapse the expanded filter list" }, "filterBar.unappliedFiltersNotification": { - "value": "Apply filters to see updated data.", - "comment": "Message banner shown when filters are changed but not yet applied. The tags create a clickable action to apply the filters." + "text": "Apply filters to see updated data.", + "crowdinContext": "Message banner shown when filters are changed but not yet applied. The tags create a clickable action to apply the filters." }, "filterBar.invalidFilterSelection": { - "value": "To apply changes, select valid values for these filters: {names}", - "comment": "Message shown on disabled Apply button." + "text": "To apply changes, select valid values for these filters: {names}", + "crowdinContext": "Message shown on disabled Apply button." }, "filterBar.executionTimestampNotificationMessage": { - "value": "Note. You're viewing up-to-date data, but for any relative date filters the dashboard treats {date} as “today.”", - "comment": "Message banner describing dashboard with specific data timestamp. Placeholder {date} is replaced with the current date." + "text": "Note. You're viewing up-to-date data, but for any relative date filters the dashboard treats {date} as “today.”", + "crowdinContext": "Message banner describing dashboard with specific data timestamp. Placeholder {date} is replaced with the current date." }, "filterBar.executionTimestampNotificationAction": { - "value": "Reset to today", - "comment": "Action button to reset timestamp to current date. The tags create a clickable action." + "text": "Reset to today", + "crowdinContext": "Action button to reset timestamp to current date. The tags create a clickable action." }, "options.menu.export": { - "value": "Export", - "comment": "Main export menu option in the dashboard" + "text": "Export", + "crowdinContext": "Main export menu option in the dashboard" }, "options.menu.export.header.data": { - "value": "Data", - "comment": "Header for data export options in the export submenu" + "text": "Data", + "crowdinContext": "Header for data export options in the export submenu" }, "options.menu.export_to_pdf": { - "value": "Export to PDF", - "comment": "Menu option to export the entire dashboard as a PDF document" + "text": "Export to PDF", + "crowdinContext": "Menu option to export the entire dashboard as a PDF document" }, "options.menu.export.PDF": { - "value": "Snapshot (.pdf)", - "comment": "Export option for saving a visual snapshot of the dashboard as a PDF file" + "text": "Snapshot (.pdf)", + "crowdinContext": "Export option for saving a visual snapshot of the dashboard as a PDF file" }, "options.menu.export.dialog.EXCEL": { - "value": "Export data (.xlsx)", - "comment": "Dialog title when exporting the entire dashboard's data to Excel" + "text": "Export data (.xlsx)", + "crowdinContext": "Dialog title when exporting the entire dashboard's data to Excel" }, "options.menu.export.dialog.widget.EXCEL": { - "value": "Export formatted data (.xlsx)", - "comment": "Dialog title when exporting a single widget's data to Excel with formatting preserved" + "text": "Export formatted data (.xlsx)", + "crowdinContext": "Dialog title when exporting a single widget's data to Excel with formatting preserved" }, "options.menu.export.dialog.includeExportInfo": { - "value": "Include sheet with export info", - "comment": "Checkbox option to include metadata about the export in a separate Excel sheet" + "text": "Include sheet with export info", + "crowdinContext": "Checkbox option to include metadata about the export in a separate Excel sheet" }, "options.menu.export.EXCEL": { - "value": "Data (.xlsx)", - "comment": "Export option for saving dashboard data as an Excel file" + "text": "Data (.xlsx)", + "crowdinContext": "Export option for saving dashboard data as an Excel file" }, "options.menu.export.presentation.PPTX": { - "value": "Slide Deck (.pptx)", - "comment": "Export option for saving dashboard as a PowerPoint presentation" + "text": "Slide Deck (.pptx)", + "crowdinContext": "Export option for saving dashboard as a PowerPoint presentation" }, "options.menu.export.presentation.PDF": { - "value": "Slide Deck (.pdf)", - "comment": "Export option for saving dashboard as a PDF file with slide layout" + "text": "Slide Deck (.pdf)", + "crowdinContext": "Export option for saving dashboard as a PDF file with slide layout" }, "options.menu.export.image.PNG": { - "value": "Snapshot (.png)", - "comment": "Export option for saving dashboard as a PNG image" + "text": "Snapshot (.png)", + "crowdinContext": "Export option for saving dashboard as a PNG image" }, "options.menu.export.presentation.unsupported.oldWidget": { - "value": "Unable to export. Please resave the dashboard or contact your administrator.", - "comment": "Message that explains that old widget cannot be exported without resaving the dashboard" + "text": "Unable to export. Please resave the dashboard or contact your administrator.", + "crowdinContext": "Message that explains that old widget cannot be exported without resaving the dashboard" }, "options.menu.export.in.progress": { - "value": "Export is in progress. Wait until it is finished before exporting again.", - "comment": "Message shown when trying to start a new export while another is still in progress" + "text": "Export is in progress. Wait until it is finished before exporting again.", + "crowdinContext": "Message shown when trying to start a new export while another is still in progress" }, "options.menu.schedule.email": { - "value": "Schedule export", - "comment": "Menu option to set up recurring automated exports of the dashboard" + "text": "Schedule export", + "crowdinContext": "Menu option to set up recurring automated exports of the dashboard" }, "options.menu.schedule.email.tooltip": { - "value": "No destination available. To schedule an export, create destination.", - "comment": "Tooltip shown when no export destinations are available for scheduled exports" + "text": "No destination available. To schedule an export, create destination.", + "crowdinContext": "Tooltip shown when no export destinations are available for scheduled exports" }, "options.menu.schedule.email.edit": { - "value": "Show schedules", - "comment": "Menu option to view or edit existing scheduled dashboard exports" + "text": "Show schedules", + "crowdinContext": "Menu option to view or edit existing scheduled dashboard exports" }, "options.menu.schedule.email.edit.noCreatePermissions": { - "value": "Scheduled exports", - "comment": "Menu option to view existing scheduled exports when user doesn't have permission to create new ones" + "text": "Scheduled exports", + "crowdinContext": "Menu option to view existing scheduled exports when user doesn't have permission to create new ones" }, "options.menu.alert": { - "value": "Alert", - "comment": "Menu option to display alert management" + "text": "Alert", + "crowdinContext": "Menu option to display alert management" }, "options.menu.alerts.edit": { - "value": "Show alerts", - "comment": "Menu option to view or edit existing metric alerts for the dashboard or widget" + "text": "Show alerts", + "crowdinContext": "Menu option to view or edit existing metric alerts for the dashboard or widget" }, "options.menu.alerts.edit.noCreatePermissions": { - "value": "Alerts", - "comment": "Menu option to view existing alerts when user doesn't have permission to create new ones" + "text": "Alerts", + "crowdinContext": "Menu option to view existing alerts when user doesn't have permission to create new ones" }, "options.menu.data.too.large": { - "value": "Export unavailable due to too many data points in the result.", - "comment": "Error message shown when trying to export data that exceeds size limitations" + "text": "Export unavailable due to too many data points in the result.", + "crowdinContext": "Error message shown when trying to export data that exceeds size limitations" }, "options.menu.unsupported.raw.error": { - "value": "Export unavailable due to too many data points or error in the result", - "comment": "Error message shown when visualization export fails due to data size or errors" + "text": "Export unavailable due to too many data points or error in the result", + "crowdinContext": "Error message shown when visualization export fails due to data size or errors" }, "options.menu.delete": { - "value": "Delete", - "comment": "Menu option to delete the current dashboard" + "text": "Delete", + "crowdinContext": "Menu option to delete the current dashboard" }, "options.menu.addFilterViews": { - "value": "Create view", - "comment": "Menu option to create a new dashboard filter view" + "text": "Create view", + "crowdinContext": "Menu option to create a new dashboard filter view" }, "options.menu.listFilterViews": { - "value": "Show my views", - "comment": "Open menu with my saved filter views." + "text": "Show my views", + "crowdinContext": "Open menu with my saved filter views." }, "dialogs.export.cells": { - "value": "CELLS", - "comment": "Cells of the table that is going to be exported to file" + "text": "CELLS", + "crowdinContext": "Cells of the table that is going to be exported to file" }, "dialogs.export.filters": { - "value": "VISUALIZATION CONTEXT", - "comment": "The filters that are applied to the report" + "text": "VISUALIZATION CONTEXT", + "crowdinContext": "The filters that are applied to the report" }, "dialogs.export.includeFilters": { - "value": "Include applied filters", - "comment": "Include the applied filters to the exported file" + "text": "Include applied filters", + "crowdinContext": "Include the applied filters to the exported file" }, "dialogs.export.headline": { - "value": "Export to XLSX", - "comment": "Export data to XLSX file" + "text": "Export to XLSX", + "crowdinContext": "Export data to XLSX file" }, "dialogs.export.mergeHeaders": { - "value": "Keep attribute cells merged", - "comment": "Merge the similar cells of the table into one when exporting table to the file." + "text": "Keep attribute cells merged", + "crowdinContext": "Merge the similar cells of the table into one when exporting table to the file." }, "dialogs.schedule.email.evaluation.mode.shared": { - "value": "Use the same attachments for all recipients", - "comment": "Label for the evaluation mode checkbox" + "text": "Use the same attachments for all recipients", + "crowdinContext": "Label for the evaluation mode checkbox" }, "dialogs.schedule.email.evaluation.mode.tooltip": { - "value": "Enable to send the same file to all recipients. Disable to send files that reflect each recipient’s data access rights.", - "comment": "Tooltip for the evaluation mode checkbox" + "text": "Enable to send the same file to all recipients. Disable to send files that reflect each recipient’s data access rights.", + "crowdinContext": "Tooltip for the evaluation mode checkbox" }, "dialogs.export.submit": { - "value": "Export", - "comment": "Start to export data to file" + "text": "Export", + "crowdinContext": "Start to export data to file" }, "dialogs.schedule.email.accessibilityTitle": { - "value": "Scheduled emails", - "comment": "Accessibility title for scheduled emails dialog" + "text": "Scheduled emails", + "crowdinContext": "Accessibility title for scheduled emails dialog" }, "dialogs.schedule.email.delete.success": { - "value": "Success! Your scheduled email was deleted.", - "comment": "Success message shown after successfully deleting a schedule" + "text": "Success! Your scheduled email was deleted.", + "crowdinContext": "Success message shown after successfully deleting a schedule" }, "dialogs.schedule.email.submit.success": { - "value": "Success! Your dashboard is scheduled for emailing.", - "comment": "Success message shown after successfully scheduling an export" + "text": "Success! Your dashboard is scheduled for emailing.", + "crowdinContext": "Success message shown after successfully scheduling an export" }, "dialogs.schedule.email.submit.error": { - "value": "Failed to schedule the dashboard. Try again later.", - "comment": "Error message shown when scheduling an export fails" + "text": "Failed to schedule the dashboard. Try again later.", + "crowdinContext": "Error message shown when scheduling an export fails" }, "dialogs.schedule.email.save.success": { - "value": "Success! Your schedule has been saved.", - "comment": "Success message shown after successfully saving an export schedule" + "text": "Success! Your schedule has been saved.", + "crowdinContext": "Success message shown after successfully saving an export schedule" }, "dialogs.schedule.email.save.error": { - "value": "Failed to save the schedule. Try again later.", - "comment": "Error message shown when saving an export schedule fails" + "text": "Failed to save the schedule. Try again later.", + "crowdinContext": "Error message shown when saving an export schedule fails" }, "dialogs.schedule.error.too_long": { - "value": "Error: Text too long — reduce to {value} characters or fewer.", - "comment": "Error message shown when schedule text exceeds character limit. {value} is the maximum allowed length." + "text": "Error: Text too long — reduce to {value} characters or fewer.", + "crowdinContext": "Error message shown when schedule text exceeds character limit. {value} is the maximum allowed length." }, "dialogs.alert.error.too_long": { - "value": "Error: Text too long — reduce to {value} characters or fewer.", - "comment": "Error message shown when alert text exceeds character limit. {value} is the maximum allowed length." + "text": "Error: Text too long — reduce to {value} characters or fewer.", + "crowdinContext": "Error message shown when alert text exceeds character limit. {value} is the maximum allowed length." }, "dialogs.save.as.new.title": { - "value": "Save dashboard as new", - "comment": "Dialog title when creating a copy of an existing dashboard" + "text": "Save dashboard as new", + "crowdinContext": "Dialog title when creating a copy of an existing dashboard" }, "dialogs.save.as.new.desc": { - "value": "Give your new dashboard a new descriptive name, so it's easier to find it later on.", - "comment": "Instructions shown in the Save As New dashboard dialog" + "text": "Give your new dashboard a new descriptive name, so it's easier to find it later on.", + "crowdinContext": "Instructions shown in the Save As New dashboard dialog" }, "dialogs.save.as.new.default.title": { - "value": "Copy of {title}", - "comment": "Default title format when creating a copy of a dashboard. {title} is the original dashboard title." + "text": "Copy of {title}", + "crowdinContext": "Default title format when creating a copy of a dashboard. {title} is the original dashboard title." }, "dialogs.save.as.new.alertsAndEmailsMessage": { - "value": "Alerts and email schedules will not be duplicated", - "comment": "Warning message shown when saving a dashboard as new, indicating that alerts and email schedules won't be copied" + "text": "Alerts and email schedules will not be duplicated", + "crowdinContext": "Warning message shown when saving a dashboard as new, indicating that alerts and email schedules won't be copied" }, "dialogs.save.as.new.alertsMessage": { - "value": "Alerts will not be duplicated", - "comment": "Warning message in Save As dialog about alerts not being copied" + "text": "Alerts will not be duplicated", + "crowdinContext": "Warning message in Save As dialog about alerts not being copied" }, "dialogs.save.as.new.emailsMessage": { - "value": "Email schedules will not be duplicated", - "comment": "Warning message in Save As dialog about email schedules not being copied" + "text": "Email schedules will not be duplicated", + "crowdinContext": "Warning message in Save As dialog about email schedules not being copied" }, "cancelConfirmationDialog.headline": { - "value": "Discard changes?", - "comment": "Confirmation dialog title when canceling changes" + "text": "Discard changes?", + "crowdinContext": "Confirmation dialog title when canceling changes" }, "cancelConfirmationDialog.message": { - "value": "All changes will be lost", - "comment": "Warning message shown in confirmation dialog when discarding changes" + "text": "All changes will be lost", + "crowdinContext": "Warning message shown in confirmation dialog when discarding changes" }, "cancelConfirmationDialog.submitButtonText": { - "value": "Discard changes", - "comment": "Button label to confirm discarding changes" + "text": "Discard changes", + "crowdinContext": "Button label to confirm discarding changes" }, "settingsDashboardDialog.headline": { - "value": "Dashboard settings", - "comment": "Title of the dashboard settings dialog" + "text": "Dashboard settings", + "crowdinContext": "Title of the dashboard settings dialog" }, "settingsDashboardDialog.section.alert": { - "value": "Alerts", - "comment": "Section title for alert settings in the dashboard settings dialog" + "text": "Alerts", + "crowdinContext": "Section title for alert settings in the dashboard settings dialog" }, "settingsDashboardDialog.section.alert.inherit": { - "value": "Use the default evaluation frequency set by your organization.", - "comment": "Label for option to use organization's default alert evaluation frequency" + "text": "Use the default evaluation frequency set by your organization.", + "crowdinContext": "Label for option to use organization's default alert evaluation frequency" }, "settingsDashboardDialog.section.alert.note": { - "value": "Note: Applies to new alerts only — use the API to update existing ones.", - "comment": "Note about alert settings applying only to new alerts" + "text": "Note: Applies to new alerts only — use the API to update existing ones.", + "crowdinContext": "Note about alert settings applying only to new alerts" }, "settingsDashboardDialog.section.alert.label": { - "value": "Evaluation Frequency", - "comment": "Label for alert evaluation frequency setting" + "text": "Evaluation Frequency", + "crowdinContext": "Label for alert evaluation frequency setting" }, "deleteDashboardDialog.headline": { - "value": "Delete dashboard?", - "comment": "Confirmation dialog for deleting a dashboard" + "text": "Delete dashboard?", + "crowdinContext": "Confirmation dialog for deleting a dashboard" }, "deleteDashboardDialog.submitButtonText": { - "value": "Delete", - "comment": "Label for the confirmation button in the delete dashboard dialog" + "text": "Delete", + "crowdinContext": "Label for the confirmation button in the delete dashboard dialog" }, "deleteDashboardDialog.defaultMessage": { - "value": "Are you sure you want to delete dashboard {title}?", - "comment": "Confirmation dialog for deleting a dashboard. The {title} placeholder shows the specific dashboard name." + "text": "Are you sure you want to delete dashboard {title}?", + "crowdinContext": "Confirmation dialog for deleting a dashboard. The {title} placeholder shows the specific dashboard name." }, "deleteDashboardDialog.objectsMessage": { - "value": "Following objects associated with the dashboard {title} will be permanently deleted:", - "comment": "Warning message listing objects to be deleted with the dashboard. The {title} placeholder shows the specific dashboard name." + "text": "Following objects associated with the dashboard {title} will be permanently deleted:", + "crowdinContext": "Warning message listing objects to be deleted with the dashboard. The {title} placeholder shows the specific dashboard name." }, "deleteDashboardDialog.alerts": { - "value": "alerts", - "comment": "Label for alerts that will be deleted with the dashboard" + "text": "alerts", + "crowdinContext": "Label for alerts that will be deleted with the dashboard" }, "deleteDashboardDialog.schedules": { - "value": "scheduled exports", - "comment": "Label for scheduled exports that will be deleted with the dashboard" + "text": "scheduled exports", + "crowdinContext": "Label for scheduled exports that will be deleted with the dashboard" }, "deleteDashboardDialog.drills": { - "value": "drilling", - "comment": "Label for drill configurations that will be removed with the dashboard" + "text": "drilling", + "crowdinContext": "Label for drill configurations that will be removed with the dashboard" }, "deleteWidgetDialog.headline": { - "value": "Remove widget?", - "comment": "Confirmation dialog title when removing a widget from a dashboard" + "text": "Remove widget?", + "crowdinContext": "Confirmation dialog title when removing a widget from a dashboard" }, "deleteWidgetDialog.objectsMessage": { - "value": "Following types objects associated with the widget {title} will no longer work:", - "comment": "Warning message about objects that will be affected when deleting a widget. The {title} placeholder shows the specific widget name." + "text": "Following types objects associated with the widget {title} will no longer work:", + "crowdinContext": "Warning message about objects that will be affected when deleting a widget. The {title} placeholder shows the specific widget name." }, "deleteWidgetDialog.alerts": { - "value": "alerts", - "comment": "Label for alerts that will be affected by widget removal" + "text": "alerts", + "crowdinContext": "Label for alerts that will be affected by widget removal" }, "deleteWidgetDialog.schedules": { - "value": "scheduled exports", - "comment": "Label for scheduled exports that will be affected by widget removal" + "text": "scheduled exports", + "crowdinContext": "Label for scheduled exports that will be affected by widget removal" }, "create.dashboard": { - "value": "Create dashboard", - "comment": "Button label or menu item for creating a new dashboard" + "text": "Create dashboard", + "crowdinContext": "Button label or menu item for creating a new dashboard" }, "drill_modal_picker.drill-down": { - "value": "Drill down", - "comment": "Label for the drill down interaction in the drill configuration modal" + "text": "Drill down", + "crowdinContext": "Label for the drill down interaction in the drill configuration modal" }, "drill_modal_picker.drill-to-url": { - "value": "Drill to URL", - "comment": "Label for the drill to URL interaction in the drill configuration modal" + "text": "Drill to URL", + "crowdinContext": "Label for the drill to URL interaction in the drill configuration modal" }, "drill_modal_picker.drill-into": { - "value": "Drill into", - "comment": "Label for the drill into interaction in the drill configuration modal" + "text": "Drill into", + "crowdinContext": "Label for the drill into interaction in the drill configuration modal" }, "drill_modal_picker.cross-filter": { - "value": "Cross-filter", - "comment": "Label for the cross-filter interaction in the drill configuration modal" + "text": "Cross-filter", + "crowdinContext": "Label for the cross-filter interaction in the drill configuration modal" }, "drill_modal_picker.key-driver-analysis": { - "value": "Explain", - "comment": "Label for the key driver analysis interaction in the drill configuration modal" + "text": "Explain", + "crowdinContext": "Label for the key driver analysis interaction in the drill configuration modal" }, "drill_modal_picker.more.details": { - "value": "More details", - "comment": "Label for viewing more details about drill interactions" + "text": "More details", + "crowdinContext": "Label for viewing more details about drill interactions" }, "drill_modal_picker.label": { - "value": "Choose drill action", - "comment": "Instruction text in the drill modal for selecting a drill action" + "text": "Choose drill action", + "crowdinContext": "Instruction text in the drill modal for selecting a drill action" }, "drillModal.backToTop": { - "value": "Back to top", - "comment": "Navigation button label to return to the top level in the drill modal" + "text": "Back to top", + "crowdinContext": "Navigation button label to return to the top level in the drill modal" }, "filters.alertMessage.relativePreset": { - "value": "in {calendarIcon} {range}", - "comment": "Message displayed in filter alert showing a relative date range with calendar icon. Example: 'in (calendar icon) last 7 days'." + "text": "in {calendarIcon} {range}", + "crowdinContext": "Message displayed in filter alert showing a relative date range with calendar icon. Example: 'in (calendar icon) last 7 days'." }, "filters.alertMessage.relativePreset.inPeriod": { - "value": "in period {calendarIcon} {range}", - "comment": "Message displayed in filter alert showing a relative date range with period specification. Example: 'in period (calendar icon) from 2 months ago to 2 months ahead'." + "text": "in period {calendarIcon} {range}", + "crowdinContext": "Message displayed in filter alert showing a relative date range with period specification. Example: 'in period (calendar icon) from 2 months ago to 2 months ahead'." }, "filters.config.warning.multipleWorkspacesConfigs": { - "value": "There is more than one workspace date filter configuration associated with this workspace. The first one was used.", - "comment": "Displayed if there is more than one workspace date filter configuration associated with the workspace." + "text": "There is more than one workspace date filter configuration associated with this workspace. The first one was used.", + "crowdinContext": "Displayed if there is more than one workspace date filter configuration associated with the workspace." }, "filters.config.warning.selectedFilterNotValid": { - "value": "The default filter option is not valid, using the first option available instead.", - "comment": "Displayed if the default option for new dashboards is not valid." + "text": "The default filter option is not valid, using the first option available instead.", + "crowdinContext": "Displayed if the default option for new dashboards is not valid." }, "filters.config.warning.allOptionsHidden": { - "value": "The dashboard date filter configuration was ignored because it would have hidden all the filter options.", - "comment": "Displayed if applying a dashboard config would make all the filter options hidden." + "text": "The dashboard date filter configuration was ignored because it would have hidden all the filter options.", + "crowdinContext": "Displayed if applying a dashboard config would make all the filter options hidden." }, "filters.config.warning.conflictingIdentifiers": { - "value": "The dashboard date filter configuration was ignored because it contains date filter options with identical identifiers.", - "comment": "Displayed if applying a dashboard config would make it contain more than one option with the same identifier." + "text": "The dashboard date filter configuration was ignored because it contains date filter options with identical identifiers.", + "crowdinContext": "Displayed if applying a dashboard config would make it contain more than one option with the same identifier." }, "filters.config.warning.workspace.notAvailable": { - "value": "The workspace date filter configuration is either not defined or you do not have the permissions to access it.", - "comment": "Displayed if there is an error getting the workspace level config." + "text": "The workspace date filter configuration is either not defined or you do not have the permissions to access it.", + "crowdinContext": "Displayed if there is an error getting the workspace level config." }, "filters.configurationPanel.header": { - "value": "Filters", - "comment": "Header for the filter configuration panel in dashboard settings" + "text": "Filters", + "crowdinContext": "Header for the filter configuration panel in dashboard settings" }, "filters.configurationPanel.crossFiltering.toggle": { - "value": "Cross-filtering", - "comment": "Label for toggle that enables or disables cross-filtering in the filter configuration panel" + "text": "Cross-filtering", + "crowdinContext": "Label for toggle that enables or disables cross-filtering in the filter configuration panel" }, "filters.configurationPanel.crossFiltering.toggle.tooltip": { - "value": "Allow users to filter the dashboard by clicking data points in visualizations.", - "comment": "Tooltip explaining cross-filtering functionality when hovering over the toggle" + "text": "Allow users to filter the dashboard by clicking data points in visualizations.", + "crowdinContext": "Tooltip explaining cross-filtering functionality when hovering over the toggle" }, "filters.configurationPanel.userFilterReset.toggle": { - "value": "Reset", - "comment": "Label for toggle that enables or disables filter reset functionality in dashboard" + "text": "Reset", + "crowdinContext": "Label for toggle that enables or disables filter reset functionality in dashboard" }, "filters.configurationPanel.userFilterReset.toggle.tooltip": { - "value": "Allow users to reset all filters to default.", - "comment": "Tooltip explaining what the reset toggle does when enabled" + "text": "Allow users to reset all filters to default.", + "crowdinContext": "Tooltip explaining what the reset toggle does when enabled" }, "filters.configurationPanel.userFilterSave.toggle": { - "value": "Auto-save last state", - "comment": "Label for toggle that enables or disables automatic saving of filter state" + "text": "Auto-save last state", + "crowdinContext": "Label for toggle that enables or disables automatic saving of filter state" }, "filters.configurationPanel.userFilterSave.toggle.tooltip": { - "value": "Allow auto-save of the filters' last state. When users return, their filters will remain as they left them.", - "comment": "Tooltip explaining the auto-save filter functionality when hovering over the toggle" + "text": "Allow auto-save of the filters' last state. When users return, their filters will remain as they left them.", + "crowdinContext": "Tooltip explaining the auto-save filter functionality when hovering over the toggle" }, "filters.configurationPanel.filterViews.toggle": { - "value": "Saved views", - "comment": "Label for toggle that enables or disables saving custom filter views" + "text": "Saved views", + "crowdinContext": "Label for toggle that enables or disables saving custom filter views" }, "filters.configurationPanel.filterViews.toggle.tooltip": { - "value": "

Allows users to save filters state as a personal views they can return to later.

Only the user who saved the view can access it and set it as their default view.

", - "comment": "Tooltip explaining saved views functionality when hovering over the toggle" + "text": "

Allows users to save filters state as a personal views they can return to later.

Only the user who saved the view can access it and set it as their default view.

", + "crowdinContext": "Tooltip explaining saved views functionality when hovering over the toggle" }, "settingsDashboardDialog.sectionHeaders.dateDataset": { - "value": "Date range in descriptions", - "comment": "Label for dropdown to select date dataset for section header Rich Text" + "text": "Date range in descriptions", + "crowdinContext": "Label for dropdown to select date dataset for section header Rich Text" }, "settingsDashboardDialog.sectionHeaders.dateDataset.tooltip": { - "value": "Date dataset used by the Date range filter for metric references in section descriptions.", - "comment": "Tooltip explaining date dataset configuration for section headers" + "text": "Date dataset used by the Date range filter for metric references in section descriptions.", + "crowdinContext": "Tooltip explaining date dataset configuration for section headers" }, "dateDataset.autoSelect": { - "value": "Auto-select", - "comment": "Label shown when no specific date dataset is selected and system auto-selects" + "text": "Auto-select", + "crowdinContext": "Label shown when no specific date dataset is selected and system auto-selects" }, "dateDataset.notFound": { - "value": "Not found", - "comment": "Label shown when configured date dataset is not found" + "text": "Not found", + "crowdinContext": "Label shown when configured date dataset is not found" }, "dialogs.schedule.email.attachments.label": { - "value": "Attachments", - "comment": "Attachments of the scheduled email." + "text": "Attachments", + "crowdinContext": "Attachments of the scheduled email." }, "dialogs.schedule.email.title.placeholder": { - "value": "Untitled schedule", - "comment": "Placeholder text shown in the schedule title input field when no title has been entered" + "text": "Untitled schedule", + "crowdinContext": "Placeholder text shown in the schedule title input field when no title has been entered" }, "dialogs.alert.title.placeholder": { - "value": "Alert name", - "comment": "Placeholder for alert title input" + "text": "Alert name", + "crowdinContext": "Placeholder for alert title input" }, "dialogs.alert.accessibility.label.title": { - "value": "Alert name", - "comment": "Accessibility label for alert name input field" + "text": "Alert name", + "crowdinContext": "Accessibility label for alert name input field" }, "dialogs.schedule.accessibility.label.email.title": { - "value": "Schedule name", - "comment": "Accessibility label for schedule name input field" + "text": "Schedule name", + "crowdinContext": "Accessibility label for schedule name input field" }, "dialogs.schedule.email.message.label": { - "value": "Message", - "comment": "Message of the scheduled email." + "text": "Message", + "crowdinContext": "Message of the scheduled email." }, "dialogs.schedule.email.max.recipients": { - "value": "Error: Too many recipients — you can add up to {maxRecipients}.", - "comment": "Message for recipients input when the maximum number of recipients is reached" + "text": "Error: Too many recipients — you can add up to {maxRecipients}.", + "crowdinContext": "Message for recipients input when the maximum number of recipients is reached" }, "dialogs.schedule.email.min.recipients": { - "value": "Error: Required field — select a recipient to continue.", - "comment": "Message for recipients input when the minimum number of recipients is reached" + "text": "Error: Required field — select a recipient to continue.", + "crowdinContext": "Message for recipients input when the minimum number of recipients is reached" }, "dialogs.schedule.email.usersLoad.error": { - "value": "Error: Unable to load users — try again later.", - "comment": "Message for recipients input when users load fails" + "text": "Error: Unable to load users — try again later.", + "crowdinContext": "Message for recipients input when users load fails" }, "dialogs.schedule.email.user.missing.email": { - "value": "Error: The following recipients have invalid email addresses — fix them to continue: {recipients}.", - "comment": "Message for recipients input when a user is missing an email address." + "text": "Error: The following recipients have invalid email addresses — fix them to continue: {recipients}.", + "crowdinContext": "Message for recipients input when a user is missing an email address." }, "dialogs.schedule.email.user.missing.email.tooltip": { - "value": "Error: This recipient has invalid email address.", - "comment": "Message for recipients input when a user is missing an email address." + "text": "Error: This recipient has invalid email address.", + "crowdinContext": "Message for recipients input when a user is missing an email address." }, "dialogs.schedule.email.user.invalid.external": { - "value": "Error: The following recipients don’t have the required access — remove them to continue: {recipients}.", - "comment": "Message for recipients input when a user is external and not allowed." + "text": "Error: The following recipients don’t have the required access — remove them to continue: {recipients}.", + "crowdinContext": "Message for recipients input when a user is external and not allowed." }, "dialogs.schedule.email.user.invalid.external.tooltip": { - "value": "Error: This recipient does not have the required access.", - "comment": "Tooltip for recipients input when a user is external and not allowed." + "text": "Error: This recipient does not have the required access.", + "crowdinContext": "Tooltip for recipients input when a user is external and not allowed." }, "dialogs.schedule.email.user.invalid.onlyYou": { - "value": "Error: Only you can be a recipient — remove others to continue.", - "comment": "Message for recipients input when only author is allowed." + "text": "Error: Only you can be a recipient — remove others to continue.", + "crowdinContext": "Message for recipients input when only author is allowed." }, "dialogs.schedule.email.user.used.external": { - "value": "The email “{email}” does not belong to this workspace. The recipient may receive sensitive data.", - "comment": "Message for recipients input when a user is external and allowed." + "text": "The email “{email}” does not belong to this workspace. The recipient may receive sensitive data.", + "crowdinContext": "Message for recipients input when a user is external and allowed." }, "dialogs.schedule.email.user.remove": { - "value": "Remove {name}", - "comment": "Label of a button for removing a user from the recipients list" + "text": "Remove {name}", + "crowdinContext": "Label of a button for removing a user from the recipients list" }, "dialogs.schedule.email.userAndEmail.remove": { - "value": "Remove {name} ({email})", - "comment": "Label of a button for removing a user from the recipients list" + "text": "Remove {name} ({email})", + "crowdinContext": "Label of a button for removing a user from the recipients list" }, "dialogs.schedule.email.user.warning.external": { - "value": "Warning: External recipient — “{email}” will receive the same dashboard view as you.", - "comment": "Message for recipients input when a user is external" + "text": "Warning: External recipient — “{email}” will receive the same dashboard view as you.", + "crowdinContext": "Message for recipients input when a user is external" }, "dialogs.schedule.email.user.unknown": { - "value": "This is an unknown user and cannot be added as a recipient.", - "comment": "Message for recipients input when a user is unknown" + "text": "This is an unknown user and cannot be added as a recipient.", + "crowdinContext": "Message for recipients input when a user is unknown" }, "dialogs.schedule.email.user.noMatch": { - "value": "No matching users or groups.", - "comment": "Message shown when searching for recipients and no users or groups match the search criteria" + "text": "No matching users or groups.", + "crowdinContext": "Message shown when searching for recipients and no users or groups match the search criteria" }, "dialogs.schedule.email.user.notMe": { - "value": "This user is not allowed. There can be only you as a recipient.", - "comment": "Message for recipients input when a user is not allowed" + "text": "This user is not allowed. There can be only you as a recipient.", + "crowdinContext": "Message for recipients input when a user is not allowed" }, "dialogs.schedule.email.user.guest": { - "value": "(guest)", - "comment": "Guest user label" + "text": "(guest)", + "crowdinContext": "Guest user label" }, "dialogs.schedule.email.recipients.note": { - "value": "Note: All recipients marked as “(guest)” will receive the same dashboard view as you.", - "comment": "Note for recipients input when some recipients are external" + "text": "Note: All recipients marked as “(guest)” will receive the same dashboard view as you.", + "crowdinContext": "Note for recipients input when some recipients are external" }, "dialogs.schedule.email.subject.label": { - "value": "Subject", - "comment": "Label for the subject field in scheduled email form" + "text": "Subject", + "crowdinContext": "Label for the subject field in scheduled email form" }, "dialogs.schedule.email.recipients.label": { - "value": "Recipients", - "comment": "Label for recipients field in scheduled email form" + "text": "Recipients", + "crowdinContext": "Label for recipients field in scheduled email form" }, "dialogs.schedule.email.filters": { - "value": "Filters ({count})", - "comment": "Label for filters selection in scheduled email form, with count of active filters" + "text": "Filters ({count})", + "crowdinContext": "Label for filters selection in scheduled email form, with count of active filters" }, "dialogs.schedule.email.tabs.general": { - "value": "General", - "comment": "Label for the General tab in scheduled email dialog" + "text": "General", + "crowdinContext": "Label for the General tab in scheduled email dialog" }, "dialogs.schedule.email.tabs.filters": { - "value": "Filters", - "comment": "Label for the Filters tab in scheduled email dialog" + "text": "Filters", + "crowdinContext": "Label for the Filters tab in scheduled email dialog" }, "dialogs.schedule.email.destination": { - "value": "Destination", - "comment": "Label for selecting destination method for scheduled email delivery" + "text": "Destination", + "crowdinContext": "Label for selecting destination method for scheduled email delivery" }, "dialogs.schedule.email.destination.missing": { - "value": "No destination available.", - "comment": "Title when no destination is created" + "text": "No destination available.", + "crowdinContext": "Title when no destination is created" }, "dialogs.schedule.email.destination.help": { - "value": "Create destination", - "comment": "Title of the help link for destination creation" + "text": "Create destination", + "crowdinContext": "Title of the help link for destination creation" }, "dialogs.schedule.email.message.placeholder": { - "value": "Hello, Your scheduled email is ready. You can download the dashboard in attachments.", - "comment": "Default message text shown in scheduled email message field" + "text": "Hello, Your scheduled email is ready. You can download the dashboard in attachments.", + "crowdinContext": "Default message text shown in scheduled email message field" }, "dialogs.schedule.email.create": { - "value": "Create", - "comment": "Translate as imperative. Create the schedule by submitting form." + "text": "Create", + "crowdinContext": "Translate as imperative. Create the schedule by submitting form." }, "dialogs.schedule.email.closeLabel": { - "value": "Close dialog", - "comment": "Label of a close button" + "text": "Close dialog", + "crowdinContext": "Label of a close button" }, "dialogs.schedule.email.backLabel": { - "value": "Back to previous step", - "comment": "Label of a back button" + "text": "Back to previous step", + "crowdinContext": "Label of a back button" }, "dialogs.alert.backLabel": { - "value": "Back to previous step", - "comment": "Label of a back button" + "text": "Back to previous step", + "crowdinContext": "Label of a back button" }, "dialogs.alert.closeLabel": { - "value": "Close dialog", - "comment": "Label of a close button" + "text": "Close dialog", + "crowdinContext": "Label of a close button" }, "dialogs.schedule.email.footer.title": { - "value": "How to schedule export?", - "comment": "Title of a link to documentation" + "text": "How to schedule export?", + "crowdinContext": "Title of a link to documentation" }, "dialogs.schedule.email.footer.title.short": { - "value": "Help", - "comment": "Title of a link to documentation" + "text": "Help", + "crowdinContext": "Title of a link to documentation" }, "dialogs.schedule.email.save": { - "value": "Save", - "comment": "Translate as imperative. It's caption of a button for saving scheduled mail" + "text": "Save", + "crowdinContext": "Translate as imperative. It's caption of a button for saving scheduled mail" }, "dialogs.schedule.email.save.executionTimestampMode": { - "value": "To create or edit scheduled exports, reset the dashboard date to today.", - "comment": "Error message shown when trying to schedule exports with non-current date filters applied" + "text": "To create or edit scheduled exports, reset the dashboard date to today.", + "crowdinContext": "Error message shown when trying to schedule exports with non-current date filters applied" }, "dialogs.alert.save.executionTimestampMode": { - "value": "To create or edit alerts, reset the dashboard date to today.", - "comment": "Error message shown when trying to create alerts with non-current date filters applied" + "text": "To create or edit alerts, reset the dashboard date to today.", + "crowdinContext": "Error message shown when trying to create alerts with non-current date filters applied" }, "dialogs.schedule.email.widgetError": { - "value": "Error: Schedule can't be sent — the source widget was deleted. Delete the schedule or contact your administrator.", - "comment": "Error message shown when alert configuration references a deleted widget" + "text": "Error: Schedule can't be sent — the source widget was deleted. Delete the schedule or contact your administrator.", + "crowdinContext": "Error message shown when alert configuration references a deleted widget" }, "dialogs.schedule.email.destinationWarning": { - "value": "The selected destination only supports sending the export to yourself.", - "comment": "Warning shown when selected export destination restricts recipients to the current user only" + "text": "The selected destination only supports sending the export to yourself.", + "crowdinContext": "Warning shown when selected export destination restricts recipients to the current user only" }, "dialogs.automation.filters.showAll": { - "value": "Show all", - "comment": "Button label to expand and show the complete list of filters" + "text": "Show all", + "crowdinContext": "Button label to expand and show the complete list of filters" }, "dialogs.automation.filters.showAll.ariaDescription": { - "value": "Use to show all filters.", - "comment": "Accessibility description for the button that shows all filters" + "text": "Use to show all filters.", + "crowdinContext": "Accessibility description for the button that shows all filters" }, "dialogs.automation.filters.showLess": { - "value": "Show less", - "comment": "Button label to collapse and show fewer filters in the list" + "text": "Show less", + "crowdinContext": "Button label to collapse and show fewer filters in the list" }, "dialogs.automation.filters.showLess.ariaDescription": { - "value": "Use to show less filters.", - "comment": "Accessibility description for the button that collapses the filter list" + "text": "Use to show less filters.", + "crowdinContext": "Accessibility description for the button that collapses the filter list" }, "dialogs.automation.filters.add": { - "value": "Add filter", - "comment": "Button label to add a new filter in the automation dialog" + "text": "Add filter", + "crowdinContext": "Button label to add a new filter in the automation dialog" }, "dialogs.automation.filters.addDisabled": { - "value": "Add filter disabled — all filters have been added.", - "comment": "Button label to add a new filter in the automation dialog when the button is disabled" + "text": "Add filter disabled — all filters have been added.", + "crowdinContext": "Button label to add a new filter in the automation dialog when the button is disabled" }, "dialogs.automation.filters.title": { - "value": "Add filter", - "comment": "Title of the dialog for adding filters to automation" + "text": "Add filter", + "crowdinContext": "Title of the dialog for adding filters to automation" }, "dialogs.automation.filters.noFilters": { - "value": "No more filters available", - "comment": "Message shown when there are no additional filters that can be added" + "text": "No more filters available", + "crowdinContext": "Message shown when there are no additional filters that can be added" }, "dialogs.automation.filters.useFiltersMessage": { - "value": "Always use these filters for future exports", - "comment": "Message explaining that selected filters will be applied to all future exports" + "text": "Always use these filters for future exports", + "crowdinContext": "Message explaining that selected filters will be applied to all future exports" }, "dialogs.automation.filters.searchAriaLabel": { - "value": "Search filters", - "comment": "Accessibility label for the search input in the automation dialog" + "text": "Search filters", + "crowdinContext": "Accessibility label for the search input in the automation dialog" }, "dialogs.automation.filters.deleteAriaLabel": { - "value": "Remove filter", - "comment": "Accessibility label for the button that removes a filter from automation" + "text": "Remove filter", + "crowdinContext": "Accessibility label for the button that removes a filter from automation" }, "dialogs.automation.filters.deleteTooltip": { - "value": "Remove filter", - "comment": "Tooltip text for the button that removes a filter from automation" + "text": "Remove filter", + "crowdinContext": "Tooltip text for the button that removes a filter from automation" }, "dialogs.automation.filters.lockedTooltip": { - "value": "This filter is locked and cannot be removed.", - "comment": "Tooltip text for locked filter in automation create dialog" + "text": "This filter is locked and cannot be removed.", + "crowdinContext": "Tooltip text for locked filter in automation create dialog" }, "dialogs.automation.filters.useFiltersMessage.tooltip": { - "value": "Check to keep these filters for every export. If unchecked, the export will use the latest default filters from the dashboard.", - "comment": "Tooltip explaining filter persistence options for scheduled exports" + "text": "Check to keep these filters for every export. If unchecked, the export will use the latest default filters from the dashboard.", + "crowdinContext": "Tooltip explaining filter persistence options for scheduled exports" }, "dialogs.automation.filters.activeFilters": { - "value": "Note: These filters will always be used for future exports.", - "comment": "Informational message about filters being permanently applied to exports" + "text": "Note: These filters will always be used for future exports.", + "crowdinContext": "Informational message about filters being permanently applied to exports" }, "dialogs.automation.filters.missing": { - "value": "Warning: Some filters couldn't be applied — they're no longer available on the dashboard.", - "comment": "Warning message when saved filters are no longer available on the dashboard" + "text": "Warning: Some filters couldn't be applied — they're no longer available on the dashboard.", + "crowdinContext": "Warning message when saved filters are no longer available on the dashboard" }, "dialogs.automation.filters.tab.label": { - "value": "TAB", - "comment": "Label shown above each tab section header in automation filters dialog" + "text": "TAB", + "crowdinContext": "Label shown above each tab section header in automation filters dialog" }, "dialogs.automation.filters.tab.untitled": { - "value": "Tab", - "comment": "Fallback title for a dashboard tab section in automation filters when the tab has no title" + "text": "Tab", + "crowdinContext": "Fallback title for a dashboard tab section in automation filters when the tab has no title" }, "dialogs.schedule.email.tabs.info": { - "value": "All tabs in the dashboard are included — a separate file is created for each tab and export format.", - "comment": "Info message shown on General tab when dashboard tabs are enabled, explaining that all tabs will be exported" + "text": "All tabs in the dashboard are included — a separate file is created for each tab and export format.", + "crowdinContext": "Info message shown on General tab when dashboard tabs are enabled, explaining that all tabs will be exported" }, "dialogs.automation.attachments.add": { - "value": "Add attachments", - "comment": "Title of the dialog for adding attachments to automation" + "text": "Add attachments", + "crowdinContext": "Title of the dialog for adding attachments to automation" }, "dialogs.automation.applyCurrentFilters.confirm.title": { - "value": "Edit with current filters?", - "comment": "Title of the dialog, that confirms that the user wants to edit the automation with the current dashboard filters." + "text": "Edit with current filters?", + "crowdinContext": "Title of the dialog, that confirms that the user wants to edit the automation with the current dashboard filters." }, "dialogs.automation.applyCurrentFilters.confirm.submit": { - "value": "Edit", - "comment": "Label of the submit button in the dialog, that confirms that the user wants to edit the automation with the current dashboard filters." + "text": "Edit", + "crowdinContext": "Label of the submit button in the dialog, that confirms that the user wants to edit the automation with the current dashboard filters." }, "dialogs.automation.applyCurrentFilters.alert.confirm": { - "value": "Warning: Some filters used when this alert was created are no longer available or valid. Editing will apply the current dashboard filters.", - "comment": "Warning message when editing an alert with outdated filters" + "text": "Warning: Some filters used when this alert was created are no longer available or valid. Editing will apply the current dashboard filters.", + "crowdinContext": "Warning message when editing an alert with outdated filters" }, "dialogs.automation.applyCurrentFilters.schedule.confirm": { - "value": "Warning: Some filters used when this schedule was created are no longer available or valid. Editing will apply the current dashboard filters.", - "comment": "Warning message when editing a schedule with outdated filters" + "text": "Warning: Some filters used when this schedule was created are no longer available or valid. Editing will apply the current dashboard filters.", + "crowdinContext": "Warning message when editing a schedule with outdated filters" }, "dialogs.automation.filters.schedule.ariaLabel": { - "value": "Information about the option: Always use these filters for future exports.", - "comment": "Aria label for Schedule Dialog Automation Filters tooltip" + "text": "Information about the option: Always use these filters for future exports.", + "crowdinContext": "Aria label for Schedule Dialog Automation Filters tooltip" }, "dialogs.schedule.management.title": { - "value": "Scheduled exports", - "comment": "Title of the scheduled exports management dialog" + "text": "Scheduled exports", + "crowdinContext": "Title of the scheduled exports management dialog" }, "dialogs.schedule.management.delete": { - "value": "Delete the schedule.", - "comment": "Button tooltip for deleting a scheduled export" + "text": "Delete the schedule.", + "crowdinContext": "Button tooltip for deleting a scheduled export" }, "dialogs.schedule.management.delete.dialog": { - "value": "Delete schedule?", - "comment": "Title of the confirmation dialog when deleting a scheduled export" + "text": "Delete schedule?", + "crowdinContext": "Title of the confirmation dialog when deleting a scheduled export" }, "dialogs.schedule.management.delete.dialog.confirm": { - "value": "The schedule will be permanently deleted.", - "comment": "Confirmation message when deleting a scheduled export" + "text": "The schedule will be permanently deleted.", + "crowdinContext": "Confirmation message when deleting a scheduled export" }, "dialogs.schedule.management.list.title": { - "value": "Your scheduled exports", - "comment": "Title for the list of user's scheduled exports" + "text": "Your scheduled exports", + "crowdinContext": "Title for the list of user's scheduled exports" }, "dialogs.schedule.management.create": { - "value": "Create", - "comment": "Button label to create a new scheduled export" + "text": "Create", + "crowdinContext": "Button label to create a new scheduled export" }, "dialogs.schedule.management.create.new": { - "value": "Create new", - "comment": "Button label to create a new scheduled export" + "text": "Create new", + "crowdinContext": "Button label to create a new scheduled export" }, "dialogs.schedule.management.create.tooManyMessage": { - "value": "Your organization has reached the limit of scheduled exports. Contact your administrator to create more.", - "comment": "Error message shown when organization has reached maximum scheduled exports limit" + "text": "Your organization has reached the limit of scheduled exports. Contact your administrator to create more.", + "crowdinContext": "Error message shown when organization has reached maximum scheduled exports limit" }, "dialogs.schedule.management.noSchedules": { - "value": "There are no scheduled exports.{br}Create new.", - "comment": "Message shown when no scheduled exports exist, with line break placeholder" + "text": "There are no scheduled exports.{br}Create new.", + "crowdinContext": "Message shown when no scheduled exports exist, with line break placeholder" }, "dialogs.schedule.management.attachments.attachment": { - "value": "Attach as a {format} file", - "comment": "File format checkbox label in scheduled export settings. {format} is the file format, e.g. PDF, CSV, XLSX." + "text": "Attach as a {format} file", + "crowdinContext": "File format checkbox label in scheduled export settings. {format} is the file format, e.g. PDF, CSV, XLSX." }, "dialogs.schedule.management.attachments.xlsx.settings": { - "value": "XLSX options", - "comment": "Section header for Excel export format configuration. XLSX is the file format." + "text": "XLSX options", + "crowdinContext": "Section header for Excel export format configuration. XLSX is the file format." }, "dialogs.schedule.management.attachments.cells.merged": { - "value": "Keep attribute cells merged", - "comment": "Label for checkbox option in Excel export settings to keep attribute cells merged" + "text": "Keep attribute cells merged", + "crowdinContext": "Label for checkbox option in Excel export settings to keep attribute cells merged" }, "dialogs.schedule.management.attachments.exportInfo": { - "value": "Include sheet with export info", - "comment": "Label of a checkbox field" + "text": "Include sheet with export info", + "crowdinContext": "Label of a checkbox field" }, "dialogs.schedule.management.attachments.delete": { - "value": "Delete {format} attachment", - "comment": "Button tooltip for deleting an attachment. Keep the {format} placeholder." + "text": "Delete {format} attachment", + "crowdinContext": "Button tooltip for deleting an attachment. Keep the {format} placeholder." }, "dialogs.schedule.management.attachments.removed": { - "value": "{format} attachment removed.", - "comment": "Screen reader announcement when an attachment is removed from scheduled export. Example: 'PDF attachment removed.'" + "text": "{format} attachment removed.", + "crowdinContext": "Screen reader announcement when an attachment is removed from scheduled export. Example: 'PDF attachment removed.'" }, "dialogs.schedule.management.attachments.filters.title": { - "value": "Dashboard filters", - "comment": "Section title for filter settings in scheduled export configuration" + "text": "Dashboard filters", + "crowdinContext": "Section title for filter settings in scheduled export configuration" }, "dialogs.schedule.management.attachments.filters.using": { - "value": "using", - "comment": "Conjunction word connecting the export action with the filter selection" + "text": "using", + "crowdinContext": "Conjunction word connecting the export action with the filter selection" }, "dialogs.schedule.management.attachments.filters.default": { - "value": "default dashboard filters", - "comment": "Label indicating that default dashboard filters will be used in export" + "text": "default dashboard filters", + "crowdinContext": "Label indicating that default dashboard filters will be used in export" }, "dialogs.schedule.management.attachments.filters.edited": { - "value": "edited dashboard filters", - "comment": "Label indicating that custom edited filters will be used in export" + "text": "edited dashboard filters", + "crowdinContext": "Label indicating that custom edited filters will be used in export" }, "dialogs.schedule.management.attachments.filters.item.default": { - "value": "Use default filters", - "comment": "Dropdown option to use default dashboard filters in scheduled export" + "text": "Use default filters", + "crowdinContext": "Dropdown option to use default dashboard filters in scheduled export" }, "dialogs.schedule.management.attachments.filters.item.edited": { - "value": "Use edited filters", - "comment": "Dropdown option to use custom edited filters in scheduled export" + "text": "Use edited filters", + "crowdinContext": "Dropdown option to use custom edited filters in scheduled export" }, "dialogs.schedule.management.attachments.filters.item.tooltip": { - "value": "Default state of dashboard filters will be used in the scheduled export, even if the default values change in the future.", - "comment": "Tooltip explaining how default filters work in scheduled exports" + "text": "Default state of dashboard filters will be used in the scheduled export, even if the default values change in the future.", + "crowdinContext": "Tooltip explaining how default filters work in scheduled exports" }, "dialogs.schedule.management.attachments.filters.item.tooltip.disabled": { - "value": "To schedule an export with default filters, create a new scheduled export.", - "comment": "Tooltip explaining why default filter option is disabled and how to use it" + "text": "To schedule an export with default filters, create a new scheduled export.", + "crowdinContext": "Tooltip explaining why default filter option is disabled and how to use it" }, "dialogs.schedule.management.attachments.message": { - "value": "Note. Cross-filtering will not be applied in the scheduled export.", - "comment": "Important notice about scheduled exports. The tags emphasize that cross-filtering won't apply to exported data." + "text": "Note. Cross-filtering will not be applied in the scheduled export.", + "crowdinContext": "Important notice about scheduled exports. The tags emphasize that cross-filtering won't apply to exported data." }, "scheduledEmail.attachmentFormat.widget.png": { - "value": "Snapshot (.png)", - "comment": "Attachment format for widget snapshot in scheduled export" + "text": "Snapshot (.png)", + "crowdinContext": "Attachment format for widget snapshot in scheduled export" }, "scheduledEmail.attachmentFormat.widget.pptx": { - "value": "Single Slide (.pptx)", - "comment": "Attachment format for single slide in scheduled export" + "text": "Single Slide (.pptx)", + "crowdinContext": "Attachment format for single slide in scheduled export" }, "scheduledEmail.attachmentFormat.widget.pdf": { - "value": "Single Slide (.pdf)", - "comment": "Attachment format for single slide in scheduled export" + "text": "Single Slide (.pdf)", + "crowdinContext": "Attachment format for single slide in scheduled export" }, "scheduledEmail.attachmentFormat.widget.pdfTabular": { - "value": "Formatted data (.pdf)", - "comment": "Attachment format for formatted tabular data in PDF format in scheduled export" + "text": "Formatted data (.pdf)", + "crowdinContext": "Attachment format for formatted tabular data in PDF format in scheduled export" }, "scheduledEmail.attachmentFormat.widget.formattedXLSX": { - "value": "Formatted data (.xlsx)", - "comment": "Attachment format for formatted data in scheduled export" + "text": "Formatted data (.xlsx)", + "crowdinContext": "Attachment format for formatted data in scheduled export" }, "scheduledEmail.attachmentFormat.widget.formattedCSV": { - "value": "Formatted data (.csv)", - "comment": "Attachment format for formatted data in scheduled export" + "text": "Formatted data (.csv)", + "crowdinContext": "Attachment format for formatted data in scheduled export" }, "scheduledEmail.attachmentFormat.widget.rawCSV": { - "value": "Raw data (.csv)", - "comment": "Attachment format for raw data in scheduled export" + "text": "Raw data (.csv)", + "crowdinContext": "Attachment format for raw data in scheduled export" }, "scheduledEmail.attachmentFormat.dashboard.pptx": { - "value": "Slide Deck (.pptx)", - "comment": "Attachment format for slide deck in scheduled export" + "text": "Slide Deck (.pptx)", + "crowdinContext": "Attachment format for slide deck in scheduled export" }, "scheduledEmail.attachmentFormat.dashboard.pdf": { - "value": "Snapshot (.pdf)", - "comment": "Attachment format for snapshot in scheduled export" + "text": "Snapshot (.pdf)", + "crowdinContext": "Attachment format for snapshot in scheduled export" }, "scheduledEmail.attachmentFormat.dashboard.formattedXLSX": { - "value": "Data (.xlsx)", - "comment": "Attachment format for data in scheduled export" + "text": "Data (.xlsx)", + "crowdinContext": "Attachment format for data in scheduled export" }, "scheduledEmail.attachmentFormat.dashboard.pdfSlides": { - "value": "Slide Deck (.pdf)", - "comment": "Attachment format for slide deck in scheduled export" + "text": "Slide Deck (.pdf)", + "crowdinContext": "Attachment format for slide deck in scheduled export" }, "scheduledEmail.attachments.warning.noAttachmentsSelected": { - "value": "Warning: Scheduled exports require at least one attachment — select an option to continue.", - "comment": "Do not translate HTML tags." + "text": "Warning: Scheduled exports require at least one attachment — select an option to continue.", + "crowdinContext": "Do not translate HTML tags." }, "scheduledEmail.attachments.error.noAttachmentsSelected": { - "value": "Error: No attachments selected — select at least one attachment to schedule an export.", - "comment": "Error message shown when no attachments are selected in scheduled export dialog" + "text": "Error: No attachments selected — select at least one attachment to schedule an export.", + "crowdinContext": "Error message shown when no attachments are selected in scheduled export dialog" }, "dialogs.schedule.management.load.error": { - "value": "Failed to load. Try again later.", - "comment": "Error message shown when schedule management data fails to load" + "text": "Failed to load. Try again later.", + "crowdinContext": "Error message shown when schedule management data fails to load" }, "dialogs.schedule.management.delete.error": { - "value": "Failed to delete schedule. Try again later.", - "comment": "Error message shown when schedule deletion fails" + "text": "Failed to delete schedule. Try again later.", + "crowdinContext": "Error message shown when schedule deletion fails" }, "dialogs.alerting.management.title": { - "value": "Alerts", - "comment": "Title of the alerts management dialog" + "text": "Alerts", + "crowdinContext": "Title of the alerts management dialog" }, "dialogs.alerting.management.load.error": { - "value": "Failed to load. Try again later.", - "comment": "Error message shown when alerts fail to load" + "text": "Failed to load. Try again later.", + "crowdinContext": "Error message shown when alerts fail to load" }, "dialogs.alerting.create.error": { - "value": "Failed to create alert. Try again later.", - "comment": "Error message shown when alert creation fails" + "text": "Failed to create alert. Try again later.", + "crowdinContext": "Error message shown when alert creation fails" }, "dialogs.alerting.create.success": { - "value": "Alert created successfully.", - "comment": "Success message after alert is created" + "text": "Alert created successfully.", + "crowdinContext": "Success message after alert is created" }, "dialogs.alerting.update.error": { - "value": "Failed to update alert. Try again later.", - "comment": "Error message shown when alert update fails" + "text": "Failed to update alert. Try again later.", + "crowdinContext": "Error message shown when alert update fails" }, "dialogs.alerting.update.success": { - "value": "Alert updated successfully.", - "comment": "Success message after alert is updated" + "text": "Alert updated successfully.", + "crowdinContext": "Success message after alert is updated" }, "dialogs.alerting.management.delete.error": { - "value": "Failed to delete alert. Try again later.", - "comment": "Error message shown when alert deletion fails" + "text": "Failed to delete alert. Try again later.", + "crowdinContext": "Error message shown when alert deletion fails" }, "dialogs.alerting.management.pause.error": { - "value": "Failed to pause alert. Try again later.", - "comment": "Error message shown when pausing an alert fails" + "text": "Failed to pause alert. Try again later.", + "crowdinContext": "Error message shown when pausing an alert fails" }, "dialogs.alerting.management.pause.success": { - "value": "Your alert has been paused.", - "comment": "Success message after alert is paused" + "text": "Your alert has been paused.", + "crowdinContext": "Success message after alert is paused" }, "dialogs.alerting.management.activate.error": { - "value": "Failed to un-pause alert. Try again later.", - "comment": "Error message shown when reactivating a paused alert fails" + "text": "Failed to un-pause alert. Try again later.", + "crowdinContext": "Error message shown when reactivating a paused alert fails" }, "dialogs.alerting.management.activate.success": { - "value": "Your alert has been un-paused.", - "comment": "Success message after alert is reactivated" + "text": "Your alert has been un-paused.", + "crowdinContext": "Success message after alert is reactivated" }, "dialogs.alerting.management.create": { - "value": "Create", - "comment": "Button label to create a new alert" + "text": "Create", + "crowdinContext": "Button label to create a new alert" }, "dialogs.alerting.management.create.new": { - "value": "Create new", - "comment": "Button label to create a new alert" + "text": "Create new", + "crowdinContext": "Button label to create a new alert" }, "dialogs.alerting.footer.title": { - "value": "How to create alert?", - "comment": "Title of a link to documentation" + "text": "How to create alert?", + "crowdinContext": "Title of a link to documentation" }, "dialogs.alerting.footer.title.short": { - "value": "Help", - "comment": "Title of a link to documentation" + "text": "Help", + "crowdinContext": "Title of a link to documentation" }, "dialogs.alerting.management.list.title": { - "value": "Your alerts", - "comment": "Title for the list of user's alerts" + "text": "Your alerts", + "crowdinContext": "Title for the list of user's alerts" }, "dialogs.alerting.management.noAlerts": { - "value": "There are no alerts.", - "comment": "Message shown when the user has no alerts" + "text": "There are no alerts.", + "crowdinContext": "Message shown when the user has no alerts" }, "dialogs.alerting.title.placeholder": { - "value": "Untitled alert", - "comment": "Placeholder for alert title input" + "text": "Untitled alert", + "crowdinContext": "Placeholder for alert title input" }, "dialogs.alerting.management.delete.dialog": { - "value": "Delete alert?", - "comment": "Title of the confirmation dialog when deleting an alert" + "text": "Delete alert?", + "crowdinContext": "Title of the confirmation dialog when deleting an alert" }, "dialogs.alerting.management.delete.dialog.confirm": { - "value": "The alert will be permanently deleted, along with all its notifications.", - "comment": "Confirmation message shown when deleting an alert" + "text": "The alert will be permanently deleted, along with all its notifications.", + "crowdinContext": "Confirmation message shown when deleting an alert" }, "dialogs.alerting.delete.success": { - "value": "Success! Your alert was deleted.", - "comment": "Success message after alert is deleted" + "text": "Success! Your alert was deleted.", + "crowdinContext": "Success message after alert is deleted" }, "dialogs.alerting.create.noMeasure.tooltip": { - "value": "Creating an alert requires a metric. Use a widget with at least one metric.", - "comment": "Tooltip shown on the create alert button when the visualization does not contain any metrics/measures" + "text": "Creating an alert requires a metric. Use a widget with at least one metric.", + "crowdinContext": "Tooltip shown on the create alert button when the visualization does not contain any metrics/measures" }, "alerting.alert.menu.delete": { - "value": "Delete", - "comment": "Menu option to delete an alert" + "text": "Delete", + "crowdinContext": "Menu option to delete an alert" }, "alerting.alert.menu.pause": { - "value": "Pause", - "comment": "Menu option to pause an active alert" + "text": "Pause", + "crowdinContext": "Menu option to pause an active alert" }, "alerting.alert.menu.resume": { - "value": "Unpause", - "comment": "Menu option to resume a paused alert" + "text": "Unpause", + "crowdinContext": "Menu option to resume a paused alert" }, "alerting.alert.menu.edit": { - "value": "Edit", - "comment": "Menu option to edit an existing alert" + "text": "Edit", + "crowdinContext": "Menu option to edit an existing alert" }, "delete": { - "value": "Delete", - "comment": "Action button label to remove or delete an item" + "text": "Delete", + "crowdinContext": "Action button label to remove or delete an item" }, "close": { - "value": "Close", - "comment": "Label of a button for closing a dialog window" + "text": "Close", + "crowdinContext": "Label of a button for closing a dialog window" }, "cancel": { - "value": "Cancel", - "comment": "Label for a button that cancels an action and closes a dialog without saving changes" + "text": "Cancel", + "crowdinContext": "Label for a button that cancels an action and closes a dialog without saving changes" }, "save": { - "value": "Save", - "comment": "Label for a button that saves changes and completes an action" + "text": "Save", + "crowdinContext": "Label for a button that saves changes and completes an action" }, "create": { - "value": "Create", - "comment": "Label for a button that creates a new item or completes a creation flow" + "text": "Create", + "crowdinContext": "Label for a button that creates a new item or completes a creation flow" }, "apply": { - "value": "Apply", - "comment": "Label for a button that applies changes without closing a dialog or panel" + "text": "Apply", + "crowdinContext": "Label for a button that applies changes without closing a dialog or panel" }, "gs.date.today": { - "value": "Today", - "comment": "Label for the current day in date filters and selectors" + "text": "Today", + "crowdinContext": "Label for the current day in date filters and selectors" }, "gs.date.tomorrow": { - "value": "Tomorrow", - "comment": "Label for the day after today in date filters and selectors" + "text": "Tomorrow", + "crowdinContext": "Label for the day after today in date filters and selectors" }, "gs.date.yesterday": { - "value": "Yesterday", - "comment": "Label for the day before today in date filters and selectors" + "text": "Yesterday", + "crowdinContext": "Label for the day before today in date filters and selectors" }, "messages.exportResultError": { - "value": "Failed to export the data. Try again later.", - "comment": "Error dialog. Exporting visualization to the file fails." + "text": "Failed to export the data. Try again later.", + "crowdinContext": "Error dialog. Exporting visualization to the file fails." }, "messages.exportResultError.tooManyRows": { - "value": "Export failed. Too many rows ({actual}). Limit is {limit}.", - "comment": "Error message when data export fails due to too many rows" + "text": "Export failed. Too many rows ({actual}). Limit is {limit}.", + "crowdinContext": "Error message when data export fails due to too many rows" }, "messages.exportResultRestrictedError": { - "value": "You cannot export this visualization because it contains restricted data.", - "comment": "Error dialog. Exporting visualization to the file fails because contains restricted data." + "text": "You cannot export this visualization because it contains restricted data.", + "crowdinContext": "Error dialog. Exporting visualization to the file fails because contains restricted data." }, "messages.exportResultStart": { - "value": "Export in progress", - "comment": "Dialog. Export of the visualization to the file is in progress." + "text": "Export in progress", + "crowdinContext": "Dialog. Export of the visualization to the file is in progress." }, "messages.exportResultSuccess": { - "value": "Export successful.", - "comment": "Dialog. Export of the visualization to the file is done." + "text": "Export successful.", + "crowdinContext": "Dialog. Export of the visualization to the file is done." }, "messages.sharingChangedSuccess": { - "value": "Sharing updated.", - "comment": "Global messages. Change of dashboard sharing is done." + "text": "Sharing updated.", + "crowdinContext": "Global messages. Change of dashboard sharing is done." }, "messages.sharingChangedError.general": { - "value": "Failed to update the sharing settings. Try again later.", - "comment": "Global messages. Change of dashboard sharing fails." + "text": "Failed to update the sharing settings. Try again later.", + "crowdinContext": "Global messages. Change of dashboard sharing fails." }, "messages.shareLinkCopied": { - "value": "Link copied.", - "comment": "Global messages. Share link url copied to clipboard." + "text": "Link copied.", + "crowdinContext": "Global messages. Share link url copied to clipboard." }, "messages.sharingDialogError.general": { - "value": "Failed to load the sharing settings. Try again later.", - "comment": "Global messages. Load of dashboard sharing dialog fails." + "text": "Failed to load the sharing settings. Try again later.", + "crowdinContext": "Global messages. Load of dashboard sharing dialog fails." }, "messages.settingsDialogError.general": { - "value": "Failed to load the dashboard settings. Try again later.", - "comment": "Global messages. Load of dashboard settings dialog fails." + "text": "Failed to load the dashboard settings. Try again later.", + "crowdinContext": "Global messages. Load of dashboard settings dialog fails." }, "visualization.dataTooLarge.headline": { - "value": "Too many data points to display", - "comment": "Error message headline when visualization has too much data to render" + "text": "Too many data points to display", + "crowdinContext": "Error message headline when visualization has too much data to render" }, "visualization.dataTooLarge.text": { - "value": "Try applying one or more filters to your dashboard.", - "comment": "Suggested action when visualization has too much data to render" + "text": "Try applying one or more filters to your dashboard.", + "crowdinContext": "Suggested action when visualization has too much data to render" }, "visualization.execute_protected_report.headline": { - "value": "You are not authorized to see this report", - "comment": "Error message headline when user lacks permission to view a report" + "text": "You are not authorized to see this report", + "crowdinContext": "Error message headline when user lacks permission to view a report" }, "visualization.execute_protected_report.text": { - "value": "Contact your administrator.", - "comment": "Suggested action when user lacks permission to view a report" + "text": "Contact your administrator.", + "crowdinContext": "Suggested action when user lacks permission to view a report" }, "visualization.empty.headline": { - "value": "No data for your filter selection", - "comment": "Message shown when a visualization has no data to display due to the current filter settings" + "text": "No data for your filter selection", + "crowdinContext": "Message shown when a visualization has no data to display due to the current filter settings" }, "visualization.error.headline": { - "value": "Sorry, we can't display this visualization", - "comment": "Error message header when a visualization fails to load or render" + "text": "Sorry, we can't display this visualization", + "crowdinContext": "Error message header when a visualization fails to load or render" }, "visualization.error.text": { - "value": "Contact your administrator.", - "comment": "Instructional text shown below an error message, guiding users to contact support" + "text": "Contact your administrator.", + "crowdinContext": "Instructional text shown below an error message, guiding users to contact support" }, "visualization.ErrorMessageResultCacheMissing": { - "value": "Visualization needs refresh", - "comment": "Error message shown when a visualization cannot reuse its cached execution result because it was cleared from the backend result cache." + "text": "Visualization needs refresh", + "crowdinContext": "Error message shown when a visualization cannot reuse its cached execution result because it was cleared from the backend result cache." }, "visualization.ErrorDescriptionResultCacheMissing": { - "value": "The underlying data changed or expired. Refresh the page.", - "comment": "Follow-up text shown under the 'result is no longer available' error message, instructing the user to rerun the execution to obtain fresh data." + "text": "The underlying data changed or expired. Refresh the page.", + "crowdinContext": "Follow-up text shown under the 'result is no longer available' error message, instructing the user to rerun the execution to obtain fresh data." }, "visualization.warning.export.too_small": { - "value": "Not enough space for visualization", - "comment": "Warning shown when there is insufficient space to properly display a visualization during export" + "text": "Not enough space for visualization", + "crowdinContext": "Warning shown when there is insufficient space to properly display a visualization during export" }, "options.menu.unsupported.error": { - "value": "The visualization cannot be exported at the moment. Try applying different filters, or using different metrics or attributes.", - "comment": "Error popup. Visualization cannot be exported to the file because of wrong setting of filters, metrics or attributes." + "text": "The visualization cannot be exported at the moment. Try applying different filters, or using different metrics or attributes.", + "crowdinContext": "Error popup. Visualization cannot be exported to the file because of wrong setting of filters, metrics or attributes." }, "options.menu.unsupported.loading": { - "value": "The visualization cannot be exported at the moment.", - "comment": "Error popup. Visualization cannot be exported to the file." + "text": "The visualization cannot be exported at the moment.", + "crowdinContext": "Error popup. Visualization cannot be exported to the file." }, "options.menu.unsupported.incompatibleWidget": { - "value": "Unable to schedule the export on custom widget.", - "comment": "Error message shown when attempting to schedule an export for an unsupported custom widget type" + "text": "Unable to schedule the export on custom widget.", + "crowdinContext": "Error message shown when attempting to schedule an export for an unsupported custom widget type" }, "options.menu.unsupported.schedulingForInsightNotEnabled": { - "value": "You cannot schedule an export for this widget.", - "comment": "Error message shown when scheduling exports is not enabled for the current insight or visualization. Tooltip for the widget that does not support scheduling, because it's disabled on the insight." + "text": "You cannot schedule an export for this widget.", + "crowdinContext": "Error message shown when scheduling exports is not enabled for the current insight or visualization. Tooltip for the widget that does not support scheduling, because it's disabled on the insight." }, "options.menu.unsupported.alertingForInsightNotEnabled": { - "value": "You cannot create an alert for this widget.", - "comment": "Tooltip for the widget that does not support alerting, because it's disabled on the insight." + "text": "You cannot create an alert for this widget.", + "crowdinContext": "Tooltip for the widget that does not support alerting, because it's disabled on the insight." }, "options.menu.unsupported.oldWidget": { - "value": "Unable to schedule the export. Please resave the dashboard or contact your administrator.", - "comment": "Error message shown when attempting to schedule an export for a widget that needs to be resaved due to compatibility issues" + "text": "Unable to schedule the export. Please resave the dashboard or contact your administrator.", + "crowdinContext": "Error message shown when attempting to schedule an export for a widget that needs to be resaved due to compatibility issues" }, "options.menu.unsupported.oldWidgetExport": { - "value": "Unable to export. Please resave the dashboard or contact your administrator.", - "comment": "Error message shown when unable to export to XLSX due to widget compatibility issues, suggesting to resave the dashboard" + "text": "Unable to export. Please resave the dashboard or contact your administrator.", + "crowdinContext": "Error message shown when unable to export to XLSX due to widget compatibility issues, suggesting to resave the dashboard" }, "options.menu.unsupported.alertingOldWidget": { - "value": "Unable to create an alert. Please resave the dashboard or contact your administrator.", - "comment": "Error message shown when unable to create an alert due to widget compatibility issues, suggesting to resave the dashboard" + "text": "Unable to create an alert. Please resave the dashboard or contact your administrator.", + "crowdinContext": "Error message shown when unable to create an alert due to widget compatibility issues, suggesting to resave the dashboard" }, "export.defaultTitle": { - "value": "Untitled visualization", - "comment": "Default title for exported file" + "text": "Untitled visualization", + "crowdinContext": "Default title for exported file" }, "export_unsupported.disabled": { - "value": "Export is not supported", - "comment": "Export to the file not supported." + "text": "Export is not supported", + "crowdinContext": "Export to the file not supported." }, "widget.options.description": { - "value": "Description", - "comment": "Label for the widget description field in widget options" + "text": "Description", + "crowdinContext": "Label for the widget description field in widget options" }, "widget.options.menu.exportToCSV": { - "value": "Export to CSV", - "comment": "Export to file with CSV extension." + "text": "Export to CSV", + "crowdinContext": "Export to file with CSV extension." }, "widget.options.menu.exportToXLSX": { - "value": "Export to XLSX", - "comment": "Export to file with XLSX extension." + "text": "Export to XLSX", + "crowdinContext": "Export to file with XLSX extension." }, "widget.options.menu.alert": { - "value": "Alert", - "comment": "Item for management of alerts in the widget options menu" + "text": "Alert", + "crowdinContext": "Item for management of alerts in the widget options menu" }, "widget.options.menu.alerts": { - "value": "Alerts", - "comment": "Item in the widget options menu" + "text": "Alerts", + "crowdinContext": "Item in the widget options menu" }, "widget.options.menu.scheduleExport": { - "value": "Schedule export", - "comment": "Menu item for scheduling regular exports of widget data" + "text": "Schedule export", + "crowdinContext": "Menu item for scheduling regular exports of widget data" }, "widget.options.menu.scheduleExport.edit": { - "value": "Show schedules", - "comment": "Menu item to view and manage existing export schedules for the widget" + "text": "Show schedules", + "crowdinContext": "Menu item to view and manage existing export schedules for the widget" }, "widget.options.menu.XLSX": { - "value": "Formatted (.xlsx)", - "comment": "Export to file with XLSX extension." + "text": "Formatted (.xlsx)", + "crowdinContext": "Export to file with XLSX extension." }, "widget.options.menu.exportToCSV.formatted": { - "value": "Formatted (.csv)", - "comment": "Export to file with CSV extension." + "text": "Formatted (.csv)", + "crowdinContext": "Export to file with CSV extension." }, "widget.options.menu.exportToCSV.raw": { - "value": "Raw (.csv)", - "comment": "Export to file with CSV extension." + "text": "Raw (.csv)", + "crowdinContext": "Export to file with CSV extension." }, "widget.options.menu.exportToPDF.formatted": { - "value": "Formatted (.pdf)", - "comment": "Export to file with PDF extension." + "text": "Formatted (.pdf)", + "crowdinContext": "Export to file with PDF extension." }, "widget.error.missing_insight.message": { - "value": "No visualization available", - "comment": "Error message shown when a widget's visualization cannot be loaded or is missing" + "text": "No visualization available", + "crowdinContext": "Error message shown when a widget's visualization cannot be loaded or is missing" }, "widget.error.missing_insight.description": { - "value": "This visualization has been removed or is no longer accessible. Please contact your administrator or remove it from the dashboard.", - "comment": "Detailed error message explaining that a visualization is missing and suggesting actions to resolve the issue" + "text": "This visualization has been removed or is no longer accessible. Please contact your administrator or remove it from the dashboard.", + "crowdinContext": "Detailed error message explaining that a visualization is missing and suggesting actions to resolve the issue" }, "widget.drill.dialog.exportToXLSX": { - "value": "Formatted (.xlsx)", - "comment": "Button label for exporting widget data to XLSX format from the drill dialog" + "text": "Formatted (.xlsx)", + "crowdinContext": "Button label for exporting widget data to XLSX format from the drill dialog" }, "widget.drill.dialog.exportToPDF": { - "value": "Formatted (.pdf)", - "comment": "Button label for exporting widget data to PDF format from the drill dialog" + "text": "Formatted (.pdf)", + "crowdinContext": "Button label for exporting widget data to PDF format from the drill dialog" }, "widget.drill.dialog.exportToCSV.formatted": { - "value": "Formatted (.csv)", - "comment": "Button label for exporting formatted widget data to CSV format from the drill dialog" + "text": "Formatted (.csv)", + "crowdinContext": "Button label for exporting formatted widget data to CSV format from the drill dialog" }, "widget.drill.dialog.exportToCSV.raw": { - "value": "Raw (.csv)", - "comment": "Button label for exporting raw widget data to CSV format from the drill dialog, without any formatting applied" + "text": "Raw (.csv)", + "crowdinContext": "Button label for exporting raw widget data to CSV format from the drill dialog, without any formatting applied" }, "share.button.text": { - "value": "Share", - "comment": "Text of button that opens share dialog" + "text": "Share", + "crowdinContext": "Text of button that opens share dialog" }, "share.button.tooltip": { - "value": "Share dashboard", - "comment": "Tooltip of button that opens share dialog" + "text": "Share dashboard", + "crowdinContext": "Tooltip of button that opens share dialog" }, "dashboard.error.empty.heading": { - "value": "This dashboard is empty", - "comment": "Heading shown when a dashboard contains no widgets or visualizations" + "text": "This dashboard is empty", + "crowdinContext": "Heading shown when a dashboard contains no widgets or visualizations" }, "dashboard.error.empty.text": { - "value": "All visualizations were removed.", - "comment": "Message shown when all visualizations have been removed from the dashboard" + "text": "All visualizations were removed.", + "crowdinContext": "Message shown when all visualizations have been removed from the dashboard" }, "dashboard.shareDialog.underLenientControl.label": { - "value": "Other users can access this dashboard if they drill to it", - "comment": "Label for the checkbox that controls whether users can access this dashboard by drilling into it from another dashboard, even if they're not explicitly granted access" + "text": "Other users can access this dashboard if they drill to it", + "crowdinContext": "Label for the checkbox that controls whether users can access this dashboard by drilling into it from another dashboard, even if they're not explicitly granted access" }, "dashboard.shareDialog.lock.label": { - "value": "Only admins can edit this dashboard", - "comment": "Label for the checkbox that restricts dashboard editing to administrators only" + "text": "Only admins can edit this dashboard", + "crowdinContext": "Label for the checkbox that restricts dashboard editing to administrators only" }, "header.lockStatus.tooltip": { - "value": "This dashboard is locked. Only administrators can edit this dashboard.", - "comment": "Tooltip shown when hovering over the dashboard lock icon, with emphasis on the locked status" + "text": "This dashboard is locked. Only administrators can edit this dashboard.", + "crowdinContext": "Tooltip shown when hovering over the dashboard lock icon, with emphasis on the locked status" }, "header.shareStatus.private.text": { - "value": "Private", - "comment": "Text shown in the share status indicator when the dashboard is set to private visibility" + "text": "Private", + "crowdinContext": "Text shown in the share status indicator when the dashboard is set to private visibility" }, "header.shareStatus.private.strict.tooltip": { - "value": "Only you can view and edit this dashboard.", - "comment": "Tooltip shown when hovering over the private share status indicator with strict access enabled, indicating restricted access" + "text": "Only you can view and edit this dashboard.", + "crowdinContext": "Tooltip shown when hovering over the private share status indicator with strict access enabled, indicating restricted access" }, "header.shareStatus.private.not.strict.tooltip": { - "value": "The creator can edit this dashboard. Other users with appropriate user roles can edit this dashboard when they drill to it.", - "comment": "Tooltip explaining that while the dashboard is private, users with proper roles can edit it when accessing through drill navigation" + "text": "The creator can edit this dashboard. Other users with appropriate user roles can edit this dashboard when they drill to it.", + "crowdinContext": "Tooltip explaining that while the dashboard is private, users with proper roles can edit it when accessing through drill navigation" }, "dashboard.shareDialog.removeAccessGranteeTooltip": { - "value": "Remove access to this dashboard.", - "comment": "Tooltip for the button that revokes a user's or group's access to the dashboard" + "text": "Remove access to this dashboard.", + "crowdinContext": "Tooltip for the button that revokes a user's or group's access to the dashboard" }, "dashboard.shareDialog.removeAccessCreatorTooltip": { - "value": "The user that created this dashboard. Creators cannot be removed.", - "comment": "Text of the tooltip shown above disabled button that removes user dashboard access right. Shown in the case when user cannot be removed because he is the creator of the dashboard." + "text": "The user that created this dashboard. Creators cannot be removed.", + "crowdinContext": "Text of the tooltip shown above disabled button that removes user dashboard access right. Shown in the case when user cannot be removed because he is the creator of the dashboard." }, "attributesDropdown.placeholder": { - "value": "Search…", - "comment": "Placeholder text in attribute filter search input" + "text": "Search…", + "crowdinContext": "Placeholder text in attribute filter search input" }, "attributesDropdown.configuration": { - "value": "Configuration", - "comment": "Configuration button label in attribute filter dropdown" + "text": "Configuration", + "crowdinContext": "Configuration button label in attribute filter dropdown" }, "attributesDropdown.save": { - "value": "Save", - "comment": "Save button label in attribute filter dropdown configuration" + "text": "Save", + "crowdinContext": "Save button label in attribute filter dropdown configuration" }, "attributesDropdown.filterBy": { - "value": "Filter by", - "comment": "Filter section label in attribute filter dropdown configuration" + "text": "Filter by", + "crowdinContext": "Filter section label in attribute filter dropdown configuration" }, "attributesDropdown.displayValuesAs": { - "value": "Display values as", - "comment": "Label for display format selection in attribute filter configuration" + "text": "Display values as", + "crowdinContext": "Label for display format selection in attribute filter configuration" }, "attributesDropdown.title": { - "value": "Title", - "comment": "Label for the title field in attribute dropdown components" + "text": "Title", + "crowdinContext": "Label for the title field in attribute dropdown components" }, "attributesDropdown.title.reset": { - "value": "Reset", - "comment": "Button label to reset the attribute title to its default value" + "text": "Reset", + "crowdinContext": "Button label to reset the attribute title to its default value" }, "attributesDropdown.selectionMode": { - "value": "Selection", - "comment": "Label for the selection mode dropdown in attribute filter configuration" + "text": "Selection", + "crowdinContext": "Label for the selection mode dropdown in attribute filter configuration" }, "attributesDropdown.selectionMode.multi": { - "value": "Multiple values", - "comment": "Option to allow selecting multiple values in the attribute filter" + "text": "Multiple values", + "crowdinContext": "Option to allow selecting multiple values in the attribute filter" }, "attributesDropdown.selectionMode.single": { - "value": "Single value", - "comment": "Option to allow selecting only one value in the attribute filter" + "text": "Single value", + "crowdinContext": "Option to allow selecting only one value in the attribute filter" }, "attributesDropdown.selectionMode.disabled.tooltip": { - "value": "Single value selection is not allowed if any filters are selected in Filter by.To use the Single value selection, disable all filters in Filter by.", - "comment": "Tooltip explaining why single value selection is disabled when filters are applied" + "text": "Single value selection is not allowed if any filters are selected in Filter by.To use the Single value selection, disable all filters in Filter by.", + "crowdinContext": "Tooltip explaining why single value selection is disabled when filters are applied" }, "attributesDropdown.parentFilter.disabled.tooltip": { - "value": "Filtering by other filters is disabled for Single value selection. To set Filter by, select the multiple value selection.", - "comment": "Tooltip describing why choosing parent filters is disabled." + "text": "Filtering by other filters is disabled for Single value selection. To set Filter by, select the multiple value selection.", + "crowdinContext": "Tooltip describing why choosing parent filters is disabled." }, "attributesDropdown.noConnectionMessage": { - "value": "{childTitle} cannot be filtered by {parentTitle}. There is no connection between the filter attributes in the data model.", - "comment": "Error message when attributes cannot be filtered together. The tags emphasize attribute names, and {childTitle}/{parentTitle} show the specific attribute names." + "text": "{childTitle} cannot be filtered by {parentTitle}. There is no connection between the filter attributes in the data model.", + "crowdinContext": "Error message when attributes cannot be filtered together. The tags emphasize attribute names, and {childTitle}/{parentTitle} show the specific attribute names." }, "attributesDropdown.details.dataset": { - "value": "Dataset", - "comment": "Label for the dataset information section in attribute filter details" + "text": "Dataset", + "crowdinContext": "Label for the dataset information section in attribute filter details" }, "attributesDropdown.details.values": { - "value": "Values", - "comment": "Label for the values section in attribute filter details" + "text": "Values", + "crowdinContext": "Label for the values section in attribute filter details" }, "attributesDropdown.details.shortening_decoration": { - "value": "…and {count} more", - "comment": "Text shown when a list of attribute values is truncated. Placeholder {count} shows the number of additional attribute filter values. Example: '…and 5 more'." + "text": "…and {count} more", + "crowdinContext": "Text shown when a list of attribute values is truncated. Placeholder {count} shows the number of additional attribute filter values. Example: '…and 5 more'." }, "attributesDropdown.removeTooltip": { - "value": "Remove from dashboard", - "comment": "Tooltip text of button for deleting filter" + "text": "Remove from dashboard", + "crowdinContext": "Tooltip text of button for deleting filter" }, "layout.header.characters.left": { - "value": "{currentCharactersCount} / {maximumCharactersCount} characters left", - "comment": "Label showing the number of characters remaining in the input field (e.g., '4 / 20 characters left')" + "text": "{currentCharactersCount} / {maximumCharactersCount} characters left", + "crowdinContext": "Label showing the number of characters remaining in the input field (e.g., '4 / 20 characters left')" }, "layout.header.add.title.placeholder": { - "value": "Add Title here...", - "comment": "Add title component placeholder text" + "text": "Add Title here...", + "crowdinContext": "Add title component placeholder text" }, "layout.header.add.description.placeholder": { - "value": "Add Description here...", - "comment": "Add description component placeholder text" + "text": "Add Description here...", + "crowdinContext": "Add description component placeholder text" }, "controlButtons.options.tooltip": { - "value": "More actions", - "comment": "Tooltip shown when hovering over the options menu button" + "text": "More actions", + "crowdinContext": "Tooltip shown when hovering over the options menu button" }, "controlButtons.options.back": { - "value": "Back to previous step", - "comment": "Button text for returning to the previous screen or action" + "text": "Back to previous step", + "crowdinContext": "Button text for returning to the previous screen or action" }, "controlButtons.options.closeMenu": { - "value": "Close menu", - "comment": "Button text for closing the options menu" + "text": "Close menu", + "crowdinContext": "Button text for closing the options menu" }, "controlButtons.edit.value": { - "value": "Edit", - "comment": "Button text for entering dashboard edit mode" + "text": "Edit", + "crowdinContext": "Button text for entering dashboard edit mode" }, "controlButtons.edit.tooltip": { - "value": "Edit dashboard", - "comment": "Tooltip shown when hovering over the edit dashboard button" + "text": "Edit dashboard", + "crowdinContext": "Tooltip shown when hovering over the edit dashboard button" }, "controlButtons.edit.executionTimestampMode.tooltip": { - "value": "To edit the dashboard, reset the date to today.", - "comment": "Tooltip explaining that historical dashboard view must be reset before editing" + "text": "To edit the dashboard, reset the date to today.", + "crowdinContext": "Tooltip explaining that historical dashboard view must be reset before editing" }, "controlButtons.setting.value": { - "value": "Settings", - "comment": "Button text for accessing dashboard settings" + "text": "Settings", + "crowdinContext": "Button text for accessing dashboard settings" }, "controlButtons.setting.title": { - "value": "All settings related to this dashboard. You can change the dashboard description cross-filtering, saved filters allowed, and alerts evaluation frequency.", - "comment": "Extended tooltip describing available dashboard settings options" + "text": "All settings related to this dashboard. You can change the dashboard description cross-filtering, saved filters allowed, and alerts evaluation frequency.", + "crowdinContext": "Extended tooltip describing available dashboard settings options" }, "controlButtons.saveAndPublish.value": { - "value": "Save & Publish", - "comment": "Button text for saving changes and publishing them to all users" + "text": "Save & Publish", + "crowdinContext": "Button text for saving changes and publishing them to all users" }, "controlButtons.save.value": { - "value": "Save", - "comment": "Button text for saving dashboard changes" + "text": "Save", + "crowdinContext": "Button text for saving dashboard changes" }, "controlButtons.saveAndPublish.title": { - "value": "All changes will be immediately visible to everyone who can access this dashboard.", - "comment": "Tooltip explaining the effect of saving and publishing dashboard changes" + "text": "All changes will be immediately visible to everyone who can access this dashboard.", + "crowdinContext": "Tooltip explaining the effect of saving and publishing dashboard changes" }, "controlButtons.saveAsPrivate.title": { - "value": "All changes will be saved.", - "comment": "Tooltip explaining private save action effect" + "text": "All changes will be saved.", + "crowdinContext": "Tooltip explaining private save action effect" }, "controlButtons.saveAndPublish.disable.empty.title": { - "value": "Empty dashboard cannot be saved", - "comment": "Tooltip shown when save button is disabled because dashboard has no content" + "text": "Empty dashboard cannot be saved", + "crowdinContext": "Tooltip shown when save button is disabled because dashboard has no content" }, "controlButtons.saveAndPublish.disable.noChanges.title": { - "value": "There are no changes to save", - "comment": "Tooltip shown when save button is disabled because there are no unsaved changes" + "text": "There are no changes to save", + "crowdinContext": "Tooltip shown when save button is disabled because there are no unsaved changes" }, "controlButtons.saving.value": { - "value": "Saving…", - "comment": "Text shown while dashboard changes are being saved" + "text": "Saving…", + "crowdinContext": "Text shown while dashboard changes are being saved" }, "gs.visualizationsList.tabs.all": { - "value": "all", - "comment": "Tab label for showing all visualizations regardless of creator" + "text": "all", + "crowdinContext": "Tab label for showing all visualizations regardless of creator" }, "gs.visualizationsList.tabs.my": { - "value": "created by me", - "comment": "Tab label for filtering visualizations to show only those created by current user" + "text": "created by me", + "crowdinContext": "Tab label for filtering visualizations to show only those created by current user" }, "visualizationsList.noInsights": { - "value": "This workspace contains no visualizations.", - "comment": "Message shown when no visualizations exist in the workspace" + "text": "This workspace contains no visualizations.", + "crowdinContext": "Message shown when no visualizations exist in the workspace" }, "visualizationsList.create": { - "value": "Create visualization", - "comment": "Button text for creating a new visualization" + "text": "Create visualization", + "crowdinContext": "Button text for creating a new visualization" }, "visualizationsList.noUserInsights": { - "value": "No visualizations created.", - "comment": "Message shown when user has not created any visualizations" + "text": "No visualizations created.", + "crowdinContext": "Message shown when user has not created any visualizations" }, "visualizationsList.noVisualizationsFound": { - "value": "No visualization matched.", - "comment": "Message shown when search returns no visualizations" + "text": "No visualization matched.", + "crowdinContext": "Message shown when search returns no visualizations" }, "search_insights": { - "value": "Search all visualizations…", - "comment": "Placeholder text in visualization search input field" + "text": "Search all visualizations…", + "crowdinContext": "Placeholder text in visualization search input field" }, "save.as.new": { - "value": "Save as new", - "comment": "Button text for saving current item as a new copy" + "text": "Save as new", + "crowdinContext": "Button text for saving current item as a new copy" }, "addPanel.deleteItem": { - "value": "Drop to remove", - "comment": "Instructions shown in deletion target area during drag and drop" + "text": "Drop to remove", + "crowdinContext": "Instructions shown in deletion target area during drag and drop" }, "addPanel.newItem": { - "value": "New item", - "comment": "Generic label for a new dashboard item being added" + "text": "New item", + "crowdinContext": "Generic label for a new dashboard item being added" }, "addPanel.attributeFilter": { - "value": "Attribute Filter", - "comment": "Label for attribute filter component in add panel" + "text": "Attribute Filter", + "crowdinContext": "Label for attribute filter component in add panel" }, "addPanel.filter": { - "value": "Filter", - "comment": "Label for generic filter component in add panel" + "text": "Filter", + "crowdinContext": "Label for generic filter component in add panel" }, "addPanel.attributeFilter.tooltip.no_attributes": { - "value": "The attribute filter requires an attribute.", - "comment": "Error message shown when attempting to create filter without selecting attribute" + "text": "The attribute filter requires an attribute.", + "crowdinContext": "Error message shown when attempting to create filter without selecting attribute" }, "addPanel.attributeFilter.tooltip.no_items": { - "value": "The filter requires an attribute or a date dataset.", - "comment": "Error message shown when filter has no data items selected" + "text": "The filter requires an attribute or a date dataset.", + "crowdinContext": "Error message shown when filter has no data items selected" }, "addPanel.attributeFilter.tooltip.no_attributes.link": { - "value": "Learn more", - "comment": "Link text for documentation about attribute filters" + "text": "Learn more", + "crowdinContext": "Link text for documentation about attribute filters" }, "addPanel.kpi": { - "value": "Key Performance Indicator", - "comment": "Label for KPI component in add panel" + "text": "Key Performance Indicator", + "crowdinContext": "Label for KPI component in add panel" }, "addPanel.richText": { - "value": "Rich Text", - "comment": "Label for rich text editor component in add panel" + "text": "Rich Text", + "crowdinContext": "Label for rich text editor component in add panel" }, "addPanel.visualizationSwitcher": { - "value": "Visualization switcher", - "comment": "Label for visualization switcher component in add panel" + "text": "Visualization switcher", + "crowdinContext": "Label for visualization switcher component in add panel" }, "addPanel.visualizationSwitcher.tooltip": { - "value": "Combine multiple visualizations into a single element with a navigation dropdown for switching between them.", - "comment": "Tooltip describing the purpose of the visualization switcher component" + "text": "Combine multiple visualizations into a single element with a navigation dropdown for switching between them.", + "crowdinContext": "Tooltip describing the purpose of the visualization switcher component" }, "addPanel.dashboardLayout": { - "value": "Column container", - "comment": "Label for container component that can group widgets in add panel" + "text": "Column container", + "crowdinContext": "Label for container component that can group widgets in add panel" }, "addPanel.dashboardLayout.tooltip": { - "value": "Create a vertical group of widgets placed in a single column inside your section. Ideal for stacking multiple items.", - "comment": "Tooltip describing the purpose of the container component" + "text": "Create a vertical group of widgets placed in a single column inside your section. Ideal for stacking multiple items.", + "crowdinContext": "Tooltip describing the purpose of the container component" }, "addPanel.dashboardLayout.tooltip.learnMore": { - "value": "Learn more", - "comment": "Link text for documentation about container component" + "text": "Learn more", + "crowdinContext": "Link text for documentation about container component" }, "visualizationsList.dragToAdd": { - "value": "Drag to add", - "comment": "Instruction to drag visualization to dashboard" + "text": "Drag to add", + "crowdinContext": "Instruction to drag visualization to dashboard" }, "visualizationsList.savedVisualizations": { - "value": "Saved visualizations", - "comment": "Header for the list of saved visualizations" + "text": "Saved visualizations", + "crowdinContext": "Header for the list of saved visualizations" }, "configurationPanel.drillConfig.selectDashboard": { - "value": "Choose dashboard…", - "comment": "Placeholder text in dashboard selector for drill configuration" + "text": "Choose dashboard…", + "crowdinContext": "Placeholder text in dashboard selector for drill configuration" }, "configurationPanel.drillConfig.targetTab": { - "value": "to tab", - "comment": "Label for tab selector in drill to dashboard configuration" + "text": "to tab", + "crowdinContext": "Label for tab selector in drill to dashboard configuration" }, "configurationPanel.drillConfig.drillIntoDashboard.searchPlaceholder": { - "value": "Search all dashboards…", - "comment": "Placeholder text in search field for finding dashboards to drill into" + "text": "Search all dashboards…", + "crowdinContext": "Placeholder text in search field for finding dashboards to drill into" }, "configurationPanel.drillConfig.forbiddenDashboard": { - "value": "(Not shared with you)", - "comment": "Placeholder used instead of the name of a dashboard in a list if dashboard name cannot be shown because dashboard was not shared with the user.." + "text": "(Not shared with you)", + "crowdinContext": "Placeholder used instead of the name of a dashboard in a list if dashboard name cannot be shown because dashboard was not shared with the user.." }, "configurationPanel.drillConfig.forbiddenDashboard.tooltip": { - "value": "Dashboard is not shared with you, but other users have access to this dashboard.", - "comment": "Tooltip explaining the accessibility of the dashboard." + "text": "Dashboard is not shared with you, but other users have access to this dashboard.", + "crowdinContext": "Tooltip explaining the accessibility of the dashboard." }, "configurationPanel.drillConfig.notSharedDashboard.tooltip": { - "value": "Dashboard is not shared with you, but all users can access it if they drill to it.", - "comment": "Tooltip explaining the accessibility of the dashboard." + "text": "Dashboard is not shared with you, but all users can access it if they drill to it.", + "crowdinContext": "Tooltip explaining the accessibility of the dashboard." }, "configurationPanel.remove.form.dashboard": { - "value": "Remove from dashboard", - "comment": "Button text for removing a widget from the dashboard" + "text": "Remove from dashboard", + "crowdinContext": "Button text for removing a widget from the dashboard" }, "filterBar.filter.drop": { - "value": "drop to add", - "comment": "Instruction shown in filter bar drop zone during drag operation" + "text": "drop to add", + "crowdinContext": "Instruction shown in filter bar drop zone during drag operation" }, "filterBar.filter.addFilterPlaceholder": { - "value": "Drag {icon} here", - "comment": "Instruction indicating where to drag filters with icon placeholder" + "text": "Drag {icon} here", + "crowdinContext": "Instruction indicating where to drag filters with icon placeholder" }, "filterBar.filter.dropzone.tooltip": { - "value": "Drag the attribute filter here.", - "comment": "Tooltip for attribute filter drop zone in filter bar" + "text": "Drag the attribute filter here.", + "crowdinContext": "Tooltip for attribute filter drop zone in filter bar" }, "filterBar.filter.dropzone.tooltip.generic": { - "value": "Drag the filter here.", - "comment": "Tooltip for generic filter drop zone in filter bar" + "text": "Drag the filter here.", + "crowdinContext": "Tooltip for generic filter drop zone in filter bar" }, "configurationPanel.title": { - "value": "Configuration", - "comment": "Label of widget configuration section" + "text": "Configuration", + "crowdinContext": "Label of widget configuration section" }, "configurationPanel.filterBy": { - "value": "Filter by", - "comment": "Label for filter selection in widget configuration panel" + "text": "Filter by", + "crowdinContext": "Label for filter selection in widget configuration panel" }, "configurationPanel.dateAs": { - "value": "as", - "comment": "Conjunction word used in date granularity selection" + "text": "as", + "crowdinContext": "Conjunction word used in date granularity selection" }, "configurationPanel.vizCantBeFilteredByAttribute": { - "value": "The visualization cannot be filtered by {attributeName}. Unselect the check box.", - "comment": "Warning message when attempting to apply incompatible attribute filter to visualization" + "text": "The visualization cannot be filtered by {attributeName}. Unselect the check box.", + "crowdinContext": "Warning message when attempting to apply incompatible attribute filter to visualization" }, "configurationPanel.kpiCantBeFilteredByAttribute": { - "value": "The kpi cannot be filtered by {attributeName}. Unselect the check box.", - "comment": "Warning message when attempting to apply incompatible attribute filter to KPI" + "text": "The kpi cannot be filtered by {attributeName}. Unselect the check box.", + "crowdinContext": "Warning message when attempting to apply incompatible attribute filter to KPI" }, "configurationPanel.vizCantBeFilteredByDate": { - "value": "The visualization cannot be filtered by Date. Unselect the check box.", - "comment": "Warning message when attempting to apply date filter to incompatible visualization" + "text": "The visualization cannot be filtered by Date. Unselect the check box.", + "crowdinContext": "Warning message when attempting to apply date filter to incompatible visualization" }, "configurationPanel.kpiCantBeFilteredByDate": { - "value": "The kpi cannot be filtered by Date. Unselect the check box.", - "comment": "Warning message when attempting to apply date filter to incompatible KPI" + "text": "The kpi cannot be filtered by Date. Unselect the check box.", + "crowdinContext": "Warning message when attempting to apply date filter to incompatible KPI" }, "configurationPanel.unrelatedVizDateInfo": { - "value": "\"{dateDataSet}\" can no longer be applied to the visualization. Select a different dimension or edit the visualization.", - "comment": "Error message when selected date dimension is no longer compatible with the visualization" + "text": "\"{dateDataSet}\" can no longer be applied to the visualization. Select a different dimension or edit the visualization.", + "crowdinContext": "Error message when selected date dimension is no longer compatible with the visualization" }, "configurationPanel.unrelatedKpiDateInfo": { - "value": "\"{dateDataSet}\" can no longer be applied to the kpi. Select a different dimension or edit the kpi.", - "comment": "Error message when selected date dimension is no longer compatible with the KPI" + "text": "\"{dateDataSet}\" can no longer be applied to the kpi. Select a different dimension or edit the kpi.", + "crowdinContext": "Error message when selected date dimension is no longer compatible with the KPI" }, "configurationPanel.interactions": { - "value": "Interactions", - "comment": "Header for the section configuring widget interaction options" + "text": "Interactions", + "crowdinContext": "Header for the section configuring widget interaction options" }, "configurationPanel.drillConfig.interactions": { - "value": "Drill interactions", - "comment": "Header of a section for configuring data drilling capabilities" + "text": "Drill interactions", + "crowdinContext": "Header of a section for configuring data drilling capabilities" }, "configurationPanel.drillConfig.addInteraction": { - "value": "Add interaction", - "comment": "Button label for creating a new drill interaction in widget configuration" + "text": "Add interaction", + "crowdinContext": "Button label for creating a new drill interaction in widget configuration" }, "configurationPanel.drillConfig.clickHint": { - "value": "When I click on", - "comment": "First part of the drill interaction configuration sentence. Example in sentence: \"WHEN I CLICK ON on value of measure 'Number of user accounts', drill into detail.\"" + "text": "When I click on", + "crowdinContext": "First part of the drill interaction configuration sentence. Example in sentence: \"WHEN I CLICK ON on value of measure 'Number of user accounts', drill into detail.\"" }, "configurationPanel.drillConfig.measureValue": { - "value": "Value of metric", - "comment": "Label for selecting metric value as drill target in configuration. Example in sentence: \"When I click on VALUE OF METRIC 'Number of user accounts', drill into detail.\"" + "text": "Value of metric", + "crowdinContext": "Label for selecting metric value as drill target in configuration. Example in sentence: \"When I click on VALUE OF METRIC 'Number of user accounts', drill into detail.\"" }, "configurationPanel.drillConfig.attributeValue": { - "value": "Value of attribute", - "comment": "Label for selecting attribute value as drill target in configuration. Example in sentence: \"When I click on VALUE OF ATTRIBUTE 'Account', drill into detail.\"" + "text": "Value of attribute", + "crowdinContext": "Label for selecting attribute value as drill target in configuration. Example in sentence: \"When I click on VALUE OF ATTRIBUTE 'Account', drill into detail.\"" }, "configurationPanel.drillConfig.selectTarget": { - "value": "I want to", - "comment": "Middle part of the drill interaction configuration sentence" + "text": "I want to", + "crowdinContext": "Middle part of the drill interaction configuration sentence" }, "configurationPanel.drillConfig.clickHintItem": { - "value": "When I click on (value of)", - "comment": "First part of drill interaction configuration with addon markup" + "text": "When I click on (value of)", + "crowdinContext": "First part of drill interaction configuration with addon markup" }, "configurationPanel.drillConfig.drillIntoDashboard": { - "value": "Drill into dashboard", - "comment": "Option for drilling into another dashboard in data interaction" + "text": "Drill into dashboard", + "crowdinContext": "Option for drilling into another dashboard in data interaction" }, "configurationPanel.drillConfig.drillIntoInsight": { - "value": "Drill into visualization", - "comment": "Option for drilling into detailed visualization in data interaction" + "text": "Drill into visualization", + "crowdinContext": "Option for drilling into detailed visualization in data interaction" }, "configurationPanel.drillConfig.drillDown": { - "value": "Drill down", - "comment": "Option for navigating to next level of detail in data hierarchy" + "text": "Drill down", + "crowdinContext": "Option for navigating to next level of detail in data hierarchy" }, "configurationPanel.drillConfig.disableDrillDownTooltip": { - "value": "Drill down is turned off in this visualization's configuration.", - "comment": "Tooltip explaining why drill down option is disabled" + "text": "Drill down is turned off in this visualization's configuration.", + "crowdinContext": "Tooltip explaining why drill down option is disabled" }, "configurationPanel.drillConfig.drillIntoUrl": { - "value": "Drill into URL", - "comment": "Option for creating external URL link from data point" + "text": "Drill into URL", + "crowdinContext": "Option for creating external URL link from data point" }, "configurationPanel.drillConfig.drillIntoUrl.invalidCustomUrl": { - "value": "Invalid URL parameters", - "comment": "Error message shown when URL drill target has invalid parameters" + "text": "Invalid URL parameters", + "crowdinContext": "Error message shown when URL drill target has invalid parameters" }, "configurationPanel.drillConfig.select": { - "value": "Choose action…", - "comment": "Placeholder text in drill action dropdown menu" + "text": "Choose action…", + "crowdinContext": "Placeholder text in drill action dropdown menu" }, "configurationPanel.drillConfig.drillIntoDashboard.dateFilterWarning": { - "value": "The date attribute value from the visualization will not be transferred to filter the target dashboard.", - "comment": "Warning about limitations when drilling with date attributes" + "text": "The date attribute value from the visualization will not be transferred to filter the target dashboard.", + "crowdinContext": "Warning about limitations when drilling with date attributes" }, "configurationPanel.drillConfig.drillIntersectionIgnoredAttributes.label": { - "value": "Pass as filter:", - "comment": "Label for selecting which attributes to pass as filters during drill" + "text": "Pass as filter:", + "crowdinContext": "Label for selecting which attributes to pass as filters during drill" }, "configurationPanel.drillConfig.drillIntersectionIgnoredAttributes.dropdown.title": { - "value": "Pass as filters", - "comment": "Title of the attribute filter selection dropdown" + "text": "Pass as filters", + "crowdinContext": "Title of the attribute filter selection dropdown" }, "configurationPanel.drillConfig.drillIntersectionIgnoredAttributes.dropdown.tooltip": { - "value": "Disable the attribute or date to exclude its value from being passed as a filter to the drill destination.", - "comment": "Tooltip explaining how to exclude attributes from drill filters" + "text": "Disable the attribute or date to exclude its value from being passed as a filter to the drill destination.", + "crowdinContext": "Tooltip explaining how to exclude attributes from drill filters" }, "configurationPanel.drillConfig.drillIntersectionIgnoredAttributes.dropdown.all": { - "value": "All", - "comment": "Option to pass all attributes as filters during drill" + "text": "All", + "crowdinContext": "Option to pass all attributes as filters during drill" }, "configurationPanel.drillConfig.drillIntersectionIgnoredAttributes.dropdown.none": { - "value": "None", - "comment": "Option to not pass any attributes as filters during drill" + "text": "None", + "crowdinContext": "Option to not pass any attributes as filters during drill" }, "configurationPanel.visualprops.sectionTitle": { - "value": "Title", - "comment": "Section header for widget title configuration" + "text": "Title", + "crowdinContext": "Section header for widget title configuration" }, "configurationPanel.visualprops.hideTitle": { - "value": "Hide title", - "comment": "Checkbox label to hide widget title" + "text": "Hide title", + "crowdinContext": "Checkbox label to hide widget title" }, "configurationPanel.visualprops.sectionDescription": { - "value": "Description", - "comment": "Section header for widget description configuration" + "text": "Description", + "crowdinContext": "Section header for widget description configuration" }, "configurationPanel.visualprops.inheritDescription": { - "value": "Inherit", - "comment": "Option to use the original description from the source item" + "text": "Inherit", + "crowdinContext": "Option to use the original description from the source item" }, "configurationPanel.visualprops.inheritDescriptionHelp": { - "value": "Inherit the description from the visualization.", - "comment": "Help text explaining the inherit description option for visualizations" + "text": "Inherit the description from the visualization.", + "crowdinContext": "Help text explaining the inherit description option for visualizations" }, "configurationPanel.visualprops.customDescription": { - "value": "Custom", - "comment": "Option to create a custom description rather than using default" + "text": "Custom", + "crowdinContext": "Option to create a custom description rather than using default" }, "configurationPanel.visualprops.customDescriptionHelp": { - "value": "Add a custom description for this instance of the visualization.", - "comment": "Help text explaining the custom description option for visualizations" + "text": "Add a custom description for this instance of the visualization.", + "crowdinContext": "Help text explaining the custom description option for visualizations" }, "configurationPanel.visualprops.noneDescription": { - "value": "None", - "comment": "Option to hide description completely" + "text": "None", + "crowdinContext": "Option to hide description completely" }, "configurationPanel.visualprops.includeMetrics": { - "value": "Include metric descriptions", - "comment": "Checkbox label for option to show metric descriptions" + "text": "Include metric descriptions", + "crowdinContext": "Checkbox label for option to show metric descriptions" }, "configurationPanel.visualprops.includeMetricsHelp": { - "value": "Display section with list of visualization’s metrics and their description.", - "comment": "Help text explaining the option to show metric descriptions in visualization" + "text": "Display section with list of visualization’s metrics and their description.", + "crowdinContext": "Help text explaining the option to show metric descriptions in visualization" }, "configurationPanel.visualprops.descriptionPlaceholder": { - "value": "Add description…", - "comment": "Placeholder text in description input field" + "text": "Add description…", + "crowdinContext": "Placeholder text in description input field" }, "configurationPanel.drillIntoUrl.defaultButtonValue": { - "value": "Choose URL", - "comment": "Default text in URL drill target selection dropdown" + "text": "Choose URL", + "crowdinContext": "Default text in URL drill target selection dropdown" }, "configurationPanel.drillIntoUrl.attributeUrlSectionTitle": { - "value": "Hyperlink in attribute label", - "comment": "Section title for attribute hyperlink configuration" + "text": "Hyperlink in attribute label", + "crowdinContext": "Section title for attribute hyperlink configuration" }, "configurationPanel.drillIntoUrl.customUrlSectionTitle": { - "value": "Custom URL", - "comment": "Section title for custom URL configuration" + "text": "Custom URL", + "crowdinContext": "Section title for custom URL configuration" }, "configurationPanel.drillIntoUrl.editor.addUrlTitle": { - "value": "Add custom URL", - "comment": "Dialog title when creating a new custom URL" + "text": "Add custom URL", + "crowdinContext": "Dialog title when creating a new custom URL" }, "configurationPanel.drillIntoUrl.editor.editUrlTitle": { - "value": "Edit custom URL", - "comment": "Dialog title when modifying an existing custom URL" + "text": "Edit custom URL", + "crowdinContext": "Dialog title when modifying an existing custom URL" }, "configurationPanel.drillIntoUrl.editor.textAreaLabel": { - "value": "URL", - "comment": "Label for URL input field in the URL editor" + "text": "URL", + "crowdinContext": "Label for URL input field in the URL editor" }, "configurationPanel.drillIntoUrl.editor.parametersPanelLabel": { - "value": "Parameters", - "comment": "Section header for URL parameters configuration" + "text": "Parameters", + "crowdinContext": "Section header for URL parameters configuration" }, "configurationPanel.drillIntoUrl.editor.parametersPanelTooltip": { - "value": "Parameters are placeholders that are replaced by dynamic values during drilling.", - "comment": "Tooltip explaining URL parameters functionality" + "text": "Parameters are placeholders that are replaced by dynamic values during drilling.", + "crowdinContext": "Tooltip explaining URL parameters functionality" }, "configurationPanel.drillIntoUrl.editor.addParameterButtonLabel": { - "value": "Add", - "comment": "Button text for adding a new URL parameter" + "text": "Add", + "crowdinContext": "Button text for adding a new URL parameter" }, "configurationPanel.drillIntoUrl.editor.parameterDetailType": { - "value": "Type", - "comment": "Label for parameter type selector in URL editor" + "text": "Type", + "crowdinContext": "Label for parameter type selector in URL editor" }, "configurationPanel.drillIntoUrl.editor.parameterDetailLabel": { - "value": "Label", - "comment": "Label for parameter name field in URL editor" + "text": "Label", + "crowdinContext": "Label for parameter name field in URL editor" }, "configurationPanel.drillIntoUrl.editor.parameterDetailValues": { - "value": "{numberOfValues, plural, one {Value} other {Values}}", - "comment": "Title of values section in parameter detail in 'Custom URL' editor. Uses pluralization based on the number of values. Examples: When there is 1 value, it will show 'Value'. When there are multiple values, it will show 'Values'." + "text": "{numberOfValues, plural, one {Value} other {Values}}", + "crowdinContext": "Title of values section in parameter detail in 'Custom URL' editor. Uses pluralization based on the number of values. Examples: When there is 1 value, it will show 'Value'. When there are multiple values, it will show 'Values'." }, "configurationPanel.drillIntoUrl.editor.parameterDetailMoreValues": { - "value": "...and {count} more", - "comment": "Info about number of additional values not shown in parameter detail in 'Custom URL' editor. The placeholder {count} will be replaced with a number. Example: '...and 5 more' when there are 5 additional values not displayed." + "text": "...and {count} more", + "crowdinContext": "Info about number of additional values not shown in parameter detail in 'Custom URL' editor. The placeholder {count} will be replaced with a number. Example: '...and 5 more' when there are 5 additional values not displayed." }, "configurationPanel.drillIntoUrl.editor.insightIdParameterLabel": { - "value": "Visualization ID", - "comment": "Label of the visualization parameter in Drill to URL 'Custom URL' editor." + "text": "Visualization ID", + "crowdinContext": "Label of the visualization parameter in Drill to URL 'Custom URL' editor." }, "configurationPanel.drillIntoUrl.editor.clientIdParameterLabel": { - "value": "Client ID", - "comment": "Label of the client parameter in Drill to URL 'Custom URL' editor." + "text": "Client ID", + "crowdinContext": "Label of the client parameter in Drill to URL 'Custom URL' editor." }, "configurationPanel.drillIntoUrl.editor.dataProductIdParameterLabel": { - "value": "Data product ID", - "comment": "Label of the data product parameter in Drill to URL 'Custom URL' editor." + "text": "Data product ID", + "crowdinContext": "Label of the data product parameter in Drill to URL 'Custom URL' editor." }, "configurationPanel.drillIntoUrl.editor.projectIdParameterLabel": { - "value": "Project ID", - "comment": "Label of the project parameter in Drill to URL 'Custom URL' editor." + "text": "Project ID", + "crowdinContext": "Label of the project parameter in Drill to URL 'Custom URL' editor." }, "configurationPanel.drillIntoUrl.editor.workspaceIdParameterLabel": { - "value": "Workspace ID", - "comment": "Label of the workspace parameter in Drill to URL 'Custom URL' editor." + "text": "Workspace ID", + "crowdinContext": "Label of the workspace parameter in Drill to URL 'Custom URL' editor." }, "configurationPanel.drillIntoUrl.editor.widgetIdParameterLabel": { - "value": "Widget ID", - "comment": "Label of the widget parameter in Drill to URL 'Custom URL' editor." + "text": "Widget ID", + "crowdinContext": "Label of the widget parameter in Drill to URL 'Custom URL' editor." }, "configurationPanel.drillIntoUrl.editor.dashboardIdParameterLabel": { - "value": "Dashboard ID", - "comment": "Label of the dashboard parameter in Drill to URL 'Custom URL' editor." + "text": "Dashboard ID", + "crowdinContext": "Label of the dashboard parameter in Drill to URL 'Custom URL' editor." }, "configurationPanel.drillIntoUrl.editor.identifierTypeLabel": { - "value": "Identifier", - "comment": "Type label of identifier in parameter detail" + "text": "Identifier", + "crowdinContext": "Type label of identifier in parameter detail" }, "configurationPanel.drillIntoUrl.editor.insightParametersSectionLabel": { - "value": "Visualization", - "comment": "Section header for insight parameters" + "text": "Visualization", + "crowdinContext": "Section header for insight parameters" }, "configurationPanel.drillIntoUrl.editor.identifierParametersSectionLabel": { - "value": "Identifiers", - "comment": "Section header for identifier parameters in URL drill editor" + "text": "Identifiers", + "crowdinContext": "Section header for identifier parameters in URL drill editor" }, "configurationPanel.drillIntoUrl.editor.dashboardParametersSectionLabel": { - "value": "Dashboard", - "comment": "Section header for dashboard filter parameters in URL drill editor" + "text": "Dashboard", + "crowdinContext": "Section header for dashboard filter parameters in URL drill editor" }, "configurationPanel.drillIntoUrl.editor.applyButtonLabel": { - "value": "Apply", - "comment": "Button to confirm and save URL drill configuration" + "text": "Apply", + "crowdinContext": "Button to confirm and save URL drill configuration" }, "configurationPanel.drillIntoUrl.editor.cancelButtonLabel": { - "value": "Cancel", - "comment": "Button to discard URL drill configuration changes" + "text": "Cancel", + "crowdinContext": "Button to discard URL drill configuration changes" }, "configurationPanel.drillIntoUrl.editor.textAreaPlaceholder": { - "value": "Enter URL and add parameters from the right panel.", - "comment": "Placeholder text in URL input field" + "text": "Enter URL and add parameters from the right panel.", + "crowdinContext": "Placeholder text in URL input field" }, "configurationPanel.drillIntoUrl.editor.helpButtonLabel": { - "value": "How to create custom URLs?", - "comment": "Help link text for URL drill configuration" + "text": "How to create custom URLs?", + "crowdinContext": "Help link text for URL drill configuration" }, "configurationPanel.drillIntoUrl.editor.invalidAttributeDisplayForms": { - "value": "Invalid parameters: {invalidParameters}", - "comment": "Error message shown when URL contains invalid parameters" + "text": "Invalid parameters: {invalidParameters}", + "crowdinContext": "Error message shown when URL contains invalid parameters" }, "configurationPanel.drillIntoUrl.customUrlAddButtonLabel": { - "value": "Add custom URL", - "comment": "Button to create a new custom URL for drilling" + "text": "Add custom URL", + "crowdinContext": "Button to create a new custom URL for drilling" }, "configurationPanel.drillIntoUrl.customUrlEditButtonLabel": { - "value": "Edit custom URL", - "comment": "Button to modify an existing custom URL" + "text": "Edit custom URL", + "crowdinContext": "Button to modify an existing custom URL" }, "configurationPanel.drillIntoUrl.editor.defaultDisplayFormTypeLabel": { - "value": "Attribute label value", - "comment": "Display type option for showing attribute labels in URL parameters" + "text": "Attribute label value", + "crowdinContext": "Display type option for showing attribute labels in URL parameters" }, "configurationPanel.drillIntoUrl.editor.geoDisplayFormTypeLabel": { - "value": "Attribute geo value", - "comment": "Type label of geo display form in parameter detail in 'Custom URL' editor." + "text": "Attribute geo value", + "crowdinContext": "Type label of geo display form in parameter detail in 'Custom URL' editor." }, "configurationPanel.drillIntoUrl.editor.urlDisplayFormTypeLabel": { - "value": "Attribute URL value", - "comment": "Type label of URL display form in parameter detail in 'Custom URL' editor." + "text": "Attribute URL value", + "crowdinContext": "Type label of URL display form in parameter detail in 'Custom URL' editor." }, "configurationPanel.drillIntoUrl.editor.imageDisplayFormTypeLabel": { - "value": "Attribute image value", - "comment": "Type label of URL display form in parameter detail in 'Custom URL' editor." + "text": "Attribute image value", + "crowdinContext": "Type label of URL display form in parameter detail in 'Custom URL' editor." }, "configurationPanel.zoomInsight": { - "value": "Zoomable visualization", - "comment": "Label for zoomable visualization option in configuration panel" + "text": "Zoomable visualization", + "crowdinContext": "Label for zoomable visualization option in configuration panel" }, "configurationPanel.zoomInsight.help": { - "value": "Enable to zoom the visualization to display a detailed view. Hold the shift key to pan the zoomed area.", - "comment": "Tooltip for zoomable visualization option in configuration panel" + "text": "Enable to zoom the visualization to display a detailed view. Hold the shift key to pan the zoomed area.", + "crowdinContext": "Tooltip for zoomable visualization option in configuration panel" }, "configurationPanel.zoomInsight.notice": { - "value": "Zoom will not be applied to exported dashboards", - "comment": "Notice about zoom limitations in exported dashboard content" + "text": "Zoom will not be applied to exported dashboards", + "crowdinContext": "Notice about zoom limitations in exported dashboard content" }, "configurationPanel.drillConfig.selectInsight": { - "value": "Choose visualization…", - "comment": "Placeholder text in dropdown for selecting drill target visualization" + "text": "Choose visualization…", + "crowdinContext": "Placeholder text in dropdown for selecting drill target visualization" }, "attributesDropdown.noChanges": { - "value": "No changes to apply", - "comment": "Shown to screen readers on a disabled apply button when there are no changes to apply" + "text": "No changes to apply", + "crowdinContext": "Shown to screen readers on a disabled apply button when there are no changes to apply" }, "gs.date.date-dataset.recommended": { - "value": "Recommended", - "comment": "Label for recommended date datasets section" + "text": "Recommended", + "crowdinContext": "Label for recommended date datasets section" }, "gs.date.date-dataset.other": { - "value": "Other", - "comment": "Label for section containing additional date datasets" + "text": "Other", + "crowdinContext": "Label for section containing additional date datasets" }, "gs.date.date-dataset.related": { - "value": "Related", - "comment": "Label for section containing related date datasets" + "text": "Related", + "crowdinContext": "Label for section containing related date datasets" }, "gs.date.date-dataset.unrelated": { - "value": "Unrelated", - "comment": "Label for section containing unrelated date datasets" + "text": "Unrelated", + "crowdinContext": "Label for section containing unrelated date datasets" }, "gs.date.date-dataset.unrelated_hidden": { - "value": "{count} unrelated {count, plural, one {date} other {dates}} {isShow, select, true {visible} other {hidden}}.", - "comment": "Status message showing count of unrelated dates that are visible or hidden" + "text": "{count} unrelated {count, plural, one {date} other {dates}} {isShow, select, true {visible} other {hidden}}.", + "crowdinContext": "Status message showing count of unrelated dates that are visible or hidden" }, "gs.date.date-dataset.unrelated.show": { - "value": "Show", - "comment": "Button to display unrelated date items" + "text": "Show", + "crowdinContext": "Button to display unrelated date items" }, "gs.date.date-dataset.unrelated.hide": { - "value": "Hide", - "comment": "Button to hide unrelated date items" + "text": "Hide", + "crowdinContext": "Button to hide unrelated date items" }, "gs.date.date-dataset.duplicityWarning": { - "value": "Another filter is using the same date dataset. Disable this filter or set a different date.", - "comment": "Warning shown when multiple filters are using the same date dataset" + "text": "Another filter is using the same date dataset. Disable this filter or set a different date.", + "crowdinContext": "Warning shown when multiple filters are using the same date dataset" }, "layout.widget.width.min": { - "value": "Widget is at the minimal width", - "comment": "Warning shown when widget cannot be resized smaller" + "text": "Widget is at the minimal width", + "crowdinContext": "Warning shown when widget cannot be resized smaller" }, "layout.widget.width.max": { - "value": "Widget is at the maximal width", - "comment": "Warning shown when widget cannot be resized wider" + "text": "Widget is at the maximal width", + "crowdinContext": "Warning shown when widget cannot be resized wider" }, "layout.widget.height.min": { - "value": "Widget is at the minimal height", - "comment": "Warning shown when widget cannot be resized shorter" + "text": "Widget is at the minimal height", + "crowdinContext": "Warning shown when widget cannot be resized shorter" }, "layout.widget.height.max": { - "value": "Widget is at the maximal height", - "comment": "Warning shown when widget cannot be resized taller" + "text": "Widget is at the maximal height", + "crowdinContext": "Warning shown when widget cannot be resized taller" }, "layout.widget.addedByPlugin": { - "value": "Added by plugin", - "comment": "Indicator that widget was added by a plugin extension" + "text": "Added by plugin", + "crowdinContext": "Indicator that widget was added by a plugin extension" }, "layout.widget.modifiedByPlugin": { - "value": "Modified by plugin", - "comment": "Indicator that widget was modified by a plugin extension" + "text": "Modified by plugin", + "crowdinContext": "Indicator that widget was modified by a plugin extension" }, "layout.widget.hideOverlay": { - "value": "Hide overlay", - "comment": "Button to hide informational overlay on widget" + "text": "Hide overlay", + "crowdinContext": "Button to hide informational overlay on widget" }, "dropzone.new.row.desc": { - "value": "Drop to create a{nbsp}new section", - "comment": "Instruction shown when dragging a widget to create a new dashboard section" + "text": "Drop to create a{nbsp}new section", + "crowdinContext": "Instruction shown when dragging a widget to create a new dashboard section" }, "dropzone.widget.desc": { - "value": "Drop here", - "comment": "Instruction shown in highlighted dropzone when dragging a widget" + "text": "Drop here", + "crowdinContext": "Instruction shown in highlighted dropzone when dragging a widget" }, "dropzone.widget.last.in.row.desc": { - "value": "Drop to the existing section", - "comment": "Instruction shown when dragging a widget to add to an existing dashboard section" + "text": "Drop to the existing section", + "crowdinContext": "Instruction shown when dragging a widget to add to an existing dashboard section" }, "dropzone.widget.last.in.container.row.desc": { - "value": "Drop to the existing container", - "comment": "Instruction shown when dragging a widget to add to an existing container" + "text": "Drop to the existing container", + "crowdinContext": "Instruction shown when dragging a widget to add to an existing container" }, "deleteKpiConfirmationDialog.headline": { - "value": "Delete KPI", - "comment": "Confirmation dialog title when deleting a KPI widget" + "text": "Delete KPI", + "crowdinContext": "Confirmation dialog title when deleting a KPI widget" }, "deleteKpiConfirmationDialog.message": { - "value": "All alerts set up for this KPI will also be deleted.", - "comment": "Warning message about alerts being deleted when removing a KPI widget" + "text": "All alerts set up for this KPI will also be deleted.", + "crowdinContext": "Warning message about alerts being deleted when removing a KPI widget" }, "deleteKpiConfirmationDialog.submitButtonText": { - "value": "Delete", - "comment": "Button label to confirm KPI deletion" + "text": "Delete", + "crowdinContext": "Button label to confirm KPI deletion" }, "newDashboard.title": { - "value": "Drag visualization here", - "comment": "Instruction shown on empty dashboard prompting to add visualizations" + "text": "Drag visualization here", + "crowdinContext": "Instruction shown on empty dashboard prompting to add visualizations" }, "newDashboard.dropInsight": { - "value": "Drop visualization", - "comment": "A placeholder showed when user drags new visualization into a dashboard canvas by cursor (drag and drop)." + "text": "Drop visualization", + "crowdinContext": "A placeholder showed when user drags new visualization into a dashboard canvas by cursor (drag and drop)." }, "attributesDropdown.filterConfiguredMessage": { - "value": "{parentTitle} is already filtered by {childTitle} filter directly or through other filters.", - "comment": "Message explaining filter configuration status. The tags emphasize attribute names, and {parentTitle}/{childTitle} show the specific filter names." + "text": "{parentTitle} is already filtered by {childTitle} filter directly or through other filters.", + "crowdinContext": "Message explaining filter configuration status. The tags emphasize attribute names, and {parentTitle}/{childTitle} show the specific filter names." }, "attributesDropdown.attributeNameWithData": { - "value": "with data of", - "comment": "Will be used in sentence between two nouns. For instance 'Filter by AttributeX with data of MetricY'" + "text": "with data of", + "crowdinContext": "Will be used in sentence between two nouns. For instance 'Filter by AttributeX with data of MetricY'" }, "filter.visibilityMode.tooltip.hidden": { - "value": "This filter is hidden. It can be accessed only via the Edit mode.", - "comment": "The tooltip serves as a warning to the user that the filter will be hidden in view mode." + "text": "This filter is hidden. It can be accessed only via the Edit mode.", + "crowdinContext": "The tooltip serves as a warning to the user that the filter will be hidden in view mode." }, "filter.visibilityMode.tooltip.readonly.editMode": { - "value": "This filter is locked. It can be changed only via the Edit mode.", - "comment": "The tooltip serves as a warning to the user that the filter will be locked, and the user cannot change its value in view mode." + "text": "This filter is locked. It can be changed only via the Edit mode.", + "crowdinContext": "The tooltip serves as a warning to the user that the filter will be locked, and the user cannot change its value in view mode." }, "filter.visibilityMode.tooltip.readonly.viewMode": { - "value": "This filter is locked.", - "comment": "The tooltip helps users understand why they cannot change its value." + "text": "This filter is locked.", + "crowdinContext": "The tooltip helps users understand why they cannot change its value." }, "filter.resetButton.tooltip": { - "value": "Reset all filters", - "comment": "The tooltip of the reset button in the filter bar" + "text": "Reset all filters", + "crowdinContext": "The tooltip of the reset button in the filter bar" }, "filter.resetButton.success": { - "value": "Success: Filters reset to default values.", - "comment": "Text shown after reset button in the filter bar is used." + "text": "Success: Filters reset to default values.", + "crowdinContext": "Text shown after reset button in the filter bar is used." }, "filter.resetButton.ariaLabel": { - "value": "Reset filters to default", - "comment": "The aria-label of the reset button in the filter bar" + "text": "Reset filters to default", + "crowdinContext": "The aria-label of the reset button in the filter bar" }, "filter.crossFilterResetButton.tooltip": { - "value": "Reset cross filters", - "comment": "The tooltip of the reset button in the filter bar" + "text": "Reset cross filters", + "crowdinContext": "The tooltip of the reset button in the filter bar" }, "dateFilterDropdown.save": { - "value": "Save", - "comment": "Save button label in date filter dropdown configuration" + "text": "Save", + "crowdinContext": "Save button label in date filter dropdown configuration" }, "dateFilterDropdown.configuration": { - "value": "Configuration", - "comment": "Configuration button label in date filter dropdown" + "text": "Configuration", + "crowdinContext": "Configuration button label in date filter dropdown" }, "dateFilterDropdown.title": { - "value": "Date range", - "comment": "Header for date filter dropdown selector" + "text": "Date range", + "crowdinContext": "Header for date filter dropdown selector" }, "filter.configuration.mode.title": { - "value": "Mode", - "comment": "The title of the state section in date filter dropdown configuration" + "text": "Mode", + "crowdinContext": "The title of the state section in date filter dropdown configuration" }, "filter.configuration.mode.interactive.title": { - "value": "Interactive", - "comment": "The title of the interactive mode" + "text": "Interactive", + "crowdinContext": "The title of the interactive mode" }, "filter.configuration.mode.interactive.tooltip": { - "value": "Dashboard users can see and change the filter.", - "comment": "The tooltip of the interactive mode" + "text": "Dashboard users can see and change the filter.", + "crowdinContext": "The tooltip of the interactive mode" }, "filter.configuration.mode.locked.title": { - "value": "Locked", - "comment": "The title of the locked mode" + "text": "Locked", + "crowdinContext": "The title of the locked mode" }, "filter.configuration.mode.locked.tooltip": { - "value": "Dashboard users can see the filter but cannot change it.", - "comment": "The tooltip of the locked mode" + "text": "Dashboard users can see the filter but cannot change it.", + "crowdinContext": "The tooltip of the locked mode" }, "filter.configuration.mode.hidden.title": { - "value": "Hidden", - "comment": "The title of the hidden mode" + "text": "Hidden", + "crowdinContext": "The title of the hidden mode" }, "filter.configuration.mode.hidden.tooltip": { - "value": "Dashboard users cannot see the filter but it is applied.", - "comment": "The tooltip of the hidden mode" + "text": "Dashboard users cannot see the filter but it is applied.", + "crowdinContext": "The tooltip of the hidden mode" }, "filter.dependency.icon.tooltip": { - "value": "Values for {filterTitle} are filtered by selection in another filter.", - "comment": "Tooltip explaining that filter values are affected by another filter selection" + "text": "Values for {filterTitle} are filtered by selection in another filter.", + "crowdinContext": "Tooltip explaining that filter values are affected by another filter selection" }, "configurationPanel.drillConfig.alreadyUsedTooltip": { - "value": "This hierarchy is already used for the same drill down.", - "comment": "Warning tooltip when attempting to use an already selected hierarchy for drill down" + "text": "This hierarchy is already used for the same drill down.", + "crowdinContext": "Warning tooltip when attempting to use an already selected hierarchy for drill down" }, "configurationPanel.respectCrossFiltering": { - "value": "Respect cross-filtering", - "comment": "Label of checkbox whether cross-filtering should be respected or not" + "text": "Respect cross-filtering", + "crowdinContext": "Label of checkbox whether cross-filtering should be respected or not" }, "configurationPanel.respectCrossFiltering.tooltip": { - "value": "Disable this option to ignore cross-filtering from other visualizations.", - "comment": "Tooltip for checkbox whether cross-filtering should be respected or not" + "text": "Disable this option to ignore cross-filtering from other visualizations.", + "crowdinContext": "Tooltip for checkbox whether cross-filtering should be respected or not" }, "richText.formattingOptions": { - "value": "Formatting options", - "comment": "Label for rich text formatting toolbar options" + "text": "Formatting options", + "crowdinContext": "Label for rich text formatting toolbar options" }, "richText.deleteDialog.header": { - "value": "Delete rich text?", - "comment": "Title of confirmation dialog when deleting a rich text component" + "text": "Delete rich text?", + "crowdinContext": "Title of confirmation dialog when deleting a rich text component" }, "richText.deleteDialog.message": { - "value": "The rich text and all of its content will be irreversibly deleted.", - "comment": "Warning message when deleting a rich text component" + "text": "The rich text and all of its content will be irreversibly deleted.", + "crowdinContext": "Warning message when deleting a rich text component" }, "richText.emptyContent": { - "value": "No rich text content", - "comment": "Message shown when rich text component has no content" + "text": "No rich text content", + "crowdinContext": "Message shown when rich text component has no content" }, "visualizationSwitcher.emptyContent": { - "value": "No visualization in switcher", - "comment": "Message shown when visualization switcher has no visualizations" + "text": "No visualization in switcher", + "crowdinContext": "Message shown when visualization switcher has no visualizations" }, "visualizationSwitcherToolbar.visualizationsList.header": { - "value": "Visualizations", - "comment": "Title of visualizations list in the switcher toolbar" + "text": "Visualizations", + "crowdinContext": "Title of visualizations list in the switcher toolbar" }, "visualizationSwitcherToolbar.visualizationsList.tooltip": { - "value": "Visualizations", - "comment": "Tooltip shown when hovering over the visualizations list button" + "text": "Visualizations", + "crowdinContext": "Tooltip shown when hovering over the visualizations list button" }, "visualizationSwitcherToolbar.visualizationsList.prev": { - "value": "Previous", - "comment": "Button label to show previous visualization in switcher" + "text": "Previous", + "crowdinContext": "Button label to show previous visualization in switcher" }, "visualizationSwitcherToolbar.visualizationsList.next": { - "value": "Next", - "comment": "Button label to show next visualization in switcher" + "text": "Next", + "crowdinContext": "Button label to show next visualization in switcher" }, "visualizationSwitcherToolbar.visualizationsList.empty": { - "value": "No visualization in switcher, add one to continue.", - "comment": "Message shown when no visualizations are available in the switcher" + "text": "No visualization in switcher, add one to continue.", + "crowdinContext": "Message shown when no visualizations are available in the switcher" }, "visualizationSwitcherToolbar.visualizationsList.add": { - "value": "Add visualization", - "comment": "Button label to add a new visualization to the switcher" + "text": "Add visualization", + "crowdinContext": "Button label to add a new visualization to the switcher" }, "visualizationSwitcherToolbar.remove": { - "value": "Remove switcher", - "comment": "Button label to remove the visualization switcher" + "text": "Remove switcher", + "crowdinContext": "Button label to remove the visualization switcher" }, "visualizationSwitcher.configurationPanel.remove.from.switcher": { - "value": "Remove from switcher", - "comment": "Button label to remove a visualization from the switcher" + "text": "Remove from switcher", + "crowdinContext": "Button label to remove a visualization from the switcher" }, "visualizationSwitcher.list.menu.move.up": { - "value": "Move up", - "comment": "Menu option to move visualization up in the list of switcher" + "text": "Move up", + "crowdinContext": "Menu option to move visualization up in the list of switcher" }, "visualizationSwitcher.list.menu.move.down": { - "value": "Move down", - "comment": "Menu option to move visualization down in the list of switcher" + "text": "Move down", + "crowdinContext": "Menu option to move visualization down in the list of switcher" }, "visualizationSwitcher.list.menu.remove": { - "value": "Remove", - "comment": "Menu option to remove visualization from the switcher list" + "text": "Remove", + "crowdinContext": "Menu option to remove visualization from the switcher list" }, "nestedLayoutToolbar.hideHeader": { - "value": "Hide title and description.", - "comment": "Button tooltip for hiding container title and description" + "text": "Hide title and description.", + "crowdinContext": "Button tooltip for hiding container title and description" }, "nestedLayoutToolbar.showHeader": { - "value": "Show title and description.", - "comment": "Button tooltip for showing container title and description" + "text": "Show title and description.", + "crowdinContext": "Button tooltip for showing container title and description" }, "nestedLayoutToolbar.remove": { - "value": "Remove from dashboard.", - "comment": "Button tooltip for removing container from dashboard" + "text": "Remove from dashboard.", + "crowdinContext": "Button tooltip for removing container from dashboard" }, "nestedLayoutToolbar.direction.title": { - "value": "Layout direction", - "comment": "Title for the layout direction selector in the nested layout toolbar" + "text": "Layout direction", + "crowdinContext": "Title for the layout direction selector in the nested layout toolbar" }, "nestedLayoutToolbar.direction.row": { - "value": "Wrapped Row", - "comment": "Option for horizontal layout direction with wrapping in the nested layout toolbar" + "text": "Wrapped Row", + "crowdinContext": "Option for horizontal layout direction with wrapping in the nested layout toolbar" }, "nestedLayoutToolbar.direction.row.tooltip": { - "value": "Layout direction: Wrapped Row", - "comment": "Tooltip explaining the wrapped row layout direction option" + "text": "Layout direction: Wrapped Row", + "crowdinContext": "Tooltip explaining the wrapped row layout direction option" }, "nestedLayoutToolbar.direction.column": { - "value": "Column", - "comment": "Option for vertical layout direction in the nested layout toolbar" + "text": "Column", + "crowdinContext": "Option for vertical layout direction in the nested layout toolbar" }, "nestedLayoutToolbar.direction.column.tooltip": { - "value": "Layout direction: Column", - "comment": "Tooltip explaining the column layout direction option" + "text": "Layout direction: Column", + "crowdinContext": "Tooltip explaining the column layout direction option" }, "nestedLayoutToolbar.direction.column.disabledTooltip": { - "value": "Direction cannot be changed to a vertical if the container contains nested containers with a horizontal direction.", - "comment": "Tooltip explaining why vertical layout option is disabled in certain scenarios" + "text": "Direction cannot be changed to a vertical if the container contains nested containers with a horizontal direction.", + "crowdinContext": "Tooltip explaining why vertical layout option is disabled in certain scenarios" }, "nestedLayout.tab.title": { - "value": "Container", - "comment": "Tab title for container configuration panel" + "text": "Container", + "crowdinContext": "Tab title for container configuration panel" }, "nestedLayout.emptyDropZone.message": { - "value": "Drag here{br}to add to the container", - "comment": "Message shown in empty container drop zone" + "text": "Drag here{br}to add to the container", + "crowdinContext": "Message shown in empty container drop zone" }, "nestedLayout.emptyDropZone.active.message": { - "value": "Drop here{br}to add to the container", - "comment": "Message shown when dragging an item over empty container" + "text": "Drop here{br}to add to the container", + "crowdinContext": "Message shown when dragging an item over empty container" }, "attributesDropdown.valuesLimiting.title": { - "value": "Filter values by", - "comment": "The title of section that configures filters for listed values in the filter. There is a list of applied filters below the title." + "text": "Filter values by", + "crowdinContext": "The title of section that configures filters for listed values in the filter. There is a list of applied filters below the title." }, "attributesDropdown.valuesLimiting.empty": { - "value": "Limit the filter menu options by applying a dashboard filter or adding a metric.", - "comment": "Text shown when list of filters is empty." + "text": "Limit the filter menu options by applying a dashboard filter or adding a metric.", + "crowdinContext": "Text shown when list of filters is empty." }, "attributesDropdown.valuesLimiting.addLink": { - "value": "Add", - "comment": "Link that adds a new filter." + "text": "Add", + "crowdinContext": "Link that adds a new filter." }, "attributesDropdown.valuesLimiting.addMetricTitle": { - "value": "Choose metric", - "comment": "Title of popup with selection of metric that will limit listed values." + "text": "Choose metric", + "crowdinContext": "Title of popup with selection of metric that will limit listed values." }, "attributesDropdown.valuesLimiting.addFilterTitle": { - "value": "Choose dashboard filter", - "comment": "Title of popup with selection of filter will limit listed values." + "text": "Choose dashboard filter", + "crowdinContext": "Title of popup with selection of filter will limit listed values." }, "attributesDropdown.valuesLimiting.addItemTitle": { - "value": "Add", - "comment": "Title of popup with selection of filter or metric that will limit listed values." + "text": "Add", + "crowdinContext": "Title of popup with selection of filter or metric that will limit listed values." }, "attributesDropdown.valuesLimiting.searchPlaceholder": { - "value": "Search…", - "comment": "Search field placeholder in the attribute values filter selection" + "text": "Search…", + "crowdinContext": "Search field placeholder in the attribute values filter selection" }, "attributesDropdown.valuesLimiting.sumFact": { - "value": "Sum of {fact}", - "comment": "Label for sum aggregation of a fact in metric selection dropdown" + "text": "Sum of {fact}", + "crowdinContext": "Label for sum aggregation of a fact in metric selection dropdown" }, "attributesDropdown.valuesLimiting.countAttribute": { - "value": "Count of {attribute}", - "comment": "Label for count aggregation of an attribute in metric selection dropdown" + "text": "Count of {attribute}", + "crowdinContext": "Label for count aggregation of an attribute in metric selection dropdown" }, "attributesDropdown.valuesLimiting.metricsEmpty": { - "value": "No more items to add.", - "comment": "Text shown when all items were used and there is none offered in the list." + "text": "No more items to add.", + "crowdinContext": "Text shown when all items were used and there is none offered in the list." }, "attributesDropdown.valuesLimiting.unknownItem": { - "value": "Unknown item", - "comment": "The title of item in the list that does not have a title." + "text": "Unknown item", + "crowdinContext": "The title of item in the list that does not have a title." }, "attributesDropdown.valuesLimiting.searchNoMatch": { - "value": "No matching item was found.", - "comment": "Text shown when entered search term do not match any item in the list." + "text": "No matching item was found.", + "crowdinContext": "Text shown when entered search term do not match any item in the list." }, "attributesDropdown.valuesLimiting.filtersEmpty": { - "value": "No more dashboard filters to add.", - "comment": "Text shown when all dashboard filters were used and there is none offered in the list." + "text": "No more dashboard filters to add.", + "crowdinContext": "Text shown when all dashboard filters were used and there is none offered in the list." }, "attributesDropdown.valuesLimiting.addFilters.title": { - "value": "Dashboard filter", - "comment": "Title of section that describe the action user can choose. The action selects an existing dashboard filter to be used as a validation items to hide attribute filter elements." + "text": "Dashboard filter", + "crowdinContext": "Title of section that describe the action user can choose. The action selects an existing dashboard filter to be used as a validation items to hide attribute filter elements." }, "attributesDropdown.valuesLimiting.addFilters.description": { - "value": "Use an existing dashboard filter to hide irrelevant values. ", - "comment": "Description of section that describe the action user can choose. The action selects an existing dashboard filter to be used as a validation items to hide attribute filter elements." + "text": "Use an existing dashboard filter to hide irrelevant values. ", + "crowdinContext": "Description of section that describe the action user can choose. The action selects an existing dashboard filter to be used as a validation items to hide attribute filter elements." }, "attributesDropdown.valuesLimiting.addLimitingItem.title": { - "value": "Metric", - "comment": "Title of section that describe the action user can choose. The action selects an existing dashboard filter to be used as a validation items to hide attribute filter elements." + "text": "Metric", + "crowdinContext": "Title of section that describe the action user can choose. The action selects an existing dashboard filter to be used as a validation items to hide attribute filter elements." }, "attributesDropdown.valuesLimiting.addLimitingItem.description": { - "value": "Use a metric to hide irrelevant values. Only values with non-null results for the metric are shown. Learn more", - "comment": "Description of using metrics to filter attribute values, with a learn more link" + "text": "Use a metric to hide irrelevant values. Only values with non-null results for the metric are shown. Learn more", + "crowdinContext": "Description of using metrics to filter attribute values, with a learn more link" }, "attributesDropdown.valuesLimiting.commonDateFilterTitle": { - "value": "{dateFilterTitle} as {dataSetTitle}", - "comment": "Format for displaying a date filter and its dataset in the filter selection" + "text": "{dateFilterTitle} as {dataSetTitle}", + "crowdinContext": "Format for displaying a date filter and its dataset in the filter selection" }, "attributesDropdown.valuesLimiting.addDateTitle": { - "value": "Choose date", - "comment": "Dialog title for selecting date filters to limit attribute values" + "text": "Choose date", + "crowdinContext": "Dialog title for selecting date filters to limit attribute values" }, "attributesDropdown.valuesLimiting.disableDateFilter": { - "value": "Filter not available: The {dateFilterTitle} filter is already using this date dataset.", - "comment": "Error message shown when a date filter is already in use elsewhere" + "text": "Filter not available: The {dateFilterTitle} filter is already using this date dataset.", + "crowdinContext": "Error message shown when a date filter is already in use elsewhere" }, "attributesDropdown.valuesLimiting.disableDataSet": { - "value": "Date dataset not available: The {dateFilterTitle} filter is already using this date dataset.", - "comment": "Error message shown when a date dataset is already in use by another filter" + "text": "Date dataset not available: The {dateFilterTitle} filter is already using this date dataset.", + "crowdinContext": "Error message shown when a date dataset is already in use by another filter" }, "filters.filterViews.dropdown.buttonEmpty": { - "value": "My views", - "comment": "Title of the dropdown button that opens list of filter views (saved values) saved by the user." + "text": "My views", + "crowdinContext": "Title of the dropdown button that opens list of filter views (saved values) saved by the user." }, "filters.filterViews.dropdown.button": { - "value": "My views ({count})", - "comment": "Dropdown button label showing number of saved filter views" + "text": "My views ({count})", + "crowdinContext": "Dropdown button label showing number of saved filter views" }, "filters.filterViews.dropdown.title": { - "value": "My saved views", - "comment": "Title of the dropdown with list of filter views (saved values) saved by the user." + "text": "My saved views", + "crowdinContext": "Title of the dropdown with list of filter views (saved values) saved by the user." }, "filters.filterViews.dropdown.setAsDefault": { - "value": "Set as default", - "comment": "Label of button that sets the filter view as default one." + "text": "Set as default", + "crowdinContext": "Label of button that sets the filter view as default one." }, "filters.filterViews.dropdown.setAsDefault.ariaLabel": { - "value": "Set {name} as default", - "comment": "The screen reader title for the button that sets the filter view as default one." + "text": "Set {name} as default", + "crowdinContext": "The screen reader title for the button that sets the filter view as default one." }, "filters.filterViews.dropdown.unsetAsDefault": { - "value": "Unset as default", - "comment": "Label of button that unsets the filter view as default one." + "text": "Unset as default", + "crowdinContext": "Label of button that unsets the filter view as default one." }, "filters.filterViews.dropdown.unsetAsDefault.ariaLabel": { - "value": "Unset {name} as default", - "comment": "The screen reader title for the button that unsets the filter view as default one." + "text": "Unset {name} as default", + "crowdinContext": "The screen reader title for the button that unsets the filter view as default one." }, "filters.filterViews.dropdown.isDefault": { - "value": "(default)", - "comment": "Text displayed next to the name of the filter view if it was marked as a default one." + "text": "(default)", + "crowdinContext": "Text displayed next to the name of the filter view if it was marked as a default one." }, "filters.filterViews.dropdown.tooltip": { - "value": "

Views are saved sets of filters that let you quickly return to a specific filter state.

If you set a view as the default, it will apply automatically every time you open the dashboard.

", - "comment": "Tooltip explaining the purpose and behavior of saved filter views" + "text": "

Views are saved sets of filters that let you quickly return to a specific filter state.

If you set a view as the default, it will apply automatically every time you open the dashboard.

", + "crowdinContext": "Tooltip explaining the purpose and behavior of saved filter views" }, "filters.filterViews.dropdown.newButton": { - "value": "Create view", - "comment": "Label of button that adds a new item to the list" + "text": "Create view", + "crowdinContext": "Label of button that adds a new item to the list" }, "filters.filterViews.dropdown.emptyList": { - "value": "You haven't saved any views for this dashboard.", - "comment": "Text shown when list of views does not have any items in it." + "text": "You haven't saved any views for this dashboard.", + "crowdinContext": "Text shown when list of views does not have any items in it." }, "filters.filterViews.toast.viewSaved": { - "value": "Great! Your view is saved.", - "comment": "Text shown when filter view was saved." + "text": "Great! Your view is saved.", + "crowdinContext": "Text shown when filter view was saved." }, "filters.filterViews.toast.viewDeleted": { - "value": "Great! We deleted your view.", - "comment": "Text shown when filter view was deleted." + "text": "Great! We deleted your view.", + "crowdinContext": "Text shown when filter view was deleted." }, "filters.filterViews.toast.viewApplied": { - "value": "Great! Your view is applied.", - "comment": "Text shown when filter view was applied." + "text": "Great! Your view is applied.", + "crowdinContext": "Text shown when filter view was applied." }, "filters.filterViews.toast.viewSetAsDefault": { - "value": "Great! Your view is set as default.", - "comment": "Text shown when filter view was saved as a default one." + "text": "Great! Your view is set as default.", + "crowdinContext": "Text shown when filter view was saved as a default one." }, "filters.filterViews.toast.viewUnsetAsDefault": { - "value": "Great! Your view is no longer set as default.", - "comment": "Text shown when filter view was saved as a default one." + "text": "Great! Your view is no longer set as default.", + "crowdinContext": "Text shown when filter view was saved as a default one." }, "filters.filterViews.toast.viewNotSaved": { - "value": "Failure! Your view was not saved. Please try again.", - "comment": "Text shown when filter view was not saved." + "text": "Failure! Your view was not saved. Please try again.", + "crowdinContext": "Text shown when filter view was not saved." }, "filters.filterViews.toast.viewNotDeleted": { - "value": "Failure! Your view was not deleted. Please try again.", - "comment": "Text shown when filter view was not deleted." + "text": "Failure! Your view was not deleted. Please try again.", + "crowdinContext": "Text shown when filter view was not deleted." }, "filters.filterViews.toast.viewNotSetAsDefault": { - "value": "Failure! Your view was not set as default. Please try again.", - "comment": "Text shown when filter view was not saved as a default one." + "text": "Failure! Your view was not set as default. Please try again.", + "crowdinContext": "Text shown when filter view was not saved as a default one." }, "filters.filterViews.toast.viewNotUnsetAsDefault": { - "value": "Failure! Your view is still set as default. Please try again.", - "comment": "Text shown when filter view was not saved as a default one." + "text": "Failure! Your view is still set as default. Please try again.", + "crowdinContext": "Text shown when filter view was not saved as a default one." }, "filters.filterViews.toast.viewNotApplied": { - "value": "Failure! Your view was not applied. Please try again.", - "comment": "Text shown when filter view was not applied." + "text": "Failure! Your view was not applied. Please try again.", + "crowdinContext": "Text shown when filter view was not applied." }, "filters.filterViews.list.ariaLabel.withActions": { - "value": "List of saved views. Use the right arrow key to move to the ‘Set as default’ action, then to the ‘delete’ action.", - "comment": "Screen reader description for the list of saved views. Includes the possible keyboard actions." + "text": "List of saved views. Use the right arrow key to move to the ‘Set as default’ action, then to the ‘delete’ action.", + "crowdinContext": "Screen reader description for the list of saved views. Includes the possible keyboard actions." }, "filters.filterViews.list.ariaLabel.noActions": { - "value": "List of saved views", - "comment": "Screen reader description for the list of saved views when there are no actions available." + "text": "List of saved views", + "crowdinContext": "Screen reader description for the list of saved views when there are no actions available." }, "filters.filterViews.add.title": { - "value": "Create view", - "comment": "Title of the dropdown with form that creates a new saved filter view." + "text": "Create view", + "crowdinContext": "Title of the dropdown with form that creates a new saved filter view." }, "filters.filterViews.add.nameLabel": { - "value": "Name", - "comment": "Label of the input field used to enter the name of the saved filter view." + "text": "Name", + "crowdinContext": "Label of the input field used to enter the name of the saved filter view." }, "filters.filterViews.add.namePlaceholder": { - "value": "Untitled view", - "comment": "Placeholder of the input field used to enter the name of the saved filter view." + "text": "Untitled view", + "crowdinContext": "Placeholder of the input field used to enter the name of the saved filter view." }, "filters.filterViews.add.setAsDefaultLabel": { - "value": "Set as default", - "comment": "Label of checkbox that marks the view as a default one." + "text": "Set as default", + "crowdinContext": "Label of checkbox that marks the view as a default one." }, "filters.filterViews.add.deleteTooltip": { - "value": "Delete", - "comment": "Tooltip shown when user hovers over delete item icon." + "text": "Delete", + "crowdinContext": "Tooltip shown when user hovers over delete item icon." }, "filters.filterViews.add.deleteTooltip.ariaLabel": { - "value": "Delete {name}", - "comment": "Screen reader description for the delete item icon." + "text": "Delete {name}", + "crowdinContext": "Screen reader description for the delete item icon." }, "filters.filterViews.add.hint": { - "value": "All current dashboard filters will be included.", - "comment": "Hint in the form that creates a new dashboard filter view." + "text": "All current dashboard filters will be included.", + "crowdinContext": "Hint in the form that creates a new dashboard filter view." }, "filters.filterViews.add.saveButton": { - "value": "Save", - "comment": "Label of the button that saves the form." + "text": "Save", + "crowdinContext": "Label of the button that saves the form." }, "filters.filterViews.add.cancelButton": { - "value": "Cancel", - "comment": "Label of the button that cancels the form changes." + "text": "Cancel", + "crowdinContext": "Label of the button that cancels the form changes." }, "filters.filterViews.delete.title": { - "value": "Delete view?", - "comment": "Label of the dialog that confirms deletion of the filter view entity." + "text": "Delete view?", + "crowdinContext": "Label of the dialog that confirms deletion of the filter view entity." }, "filters.filterViews.delete.body": { - "value": "Your view {view} will be permanently deleted.", - "comment": "Confirmation dialog for deleting a filter view. The tags emphasize the view name, and {view} placeholder shows the specific filter view being deleted." + "text": "Your view {view} will be permanently deleted.", + "crowdinContext": "Confirmation dialog for deleting a filter view. The tags emphasize the view name, and {view} placeholder shows the specific filter view being deleted." }, "filters.filterViews.delete.deleteButton": { - "value": "Delete", - "comment": "Label of the button that deletes the filter view." + "text": "Delete", + "crowdinContext": "Label of the button that deletes the filter view." }, "filters.filterViews.delete.cancelButton": { - "value": "Cancel", - "comment": "Label of the button that cancels and closes the dialog." + "text": "Cancel", + "crowdinContext": "Label of the button that cancels and closes the dialog." }, "filters.filterViews.tooltip.ariaLabel": { - "value": "Information about Saved Views", - "comment": "Aria label of the Filter Views tooltip." + "text": "Information about Saved Views", + "crowdinContext": "Aria label of the Filter Views tooltip." }, "insightAlert.config.action.edit": { - "value": "Edit", - "comment": "Action in alert configuration" + "text": "Edit", + "crowdinContext": "Action in alert configuration" }, "insightAlert.config.action.pause": { - "value": "Pause", - "comment": "Action in alert configuration" + "text": "Pause", + "crowdinContext": "Action in alert configuration" }, "insightAlert.config.action.resume": { - "value": "Unpause", - "comment": "Action in alert configuration" + "text": "Unpause", + "crowdinContext": "Action in alert configuration" }, "insightAlert.config.action.delete": { - "value": "Delete", - "comment": "Action in alert configuration" + "text": "Delete", + "crowdinContext": "Action in alert configuration" }, "insightAlert.config.comparisonOperator.lessThan": { - "value": "Is less than", - "comment": "Comparison operator in alert configuration" + "text": "Is less than", + "crowdinContext": "Comparison operator in alert configuration" }, "insightAlert.config.comparisonOperator.lessThanOrEquals": { - "value": "Is less than or equal to", - "comment": "Comparison operator in alert configuration" + "text": "Is less than or equal to", + "crowdinContext": "Comparison operator in alert configuration" }, "insightAlert.config.comparisonOperator.greaterThan": { - "value": "Is greater than", - "comment": "Comparison operator in alert configuration" + "text": "Is greater than", + "crowdinContext": "Comparison operator in alert configuration" }, "insightAlert.config.comparisonOperator.greaterThanOrEquals": { - "value": "Is greater than or equal to", - "comment": "Comparison operator in alert configuration" + "text": "Is greater than or equal to", + "crowdinContext": "Comparison operator in alert configuration" }, "insightAlert.config.changeOperator.header": { - "value": "CHANGE %", - "comment": "Header label for the percentage change operator in alert configuration" + "text": "CHANGE %", + "crowdinContext": "Header label for the percentage change operator in alert configuration" }, "insightAlert.config.changeOperator.header.info": { - "value": "Change{spacer}Calculates the relative change between primary (current time period) and secondary (previous time period) metric values.{spacer}FORMULA{spacer}(Primary - Secondary) / Secondary", - "comment": "Description and formula for the percentage change calculation in alert configuration. {spacer} is a placeholder for line breaks." + "text": "Change{spacer}Calculates the relative change between primary (current time period) and secondary (previous time period) metric values.{spacer}FORMULA{spacer}(Primary - Secondary) / Secondary", + "crowdinContext": "Description and formula for the percentage change calculation in alert configuration. {spacer} is a placeholder for line breaks." }, "insightAlert.config.differenceOperator.header": { - "value": "DIFFERENCE #", - "comment": "Header label for the numeric difference operator in alert configuration" + "text": "DIFFERENCE #", + "crowdinContext": "Header label for the numeric difference operator in alert configuration" }, "insightAlert.config.differenceOperator.header.info": { - "value": "Difference{spacer}Calculates the net difference between primary (current time period) and secondary (previous time period) metric values.{spacer}FORMULA{spacer}Primary - Secondary", - "comment": "Description and formula for the numeric difference calculation in alert configuration. {spacer} is a placeholder for line breaks." + "text": "Difference{spacer}Calculates the net difference between primary (current time period) and secondary (previous time period) metric values.{spacer}FORMULA{spacer}Primary - Secondary", + "crowdinContext": "Description and formula for the numeric difference calculation in alert configuration. {spacer} is a placeholder for line breaks." }, "insightAlert.config.aiOperator.header": { - "value": "AI", - "comment": "Header label for the AI operators in alert configuration" + "text": "AI", + "crowdinContext": "Header label for the AI operators in alert configuration" }, "insightAlert.config.aiOperator.header.info": { - "value": "All AI operators are based on the AI functions.", - "comment": "Header info for the AI operators in alert configuration" + "text": "All AI operators are based on the AI functions.", + "crowdinContext": "Header info for the AI operators in alert configuration" }, "insightAlert.config.anomalyDetection": { - "value": "Has an anomaly", - "comment": "Description and formula for the anomaly detection calculation in alert configuration." + "text": "Has an anomaly", + "crowdinContext": "Description and formula for the anomaly detection calculation in alert configuration." }, "insightAlert.config.sensitivity": { - "value": "Sensitivity", - "comment": "Sensitivity for anomaly detection in alert configuration." + "text": "Sensitivity", + "crowdinContext": "Sensitivity for anomaly detection in alert configuration." }, "insightAlert.config.sensitivity.low": { - "value": "Low", - "comment": "Low sensitivity for anomaly detection in alert configuration." + "text": "Low", + "crowdinContext": "Low sensitivity for anomaly detection in alert configuration." }, "insightAlert.config.sensitivity.medium": { - "value": "Medium", - "comment": "Medium sensitivity for anomaly detection in alert configuration." + "text": "Medium", + "crowdinContext": "Medium sensitivity for anomaly detection in alert configuration." }, "insightAlert.config.sensitivity.high": { - "value": "High", - "comment": "High sensitivity for anomaly detection in alert configuration." + "text": "High", + "crowdinContext": "High sensitivity for anomaly detection in alert configuration." }, "insightAlert.config.granularity": { - "value": "Group by", - "comment": "Granularity for anomaly detection in alert configuration." + "text": "Group by", + "crowdinContext": "Granularity for anomaly detection in alert configuration." }, "insightAlert.config.granularity.tooltip": { - "value": "Set how the data is aggregated before checking for anomalies.", - "comment": "Granularity label tooltip in alert configuration." + "text": "Set how the data is aggregated before checking for anomalies.", + "crowdinContext": "Granularity label tooltip in alert configuration." }, "insightAlert.config.granularity.hour": { - "value": "Hours", - "comment": "Granularity for anomaly detection in alert configuration." + "text": "Hours", + "crowdinContext": "Granularity for anomaly detection in alert configuration." }, "insightAlert.config.granularity.day": { - "value": "Days", - "comment": "Granularity for anomaly detection in alert configuration." + "text": "Days", + "crowdinContext": "Granularity for anomaly detection in alert configuration." }, "insightAlert.config.granularity.week": { - "value": "Weeks", - "comment": "Granularity for anomaly detection in alert configuration." + "text": "Weeks", + "crowdinContext": "Granularity for anomaly detection in alert configuration." }, "insightAlert.config.granularity.month": { - "value": "Months", - "comment": "Granularity for anomaly detection in alert configuration." + "text": "Months", + "crowdinContext": "Granularity for anomaly detection in alert configuration." }, "insightAlert.config.granularity.quarter": { - "value": "Quarters", - "comment": "Granularity for anomaly detection in alert configuration." + "text": "Quarters", + "crowdinContext": "Granularity for anomaly detection in alert configuration." }, "insightAlert.config.granularity.year": { - "value": "Years", - "comment": "Granularity for anomaly detection in alert configuration." + "text": "Years", + "crowdinContext": "Granularity for anomaly detection in alert configuration." }, "insightAlert.config.changeOperator.increasesBy": { - "value": "Increases by", - "comment": "Alert condition for when a metric's percentage change increases by a specified amount" + "text": "Increases by", + "crowdinContext": "Alert condition for when a metric's percentage change increases by a specified amount" }, "insightAlert.config.changeOperator.decreasesBy": { - "value": "Decreases by", - "comment": "Alert condition for when a metric's percentage change decreases by a specified amount" + "text": "Decreases by", + "crowdinContext": "Alert condition for when a metric's percentage change decreases by a specified amount" }, "insightAlert.config.changeOperator.changesBy": { - "value": "Changes by", - "comment": "Alert condition for when a metric's percentage change (either increase or decrease) exceeds a specified amount" + "text": "Changes by", + "crowdinContext": "Alert condition for when a metric's percentage change (either increase or decrease) exceeds a specified amount" }, "insightAlert.config.differenceOperator.increasesBy": { - "value": "Increases by", - "comment": "Alert condition for when a metric's numeric value increases by a specified amount" + "text": "Increases by", + "crowdinContext": "Alert condition for when a metric's numeric value increases by a specified amount" }, "insightAlert.config.differenceOperator.decreasesBy": { - "value": "Decreases by", - "comment": "Alert condition for when a metric's numeric value decreases by a specified amount" + "text": "Decreases by", + "crowdinContext": "Alert condition for when a metric's numeric value decreases by a specified amount" }, "insightAlert.config.differenceOperator.changesBy": { - "value": "Changes by", - "comment": "Alert condition for when a metric's numeric value changes (either increases or decreases) by a specified amount" + "text": "Changes by", + "crowdinContext": "Alert condition for when a metric's numeric value changes (either increases or decreases) by a specified amount" }, "insightAlert.config.alerts": { - "value": "Alerts", - "comment": "Title of the section in insight configuration" + "text": "Alerts", + "crowdinContext": "Title of the section in insight configuration" }, "insightAlert.config.alerts.empty": { - "value": "There are no alerts for this visualization.", - "comment": "Text shown when there are no alerts for this visualization." + "text": "There are no alerts for this visualization.", + "crowdinContext": "Text shown when there are no alerts for this visualization." }, "insightAlert.config.noAlertMeasures": { - "value": "Alerts", - "comment": "Text shown when there are no metrics available for the insight" + "text": "Alerts", + "crowdinContext": "Text shown when there are no metrics available for the insight" }, "insightAlert.config.noAlertMeasures.title": { - "value": "No metrics available for alerting.", - "comment": "Message shown when a visualization has no metrics that can be used for alert configuration" + "text": "No metrics available for alerting.", + "crowdinContext": "Message shown when a visualization has no metrics that can be used for alert configuration" }, "insightAlert.config.noAlertMeasures.description": { - "value": "Please add a metric to enable alerting.", - "comment": "Instruction shown when alerts cannot be created due to missing metrics" + "text": "Please add a metric to enable alerting.", + "crowdinContext": "Instruction shown when alerts cannot be created due to missing metrics" }, "insightAlert.config.createAlert": { - "value": "Create alert", - "comment": "Title of the section in insight configuration" + "text": "Create alert", + "crowdinContext": "Title of the section in insight configuration" }, "insightAlert.config.editAlert": { - "value": "Edit alert", - "comment": "Title of the section in insight configuration" + "text": "Edit alert", + "crowdinContext": "Title of the section in insight configuration" }, "insightAlert.config.title": { - "value": "Configuration", - "comment": "Title of the section in insight configuration" + "text": "Configuration", + "crowdinContext": "Title of the section in insight configuration" }, "insightAlert.config.trigger": { - "value": "Trigger", - "comment": "Title of the section in insight configuration" + "text": "Trigger", + "crowdinContext": "Title of the section in insight configuration" }, "insightAlert.config.metric": { - "value": "Metric", - "comment": "Label of the metric select dropdown" + "text": "Metric", + "crowdinContext": "Label of the metric select dropdown" }, "insightAlert.config.trigger.tooltip": { - "value": "How often to trigger the alert when the condition is met.", - "comment": "Tooltip for alert trigger configuration" + "text": "How often to trigger the alert when the condition is met.", + "crowdinContext": "Tooltip for alert trigger configuration" }, "insightAlert.config.action": { - "value": "Action", - "comment": "Title of the section in insight configuration" + "text": "Action", + "crowdinContext": "Title of the section in insight configuration" }, "insightAlert.config.name": { - "value": "Name", - "comment": "Title of the section in insight configuration" + "text": "Name", + "crowdinContext": "Title of the section in insight configuration" }, "insightAlert.config.accessibility.title": { - "value": "Custom name of the alert", - "comment": "Title of the section in insight configuration" + "text": "Custom name of the alert", + "crowdinContext": "Title of the section in insight configuration" }, "insightAlert.config.when": { - "value": "When", - "comment": "Title of the section in insight configuration" + "text": "When", + "crowdinContext": "Title of the section in insight configuration" }, "insightAlert.config.for": { - "value": "For", - "comment": "Title of the section in insight configuration" + "text": "For", + "crowdinContext": "Title of the section in insight configuration" }, "insightAlert.config.condition": { - "value": "Condition", - "comment": "Title of the section in insight configuration" + "text": "Condition", + "crowdinContext": "Title of the section in insight configuration" }, "insightAlert.config.threshold": { - "value": "Threshold", - "comment": "Title of the section in insight configuration" + "text": "Threshold", + "crowdinContext": "Title of the section in insight configuration" }, "insightAlert.config.comparison": { - "value": "Comparison", - "comment": "Title of the section in insight configuration" + "text": "Comparison", + "crowdinContext": "Title of the section in insight configuration" }, "insightAlert.config.recipients": { - "value": "Recipients", - "comment": "Title of the section in insight configuration" + "text": "Recipients", + "crowdinContext": "Title of the section in insight configuration" }, "insightAlert.config.do": { - "value": "Do", - "comment": "Title of the section in insight configuration" + "text": "Do", + "crowdinContext": "Title of the section in insight configuration" }, "insightAlert.config.warning.destination": { - "value": "The selected destination only supports sending the alert to yourself.", - "comment": "Alert warning message" + "text": "The selected destination only supports sending the alert to yourself.", + "crowdinContext": "Alert warning message" }, "insightAlert.config.filters": { - "value": "using {n} {n, plural, one {filter} other {filters}}", - "comment": "Text showing how many filters are being used in an alert configuration. The placeholder {n} will be replaced with a number and the word 'filter' will be pluralized accordingly. Examples: 'using 1 filter', 'using 3 filters'." + "text": "using {n} {n, plural, one {filter} other {filters}}", + "crowdinContext": "Text showing how many filters are being used in an alert configuration. The placeholder {n} will be replaced with a number and the word 'filter' will be pluralized accordingly. Examples: 'using 1 filter', 'using 3 filters'." }, "insightAlert.config.and": { - "value": "and", - "comment": "This is a part of sentence 'for This month and 1 filter'" + "text": "and", + "crowdinContext": "This is a part of sentence 'for This month and 1 filter'" }, "insightAlert.config.for.filter": { - "value": "for {granularity}", - "comment": "This is a part of sentence 'for This month and 1 filter'" + "text": "for {granularity}", + "crowdinContext": "This is a part of sentence 'for This month and 1 filter'" }, "insightAlert.config.filters.info": { - "value": "Alerts respect the dashboard filters as set at the time of their creation.{spacer}To modify the time period used for comparison, adjust the date filter.", - "comment": "Alerts configuration info message" + "text": "Alerts respect the dashboard filters as set at the time of their creation.{spacer}To modify the time period used for comparison, adjust the date filter.", + "crowdinContext": "Alerts configuration info message" }, "insightAlert.config.compare_with_sp": { - "value": "same period previous year", - "comment": "Comparison option for alerts to compare with the same period in the previous year" + "text": "same period previous year", + "crowdinContext": "Comparison option for alerts to compare with the same period in the previous year" }, "insightAlert.config.compare_with_pp": { - "value": "previous period", - "comment": "Comparison option for alerts to compare with the immediately preceding time period" + "text": "previous period", + "crowdinContext": "Comparison option for alerts to compare with the immediately preceding time period" }, "insightAlert.config.compare_with_sp_granularity": { - "value": "same {period} previous year", - "comment": "Comparison option with dynamic time period. The {period} placeholder shows the specific time comparison (e.g., 'same month previous year')." + "text": "same {period} previous year", + "crowdinContext": "Comparison option with dynamic time period. The {period} placeholder shows the specific time comparison (e.g., 'same month previous year')." }, "insightAlert.config.compare_with_pp_granularity": { - "value": "previous {period}", - "comment": "Comparison option with dynamic time period. The {period} placeholder shows the specific time comparison (e.g., 'previous month')." + "text": "previous {period}", + "crowdinContext": "Comparison option with dynamic time period. The {period} placeholder shows the specific time comparison (e.g., 'previous month')." }, "insightAlert.config.addAlert": { - "value": "Add alert", - "comment": "Button label for creating a new alert on a visualization" + "text": "Add alert", + "crowdinContext": "Button label for creating a new alert on a visualization" }, "insightAlert.config.triggerMode.always": { - "value": "Every time", - "comment": "Alert trigger option to send notification every time the condition is met" + "text": "Every time", + "crowdinContext": "Alert trigger option to send notification every time the condition is met" }, "insightAlert.config.triggerMode.once": { - "value": "Once, then pause", - "comment": "Alert trigger option to send notification only once when condition is met, then automatically pause" + "text": "Once, then pause", + "crowdinContext": "Alert trigger option to send notification only once when condition is met, then automatically pause" }, "insightAlert.config.delete.success": { - "value": "Success. The alert has been deleted.", - "comment": "Success notification shown after deleting an alert" + "text": "Success. The alert has been deleted.", + "crowdinContext": "Success notification shown after deleting an alert" }, "insightAlert.config.resume.success": { - "value": "Success. The alert has been resumed.", - "comment": "Success notification shown after resuming a paused alert" + "text": "Success. The alert has been resumed.", + "crowdinContext": "Success notification shown after resuming a paused alert" }, "insightAlert.config.pause.success": { - "value": "Success. The alert has been paused.", - "comment": "Success notification shown after pausing an active alert" + "text": "Success. The alert has been paused.", + "crowdinContext": "Success notification shown after pausing an active alert" }, "insightAlert.config.update.success": { - "value": "Success. The alert has been updated.", - "comment": "Success notification shown after modifying an existing alert" + "text": "Success. The alert has been updated.", + "crowdinContext": "Success notification shown after modifying an existing alert" }, "insightAlert.config.add.success": { - "value": "Success. The alert has been added.", - "comment": "Success notification shown after creating a new alert" + "text": "Success. The alert has been added.", + "crowdinContext": "Success notification shown after creating a new alert" }, "insightAlert.config.delete.title": { - "value": "Delete alert?", - "comment": "Confirmation dialog title when deleting an alert" + "text": "Delete alert?", + "crowdinContext": "Confirmation dialog title when deleting an alert" }, "insightAlert.config.delete.message": { - "value": "The alert for {title} will be permanently deleted, along with all its notifications.", - "comment": "Warning message shown when deleting an alert, with the alert name emphasized" + "text": "The alert for {title} will be permanently deleted, along with all its notifications.", + "crowdinContext": "Warning message shown when deleting an alert, with the alert name emphasized" }, "insightAlert.noDestination.tooltip": { - "value": "No destination available. Create a destination to set up an alert.", - "comment": "Tooltip shown when no alert destinations are configured, with a clickable link" + "text": "No destination available. Create a destination to set up an alert.", + "crowdinContext": "Tooltip shown when no alert destinations are configured, with a clickable link" }, "insightAlert.maxAlertsReached": { - "value": "Your organization has reached the limit of alerts. Contact your administrator to create more.", - "comment": "Error message shown when organization has reached maximum number of alerts" + "text": "Your organization has reached the limit of alerts. Contact your administrator to create more.", + "crowdinContext": "Error message shown when organization has reached maximum number of alerts" }, "insightAlert.executionTimestampMode": { - "value": "To create or edit alerts, reset the dashboard date to today.", - "comment": "Warning shown when trying to configure alerts with a historical date selected" + "text": "To create or edit alerts, reset the dashboard date to today.", + "crowdinContext": "Warning shown when trying to configure alerts with a historical date selected" }, "insightAlert.config.loading.error": { - "value": "Failed to load necessary information. Try again later.", - "comment": "Error message shown when alert configuration data cannot be loaded" + "text": "Failed to load necessary information. Try again later.", + "crowdinContext": "Error message shown when alert configuration data cannot be loaded" }, "insightAlert.config.save.error": { - "value": "Failed to save alert. Try again later.", - "comment": "Error message shown when alert cannot be saved" + "text": "Failed to save alert. Try again later.", + "crowdinContext": "Error message shown when alert cannot be saved" }, "insightAlert.config.delete.error": { - "value": "Failed to delete alert. Try again later.", - "comment": "Error message shown when alert cannot be deleted" + "text": "Failed to delete alert. Try again later.", + "crowdinContext": "Error message shown when alert cannot be deleted" }, "insightAlert.config.invalid": { - "value": "This alert configuration is incorrect. Please update it or contact your administrator.", - "comment": "Error message for alert configuration" + "text": "This alert configuration is incorrect. Please update it or contact your administrator.", + "crowdinContext": "Error message for alert configuration" }, "insightAlert.config.invalidWidget": { - "value": "Error: Alert can't be sent — the source widget was deleted. Delete the alert or contact your administrator.", - "comment": "Error message for alert configuration" + "text": "Error: Alert can't be sent — the source widget was deleted. Delete the alert or contact your administrator.", + "crowdinContext": "Error message for alert configuration" }, "insightAlert.config.missingThreshold": { - "value": "Error: Required field — enter a threshold value to continue.", - "comment": "Error message when threshold value is not provided in alert configuration" + "text": "Error: Required field — enter a threshold value to continue.", + "crowdinContext": "Error message when threshold value is not provided in alert configuration" }, "insightAlert.config.selectMetric": { - "value": "Select a metric", - "comment": "Label of metric select dropdown" + "text": "Select a metric", + "crowdinContext": "Label of metric select dropdown" }, "insightAlert.config.selectAttribute": { - "value": "All", - "comment": "Label of attribute select dropdown" + "text": "All", + "crowdinContext": "Label of attribute select dropdown" }, "insightAlert.config.accessbility.input": { - "value": "Condition value", - "comment": "Accessibility label for alert threshold input field" + "text": "Condition value", + "crowdinContext": "Accessibility label for alert threshold input field" }, "alert.accessibility.destination.label": { - "value": "Select how to send the alert", - "comment": "Accessibility label for alert destination dropdown" + "text": "Select how to send the alert", + "crowdinContext": "Accessibility label for alert destination dropdown" }, "granularity.this_keyword": { - "value": "This", - "comment": "Label that says 'This' in the context of time period. For example 'This month', 'This year'." + "text": "This", + "crowdinContext": "Label that says 'This' in the context of time period. For example 'This month', 'This year'." }, "granularity.year": { - "value": "year", - "comment": "Label of current selected granularity type. Is used in alert create dialog." + "text": "year", + "crowdinContext": "Label of current selected granularity type. Is used in alert create dialog." }, "granularity.week": { - "value": "week", - "comment": "Label of current selected granularity type. Is used in alert create dialog." + "text": "week", + "crowdinContext": "Label of current selected granularity type. Is used in alert create dialog." }, "granularity.quarter": { - "value": "quarter", - "comment": "Label of current selected granularity type. Is used in alert create dialog." + "text": "quarter", + "crowdinContext": "Label of current selected granularity type. Is used in alert create dialog." }, "granularity.month": { - "value": "month", - "comment": "Label of current selected granularity type. Is used in alert create dialog." + "text": "month", + "crowdinContext": "Label of current selected granularity type. Is used in alert create dialog." }, "granularity.date": { - "value": "day", - "comment": "Label of current selected granularity type. Is used in alert create dialog." + "text": "day", + "crowdinContext": "Label of current selected granularity type. Is used in alert create dialog." }, "granularity.hour": { - "value": "hour", - "comment": "Label of current selected granularity type. Is used in alert create dialog." + "text": "hour", + "crowdinContext": "Label of current selected granularity type. Is used in alert create dialog." }, "granularity.minute": { - "value": "minute", - "comment": "Label of current selected granularity type. Is used in alert create dialog." + "text": "minute", + "crowdinContext": "Label of current selected granularity type. Is used in alert create dialog." }, "widget.options.menu.export": { - "value": "Export", - "comment": "Export to file with XLSX extension." + "text": "Export", + "crowdinContext": "Export to file with XLSX extension." }, "menu.close": { - "value": "Close menu", - "comment": "Button label to close a menu" + "text": "Close menu", + "crowdinContext": "Button label to close a menu" }, "controlButtons.asTable": { - "value": "Show as table", - "comment": "Message displayed in filter alert showing a relative date range with calendar icon. Example: 'in (calendar icon) last 7 days'." + "text": "Show as table", + "crowdinContext": "Message displayed in filter alert showing a relative date range with calendar icon. Example: 'in (calendar icon) last 7 days'." }, "controlButtons.asOriginal": { - "value": "Show original visualization", - "comment": "Message displayed in filter alert showing a relative date range with calendar icon. Example: 'in (calendar icon) last 7 days'." + "text": "Show original visualization", + "crowdinContext": "Message displayed in filter alert showing a relative date range with calendar icon. Example: 'in (calendar icon) last 7 days'." }, "controlButtons.announcement.switchedToTable": { - "value": "Visualization switched to table view", - "comment": "Screen reader announcement when a chart is switched to table format for better accessibility" + "text": "Visualization switched to table view", + "crowdinContext": "Screen reader announcement when a chart is switched to table format for better accessibility" }, "controlButtons.announcement.switchedToOriginal": { - "value": "Visualization switched back to original view", - "comment": "Screen reader announcement when a table is switched back to chart format for better accessibility" + "text": "Visualization switched back to original view", + "crowdinContext": "Screen reader announcement when a table is switched back to chart format for better accessibility" }, "automationFilters.announcement.filterAdded": { - "value": "Filter {title} added.", - "comment": "Screen reader announcement when a filter is added to automation configuration. Example: 'Filter Department added.'" + "text": "Filter {title} added.", + "crowdinContext": "Screen reader announcement when a filter is added to automation configuration. Example: 'Filter Department added.'" }, "automationFilters.announcement.filterRemoved": { - "value": "Filter {title} removed.", - "comment": "Screen reader announcement when a filter is removed from automation configuration. Example: 'Filter Department removed.'" + "text": "Filter {title} removed.", + "crowdinContext": "Screen reader announcement when a filter is removed from automation configuration. Example: 'Filter Department removed.'" }, "automationFilters.announcement.filterChanged": { - "value": "Filter {title} changed.", - "comment": "Screen reader announcement when a filter's settings are modified in automation configuration. Example: 'Filter Department changed.'" + "text": "Filter {title} changed.", + "crowdinContext": "Screen reader announcement when a filter's settings are modified in automation configuration. Example: 'Filter Department changed.'" }, "dashboard.crossFilter.success": { - "value": "Success: {count, plural, one {# filter} other {# filters}} applied from the chart.", - "comment": "Success message shown when cross filters are applied from a chart visualization." + "text": "Success: {count, plural, one {# filter} other {# filters}} applied from the chart.", + "crowdinContext": "Success message shown when cross filters are applied from a chart visualization." }, "kdaDialog.dialog.filters.title": { - "value": "Filters", - "comment": "Filters title in key driver analysis dialog" + "text": "Filters", + "crowdinContext": "Filters title in key driver analysis dialog" }, "kdaDialog.dialog.filters.noFilters": { - "value": "No filters", - "comment": "No filters message in key driver analysis dialog" + "text": "No filters", + "crowdinContext": "No filters message in key driver analysis dialog" }, "kdaDialog.dialog.filters.add.tooltip": { - "value": "Add filter", - "comment": "Add filter tooltip in key driver analysis dialog" + "text": "Add filter", + "crowdinContext": "Add filter tooltip in key driver analysis dialog" }, "kdaDialog.dialog.filters.search": { - "value": "Search", - "comment": "Search placeholder in key driver analysis dialog" + "text": "Search", + "crowdinContext": "Search placeholder in key driver analysis dialog" }, "kdaDialog.dialog.title": { - "value": "Key driver analysis for {metric}", - "comment": "Dialog title for key driver analysis" + "text": "Key driver analysis for {metric}", + "crowdinContext": "Dialog title for key driver analysis" }, "kdaDialog.dialog.closeLabel": { - "value": "Close", - "comment": "Dialog close button label" + "text": "Close", + "crowdinContext": "Dialog close button label" + }, + "kdaDialog.floatingStatus.step1": { + "text": "Using AI to select key attributes…", + "crowdinContext": "Status message shown in the minimized floating status bar while the system is selecting relevant attributes for the analysis." + }, + "kdaDialog.floatingStatus.step2": { + "text": "Computing key drivers…", + "crowdinContext": "Status message shown in the minimized floating status bar while the analysis request is running and key drivers are being computed." + }, + "kdaDialog.floatingStatus.done": { + "text": "Analysis is ready", + "crowdinContext": "Status message shown in the minimized floating status bar when the analysis results are ready to be viewed." + }, + "kdaDialog.floatingStatus.error": { + "text": "Analysis failed — expand for more details", + "crowdinContext": "Status message shown in the minimized floating status bar when the analysis fails. Instructs the user to expand the dialog to see error details." + }, + "kdaDialog.floatingStatus.expand": { + "text": "Expand", + "crowdinContext": "Accessibility label for the icon button that expands the minimized floating status bar into the full Key Driver Analysis dialog." + }, + "kdaDialog.floatingStatus.minimize": { + "text": "Minimize", + "crowdinContext": "Accessibility label for the icon button that collapses the full Key Driver Analysis dialog into the minimized floating status bar." + }, + "kdaDialog.replaceConfirmation.headline": { + "text": "Replace current key driver analysis?", + "crowdinContext": "Confirmation dialog title shown when a user triggers a different key driver analysis while one is already in progress or displayed." + }, + "kdaDialog.replaceConfirmation.message": { + "text": "A key driver analysis is already in progress or displayed. Starting a new one will discard the current results.", + "crowdinContext": "Confirmation dialog body text explaining that starting a new analysis will discard the current analysis results." + }, + "kdaDialog.replaceConfirmation.stay": { + "text": "Stay", + "crowdinContext": "Secondary button label in the replace-analysis confirmation dialog that keeps the current analysis." + }, + "kdaDialog.replaceConfirmation.runAnyway": { + "text": "Run anyway", + "crowdinContext": "Primary destructive button label in the replace-analysis confirmation dialog that starts the new analysis." }, "kdaDialog.dialog.bars.metric.title": { - "value": "Metric", - "comment": "Metric title in key driver analysis dialog" + "text": "Metric", + "crowdinContext": "Metric title in key driver analysis dialog" }, "kdaDialog.dialog.bars.filters.title": { - "value": "Filters", - "comment": "Filters title in key driver analysis dialog" + "text": "Filters", + "crowdinContext": "Filters title in key driver analysis dialog" }, "kdaDialog.dialog.bars.date.title": { - "value": "Date range: {title}", - "comment": "Date range title in key driver analysis dialog" + "text": "Date range: {title}", + "crowdinContext": "Date range title in key driver analysis dialog" }, "kdaDialog.dialog.bars.date.splitter": { - "value": "vs", - "comment": "Date range splitter in key driver analysis dialog" + "text": "vs", + "crowdinContext": "Date range splitter in key driver analysis dialog" }, "kdaDialog.dialog.keyDrives.title": { - "value": "Key drivers", - "comment": "Key drivers title in key driver analysis dialog" + "text": "Key drivers", + "crowdinContext": "Key drivers title in key driver analysis dialog" }, "kdaDialog.dialog.keyDrives.tooltip": { - "value": "List of key drivers sorted by impact", - "comment": "Key drivers tooltip in key driver analysis dialog" + "text": "List of key drivers sorted by impact", + "crowdinContext": "Key drivers tooltip in key driver analysis dialog" }, "kdaDialog.dialog.keyDrives.button.trendUp": { - "value": "Increasing ({count})", - "comment": "Key drivers button trend up in key driver analysis dialog" + "text": "Increasing ({count})", + "crowdinContext": "Key drivers button trend up in key driver analysis dialog" }, "kdaDialog.dialog.keyDrives.button.trendDown": { - "value": "Decreasing ({count})", - "comment": "Key drivers button trend down in key driver analysis dialog" + "text": "Decreasing ({count})", + "crowdinContext": "Key drivers button trend down in key driver analysis dialog" }, "kdaDialog.dialog.keyDrives.overview.summary.title": { - "value": "Analysis summary", - "comment": "Key drivers overview summary title in key driver analysis dialog" + "text": "Analysis summary", + "crowdinContext": "Key drivers overview summary title in key driver analysis dialog" }, "kdaDialog.dialog.keyDrives.overview.summary.drivers.description": { - "value": "Tested {combinations} variants with ", - "comment": "Key drivers overview summary drivers description in key driver analysis dialog" + "text": "Tested {combinations} variants with ", + "crowdinContext": "Key drivers overview summary drivers description in key driver analysis dialog" }, "kdaDialog.dialog.keyDrives.overview.summary.drivers.attributes": { - "value": "Attributes", - "comment": "Key drivers overview summary drivers attributes in key driver analysis dialog" + "text": "Attributes", + "crowdinContext": "Key drivers overview summary drivers attributes in key driver analysis dialog" }, "kdaDialog.dialog.keyDrives.overview.diff.title": { - "value": "Diff", - "comment": "Key drivers overview diff title in key driver analysis dialog" + "text": "Diff", + "crowdinContext": "Key drivers overview diff title in key driver analysis dialog" }, "kdaDialog.dialog.keyDrives.overview.detail.tip": { - "value": "Click on column to see key drivers for given {category}", - "comment": "Key drivers overview detail tip in key driver analysis dialog" + "text": "Click on column to see key drivers for given {category}", + "crowdinContext": "Key drivers overview detail tip in key driver analysis dialog" }, "kdaDialog.dialog.keyDrives.overview.detail.title": { - "value": "Change in {title} by {category}", - "comment": "Key drivers overview detail title in key driver analysis dialog" + "text": "Change in {title} by {category}", + "crowdinContext": "Key drivers overview detail title in key driver analysis dialog" }, "kdaDialog.dialog.keyDrives.overview.detail.table.attribute": { - "value": "Attribute", - "comment": "Key drivers overview detail table attribute column header in key driver analysis dialog" + "text": "Attribute", + "crowdinContext": "Key drivers overview detail table attribute column header in key driver analysis dialog" }, "kdaDialog.dialog.keyDrives.overview.detail.table.driver": { - "value": "Most significant driver", - "comment": "Key drivers overview detail table driver column header in key driver analysis dialog" + "text": "Most significant driver", + "crowdinContext": "Key drivers overview detail table driver column header in key driver analysis dialog" }, "kdaDialog.dialog.keyDrives.overview.detail.table.drivers": { - "value": "Num. of drivers", - "comment": "Key drivers overview detail table drivers column header in key driver analysis dialog" + "text": "Num. of drivers", + "crowdinContext": "Key drivers overview detail table drivers column header in key driver analysis dialog" }, "kdaDialog.dialog.bars.attribute.deleteLabel": { - "value": "Remove attribute filter", - "comment": "Key drivers dialog attribute delete label in key driver analysis dialog" + "text": "Remove attribute filter", + "crowdinContext": "Key drivers dialog attribute delete label in key driver analysis dialog" }, "kdaDialog.dialog.bars.date.period.title": { - "value": "Period comparison", - "comment": "Key drivers dialog date title in key driver analysis dialog" + "text": "Period comparison", + "crowdinContext": "Key drivers dialog date title in key driver analysis dialog" }, "kdaDialog.dialog.bars.date.period.samePeriodPreviousYear": { - "value": "Same period previous year", - "comment": "Key drivers dialog date same period previous year in key driver analysis dialog" + "text": "Same period previous year", + "crowdinContext": "Key drivers dialog date same period previous year in key driver analysis dialog" }, "kdaDialog.dialog.bars.date.period.previousPeriod": { - "value": "Previous period", - "comment": "Key drivers dialog date previous period in key driver analysis dialog" + "text": "Previous period", + "crowdinContext": "Key drivers dialog date previous period in key driver analysis dialog" }, "kdaDialog.dialog.keyDrives.empty_up": { - "value": "No increasing drivers", - "comment": "Key drivers dialog empty up in key driver analysis dialog" + "text": "No increasing drivers", + "crowdinContext": "Key drivers dialog empty up in key driver analysis dialog" }, "kdaDialog.dialog.keyDrives.empty_down": { - "value": "No decreasing drivers", - "comment": "Key drivers dialog empty down in key driver analysis dialog" + "text": "No decreasing drivers", + "crowdinContext": "Key drivers dialog empty down in key driver analysis dialog" }, "kdaDialog.dialog.keyDrives.empty": { - "value": "No key drivers", - "comment": "Key drivers dialog empty in key driver analysis dialog" + "text": "No key drivers", + "crowdinContext": "Key drivers dialog empty in key driver analysis dialog" }, "kdaDialog.dialog.keyDriver.chart.std": { - "value": "Change Significance Threshold", - "comment": "Key driver chart standard deviation title in key driver analysis chart" + "text": "Change Significance Threshold", + "crowdinContext": "Key driver chart standard deviation title in key driver analysis chart" }, "menu.back": { - "value": "Back to the parent menu", - "comment": "Button label for navigating back to the parent menu in a nested menu structure. Used in hierarchical navigation." + "text": "Back to the parent menu", + "crowdinContext": "Button label for navigating back to the parent menu in a nested menu structure. Used in hierarchical navigation." }, "drill.kda.from": { - "value": "from", - "comment": "Key driver analysis drill from label, must be lowercase" + "text": "from", + "crowdinContext": "Key driver analysis drill from label, must be lowercase" }, "drill.kda.in": { - "value": "in", - "comment": "Key driver analysis drill in label, must be lowercase" + "text": "in", + "crowdinContext": "Key driver analysis drill in label, must be lowercase" }, "drill.kda.drop": { - "value": "Drop {where} {title}", - "comment": "Key driver analysis drill drop label" + "text": "Drop {where} {title}", + "crowdinContext": "Key driver analysis drill drop label" }, "drill.kda.increase": { - "value": "Increase {where} {title}", - "comment": "Key driver analysis drill increase label" + "text": "Increase {where} {title}", + "crowdinContext": "Key driver analysis drill increase label" }, "drill.kda.no_change": { - "value": "Stale {where} {title}", - "comment": "Key driver analysis drill increase label" + "text": "Stale {where} {title}", + "crowdinContext": "Key driver analysis drill increase label" }, "drill.kda.year_to_year": { - "value": "Year over year change", - "comment": "Key driver analysis drill year to year label" + "text": "Year over year change", + "crowdinContext": "Key driver analysis drill year to year label" }, "dashboard.tabs.default.label": { - "value": "Untitled tab", - "comment": "Default label for dashboard tab" + "text": "Untitled tab", + "crowdinContext": "Default label for dashboard tab" }, "dashboard.tabs.move.left": { - "value": "Move left", - "comment": "Label for the action that moves the tab to the left" + "text": "Move left", + "crowdinContext": "Label for the action that moves the tab to the left" }, "dashboard.tabs.move.right": { - "value": "Move right", - "comment": "Label for the action that moves the tab to the right" + "text": "Move right", + "crowdinContext": "Label for the action that moves the tab to the right" }, "dashboard.tabs.delete.disabled-tooltip": { - "value": "You can’t delete the last tab. Tab navigation won’t be visible in view mode when only one tab remains.", - "comment": "The tooltip shown when the user tries to delete the last tab" + "text": "You can’t delete the last tab. Tab navigation won’t be visible in view mode when only one tab remains.", + "crowdinContext": "The tooltip shown when the user tries to delete the last tab" }, "dashboard.tabs.add-button-tooltip": { - "value": "Add new tab", - "comment": "Tooltip for a button that adds a new tab" + "text": "Add new tab", + "crowdinContext": "Tooltip for a button that adds a new tab" }, "dashboard.tabs.rename": { - "value": "Rename", - "comment": "Label for the action that toggles the tab to renaming mode" + "text": "Rename", + "crowdinContext": "Label for the action that toggles the tab to renaming mode" }, "dashboard.tabs.accessibility.label": { - "value": "Dashboard tabs", - "comment": "Accessibility label for dashboard tabs" + "text": "Dashboard tabs", + "crowdinContext": "Accessibility label for dashboard tabs" }, "dashboard.tabs.accessibility.add-button-label": { - "value": "Add new tab", - "comment": "Accessibility label for a button that adds a new tab" + "text": "Add new tab", + "crowdinContext": "Accessibility label for a button that adds a new tab" } } diff --git a/libs/sdk-ui-dashboard/src/presentation/widget/insight/ViewModeDashboardInsight/DashboardInsightWithDrillDialog.tsx b/libs/sdk-ui-dashboard/src/presentation/widget/insight/ViewModeDashboardInsight/DashboardInsightWithDrillDialog.tsx index aba20220ed1..cfe1c18d184 100644 --- a/libs/sdk-ui-dashboard/src/presentation/widget/insight/ViewModeDashboardInsight/DashboardInsightWithDrillDialog.tsx +++ b/libs/sdk-ui-dashboard/src/presentation/widget/insight/ViewModeDashboardInsight/DashboardInsightWithDrillDialog.tsx @@ -1,4 +1,4 @@ -// (C) 2020-2025 GoodData Corporation +// (C) 2020-2026 GoodData Corporation import { type ReactElement, useCallback, useMemo, useState } from "react"; @@ -7,7 +7,7 @@ import { type IDrillEventContext, createFocusHighchartsDatapointEvent } from "@g import { DashboardInsightWithDrillSelect } from "./Insight/DashboardInsightWithDrillSelect.js"; import { InsightDrillDialog } from "./InsightDrillDialog/InsightDrillDialog.js"; -import { KdaDialog as KdaDialogComponent, KdaProvider } from "../../../../kdaDialog/internal.js"; +import { KdaDialogController } from "../../../../kdaDialog/internal.js"; import { selectCatalogAttributeDisplayFormsById, selectEnableDrilledTooltip, @@ -137,6 +137,18 @@ export function DashboardInsightWithDrillDialog(props: IDashboardInsightProps): setKeyDriveInfo(undefined); }, [returnFocusToInsight]); + const onRequestedDefinitionChange = useCallback( + (definition: KeyDriveInfo["keyDriveDefinition"] | undefined) => { + // Keep the drill-derived state in sync with the controller + if (!definition) { + setKeyDriveInfo(undefined); + return; + } + setKeyDriveInfo((prev) => (prev ? { ...prev, keyDriveDefinition: definition } : prev)); + }, + [], + ); + return ( <> ) : null} - {keyDriveInfo ? ( - - - - ) : null} + ); } diff --git a/libs/sdk-ui-dashboard/src/presentation/widget/insight/ViewModeDashboardInsight/InsightDrillDialog/useDrillDialogInsightDrills.ts b/libs/sdk-ui-dashboard/src/presentation/widget/insight/ViewModeDashboardInsight/InsightDrillDialog/useDrillDialogInsightDrills.ts index 9f450baa45a..35f919f4887 100644 --- a/libs/sdk-ui-dashboard/src/presentation/widget/insight/ViewModeDashboardInsight/InsightDrillDialog/useDrillDialogInsightDrills.ts +++ b/libs/sdk-ui-dashboard/src/presentation/widget/insight/ViewModeDashboardInsight/InsightDrillDialog/useDrillDialogInsightDrills.ts @@ -1,4 +1,4 @@ -// (C) 2020-2025 GoodData Corporation +// (C) 2020-2026 GoodData Corporation import { useCallback, useState } from "react"; diff --git a/libs/sdk-ui-dashboard/styles/scss/kdaDialog.scss b/libs/sdk-ui-dashboard/styles/scss/kdaDialog.scss index daf880745e4..b4c315743c4 100644 --- a/libs/sdk-ui-dashboard/styles/scss/kdaDialog.scss +++ b/libs/sdk-ui-dashboard/styles/scss/kdaDialog.scss @@ -1,11 +1,163 @@ // (C) 2025 GoodData Corporation -@use "@gooddata/sdk-ui-kit/styles/scss/variables" as kit-variables; + +@keyframes gd-kda-dialog-enter-minimized { + 0% { + opacity: 0; + transform: scale(0.97); + } + + 100% { + opacity: 1; + transform: scale(1); + } +} + +@keyframes gd-kda-dialog-enter-expanded { + 0% { + opacity: 0; + transform: scale(0.97); + } + + 100% { + opacity: 1; + transform: scale(1); + } +} + +@keyframes gd-kda-success-enter { + 0% { + opacity: 0; + transform: scale(0.85); + } + + 60% { + transform: scale(1.08); + } + + 100% { + opacity: 1; + transform: scale(1); + } +} .gd-kda-dialog { width: 948px; height: 704px; //stylelint-disable-next-line max-width: none !important; + transform-origin: top center; + + // Override sdk-ui-kit default dialog styles for minimized floating status bar. + &.gd-kda-dialog--minimized { + &#{&} { + width: 326px; + height: 35px; + padding: 4px 5px 4px 10px; + border-radius: 4px; + border-width: 1px; + border-color: var(--gd-palette-complementary-3); + box-shadow: 0 2px 10px 0 rgb(0 0 0 / 10%); + animation: gd-kda-dialog-enter-minimized 200ms cubic-bezier(0.22, 1, 0.36, 1) 50ms both; + } + } + + // Align expanded dialog actions with the header title row. + &.gd-kda-dialog--expanded { + &#{&} { + animation: gd-kda-dialog-enter-expanded 200ms cubic-bezier(0.22, 1, 0.36, 1) 50ms both; + + .gd-kda-dialog-controls { + top: 20px; + } + } + } + + .gd-kda-dialog-controls { + display: flex; + align-items: center; + gap: 5px; + } + + .gd-kda-dialog-action-buttons { + display: flex; + align-items: center; + + &__button { + display: flex; + cursor: pointer; + } + + &__divider { + width: 1px; + background-color: var(--gd-palette-complementary-3); + } + + &--size-small { + gap: 3px; + + .gd-ui-kit-icon-button { + width: 22px; + height: 22px; + + svg { + width: 14px; + height: 14px; + } + } + + .gd-kda-dialog-action-buttons__divider { + height: 17px; + } + } + + &--size-medium { + gap: 5px; + + .gd-kda-dialog-action-buttons__divider { + height: 32px; + } + } + } + + .gd-kda-floating-status-bar { + display: flex; + gap: 10px; + align-items: center; + height: 100%; + + &__content { + display: flex; + flex: 1 0 0; + gap: 5px; + align-items: center; + min-width: 0; + + // Play a short transition when the success icon appears (status transitions to `done`). + // This relies on the icon being conditionally mounted only in the `done` state. + .gd-ui-kit-icon--color-success { + animation: gd-kda-success-enter 250ms cubic-bezier(0.22, 1, 0.36, 1); + transform-origin: center; + } + } + + &__spinner { + display: flex; + } + + &__text { + flex: 1 0 0; + min-width: 0; + margin: 0; + color: var(--gd-palette-complementary-7); + font-size: 12px; + font-style: normal; + font-weight: 400; + line-height: 17px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + } //dialog sections - structure .gd-kda-dialog-sections { @@ -59,7 +211,7 @@ white-space: nowrap; overflow: hidden; text-overflow: ellipsis; - margin-right: 30px; + margin-right: 60px; } } @@ -564,6 +716,21 @@ } } +@media (prefers-reduced-motion: reduce) { + .gd-kda-dialog { + &#{&} { + transition: none; + animation: none; + } + } + + .gd-kda-floating-status-bar__content { + .gd-ui-kit-icon--color-success { + animation: none; + } + } +} + //date select in popover .gd-kda-dialog-bar__date-select { margin-top: -10px; diff --git a/libs/sdk-ui-ext/package.json b/libs/sdk-ui-ext/package.json index 26a7225c9ec..4298f8cd3b1 100644 --- a/libs/sdk-ui-ext/package.json +++ b/libs/sdk-ui-ext/package.json @@ -154,7 +154,7 @@ "stylelint-checkstyle-formatter": "^0.1.2", "stylelint-config-prettier": "^9.0.5", "svgo": "^2.8.0", - "typescript": "5.8.3", + "typescript": "5.9.3", "vitest": "3.2.4", "vitest-dom": "0.1.1" }, diff --git a/libs/sdk-ui-ext/src/internal/components/configurationControls/DataLabelsControl.tsx b/libs/sdk-ui-ext/src/internal/components/configurationControls/DataLabelsControl.tsx index 681bfe34cad..b292386767a 100644 --- a/libs/sdk-ui-ext/src/internal/components/configurationControls/DataLabelsControl.tsx +++ b/libs/sdk-ui-ext/src/internal/components/configurationControls/DataLabelsControl.tsx @@ -30,7 +30,7 @@ export function DataLabelsControl({ isTotalsDisabled = true, enableSeparateTotalLabels = false, enablePercentLabels, - enableStyleSelector, + enableStyleSelector = true, }: IDataLabelsControlProps) { const intl = useIntl(); const dataLabels = properties?.controls?.["dataLabels"]?.visible ?? defaultValue; diff --git a/libs/sdk-ui-ext/src/internal/components/configurationControls/GeoViewportControl.tsx b/libs/sdk-ui-ext/src/internal/components/configurationControls/GeoViewportControl.tsx new file mode 100644 index 00000000000..1d83316fc4c --- /dev/null +++ b/libs/sdk-ui-ext/src/internal/components/configurationControls/GeoViewportControl.tsx @@ -0,0 +1,50 @@ +// (C) 2025-2026 GoodData Corporation + +import { type ReactElement } from "react"; + +import { useIntl } from "react-intl"; + +import { type IGeoConfigViewport } from "@gooddata/sdk-ui-geo"; + +import { DropdownControl } from "./DropdownControl.js"; +import { messages } from "../../../locales.js"; +import { pushpinViewportDropdownItems } from "../../constants/dropdowns.js"; +import { type IVisualizationProperties } from "../../interfaces/Visualization.js"; +import { getTranslatedDropdownItems } from "../../utils/translations.js"; + +export interface IGeoViewportControl { + disabled: boolean; + properties: IVisualizationProperties; + pushData: (data: any) => any; + className?: string; +} + +function getViewportProperty(props: IGeoViewportControl): IGeoConfigViewport { + return props.properties?.controls?.["viewport"] ?? { area: "auto" }; +} + +/** + * Generic viewport control for geo charts (pushpin and area). + * Allows users to select a default viewport preset (auto, world, or continent). + * + * @internal + */ +export function GeoViewportControl(props: IGeoViewportControl): ReactElement { + const intl = useIntl(); + const { area } = getViewportProperty(props); + const { disabled, properties, pushData, className = "s-geo-viewport-control" } = props; + return ( +
+ +
+ ); +} diff --git a/libs/sdk-ui-ext/src/internal/components/configurationControls/PushpinViewportControl.tsx b/libs/sdk-ui-ext/src/internal/components/configurationControls/PushpinViewportControl.tsx index aaa47432011..646eb6689dd 100644 --- a/libs/sdk-ui-ext/src/internal/components/configurationControls/PushpinViewportControl.tsx +++ b/libs/sdk-ui-ext/src/internal/components/configurationControls/PushpinViewportControl.tsx @@ -1,43 +1,21 @@ -// (C) 2020-2025 GoodData Corporation +// (C) 2020-2026 GoodData Corporation import { type ReactElement } from "react"; -import { useIntl } from "react-intl"; - -import { type IGeoConfigViewport } from "@gooddata/sdk-ui-geo"; - -import { DropdownControl } from "./DropdownControl.js"; -import { messages } from "../../../locales.js"; -import { pushpinViewportDropdownItems } from "../../constants/dropdowns.js"; -import { type IVisualizationProperties } from "../../interfaces/Visualization.js"; -import { getTranslatedDropdownItems } from "../../utils/translations.js"; +import { GeoViewportControl, type IGeoViewportControl } from "./GeoViewportControl.js"; export interface IPushpinViewportControl { disabled: boolean; - properties: IVisualizationProperties; - pushData: (data: any) => any; -} - -function getPushpinProperty(props: IPushpinViewportControl): IGeoConfigViewport { - return props.properties?.controls?.["viewport"] ?? { area: "auto" }; + properties: IGeoViewportControl["properties"]; + pushData: IGeoViewportControl["pushData"]; } +/** + * Viewport control for pushpin charts. + * Thin wrapper around GeoViewportControl for backward compatibility. + * + * @internal + */ export function PushpinViewportControl(props: IPushpinViewportControl): ReactElement { - const intl = useIntl(); - const { area } = getPushpinProperty(props); - const { disabled, properties, pushData } = props; - return ( -
- -
- ); + return ; } diff --git a/libs/sdk-ui-ext/src/internal/components/configurationControls/colors/ColorsSection.tsx b/libs/sdk-ui-ext/src/internal/components/configurationControls/colors/ColorsSection.tsx index 111ef507878..97483e75e56 100644 --- a/libs/sdk-ui-ext/src/internal/components/configurationControls/colors/ColorsSection.tsx +++ b/libs/sdk-ui-ext/src/internal/components/configurationControls/colors/ColorsSection.tsx @@ -27,7 +27,6 @@ export interface IColorsSectionProps { hasMeasures: boolean; colors: IColorConfiguration; isLoading: boolean; - isChartAccessibilityFeaturesEnabled: boolean; supportsChartFill: boolean; chartFillIgnoredMeasures?: string[]; isChartFillDisabled?: boolean; @@ -43,7 +42,6 @@ export function ColorsSection({ hasMeasures, colors, isLoading, - isChartAccessibilityFeaturesEnabled, supportsChartFill, chartFillIgnoredMeasures = [], isChartFillDisabled, @@ -103,7 +101,7 @@ export function ColorsSection({ }; const renderFillDropdown = () => { - if (!isChartAccessibilityFeaturesEnabled || !supportsChartFill) { + if (!supportsChartFill) { return null; } const isDisabled = @@ -164,10 +162,9 @@ export function ColorsSection({ return isColoredListVisible() ? renderColoredList() : renderUnsupportedColoredList(); }; - const sectionTitleTranslationId = - isChartAccessibilityFeaturesEnabled && supportsChartFill - ? messages["colorsAndFills"].id - : messages["colors"].id; + const sectionTitleTranslationId = supportsChartFill + ? messages["colorsAndFills"].id + : messages["colors"].id; return ( { it("should render ColorSection with fills", () => { createComponent({ supportsChartFill: true, - isChartAccessibilityFeaturesEnabled: true, }); expect(screen.getByText("Colors and fills")).toBeInTheDocument(); diff --git a/libs/sdk-ui-ext/src/internal/components/configurationControls/tests/DataLabelsControl.test.tsx b/libs/sdk-ui-ext/src/internal/components/configurationControls/tests/DataLabelsControl.test.tsx index 6bcb1f6a52f..1017725f5eb 100644 --- a/libs/sdk-ui-ext/src/internal/components/configurationControls/tests/DataLabelsControl.test.tsx +++ b/libs/sdk-ui-ext/src/internal/components/configurationControls/tests/DataLabelsControl.test.tsx @@ -53,12 +53,17 @@ describe("DataLabelsControl", () => { createComponent({ isDisabled: true, }); - expect(screen.getByRole("combobox")).toHaveClass("disabled"); + const buttons = screen.getAllByRole("combobox"); + // Both Data Labels and Labels Style dropdowns should be disabled + expect(buttons[0]).toHaveClass("disabled"); + expect(buttons[1]).toHaveClass("disabled"); }); it("should have `auto` by default", () => { createComponent(); - expect(screen.queryByText(AUTO_LABEL)).toBeInTheDocument(); + // Both Data Labels and Labels Style dropdowns have "auto (default)" by default + const autoLabels = screen.queryAllByText(AUTO_LABEL); + expect(autoLabels.length).toBeGreaterThanOrEqual(1); }); it("should show value that was passed", () => { diff --git a/libs/sdk-ui-ext/src/internal/components/configurationPanels/BaseChartConfigurationPanel.tsx b/libs/sdk-ui-ext/src/internal/components/configurationPanels/BaseChartConfigurationPanel.tsx index b97c7549e93..fac2afac008 100644 --- a/libs/sdk-ui-ext/src/internal/components/configurationPanels/BaseChartConfigurationPanel.tsx +++ b/libs/sdk-ui-ext/src/internal/components/configurationPanels/BaseChartConfigurationPanel.tsx @@ -37,7 +37,7 @@ export class BaseChartConfigurationPanel< protected renderCanvasSection(): ReactNode { const { gridEnabled } = this.getControlProperties(); - const { properties, propertiesMeta, pushData, featureFlags, insight } = this.props; + const { properties, propertiesMeta, pushData, insight } = this.props; const controlsDisabled = this.isControlDisabled(); const { buckets } = insight.insight; @@ -62,7 +62,6 @@ export class BaseChartConfigurationPanel< (isNotStacked && !properties?.controls?.["stackMeasures"]) } enableSeparateTotalLabels - enableStyleSelector={!!featureFlags.enableChartAccessibilityFeatures} /> 0; @@ -120,7 +111,6 @@ export abstract class ConfigurationPanelContent< pushData={pushData} hasMeasures={hasMeasures} isLoading={isLoading} - isChartAccessibilityFeaturesEnabled={!!featureFlags.enableChartAccessibilityFeatures} supportsChartFill={panelConfig.supportsChartFill} chartFillIgnoredMeasures={chartFillIgnoredMeasures} isChartFillDisabled={panelConfig.isChartFillDisabled} diff --git a/libs/sdk-ui-ext/src/internal/components/configurationPanels/FunnelChartConfigurationPanel.tsx b/libs/sdk-ui-ext/src/internal/components/configurationPanels/FunnelChartConfigurationPanel.tsx index 42dfac3039d..c2c19815c37 100644 --- a/libs/sdk-ui-ext/src/internal/components/configurationPanels/FunnelChartConfigurationPanel.tsx +++ b/libs/sdk-ui-ext/src/internal/components/configurationPanels/FunnelChartConfigurationPanel.tsx @@ -20,7 +20,7 @@ import { DataLabelsControl } from "../configurationControls/DataLabelsControl.js export class FunnelChartConfigurationPanel extends ConfigurationPanelContent { protected renderConfigurationPanel(): ReactNode { - const { propertiesMeta, properties, pushData, featureFlags } = this.props; + const { propertiesMeta, properties, pushData } = this.props; const controlsDisabled = this.isControlDisabled(); return ( @@ -41,7 +41,6 @@ export class FunnelChartConfigurationPanel extends ConfigurationPanelContent { properties={properties} isDisabled={controlsDisabled} defaultValue="auto" - enableStyleSelector={!!featureFlags.enableChartAccessibilityFeatures} enablePercentLabels /> diff --git a/libs/sdk-ui-ext/src/internal/components/configurationPanels/GeoAreaConfigurationPanel.tsx b/libs/sdk-ui-ext/src/internal/components/configurationPanels/GeoAreaConfigurationPanel.tsx index 452b9707329..1c5b80ded50 100644 --- a/libs/sdk-ui-ext/src/internal/components/configurationPanels/GeoAreaConfigurationPanel.tsx +++ b/libs/sdk-ui-ext/src/internal/components/configurationPanels/GeoAreaConfigurationPanel.tsx @@ -1,12 +1,15 @@ -// (C) 2025 GoodData Corporation +// (C) 2025-2026 GoodData Corporation -import { type ReactNode } from "react"; +import { type ReactElement, type ReactNode } from "react"; import { type IInsightDefinition, bucketIsEmpty, insightBucket } from "@gooddata/sdk-model"; import { BucketNames } from "@gooddata/sdk-ui"; import { ConfigurationPanelContent } from "./ConfigurationPanelContent.js"; +import { messages } from "../../../locales.js"; import { ColorsSection } from "../configurationControls/colors/ColorsSection.js"; +import { ConfigSection } from "../configurationControls/ConfigSection.js"; +import { GeoViewportControl } from "../configurationControls/GeoViewportControl.js"; /** * Configuration panel for GeoAreaChart @@ -21,6 +24,25 @@ import { ColorsSection } from "../configurationControls/colors/ColorsSection.js" * @internal */ export class GeoAreaConfigurationPanel extends ConfigurationPanelContent { + protected renderViewportSection(): ReactElement { + const { properties, propertiesMeta, pushData } = this.props; + return ( + + + + ); + } + protected renderConfigurationPanel(): ReactNode { return (
@@ -30,6 +52,9 @@ export class GeoAreaConfigurationPanel extends ConfigurationPanelContent { {/* Color Configuration */} {this.renderColorSection()} + {/* Viewport Configuration */} + {this.renderViewportSection()} + {/* Canvas Configuration */} {this.renderInteractionsSection()}
@@ -37,8 +62,7 @@ export class GeoAreaConfigurationPanel extends ConfigurationPanelContent { } protected override renderColorSection(): ReactNode { - const { properties, propertiesMeta, pushData, colors, featureFlags, references, isLoading } = - this.props; + const { properties, propertiesMeta, pushData, colors, references, isLoading } = this.props; const controlsDisabled = this.isControlDisabled(); return ( @@ -51,7 +75,6 @@ export class GeoAreaConfigurationPanel extends ConfigurationPanelContent { pushData={pushData} hasMeasures // color configuration is category-driven isLoading={isLoading} - isChartAccessibilityFeaturesEnabled={!!featureFlags.enableChartAccessibilityFeatures} supportsChartFill={false} /> ); diff --git a/libs/sdk-ui-ext/src/internal/components/configurationPanels/GeoPushpinConfigurationPanel.tsx b/libs/sdk-ui-ext/src/internal/components/configurationPanels/GeoPushpinConfigurationPanel.tsx index fbb7f832b04..0ff760a238e 100644 --- a/libs/sdk-ui-ext/src/internal/components/configurationPanels/GeoPushpinConfigurationPanel.tsx +++ b/libs/sdk-ui-ext/src/internal/components/configurationPanels/GeoPushpinConfigurationPanel.tsx @@ -139,8 +139,7 @@ export class GeoPushpinConfigurationPanel extends ConfigurationPanelContent { } protected override renderColorSection(): ReactNode { - const { properties, propertiesMeta, pushData, colors, featureFlags, references, isLoading } = - this.props; + const { properties, propertiesMeta, pushData, colors, references, isLoading } = this.props; const controlsDisabled = this.isControlDisabled(); @@ -154,7 +153,6 @@ export class GeoPushpinConfigurationPanel extends ConfigurationPanelContent { pushData={pushData} hasMeasures // hasMeasures is true because Color Config is based on Attribute isLoading={isLoading} - isChartAccessibilityFeaturesEnabled={!!featureFlags.enableChartAccessibilityFeatures} supportsChartFill={false} /> ); diff --git a/libs/sdk-ui-ext/src/internal/components/configurationPanels/HeatMapConfigurationPanel.tsx b/libs/sdk-ui-ext/src/internal/components/configurationPanels/HeatMapConfigurationPanel.tsx index b2e0ee1c036..104efbaf453 100644 --- a/libs/sdk-ui-ext/src/internal/components/configurationPanels/HeatMapConfigurationPanel.tsx +++ b/libs/sdk-ui-ext/src/internal/components/configurationPanels/HeatMapConfigurationPanel.tsx @@ -25,7 +25,7 @@ import { DataLabelsControl } from "../configurationControls/DataLabelsControl.js export class HeatMapConfigurationPanel extends ConfigurationPanelContent { protected renderConfigurationPanel(): ReactNode { - const { featureFlags, propertiesMeta, properties, pushData } = this.props; + const { propertiesMeta, properties, pushData } = this.props; const { xAxisVisible, yAxisVisible } = this.getControlProperties(); const controlsDisabled = this.isControlDisabled(); @@ -106,7 +106,6 @@ export class HeatMapConfigurationPanel extends ConfigurationPanelContent { properties={properties} isDisabled={controlsDisabled} defaultValue="auto" - enableStyleSelector={!!featureFlags.enableChartAccessibilityFeatures} /> {this.renderAdvancedSection()} diff --git a/libs/sdk-ui-ext/src/internal/components/configurationPanels/LineChartBasedConfigurationPanel.tsx b/libs/sdk-ui-ext/src/internal/components/configurationPanels/LineChartBasedConfigurationPanel.tsx index b2f7a24f545..c1ace9cd706 100644 --- a/libs/sdk-ui-ext/src/internal/components/configurationPanels/LineChartBasedConfigurationPanel.tsx +++ b/libs/sdk-ui-ext/src/internal/components/configurationPanels/LineChartBasedConfigurationPanel.tsx @@ -31,7 +31,6 @@ export class LineChartBasedConfigurationPanel extends BaseChartConfigurationPane const { gridEnabled, axes } = this.getControlProperties(); const { - featureFlags, properties, propertiesMeta, pushData, @@ -72,7 +71,6 @@ export class LineChartBasedConfigurationPanel extends BaseChartConfigurationPane properties={properties} isDisabled={controlsDisabled} defaultValue={dataLabelDefaultValue} - enableStyleSelector={!!featureFlags.enableChartAccessibilityFeatures} /> - {featureFlags["enableChartAccessibilityFeatures"] ? ( - - ) : null} + {this.renderAdvancedSection()} diff --git a/libs/sdk-ui-ext/src/internal/components/configurationPanels/PyramidChartConfigurationPanel.tsx b/libs/sdk-ui-ext/src/internal/components/configurationPanels/PyramidChartConfigurationPanel.tsx index 9ee6eb52eaf..97e328b290d 100644 --- a/libs/sdk-ui-ext/src/internal/components/configurationPanels/PyramidChartConfigurationPanel.tsx +++ b/libs/sdk-ui-ext/src/internal/components/configurationPanels/PyramidChartConfigurationPanel.tsx @@ -20,7 +20,7 @@ import { DataLabelsControl } from "../configurationControls/DataLabelsControl.js export class PyramidChartConfigurationPanel extends ConfigurationPanelContent { protected renderConfigurationPanel(): ReactNode { - const { propertiesMeta, properties, pushData, featureFlags } = this.props; + const { propertiesMeta, properties, pushData } = this.props; const controlsDisabled = this.isControlDisabled(); return ( @@ -41,7 +41,6 @@ export class PyramidChartConfigurationPanel extends ConfigurationPanelContent { properties={properties} isDisabled={controlsDisabled} defaultValue="auto" - enableStyleSelector={!!featureFlags.enableChartAccessibilityFeatures} /> {this.renderAdvancedSection()} diff --git a/libs/sdk-ui-ext/src/internal/components/configurationPanels/SankeyChartConfigurationPanel.tsx b/libs/sdk-ui-ext/src/internal/components/configurationPanels/SankeyChartConfigurationPanel.tsx index fbf540aa52e..babd981813c 100644 --- a/libs/sdk-ui-ext/src/internal/components/configurationPanels/SankeyChartConfigurationPanel.tsx +++ b/libs/sdk-ui-ext/src/internal/components/configurationPanels/SankeyChartConfigurationPanel.tsx @@ -45,7 +45,7 @@ export class SankeyChartConfigurationPanel extends ConfigurationPanelContent { } private renderCanvasSection() { - const { propertiesMeta, properties, pushData, featureFlags } = this.props; + const { propertiesMeta, properties, pushData } = this.props; const controlsDisabled = this.isControlDisabled(); return ( @@ -60,11 +60,7 @@ export class SankeyChartConfigurationPanel extends ConfigurationPanelContent { pushData={pushData} properties={properties} isDisabled={controlsDisabled} - enableStyleSelector={ - featureFlags.enableChartAccessibilityFeatures - ? this.props.type !== VisualizationTypes.DEPENDENCY_WHEEL - : false - } + enableStyleSelector={this.props.type !== VisualizationTypes.DEPENDENCY_WHEEL} /> ); diff --git a/libs/sdk-ui-ext/src/internal/components/configurationPanels/ScatterPlotConfigurationPanel.tsx b/libs/sdk-ui-ext/src/internal/components/configurationPanels/ScatterPlotConfigurationPanel.tsx index 480726ffeb5..8281a796b91 100644 --- a/libs/sdk-ui-ext/src/internal/components/configurationPanels/ScatterPlotConfigurationPanel.tsx +++ b/libs/sdk-ui-ext/src/internal/components/configurationPanels/ScatterPlotConfigurationPanel.tsx @@ -125,7 +125,6 @@ export class ScatterPlotConfigurationPanel extends ConfigurationPanelContent { isDisabled={this.areDataLabelsDisabled()} defaultValue={false} showDisabledMessage={this.isDataLabelsWarningShown()} - enableStyleSelector={!!featureFlags.enableChartAccessibilityFeatures} /> {this.renderAdvancedSection()} diff --git a/libs/sdk-ui-ext/src/internal/components/configurationPanels/WaterfallChartConfigurationPanel.tsx b/libs/sdk-ui-ext/src/internal/components/configurationPanels/WaterfallChartConfigurationPanel.tsx index 0c755a2d969..019da7641ac 100644 --- a/libs/sdk-ui-ext/src/internal/components/configurationPanels/WaterfallChartConfigurationPanel.tsx +++ b/libs/sdk-ui-ext/src/internal/components/configurationPanels/WaterfallChartConfigurationPanel.tsx @@ -37,13 +37,7 @@ export class WaterfallChartConfigurationPanel extends BaseChartConfigurationPane protected override renderConfigurationPanel(): ReactNode { const { gridEnabled, axes } = this.getControlProperties(); - const { - properties, - propertiesMeta, - pushData, - dataLabelDefaultValue = false, - featureFlags, - } = this.props; + const { properties, propertiesMeta, pushData, dataLabelDefaultValue = false } = this.props; const controlsDisabled = this.isControlDisabled(); @@ -84,7 +78,6 @@ export class WaterfallChartConfigurationPanel extends BaseChartConfigurationPane properties={properties} isDisabled={controlsDisabled} defaultValue={dataLabelDefaultValue} - enableStyleSelector={!!featureFlags.enableChartAccessibilityFeatures} /> { - this.superHandlePushData({ - ...data, - ...(data?.availableDrillTargets && { - availableDrillTargets: this.withEmptyAttributeTargets(data.availableDrillTargets), - }), - }); - }; - /** * Extends reference point with geo area-specific configuration. */ diff --git a/libs/sdk-ui-ext/src/internal/components/pluggableVisualizations/geoAreaChart/geoAreaConfigBuilder.ts b/libs/sdk-ui-ext/src/internal/components/pluggableVisualizations/geoAreaChart/geoAreaConfigBuilder.ts index d462358c00a..9c47ba1e2f8 100644 --- a/libs/sdk-ui-ext/src/internal/components/pluggableVisualizations/geoAreaChart/geoAreaConfigBuilder.ts +++ b/libs/sdk-ui-ext/src/internal/components/pluggableVisualizations/geoAreaChart/geoAreaConfigBuilder.ts @@ -1,4 +1,4 @@ -// (C) 2025 GoodData Corporation +// (C) 2025-2026 GoodData Corporation import { type IGeoAreaChartConfig } from "@gooddata/sdk-ui-geo/next"; import { type IColorMapping } from "@gooddata/sdk-ui-vis-commons"; @@ -27,7 +27,7 @@ export function buildAreaVisualizationConfig({ environment: _environment, }: IBuildAreaVisualizationConfigParams): IGeoAreaChartConfig { const { config = {} } = options; - const { colorPalette, separators, maxZoomLevel: configMaxZoomLevel } = config; + const { colorPalette, separators, maxZoomLevel: configMaxZoomLevel, isInEditMode, isExportMode } = config; const controls = supportedControls.controls ?? supportedControls ?? {}; const { legend = {}, @@ -39,6 +39,14 @@ export function buildAreaVisualizationConfig({ // Explicit undefined check - null is a meaningful value that clears the zoom limit const maxZoomLevel = configMaxZoomLevel === undefined ? controlsMaxZoomLevel : configMaxZoomLevel; + // Build viewport configuration with frozen state during edit/export + const viewportProp = { + viewport: { + ...viewport, + frozen: isInEditMode || isExportMode, + }, + }; + return { separators, colorPalette, @@ -48,9 +56,7 @@ export function buildAreaVisualizationConfig({ position: legend.position, }, tooltipText, - viewport: { - area: viewport.area, - }, + ...viewportProp, mapStyle, maxZoomLevel, }; diff --git a/libs/sdk-ui-ext/src/internal/components/pluggableVisualizations/geoChartNext/PluggableGeoPushpinChartNext.tsx b/libs/sdk-ui-ext/src/internal/components/pluggableVisualizations/geoChartNext/PluggableGeoPushpinChartNext.tsx index 1576fd9897f..701a7f7abf4 100644 --- a/libs/sdk-ui-ext/src/internal/components/pluggableVisualizations/geoChartNext/PluggableGeoPushpinChartNext.tsx +++ b/libs/sdk-ui-ext/src/internal/components/pluggableVisualizations/geoChartNext/PluggableGeoPushpinChartNext.tsx @@ -1,4 +1,4 @@ -// (C) 2025 GoodData Corporation +// (C) 2025-2026 GoodData Corporation import { cloneDeep, set } from "lodash-es"; @@ -20,13 +20,7 @@ import { insightTitle, newAttribute, } from "@gooddata/sdk-model"; -import { - BucketNames, - GeoLocationMissingSdkError, - type IAvailableDrillTargets, - type IPushData, - VisualizationTypes, -} from "@gooddata/sdk-ui"; +import { BucketNames, GeoLocationMissingSdkError, VisualizationTypes } from "@gooddata/sdk-ui"; import { GeoChartNextInternal, type IGeoLayer, @@ -99,41 +93,6 @@ export class PluggableGeoPushpinChartNext extends PluggableBaseChart { this.initializeProperties(props.visualizationProperties); } - /** - * Removes attribute drill targets since geo pushpin charts don't support drilling from attributes. - */ - private withEmptyAttributeTargets(drillTargets: IAvailableDrillTargets): IAvailableDrillTargets { - return { - ...drillTargets, - attributes: [], - }; - } - - /** - * Store reference to parent's handlePushData to call it from our override. - * This is needed to properly handle color mapping while still filtering drill targets. - * See: https://github.com/basarat/typescript-book/blob/master/docs/arrow-functions.md#tip-arrow-functions-and-inheritance - */ - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - private superHandlePushData = this.handlePushData; - - /** - * Override push data handler to filter out attribute drill targets. - * Geo pushpin charts only support drilling from measures. - * - * @param data - Push data from the visualization containing drill targets and other metadata - */ - protected override handlePushData = (data: IPushData): void => { - // Call parent's handlePushData to properly handle colors and other data - this.superHandlePushData({ - ...data, - ...(data?.availableDrillTargets && { - availableDrillTargets: this.withEmptyAttributeTargets(data.availableDrillTargets), - }), - }); - }; - /** * Extends reference point with geo pushpin-specific configuration. * Configures UI config, removes sorting, enables percent formatting, and updates clustering properties. diff --git a/libs/sdk-ui-ext/src/internal/translations/en-US.json b/libs/sdk-ui-ext/src/internal/translations/en-US.json index 585c9847b5b..ae21d75488c 100644 --- a/libs/sdk-ui-ext/src/internal/translations/en-US.json +++ b/libs/sdk-ui-ext/src/internal/translations/en-US.json @@ -1,2070 +1,2070 @@ { "or": { - "value": "or", - "comment": "Connects two or more conditions in a filter expression, e.g., 'Product is Shoes or Product is Socks'. Appears in filter components." + "text": "or", + "crowdinContext": "Connects two or more conditions in a filter expression, e.g., 'Product is Shoes or Product is Socks'. Appears in filter components." }, "dashboard.bucket.measures_title.column": { - "value": "Metrics", - "comment": "Label for calculated indicators based on metric data that show performance (e.g., Revenue Growth, Profit Margin)" + "text": "Metrics", + "crowdinContext": "Label for calculated indicators based on metric data that show performance (e.g., Revenue Growth, Profit Margin)" }, "dashboard.bucket.measures_title.bar": { - "value": "Metrics", - "comment": "Label for calculated indicators based on metric data that show performance (e.g., Revenue Growth, Profit Margin)" + "text": "Metrics", + "crowdinContext": "Label for calculated indicators based on metric data that show performance (e.g., Revenue Growth, Profit Margin)" }, "dashboard.bucket.measures_title.line": { - "value": "Metrics", - "comment": "Label for calculated indicators based on metric data that show performance (e.g., Revenue Growth, Profit Margin)" + "text": "Metrics", + "crowdinContext": "Label for calculated indicators based on metric data that show performance (e.g., Revenue Growth, Profit Margin)" }, "dashboard.bucket.measures_title.area": { - "value": "Metrics", - "comment": "Label for calculated indicators based on metric data that show performance (e.g., Revenue Growth, Profit Margin)" + "text": "Metrics", + "crowdinContext": "Label for calculated indicators based on metric data that show performance (e.g., Revenue Growth, Profit Margin)" }, "dashboard.bucket.measures_title.pie": { - "value": "Metrics", - "comment": "Label for calculated indicators based on metric data that show performance (e.g., Revenue Growth, Profit Margin)" + "text": "Metrics", + "crowdinContext": "Label for calculated indicators based on metric data that show performance (e.g., Revenue Growth, Profit Margin)" }, "dashboard.bucket.measures_title.funnel": { - "value": "Metrics", - "comment": "Label for calculated indicators based on metric data that show performance (e.g., Revenue Growth, Profit Margin)" + "text": "Metrics", + "crowdinContext": "Label for calculated indicators based on metric data that show performance (e.g., Revenue Growth, Profit Margin)" }, "dashboard.bucket.measures_title.pyramid": { - "value": "Metrics", - "comment": "Label for calculated indicators based on metric data that show performance (e.g., Revenue Growth, Profit Margin)" + "text": "Metrics", + "crowdinContext": "Label for calculated indicators based on metric data that show performance (e.g., Revenue Growth, Profit Margin)" }, "dashboard.bucket.measures_title.treemap": { - "value": "Metrics", - "comment": "Label for calculated indicators based on metric data that show performance (e.g., Revenue Growth, Profit Margin)" + "text": "Metrics", + "crowdinContext": "Label for calculated indicators based on metric data that show performance (e.g., Revenue Growth, Profit Margin)" }, "dashboard.bucket.measures_title.donut": { - "value": "Metrics", - "comment": "Label for calculated indicators based on metric data that show performance (e.g., Revenue Growth, Profit Margin)" + "text": "Metrics", + "crowdinContext": "Label for calculated indicators based on metric data that show performance (e.g., Revenue Growth, Profit Margin)" }, "dashboard.bucket.measures_title.heatmap": { - "value": "Metric", - "comment": "Label for calculated indicators based on metric data that show performance (e.g., Revenue Growth, Profit Margin)" + "text": "Metric", + "crowdinContext": "Label for calculated indicators based on metric data that show performance (e.g., Revenue Growth, Profit Margin)" }, "dashboard.bucket.measures_title.headline": { - "value": "Metric", - "comment": "Label for calculated indicators based on metric data that show performance (e.g., Revenue Growth, Profit Margin)" + "text": "Metric", + "crowdinContext": "Label for calculated indicators based on metric data that show performance (e.g., Revenue Growth, Profit Margin)" }, "dashboard.bucket.measures_subtitle.headline": { - "value": "primary", - "comment": "Label for the primary measures subtitle in headline chart" + "text": "primary", + "crowdinContext": "Label for the primary measures subtitle in headline chart" }, "dashboard.bucket.secondary_measures_title.headline": { - "value": "Metric", - "comment": "Label for calculated indicators based on measure data that show performance (e.g., Revenue Growth, Profit Margin)" + "text": "Metric", + "crowdinContext": "Label for calculated indicators based on measure data that show performance (e.g., Revenue Growth, Profit Margin)" }, "dashboard.bucket.secondary_measures_subtitle.headline": { - "value": "secondary", - "comment": "Label for the secondary measures subtitle in headline chart" + "text": "secondary", + "crowdinContext": "Label for the secondary measures subtitle in headline chart" }, "dashboard.bucket.measures_title.scatter": { - "value": "Metric", - "comment": "Label for calculated indicators based on measure data that show performance (e.g., Revenue Growth, Profit Margin)" + "text": "Metric", + "crowdinContext": "Label for calculated indicators based on measure data that show performance (e.g., Revenue Growth, Profit Margin)" }, "dashboard.bucket.secondary_measures_title.scatter": { - "value": "Metric", - "comment": "Label for calculated indicators based on measure data that show performance (e.g., Revenue Growth, Profit Margin)" + "text": "Metric", + "crowdinContext": "Label for calculated indicators based on measure data that show performance (e.g., Revenue Growth, Profit Margin)" }, "dashboard.bucket.measures_subtitle.scatter": { - "value": "X-axis", - "comment": "Horizontal axis of a scatter plot." + "text": "X-axis", + "crowdinContext": "Horizontal axis of a scatter plot." }, "dashboard.bucket.secondary_measures_subtitle.scatter": { - "value": "Y-axis", - "comment": "Vertical axis of a scatter plot." + "text": "Y-axis", + "crowdinContext": "Vertical axis of a scatter plot." }, "dashboard.bucket.attribute_title.scatter": { - "value": "View by", - "comment": "Label for a categorical data field used to group or categorize your data (e.g., Product, Customer, Region)" + "text": "View by", + "crowdinContext": "Label for a categorical data field used to group or categorize your data (e.g., Product, Customer, Region)" }, "dashboard.bucket.segment_title.scatter": { - "value": "Segment by", - "comment": "Label for the segment bucket in scatter chart" + "text": "Segment by", + "crowdinContext": "Label for the segment bucket in scatter chart" }, "dashboard.bucket.measures_title.combo": { - "value": "Metrics", - "comment": "Label for calculated indicators based on measure data that show performance (e.g., Revenue Growth, Profit Margin)" + "text": "Metrics", + "crowdinContext": "Label for calculated indicators based on measure data that show performance (e.g., Revenue Growth, Profit Margin)" }, "dashboard.bucket.measures_subtitle.combo": { - "value": "Column", - "comment": "Label for the column subtitle in combo chart" + "text": "Column", + "crowdinContext": "Label for the column subtitle in combo chart" }, "dashboard.bucket.secondary_measures_title.combo": { - "value": "Metrics", - "comment": "Label for calculated indicators based on measure data that show performance (e.g., Revenue Growth, Profit Margin)" + "text": "Metrics", + "crowdinContext": "Label for calculated indicators based on measure data that show performance (e.g., Revenue Growth, Profit Margin)" }, "dashboard.bucket.secondary_measures_subtitle.combo": { - "value": "Line", - "comment": "Label for the line subtitle in combo chart" + "text": "Line", + "crowdinContext": "Label for the line subtitle in combo chart" }, "dashboard.bucket.measures_title.xirr": { - "value": "Metric", - "comment": "Label for calculated indicators based on measure data that show performance (e.g., Revenue Growth, Profit Margin)" + "text": "Metric", + "crowdinContext": "Label for calculated indicators based on measure data that show performance (e.g., Revenue Growth, Profit Margin)" }, "dashboard.bucket.measures_title.waterfall": { - "value": "Metrics", - "comment": "Label for calculated indicators based on measure data that show performance (e.g., Revenue Growth, Profit Margin)" + "text": "Metrics", + "crowdinContext": "Label for calculated indicators based on measure data that show performance (e.g., Revenue Growth, Profit Margin)" }, "dashboard.bucket.attribute_title.xirr": { - "value": "Date attribute", - "comment": "Label for a categorical data field used to group or categorize your data (e.g., Product, Customer, Region)" + "text": "Date attribute", + "crowdinContext": "Label for a categorical data field used to group or categorize your data (e.g., Product, Customer, Region)" }, "dashboard.bucket.attribute_from_title.sankey": { - "value": "Attribute", - "comment": "Label for a categorical data field used to define the starting node in a flow diagram" + "text": "Attribute", + "crowdinContext": "Label for a categorical data field used to define the starting node in a flow diagram" }, "dashboard.bucket.attribute_from_subtitle.sankey": { - "value": "from", - "comment": "Directional indicator for the origin point in a relationship between two attributes" + "text": "from", + "crowdinContext": "Directional indicator for the origin point in a relationship between two attributes" }, "dashboard.bucket.attribute_to_title.sankey": { - "value": "Attribute", - "comment": "Label for a categorical data field used to define the destination node in a flow diagram" + "text": "Attribute", + "crowdinContext": "Label for a categorical data field used to define the destination node in a flow diagram" }, "dashboard.bucket.attribute_to_subtitle.sankey": { - "value": "to", - "comment": "Directional indicator for the origin point in a relationship between two attributes" + "text": "to", + "crowdinContext": "Directional indicator for the origin point in a relationship between two attributes" }, "dashboard.bucket.attribute_from_title.dependencywheel": { - "value": "Attribute", - "comment": "Label for a categorical data field used to define the starting node in a dependency relationship" + "text": "Attribute", + "crowdinContext": "Label for a categorical data field used to define the starting node in a dependency relationship" }, "dashboard.bucket.attribute_from_subtitle.dependencywheel": { - "value": "from", - "comment": "Directional indicator for the origin point in a relationship between two attributes" + "text": "from", + "crowdinContext": "Directional indicator for the origin point in a relationship between two attributes" }, "dashboard.bucket.attribute_to_title.dependencywheel": { - "value": "Attribute", - "comment": "Label for a categorical data field used to define the destination node in a dependency relationship" + "text": "Attribute", + "crowdinContext": "Label for a categorical data field used to define the destination node in a dependency relationship" }, "dashboard.bucket.attribute_to_subtitle.dependencywheel": { - "value": "to", - "comment": "Directional indicator for the destination point in a relationship between two attributes" + "text": "to", + "crowdinContext": "Directional indicator for the destination point in a relationship between two attributes" }, "dashboard.bucket.combo.subtitle.column": { - "value": "as columns", - "comment": "Display measures in column chart 'as columns'." + "text": "as columns", + "crowdinContext": "Display measures in column chart 'as columns'." }, "dashboard.bucket.combo.subtitle.line": { - "value": "as lines", - "comment": "Display measures in line chart 'as lines'." + "text": "as lines", + "crowdinContext": "Display measures in line chart 'as lines'." }, "dashboard.bucket.combo.subtitle.area": { - "value": "as areas", - "comment": "Display measures in area chart 'as areas'." + "text": "as areas", + "crowdinContext": "Display measures in area chart 'as areas'." }, "dashboard.bucket.measures_title.bubble": { - "value": "Metric", - "comment": "Label for calculated indicators based on metric data that show performance (e.g., Revenue Growth, Profit Margin)" + "text": "Metric", + "crowdinContext": "Label for calculated indicators based on metric data that show performance (e.g., Revenue Growth, Profit Margin)" }, "dashboard.bucket.secondary_measures_title.bubble": { - "value": "Metric", - "comment": "Label for calculated indicators based on metric data that show performance (e.g., Revenue Growth, Profit Margin)" + "text": "Metric", + "crowdinContext": "Label for calculated indicators based on metric data that show performance (e.g., Revenue Growth, Profit Margin)" }, "dashboard.bucket.tertiary_measures_title.bubble": { - "value": "Metric", - "comment": "Label for calculated indicators based on metric data that show performance (e.g., Revenue Growth, Profit Margin)" + "text": "Metric", + "crowdinContext": "Label for calculated indicators based on metric data that show performance (e.g., Revenue Growth, Profit Margin)" }, "dashboard.bucket.measures_subtitle.bubble": { - "value": "X-axis", - "comment": "Horizontal axis of a bubble plot." + "text": "X-axis", + "crowdinContext": "Horizontal axis of a bubble plot." }, "dashboard.bucket.secondary_measures_subtitle.bubble": { - "value": "Y-axis", - "comment": "Vertical axis of a bubble plot." + "text": "Y-axis", + "crowdinContext": "Vertical axis of a bubble plot." }, "dashboard.bucket.tertiary_measures_subtitle.bubble": { - "value": "Size", - "comment": "Label for a measure that determines the size of visual elements in a chart (e.g., bubble size)" + "text": "Size", + "crowdinContext": "Label for a measure that determines the size of visual elements in a chart (e.g., bubble size)" }, "dashboard.bucket.location_title.pushpin": { - "value": "Location", - "comment": "Position of a pin pushed to a map." + "text": "Location", + "crowdinContext": "Position of a pin pushed to a map." }, "dashboard.bucket.area_title.choropleth": { - "value": "Area", - "comment": "Geo area chart bucket title for the attribute that defines colored map regions." + "text": "Area", + "crowdinContext": "Geo area chart bucket title for the attribute that defines colored map regions." }, "dashboard.bucket.size_title.pushpin": { - "value": "Metric", - "comment": "Label for calculated indicators based on metric data that show performance (e.g., Revenue Growth, Profit Margin)" + "text": "Metric", + "crowdinContext": "Label for calculated indicators based on metric data that show performance (e.g., Revenue Growth, Profit Margin)" }, "dashboard.bucket.size_subtitle.pushpin": { - "value": "Size", - "comment": "Size of a pin pushed to a map" + "text": "Size", + "crowdinContext": "Size of a pin pushed to a map" }, "dashboard.bucket.color_title.pushpin": { - "value": "Metric", - "comment": "Label for calculated indicators based on metric data that show performance (e.g., Revenue Growth, Profit Margin)" + "text": "Metric", + "crowdinContext": "Label for calculated indicators based on metric data that show performance (e.g., Revenue Growth, Profit Margin)" }, "dashboard.bucket.color_subtitle.pushpin": { - "value": "Color", - "comment": "Color of a pin pushed to a map" + "text": "Color", + "crowdinContext": "Color of a pin pushed to a map" }, "dashboard.bucket.view_title.bubble": { - "value": "View by", - "comment": "Label for a categorical data field used to group or categorize your data (e.g., Product, Customer, Region)" + "text": "View by", + "crowdinContext": "Label for a categorical data field used to group or categorize your data (e.g., Product, Customer, Region)" }, "dashboard.bucket.view_title.pie": { - "value": "View by", - "comment": "Label for a categorical data field used to group or categorize your data (e.g., Product, Customer, Region)" + "text": "View by", + "crowdinContext": "Label for a categorical data field used to group or categorize your data (e.g., Product, Customer, Region)" }, "dashboard.bucket.view_title.treemap": { - "value": "View by", - "comment": "Label for a categorical data field used to group or categorize your data (e.g., Product, Customer, Region)" + "text": "View by", + "crowdinContext": "Label for a categorical data field used to group or categorize your data (e.g., Product, Customer, Region)" }, "dashboard.bucket.view_title.donut": { - "value": "View by", - "comment": "Label for a categorical data field used to group or categorize your data (e.g., Product, Customer, Region)" + "text": "View by", + "crowdinContext": "Label for a categorical data field used to group or categorize your data (e.g., Product, Customer, Region)" }, "dashboard.bucket.view_title.funnel": { - "value": "View by", - "comment": "Label for a categorical data field used to group or categorize your data (e.g., Product, Customer, Region)" + "text": "View by", + "crowdinContext": "Label for a categorical data field used to group or categorize your data (e.g., Product, Customer, Region)" }, "dashboard.bucket.view_title.pyramid": { - "value": "View by", - "comment": "Label for a categorical data field used to group or categorize your data (e.g., Product, Customer, Region)" + "text": "View by", + "crowdinContext": "Label for a categorical data field used to group or categorize your data (e.g., Product, Customer, Region)" }, "dashboard.bucket.view_title.column": { - "value": "View by", - "comment": "Label for a categorical data field used to group or categorize your data (e.g., Product, Customer, Region)" + "text": "View by", + "crowdinContext": "Label for a categorical data field used to group or categorize your data (e.g., Product, Customer, Region)" }, "dashboard.bucket.view_title.bar": { - "value": "View by", - "comment": "Label for a categorical data field used to group or categorize your data (e.g., Product, Customer, Region)" + "text": "View by", + "crowdinContext": "Label for a categorical data field used to group or categorize your data (e.g., Product, Customer, Region)" }, "dashboard.bucket.view_title.area": { - "value": "View by", - "comment": "Label for a categorical data field used to group or categorize your data (e.g., Product, Customer, Region)" + "text": "View by", + "crowdinContext": "Label for a categorical data field used to group or categorize your data (e.g., Product, Customer, Region)" }, "dashboard.bucket.view_title.bullet": { - "value": "View by", - "comment": "Label for a categorical data field used to group or categorize your data (e.g., Product, Customer, Region)" + "text": "View by", + "crowdinContext": "Label for a categorical data field used to group or categorize your data (e.g., Product, Customer, Region)" }, "dashboard.bucket.view_title.waterfall": { - "value": "View by", - "comment": "Label for a categorical data field used to group or categorize your data (e.g., Product, Customer, Region)" + "text": "View by", + "crowdinContext": "Label for a categorical data field used to group or categorize your data (e.g., Product, Customer, Region)" }, "dashboard.bucket.view_title.heatmap": { - "value": "Rows", - "comment": "Label for categorical data fields that will be displayed as rows in a tabular visualization" + "text": "Rows", + "crowdinContext": "Label for categorical data fields that will be displayed as rows in a tabular visualization" }, "dashboard.bucket.trend_title.line": { - "value": "Trend by", - "comment": "Label for a time-based field showing how data changes over time periods (e.g., Month, Year, Quarter)" + "text": "Trend by", + "crowdinContext": "Label for a time-based field showing how data changes over time periods (e.g., Month, Year, Quarter)" }, "dashboard.bucket.view_title.combo": { - "value": "View by", - "comment": "Label for a categorical data field used to group or categorize your data (e.g., Product, Customer, Region)" + "text": "View by", + "crowdinContext": "Label for a categorical data field used to group or categorize your data (e.g., Product, Customer, Region)" }, "dashboard.bucket.stack_title.column": { - "value": "Stack by", - "comment": "Label for a categorical field used to create stacked segments in visualizations (e.g., splitting bars into segments by Product Category)" + "text": "Stack by", + "crowdinContext": "Label for a categorical field used to create stacked segments in visualizations (e.g., splitting bars into segments by Product Category)" }, "dashboard.bucket.stack_title.bar": { - "value": "Stack by", - "comment": "Label for a categorical field used to create stacked segments in visualizations (e.g., splitting bars into segments by Product Category)" + "text": "Stack by", + "crowdinContext": "Label for a categorical field used to create stacked segments in visualizations (e.g., splitting bars into segments by Product Category)" }, "dashboard.bucket.stack_title.area": { - "value": "Stack by", - "comment": "Label for a categorical field used to create stacked segments in visualizations (e.g., splitting bars into segments by Product Category)" + "text": "Stack by", + "crowdinContext": "Label for a categorical field used to create stacked segments in visualizations (e.g., splitting bars into segments by Product Category)" }, "dashboard.bucket.stack_title.heatmap": { - "value": "Columns", - "comment": "Label for categorical data fields or measures that will be displayed as columns in a tabular visualization" + "text": "Columns", + "crowdinContext": "Label for categorical data fields or measures that will be displayed as columns in a tabular visualization" }, "dashboard.bucket.segment_title.line": { - "value": "Segment by", - "comment": "Label for a categorical field used to divide data into segments or categories (e.g., Product Type, Customer Status)" + "text": "Segment by", + "crowdinContext": "Label for a categorical field used to divide data into segments or categories (e.g., Product Type, Customer Status)" }, "dashboard.bucket.segment_title.treemap": { - "value": "Segment by", - "comment": "Label for a categorical field used to divide data into segments or categories (e.g., Product Type, Customer Status)" + "text": "Segment by", + "crowdinContext": "Label for a categorical field used to divide data into segments or categories (e.g., Product Type, Customer Status)" }, "dashboard.bucket.segment_title.pushpin": { - "value": "Segment by", - "comment": "Label for a categorical field used to divide data into segments or categories (e.g., Product Type, Customer Status)" + "text": "Segment by", + "crowdinContext": "Label for a categorical field used to divide data into segments or categories (e.g., Product Type, Customer Status)" }, "dashboard.bucket.metric_segment_by_warning": { - "value": "To add additional metric, remove {icons} from ''segment by''", - "comment": "Warning message about metric limitations when using segment by. The {icons} placeholder shows UI icons, and HTML spans provide styling for 'segment by' text." + "text": "To add additional metric, remove {icons} from ''segment by''", + "crowdinContext": "Warning message about metric limitations when using segment by. The {icons} placeholder shows UI icons, and HTML spans provide styling for 'segment by' text." }, "dashboard.bucket.metric_stack_by_warning": { - "value": "To add additional metric, remove {icons} from ''stack by''", - "comment": "Warning message about metric limitations when using stack by. The {icons} placeholder shows UI icons, and HTML spans provide styling for 'stack by' text." + "text": "To add additional metric, remove {icons} from ''stack by''", + "crowdinContext": "Warning message about metric limitations when using stack by. The {icons} placeholder shows UI icons, and HTML spans provide styling for 'stack by' text." }, "dashboard.bucket.metric_view_by_warning": { - "value": "To add additional metric, remove {icons} from ''view by''", - "comment": "Warning message about metric limitations when using view by. The {icons} placeholder shows UI icons, and HTML spans provide styling for 'view by' text." + "text": "To add additional metric, remove {icons} from ''view by''", + "crowdinContext": "Warning message about metric limitations when using view by. The {icons} placeholder shows UI icons, and HTML spans provide styling for 'view by' text." }, "dashboard.bucket.category_view_by_warning": { - "value": "To view by another attribute, an visualization can have only one metric", - "comment": "Warning message explaining View By configuration limitations based on measure/metric count" + "text": "To view by another attribute, an visualization can have only one metric", + "crowdinContext": "Warning message explaining View By configuration limitations based on measure/metric count" }, "dashboard.bucket.view_stack_by_warning": { - "value": "To add additional attribute, remove {icons} from ''stack by''", - "comment": "Warning message explaining Stack By configuration limitations based on measure/metric count" + "text": "To add additional attribute, remove {icons} from ''stack by''", + "crowdinContext": "Warning message explaining Stack By configuration limitations based on measure/metric count" }, "dashboard.bucket.category_stack_by_warning": { - "value": "To stack by, an visualization can have only one metric", - "comment": "Warning message explaining Stack By configuration limitations based on measure/metric count" + "text": "To stack by, an visualization can have only one metric", + "crowdinContext": "Warning message explaining Stack By configuration limitations based on measure/metric count" }, "dashboard.bucket.stack_view_by_warning": { - "value": "To stack by, an visualization can have only one attribute in view by", - "comment": "Warning message explaining Stack By limitations when using View By" + "text": "To stack by, an visualization can have only one attribute in view by", + "crowdinContext": "Warning message explaining Stack By limitations when using View By" }, "dashboard.bucket.measure_stack_by_warning": { - "value": "To stack by an attribute, an visualization can have only one metric", - "comment": "Warning message explaining that stacking requires limiting to one metric in insights" + "text": "To stack by an attribute, an visualization can have only one metric", + "crowdinContext": "Warning message explaining that stacking requires limiting to one metric in insights" }, "dashboard.bucket.category_columns_warning": { - "value": "Cannot add columns: limit is {oldLimit} metrics and {oldRowsLimit} rows. Follow the limits to add more", - "comment": "Warning message when trying to add too many columns. The placeholders {oldLimit} and {oldRowsLimit} will be replaced with numbers, e.g., 'Cannot add columns: limit is 10 metrics and 20 rows. Follow the limits to add more'." + "text": "Cannot add columns: limit is {oldLimit} metrics and {oldRowsLimit} rows. Follow the limits to add more", + "crowdinContext": "Warning message when trying to add too many columns. The placeholders {oldLimit} and {oldRowsLimit} will be replaced with numbers, e.g., 'Cannot add columns: limit is 10 metrics and 20 rows. Follow the limits to add more'." }, "dashboard.bucket.category_measures_rows_warning": { - "value": "To add up to {limit} more, remove all items from columns section", - "comment": "Warning message when trying to add more items. The placeholder {limit} will be replaced with a number, e.g., 'To add up to 5 more, remove all items from columns section'." + "text": "To add up to {limit} more, remove all items from columns section", + "crowdinContext": "Warning message when trying to add more items. The placeholder {limit} will be replaced with a number, e.g., 'To add up to 5 more, remove all items from columns section'." }, "dashboard.bucket.category_category_by_warning": { - "value": "To view by, an visualization can have only one metric", - "comment": "Warning message explaining that 'View by' requires limiting to one metric in insights" + "text": "To view by, an visualization can have only one metric", + "crowdinContext": "Warning message explaining that 'View by' requires limiting to one metric in insights" }, "dashboard.bucket.category_segment_by_warning": { - "value": "To segment by, an visualization can have only one metric", - "comment": "Warning message explaining that 'Segment by' requires limiting to one metric in insights" + "text": "To segment by, an visualization can have only one metric", + "crowdinContext": "Warning message explaining that 'Segment by' requires limiting to one metric in insights" }, "dashboard.bucket.measures_title.table": { - "value": "Metrics", - "comment": "Label for calculated indicators based on metric data that show performance (e.g., Revenue Growth, Profit Margin)" + "text": "Metrics", + "crowdinContext": "Label for calculated indicators based on metric data that show performance (e.g., Revenue Growth, Profit Margin)" }, "dashboard.bucket.measures_title.sankey": { - "value": "METRIC", - "comment": "Label for calculated indicators based on metric data that show performance (e.g., Revenue Growth, Profit Margin)" + "text": "METRIC", + "crowdinContext": "Label for calculated indicators based on metric data that show performance (e.g., Revenue Growth, Profit Margin)" }, "dashboard.bucket.measures_title.dependencywheel": { - "value": "METRIC", - "comment": "Label for calculated indicators based on metric data that show performance (e.g., Revenue Growth, Profit Margin)" + "text": "METRIC", + "crowdinContext": "Label for calculated indicators based on metric data that show performance (e.g., Revenue Growth, Profit Margin)" }, "dashboard.bucket.attribute_title.table": { - "value": "Rows", - "comment": "Label for categorical data fields that will be displayed as rows in a table visualization" + "text": "Rows", + "crowdinContext": "Label for categorical data fields that will be displayed as rows in a table visualization" }, "dashboard.bucket.columns_title.table": { - "value": "Columns", - "comment": "Label for categorical data fields or measures that will be displayed as columns in a tabular visualization" + "text": "Columns", + "crowdinContext": "Label for categorical data fields or measures that will be displayed as columns in a tabular visualization" }, "dashboard.bucket.attribute_title.repeater": { - "value": "Rows", - "comment": "Label for categorical data fields that will be displayed as rows in a repeater visualization" + "text": "Rows", + "crowdinContext": "Label for categorical data fields that will be displayed as rows in a repeater visualization" }, "dashboard.bucket.view_title.repeater": { - "value": "View by", - "comment": "Label for a categorical data field used to group or categorize your data (e.g., Product, Customer, Region)" + "text": "View by", + "crowdinContext": "Label for a categorical data field used to group or categorize your data (e.g., Product, Customer, Region)" }, "dashboard.bucket.columns_title.repeater": { - "value": "Columns", - "comment": "Label for categorical data fields or measures that will be displayed as columns in a tabular visualization" + "text": "Columns", + "crowdinContext": "Label for categorical data fields or measures that will be displayed as columns in a tabular visualization" }, "dashboard.error.missing_primary_bucket_item.heading": { - "value": "No primary metric in your visualization", - "comment": "Error message shown when a required data item is missing from a visualization or report" + "text": "No primary metric in your visualization", + "crowdinContext": "Error message shown when a required data item is missing from a visualization or report" }, "dashboard.error.missing_primary_bucket_item.text": { - "value": "Add a primary metric to your visualization, or switch to table.\nOnce done, you'll be able to save it.", - "comment": "Instructional message explaining how to fix a missing primary metric error in a visualization" + "text": "Add a primary metric to your visualization, or switch to table.\nOnce done, you'll be able to save it.", + "crowdinContext": "Instructional message explaining how to fix a missing primary metric error in a visualization" }, "dashboard.xirr.error.invalid_buckets.heading": { - "value": "Incomplete configuration", - "comment": "Informs the user that they have not provided all the necessary configuration items (one measure and one date attribute)" + "text": "Incomplete configuration", + "crowdinContext": "Informs the user that they have not provided all the necessary configuration items (one measure and one date attribute)" }, "dashboard.xirr.error.invalid_buckets.text": { - "value": "Make sure you have selected one metric and one date attribute", - "comment": "The user should be instructed to review that they have added one metric and one date attribute to the visualization" + "text": "Make sure you have selected one metric and one date attribute", + "crowdinContext": "The user should be instructed to review that they have added one metric and one date attribute to the visualization" }, "properties.unsupported": { - "value": "This visualization doesn’t support configuration", - "comment": "Message displayed when a visualization type does not support configuration options" + "text": "This visualization doesn’t support configuration", + "crowdinContext": "Message displayed when a visualization type does not support configuration options" }, "properties.config.not_applicable": { - "value": "Configuration Panel is not applicable for this configuration of the visualization", - "comment": "Message shown when configuration panel is not available for current insight setup" + "text": "Configuration Panel is not applicable for this configuration of the visualization", + "crowdinContext": "Message shown when configuration panel is not available for current insight setup" }, "properties.not_applicable": { - "value": "Property is not applicable for this configuration of the visualization", - "comment": "Message shown when a specific property is not applicable for current insight configuration" + "text": "Property is not applicable for this configuration of the visualization", + "crowdinContext": "Message shown when a specific property is not applicable for current insight configuration" }, "properties.auto_placeholder": { - "value": "auto", - "comment": "Label for automatic setting option in configuration" + "text": "auto", + "crowdinContext": "Label for automatic setting option in configuration" }, "properties.auto_default": { - "value": "auto (default)", - "comment": "Label indicating automatic setting is the default option" + "text": "auto (default)", + "crowdinContext": "Label indicating automatic setting is the default option" }, "properties.legend.title": { - "value": "Legend", - "comment": "Title for legend configuration section" + "text": "Legend", + "crowdinContext": "Title for legend configuration section" }, "properties.legend.position": { - "value": "Position", - "comment": "Label for legend position setting" + "text": "Position", + "crowdinContext": "Label for legend position setting" }, "properties.total.title": { - "value": "Total", - "comment": "Title for total/sum configuration section" + "text": "Total", + "crowdinContext": "Title for total/sum configuration section" }, "properties.total.name": { - "value": "Name", - "comment": "Label for total row name configuration" + "text": "Name", + "crowdinContext": "Label for total row name configuration" }, "properties.total.tooltip": { - "value": "Add sum of all values as a column at the end.", - "comment": "Tooltip explaining how total column functionality works" + "text": "Add sum of all values as a column at the end.", + "crowdinContext": "Tooltip explaining how total column functionality works" }, "properties.total.measures.tooltip": { - "value": "Disable “is total” options in metric to add sum of all values as a column at the end.", - "comment": "The tooltip for the toggle total section when there is any metric set to total metric" + "text": "Disable “is total” options in metric to add sum of all values as a column at the end.", + "crowdinContext": "The tooltip for the toggle total section when there is any metric set to total metric" }, "properties.color.total": { - "value": "Total", - "comment": "Label for total values color configuration" + "text": "Total", + "crowdinContext": "Label for total values color configuration" }, "properties.color.positive": { - "value": "Positive", - "comment": "Label for positive values color configuration" + "text": "Positive", + "crowdinContext": "Label for positive values color configuration" }, "properties.color.negative": { - "value": "Negative", - "comment": "Label for negative values color configuration" + "text": "Negative", + "crowdinContext": "Label for negative values color configuration" }, "properties.canvas.title": { - "value": "Canvas", - "comment": "Title for canvas configuration section" + "text": "Canvas", + "crowdinContext": "Title for canvas configuration section" }, "properties.canvas.gridline": { - "value": "Gridline", - "comment": "Label for gridline configuration option" + "text": "Gridline", + "crowdinContext": "Label for gridline configuration option" }, "properties.canvas.labels.percentages": { - "value": "Percentage", - "comment": "applicable for funnel chart special data labels which can include percentages" + "text": "Percentage", + "crowdinContext": "applicable for funnel chart special data labels which can include percentages" }, "properties.canvas.labels.percentages.info": { - "value": "Display percentages on each slice, with the top-most slice as 100% and the others as fractions of that value.", - "comment": "this is an explanation tooltip for the Percentage option for funnel chart (properties.canvas.labels.percentages)" + "text": "Display percentages on each slice, with the top-most slice as 100% and the others as fractions of that value.", + "crowdinContext": "this is an explanation tooltip for the Percentage option for funnel chart (properties.canvas.labels.percentages)" }, "properties.canvas.labels.percentages.disabled": { - "value": "Percentages are hidden due to hidden data labels.", - "comment": "this is an explanation tooltip when the Percentage option for funnel chart is disabled (properties.canvas.labels.percentages)" + "text": "Percentages are hidden due to hidden data labels.", + "crowdinContext": "this is an explanation tooltip when the Percentage option for funnel chart is disabled (properties.canvas.labels.percentages)" }, "properties.canvas.continuousLine.label": { - "value": "Continuous line", - "comment": "Label for continuous line configuration option" + "text": "Continuous line", + "crowdinContext": "Label for continuous line configuration option" }, "properties.canvas.continuousLine.tooltip": { - "value": "Draw a line between points with missing values.", - "comment": "Tooltip for continuous line configuration option" + "text": "Draw a line between points with missing values.", + "crowdinContext": "Tooltip for continuous line configuration option" }, "properties.canvas.distinctPointShapes.label": { - "value": "Distinct point shapes", - "comment": "Label for distinct point shapes configuration option" + "text": "Distinct point shapes", + "crowdinContext": "Label for distinct point shapes configuration option" }, "properties.canvas.distinctPointShapes.tooltip": { - "value": "Property is not applicable for this configuration of the visualization", - "comment": "Tooltip for distinct point shapes configuration option" + "text": "Property is not applicable for this configuration of the visualization", + "crowdinContext": "Tooltip for distinct point shapes configuration option" }, "properties.canvas.dataLabels": { - "value": "Data Labels", - "comment": "Label for data labels configuration option" + "text": "Data Labels", + "crowdinContext": "Label for data labels configuration option" }, "properties.canvas.dataLabels.auto": { - "value": "auto (default)", - "comment": "Label for automatic data labels configuration option" + "text": "auto (default)", + "crowdinContext": "Label for automatic data labels configuration option" }, "properties.canvas.dataLabels.show": { - "value": "show", - "comment": "Label for show data labels configuration option" + "text": "show", + "crowdinContext": "Label for show data labels configuration option" }, "properties.canvas.dataLabels.hide": { - "value": "hide", - "comment": "Label for hide data labels configuration option" + "text": "hide", + "crowdinContext": "Label for hide data labels configuration option" }, "properties.canvas.dataLabelStyle": { - "value": "Labels Style", - "comment": "Label for data label style configuration option" + "text": "Labels Style", + "crowdinContext": "Label for data label style configuration option" }, "properties.canvas.dataLabelStyle.auto": { - "value": "auto (default)", - "comment": "Option for automatic data label style" + "text": "auto (default)", + "crowdinContext": "Option for automatic data label style" }, "properties.canvas.dataLabelStyle.backplate": { - "value": "backplate", - "comment": "Option for data label style with backplate" + "text": "backplate", + "crowdinContext": "Option for data label style with backplate" }, "properties.canvas.rowHeight": { - "value": "Row height", - "comment": "Label of the dropdown for configuring the row height of the chart" + "text": "Row height", + "crowdinContext": "Label of the dropdown for configuring the row height of the chart" }, "properties.canvas.rowHeight.small": { - "value": "small", - "comment": "Option of the dropdown for configuring the row height of the chart (small)" + "text": "small", + "crowdinContext": "Option of the dropdown for configuring the row height of the chart (small)" }, "properties.canvas.rowHeight.medium": { - "value": "medium", - "comment": "Option of the dropdown for configuring the row height of the chart (medium)" + "text": "medium", + "crowdinContext": "Option of the dropdown for configuring the row height of the chart (medium)" }, "properties.canvas.rowHeight.large": { - "value": "large", - "comment": "Option of the dropdown for configuring the row height of the chart (large)" + "text": "large", + "crowdinContext": "Option of the dropdown for configuring the row height of the chart (large)" }, "properties.canvas.verticalAlign": { - "value": "Vertical align", - "comment": "Label of the dropdown for configuring vertical alignment of the chart cells" + "text": "Vertical align", + "crowdinContext": "Label of the dropdown for configuring vertical alignment of the chart cells" }, "properties.canvas.verticalAlign.top": { - "value": "top", - "comment": "Option of the dropdown for configuring vertical alignment of the chart cells (top)" + "text": "top", + "crowdinContext": "Option of the dropdown for configuring vertical alignment of the chart cells (top)" }, "properties.canvas.verticalAlign.middle": { - "value": "middle", - "comment": "Vertical center (between top and bottom)" + "text": "middle", + "crowdinContext": "Vertical center (between top and bottom)" }, "properties.canvas.verticalAlign.bottom": { - "value": "bottom", - "comment": "Option of the dropdown for configuring vertical alignment of the chart cells (bottom)" + "text": "bottom", + "crowdinContext": "Option of the dropdown for configuring vertical alignment of the chart cells (bottom)" }, "properties.canvas.textWrapping": { - "value": "Text wrapping", - "comment": "Label of the dropdown for configuring text wrapping of the chart cells" + "text": "Text wrapping", + "crowdinContext": "Label of the dropdown for configuring text wrapping of the chart cells" }, "properties.canvas.textWrapping.clip": { - "value": "clip", - "comment": "Option of the dropdown for configuring the text wrapping of the chart cell (clip)" + "text": "clip", + "crowdinContext": "Option of the dropdown for configuring the text wrapping of the chart cell (clip)" }, "properties.canvas.textWrapping.wrap": { - "value": "wrap", - "comment": "Option of the dropdown for configuring the text wrapping of the chart cell (wrap)" + "text": "wrap", + "crowdinContext": "Option of the dropdown for configuring the text wrapping of the chart cell (wrap)" }, "properties.canvas.image": { - "value": "Image", - "comment": "Label of the dropdown for configuring image sizing of the chart cells" + "text": "Image", + "crowdinContext": "Label of the dropdown for configuring image sizing of the chart cells" }, "properties.canvas.image.fit": { - "value": "fit", - "comment": "Option of the dropdown for configuring the image sizing of the chart cell (fit)" + "text": "fit", + "crowdinContext": "Option of the dropdown for configuring the image sizing of the chart cell (fit)" }, "properties.canvas.image.fill": { - "value": "fill", - "comment": "Option of the dropdown for configuring the image sizing of the chart cell (fill)" + "text": "fill", + "crowdinContext": "Option of the dropdown for configuring the image sizing of the chart cell (fill)" }, "properties.forecast.title": { - "value": "Forecast", - "comment": "Title for forecast configuration section" + "text": "Forecast", + "crowdinContext": "Title for forecast configuration section" }, "properties.forecastDisabled.title": { - "value": "Forecast is not available for this combination of buckets", - "comment": "Message shown when forecast feature is not available for current chart configuration" + "text": "Forecast is not available for this combination of buckets", + "crowdinContext": "Message shown when forecast feature is not available for current chart configuration" }, "properties.forecastPeriod.title": { - "value": "Period", - "comment": "Label for forecast period configuration" + "text": "Period", + "crowdinContext": "Label for forecast period configuration" }, "properties.forecastPeriod.placeholder": { - "value": "Period", - "comment": "Placeholder text for forecast period input field" + "text": "Period", + "crowdinContext": "Placeholder text for forecast period input field" }, "properties.forecastSeasonal.title": { - "value": "Seasonality", - "comment": "Label for forecast seasonality configuration" + "text": "Seasonality", + "crowdinContext": "Label for forecast seasonality configuration" }, "properties.forecastConfidence.title": { - "value": "Confidence", - "comment": "Label for confidence level when forecasting measure/metric trends" + "text": "Confidence", + "crowdinContext": "Label for confidence level when forecasting measure/metric trends" }, "properties.forecastConfidence.70": { - "value": "70%", - "comment": "70% confidence level option for measure/metric trend forecasting" + "text": "70%", + "crowdinContext": "70% confidence level option for measure/metric trend forecasting" }, "properties.forecastConfidence.75": { - "value": "75%", - "comment": "75% confidence level option for measure/metric trend forecasting" + "text": "75%", + "crowdinContext": "75% confidence level option for measure/metric trend forecasting" }, "properties.forecastConfidence.80": { - "value": "80%", - "comment": "80% confidence level option for measure/metric trend forecasting" + "text": "80%", + "crowdinContext": "80% confidence level option for measure/metric trend forecasting" }, "properties.forecastConfidence.85": { - "value": "85%", - "comment": "85% confidence level option for measure/metric trend forecasting" + "text": "85%", + "crowdinContext": "85% confidence level option for measure/metric trend forecasting" }, "properties.forecastConfidence.90": { - "value": "90%", - "comment": "90% confidence level option for measure/metric trend forecasting" + "text": "90%", + "crowdinContext": "90% confidence level option for measure/metric trend forecasting" }, "properties.forecastConfidence.95": { - "value": "95%", - "comment": "95% confidence level option for measure/metric trend forecasting" + "text": "95%", + "crowdinContext": "95% confidence level option for measure/metric trend forecasting" }, "properties.forecastSliced.title": { - "value": "Showing partial forecast.", - "comment": "Message title shown when measure/metric trend forecast is not available for the entire selected period" + "text": "Showing partial forecast.", + "crowdinContext": "Message title shown when measure/metric trend forecast is not available for the entire selected period" }, "properties.forecastSliced.description": { - "value": "The available data point don`t cover the entire selected period.", - "comment": "Message description that is shown when measure/metric trend forecast is not available for the entire selected period" + "text": "The available data point don`t cover the entire selected period.", + "crowdinContext": "Message description that is shown when measure/metric trend forecast is not available for the entire selected period" }, "properties.clustering.title": { - "value": "Cluster", - "comment": "Title of the clustering configuration section." + "text": "Cluster", + "crowdinContext": "Title of the clustering configuration section." }, "properties.clustering.amount": { - "value": "Amount", - "comment": "Label of the input for configuring the number of clusters." + "text": "Amount", + "crowdinContext": "Label of the input for configuring the number of clusters." }, "properties.clustering.amount.placeholder": { - "value": "3", - "comment": "Placeholder of the input for configuring the number of clusters." + "text": "3", + "crowdinContext": "Placeholder of the input for configuring the number of clusters." }, "properties.clustering.threshold": { - "value": "Threshold", - "comment": "Label of the input for configuring the clustering threshold." + "text": "Threshold", + "crowdinContext": "Label of the input for configuring the clustering threshold." }, "properties.clustering.threshold.placeholder": { - "value": "0.03", - "comment": "Placeholder of the input for configuring the clustering threshold. This placeholder is used to show the default value and format in which the threshold is expected." + "text": "0.03", + "crowdinContext": "Placeholder of the input for configuring the clustering threshold. This placeholder is used to show the default value and format in which the threshold is expected." }, "properties.clustering.threshold.tooltip": { - "value": "The threshold is a limit that determines when to group data. Learn more", - "comment": "Tooltip message of the clustering threshold input." + "text": "The threshold is a limit that determines when to group data. Learn more", + "crowdinContext": "Tooltip message of the clustering threshold input." }, "properties.clustering.amount.partial.title": { - "value": "Showing partial clusters", - "comment": "Message title that is shown when clustering amount is higher than the number of visualization data points." + "text": "Showing partial clusters", + "crowdinContext": "Message title that is shown when clustering amount is higher than the number of visualization data points." }, "properties.clustering.amount.partial.description": { - "value": "The available data points don't cover the entire selected amount.", - "comment": "Message description that is shown when clustering amount is higher than the number of visualization data points." + "text": "The available data points don't cover the entire selected amount.", + "crowdinContext": "Message description that is shown when clustering amount is higher than the number of visualization data points." }, "properties.clustering.disabled": { - "value": "Clustering requires 2 Metrics and View by, without Segment by.", - "comment": "Tooltip message of the disabled toggle that enables clustering" + "text": "Clustering requires 2 Metrics and View by, without Segment by.", + "crowdinContext": "Tooltip message of the disabled toggle that enables clustering" }, "properties.canvas.totalLabels": { - "value": "Total Labels", - "comment": "Label for total labels configuration option" + "text": "Total Labels", + "crowdinContext": "Label for total labels configuration option" }, "properties.canvas.totalLabels.auto": { - "value": "auto (default)", - "comment": "Label for automatic total labels configuration option" + "text": "auto (default)", + "crowdinContext": "Label for automatic total labels configuration option" }, "properties.canvas.totalLabels.show": { - "value": "show", - "comment": "Label for show total labels configuration option" + "text": "show", + "crowdinContext": "Label for show total labels configuration option" }, "properties.canvas.totalLabels.hide": { - "value": "hide", - "comment": "Label for hide total labels configuration option" + "text": "hide", + "crowdinContext": "Label for hide total labels configuration option" }, "properties.canvas.dataPoints": { - "value": "Data Points", - "comment": "Label for data points configuration option" + "text": "Data Points", + "crowdinContext": "Label for data points configuration option" }, "properties.canvas.dataPoints.auto": { - "value": "auto (default)", - "comment": "Label for automatic data points configuration option" + "text": "auto (default)", + "crowdinContext": "Label for automatic data points configuration option" }, "properties.canvas.dataPoints.show": { - "value": "show", - "comment": "Label for show data points configuration option" + "text": "show", + "crowdinContext": "Label for show data points configuration option" }, "properties.canvas.dataPoints.hide": { - "value": "hide", - "comment": "Label for hide data points configuration option" + "text": "hide", + "crowdinContext": "Label for hide data points configuration option" }, "properties.yaxis.title": { - "value": "Y-Axis", - "comment": "Vertical axis of a plot." + "text": "Y-Axis", + "crowdinContext": "Vertical axis of a plot." }, "properties.axis.labels": { - "value": "labels", - "comment": "Label for axis labels configuration option" + "text": "labels", + "crowdinContext": "Label for axis labels configuration option" }, "properties.axis.rotation": { - "value": "Rotation", - "comment": "Label for axis rotation configuration option" + "text": "Rotation", + "crowdinContext": "Label for axis rotation configuration option" }, "properties.axis.format": { - "value": "Format", - "comment": "Label for axis format configuration option" + "text": "Format", + "crowdinContext": "Label for axis format configuration option" }, "properties.axis.format.inherit": { - "value": "inherit", - "comment": "Axis format option to inherit formatting from used measure." + "text": "inherit", + "crowdinContext": "Axis format option to inherit formatting from used measure." }, "properties.axis.format.info.inherit": { - "value": "The format is inherited from the first metric in the visualization.", - "comment": "Info text for axis format option." + "text": "The format is inherited from the first metric in the visualization.", + "crowdinContext": "Info text for axis format option." }, "properties.axis.name": { - "value": "name", - "comment": "Name of the axis of a chart" + "text": "name", + "crowdinContext": "Name of the axis of a chart" }, "properties.axis.name.position": { - "value": "Position", - "comment": "Position of the axis of a chart" + "text": "Position", + "crowdinContext": "Position of the axis of a chart" }, "properties.axis.name.position.left": { - "value": "left", - "comment": "Left position option for axis name" + "text": "left", + "crowdinContext": "Left position option for axis name" }, "properties.axis.name.position.center": { - "value": "center", - "comment": "Horizontal center (between left and right)" + "text": "center", + "crowdinContext": "Horizontal center (between left and right)" }, "properties.axis.name.position.right": { - "value": "right", - "comment": "Right position option for axis name" + "text": "right", + "crowdinContext": "Right position option for axis name" }, "properties.axis.name.position.top": { - "value": "top", - "comment": "Top position option for axis name" + "text": "top", + "crowdinContext": "Top position option for axis name" }, "properties.axis.name.position.middle": { - "value": "middle", - "comment": "Vertical center (between top and bottom)" + "text": "middle", + "crowdinContext": "Vertical center (between top and bottom)" }, "properties.axis.name.position.bottom": { - "value": "bottom", - "comment": "Bottom position option for axis name" + "text": "bottom", + "crowdinContext": "Bottom position option for axis name" }, "properties.axis.min": { - "value": "Min", - "comment": "Label for minimum axis value configuration" + "text": "Min", + "crowdinContext": "Label for minimum axis value configuration" }, "properties.axis.min.warning": { - "value": "Min value cannot be greater than max value", - "comment": "Warning message when minimum axis value exceeds maximum value" + "text": "Min value cannot be greater than max value", + "crowdinContext": "Warning message when minimum axis value exceeds maximum value" }, "properties.axis.max": { - "value": "Max", - "comment": "Label for maximum axis value configuration" + "text": "Max", + "crowdinContext": "Label for maximum axis value configuration" }, "properties.axis.max.warning": { - "value": "Max value cannot be smaller than min value", - "comment": "Warning message when maximum axis value is less than minimum value" + "text": "Max value cannot be smaller than min value", + "crowdinContext": "Warning message when maximum axis value is less than minimum value" }, "properties.xaxis.title": { - "value": "X-Axis", - "comment": "Horizontal axis of a plot." + "text": "X-Axis", + "crowdinContext": "Horizontal axis of a plot." }, "properties.axis.scale": { - "value": "scale", - "comment": "Label for axis scale configuration" + "text": "scale", + "crowdinContext": "Label for axis scale configuration" }, "properties.axis.left": { - "value": "Left", - "comment": "Left axis position option" + "text": "Left", + "crowdinContext": "Left axis position option" }, "properties.axis.right": { - "value": "Right", - "comment": "Right axis position option" + "text": "Right", + "crowdinContext": "Right axis position option" }, "properties.axis.top": { - "value": "Top", - "comment": "Top axis position option" + "text": "Top", + "crowdinContext": "Top axis position option" }, "properties.axis.bottom": { - "value": "Bottom", - "comment": "Bottom axis position option" + "text": "Bottom", + "crowdinContext": "Bottom axis position option" }, "properties.rotation.0": { - "value": "0°", - "comment": "0 degrees rotation option" + "text": "0°", + "crowdinContext": "0 degrees rotation option" }, "properties.rotation.30": { - "value": "30°", - "comment": "30 degrees rotation option" + "text": "30°", + "crowdinContext": "30 degrees rotation option" }, "properties.rotation.45": { - "value": "45°", - "comment": "45 degrees rotation option" + "text": "45°", + "crowdinContext": "45 degrees rotation option" }, "properties.rotation.60": { - "value": "60°", - "comment": "60 degrees rotation option" + "text": "60°", + "crowdinContext": "60 degrees rotation option" }, "properties.rotation.90": { - "value": "90°", - "comment": "90 degrees rotation option" + "text": "90°", + "crowdinContext": "90 degrees rotation option" }, "properties.legend.position.up": { - "value": "top", - "comment": "Top legend position option" + "text": "top", + "crowdinContext": "Top legend position option" }, "properties.legend.position.down": { - "value": "bottom", - "comment": "Bottom legend position option" + "text": "bottom", + "crowdinContext": "Bottom legend position option" }, "properties.legend.position.right": { - "value": "right", - "comment": "Right legend position option" + "text": "right", + "crowdinContext": "Right legend position option" }, "properties.legend.position.left": { - "value": "left", - "comment": "Left legend position option" + "text": "left", + "crowdinContext": "Left legend position option" }, "properties.orientation.title": { - "value": "Orientation", - "comment": "The title for the orientation configuration section" + "text": "Orientation", + "crowdinContext": "The title for the orientation configuration section" }, "properties.orientation.horizontal": { - "value": "Horizontal (default)", - "comment": "The chart orientation configuration" + "text": "Horizontal (default)", + "crowdinContext": "The chart orientation configuration" }, "properties.orientation.vertical": { - "value": "Vertical", - "comment": "The chart orientation configuration" + "text": "Vertical", + "crowdinContext": "The chart orientation configuration" }, "properties.points.title": { - "value": "Points", - "comment": "Points on map" + "text": "Points", + "crowdinContext": "Points on map" }, "properties.points.groupNearbyPoints": { - "value": "Group nearby points", - "comment": "Option to group nearby points on map visualizations" + "text": "Group nearby points", + "crowdinContext": "Option to group nearby points on map visualizations" }, "properties.points.size.title": { - "value": "Point Size", - "comment": "Size of a point on a map" + "text": "Point Size", + "crowdinContext": "Size of a point on a map" }, "properties.points.size.extra_small": { - "value": "0.5x", - "comment": "Multiplicator of size of a point on map. Means 50% of size." + "text": "0.5x", + "crowdinContext": "Multiplicator of size of a point on map. Means 50% of size." }, "properties.points.size.small": { - "value": "0.75x", - "comment": "Multiplicator of size of a point on map. Means 75% of size." + "text": "0.75x", + "crowdinContext": "Multiplicator of size of a point on map. Means 75% of size." }, "properties.points.size.normal": { - "value": "normal", - "comment": "Multiplicator of size of a point on map. Means 100% of size." + "text": "normal", + "crowdinContext": "Multiplicator of size of a point on map. Means 100% of size." }, "properties.points.size.large": { - "value": "1.25x", - "comment": "Multiplicator of size of a point on map. Means 125% of size." + "text": "1.25x", + "crowdinContext": "Multiplicator of size of a point on map. Means 125% of size." }, "properties.points.size.extra_large": { - "value": "1.5x", - "comment": "Multiplicator of size of a point on map. Means 150% of size." + "text": "1.5x", + "crowdinContext": "Multiplicator of size of a point on map. Means 150% of size." }, "properties.points.size.min.title": { - "value": "Smallest", - "comment": "Smallest size of a point on a map" + "text": "Smallest", + "crowdinContext": "Smallest size of a point on a map" }, "properties.points.size.max.title": { - "value": "Largest", - "comment": "Largest size of a point on a map" + "text": "Largest", + "crowdinContext": "Largest size of a point on a map" }, "properties.map.title": { - "value": "Map", - "comment": "Map configuration" + "text": "Map", + "crowdinContext": "Map configuration" }, "properties.viewport.area.title": { - "value": "Default viewport", - "comment": "Default viewport configuration" + "text": "Default viewport", + "crowdinContext": "Default viewport configuration" }, "properties.viewport.area.auto_default": { - "value": "Include all data", - "comment": "All data will be visibled on the map" + "text": "Include all data", + "crowdinContext": "All data will be visibled on the map" }, "properties.viewport.area.continents": { - "value": "continents", - "comment": "Viewport area option for continent-level map view" + "text": "continents", + "crowdinContext": "Viewport area option for continent-level map view" }, "properties.viewport.area.continent_af": { - "value": "Africa", - "comment": "Continent Africa" + "text": "Africa", + "crowdinContext": "Continent Africa" }, "properties.viewport.area.continent_as": { - "value": "Asia", - "comment": "Continent Asia" + "text": "Asia", + "crowdinContext": "Continent Asia" }, "properties.viewport.area.continent_au": { - "value": "Australia", - "comment": "Continent Australia" + "text": "Australia", + "crowdinContext": "Continent Australia" }, "properties.viewport.area.continent_eu": { - "value": "Europe", - "comment": "Continent Europe" + "text": "Europe", + "crowdinContext": "Continent Europe" }, "properties.viewport.area.continent_na": { - "value": "America (North)", - "comment": "Continent North America" + "text": "America (North)", + "crowdinContext": "Continent North America" }, "properties.viewport.area.continent_sa": { - "value": "America (South)", - "comment": "Continent South America" + "text": "America (South)", + "crowdinContext": "Continent South America" }, "properties.viewport.area.world": { - "value": "World", - "comment": "Viewport area option for global world map view" + "text": "World", + "crowdinContext": "Viewport area option for global world map view" }, "gs.color-dropdown.custom-color": { - "value": "Custom color", - "comment": "Option to select custom color in color dropdown" + "text": "Custom color", + "crowdinContext": "Option to select custom color in color dropdown" }, "properties.colors.reset-colors": { - "value": "Reset Colors", - "comment": "Button to reset colors to default values" + "text": "Reset Colors", + "crowdinContext": "Button to reset colors to default values" }, "properties.colors": { - "value": "Colors", - "comment": "Label for colors configuration section" + "text": "Colors", + "crowdinContext": "Label for colors configuration section" }, "properties.colorsAndFills": { - "value": "Colors and fills", - "comment": "Label for colors configuration section" + "text": "Colors and fills", + "crowdinContext": "Label for colors configuration section" }, "properties.fill": { - "value": "Fill", - "comment": "Label for a checkbox that enables usages of pattern fill instead of solid colors in charts" + "text": "Fill", + "crowdinContext": "Label for a checkbox that enables usages of pattern fill instead of solid colors in charts" }, "properties.fill.solid": { - "value": "solid (default)", - "comment": "Label for a dropdown option that configures bar chart to be filled with a solid color." + "text": "solid (default)", + "crowdinContext": "Label for a dropdown option that configures bar chart to be filled with a solid color." }, "properties.fill.pattern": { - "value": "pattern", - "comment": "Label for a dropdown option that configures bar chart to be filled with a pattern." + "text": "pattern", + "crowdinContext": "Label for a dropdown option that configures bar chart to be filled with a pattern." }, "properties.fill.outline": { - "value": "outline", - "comment": "Label for a dropdown option that configures bar chart fill as a dark outline with light background." + "text": "outline", + "crowdinContext": "Label for a dropdown option that configures bar chart fill as a dark outline with light background." }, "properties.colors.unsupported": { - "value": "There are no colors for this configuration of the visualization", - "comment": "Message when color configuration is not supported for insight visualization" + "text": "There are no colors for this configuration of the visualization", + "crowdinContext": "Message when color configuration is not supported for insight visualization" }, "export_unsupported.colors": { - "value": "The visualization is not compatible with custom colors. To open the visualization as a report, click Reset Colors in Configuration —> Colors.", - "comment": "Message when insight visualization doesn't support custom colors" + "text": "The visualization is not compatible with custom colors. To open the visualization as a report, click Reset Colors in Configuration —> Colors.", + "crowdinContext": "Message when insight visualization doesn't support custom colors" }, "dashboard.bucket.measures_title.bullet": { - "value": "Metric", - "comment": "Label for primary metric bucket in bullet chart" + "text": "Metric", + "crowdinContext": "Label for primary metric bucket in bullet chart" }, "dashboard.bucket.secondary_measures_title.bullet": { - "value": "Metric", - "comment": "Label for secondary metric bucket in bullet chart" + "text": "Metric", + "crowdinContext": "Label for secondary metric bucket in bullet chart" }, "dashboard.bucket.tertiary_measures_title.bullet": { - "value": "Metric", - "comment": "Label for tertiary metric bucket in bullet chart" + "text": "Metric", + "crowdinContext": "Label for tertiary metric bucket in bullet chart" }, "dashboard.bucket.measures_subtitle.bullet": { - "value": "Primary", - "comment": "Primary measure of a bullet chart." + "text": "Primary", + "crowdinContext": "Primary measure of a bullet chart." }, "dashboard.bucket.secondary_measures_subtitle.bullet": { - "value": "Target", - "comment": "Target of a bullet chart." + "text": "Target", + "crowdinContext": "Target of a bullet chart." }, "dashboard.bucket.tertiary_measures_subtitle.bullet": { - "value": "Comparative", - "comment": "Comparative measures of a bullet chart" + "text": "Comparative", + "crowdinContext": "Comparative measures of a bullet chart" }, "sorting.disabled.explanation.attribute": { - "value": "Sorting is not possible for this visualization configuration.", - "comment": "Explains why sort button is disabled. Shown as tooltip" + "text": "Sorting is not possible for this visualization configuration.", + "crowdinContext": "Explains why sort button is disabled. Shown as tooltip" }, "sorting.disabled.explanation.measure": { - "value": "You must add at least one attribute to sort the visualization. You can also adjust the position of items in the Metrics section to change their position in the visualization.", - "comment": "Explains why sort button is disabled. Shown as tooltip" + "text": "You must add at least one attribute to sort the visualization. You can also adjust the position of items in the Metrics section to change their position in the visualization.", + "crowdinContext": "Explains why sort button is disabled. Shown as tooltip" }, "properties.metrics.title": { - "value": "Metrics", - "comment": "Title for metrics section in table properties" + "text": "Metrics", + "crowdinContext": "Title for metrics section in table properties" }, "properties.metrics.position": { - "value": "Position", - "comment": "Label for metrics position setting in table" + "text": "Position", + "crowdinContext": "Label for metrics position setting in table" }, "properties.metrics.position.columns": { - "value": "columns (default)", - "comment": "Option to position metrics in columns (default layout)" + "text": "columns (default)", + "crowdinContext": "Option to position metrics in columns (default layout)" }, "properties.metrics.position.rows": { - "value": "rows", - "comment": "Option to position metrics in rows" + "text": "rows", + "crowdinContext": "Option to position metrics in rows" }, "properties.column.headers.title": { - "value": "Column Headers", - "comment": "Title for column headers configuration section" + "text": "Column Headers", + "crowdinContext": "Title for column headers configuration section" }, "properties.column.headers.position": { - "value": "Position", - "comment": "Label for column headers position setting" + "text": "Position", + "crowdinContext": "Label for column headers position setting" }, "properties.column.headers.position.top": { - "value": "top (default)", - "comment": "Option to position column headers at top (default)" + "text": "top (default)", + "crowdinContext": "Option to position column headers at top (default)" }, "properties.column.headers.position.left": { - "value": "left", - "comment": "Option to position column headers on left side" + "text": "left", + "crowdinContext": "Option to position column headers on left side" }, "properties.column.headers.wrapText": { - "value": "Wrap text", - "comment": "Title for column headers wrap text configuration section" + "text": "Wrap text", + "crowdinContext": "Title for column headers wrap text configuration section" }, "properties.cells.title": { - "value": "Cells", - "comment": "Label for cells configuration section" + "text": "Cells", + "crowdinContext": "Label for cells configuration section" }, "properties.cells.wrapText": { - "value": "Wrap text", - "comment": "Title for cells wrap text configuration section" + "text": "Wrap text", + "crowdinContext": "Title for cells wrap text configuration section" }, "properties.cells.grandTotals.title": { - "value": "Grand Total Row", - "comment": "Label for grand totals configuration section in table" + "text": "Grand Total Row", + "crowdinContext": "Label for grand totals configuration section in table" }, "properties.cells.grandTotals.position.label": { - "value": "Position", - "comment": "Label for grand totals position dropdown" + "text": "Position", + "crowdinContext": "Label for grand totals position dropdown" }, "properties.cells.grandTotals.position.pinnedBottom": { - "value": "bottom pinned (default)", - "comment": "Option to pin grand totals at bottom (always visible)" + "text": "bottom pinned (default)", + "crowdinContext": "Option to pin grand totals at bottom (always visible)" }, "properties.cells.grandTotals.position.bottom": { - "value": "bottom", - "comment": "Option to place grand totals at end of table data (scrolls)" + "text": "bottom", + "crowdinContext": "Option to place grand totals at end of table data (scrolls)" }, "properties.cells.grandTotals.position.pinnedTop": { - "value": "top pinned", - "comment": "Option to pin grand totals at top (always visible)" + "text": "top pinned", + "crowdinContext": "Option to pin grand totals at top (always visible)" }, "properties.cells.grandTotals.position.top": { - "value": "top", - "comment": "Option to place grand totals at beginning of table data (scrolls)" + "text": "top", + "crowdinContext": "Option to place grand totals at beginning of table data (scrolls)" }, "properties.paging.title": { - "value": "Paging", - "comment": "Title for pagination configuration section" + "text": "Paging", + "crowdinContext": "Title for pagination configuration section" }, "properties.paging.pageSize": { - "value": "Page size", - "comment": "Label for page size dropdown in pagination settings" + "text": "Page size", + "crowdinContext": "Label for page size dropdown in pagination settings" }, "properties.paging.pageSize.auto": { - "value": "auto (default)", - "comment": "Option label for automatically sized pagination page size" + "text": "auto (default)", + "crowdinContext": "Option label for automatically sized pagination page size" }, "dashboard.bucket.table.subtitle.columns": { - "value": "in columns", - "comment": "Subtitle indicating table data is arranged in columns" + "text": "in columns", + "crowdinContext": "Subtitle indicating table data is arranged in columns" }, "dashboard.bucket.table.subtitle.rows": { - "value": "in rows", - "comment": "Subtitle indicating table data is arranged in rows" + "text": "in rows", + "crowdinContext": "Subtitle indicating table data is arranged in rows" }, "properties.interactions.title": { - "value": "Interactions", - "comment": "The title for the interactions configuration section" + "text": "Interactions", + "crowdinContext": "The title for the interactions configuration section" }, "properties.advanced.title": { - "value": "Advanced customizations", - "comment": "The title for the advanced configuration section" + "text": "Advanced customizations", + "crowdinContext": "The title for the advanced configuration section" }, "properties.advanced.chartConfigOverride.noValueLabel": { - "value": "No customizations yet.", - "comment": "Text show when user did not define any customization yet." + "text": "No customizations yet.", + "crowdinContext": "Text show when user did not define any customization yet." }, "properties.advanced.chartConfigOverride.link": { - "value": "Learn more", - "comment": "Text of link that leads to feature documentation." + "text": "Learn more", + "crowdinContext": "Text of link that leads to feature documentation." }, "properties.advanced.chartConfigOverride.editorButton": { - "value": "Open editor", - "comment": "Text of button that opens editor of configuration." + "text": "Open editor", + "crowdinContext": "Text of button that opens editor of configuration." }, "properties.advanced.chartConfigOverride.title": { - "value": "Advanced customization", - "comment": "Text of dialog that defines advanced customization of visualization." + "text": "Advanced customization", + "crowdinContext": "Text of dialog that defines advanced customization of visualization." }, "properties.advanced.chartConfigOverride.snippets.header": { - "value": "Snippets", - "comment": "The header of list that contains snippets (recipes) of various charts configurations." + "text": "Snippets", + "crowdinContext": "The header of list that contains snippets (recipes) of various charts configurations." }, "properties.advanced.chartConfigOverride.button.apply": { - "value": "Apply", - "comment": "The label of button in dialog that applies the dialog value." + "text": "Apply", + "crowdinContext": "The label of button in dialog that applies the dialog value." }, "properties.advanced.chartConfigOverride.button.cancel": { - "value": "Cancel", - "comment": "The label of button in dialog that closes the dialog." + "text": "Cancel", + "crowdinContext": "The label of button in dialog that closes the dialog." }, "properties.interactions.drillDown": { - "value": "Drill down", - "comment": "The text for the drill down checkbox" + "text": "Drill down", + "crowdinContext": "The text for the drill down checkbox" }, "properties.interactions.drillIntoURL": { - "value": "Drill into URL", - "comment": "The text for the drill into URL checkbox. When enabled, it renders all cells with a defined link label as a clickable hyperlinks." + "text": "Drill into URL", + "crowdinContext": "The text for the drill into URL checkbox. When enabled, it renders all cells with a defined link label as a clickable hyperlinks." }, "properties.interactions.alerts": { - "value": "Alert", - "comment": "Label of the checkbox that enables/disables alerts configuration for particular visualization." + "text": "Alert", + "crowdinContext": "Label of the checkbox that enables/disables alerts configuration for particular visualization." }, "properties.interactions.alerts.tooltip": { - "value": "Enable users to create alerts for this visualization on dashboards.", - "comment": "Tooltip for the checkbox that enables/disables alerts configuration for particular visualization." + "text": "Enable users to create alerts for this visualization on dashboards.", + "crowdinContext": "Tooltip for the checkbox that enables/disables alerts configuration for particular visualization." }, "properties.interactions.scheduledExports": { - "value": "Scheduled exports", - "comment": "Label of the checkbox that enables/disables scheduled exports configuration for particular visualization." + "text": "Scheduled exports", + "crowdinContext": "Label of the checkbox that enables/disables scheduled exports configuration for particular visualization." }, "properties.interactions.scheduledExports.tooltip": { - "value": "Enable users to create scheduled exports for this visualization on dashboards.", - "comment": "Tooltip for the checkbox that enables/disables scheduled exports configuration for particular visualization." + "text": "Enable users to create scheduled exports for this visualization on dashboards.", + "crowdinContext": "Tooltip for the checkbox that enables/disables scheduled exports configuration for particular visualization." }, "properties.comparison.title": { - "value": "Comparison", - "comment": "The title of comparison section" + "text": "Comparison", + "crowdinContext": "The title of comparison section" }, "properties.comparison.calculationType.title": { - "value": "Calculated as", - "comment": "The label of calculation type dropdown" + "text": "Calculated as", + "crowdinContext": "The label of calculation type dropdown" }, "properties.comparison.calculationType.as.change": { - "value": "Change", - "comment": "The title of the dropdown option that specifies the arithmetic operation to calculate the change between two values." + "text": "Change", + "crowdinContext": "The title of the dropdown option that specifies the arithmetic operation to calculate the change between two values." }, "properties.comparison.calculationType.as.ratio": { - "value": "Ratio", - "comment": "The title of the dropdown option that specifies the arithmetic operation to calculate the ratio between two values." + "text": "Ratio", + "crowdinContext": "The title of the dropdown option that specifies the arithmetic operation to calculate the ratio between two values." }, "properties.comparison.calculationType.as.difference": { - "value": "Difference", - "comment": "The title of the dropdown option that specifies the arithmetic operation to calculate the difference between two values." + "text": "Difference", + "crowdinContext": "The title of the dropdown option that specifies the arithmetic operation to calculate the difference between two values." }, "properties.comparison.calculationType.as.changeDifference": { - "value": "Change (difference)", - "comment": "The title of the dropdown option that specifies the arithmetic operation to calculate the change and difference between two values." + "text": "Change (difference)", + "crowdinContext": "The title of the dropdown option that specifies the arithmetic operation to calculate the change and difference between two values." }, "properties.comparison.calculationType.as.change.tooltip.useIn": { - "value": "Calculates the relative change between primary and secondary metric values.", - "comment": "The content describes the pertinent scenarios for the change calculation." + "text": "Calculates the relative change between primary and secondary metric values.", + "crowdinContext": "The content describes the pertinent scenarios for the change calculation." }, "properties.comparison.calculationType.as.ratio.tooltip.useIn": { - "value": "Quantifies the share of the primary metric value in the secondary metric value.", - "comment": "The content describes the pertinent scenarios for the ratio calculation." + "text": "Quantifies the share of the primary metric value in the secondary metric value.", + "crowdinContext": "The content describes the pertinent scenarios for the ratio calculation." }, "properties.comparison.calculationType.as.difference.tooltip.useIn": { - "value": "Calculates the absolute difference between primary and secondary metric values.", - "comment": "The content describes the pertinent scenarios for the difference calculation." + "text": "Calculates the absolute difference between primary and secondary metric values.", + "crowdinContext": "The content describes the pertinent scenarios for the difference calculation." }, "properties.comparison.calculationType.as.changeDifference.tooltip.useIn": { - "value": "Calculates both the relative change and absolute difference between primary and secondary metric values.", - "comment": "The content describes the pertinent scenarios for the change (difference) calculation." + "text": "Calculates both the relative change and absolute difference between primary and secondary metric values.", + "crowdinContext": "The content describes the pertinent scenarios for the change (difference) calculation." }, "properties.comparison.calculationType.tooltip.formula.section": { - "value": "Formula", - "comment": "The title of the section that describes the formula for the calculation" + "text": "Formula", + "crowdinContext": "The title of the section that describes the formula for the calculation" }, "properties.comparison.calculationType.tooltip.formulaChange.section": { - "value": "Formula (relative change)", - "comment": "The title of the section that describes the formula for the change calculation" + "text": "Formula (relative change)", + "crowdinContext": "The title of the section that describes the formula for the change calculation" }, "properties.comparison.calculationType.tooltip.formulaDifference.section": { - "value": "Formula (absolute difference)", - "comment": "The title of the section that describes the formula for the difference calculation" + "text": "Formula (absolute difference)", + "crowdinContext": "The title of the section that describes the formula for the difference calculation" }, "properties.comparison.calculationType.as.change.tooltip.formula": { - "value": "(Primary - Secondary) / Secondary", - "comment": "The content describes the formula of the change calculation." + "text": "(Primary - Secondary) / Secondary", + "crowdinContext": "The content describes the formula of the change calculation." }, "properties.comparison.calculationType.as.ratio.tooltip.formula": { - "value": "Primary / Secondary", - "comment": "The content describes the formula of the ratio calculation." + "text": "Primary / Secondary", + "crowdinContext": "The content describes the formula of the ratio calculation." }, "properties.comparison.calculationType.as.difference.tooltip.formula": { - "value": "Primary - Secondary", - "comment": "The content describes the formula of the difference calculation." + "text": "Primary - Secondary", + "crowdinContext": "The content describes the formula of the difference calculation." }, "properties.comparison.calculationType.tooltip.example.section": { - "value": "Example", - "comment": "The title of the section that provides an example for the calculation" + "text": "Example", + "crowdinContext": "The title of the section that provides an example for the calculation" }, "properties.comparison.calculationType.as.change.tooltip.example": { - "value": "Year-over-year sales change = (the current year's sales - the previous year's sales) / the previous year's sales", - "comment": "The example illustrating the change calculation." + "text": "Year-over-year sales change = (the current year's sales - the previous year's sales) / the previous year's sales", + "crowdinContext": "The example illustrating the change calculation." }, "properties.comparison.calculationType.as.ratio.tooltip.example": { - "value": "Current sales compared to a quota = current sales / quota", - "comment": "The example illustrating the ratio calculation." + "text": "Current sales compared to a quota = current sales / quota", + "crowdinContext": "The example illustrating the ratio calculation." }, "properties.comparison.calculationType.as.difference.tooltip.example": { - "value": "Year-over-year sales difference = the current year's sales - the previous year's sales", - "comment": "The example illustrating the difference calculation." + "text": "Year-over-year sales difference = the current year's sales - the previous year's sales", + "crowdinContext": "The example illustrating the difference calculation." }, "properties.comparison.calculationType.as.changeDifference.tooltip.example": { - "value": "Year-over-year sales change = [(the current year's sales - the previous year's sales) / the previous year's sales] AND [the current year's sales - the previous year's sales]", - "comment": "The example illustrating the change (difference) calculation." + "text": "Year-over-year sales change = [(the current year's sales - the previous year's sales) / the previous year's sales] AND [the current year's sales - the previous year's sales]", + "crowdinContext": "The example illustrating the change (difference) calculation." }, "properties.comparison.measureNumber.format.preset.inherit": { - "value": "Inherit", - "comment": "An item in list of formatting presets. Means: use inherited measure format" + "text": "Inherit", + "crowdinContext": "An item in list of formatting presets. Means: use inherited measure format" }, "properties.comparison.measureNumber.format.preset.rounded": { - "value": "Rounded", - "comment": "An item in list of formatting presets. Whole number without decimal numbers." + "text": "Rounded", + "crowdinContext": "An item in list of formatting presets. Whole number without decimal numbers." }, "properties.comparison.measureNumber.format.preset.decimal1": { - "value": "Decimal (1)", - "comment": "An item in list of formatting presets. Decimal number measure format with one decimal number." + "text": "Decimal (1)", + "crowdinContext": "An item in list of formatting presets. Decimal number measure format with one decimal number." }, "properties.comparison.measureNumber.format.preset.decimal2": { - "value": "Decimal (2)", - "comment": "An item in list of formatting presets. Decimal number measure format with two decimal numbers." + "text": "Decimal (2)", + "crowdinContext": "An item in list of formatting presets. Decimal number measure format with two decimal numbers." }, "properties.comparison.measureNumber.format.preset.percentRounded": { - "value": "Percent (rounded)", - "comment": "An item in list of formatting presets. Whole number without decimal numbers and with % sign at the end." + "text": "Percent (rounded)", + "crowdinContext": "An item in list of formatting presets. Whole number without decimal numbers and with % sign at the end." }, "properties.comparison.measureNumber.format.preset.percent1": { - "value": "Percent (1)", - "comment": "An item in list of formatting presets. Decimal number with one decimal number and % sign at the end." + "text": "Percent (1)", + "crowdinContext": "An item in list of formatting presets. Decimal number with one decimal number and % sign at the end." }, "properties.comparison.measureNumber.format.preset.percent2": { - "value": "Percent (2)", - "comment": "An item in list of formatting presets. Decimal number with two decimal numbers and % sign at the end." + "text": "Percent (2)", + "crowdinContext": "An item in list of formatting presets. Decimal number with two decimal numbers and % sign at the end." }, "properties.comparison.measureNumber.format.template.rounded": { - "value": "Rounded", - "comment": "An item in list of formatting templates. Whole number without decimal numbers." + "text": "Rounded", + "crowdinContext": "An item in list of formatting templates. Whole number without decimal numbers." }, "properties.comparison.measureNumber.format.template.decimal1": { - "value": "Decimal (1)", - "comment": "An item in list of formatting templates. Decimal number measure format with one decimal number." + "text": "Decimal (1)", + "crowdinContext": "An item in list of formatting templates. Decimal number measure format with one decimal number." }, "properties.comparison.measureNumber.format.template.decimal2": { - "value": "Decimal (2)", - "comment": "An item in list of formatting templates. Decimal number measure format with two decimal numbers." + "text": "Decimal (2)", + "crowdinContext": "An item in list of formatting templates. Decimal number measure format with two decimal numbers." }, "properties.comparison.measureNumber.format.template.percentRounded": { - "value": "Percent (rounded)", - "comment": "An item in list of formatting templates. Whole number without decimal numbers and with % sign at the end." + "text": "Percent (rounded)", + "crowdinContext": "An item in list of formatting templates. Whole number without decimal numbers and with % sign at the end." }, "properties.comparison.measureNumber.format.template.percent1": { - "value": "Percent (1)", - "comment": "An item in list of formatting templates. Decimal number with one decimal number and % sign at the end." + "text": "Percent (1)", + "crowdinContext": "An item in list of formatting templates. Decimal number with one decimal number and % sign at the end." }, "properties.comparison.measureNumber.format.template.percent2": { - "value": "Percent (2)", - "comment": "An item in list of formatting templates. Decimal number with two decimal numbers and % sign at the end." + "text": "Percent (2)", + "crowdinContext": "An item in list of formatting templates. Decimal number with two decimal numbers and % sign at the end." }, "properties.comparison.measureNumber.format.template.currency": { - "value": "Currency", - "comment": "An item in list of formatting templates. Number with currency sign." + "text": "Currency", + "crowdinContext": "An item in list of formatting templates. Number with currency sign." }, "properties.comparison.measureNumber.format.template.currencyShortened": { - "value": "Currency shortened", - "comment": "An item in list of formatting templates. Number with currency sign shortened with K, M, B and T characters." + "text": "Currency shortened", + "crowdinContext": "An item in list of formatting templates. Number with currency sign shortened with K, M, B and T characters." }, "properties.comparison.measureNumber.format.template.largeNumbersShortened": { - "value": "Large numbers shortened", - "comment": "An item in list of formatting templates. Number shortened with K, M, B and T characters." + "text": "Large numbers shortened", + "crowdinContext": "An item in list of formatting templates. Number shortened with K, M, B and T characters." }, "properties.comparison.measureNumber.format.template.largeNumbersShortenedWithColors": { - "value": "Large numbers shortened with colors", - "comment": "An item in list of formatting templates. Colored number shortened with K, M, B and T characters." + "text": "Large numbers shortened with colors", + "crowdinContext": "An item in list of formatting templates. Colored number shortened with K, M, B and T characters." }, "properties.comparison.measureNumber.format.template.negativeNumbersRed": { - "value": "Negative numbers in red", - "comment": "An item in list of formatting templates. Number is formatted in red color if negative." + "text": "Negative numbers in red", + "crowdinContext": "An item in list of formatting templates. Number is formatted in red color if negative." }, "properties.comparison.measureNumber.format.template.financial": { - "value": "Financial", - "comment": "An item in list of formatting templates. Number is in brackets if negative." + "text": "Financial", + "crowdinContext": "An item in list of formatting templates. Number is in brackets if negative." }, "properties.comparison.measureNumber.format.template.decimalWithoutThousandsSeparator": { - "value": "Decimal (2) without thousands separator", - "comment": "An item in list of formatting templates." + "text": "Decimal (2) without thousands separator", + "crowdinContext": "An item in list of formatting templates." }, "properties.comparison.measureNumber.format.template.conditionalColors": { - "value": "Conditional colors", - "comment": "An item in list of formatting templates. Numbers is formatted in different colors based on its value." + "text": "Conditional colors", + "crowdinContext": "An item in list of formatting templates. Numbers is formatted in different colors based on its value." }, "properties.comparison.measureNumber.format.template.trendSymbols": { - "value": "Trend symbols", - "comment": "An item in list of formatting templates. Numbers is formatted in different colors prefixed with arrow symbol based on its value." + "text": "Trend symbols", + "crowdinContext": "An item in list of formatting templates. Numbers is formatted in different colors prefixed with arrow symbol based on its value." }, "properties.comparison.measureNumber.format.template.timeFromSeconds": { - "value": "Time (from seconds)", - "comment": "An item in list of formatting templates. Seconds are formatted properly in hours, minutes and seconds." + "text": "Time (from seconds)", + "crowdinContext": "An item in list of formatting templates. Seconds are formatted properly in hours, minutes and seconds." }, "properties.comparison.measureNumber.format.template.zeroInsteadOfNull": { - "value": "Zero instead of blank value", - "comment": "An item in list of formatting templates. Null value is replaced with 0." + "text": "Zero instead of blank value", + "crowdinContext": "An item in list of formatting templates. Null value is replaced with 0." }, "properties.comparison.valueSubSection.title": { - "value": "Value", - "comment": "The label of comparison value sub section." + "text": "Value", + "crowdinContext": "The label of comparison value sub section." }, "properties.comparison.format.title": { - "value": "Format", - "comment": "The label of comparison format control." + "text": "Format", + "crowdinContext": "The label of comparison format control." }, "properties.comparison.subFormat.title": { - "value": "(Format)", - "comment": "The label of comparison sub format control." + "text": "(Format)", + "crowdinContext": "The label of comparison sub format control." }, "properties.comparison.indicator.title": { - "value": "Indicator", - "comment": "The label of comparison indicator sub section" + "text": "Indicator", + "crowdinContext": "The label of comparison indicator sub section" }, "properties.comparison.indicator.arrow.title": { - "value": "Arrow", - "comment": "The label of the checkbox that controls whether to use the arrow indicator or not." + "text": "Arrow", + "crowdinContext": "The label of the checkbox that controls whether to use the arrow indicator or not." }, "properties.comparison.indicator.colorConfig.title": { - "value": "Color", - "comment": "The label of the checkbox that controls whether to use the color or not." + "text": "Color", + "crowdinContext": "The label of the checkbox that controls whether to use the color or not." }, "properties.comparison.indicator.colorConfig.equals": { - "value": "Primary = Secondary", - "comment": "The label of the color item will be set when the primary value is equal to the secondary value." + "text": "Primary = Secondary", + "crowdinContext": "The label of the color item will be set when the primary value is equal to the secondary value." }, "properties.comparison.indicator.colorConfig.positive": { - "value": "Primary > Secondary", - "comment": "The label of the color item will be set when the primary value is greater than the secondary value." + "text": "Primary > Secondary", + "crowdinContext": "The label of the color item will be set when the primary value is greater than the secondary value." }, "properties.comparison.indicator.colorConfig.negative": { - "value": "Primary < Secondary", - "comment": "The label of the color item will be set when the primary value is less than the secondary value." + "text": "Primary < Secondary", + "crowdinContext": "The label of the color item will be set when the primary value is less than the secondary value." }, "properties.comparison.labelSubSection.title": { - "value": "Label", - "comment": "The label of comparison label sub section." + "text": "Label", + "crowdinContext": "The label of comparison label sub section." }, "properties.comparison.labelSubSection.positionOnTop.disabled": { - "value": "Labels not applicable for value position top.", - "comment": "Disable tooltip message when the comparison position is set to top." + "text": "Labels not applicable for value position top.", + "crowdinContext": "Disable tooltip message when the comparison position is set to top." }, "properties.comparison.labelSubSection.conditional.disabled": { - "value": "Conditional labels are not applicable to ratio calculations.", - "comment": "Disable tooltip message when the calculation is ratio." + "text": "Conditional labels are not applicable to ratio calculations.", + "crowdinContext": "Disable tooltip message when the calculation is ratio." }, "properties.comparison.labelName.title": { - "value": "Name", - "comment": "The label of name input control." + "text": "Name", + "crowdinContext": "The label of name input control." }, "properties.comparison.labelConditional.title": { - "value": "Conditional", - "comment": "The label of conditional checkbox control." + "text": "Conditional", + "crowdinContext": "The label of conditional checkbox control." }, "properties.comparison.labelPositive.title": { - "value": "Primary > Secondary", - "comment": "The label of the input control will be set when the primary value is greater than the secondary value." + "text": "Primary > Secondary", + "crowdinContext": "The label of the input control will be set when the primary value is greater than the secondary value." }, "properties.comparison.labelNegative.title": { - "value": "Primary < Secondary", - "comment": "The label of the input control will be set when the primary value is less than the secondary value." + "text": "Primary < Secondary", + "crowdinContext": "The label of the input control will be set when the primary value is less than the secondary value." }, "properties.comparison.labelEquals.title": { - "value": "Primary = Secondary", - "comment": "The label of the input control will be set when the primary value is equal the secondary value." + "text": "Primary = Secondary", + "crowdinContext": "The label of the input control will be set when the primary value is equal the secondary value." }, "properties.comparison.position.title": { - "value": "Position", - "comment": "The label of comparison position control." + "text": "Position", + "crowdinContext": "The label of comparison position control." }, "properties.comparison.position.top": { - "value": "top", - "comment": "The title of dropdown option that specifies the position of comparison to be on top." + "text": "top", + "crowdinContext": "The title of dropdown option that specifies the position of comparison to be on top." }, "properties.comparison.position.right": { - "value": "right", - "comment": "The title of dropdown option that specifies the position of comparison to be on right." + "text": "right", + "crowdinContext": "The title of dropdown option that specifies the position of comparison to be on right." }, "properties.comparison.position.left": { - "value": "left", - "comment": "The title of dropdown option that specifies the position of comparison to be on left." + "text": "left", + "crowdinContext": "The title of dropdown option that specifies the position of comparison to be on left." }, "visualizations.headline.tertiary.title": { - "value": "Versus", - "comment": "Means comparison of two values - for example '100 (this week) VERSUS 10 (last week)'." + "text": "Versus", + "crowdinContext": "Means comparison of two values - for example '100 (this week) VERSUS 10 (last week)'." }, "gs.date.yesterday": { - "value": "Yesterday", - "comment": "Label for yesterday date option" + "text": "Yesterday", + "crowdinContext": "Label for yesterday date option" }, "notifications.panel.button.label": { - "value": "Notifications", - "comment": "A global notifications button label in the main menu" + "text": "Notifications", + "crowdinContext": "A global notifications button label in the main menu" }, "notifications.panel.notifications.list.label": { - "value": "Notifications", - "comment": "Label for notifications list in panel" + "text": "Notifications", + "crowdinContext": "Label for notifications list in panel" }, "notifications.panel.tab.unread": { - "value": "Unread ({count})", - "comment": "Tab label showing unread notifications count" + "text": "Unread ({count})", + "crowdinContext": "Tab label showing unread notifications count" }, "notifications.panel.tab.all": { - "value": "All", - "comment": "Tab label for all notifications" + "text": "All", + "crowdinContext": "Tab label for all notifications" }, "notifications.panel.markAllAsRead": { - "value": "Mark all as read", - "comment": "Button to mark all notifications as read" + "text": "Mark all as read", + "crowdinContext": "Button to mark all notifications as read" }, "notifications.panel.error.loading": { - "value": "Error loading notifications", - "comment": "Error message when notifications fail to load" + "text": "Error loading notifications", + "crowdinContext": "Error message when notifications fail to load" }, "notifications.panel.empty.all": { - "value": "No notifications", - "comment": "Message when there are no notifications at all" + "text": "No notifications", + "crowdinContext": "Message when there are no notifications at all" }, "notifications.panel.empty.unread": { - "value": "No unread notifications", - "comment": "Message when there are no unread notifications" + "text": "No unread notifications", + "crowdinContext": "Message when there are no unread notifications" }, "notifications.panel.unsupported.notification.type": { - "value": "Unsupported notification type", - "comment": "Message for unsupported notification types" + "text": "Unsupported notification type", + "crowdinContext": "Message for unsupported notification types" }, "notifications.panel.markAsRead": { - "value": "Mark as read", - "comment": "Button to mark individual notification as read" + "text": "Mark as read", + "crowdinContext": "Button to mark individual notification as read" }, "notifications.panel.alert.notification.type.label": { - "value": "Alert notification", - "comment": "Label for alert type notifications" + "text": "Alert notification", + "crowdinContext": "Label for alert type notifications" }, "notifications.panel.download": { - "value": "Download", - "comment": "Button label for downloading notification files" + "text": "Download", + "crowdinContext": "Button label for downloading notification files" }, "notifications.panel.expiresOn": { - "value": "Expires on {date}", - "comment": "Message showing when notification expires" + "text": "Expires on {date}", + "crowdinContext": "Message showing when notification expires" }, "notifications.panel.linkHasExpired": { - "value": "Link has expired", - "comment": "Message when download link has expired" + "text": "Link has expired", + "crowdinContext": "Message when download link has expired" }, "notifications.panel.toast.warning.filesExpired": { - "value": "Download link expired — wait for the next export or create one manually.", - "comment": "Warning toast message when export files have expired" + "text": "Download link expired — wait for the next export or create one manually.", + "crowdinContext": "Warning toast message when export files have expired" }, "notifications.panel.dashboardLinkHint": { - "value": "Open the dashboard used for this export", - "comment": "Hint text for dashboard link in notifications panel" + "text": "Open the dashboard used for this export", + "crowdinContext": "Hint text for dashboard link in notifications panel" }, "notifications.panel.dashboardLink": { - "value": "From {dashboardTitle}", - "comment": "Link text showing which dashboard an export came from" + "text": "From {dashboardTitle}", + "crowdinContext": "Link text showing which dashboard an export came from" }, "notifications.panel.downloadFilesHint": { - "value": "Download the exported files", - "comment": "Hint text for download files action" + "text": "Download the exported files", + "crowdinContext": "Hint text for download files action" }, "notifications.filters.buttonLabel": { - "value": "{count, plural, one {# filter} other {# filters}}", - "comment": "Follow this guide for pluralization per locale https://formatjs.github.io/docs/core-concepts/icu-syntax#plural-format" + "text": "{count, plural, one {# filter} other {# filters}}", + "crowdinContext": "Follow this guide for pluralization per locale https://formatjs.github.io/docs/core-concepts/icu-syntax#plural-format" }, "notifications.filters.dialog.title": { - "value": "Filters", - "comment": "Title for filters dialog in notifications" + "text": "Filters", + "crowdinContext": "Title for filters dialog in notifications" }, "notifications.filters.dialog.dateRange": { - "value": "Date Range", - "comment": "Label for date range filter in notifications dialog" + "text": "Date Range", + "crowdinContext": "Label for date range filter in notifications dialog" }, "notifications.panel.triggers.title": { - "value": "for {triggeredCount}/{totalCount} items", - "comment": "Title showing triggered count vs total count for notification items" + "text": "for {triggeredCount}/{totalCount} items", + "crowdinContext": "Title showing triggered count vs total count for notification items" }, "notifications.panel.triggers.dialog.newValue": { - "value": "New value", - "comment": "Label for new value in notification triggers dialog" + "text": "New value", + "crowdinContext": "Label for new value in notification triggers dialog" }, "notifications.panel.triggers.dialog.truncatedValues": { - "value": "…and {count} more", - "comment": "Label for truncated values in notification triggers dialog" + "text": "…and {count} more", + "crowdinContext": "Label for truncated values in notification triggers dialog" }, "close": { - "value": "Close", - "comment": "Label of a button for closing a dialog window" + "text": "Close", + "crowdinContext": "Label of a button for closing a dialog window" }, "notifications.panel.triggers.dialog.title": { - "value": "Triggered for", - "comment": "Title for notification triggers dialog" + "text": "Triggered for", + "crowdinContext": "Title for notification triggers dialog" }, "notifications.panel.error.learnMore": { - "value": "Learn more", - "comment": "Link text to learn more about an error" + "text": "Learn more", + "crowdinContext": "Link text to learn more about an error" }, "notifications.panel.error.traceId": { - "value": "Trace ID", - "comment": "Label for trace ID in error message" + "text": "Trace ID", + "crowdinContext": "Label for trace ID in error message" }, "notifications.panel.error.alert.title": { - "value": "The alert could not be processed.", - "comment": "Error message when alert cannot be processed" + "text": "The alert could not be processed.", + "crowdinContext": "Error message when alert cannot be processed" }, "notifications.panel.error.schedule.title": { - "value": "Scheduled export failed.", - "comment": "Error message when scheduled export cannot be processed" + "text": "Scheduled export failed.", + "crowdinContext": "Error message when scheduled export cannot be processed" }, "notifications.panel.error.limitExceeded.message": { - "value": "Your export could not be sent, because your organization has reached the limit for maximum number of daily alerts and scheduled exports. Please contact your administrator.", - "comment": "Error message when export cannot be sent due to limit reached" + "text": "Your export could not be sent, because your organization has reached the limit for maximum number of daily alerts and scheduled exports. Please contact your administrator.", + "crowdinContext": "Error message when export cannot be sent due to limit reached" }, "automations.alert.config.comparisonOperator.lessThan": { - "value": "Is less than", - "comment": "Comparison operator in alert configuration" + "text": "Is less than", + "crowdinContext": "Comparison operator in alert configuration" }, "automations.alert.config.comparisonOperator.lessThanOrEquals": { - "value": "Is less than or equal to", - "comment": "Comparison operator in alert configuration" + "text": "Is less than or equal to", + "crowdinContext": "Comparison operator in alert configuration" }, "automations.alert.config.comparisonOperator.greaterThan": { - "value": "Is greater than", - "comment": "Comparison operator in alert configuration" + "text": "Is greater than", + "crowdinContext": "Comparison operator in alert configuration" }, "automations.alert.config.comparisonOperator.greaterThanOrEquals": { - "value": "Is greater than or equal to", - "comment": "Comparison operator in alert configuration" + "text": "Is greater than or equal to", + "crowdinContext": "Comparison operator in alert configuration" }, "automations.alert.config.changeOperator.increasesBy": { - "value": "Increases by", - "comment": "Alert condition for when a metric's percentage change increases by a specified amount" + "text": "Increases by", + "crowdinContext": "Alert condition for when a metric's percentage change increases by a specified amount" }, "automations.alert.config.changeOperator.decreasesBy": { - "value": "Decreases by", - "comment": "Alert condition for when a metric's percentage change decreases by a specified amount" + "text": "Decreases by", + "crowdinContext": "Alert condition for when a metric's percentage change decreases by a specified amount" }, "automations.alert.config.changeOperator.changesBy": { - "value": "Changes by", - "comment": "Alert condition for when a metric's percentage change (either increase or decrease) exceeds a specified amount" + "text": "Changes by", + "crowdinContext": "Alert condition for when a metric's percentage change (either increase or decrease) exceeds a specified amount" }, "automations.filter.untitledUser": { - "value": "Untitled user", - "comment": "Label for untitled user in filter options" + "text": "Untitled user", + "crowdinContext": "Label for untitled user in filter options" }, "automations.alert.config.differenceOperator.increasesBy": { - "value": "Increases by", - "comment": "Alert condition for when a metric's numeric value increases by a specified amount" + "text": "Increases by", + "crowdinContext": "Alert condition for when a metric's numeric value increases by a specified amount" }, "automations.alert.config.differenceOperator.decreasesBy": { - "value": "Decreases by", - "comment": "Alert condition for when a metric's numeric value decreases by a specified amount" + "text": "Decreases by", + "crowdinContext": "Alert condition for when a metric's numeric value decreases by a specified amount" }, "automations.alert.config.differenceOperator.changesBy": { - "value": "Changes by", - "comment": "Alert condition for when a metric's numeric value changes (either increases or decreases) by a specified amount" + "text": "Changes by", + "crowdinContext": "Alert condition for when a metric's numeric value changes (either increases or decreases) by a specified amount" }, "automations.alert.config.anomalyDetection.operatorName": { - "value": "has an anomaly", - "comment": "Part of sentence `{metric} has an anomaly`" + "text": "has an anomaly", + "crowdinContext": "Part of sentence `{metric} has an anomaly`" }, "automations.filter.allDashboards": { - "value": "All dashboards", - "comment": "Filter option to show automations for all dashboards" + "text": "All dashboards", + "crowdinContext": "Filter option to show automations for all dashboards" }, "automations.filter.allRecipients": { - "value": "All recipients", - "comment": "Filter option to show automations for all recipients" + "text": "All recipients", + "crowdinContext": "Filter option to show automations for all recipients" }, "automations.filter.allAuthors": { - "value": "All authors", - "comment": "Filter option to show automations created by all authors" + "text": "All authors", + "crowdinContext": "Filter option to show automations created by all authors" }, "automations.filter.allStatus": { - "value": "All statuses", - "comment": "Filter option to show automations for all statuses" + "text": "All statuses", + "crowdinContext": "Filter option to show automations for all statuses" }, "automations.filter.status.label": { - "value": "Status", - "comment": "Label for status filter in automations table" + "text": "Status", + "crowdinContext": "Label for status filter in automations table" }, "automations.filter.workspaces.label": { - "value": "Workspaces", - "comment": "Label for workspaces filter in automations table" + "text": "Workspaces", + "crowdinContext": "Label for workspaces filter in automations table" }, "automations.filter.status.success": { - "value": "Success", - "comment": "Label for success status in automations table" + "text": "Success", + "crowdinContext": "Label for success status in automations table" }, "automations.filter.status.failed": { - "value": "Failed", - "comment": "Label for failed status in automations table" + "text": "Failed", + "crowdinContext": "Label for failed status in automations table" }, "automations.filter.status.neverRun": { - "value": "Never run", - "comment": "Label for never run status in automations table" + "text": "Never run", + "crowdinContext": "Label for never run status in automations table" }, "automations.filter.dashboard.label": { - "value": "Dashboard", - "comment": "Label for dashboard filter in automations table" + "text": "Dashboard", + "crowdinContext": "Label for dashboard filter in automations table" }, "automations.filter.recipients.label": { - "value": "Recipients", - "comment": "Label for recipients filter in automations table" + "text": "Recipients", + "crowdinContext": "Label for recipients filter in automations table" }, "automations.filter.createdBy.label": { - "value": "Created by", - "comment": "Label for created by (author) filter in automations table" + "text": "Created by", + "crowdinContext": "Label for created by (author) filter in automations table" }, "automations.filter.currentUser": { - "value": "Current user", - "comment": "Label for current user in filter options" + "text": "Current user", + "crowdinContext": "Label for current user in filter options" }, "automations.cell.lastRun.never": { - "value": "Never", - "comment": "Cell content for last run column when value is missing" + "text": "Never", + "crowdinContext": "Cell content for last run column when value is missing" }, "automations.column.id": { - "value": "ID", - "comment": "Column header for automation ID in the automations table" + "text": "ID", + "crowdinContext": "Column header for automation ID in the automations table" }, "automations.column.name": { - "value": "Name", - "comment": "Column header for automation name in the automations table" + "text": "Name", + "crowdinContext": "Column header for automation name in the automations table" }, "automations.column.dashboard": { - "value": "Dashboard", - "comment": "Column header for dashboard in the automations table" + "text": "Dashboard", + "crowdinContext": "Column header for dashboard in the automations table" }, "automations.column.widget": { - "value": "Widget", - "comment": "Column header for widget in the automations table" + "text": "Widget", + "crowdinContext": "Column header for widget in the automations table" }, "automations.column.attachments": { - "value": "Attachments", - "comment": "Column header for attachments in the automations table" + "text": "Attachments", + "crowdinContext": "Column header for attachments in the automations table" }, "automations.column.nextRun": { - "value": "Next run", - "comment": "Column header for next run in the automations table" + "text": "Next run", + "crowdinContext": "Column header for next run in the automations table" }, "automations.column.recipients": { - "value": "Recipients", - "comment": "Column header for recipients in the automations table" + "text": "Recipients", + "crowdinContext": "Column header for recipients in the automations table" }, "automations.column.lastSent": { - "value": "Last sent", - "comment": "Column header for last sent date in the automations table" + "text": "Last sent", + "crowdinContext": "Column header for last sent date in the automations table" }, "automations.column.state": { - "value": "State", - "comment": "Column header for automation state in the automations table" + "text": "State", + "crowdinContext": "Column header for automation state in the automations table" }, "automations.column.lastRunStatus": { - "value": "Last run status", - "comment": "Column header for last run status in the automations table" + "text": "Last run status", + "crowdinContext": "Column header for last run status in the automations table" }, "automations.column.createdBy": { - "value": "Created by", - "comment": "Column header for creator in the automations table" + "text": "Created by", + "crowdinContext": "Column header for creator in the automations table" }, "automations.column.createdAt": { - "value": "Created at", - "comment": "Column header for creation date in the automations table" + "text": "Created at", + "crowdinContext": "Column header for creation date in the automations table" }, "automations.column.notificationChannel": { - "value": "Notification channel", - "comment": "Column header for notification channel in the automations table" + "text": "Notification channel", + "crowdinContext": "Column header for notification channel in the automations table" }, "automations.column.workspace": { - "value": "Workspace", - "comment": "Column header for workspace in the automations table" + "text": "Workspace", + "crowdinContext": "Column header for workspace in the automations table" }, "automations.menu.edit": { - "value": "Edit", - "comment": "Menu item for editing an automation" + "text": "Edit", + "crowdinContext": "Menu item for editing an automation" }, "automations.menu.delete": { - "value": "Delete", - "comment": "Menu item for deleting an automation" + "text": "Delete", + "crowdinContext": "Menu item for deleting an automation" }, "automations.menu.unsubscribe": { - "value": "Unsubscribe", - "comment": "Menu item for unsubscribing from an automation" + "text": "Unsubscribe", + "crowdinContext": "Menu item for unsubscribing from an automation" }, "automations.menu.pause": { - "value": "Pause", - "comment": "Menu item for pausing an automation" + "text": "Pause", + "crowdinContext": "Menu item for pausing an automation" }, "automations.menu.resume": { - "value": "Resume", - "comment": "Menu item for resuming an automation" + "text": "Resume", + "crowdinContext": "Menu item for resuming an automation" }, "automations.menu.ariaLabel": { - "value": "Actions for {title}", - "comment": "Accessibility label for the automation menu button that opens actions menu. {title} is the name of the automation. Example output: 'Automation menu for Weekly Sales Report'." + "text": "Actions for {title}", + "crowdinContext": "Accessibility label for the automation menu button that opens actions menu. {title} is the name of the automation. Example output: 'Automation menu for Weekly Sales Report'." }, "automations.menu.edit.unavailable": { - "value": "Edit action is unavailable, no associated dashboard", - "comment": "Tooltip for edit action when dashboard ID is missing" + "text": "Edit action is unavailable, no associated dashboard", + "crowdinContext": "Tooltip for edit action when dashboard ID is missing" }, "automations.icon.tooltip.header.schedule": { - "value": "Export failed", - "comment": "Header for schedule icon tooltip" + "text": "Export failed", + "crowdinContext": "Header for schedule icon tooltip" }, "automations.icon.tooltip.header.alert": { - "value": "Alert failed", - "comment": "Header for alert icon tooltip" + "text": "Alert failed", + "crowdinContext": "Header for alert icon tooltip" }, "automations.icon.tooltip.status": { - "value": "Status", - "comment": "Status label for automation icon tooltip" + "text": "Status", + "crowdinContext": "Status label for automation icon tooltip" }, "automations.icon.tooltip.traceId": { - "value": "Trace ID", - "comment": "Trace ID label for automation icon tooltip" + "text": "Trace ID", + "crowdinContext": "Trace ID label for automation icon tooltip" }, "automations.icon.tooltip.startsOn": { - "value": "Starts on", - "comment": "Label for automation icon tooltip section: Starts on" + "text": "Starts on", + "crowdinContext": "Label for automation icon tooltip section: Starts on" }, "automations.icon.tooltip.repeats": { - "value": "Repeats", - "comment": "Label for automation icon tooltip section: Repeats" + "text": "Repeats", + "crowdinContext": "Label for automation icon tooltip section: Repeats" }, "automations.menu.copyId": { - "value": "Copy ID", - "comment": "Menu item for copying an automation ID" + "text": "Copy ID", + "crowdinContext": "Menu item for copying an automation ID" }, "automations.message.copyId.success": { - "value": "ID copied to clipboard", - "comment": "Success message when automation ID is copied to clipboard" + "text": "ID copied to clipboard", + "crowdinContext": "Success message when automation ID is copied to clipboard" }, "automations.message.schedule.delete.success": { - "value": "Success! Your scheduled email was deleted.", - "comment": "Success message when schedule is deleted" + "text": "Success! Your scheduled email was deleted.", + "crowdinContext": "Success message when schedule is deleted" }, "automations.message.schedule.delete.error": { - "value": "Error! Failed to delete your scheduled email.", - "comment": "Error message when schedule cannot be deleted" + "text": "Error! Failed to delete your scheduled email.", + "crowdinContext": "Error message when schedule cannot be deleted" }, "automations.message.schedule.unsubscribe.success": { - "value": "Success! You have unsubscribed from the scheduled email.", - "comment": "Success message when schedule is unsubscribed from" + "text": "Success! You have unsubscribed from the scheduled email.", + "crowdinContext": "Success message when schedule is unsubscribed from" }, "automations.message.schedule.unsubscribe.error": { - "value": "Error! Failed to unsubscribe from the scheduled email.", - "comment": "Error message when schedule cannot be unsubscribed from" + "text": "Error! Failed to unsubscribe from the scheduled email.", + "crowdinContext": "Error message when schedule cannot be unsubscribed from" }, "automations.message.schedule.bulk.delete.success": { - "value": "Success! Your scheduled emails were deleted.", - "comment": "Success message when schedules are deleted" + "text": "Success! Your scheduled emails were deleted.", + "crowdinContext": "Success message when schedules are deleted" }, "automations.message.schedule.bulk.delete.error": { - "value": "Error! Failed to delete your scheduled emails.", - "comment": "Error message when schedules cannot be deleted" + "text": "Error! Failed to delete your scheduled emails.", + "crowdinContext": "Error message when schedules cannot be deleted" }, "automations.message.schedule.bulk.unsubscribe.success": { - "value": "Success! You have unsubscribed from the scheduled emails.", - "comment": "Success message when schedules are unsubscribed from" + "text": "Success! You have unsubscribed from the scheduled emails.", + "crowdinContext": "Success message when schedules are unsubscribed from" }, "automations.message.schedule.bulk.unsubscribe.error": { - "value": "Error! Failed to unsubscribe from the scheduled emails.", - "comment": "Error message when schedules cannot be unsubscribed from" + "text": "Error! Failed to unsubscribe from the scheduled emails.", + "crowdinContext": "Error message when schedules cannot be unsubscribed from" }, "automations.message.schedule.pause.success": { - "value": "Success! Your scheduled email was paused.", - "comment": "Success message when schedule is paused" + "text": "Success! Your scheduled email was paused.", + "crowdinContext": "Success message when schedule is paused" }, "automations.message.schedule.pause.error": { - "value": "Error! Failed to pause your scheduled email.", - "comment": "Error message when schedule cannot be paused" + "text": "Error! Failed to pause your scheduled email.", + "crowdinContext": "Error message when schedule cannot be paused" }, "automations.message.schedule.bulk.pause.success": { - "value": "Success! Your scheduled emails were paused.", - "comment": "Success message when schedules are paused" + "text": "Success! Your scheduled emails were paused.", + "crowdinContext": "Success message when schedules are paused" }, "automations.message.schedule.bulk.pause.error": { - "value": "Error! Failed to pause your scheduled emails.", - "comment": "Error message when schedules cannot be paused" + "text": "Error! Failed to pause your scheduled emails.", + "crowdinContext": "Error message when schedules cannot be paused" }, "automations.message.schedule.resume.success": { - "value": "Success! Your scheduled email was resumed.", - "comment": "Success message when schedule is resumed" + "text": "Success! Your scheduled email was resumed.", + "crowdinContext": "Success message when schedule is resumed" }, "automations.message.schedule.resume.error": { - "value": "Error! Failed to resume your scheduled email.", - "comment": "Error message when schedule cannot be resumed" + "text": "Error! Failed to resume your scheduled email.", + "crowdinContext": "Error message when schedule cannot be resumed" }, "automations.message.schedule.bulk.resume.success": { - "value": "Success! Your scheduled emails were resumed.", - "comment": "Success message when schedules are resumed" + "text": "Success! Your scheduled emails were resumed.", + "crowdinContext": "Success message when schedules are resumed" }, "automations.message.schedule.bulk.resume.error": { - "value": "Error! Failed to resume your scheduled emails.", - "comment": "Error message when schedules cannot be resumed" + "text": "Error! Failed to resume your scheduled emails.", + "crowdinContext": "Error message when schedules cannot be resumed" }, "automations.message.alert.delete.success": { - "value": "Success! Your alert was deleted.", - "comment": "Success message when alert is deleted" + "text": "Success! Your alert was deleted.", + "crowdinContext": "Success message when alert is deleted" }, "automations.message.alert.delete.error": { - "value": "Error! Failed to delete your alert.", - "comment": "Error message when alert cannot be deleted" + "text": "Error! Failed to delete your alert.", + "crowdinContext": "Error message when alert cannot be deleted" }, "automations.message.alert.unsubscribe.success": { - "value": "Success! You have unsubscribed from the alert.", - "comment": "Success message when alert is unsubscribed from" + "text": "Success! You have unsubscribed from the alert.", + "crowdinContext": "Success message when alert is unsubscribed from" }, "automations.message.alert.unsubscribe.error": { - "value": "Error! Failed to unsubscribe from the alert.", - "comment": "Error message when alert cannot be unsubscribed from" + "text": "Error! Failed to unsubscribe from the alert.", + "crowdinContext": "Error message when alert cannot be unsubscribed from" }, "automations.message.alert.pause.success": { - "value": "Success! Your alert was paused.", - "comment": "Success message when alert is paused" + "text": "Success! Your alert was paused.", + "crowdinContext": "Success message when alert is paused" }, "automations.message.alert.pause.error": { - "value": "Error! Failed to pause your alert.", - "comment": "Error message when alert cannot be paused" + "text": "Error! Failed to pause your alert.", + "crowdinContext": "Error message when alert cannot be paused" }, "automations.message.alert.resume.success": { - "value": "Success! Your alert was resumed.", - "comment": "Success message when alert is resumed" + "text": "Success! Your alert was resumed.", + "crowdinContext": "Success message when alert is resumed" }, "automations.message.alert.resume.error": { - "value": "Error! Failed to resume your alert.", - "comment": "Error message when alert cannot be resumed" + "text": "Error! Failed to resume your alert.", + "crowdinContext": "Error message when alert cannot be resumed" }, "automations.message.alert.bulk.delete.success": { - "value": "Success! Your alerts were deleted.", - "comment": "Success message when alerts are deleted" + "text": "Success! Your alerts were deleted.", + "crowdinContext": "Success message when alerts are deleted" }, "automations.message.alert.bulk.delete.error": { - "value": "Error! Failed to delete your alerts.", - "comment": "Error message when alerts cannot be deleted" + "text": "Error! Failed to delete your alerts.", + "crowdinContext": "Error message when alerts cannot be deleted" }, "automations.message.alert.bulk.unsubscribe.success": { - "value": "Success! You have unsubscribed from the alerts.", - "comment": "Success message when alerts are unsubscribed from" + "text": "Success! You have unsubscribed from the alerts.", + "crowdinContext": "Success message when alerts are unsubscribed from" }, "automations.message.alert.bulk.unsubscribe.error": { - "value": "Error! Failed to unsubscribe from the alerts.", - "comment": "Error message when alerts cannot be unsubscribed from" + "text": "Error! Failed to unsubscribe from the alerts.", + "crowdinContext": "Error message when alerts cannot be unsubscribed from" }, "automations.message.alert.bulk.pause.success": { - "value": "Success! Your alerts were paused.", - "comment": "Success message when alerts are paused" + "text": "Success! Your alerts were paused.", + "crowdinContext": "Success message when alerts are paused" }, "automations.message.alert.bulk.pause.error": { - "value": "Error! Failed to pause your alerts.", - "comment": "Error message when alerts cannot be paused" + "text": "Error! Failed to pause your alerts.", + "crowdinContext": "Error message when alerts cannot be paused" }, "automations.message.alert.bulk.resume.success": { - "value": "Success! Your alerts were resumed.", - "comment": "Success message when alerts are resumed" + "text": "Success! Your alerts were resumed.", + "crowdinContext": "Success message when alerts are resumed" }, "automations.message.alert.bulk.resume.error": { - "value": "Error! Failed to resume your alerts.", - "comment": "Error message when alerts cannot be resumed" + "text": "Error! Failed to resume your alerts.", + "crowdinContext": "Error message when alerts cannot be resumed" }, "automations.message.automationIconTooltipTraceIdCopied": { - "value": "Trace ID copied to clipboard", - "comment": "Success message when trace ID is copied to clipboard" + "text": "Trace ID copied to clipboard", + "crowdinContext": "Success message when trace ID is copied to clipboard" }, "automations.confirmDialog.delete.schedule.headline": { - "value": "Delete Schedule?", - "comment": "Headline for deleting a single schedule" + "text": "Delete Schedule?", + "crowdinContext": "Headline for deleting a single schedule" }, "automations.confirmDialog.delete.schedule.content": { - "value": "Schedule {title} will be permanently deleted.", - "comment": "Content for deleting a single schedule" + "text": "Schedule {title} will be permanently deleted.", + "crowdinContext": "Content for deleting a single schedule" }, "automations.confirmDialog.delete.alert.headline": { - "value": "Delete Alert?", - "comment": "Headline for deleting a single alert" + "text": "Delete Alert?", + "crowdinContext": "Headline for deleting a single alert" }, "automations.confirmDialog.delete.alert.content": { - "value": "Alert {title} will be permanently deleted.", - "comment": "Content for deleting a single alert" + "text": "Alert {title} will be permanently deleted.", + "crowdinContext": "Content for deleting a single alert" }, "automations.confirmDialog.unsubscribe.schedule.headline": { - "value": "Unsubscribe from Schedule?", - "comment": "Headline for unsubscribing from a single schedule" + "text": "Unsubscribe from Schedule?", + "crowdinContext": "Headline for unsubscribing from a single schedule" }, "automations.confirmDialog.unsubscribe.schedule.content": { - "value": "You will be unsubscribed from schedule {title}.", - "comment": "Content for unsubscribing from a single schedule" + "text": "You will be unsubscribed from schedule {title}.", + "crowdinContext": "Content for unsubscribing from a single schedule" }, "automations.confirmDialog.unsubscribe.alert.headline": { - "value": "Unsubscribe from Alert?", - "comment": "Headline for unsubscribing from a single alert" + "text": "Unsubscribe from Alert?", + "crowdinContext": "Headline for unsubscribing from a single alert" }, "automations.confirmDialog.unsubscribe.alert.content": { - "value": "You will be unsubscribed from alert {title}.", - "comment": "Content for unsubscribing from a single alert" + "text": "You will be unsubscribed from alert {title}.", + "crowdinContext": "Content for unsubscribing from a single alert" }, "automations.confirmDialog.bulkDelete.schedule.headline": { - "value": "Delete Schedules?", - "comment": "Headline for deleting multiple schedules" + "text": "Delete Schedules?", + "crowdinContext": "Headline for deleting multiple schedules" }, "automations.confirmDialog.bulkDelete.schedule.content": { - "value": "Are you sure you want to delete selected schedules?", - "comment": "Content for deleting multiple schedules" + "text": "Are you sure you want to delete selected schedules?", + "crowdinContext": "Content for deleting multiple schedules" }, "automations.confirmDialog.bulkDelete.alert.headline": { - "value": "Delete alerts", - "comment": "Headline for deleting multiple alerts" + "text": "Delete alerts", + "crowdinContext": "Headline for deleting multiple alerts" }, "automations.confirmDialog.bulkDelete.alert.content": { - "value": "Are you sure you want to delete selected alerts?", - "comment": "Content for deleting multiple alerts" + "text": "Are you sure you want to delete selected alerts?", + "crowdinContext": "Content for deleting multiple alerts" }, "automations.confirmDialog.bulkUnsubscribe.schedule.headline": { - "value": "Unsubscribe from Schedules?", - "comment": "Headline for unsubscribing from multiple schedules" + "text": "Unsubscribe from Schedules?", + "crowdinContext": "Headline for unsubscribing from multiple schedules" }, "automations.confirmDialog.bulkUnsubscribe.schedule.content": { - "value": "Are you sure you want to unsubscribe from selected schedules?", - "comment": "Content for unsubscribing from multiple schedules" + "text": "Are you sure you want to unsubscribe from selected schedules?", + "crowdinContext": "Content for unsubscribing from multiple schedules" }, "automations.confirmDialog.bulkUnsubscribe.alert.headline": { - "value": "Unsubscribe from alerts", - "comment": "Headline for unsubscribing from multiple alerts" + "text": "Unsubscribe from alerts", + "crowdinContext": "Headline for unsubscribing from multiple alerts" }, "automations.confirmDialog.bulkUnsubscribe.alert.content": { - "value": "Are you sure you want to unsubscribe from selected alerts?", - "comment": "Content for unsubscribing from multiple alerts" + "text": "Are you sure you want to unsubscribe from selected alerts?", + "crowdinContext": "Content for unsubscribing from multiple alerts" }, "automations.confirmDialog.pause.schedule.headline": { - "value": "Pause Schedule?", - "comment": "Headline for pausing a single schedule" + "text": "Pause Schedule?", + "crowdinContext": "Headline for pausing a single schedule" }, "automations.confirmDialog.pause.schedule.content": { - "value": "Schedule {title} will be paused.", - "comment": "Content for pausing a single schedule" + "text": "Schedule {title} will be paused.", + "crowdinContext": "Content for pausing a single schedule" }, "automations.confirmDialog.pause.alert.headline": { - "value": "Pause Alert?", - "comment": "Headline for pausing a single alert" + "text": "Pause Alert?", + "crowdinContext": "Headline for pausing a single alert" }, "automations.confirmDialog.pause.alert.content": { - "value": "Alert {title} will be paused.", - "comment": "Content for pausing a single alert" + "text": "Alert {title} will be paused.", + "crowdinContext": "Content for pausing a single alert" }, "automations.confirmDialog.resume.schedule.headline": { - "value": "Resume Schedule?", - "comment": "Headline for resuming a single schedule" + "text": "Resume Schedule?", + "crowdinContext": "Headline for resuming a single schedule" }, "automations.confirmDialog.resume.schedule.content": { - "value": "Schedule {title} will be resumed.", - "comment": "Content for resuming a single schedule" + "text": "Schedule {title} will be resumed.", + "crowdinContext": "Content for resuming a single schedule" }, "automations.confirmDialog.resume.alert.headline": { - "value": "Resume Alert?", - "comment": "Headline for resuming a single alert" + "text": "Resume Alert?", + "crowdinContext": "Headline for resuming a single alert" }, "automations.confirmDialog.resume.alert.content": { - "value": "Alert {title} will be resumed.", - "comment": "Content for resuming a single alert" + "text": "Alert {title} will be resumed.", + "crowdinContext": "Content for resuming a single alert" }, "automations.confirmDialog.bulkPause.schedule.headline": { - "value": "Pause Schedules?", - "comment": "Headline for pausing multiple schedules" + "text": "Pause Schedules?", + "crowdinContext": "Headline for pausing multiple schedules" }, "automations.confirmDialog.bulkPause.schedule.content": { - "value": "Are you sure you want to pause selected schedules?", - "comment": "Content for pausing multiple schedules" + "text": "Are you sure you want to pause selected schedules?", + "crowdinContext": "Content for pausing multiple schedules" }, "automations.confirmDialog.bulkPause.alert.headline": { - "value": "Pause Alerts?", - "comment": "Headline for pausing multiple alerts" + "text": "Pause Alerts?", + "crowdinContext": "Headline for pausing multiple alerts" }, "automations.confirmDialog.bulkPause.alert.content": { - "value": "Are you sure you want to pause selected alerts?", - "comment": "Content for pausing multiple alerts" + "text": "Are you sure you want to pause selected alerts?", + "crowdinContext": "Content for pausing multiple alerts" }, "automations.confirmDialog.bulkResume.schedule.headline": { - "value": "Resume Schedules?", - "comment": "Headline for resuming multiple schedules" + "text": "Resume Schedules?", + "crowdinContext": "Headline for resuming multiple schedules" }, "automations.confirmDialog.bulkResume.schedule.content": { - "value": "Are you sure you want to resume selected schedules?", - "comment": "Content for resuming multiple schedules" + "text": "Are you sure you want to resume selected schedules?", + "crowdinContext": "Content for resuming multiple schedules" }, "automations.confirmDialog.bulkResume.alert.headline": { - "value": "Resume Alerts?", - "comment": "Headline for resuming multiple alerts" + "text": "Resume Alerts?", + "crowdinContext": "Headline for resuming multiple alerts" }, "automations.confirmDialog.bulkResume.alert.content": { - "value": "Are you sure you want to resume selected alerts?", - "comment": "Content for resuming multiple alerts" + "text": "Are you sure you want to resume selected alerts?", + "crowdinContext": "Content for resuming multiple alerts" }, "automations.confirmDialog.button.delete": { - "value": "Delete", - "comment": "Button text for confirming delete action" + "text": "Delete", + "crowdinContext": "Button text for confirming delete action" }, "automations.confirmDialog.button.confirm": { - "value": "Confirm", - "comment": "Button text for confirming an action" + "text": "Confirm", + "crowdinContext": "Button text for confirming an action" }, "automations.confirmDialog.button.cancel": { - "value": "Cancel", - "comment": "Button text for canceling an action" + "text": "Cancel", + "crowdinContext": "Button text for canceling an action" }, "automations.emptyState.schedule.title": { - "value": "No scheduled exports", - "comment": "Empty state title when no scheduled exports are found and no filters are active" + "text": "No scheduled exports", + "crowdinContext": "Empty state title when no scheduled exports are found and no filters are active" }, "automations.emptyState.schedule.description": { - "value": "Create a schedule export on the dashboard or visualization.", - "comment": "Empty state description explaining how to create the first scheduled export" + "text": "Create a schedule export on the dashboard or visualization.", + "crowdinContext": "Empty state description explaining how to create the first scheduled export" }, "automations.emptyState.alert.title": { - "value": "No alerts", - "comment": "Empty state title when no alerts are found and no filters are active" + "text": "No alerts", + "crowdinContext": "Empty state title when no alerts are found and no filters are active" }, "automations.emptyState.alert.description": { - "value": "Create an alert on the visualization in any dashboard.", - "comment": "Empty state description explaining how to create the first alert" + "text": "Create an alert on the visualization in any dashboard.", + "crowdinContext": "Empty state description explaining how to create the first alert" }, "automations.accessibility.selectAll.alerts": { - "value": "Select all alerts", - "comment": "Accessibility label for the checkbox that selects all alerts in the alerts table" + "text": "Select all alerts", + "crowdinContext": "Accessibility label for the checkbox that selects all alerts in the alerts table" }, "automations.accessibility.selectAll.schedules": { - "value": "Select all scheduled exports", - "comment": "Accessibility label for the checkbox that selects all scheduled exports in the schedules table" + "text": "Select all scheduled exports", + "crowdinContext": "Accessibility label for the checkbox that selects all scheduled exports in the schedules table" }, "automations.accessibility.select.alert": { - "value": "Select alert: {title}", - "comment": "Accessibility label for individual alert selection checkbox. Example: 'Select alert: Revenue Alert'" + "text": "Select alert: {title}", + "crowdinContext": "Accessibility label for individual alert selection checkbox. Example: 'Select alert: Revenue Alert'" }, "automations.accessibility.select.schedule": { - "value": "Select scheduled export: {title}", - "comment": "Accessibility label for individual scheduled export selection checkbox. Example: 'Select scheduled export: Weekly Revenue Report'" + "text": "Select scheduled export: {title}", + "crowdinContext": "Accessibility label for individual scheduled export selection checkbox. Example: 'Select scheduled export: Weekly Revenue Report'" }, "automations.accessibility.search.alerts": { - "value": "Search alerts", - "comment": "Accessibility label for the search input field when searching through alerts" + "text": "Search alerts", + "crowdinContext": "Accessibility label for the search input field when searching through alerts" }, "automations.accessibility.search.schedules": { - "value": "Search scheduled exports", - "comment": "Accessibility label for the search input field when searching through scheduled exports" + "text": "Search scheduled exports", + "crowdinContext": "Accessibility label for the search input field when searching through scheduled exports" }, "automations.accessibility.gridLabel.alerts": { - "value": "List of alerts", - "comment": "Accessibility label for the alerts table grid, describing the content to screen readers" + "text": "List of alerts", + "crowdinContext": "Accessibility label for the alerts table grid, describing the content to screen readers" }, "automations.accessibility.gridLabel.schedules": { - "value": "List of scheduled exports", - "comment": "Accessibility label for the scheduled exports table grid, describing the content to screen readers" + "text": "List of scheduled exports", + "crowdinContext": "Accessibility label for the scheduled exports table grid, describing the content to screen readers" } } diff --git a/libs/sdk-ui-filters/package.json b/libs/sdk-ui-filters/package.json index c884e624d9f..b69d9c301e1 100644 --- a/libs/sdk-ui-filters/package.json +++ b/libs/sdk-ui-filters/package.json @@ -123,7 +123,7 @@ "stylelint": "^13.8.0", "stylelint-checkstyle-formatter": "^0.1.2", "stylelint-config-prettier": "^9.0.5", - "typescript": "5.8.3", + "typescript": "5.9.3", "vitest": "3.2.4", "vitest-dom": "0.1.1" }, diff --git a/libs/sdk-ui-gen-ai/package.json b/libs/sdk-ui-gen-ai/package.json index fe83cfc5b26..d26a2d5c0d0 100644 --- a/libs/sdk-ui-gen-ai/package.json +++ b/libs/sdk-ui-gen-ai/package.json @@ -141,7 +141,7 @@ "stylelint-checkstyle-formatter": "^0.1.2", "stylelint-config-prettier": "^9.0.5", "svgo": "^2.8.0", - "typescript": "5.8.3", + "typescript": "5.9.3", "vitest": "3.2.4", "vitest-dom": "0.1.1" }, diff --git a/libs/sdk-ui-gen-ai/src/components/KeyDriverAnalysis.tsx b/libs/sdk-ui-gen-ai/src/components/KeyDriverAnalysis.tsx index 292cfb034f3..94c0d1b8f12 100644 --- a/libs/sdk-ui-gen-ai/src/components/KeyDriverAnalysis.tsx +++ b/libs/sdk-ui-gen-ai/src/components/KeyDriverAnalysis.tsx @@ -1,11 +1,13 @@ -// (C) 2025 GoodData Corporation +// (C) 2025-2026 GoodData Corporation + +import { useCallback } from "react"; import { useIntl } from "react-intl"; import { connect } from "react-redux"; import { type ISeparators } from "@gooddata/sdk-model"; import type { IKdaDefinition } from "@gooddata/sdk-ui-dashboard"; -import { IntlWrapper, KdaDialog, KdaProvider, KdaStoreProvider } from "@gooddata/sdk-ui-dashboard/internal"; +import { IntlWrapper, KdaDialogController, KdaStoreProvider } from "@gooddata/sdk-ui-dashboard/internal"; import { keyDriverAnalysisSelector, settingsSelector } from "../store/chatWindow/chatWindowSelectors.js"; import { type RootState, setKeyDriverAnalysisAction } from "../store/index.js"; @@ -21,6 +23,13 @@ function KeyDriverAnalysisComponent(props: KeyDriverAnalysisProps) { const { keyDriverAnalysis, separators, locale, setKeyDriverAnalysis } = props; const intl = useIntl(); + const onRequestedDefinitionChange = useCallback( + (definition?: IKdaDefinition) => { + setKeyDriverAnalysis?.({ keyDriverAnalysis: definition }); + }, + [setKeyDriverAnalysis], + ); + if (!keyDriverAnalysis) { return null; } @@ -28,15 +37,13 @@ function KeyDriverAnalysisComponent(props: KeyDriverAnalysisProps) { return ( - - { - setKeyDriverAnalysis?.({ keyDriverAnalysis: undefined }); - }} - /> - + ); 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 856073a8f13..a49ee28db54 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 @@ -1,334 +1,334 @@ { "gd.gen-ai.global-error": { - "value": "Something went wrong", - "comment": "Generic error message displayed when the AI chatbot encounters an unexpected error" + "text": "Something went wrong", + "crowdinContext": "Generic error message displayed when the AI chatbot encounters an unexpected error" }, "gd.gen-ai.global-error.description": { - "value": "Try restarting the chatbot and starting over.", - "comment": "User instruction on how to recover from a global error in the AI chatbot" + "text": "Try restarting the chatbot and starting over.", + "crowdinContext": "User instruction on how to recover from a global error in the AI chatbot" }, "gd.gen-ai.global-error.button-details": { - "value": "See details", - "comment": "Button label to show more detailed error information" + "text": "See details", + "crowdinContext": "Button label to show more detailed error information" }, "gd.gen-ai.global-error.button-clear": { - "value": "Restart chatbot", - "comment": "Button label to restart the AI chatbot and clear the current session" + "text": "Restart chatbot", + "crowdinContext": "Button label to restart the AI chatbot and clear the current session" }, "gd.gen-ai.global-no-llm": { - "value": "No LLM provider configured", - "comment": "Error message when no LLM provider is configured" + "text": "No LLM provider configured", + "crowdinContext": "Error message when no LLM provider is configured" }, "gd.gen-ai.global-no-llm.description": { - "value": "Configure a provider to enable the chatbot.", - "comment": "User instruction on how to configure a provider for the AI chatbot" + "text": "Configure a provider to enable the chatbot.", + "crowdinContext": "User instruction on how to configure a provider for the AI chatbot" }, "gd.gen-ai.global-no-llm.button-create-llm": { - "value": "Configure provider", - "comment": "Button label to configure a provider for the AI chatbot" + "text": "Configure provider", + "crowdinContext": "Button label to configure a provider for the AI chatbot" }, "gd.gen-ai.permission-error": { - "value": "Insufficient permissions", - "comment": "Error message when user does not have sufficient permissions to access the chatbot" + "text": "Insufficient permissions", + "crowdinContext": "Error message when user does not have sufficient permissions to access the chatbot" }, "gd.gen-ai.permission-error.description": { - "value": "You don’t have access to the chatbot. Contact your administrator to request access.", - "comment": "User instruction on how to request access to the AI chatbot" + "text": "You don’t have access to the chatbot. Contact your administrator to request access.", + "crowdinContext": "User instruction on how to request access to the AI chatbot" }, "gd.gen-ai.input-placeholder": { - "value": "Ask here…", - "comment": "Placeholder text in the input field where users type their questions to the AI chatbot" + "text": "Ask here…", + "crowdinContext": "Placeholder text in the input field where users type their questions to the AI chatbot" }, "gd.gen-ai.input-label.mac": { - "value": "Ask your question. Use control+space or cmd+I for suggestions.", - "comment": "Label for the input field where users type their questions to the AI chatbot" + "text": "Ask your question. Use control+space or cmd+I for suggestions.", + "crowdinContext": "Label for the input field where users type their questions to the AI chatbot" }, "gd.gen-ai.input-label.win": { - "value": "Ask your question. Use control+space or control+I for suggestions.", - "comment": "Label for the input field where Windows users type their questions to the AI chatbot" + "text": "Ask your question. Use control+space or control+I for suggestions.", + "crowdinContext": "Label for the input field where Windows users type their questions to the AI chatbot" }, "gd.gen-ai.feedback.like": { - "value": "Mark this message as helpful", - "comment": "Button label to mark a message as helpful in the AI chatbot" + "text": "Mark this message as helpful", + "crowdinContext": "Button label to mark a message as helpful in the AI chatbot" }, "gd.gen-ai.feedback.dislike": { - "value": "Mark this message as not helpful", - "comment": "Button label to mark a message as not helpful in the AI chatbot" + "text": "Mark this message as not helpful", + "crowdinContext": "Button label to mark a message as not helpful in the AI chatbot" }, "gd.gen-ai.feedback.popup.title": { - "value": "We've got your feedback", - "comment": "Title of the feedback popup dialog" + "text": "We've got your feedback", + "crowdinContext": "Title of the feedback popup dialog" }, "gd.gen-ai.feedback.popup.reasons-label": { - "value": "Tell us what went wrong", - "comment": "Label for the feedback reasons section in the popup" + "text": "Tell us what went wrong", + "crowdinContext": "Label for the feedback reasons section in the popup" }, "gd.gen-ai.feedback.popup.description-label": { - "value": "Please, describe what happened", - "comment": "Label for the description text area in the feedback popup" + "text": "Please, describe what happened", + "crowdinContext": "Label for the description text area in the feedback popup" }, "gd.gen-ai.feedback.popup.cancel": { - "value": "Cancel", - "comment": "Cancel button label in the feedback popup" + "text": "Cancel", + "crowdinContext": "Cancel button label in the feedback popup" }, "gd.gen-ai.feedback.popup.send": { - "value": "Send", - "comment": "Send button label in the feedback popup" + "text": "Send", + "crowdinContext": "Send button label in the feedback popup" }, "gd.gen-ai.feedback.popup.close": { - "value": "Close feedback dialog", - "comment": "Close button aria label in the feedback popup" + "text": "Close feedback dialog", + "crowdinContext": "Close button aria label in the feedback popup" }, "gd.gen-ai.feedback.reason.forgot-context": { - "value": "Forgot previous context", - "comment": "Feedback reason option: AI forgot previous context" + "text": "Forgot previous context", + "crowdinContext": "Feedback reason option: AI forgot previous context" }, "gd.gen-ai.feedback.reason.ignored-instructions": { - "value": "Ignored or refused instructions", - "comment": "Feedback reason option: AI ignored or refused instructions" + "text": "Ignored or refused instructions", + "crowdinContext": "Feedback reason option: AI ignored or refused instructions" }, "gd.gen-ai.feedback.reason.factually-incorrect": { - "value": "Factually incorrect", - "comment": "Feedback reason option: AI provided factually incorrect information" + "text": "Factually incorrect", + "crowdinContext": "Feedback reason option: AI provided factually incorrect information" }, "gd.gen-ai.feedback.reason.other": { - "value": "Other", - "comment": "Feedback reason option: Other reason not listed" + "text": "Other", + "crowdinContext": "Feedback reason option: Other reason not listed" }, "gd.gen-ai.disclaimer": { - "value": "AI assistants can make mistakes. Check before relying on these answers.", - "comment": "Warning disclaimer about AI response accuracy shown to users" + "text": "AI assistants can make mistakes. Check before relying on these answers.", + "crowdinContext": "Warning disclaimer about AI response accuracy shown to users" }, "gd.gen-ai.dialog.label": { - "value": "AI assistant conversation", - "comment": "Label for the dialog containing the AI chatbot interface" + "text": "AI assistant conversation", + "crowdinContext": "Label for the dialog containing the AI chatbot interface" }, "gd.gen-ai.header.reset-tooltip": { - "value": "Reset", - "comment": "Tooltip for button that resets the AI chatbot conversation" + "text": "Reset", + "crowdinContext": "Tooltip for button that resets the AI chatbot conversation" }, "gd.gen-ai.header.contract-tooltip": { - "value": "Contract", - "comment": "Tooltip for button that contracts the AI chatbot interface" + "text": "Contract", + "crowdinContext": "Tooltip for button that contracts the AI chatbot interface" }, "gd.gen-ai.header.expand-tooltip": { - "value": "Expand", - "comment": "Tooltip for button that expands the AI chatbot interface" + "text": "Expand", + "crowdinContext": "Tooltip for button that expands the AI chatbot interface" }, "gd.gen-ai.welcome.line-1": { - "value": "Hi there,", - "comment": "First line of the AI chatbot's welcome greeting" + "text": "Hi there,", + "crowdinContext": "First line of the AI chatbot's welcome greeting" }, "gd.gen-ai.welcome.line-2": { - "value": "How can I help you?", - "comment": "Second line of the AI chatbot's welcome greeting asking how to assist" + "text": "How can I help you?", + "crowdinContext": "Second line of the AI chatbot's welcome greeting asking how to assist" }, "gd.gen-ai.welcome.option-1.title": { - "value": "Search for a dashboard or visualization", - "comment": "Title for the first suggested action option in the welcome screen" + "text": "Search for a dashboard or visualization", + "crowdinContext": "Title for the first suggested action option in the welcome screen" }, "gd.gen-ai.welcome.option-1.answer": { - "value": "Sure thing, what kind of dashboard or visualization would you like to see?", - "comment": "AI chatbot's response when user selects the search option" + "text": "Sure thing, what kind of dashboard or visualization would you like to see?", + "crowdinContext": "AI chatbot's response when user selects the search option" }, "gd.gen-ai.welcome.option-2.title": { - "value": "Create a new visualization", - "comment": "Title for the second suggested action option in the welcome screen" + "text": "Create a new visualization", + "crowdinContext": "Title for the second suggested action option in the welcome screen" }, "gd.gen-ai.welcome.option-2.answer": { - "value": "Sure thing, what kind of visualization would you like to create?", - "comment": "AI chatbot's response when user selects the create visualization option" + "text": "Sure thing, what kind of visualization would you like to create?", + "crowdinContext": "AI chatbot's response when user selects the create visualization option" }, "gd.gen-ai.welcome.option-3.title": { - "value": "Answer a business question", - "comment": "Title for the third suggested action option in the welcome screen" + "text": "Answer a business question", + "crowdinContext": "Title for the third suggested action option in the welcome screen" }, "gd.gen-ai.welcome.option-3.answer": { - "value": "Sure thing, what business question would you like to answer?", - "comment": "AI chatbot's response when user selects the business question option" + "text": "Sure thing, what business question would you like to answer?", + "crowdinContext": "AI chatbot's response when user selects the business question option" }, "gd.gen-ai.semantic-search.title": { - "value": "Search", - "comment": "Title shown above semantic search results." + "text": "Search", + "crowdinContext": "Title shown above semantic search results." }, "gd.gen-ai.state.cancelled": { - "value": "Evaluation cancelled…", - "comment": "Status message displayed when the AI chatbot's evaluation is cancelled" + "text": "Evaluation cancelled…", + "crowdinContext": "Status message displayed when the AI chatbot's evaluation is cancelled" }, "gd.gen-ai.state.generating": { - "value": "Generating your response…", - "comment": "Status message displayed while the AI chatbot is generating a response" + "text": "Generating your response…", + "crowdinContext": "Status message displayed while the AI chatbot is generating a response" }, "gd.gen-ai.state.thinking": { - "value": "Thinking", - "comment": "Status message displayed in the thought process while the AI is processing" + "text": "Thinking", + "crowdinContext": "Status message displayed in the thought process while the AI is processing" }, "gd.gen-ai.routing.thinking-process": { - "value": "Reasoning", - "comment": "Button label to expand and show the AI's thinking process and reasoning information" + "text": "Reasoning", + "crowdinContext": "Button label to expand and show the AI's thinking process and reasoning information" }, "gd.gen-ai.button.send": { - "value": "Send message", - "comment": "Button label to send a message to the AI chatbot" + "text": "Send message", + "crowdinContext": "Button label to send a message to the AI chatbot" }, "gd.gen-ai.button.save": { - "value": "Save", - "comment": "Button label to save a visualization created by the AI" + "text": "Save", + "crowdinContext": "Button label to save a visualization created by the AI" }, "gd.gen-ai.button.save_and_explore": { - "value": "Save & Open", - "comment": "Button label to save a visualization and immediately open it for exploration" + "text": "Save & Open", + "crowdinContext": "Button label to save a visualization and immediately open it for exploration" }, "gd.gen-ai.button.cancel": { - "value": "Cancel", - "comment": "Button label to cancel the current operation" + "text": "Cancel", + "crowdinContext": "Button label to cancel the current operation" }, "gd.gen-ai.save-dialog.label": { - "value": "Name", - "comment": "Label for the input field where users enter a name for their visualization" + "text": "Name", + "crowdinContext": "Label for the input field where users enter a name for their visualization" }, "gd.gen-ai.save-dialog.title": { - "value": "Name your visualization", - "comment": "Title of the dialog for naming a visualization before saving" + "text": "Name your visualization", + "crowdinContext": "Title of the dialog for naming a visualization before saving" }, "gd.gen-ai.save-dialog.description": { - "value": "Give your new visualization a new descriptive name, so it's easier to find it later on.", - "comment": "Description explaining why users should provide a descriptive name for their visualization" + "text": "Give your new visualization a new descriptive name, so it's easier to find it later on.", + "crowdinContext": "Description explaining why users should provide a descriptive name for their visualization" }, "gd.gen-ai.save-dialog.description.explore": { - "value": "To open this visualization, it needs to be saved first. You can give it a name below.", - "comment": "Description explaining that the visualization must be saved before it can be opened" + "text": "To open this visualization, it needs to be saved first. You can give it a name below.", + "crowdinContext": "Description explaining that the visualization must be saved before it can be opened" }, "gd.gen-ai.autocomplete.type": { - "value": "Type", - "comment": "Column header in autocomplete suggestions showing the type of data object" + "text": "Type", + "crowdinContext": "Column header in autocomplete suggestions showing the type of data object" }, "gd.gen-ai.autocomplete.dataset": { - "value": "Dataset", - "comment": "Column header in autocomplete suggestions showing the dataset name" + "text": "Dataset", + "crowdinContext": "Column header in autocomplete suggestions showing the dataset name" }, "gd.gen-ai.autocomplete.id": { - "value": "Id", - "comment": "Column header in autocomplete suggestions showing the object identifier" + "text": "Id", + "crowdinContext": "Column header in autocomplete suggestions showing the object identifier" }, "gd.gen-ai.autocomplete.attribute": { - "value": "Attribute", - "comment": "Column header in autocomplete suggestions showing the attribute name" + "text": "Attribute", + "crowdinContext": "Column header in autocomplete suggestions showing the attribute name" }, "gd.gen-ai.autocomplete.metric": { - "value": "Metric", - "comment": "Column header in autocomplete suggestions showing the metric name" + "text": "Metric", + "crowdinContext": "Column header in autocomplete suggestions showing the metric name" }, "gd.gen-ai.autocomplete.fact": { - "value": "Fact", - "comment": "Column header in autocomplete suggestions showing the fact name" + "text": "Fact", + "crowdinContext": "Column header in autocomplete suggestions showing the fact name" }, "gd.gen-ai.autocomplete.date": { - "value": "Date", - "comment": "Column header in autocomplete suggestions showing the date" + "text": "Date", + "crowdinContext": "Column header in autocomplete suggestions showing the date" }, "gd.gen-ai.autocomplete.input-info.mac": { - "value": "^+Space or ⌘+I for suggestions", - "comment": "Keyboard shortcut instructions for Mac users to trigger autocomplete suggestions" + "text": "^+Space or ⌘+I for suggestions", + "crowdinContext": "Keyboard shortcut instructions for Mac users to trigger autocomplete suggestions" }, "gd.gen-ai.autocomplete.input-info.win": { - "value": "Ctrl+Space or Ctrl+I for suggestions", - "comment": "Keyboard shortcut instructions for Windows users to trigger autocomplete suggestions" + "text": "Ctrl+Space or Ctrl+I for suggestions", + "crowdinContext": "Keyboard shortcut instructions for Windows users to trigger autocomplete suggestions" }, "gd.gen-ai.visualisation.menu": { - "value": "More actions", - "comment": "Accessibility label for the visualization actions menu" + "text": "More actions", + "crowdinContext": "Accessibility label for the visualization actions menu" }, "gd.gen-ai.visualisation.toggle.table": { - "value": "Show as table", - "comment": "Accessibility label for the visualization switch to table button" + "text": "Show as table", + "crowdinContext": "Accessibility label for the visualization switch to table button" }, "gd.gen-ai.visualisation.toggle.original": { - "value": "Show original visualization", - "comment": "Accessibility label for the visualization switch to original button" + "text": "Show original visualization", + "crowdinContext": "Accessibility label for the visualization switch to original button" }, "gd.gen-ai.visualisation.menu.button.save_as_visualisation": { - "value": "Save visualization", - "comment": "Menu option to save the current visualization" + "text": "Save visualization", + "crowdinContext": "Menu option to save the current visualization" }, "gd.gen-ai.visualisation.menu.button.save_as_new_visualisation": { - "value": "Save as new…", - "comment": "Menu option to save the current visualization as a new copy" + "text": "Save as new…", + "crowdinContext": "Menu option to save the current visualization as a new copy" }, "gd.gen-ai.visualisation.menu.button.open_in_analyze": { - "value": "Open in Analyze", - "comment": "Menu option to open the visualization in the full Analyze interface" + "text": "Open in Analyze", + "crowdinContext": "Menu option to open the visualization in the full Analyze interface" }, "gd.gen-ai.visualisation.menu.button.open_in_analyze.description": { - "value": "This will ask you to save the visualisation before you can open it.", - "comment": "Description for the open in Analyze menu option" + "text": "This will ask you to save the visualisation before you can open it.", + "crowdinContext": "Description for the open in Analyze menu option" }, "gd.gen-ai.visualisation.menu.button.copy_visualisation_link": { - "value": "Copy visualization link", - "comment": "Menu option to copy a shareable link to the visualization" + "text": "Copy visualization link", + "crowdinContext": "Menu option to copy a shareable link to the visualization" }, "gd.gen-ai.messages.label": { - "value": "Chat messages", - "comment": "Label for the chat messages section in the AI chatbot interface" + "text": "Chat messages", + "crowdinContext": "Label for the chat messages section in the AI chatbot interface" }, "gd.gen-ai.message.label.user": { - "value": "User:", - "comment": "Label identifying messages sent by the user in the chat conversation" + "text": "User:", + "crowdinContext": "Label identifying messages sent by the user in the chat conversation" }, "gd.gen-ai.message.label.assistant": { - "value": "Bot:", - "comment": "Label identifying messages sent by the AI assistant in the chat conversation" + "text": "Bot:", + "crowdinContext": "Label identifying messages sent by the AI assistant in the chat conversation" }, "gd.gen-ai.skip-messages-history": { - "value": "Skip to AI assistant input", - "comment": "Accessibility link to skip past the message history and go directly to the input field" + "text": "Skip to AI assistant input", + "crowdinContext": "Accessibility link to skip past the message history and go directly to the input field" }, "gd.gen-ai.skip-navigation": { - "value": "Skip navigation", - "comment": "Accessibility link to skip past navigation elements in the interface" + "text": "Skip navigation", + "crowdinContext": "Accessibility link to skip past navigation elements in the interface" }, "gd.gen-ai.changeAnalysis.default_message": { - "value": "Here is the key driver analysis for {title} between {range}.", - "comment": "Default message for change analysis" + "text": "Here is the key driver analysis for {title} between {range}.", + "crowdinContext": "Default message for change analysis" }, "gd.gen-ai.changeAnalysis.splitter": { - "value": "and", - "comment": "Splitter for date range in change analysis" + "text": "and", + "crowdinContext": "Splitter for date range in change analysis" }, "gd.gen-ai.changeAnalysis.explain_the_change": { - "value": "Open the analysis", - "comment": "Button label to explain the change" + "text": "Open the analysis", + "crowdinContext": "Button label to explain the change" }, "gd.gen-ai.drill_modal_picker.label": { - "value": "Drill modal picker", - "comment": "Label for the drill modal picker" + "text": "Drill modal picker", + "crowdinContext": "Label for the drill modal picker" }, "gd.gen-ai.drill_modal_picker.header.explain": { - "value": "Explain", - "comment": "Header for the drill modal picker explain section" + "text": "Explain", + "crowdinContext": "Header for the drill modal picker explain section" }, "drill.kda.from": { - "value": "from", - "comment": "Key driver analysis drill from label, must be lowercase" + "text": "from", + "crowdinContext": "Key driver analysis drill from label, must be lowercase" }, "drill.kda.in": { - "value": "in", - "comment": "Key driver analysis drill in label, must be lowercase" + "text": "in", + "crowdinContext": "Key driver analysis drill in label, must be lowercase" }, "drill.kda.drop": { - "value": "Drop {where} {title}", - "comment": "Key driver analysis drill drop label" + "text": "Drop {where} {title}", + "crowdinContext": "Key driver analysis drill drop label" }, "drill.kda.increase": { - "value": "Increase {where} {title}", - "comment": "Key driver analysis drill increase label" + "text": "Increase {where} {title}", + "crowdinContext": "Key driver analysis drill increase label" }, "drill.kda.no_change": { - "value": "Stale {where} {title}", - "comment": "Key driver analysis drill increase label" + "text": "Stale {where} {title}", + "crowdinContext": "Key driver analysis drill increase label" }, "drill.kda.year_to_year": { - "value": "Year over year change", - "comment": "Key driver analysis drill year to year label" + "text": "Year over year change", + "crowdinContext": "Key driver analysis drill year to year label" } } diff --git a/libs/sdk-ui-geo/package.json b/libs/sdk-ui-geo/package.json index cf71182382a..dd209e59261 100644 --- a/libs/sdk-ui-geo/package.json +++ b/libs/sdk-ui-geo/package.json @@ -117,7 +117,7 @@ "stylelint": "^13.8.0", "stylelint-checkstyle-formatter": "^0.1.2", "stylelint-config-prettier": "^9.0.5", - "typescript": "5.8.3", + "typescript": "5.9.3", "vitest": "3.2.4", "vitest-dom": "0.1.1" }, diff --git a/libs/sdk-ui-geo/src/next/components/RenderGeoChartNext.tsx b/libs/sdk-ui-geo/src/next/components/RenderGeoChartNext.tsx index 576e5fb6af4..1abe7539b8f 100644 --- a/libs/sdk-ui-geo/src/next/components/RenderGeoChartNext.tsx +++ b/libs/sdk-ui-geo/src/next/components/RenderGeoChartNext.tsx @@ -1,4 +1,4 @@ -// (C) 2025 GoodData Corporation +// (C) 2025-2026 GoodData Corporation import { type ReactElement, useMemo, useRef, useState } from "react"; @@ -17,7 +17,7 @@ import { GeoChartNextLegendOverlay } from "./multiLayerLegend/GeoChartNextLegend import { useGeoChartNextProps } from "../context/GeoChartNextContext.js"; import { useGeoLayers } from "../context/GeoLayersContext.js"; import { MapController } from "../map/MapController.js"; -import { computeCombinedViewport } from "../map/viewport.js"; +import { computeCombinedViewport, computeViewportFromConfig } from "../map/viewport.js"; import { PushDataSync } from "../pushData/PushDataSync.js"; // There are known compatibility issues between CommonJS (CJS) and ECMAScript modules (ESM). @@ -51,7 +51,11 @@ export function RenderGeoChartNext(): ReactElement { const colorStrategy = primaryLayer?.colorStrategy ?? null; const availableLegends = primaryLayer?.availableLegends; - const initialViewport = useMemo(() => computeCombinedViewport(layers), [layers]); + const dataViewport = useMemo(() => computeCombinedViewport(layers), [layers]); + const initialViewport = useMemo( + () => computeViewportFromConfig(props.config, dataViewport), + [props.config, dataViewport], + ); const drillablePredicates = useMemo( () => convertDrillableItemsToPredicates(props.drillableItems ?? []), @@ -96,6 +100,7 @@ export function RenderGeoChartNext(): ReactElement { mapContainerRef={mapContainerRef} chartContainerRect={chartContainerRect} initialViewport={initialViewport} + dataViewport={dataViewport} layerExecutions={layerExecutions} drillablePredicates={drillablePredicates} onCenterPositionChanged={props.onCenterPositionChanged} @@ -109,6 +114,7 @@ export function RenderGeoChartNext(): ReactElement { colorStrategy={colorStrategy} colorPalette={colorPalette} availableLegends={availableLegends} + geoLayerType={props.type} />
)} diff --git a/libs/sdk-ui-geo/src/next/hooks/dataLoading/useNormalizedLayerExecutions.ts b/libs/sdk-ui-geo/src/next/hooks/dataLoading/useNormalizedLayerExecutions.ts index 07b56f6111b..e81c4096e7f 100644 --- a/libs/sdk-ui-geo/src/next/hooks/dataLoading/useNormalizedLayerExecutions.ts +++ b/libs/sdk-ui-geo/src/next/hooks/dataLoading/useNormalizedLayerExecutions.ts @@ -218,8 +218,9 @@ export function useNormalizedLayerExecutions< return { ...rest, layers, + type: rootLayerType, } as WithoutExecutions & { layers: IGeoLayer[] }; - }, [props, layers]); + }, [props, layers, rootLayerType]); return { layerExecutions, propsWithLayers }; } diff --git a/libs/sdk-ui-geo/src/next/hooks/map/useApplyViewportOnConfigChange.ts b/libs/sdk-ui-geo/src/next/hooks/map/useApplyViewportOnConfigChange.ts new file mode 100644 index 00000000000..94e265b6c26 --- /dev/null +++ b/libs/sdk-ui-geo/src/next/hooks/map/useApplyViewportOnConfigChange.ts @@ -0,0 +1,59 @@ +// (C) 2025-2026 GoodData Corporation + +import { useEffect, useMemo, useRef } from "react"; + +import type { IMapFacade } from "../../layers/common/mapFacade.js"; +import { applyViewport } from "../../map/viewport/viewportCalculation.js"; +import { computeViewportFromConfig, getViewportConfigKey } from "../../map/viewport/viewportResolution.js"; +import type { IGeoChartNextConfig } from "../../types/config/unified.js"; +import type { IMapViewport } from "../../types/map/provider.js"; + +/** + * Applies configured viewport whenever the viewport-related config changes. + * + * @remarks + * `useMapInitialization` intentionally captures only the initial viewport and does not re-center the map on + * prop changes. This hook provides the missing behavior for Analytical Designer: when the user changes + * "Default viewport", we apply the new viewport to the already-initialized map. + * + * We only react to viewport-relevant config changes (`center`/`zoom` or `viewport.area`). + * Data changes are intentionally ignored to avoid unexpected re-centering during interactions. + * + * The current `dataViewport` is still passed in so that switching to `"auto"` (or clearing the preset) + * applies the latest data-derived bounds. + * + * @internal + */ +export function useApplyViewportOnConfigChange( + map: IMapFacade | null, + isMapReady: boolean, + config: IGeoChartNextConfig | undefined, + dataViewport: Partial | null, +): void { + const configKey = useMemo(() => getViewportConfigKey(config), [config]); + const previousConfigKeyRef = useRef(null); + + useEffect(() => { + if (!map || !isMapReady) { + return; + } + + const previousKey = previousConfigKeyRef.current; + previousConfigKeyRef.current = configKey; + + // First run: map just initialized with the initial viewport already applied. + if (previousKey === null) { + return; + } + + if (previousKey === configKey) { + return; + } + + const viewportToApply = computeViewportFromConfig(config, dataViewport); + if (!viewportToApply) { + return; + } + applyViewport(map, viewportToApply, true); + }, [map, isMapReady, configKey, config, dataViewport]); +} diff --git a/libs/sdk-ui-geo/src/next/hooks/map/useMapResize.ts b/libs/sdk-ui-geo/src/next/hooks/map/useMapResize.ts index 7ce3f53bbd2..7a8e14584a5 100644 --- a/libs/sdk-ui-geo/src/next/hooks/map/useMapResize.ts +++ b/libs/sdk-ui-geo/src/next/hooks/map/useMapResize.ts @@ -1,4 +1,4 @@ -// (C) 2025 GoodData Corporation +// (C) 2025-2026 GoodData Corporation import { useEffect, useRef } from "react"; @@ -17,8 +17,8 @@ import { type IMapViewport } from "../../types/map/provider.js"; * 1. Calls map.resize() to update the MapLibre canvas size * 2. Reapplies the viewport so fitBounds can recalculate based on new dimensions * - * This is separate from viewport updates triggered by data/config changes. - * Those are handled in useMapDataSync. + * This is separate from viewport updates triggered by config changes (e.g. Analytical Designer viewport). + * Those are handled in `useApplyViewportOnConfigChange`. * * @param map - MapLibre map instance (null if not initialized) * @param isMapReady - Whether map is ready for updates diff --git a/libs/sdk-ui-geo/src/next/hooks/pushData/useGeoPushData.ts b/libs/sdk-ui-geo/src/next/hooks/pushData/useGeoPushData.ts index bead892c02f..e45955cab0f 100644 --- a/libs/sdk-ui-geo/src/next/hooks/pushData/useGeoPushData.ts +++ b/libs/sdk-ui-geo/src/next/hooks/pushData/useGeoPushData.ts @@ -1,14 +1,15 @@ -// (C) 2025 GoodData Corporation +// (C) 2025-2026 GoodData Corporation import { useEffect, useMemo } from "react"; -import { type IColorPalette } from "@gooddata/sdk-model"; -import { type IPushData, getMultiLayerDrillTargets } from "@gooddata/sdk-ui"; +import { type AttributeDisplayFormType, type IColorPalette } from "@gooddata/sdk-model"; +import { type IAvailableDrillTargets, type IPushData, getMultiLayerDrillTargets } from "@gooddata/sdk-ui"; import { type IColorStrategy } from "@gooddata/sdk-ui-vis-commons"; import { useGeoLayers } from "../../context/GeoLayersContext.js"; import { useInitialExecution } from "../../context/InitialExecutionContext.js"; import { type IAvailableLegends } from "../../types/common/legends.js"; +import { type GeoLayerType } from "../../types/layers/index.js"; interface ILegendContext { availableLegends: IAvailableLegends; @@ -27,6 +28,7 @@ interface IUseGeoPushDataConfig TProps; useLegendContext: () => TLegendContext; getLegendVisibility?: (availableLegends: IAvailableLegends) => boolean; + geoLayerType: GeoLayerType; } const defaultLegendVisibility = (availableLegends: IAvailableLegends): boolean => { @@ -34,6 +36,35 @@ const defaultLegendVisibility = (availableLegends: IAvailableLegends): boolean = return Boolean(availableLegends.hasCategoryLegend || availableLegends.hasColorLegend || hasSizeLegend); }; +/** + * Maps geo layer type to the preferred display form type for drill-down targets. + */ +function getGeoDisplayFormType(geoLayerType: GeoLayerType): AttributeDisplayFormType | undefined { + return geoLayerType === "area" ? "GDC.geo.area" : undefined; +} + +/** + * Enhances drill targets with geo-specific display form type preference. + */ +function enhanceDrillTargetsWithGeoDisplayForm( + drillTargets: IAvailableDrillTargets | undefined, + geoLayerType: GeoLayerType, +): IAvailableDrillTargets | undefined { + if (!drillTargets) { + return undefined; + } + + const drillTargetDisplayFormType = getGeoDisplayFormType(geoLayerType); + + return { + ...drillTargets, + attributes: drillTargets.attributes?.map((attr) => ({ + ...attr, + drillTargetDisplayFormType, + })), + }; +} + /** * Shared implementation for Analytical Designer pushData updates. * @@ -42,7 +73,12 @@ const defaultLegendVisibility = (availableLegends: IAvailableLegends): boolean = export function useGeoPushData( colorStrategy: IColorStrategy | null, colorPalette: IColorPalette, - { useProps, useLegendContext, getLegendVisibility }: IUseGeoPushDataConfig, + { + useProps, + useLegendContext, + getLegendVisibility, + geoLayerType, + }: IUseGeoPushDataConfig, ): void { const props = useProps(); const { availableLegends } = useLegendContext(); @@ -60,9 +96,11 @@ export function useGeoPushData { - return getMultiLayerDrillTargets(layerDataViews, initialDataView); + const baseDrillTargets = getMultiLayerDrillTargets(layerDataViews, initialDataView); + // Enhance drill targets with geo-specific display form preference + return enhanceDrillTargetsWithGeoDisplayForm(baseDrillTargets, geoLayerType); // eslint-disable-next-line react-hooks/exhaustive-deps - }, [fingerprintsKey, initialDataView]); + }, [fingerprintsKey, initialDataView, geoLayerType]); useEffect(() => { if (!pushData || !colorStrategy) { diff --git a/libs/sdk-ui-geo/src/next/layers/pushpin/adapter.ts b/libs/sdk-ui-geo/src/next/layers/pushpin/adapter.ts index 8720395f4d3..60c5083a363 100644 --- a/libs/sdk-ui-geo/src/next/layers/pushpin/adapter.ts +++ b/libs/sdk-ui-geo/src/next/layers/pushpin/adapter.ts @@ -1,4 +1,4 @@ -// (C) 2025 GoodData Corporation +// (C) 2025-2026 GoodData Corporation import { type IPreparedExecution } from "@gooddata/sdk-backend-spi"; import { newBucket } from "@gooddata/sdk-model"; @@ -33,11 +33,8 @@ function getValidLocations(locations: Array): IGe ); } -function computeInitialViewport( - geoData: IPushpinGeoData, - config?: IGeoPushpinChartNextConfig, -): Partial | null { - if (!config || !geoData.location?.data) { +function computeInitialViewport(geoData: IPushpinGeoData): Partial | null { + if (!geoData.location?.data) { return null; } @@ -46,7 +43,11 @@ function computeInitialViewport( return null; } - return calculateViewport(validLocations, config); + // IMPORTANT: this must stay *data-derived* (i.e. independent of config). + // If presets/center influenced this value, then switching from a preset -> "auto" would + // keep using the preset viewport because "auto" falls back to this per-layer hint. + const dataViewportConfig: IGeoPushpinChartNextConfig = { viewport: { area: "auto" } }; + return calculateViewport(validLocations, dataViewportConfig); } function createExecution(layer: IGeoLayerPushpin, context: IGeoAdapterContext): IPreparedExecution { @@ -141,7 +142,7 @@ export const pushpinAdapter: IGeoLayerAdapter; chartContainerRect: ContentRect | null; initialViewport: Partial | null; + dataViewport: Partial | null; layerExecutions: ILayerExecutionRecord[]; drillablePredicates: IHeaderPredicate[]; onCenterPositionChanged?: CenterPositionChangedCallback; @@ -41,6 +43,7 @@ export function MapController({ mapContainerRef, chartContainerRect, initialViewport, + dataViewport, layerExecutions, drillablePredicates, onCenterPositionChanged, @@ -73,6 +76,8 @@ export function MapController({ | null; + dataViewport: Partial | null; + config: IGeoChartNextConfig | undefined; layerExecutions: ILayerExecutionRecord[]; drillablePredicates: IHeaderPredicate[]; onCenterPositionChanged?: CenterPositionChangedCallback; @@ -106,6 +115,7 @@ function MapLifecycleEffects({ const { map, isMapReady } = useMapRuntime(); useMapResize(map, isMapReady, chartContainerRect, initialViewport); + useApplyViewportOnConfigChange(map, isMapReady, config, dataViewport); useMapCallbacks(map, { onCenterPositionChanged, diff --git a/libs/sdk-ui-geo/src/next/map/runtime/mapConfig.ts b/libs/sdk-ui-geo/src/next/map/runtime/mapConfig.ts index 17ec0d4d78d..516b5a0652e 100644 --- a/libs/sdk-ui-geo/src/next/map/runtime/mapConfig.ts +++ b/libs/sdk-ui-geo/src/next/map/runtime/mapConfig.ts @@ -1,19 +1,25 @@ -// (C) 2025 GoodData Corporation +// (C) 2025-2026 GoodData Corporation -import type { - FilterSpecification, - LngLatBoundsLike, - MapOptions, - PopupOptions, -} from "../../layers/common/mapFacade.js"; +import type { FilterSpecification, MapOptions, PopupOptions } from "../../layers/common/mapFacade.js"; import { type IGeoLngLat } from "../../types/common/coordinates.js"; +import type { IGeoConfigViewportAreaNext } from "../../types/config/viewport.js"; /** - * Type for viewport definitions + * Viewport preset keys (everything except the special "auto" value). + * + * @internal */ -type IGeoViewports = { - [key: string]: LngLatBoundsLike; -}; +type ViewportPresetKey = Exclude; + +/** + * Bounds format used by our preset table. + * + * MapLibre accepts `{ lng, lat }` objects as `LngLatLike`, so this is still compatible with + * `LngLatBoundsLike` where needed. + * + * @internal + */ +export type ViewportPresetBounds = readonly [IGeoLngLat, IGeoLngLat]; /** * Default world bounds for the map viewport @@ -27,7 +33,7 @@ export const DEFAULT_WORLD_BOUNDS = { northEast: { lat: 84, lng: 180 }, southWes * * @alpha */ -export const VIEWPORTS: IGeoViewports = { +export const VIEWPORTS = { continent_af: [ { lat: -36, lng: -20 }, { lat: 38, lng: 54 }, @@ -53,7 +59,7 @@ export const VIEWPORTS: IGeoViewports = { { lat: 14, lng: -31 }, ], // South America world: [DEFAULT_WORLD_BOUNDS.southWest, DEFAULT_WORLD_BOUNDS.northEast], // World -}; +} as const satisfies Record; /** * Filter for identifying clustered points diff --git a/libs/sdk-ui-geo/src/next/map/tests/MapController.test.tsx b/libs/sdk-ui-geo/src/next/map/tests/MapController.test.tsx index 23e142cf507..4f6e6b70971 100644 --- a/libs/sdk-ui-geo/src/next/map/tests/MapController.test.tsx +++ b/libs/sdk-ui-geo/src/next/map/tests/MapController.test.tsx @@ -1,4 +1,4 @@ -// (C) 2025 GoodData Corporation +// (C) 2025-2026 GoodData Corporation import { render } from "@testing-library/react"; import { beforeEach, describe, expect, it, vi } from "vitest"; @@ -17,6 +17,7 @@ const resizeMock = vi.fn(); const callbacksMock = vi.fn(); const syncMock = vi.fn(); const afterRenderMock = vi.fn(); +const applyViewportOnConfigChangeMock = vi.fn(); function createMapFacadeStub(): IMapFacade { const style: StyleSpecification = { version: 8, sources: {}, layers: [] }; @@ -113,6 +114,9 @@ vi.mock("../../hooks/layers/useGeoAdapterContext.js", () => ({ vi.mock("../../hooks/map/useAfterRender.js", () => ({ useAfterRender: (...args: unknown[]) => afterRenderMock(...args), })); +vi.mock("../../hooks/map/useApplyViewportOnConfigChange.js", () => ({ + useApplyViewportOnConfigChange: (...args: unknown[]) => applyViewportOnConfigChangeMock(...args), +})); describe("MapController", () => { beforeEach(() => { @@ -121,6 +125,7 @@ describe("MapController", () => { callbacksMock.mockClear(); syncMock.mockClear(); afterRenderMock.mockClear(); + applyViewportOnConfigChangeMock.mockClear(); }); it("wires map lifecycle hooks with provided props", () => { @@ -139,6 +144,7 @@ describe("MapController", () => { mapContainerRef={mapContainerRef} chartContainerRect={null} initialViewport={null} + dataViewport={null} layerExecutions={layerExecutions} drillablePredicates={drillablePredicates} onCenterPositionChanged={onCenterPositionChanged} @@ -150,6 +156,7 @@ describe("MapController", () => { expect(initMock).toHaveBeenCalledWith(mapContainerRef, config, null, undefined); expect(resizeMock).toHaveBeenCalledWith(mapFacadeStub, true, null, null); + expect(applyViewportOnConfigChangeMock).toHaveBeenCalledWith(mapFacadeStub, true, config, null); expect(callbacksMock).toHaveBeenCalledWith(mapFacadeStub, { onCenterPositionChanged, onZoomChanged, diff --git a/libs/sdk-ui-geo/src/next/map/viewport.ts b/libs/sdk-ui-geo/src/next/map/viewport.ts index ef2b3808aef..19707e19705 100644 --- a/libs/sdk-ui-geo/src/next/map/viewport.ts +++ b/libs/sdk-ui-geo/src/next/map/viewport.ts @@ -1,8 +1,10 @@ -// (C) 2025 GoodData Corporation +// (C) 2025-2026 GoodData Corporation import { type IGeoLayerData } from "../context/GeoLayersContext.js"; import { type IMapViewport } from "../types/map/provider.js"; +export { computeViewportFromConfig } from "./viewport/viewportResolution.js"; + function mergeBounds( a: IMapViewport["bounds"] | undefined, b: IMapViewport["bounds"] | undefined, @@ -28,6 +30,10 @@ function mergeBounds( /** * Computes a combined viewport from all layers. * Merges bounds from all layers to ensure all data is visible. + * + * @remarks + * The layer-provided `initialViewport` should be data-derived (used for `"auto"` behavior). + * Config-driven viewports are handled separately by `computeViewportFromConfig`. */ export function computeCombinedViewport(layers: Map): Partial | null { let combinedBounds: IMapViewport["bounds"] | undefined; diff --git a/libs/sdk-ui-geo/src/next/map/viewport/viewportPresets.ts b/libs/sdk-ui-geo/src/next/map/viewport/viewportPresets.ts index 7d021bfa67a..bb7b7e92b88 100644 --- a/libs/sdk-ui-geo/src/next/map/viewport/viewportPresets.ts +++ b/libs/sdk-ui-geo/src/next/map/viewport/viewportPresets.ts @@ -1,4 +1,4 @@ -// (C) 2025 GoodData Corporation +// (C) 2025-2026 GoodData Corporation import type { LngLatBoundsLike } from "../../layers/common/mapFacade.js"; import { type IGeoLngLat, type IGeoLngLatBounds } from "../../types/common/coordinates.js"; @@ -32,8 +32,9 @@ export function getViewportOptions(data: IGeoLngLat[], config: IGeoPushpinChartN const { area }: IGeoConfigViewportNext = config?.viewport ?? {}; if (!center) { - if (area && VIEWPORTS[area]) { - const bounds: LngLatBoundsLike = VIEWPORTS[area]; + if (area && area !== "auto") { + const [southWest, northEast] = VIEWPORTS[area]; + const bounds: LngLatBoundsLike = [southWest, northEast]; return { bounds }; } else { const lngLatBounds: IGeoLngLatBounds | undefined = getLngLatBounds(data); diff --git a/libs/sdk-ui-geo/src/next/map/viewport/viewportResolution.ts b/libs/sdk-ui-geo/src/next/map/viewport/viewportResolution.ts new file mode 100644 index 00000000000..580817397d7 --- /dev/null +++ b/libs/sdk-ui-geo/src/next/map/viewport/viewportResolution.ts @@ -0,0 +1,71 @@ +// (C) 2025-2026 GoodData Corporation + +import type { IGeoChartNextConfig } from "../../types/config/unified.js"; +import type { IMapViewport } from "../../types/map/provider.js"; +import { DEFAULT_CENTER, DEFAULT_ZOOM, VIEWPORTS } from "../runtime/mapConfig.js"; + +/** + * Resolves the map viewport from configuration, falling back to a data-derived viewport. + * + * Priority order (highest wins): + * 1. `config.center` + `config.zoom` (explicit center/zoom) + * 2. `config.viewport.area` (preset area like "continent_eu") + * 3. `dataViewport` (computed from layer data; used for `"auto"`) + * 4. Default fallback + * + * @remarks + * This function is intentionally pure and cycle-free so it can be reused both: + * - when selecting the initial viewport for map initialization, and + * - when applying viewport changes (e.g. in Analytical Designer). + * + * @internal + */ +export function computeViewportFromConfig( + config: IGeoChartNextConfig | undefined, + dataViewport: Partial | null = null, +): Partial | null { + if (!config) { + return dataViewport; + } + + if (config.center) { + return { + center: config.center, + zoom: config.zoom ?? DEFAULT_ZOOM, + }; + } + + const area = config.viewport?.area; + if (area && area !== "auto") { + const [southWest, northEast] = VIEWPORTS[area]; + return { + bounds: { southWest, northEast }, + }; + } + + return ( + dataViewport ?? { + center: DEFAULT_CENTER, + zoom: DEFAULT_ZOOM, + } + ); +} + +/** + * Creates a stable key for viewport-relevant config so hooks can detect user changes. + * + * @remarks + * We deliberately key only on values that should trigger viewport re-application: + * - `center`/`zoom`, or + * - `viewport.area` + * + * @internal + */ +export function getViewportConfigKey(config: IGeoChartNextConfig | undefined): string { + if (config?.center) { + const zoom = config.zoom ?? DEFAULT_ZOOM; + return `center:${config.center.lat}:${config.center.lng}:${zoom}`; + } + + return `area:${config?.viewport?.area ?? "auto"}`; +} diff --git a/libs/sdk-ui-geo/src/next/pushData/PushDataSync.tsx b/libs/sdk-ui-geo/src/next/pushData/PushDataSync.tsx index adf857bd4b5..e8b1dde4405 100644 --- a/libs/sdk-ui-geo/src/next/pushData/PushDataSync.tsx +++ b/libs/sdk-ui-geo/src/next/pushData/PushDataSync.tsx @@ -1,4 +1,4 @@ -// (C) 2025 GoodData Corporation +// (C) 2025-2026 GoodData Corporation import { type ReactElement } from "react"; @@ -8,17 +8,20 @@ import { type IColorStrategy } from "@gooddata/sdk-ui-vis-commons"; import { useGeoChartNextProps } from "../context/GeoChartNextContext.js"; import { useGeoPushData } from "../hooks/pushData/useGeoPushData.js"; import { type IAvailableLegends } from "../types/common/legends.js"; +import { type GeoLayerType } from "../types/layers/index.js"; type PushDataSyncProps = { colorStrategy: IColorStrategy | null; colorPalette: IColorPalette; availableLegends?: IAvailableLegends; + geoLayerType: GeoLayerType; }; export function PushDataSync({ colorStrategy, colorPalette, availableLegends, + geoLayerType, }: PushDataSyncProps): ReactElement | null { useGeoPushData(colorStrategy, colorPalette, { useProps: useGeoChartNextProps, @@ -28,6 +31,7 @@ export function PushDataSync({ hasColorLegend: false, }, }), + geoLayerType, }); return null; diff --git a/libs/sdk-ui-kit/package.json b/libs/sdk-ui-kit/package.json index 79baee74ae2..8e0713cbd98 100644 --- a/libs/sdk-ui-kit/package.json +++ b/libs/sdk-ui-kit/package.json @@ -158,7 +158,7 @@ "stylelint-checkstyle-formatter": "^0.1.2", "stylelint-config-prettier": "^9.0.5", "svgo": "^2.8.0", - "typescript": "5.8.3", + "typescript": "5.9.3", "vitest": "3.2.4", "vitest-dom": "0.1.1" }, diff --git a/libs/sdk-ui-loaders/package.json b/libs/sdk-ui-loaders/package.json index 8170a4a53c0..48660338ebd 100644 --- a/libs/sdk-ui-loaders/package.json +++ b/libs/sdk-ui-loaders/package.json @@ -84,7 +84,7 @@ "raf": "^3.4.1", "react": "19.1.1", "react-dom": "19.1.1", - "typescript": "5.8.3" + "typescript": "5.9.3" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", diff --git a/libs/sdk-ui-pivot/package.json b/libs/sdk-ui-pivot/package.json index 12d8f77bd9e..41c929b714f 100644 --- a/libs/sdk-ui-pivot/package.json +++ b/libs/sdk-ui-pivot/package.json @@ -118,7 +118,7 @@ "stylelint": "^13.8.0", "stylelint-checkstyle-formatter": "^0.1.2", "stylelint-config-prettier": "^9.0.5", - "typescript": "5.8.3", + "typescript": "5.9.3", "vitest": "3.2.4", "vitest-dom": "0.1.1" }, diff --git a/libs/sdk-ui-pivot/src/next/components/Header/AttributeHeader.tsx b/libs/sdk-ui-pivot/src/next/components/Header/AttributeHeader.tsx index 1392e56ad3e..1c13025120d 100644 --- a/libs/sdk-ui-pivot/src/next/components/Header/AttributeHeader.tsx +++ b/libs/sdk-ui-pivot/src/next/components/Header/AttributeHeader.tsx @@ -1,4 +1,4 @@ -// (C) 2025 GoodData Corporation +// (C) 2025-2026 GoodData Corporation import { useState } from "react"; @@ -80,7 +80,7 @@ export function AttributeHeader(params: AgGridHeaderParams) { })} {...getPivotHeaderTestIdProps({ drillable: isDrillable })} > -
+