@gooddata/sdk-ui-analytical-designer 11.65.0-alpha.13 → 11.65.0-alpha.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/NOTICE +3 -900
  2. package/esm/models/metadata.d.ts +8 -0
  3. package/esm/models/metadata.d.ts.map +1 -1
  4. package/esm/models/metadata.js +62 -11
  5. package/esm/selectors/dialogs_selector.d.ts +11 -11
  6. package/esm/selectors/report_visualization_selector.d.ts +4 -4
  7. package/esm/selectors/save_report_from_kd_dialog_selector.d.ts +11 -11
  8. package/esm/selectors/save_report_selector.d.ts +3 -0
  9. package/esm/selectors/save_report_selector.d.ts.map +1 -1
  10. package/esm/selectors/save_report_selector.js +18 -2
  11. package/esm/selectors/uri_selector.d.ts +5 -6
  12. package/esm/selectors/uri_selector.d.ts.map +1 -1
  13. package/esm/selectors/uri_selector.js +1 -10
  14. package/esm/services/bootstrap_error_service.d.ts.map +1 -1
  15. package/esm/services/bootstrap_error_service.js +5 -14
  16. package/esm/translations/de-DE.json +0 -22
  17. package/esm/translations/en-AU.json +0 -22
  18. package/esm/translations/en-GB.json +0 -22
  19. package/esm/translations/es-419.json +0 -22
  20. package/esm/translations/es-ES.json +13 -35
  21. package/esm/translations/fi-FI.json +0 -22
  22. package/esm/translations/fr-CA.json +0 -22
  23. package/esm/translations/fr-FR.json +0 -22
  24. package/esm/translations/id-ID.json +0 -22
  25. package/esm/translations/it-IT.json +0 -22
  26. package/esm/translations/ja-JP.json +0 -22
  27. package/esm/translations/ko-KR.json +0 -22
  28. package/esm/translations/nl-NL.json +0 -22
  29. package/esm/translations/pl-PL.json +0 -22
  30. package/esm/translations/pt-BR.json +0 -22
  31. package/esm/translations/pt-PT.json +0 -22
  32. package/esm/translations/ru-RU.json +0 -22
  33. package/esm/translations/sl-SI.json +0 -22
  34. package/esm/translations/th-TH.json +0 -22
  35. package/esm/translations/tr-TR.json +0 -22
  36. package/esm/translations/uk-UA.json +0 -22
  37. package/esm/translations/vi-VN.json +0 -22
  38. package/esm/translations/zh-HK.json +0 -22
  39. package/esm/translations/zh-Hans.json +0 -22
  40. package/esm/translations/zh-Hant.json +0 -22
  41. package/package.json +21 -21
@@ -50,6 +50,14 @@ export declare function findItemInCache(uriOrId: string, cache: ICatalogEntries
50
50
  * identifier, so pass it wherever it is at hand.
51
51
  */
52
52
  ref?: ObjRef): ICatalogEntry | undefined;
53
+ /**
54
+ * Rewrites the stored filters so that every representation of the same empty date values mode compares
55
+ * equal: the legacy `""` attribute filter is folded into its date filter's `emptyValueHandling` (the way
56
+ * the reader does), All time with a mode becomes the ALL_TIME_GRANULARITY filter whether it is stored with
57
+ * bounds or without, and the `include` default is dropped as the writer drops it. Only for comparing
58
+ * stored content, the result is never saved.
59
+ */
60
+ export declare function normalizeEmptyDateValuesFilters(visualizationFilters: ReadonlyArray<VisualizationObjectExtendedFilter>, dateDatasets: IDateDatasets | undefined): VisualizationObjectExtendedFilter[];
53
61
  export declare function isMeasureShowOnSecondaryAxis(item: IVisualizationObjectMeasure, properties: IStoredVisualizationProperties | undefined): boolean;
54
62
  export declare function isATotalMeasure(item: IVisualizationObjectMeasure, properties: IStoredVisualizationProperties | undefined): boolean;
55
63
  export declare function isThresholdMeasure(item: IVisualizationObjectMeasure, properties: IStoredVisualizationProperties | undefined): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/models/metadata.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/models/metadata.ts"],"names":[],"mappings":"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"}
@@ -854,9 +854,7 @@ function transformToDateFilterConfig(visualizationFilter) {
854
854
  throw new Error("Unsupported visualization date filter type");
855
855
  }
856
856
  function transformVisualizationDateFilter(visualizationFilter, overTimeComparisonType, ignoreOverTimeComparisonType) {
857
- let datasetRef = isVisualizationObjectRelativeDateFilter(visualizationFilter)
858
- ? visualizationFilter.relativeDateFilter.dataSet
859
- : visualizationFilter.absoluteDateFilter.dataSet;
857
+ let datasetRef = getDateFilterDataSet(visualizationFilter);
860
858
  /**
861
859
  * convertor from SDK returns ref without type
862
860
  */
@@ -877,6 +875,12 @@ function transformVisualizationDateFilter(visualizationFilter, overTimeCompariso
877
875
  ...(emptyDateValuesFilter ? { emptyDateValuesFilter } : {}),
878
876
  };
879
877
  }
878
+ /** The date dataset a stored date filter filters on. */
879
+ function getDateFilterDataSet(visualizationFilter) {
880
+ return isVisualizationObjectRelativeDateFilter(visualizationFilter)
881
+ ? visualizationFilter.relativeDateFilter.dataSet
882
+ : visualizationFilter.absoluteDateFilter.dataSet;
883
+ }
880
884
  /** The empty date values mode a stored date filter carries as `emptyValueHandling`, if any. */
881
885
  function getDateFilterEmptyValueHandling(visualizationFilter) {
882
886
  return isVisualizationObjectRelativeDateFilter(visualizationFilter)
@@ -1074,24 +1078,71 @@ function detectEmptyDateValuesAttributeFilter(attributeFilter, dateDatasets) {
1074
1078
  }
1075
1079
  return undefined;
1076
1080
  }
1077
- function transformVisualizationFilters(metadataObject, overTimeComparisonType, additionalData) {
1078
- const visualizationFilters = metadataObject.filters || [];
1079
- const dateDatasets = additionalData?.dateDatasets || undefined;
1080
- // First pass: identify LEGACY empty date values attribute filters (the single-"" element filters on a
1081
- // date attribute), kept readable so insights saved before the mode moved to `emptyValueHandling` open
1081
+ /**
1082
+ * Finds the LEGACY empty date values attribute filters (the single-"" element filters on a date
1083
+ * attribute), kept readable so insights saved before the mode moved to `emptyValueHandling` open.
1084
+ */
1085
+ function collectLegacyEmptyDateValuesFilters(visualizationFilters, dateDatasets) {
1086
+ // keyed by the date dataset ref string
1082
1087
  const emptyDateValuesFilters = {};
1083
1088
  const emptyDateValuesFilterIndices = new globalThis.Set();
1084
1089
  visualizationFilters.forEach((filter, index) => {
1085
1090
  if (isVisualizationObjectAttributeFilter(filter)) {
1086
1091
  const detected = detectEmptyDateValuesAttributeFilter(filter, dateDatasets);
1087
1092
  if (detected) {
1088
- // Key by date dataset ref string for lookup
1089
- const key = objRefToString(detected.dateDatasetRef);
1090
- emptyDateValuesFilters[key] = detected;
1093
+ emptyDateValuesFilters[objRefToString(detected.dateDatasetRef)] = detected;
1091
1094
  emptyDateValuesFilterIndices.add(index);
1092
1095
  }
1093
1096
  }
1094
1097
  });
1098
+ return { emptyDateValuesFilters, emptyDateValuesFilterIndices };
1099
+ }
1100
+ /**
1101
+ * Rewrites the stored filters so that every representation of the same empty date values mode compares
1102
+ * equal: the legacy `""` attribute filter is folded into its date filter's `emptyValueHandling` (the way
1103
+ * the reader does), All time with a mode becomes the ALL_TIME_GRANULARITY filter whether it is stored with
1104
+ * bounds or without, and the `include` default is dropped as the writer drops it. Only for comparing
1105
+ * stored content, the result is never saved.
1106
+ */
1107
+ export function normalizeEmptyDateValuesFilters(visualizationFilters, dateDatasets) {
1108
+ const { emptyDateValuesFilters, emptyDateValuesFilterIndices } = collectLegacyEmptyDateValuesFilters(visualizationFilters, dateDatasets);
1109
+ return visualizationFilters
1110
+ .filter((_filter, index) => !emptyDateValuesFilterIndices.has(index))
1111
+ .map((filter) => {
1112
+ if (!isVisualizationObjectDateFilter(filter)) {
1113
+ return filter;
1114
+ }
1115
+ const dataSet = getDateFilterDataSet(filter);
1116
+ const storedMode = getDateFilterEmptyValueHandling(filter);
1117
+ const mode = emptyValueHandlingToMd(storedMode ?? emptyDateValuesFilters[objRefToString(dataSet)]?.mode);
1118
+ if (isVisualizationObjectAbsoluteDateFilter(filter)) {
1119
+ return {
1120
+ absoluteDateFilter: { ...omit(filter.absoluteDateFilter, "emptyValueHandling"), ...mode },
1121
+ };
1122
+ }
1123
+ const { granularity, from, to } = filter.relativeDateFilter;
1124
+ const isAllTime = granularity === ALL_TIME_GRANULARITY || from === undefined || to === undefined;
1125
+ if (isAllTime && !isEmpty(mode)) {
1126
+ return {
1127
+ relativeDateFilter: {
1128
+ dataSet,
1129
+ granularity: ALL_TIME_GRANULARITY,
1130
+ from: 0,
1131
+ to: 0,
1132
+ ...mode,
1133
+ },
1134
+ };
1135
+ }
1136
+ return {
1137
+ relativeDateFilter: { ...omit(filter.relativeDateFilter, "emptyValueHandling"), ...mode },
1138
+ };
1139
+ });
1140
+ }
1141
+ function transformVisualizationFilters(metadataObject, overTimeComparisonType, additionalData) {
1142
+ const visualizationFilters = metadataObject.filters || [];
1143
+ const dateDatasets = additionalData?.dateDatasets || undefined;
1144
+ // First pass: identify the legacy empty date values attribute filters
1145
+ const { emptyDateValuesFilters, emptyDateValuesFilterIndices } = collectLegacyEmptyDateValuesFilters(visualizationFilters, dateDatasets);
1095
1146
  // Second pass: transform filters, setting emptyDateValuesFilter on date filters
1096
1147
  let firstDateFilterTransformed = false;
1097
1148
  const result = [];
@@ -5,23 +5,23 @@ export declare const deleteReportDialogSelector: ((state: import("../store/types
5
5
  deleteReportDialog: import("../store/dialogs/dialogs_state.js").IDeleteReportConfirmationState;
6
6
  projectId: string | undefined;
7
7
  isEmbedded: boolean | undefined;
8
- analyticalDashboardUriFactory: (dashboardId: string) => string;
8
+ analyticalDashboardUriFactory: import("./uri_selector.js").AnalyticalDashboardUriFactory;
9
9
  }) & {
10
10
  clearCache: () => void;
11
11
  resultsCount: () => number;
12
12
  resetResultsCount: () => void;
13
13
  } & {
14
- resultFunc: (resultFuncArgs_0: import("../store/dialogs/dialogs_state.js").IDeleteReportConfirmationState, resultFuncArgs_1: string | undefined, resultFuncArgs_2: boolean | undefined, resultFuncArgs_3: (dashboardId: string) => string) => {
14
+ resultFunc: (resultFuncArgs_0: import("../store/dialogs/dialogs_state.js").IDeleteReportConfirmationState, resultFuncArgs_1: string | undefined, resultFuncArgs_2: boolean | undefined, resultFuncArgs_3: import("./uri_selector.js").AnalyticalDashboardUriFactory) => {
15
15
  deleteReportDialog: import("../store/dialogs/dialogs_state.js").IDeleteReportConfirmationState;
16
16
  projectId: string | undefined;
17
17
  isEmbedded: boolean | undefined;
18
- analyticalDashboardUriFactory: (dashboardId: string) => string;
18
+ analyticalDashboardUriFactory: import("./uri_selector.js").AnalyticalDashboardUriFactory;
19
19
  };
20
- memoizedResultFunc: ((resultFuncArgs_0: import("../store/dialogs/dialogs_state.js").IDeleteReportConfirmationState, resultFuncArgs_1: string | undefined, resultFuncArgs_2: boolean | undefined, resultFuncArgs_3: (dashboardId: string) => string) => {
20
+ memoizedResultFunc: ((resultFuncArgs_0: import("../store/dialogs/dialogs_state.js").IDeleteReportConfirmationState, resultFuncArgs_1: string | undefined, resultFuncArgs_2: boolean | undefined, resultFuncArgs_3: import("./uri_selector.js").AnalyticalDashboardUriFactory) => {
21
21
  deleteReportDialog: import("../store/dialogs/dialogs_state.js").IDeleteReportConfirmationState;
22
22
  projectId: string | undefined;
23
23
  isEmbedded: boolean | undefined;
24
- analyticalDashboardUriFactory: (dashboardId: string) => string;
24
+ analyticalDashboardUriFactory: import("./uri_selector.js").AnalyticalDashboardUriFactory;
25
25
  }) & {
26
26
  clearCache: () => void;
27
27
  resultsCount: () => number;
@@ -31,7 +31,7 @@ export declare const deleteReportDialogSelector: ((state: import("../store/types
31
31
  deleteReportDialog: import("../store/dialogs/dialogs_state.js").IDeleteReportConfirmationState;
32
32
  projectId: string | undefined;
33
33
  isEmbedded: boolean | undefined;
34
- analyticalDashboardUriFactory: (dashboardId: string) => string;
34
+ analyticalDashboardUriFactory: import("./uri_selector.js").AnalyticalDashboardUriFactory;
35
35
  };
36
36
  dependencies: [((state: import("../store/types.js").IAppState) => import("../store/dialogs/dialogs_state.js").IDeleteReportConfirmationState) & {
37
37
  clearCache: () => void;
@@ -53,19 +53,19 @@ export declare const deleteReportDialogSelector: ((state: import("../store/types
53
53
  } & {
54
54
  memoize: typeof import("reselect").weakMapMemoize;
55
55
  argsMemoize: typeof import("reselect").weakMapMemoize;
56
- }, typeof getProjectId, typeof getIsEmbedded, ((state: import("../store/types.js").IAppState) => (dashboardId: string) => string) & {
56
+ }, typeof getProjectId, typeof getIsEmbedded, ((state: import("../store/types.js").IAppState) => import("./uri_selector.js").AnalyticalDashboardUriFactory) & {
57
57
  clearCache: () => void;
58
58
  resultsCount: () => number;
59
59
  resetResultsCount: () => void;
60
60
  } & {
61
- resultFunc: (resultFuncArgs_0: string | undefined, resultFuncArgs_1: import("@gooddata/sdk-model").IUserWorkspaceSettings) => (dashboardId: string) => string;
62
- memoizedResultFunc: ((resultFuncArgs_0: string | undefined, resultFuncArgs_1: import("@gooddata/sdk-model").IUserWorkspaceSettings) => (dashboardId: string) => string) & {
61
+ resultFunc: (resultFuncArgs_0: string | undefined) => import("./uri_selector.js").AnalyticalDashboardUriFactory;
62
+ memoizedResultFunc: ((resultFuncArgs_0: string | undefined) => import("./uri_selector.js").AnalyticalDashboardUriFactory) & {
63
63
  clearCache: () => void;
64
64
  resultsCount: () => number;
65
65
  resetResultsCount: () => void;
66
66
  };
67
- lastResult: () => (dashboardId: string) => string;
68
- dependencies: [typeof getProjectId, typeof import("./feature_flag_selector.js").getFeatureFlags];
67
+ lastResult: () => import("./uri_selector.js").AnalyticalDashboardUriFactory;
68
+ dependencies: [typeof getProjectId];
69
69
  recomputations: () => number;
70
70
  resetRecomputations: () => void;
71
71
  dependencyRecomputations: () => number;
@@ -1393,7 +1393,6 @@ export declare const reportVisualizationSelector: ((state: import("../store/type
1393
1393
  enableMeasureValueFilterKD?: boolean;
1394
1394
  enableVisualizationFilteringByTags?: boolean;
1395
1395
  enableShellApplication?: boolean;
1396
- enableShellApplication_dashboards?: boolean;
1397
1396
  enableLogicalModelExtensionsFromParentsCall?: boolean;
1398
1397
  enableDashboardDensitySetting?: boolean;
1399
1398
  enableDashboardsSearch?: boolean;
@@ -1430,6 +1429,7 @@ export declare const reportVisualizationSelector: ((state: import("../store/type
1430
1429
  enableLocalizationOverview?: boolean;
1431
1430
  enableAiAssistantChartsV2?: boolean;
1432
1431
  enableUserLanguageChange?: boolean;
1432
+ enableLocalizationValidations?: boolean;
1433
1433
  registeredPluggableApplications?: import("@gooddata/sdk-model").RemotePluggableApplicationsRegistry;
1434
1434
  userId: string;
1435
1435
  locale: string;
@@ -2076,7 +2076,6 @@ export declare const reportVisualizationSelector: ((state: import("../store/type
2076
2076
  enableMeasureValueFilterKD?: boolean;
2077
2077
  enableVisualizationFilteringByTags?: boolean;
2078
2078
  enableShellApplication?: boolean;
2079
- enableShellApplication_dashboards?: boolean;
2080
2079
  enableLogicalModelExtensionsFromParentsCall?: boolean;
2081
2080
  enableDashboardDensitySetting?: boolean;
2082
2081
  enableDashboardsSearch?: boolean;
@@ -2113,6 +2112,7 @@ export declare const reportVisualizationSelector: ((state: import("../store/type
2113
2112
  enableLocalizationOverview?: boolean;
2114
2113
  enableAiAssistantChartsV2?: boolean;
2115
2114
  enableUserLanguageChange?: boolean;
2115
+ enableLocalizationValidations?: boolean;
2116
2116
  registeredPluggableApplications?: import("@gooddata/sdk-model").RemotePluggableApplicationsRegistry;
2117
2117
  userId: string;
2118
2118
  locale: string;
@@ -2755,7 +2755,6 @@ export declare const reportVisualizationSelector: ((state: import("../store/type
2755
2755
  enableMeasureValueFilterKD?: boolean;
2756
2756
  enableVisualizationFilteringByTags?: boolean;
2757
2757
  enableShellApplication?: boolean;
2758
- enableShellApplication_dashboards?: boolean;
2759
2758
  enableLogicalModelExtensionsFromParentsCall?: boolean;
2760
2759
  enableDashboardDensitySetting?: boolean;
2761
2760
  enableDashboardsSearch?: boolean;
@@ -2792,6 +2791,7 @@ export declare const reportVisualizationSelector: ((state: import("../store/type
2792
2791
  enableLocalizationOverview?: boolean;
2793
2792
  enableAiAssistantChartsV2?: boolean;
2794
2793
  enableUserLanguageChange?: boolean;
2794
+ enableLocalizationValidations?: boolean;
2795
2795
  registeredPluggableApplications?: import("@gooddata/sdk-model").RemotePluggableApplicationsRegistry;
2796
2796
  userId: string;
2797
2797
  locale: string;
@@ -3198,7 +3198,6 @@ export declare const reportVisualizationSelector: ((state: import("../store/type
3198
3198
  enableMeasureValueFilterKD?: boolean;
3199
3199
  enableVisualizationFilteringByTags?: boolean;
3200
3200
  enableShellApplication?: boolean;
3201
- enableShellApplication_dashboards?: boolean;
3202
3201
  enableLogicalModelExtensionsFromParentsCall?: boolean;
3203
3202
  enableDashboardDensitySetting?: boolean;
3204
3203
  enableDashboardsSearch?: boolean;
@@ -3235,6 +3234,7 @@ export declare const reportVisualizationSelector: ((state: import("../store/type
3235
3234
  enableLocalizationOverview?: boolean;
3236
3235
  enableAiAssistantChartsV2?: boolean;
3237
3236
  enableUserLanguageChange?: boolean;
3237
+ enableLocalizationValidations?: boolean;
3238
3238
  registeredPluggableApplications?: import("@gooddata/sdk-model").RemotePluggableApplicationsRegistry;
3239
3239
  userId: string;
3240
3240
  locale: string;
@@ -6,21 +6,21 @@ declare const getEditingReportTitle: (state: IAppState) => string | undefined;
6
6
  export declare const dashboardItemSelector: ((state: IAppState) => {
7
7
  sourceDashboardId: string;
8
8
  isAllowLinkToDashboard: boolean;
9
- analyticalDashboardUriFactory: (dashboardId: string) => string;
9
+ analyticalDashboardUriFactory: import("./uri_selector.js").AnalyticalDashboardUriFactory;
10
10
  }) & {
11
11
  clearCache: () => void;
12
12
  resultsCount: () => number;
13
13
  resetResultsCount: () => void;
14
14
  } & {
15
- resultFunc: (resultFuncArgs_0: string, resultFuncArgs_1: boolean, resultFuncArgs_2: (dashboardId: string) => string) => {
15
+ resultFunc: (resultFuncArgs_0: string, resultFuncArgs_1: boolean, resultFuncArgs_2: import("./uri_selector.js").AnalyticalDashboardUriFactory) => {
16
16
  sourceDashboardId: string;
17
17
  isAllowLinkToDashboard: boolean;
18
- analyticalDashboardUriFactory: (dashboardId: string) => string;
18
+ analyticalDashboardUriFactory: import("./uri_selector.js").AnalyticalDashboardUriFactory;
19
19
  };
20
- memoizedResultFunc: ((resultFuncArgs_0: string, resultFuncArgs_1: boolean, resultFuncArgs_2: (dashboardId: string) => string) => {
20
+ memoizedResultFunc: ((resultFuncArgs_0: string, resultFuncArgs_1: boolean, resultFuncArgs_2: import("./uri_selector.js").AnalyticalDashboardUriFactory) => {
21
21
  sourceDashboardId: string;
22
22
  isAllowLinkToDashboard: boolean;
23
- analyticalDashboardUriFactory: (dashboardId: string) => string;
23
+ analyticalDashboardUriFactory: import("./uri_selector.js").AnalyticalDashboardUriFactory;
24
24
  }) & {
25
25
  clearCache: () => void;
26
26
  resultsCount: () => number;
@@ -29,21 +29,21 @@ export declare const dashboardItemSelector: ((state: IAppState) => {
29
29
  lastResult: () => {
30
30
  sourceDashboardId: string;
31
31
  isAllowLinkToDashboard: boolean;
32
- analyticalDashboardUriFactory: (dashboardId: string) => string;
32
+ analyticalDashboardUriFactory: import("./uri_selector.js").AnalyticalDashboardUriFactory;
33
33
  };
34
- dependencies: [typeof getSourceDashboardId, typeof isAllowedDashboardLinks, ((state: IAppState) => (dashboardId: string) => string) & {
34
+ dependencies: [typeof getSourceDashboardId, typeof isAllowedDashboardLinks, ((state: IAppState) => import("./uri_selector.js").AnalyticalDashboardUriFactory) & {
35
35
  clearCache: () => void;
36
36
  resultsCount: () => number;
37
37
  resetResultsCount: () => void;
38
38
  } & {
39
- resultFunc: (resultFuncArgs_0: string | undefined, resultFuncArgs_1: import("@gooddata/sdk-model").IUserWorkspaceSettings) => (dashboardId: string) => string;
40
- memoizedResultFunc: ((resultFuncArgs_0: string | undefined, resultFuncArgs_1: import("@gooddata/sdk-model").IUserWorkspaceSettings) => (dashboardId: string) => string) & {
39
+ resultFunc: (resultFuncArgs_0: string | undefined) => import("./uri_selector.js").AnalyticalDashboardUriFactory;
40
+ memoizedResultFunc: ((resultFuncArgs_0: string | undefined) => import("./uri_selector.js").AnalyticalDashboardUriFactory) & {
41
41
  clearCache: () => void;
42
42
  resultsCount: () => number;
43
43
  resetResultsCount: () => void;
44
44
  };
45
- lastResult: () => (dashboardId: string) => string;
46
- dependencies: [typeof import("./bootstrap_selector.js").getProjectId, typeof import("./feature_flag_selector.js").getFeatureFlags];
45
+ lastResult: () => import("./uri_selector.js").AnalyticalDashboardUriFactory;
46
+ dependencies: [typeof import("./bootstrap_selector.js").getProjectId];
47
47
  recomputations: () => number;
48
48
  resetRecomputations: () => void;
49
49
  dependencyRecomputations: () => number;
@@ -1,11 +1,14 @@
1
1
  import { type IInsightDefinition } from "@gooddata/sdk-model";
2
2
  import { type IAppState } from "../store/types.js";
3
+ import { type IDateDatasets } from "../typings/datasets.js";
3
4
  import { type IReportContent } from "../typings/report.js";
4
5
  import { getSourceDashboardId } from "./route_selector.js";
5
6
  declare const isSavingSelector: (state: IAppState) => boolean;
6
7
  export declare const isSavingAsNewSelector: (state: IAppState) => boolean;
7
8
  type PrepareForComparisonOptions = {
8
9
  ignoreGeoTooltipText?: boolean;
10
+ /** needed to recognize the legacy empty date values attribute filter */
11
+ dateDatasets?: IDateDatasets;
9
12
  };
10
13
  export declare function prepareForComparison(reportContent: IReportContent | null | undefined, options?: PrepareForComparisonOptions): IInsightDefinition | null;
11
14
  export declare function isReportInvalidSelector(state: IAppState): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"save_report_selector.d.ts","sourceRoot":"","sources":["../../src/selectors/save_report_selector.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,kBAAkB,EAAgC,MAAM,qBAAqB,CAAC;AAS5F,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAQnD,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAkB3D,OAAO,EAAyB,oBAAoB,EAAgB,MAAM,qBAAqB,CAAC;AAEhG,QAAA,MAAM,gBAAgB,UAAW,SAAS,KAAG,OAAgC,CAAC;AAC9E,eAAO,MAAM,qBAAqB,UAAW,SAAS,KAAG,OAAqC,CAAC;AAwH/F,KAAK,2BAA2B,GAAG;IAC/B,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAClC,CAAC;AAcF,wBAAgB,oBAAoB,CAChC,aAAa,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS,EAChD,OAAO,GAAE,2BAAgC,GAC1C,kBAAkB,GAAG,IAAI,CAsD3B;AAMD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CASjE;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAUpE;AAED,eAAO,MAAM,eAAe,UAAW,SAAS,KAAG,OACsC,CAAC;AAE1F,eAAO,MAAM,qBAAqB,UAAW,SAAS,KAAG,OACoC,CAAC;AAwB9F,eAAO,MAAM,sBAAsB,UAAW,SAAS,KAAG,OAKxB,CAAC;AAEnC,eAAO,MAAM,6BAA6B,UAAW,SAAS,KAAG,OAAyC,CAAC;AAE3G,eAAO,MAAM,2BAA2B,UAAW,SAAS,KAAG,OACA,CAAC;AAEhE,eAAO,MAAM,gCAAgC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAM5C,CAAC;AAEF,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAY9B,CAAC;AAEF,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAQnC,CAAC"}
1
+ {"version":3,"file":"save_report_selector.d.ts","sourceRoot":"","sources":["../../src/selectors/save_report_selector.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,kBAAkB,EAAgC,MAAM,qBAAqB,CAAC;AAW5F,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAQnD,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAkB3D,OAAO,EAAyB,oBAAoB,EAAgB,MAAM,qBAAqB,CAAC;AAEhG,QAAA,MAAM,gBAAgB,UAAW,SAAS,KAAG,OAAgC,CAAC;AAC9E,eAAO,MAAM,qBAAqB,UAAW,SAAS,KAAG,OAAqC,CAAC;AAuI/F,KAAK,2BAA2B,GAAG;IAC/B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,wEAAwE;IACxE,YAAY,CAAC,EAAE,aAAa,CAAC;CAChC,CAAC;AAcF,wBAAgB,oBAAoB,CAChC,aAAa,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS,EAChD,OAAO,GAAE,2BAAgC,GAC1C,kBAAkB,GAAG,IAAI,CAuD3B;AAMD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CASjE;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAapE;AAED,eAAO,MAAM,eAAe,UAAW,SAAS,KAAG,OACsC,CAAC;AAE1F,eAAO,MAAM,qBAAqB,UAAW,SAAS,KAAG,OACoC,CAAC;AAwB9F,eAAO,MAAM,sBAAsB,UAAW,SAAS,KAAG,OAKxB,CAAC;AAEnC,eAAO,MAAM,6BAA6B,UAAW,SAAS,KAAG,OAAyC,CAAC;AAE3G,eAAO,MAAM,2BAA2B,UAAW,SAAS,KAAG,OACA,CAAC;AAEhE,eAAO,MAAM,gCAAgC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAM5C,CAAC;AAEF,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAY9B,CAAC;AAEF,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAQnC,CAAC"}
@@ -3,6 +3,8 @@ import { has, isEqual, omit, sortBy } from "lodash-es";
3
3
  import { createSelector } from "reselect";
4
4
  import { CHOROPLETH, LOCAL_CHOROPLETH, LOCAL_PUSHPIN, PUSHPIN } from "../constants/visualization_types.js";
5
5
  import { BackendToBearConvertors } from "../convertors/index.js";
6
+ import { normalizeEmptyDateValuesFilters } from "../models/metadata.js";
7
+ import { DateDatasetsService } from "../services/date_datasets_service.js";
6
8
  import { getVisualizationObjectForSave } from "../services/report_service.js";
7
9
  import { getVisualizationClassTypeFromState } from "../services/visualization_class_service.js";
8
10
  import { getInsightSummary, getInsightTitle } from "../store/insight/insight_selectors.js";
@@ -92,6 +94,16 @@ function stripLocalIdsInFilters(reportContent) {
92
94
  : filter),
93
95
  };
94
96
  }
97
+ // the empty date values mode has several stored shapes (legacy "" attribute filter, flag on/off writer)
98
+ function normalizeEmptyDateValues(reportContent, dateDatasets) {
99
+ if (!has(reportContent, "filters")) {
100
+ return reportContent;
101
+ }
102
+ return {
103
+ ...reportContent,
104
+ filters: normalizeEmptyDateValuesFilters(reportContent.filters ?? [], dateDatasets),
105
+ };
106
+ }
95
107
  function shouldIgnoreGeoTooltipTextInSaveComparison(state) {
96
108
  return enableNewGeoPushpin(state) || enableGeoArea(state);
97
109
  }
@@ -128,6 +140,7 @@ export function prepareForComparison(reportContent, options = {}) {
128
140
  updatedReportContent = reorderBuckets(updatedReportContent);
129
141
  updatedReportContent = sanitizeMeasureValueFilters(updatedReportContent);
130
142
  updatedReportContent = stripLocalIdsInFilters(updatedReportContent);
143
+ updatedReportContent = normalizeEmptyDateValues(updatedReportContent, options.dateDatasets);
131
144
  updatedReportContent = {
132
145
  ...updatedReportContent,
133
146
  buckets: (updatedReportContent.buckets ?? [])
@@ -160,8 +173,11 @@ export function isReportInvalidSelector(state) {
160
173
  export function isSavedReportCurrentReport(state) {
161
174
  const savedReportContent = getLastSavedObject(state).visualizationObject?.content;
162
175
  const currentReportContent = getVisualizationObjectForSaveContent(state);
163
- const ignoreGeoTooltipText = shouldIgnoreGeoTooltipTextInSaveComparison(state);
164
- return isEqual(prepareForComparison(savedReportContent, { ignoreGeoTooltipText }), prepareForComparison(currentReportContent, { ignoreGeoTooltipText }));
176
+ const options = {
177
+ ignoreGeoTooltipText: shouldIgnoreGeoTooltipTextInSaveComparison(state),
178
+ dateDatasets: DateDatasetsService.getPlainDateDatasets(state),
179
+ };
180
+ return isEqual(prepareForComparison(savedReportContent, options), prepareForComparison(currentReportContent, options));
165
181
  }
166
182
  export const hasTitleChanged = (state) => getLastSavedObject(state).visualizationObject?.meta?.title !== getInsightTitle(state);
167
183
  export const hasDescriptionChanged = (state) => getLastSavedObject(state).visualizationObject?.meta?.summary !== getInsightSummary(state);
@@ -1,19 +1,18 @@
1
1
  import { getProjectId } from "./bootstrap_selector.js";
2
- import { getFeatureFlags } from "./feature_flag_selector.js";
3
2
  export type AnalyticalDashboardUriFactory = (dashboardId: string) => string;
4
- export declare const analyticalDashboardUriFactorySelector: ((state: import("../store/types.js").IAppState) => (dashboardId: string) => string) & {
3
+ export declare const analyticalDashboardUriFactorySelector: ((state: import("../store/types.js").IAppState) => AnalyticalDashboardUriFactory) & {
5
4
  clearCache: () => void;
6
5
  resultsCount: () => number;
7
6
  resetResultsCount: () => void;
8
7
  } & {
9
- resultFunc: (resultFuncArgs_0: string | undefined, resultFuncArgs_1: import("@gooddata/sdk-model").IUserWorkspaceSettings) => (dashboardId: string) => string;
10
- memoizedResultFunc: ((resultFuncArgs_0: string | undefined, resultFuncArgs_1: import("@gooddata/sdk-model").IUserWorkspaceSettings) => (dashboardId: string) => string) & {
8
+ resultFunc: (resultFuncArgs_0: string | undefined) => AnalyticalDashboardUriFactory;
9
+ memoizedResultFunc: ((resultFuncArgs_0: string | undefined) => AnalyticalDashboardUriFactory) & {
11
10
  clearCache: () => void;
12
11
  resultsCount: () => number;
13
12
  resetResultsCount: () => void;
14
13
  };
15
- lastResult: () => (dashboardId: string) => string;
16
- dependencies: [typeof getProjectId, typeof getFeatureFlags];
14
+ lastResult: () => AnalyticalDashboardUriFactory;
15
+ dependencies: [typeof getProjectId];
17
16
  recomputations: () => number;
18
17
  resetRecomputations: () => void;
19
18
  dependencyRecomputations: () => number;
@@ -1 +1 @@
1
- {"version":3,"file":"uri_selector.d.ts","sourceRoot":"","sources":["../../src/selectors/uri_selector.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,MAAM,MAAM,6BAA6B,GAAG,CAAC,WAAW,EAAE,MAAM,KAAK,MAAM,CAAC;AAE5E,eAAO,MAAM,qCAAqC,mEAQrB,MAAM;;;;;gJAAN,MAAM;;;;;;oCAAN,MAAM;;;;;;;;;CAKlC,CAAC"}
1
+ {"version":3,"file":"uri_selector.d.ts","sourceRoot":"","sources":["../../src/selectors/uri_selector.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,MAAM,MAAM,6BAA6B,GAAG,CAAC,WAAW,EAAE,MAAM,KAAK,MAAM,CAAC;AAE5E,eAAO,MAAM,qCAAqC;;;;;;;;;;;;;;;;;;;;CAKjD,CAAC"}
@@ -1,13 +1,4 @@
1
1
  // (C) 2021-2026 GoodData Corporation
2
2
  import { createSelector } from "reselect";
3
3
  import { getProjectId } from "./bootstrap_selector.js";
4
- import { getFeatureFlags } from "./feature_flag_selector.js";
5
- export const analyticalDashboardUriFactorySelector = createSelector(getProjectId, getFeatureFlags, (projectId, featureFlags) => {
6
- // With the dashboards shell application enabled the host owns the
7
- // /workspace/{id}/dashboards/ pathname; otherwise the standalone app carries the
8
- // workspace inside the hash.
9
- const useHostRoute = Boolean(featureFlags.enableShellApplication_dashboards);
10
- return (dashboardId) => useHostRoute
11
- ? `/workspace/${projectId}/dashboards/#/dashboard/${dashboardId}`
12
- : `/dashboards/#/workspace/${projectId}/dashboard/${dashboardId}`;
13
- });
4
+ export const analyticalDashboardUriFactorySelector = createSelector(getProjectId, (projectId) => (dashboardId) => `/workspace/${projectId}/dashboards/#/dashboard/${dashboardId}`);
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap_error_service.d.ts","sourceRoot":"","sources":["../../src/services/bootstrap_error_service.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,KAAK,kBAAkB,EAA4C,MAAM,sBAAsB,CAAC;AAGzG,wBAAgB,iBAAiB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,QAAQ,CAAA;CAAE,UAErE;AAsGD,wBAAgB,eAAe,CAC3B,KAAK,EAAE,SAAS,EAChB,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE;QAAE,KAAK,EAAE;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAA;CAAE,EACrD,cAAc,EAAE,OAAO,YA5EC,kBAAkB,KAAK,IAAI,CA2FtD"}
1
+ {"version":3,"file":"bootstrap_error_service.d.ts","sourceRoot":"","sources":["../../src/services/bootstrap_error_service.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,KAAK,kBAAkB,EAA4C,MAAM,sBAAsB,CAAC;AAGzG,wBAAgB,iBAAiB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,QAAQ,CAAA;CAAE,UAErE;AAwFD,wBAAgB,eAAe,CAC3B,KAAK,EAAE,SAAS,EAChB,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE;QAAE,KAAK,EAAE;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAA;CAAE,EACrD,cAAc,EAAE,OAAO,YAxEC,kBAAkB,KAAK,IAAI,CA+EtD"}
@@ -1,7 +1,7 @@
1
1
  // (C) 2007-2026 GoodData Corporation
2
2
  import { partial } from "lodash-es";
3
3
  import { ACCESS_DESIGNER_DENIED_ERROR, ACCESS_WORKBENCH_DENIED_ERROR, CREATE_REPORT_DENIED_ERROR, NOT_AUTHENTICATED_ERROR, NOT_AUTHORIZED_ERROR, } from "../constants/errors.js";
4
- import { getFeatureFlags, isFreemiumEdition } from "../selectors/feature_flag_selector.js";
4
+ import { isFreemiumEdition } from "../selectors/feature_flag_selector.js";
5
5
  import { getIsEmbedded } from "../selectors/meta_selector.js";
6
6
  import { getInfoUri, redirectTo } from "../utils/location.js";
7
7
  import { getWorkspaceRef } from "../utils/uri.js";
@@ -18,15 +18,7 @@ const getDashboardUri = ({ projectId, isRenamingProjectToWorkspace }) => {
18
18
  const workspaceSuf = getWorkspaceRef(isRenamingProjectToWorkspace, false);
19
19
  return `/#s=/gdc/${workspaceRef}/${projectId}|${workspaceSuf}DashboardPage`;
20
20
  };
21
- // When the dashboards shell-application FF is on, the host shell route (/workspace/{id}/dashboards)
22
- // is the canonical KD home; otherwise fall back to the legacy standalone /dashboards/# app.
23
- const makeGetTigerDashboardUri = (useHostRoute) => ({ projectId, isRenamingProjectToWorkspace }) => {
24
- if (useHostRoute) {
25
- return `/workspace/${projectId}/dashboards`;
26
- }
27
- const workspaceRef = getWorkspaceRef(isRenamingProjectToWorkspace, false);
28
- return `/dashboards/#/${workspaceRef}/${projectId}`;
29
- };
21
+ const getTigerDashboardUri = ({ projectId }) => `/workspace/${projectId}/dashboards`;
30
22
  const getUnauthorizedUri = partial(getInfoUri, "ssoUnauthorized");
31
23
  /*
32
24
  * Note how the authentication error handlers are (() => {}) for Tiger. This is because for Tiger, the app makes
@@ -38,14 +30,14 @@ const getUnauthorizedUri = partial(getInfoUri, "ssoUnauthorized");
38
30
  * which point it flies - as opposed to this logic which will only fire if NotAuthenticated happens during
39
31
  * bootstrap.
40
32
  */
41
- function buildErrorHandler(adType, loginType, type, workspacesRef, isFreeGrowthUser, useHostDashboardsRoute) {
33
+ function buildErrorHandler(adType, loginType, type, workspacesRef, isFreeGrowthUser) {
42
34
  const errorHandlers = {
43
35
  main: {
44
36
  normal: {
45
37
  [NOT_AUTHENTICATED_ERROR]: () => { },
46
38
  [NOT_AUTHORIZED_ERROR]: partial(redirectTo, partial(getProjectPageUri, isFreeGrowthUser, "notAuthorized", workspacesRef)),
47
39
  [ACCESS_WORKBENCH_DENIED_ERROR]: partial(redirectTo, partial(getProjectPageUri, isFreeGrowthUser, "cannotAccessWorkbench", workspacesRef)),
48
- [ACCESS_DESIGNER_DENIED_ERROR]: partial(redirectTo, makeGetTigerDashboardUri(useHostDashboardsRoute)),
40
+ [ACCESS_DESIGNER_DENIED_ERROR]: partial(redirectTo, getTigerDashboardUri),
49
41
  [CREATE_REPORT_DENIED_ERROR]: () => { },
50
42
  },
51
43
  sso: {
@@ -75,6 +67,5 @@ export function getErrorHandler(state, { payload }, loggedInViaSso) {
75
67
  const loginType = loggedInViaSso ? "sso" : "normal";
76
68
  const { type } = payload.error;
77
69
  const isFreeGrowthUser = isFreemiumEdition(state);
78
- const useHostDashboardsRoute = Boolean(getFeatureFlags(state).enableShellApplication_dashboards);
79
- return buildErrorHandler(adType, loginType, type, getWorkspaceRef(true), isFreeGrowthUser, useHostDashboardsRoute);
70
+ return buildErrorHandler(adType, loginType, type, getWorkspaceRef(true), isFreeGrowthUser);
80
71
  }
@@ -521,8 +521,6 @@
521
521
  "shortcut.computing_recommendation": "<strong>Berechnet</strong> Empfehlung…",
522
522
  "shortcut.measure_cant_be_trended": "Diese Metrik kann nicht als Trend dargestellt werden.",
523
523
  "shortcut.single_metric": "Siehe „{decoratedTitle}“{br} als <strong>Säulendiagramm</strong>",
524
- "gs.header.analyze": "Analysieren",
525
- "gs.header.logout": "Abmelden",
526
524
  "gs.header.helpMenu.firstSteps": "Erste Schritte im Analytical Designer",
527
525
  "gs.header.helpMenu.visualizing": "Daten visualisieren",
528
526
  "gs.header.helpMenu.sorting": "Ergebnisse sortieren und filtern",
@@ -638,14 +636,6 @@
638
636
  "adAlertDialog.unsaved.changes.leave.anyway": "Trotzdem verlassen",
639
637
  "adAlertDialog.unsaved.changes.headline": "Ihre Änderungen wurden noch nicht gespeichert",
640
638
  "adAlertDialog.unsaved.changes.message": "Wenn Sie jetzt schließen, gehen alle Änderungen verloren.",
641
- "communityEdition.badge.text": "Community Edition",
642
- "communityEdition.dialog.header": "Infos zur GoodData.CN Community Edition",
643
- "communityEdition.dialog.info": "Die Community Edition dient nur zu Bewertungszwecken.",
644
- "communityEdition.dialog.copyright": "Copyright (c) {year} GoodData Corporation.",
645
- "communityEdition.dialog.link.license": "Lizenz",
646
- "communityEdition.dialog.link.attribution": "OSS Attribution file",
647
- "communityEdition.dialog.link.privacy": "Datenschutzrichtlinien",
648
- "communityEdition.dialog.button.close": "Schließen",
649
639
  "dataSampler.checkbox.label": "Datenstichprobe",
650
640
  "dataSampler.tooltip": "Verwenden Sie eine zufällige Stichprobe von Zeilen, um die Rechengeschwindigkeit zu erhöhen. <b>Diese Einstellung wird nur für die aktuelle Analyse vorübergehend aktiviert.</b>",
651
641
  "dataSampler.dropdown.button.label": "festgelegt auf",
@@ -662,11 +652,6 @@
662
652
  "embedInsightDialog.embed.menu.title": "Visualisierung einbetten",
663
653
  "embedInsightDialog.embed.analytical.designer.menu.title": "Anleitung: Anwendung einbetten",
664
654
  "embedInsightDialog.embed.disable.message.empty.report": "Leere Visualisierung kann nicht eingebettet werden.",
665
- "contractExpiredDialog.buttonTitle": "Kontakt",
666
- "contractExpiredDialog.trial.title": "Ihre Testversion ist abgelaufen!",
667
- "contractExpiredDialog.trial.description": "Wenn Sie GoodData Cloud weiterhin nutzen möchten, kontaktieren Sie uns bitte.",
668
- "contractExpiredDialog.nonTrial.title": "Ihr Zugriff ist gesperrt!",
669
- "contractExpiredDialog.nonTrial.description": "Wenden Sie sich an den Kontoadministrator, um wieder Zugriff zu erhalten.",
670
655
  "catalog.clipboard.copy.id": "ID",
671
656
  "catalog.clipboard.copy.id.tooltip": "In Zwischenablage kopieren",
672
657
  "catalog.clipboard.copy.id.message": "Die ID wurde in Ihre Zwischenablage kopiert.",
@@ -674,15 +659,8 @@
674
659
  "error_raw_data_area.header": "Rohfehlerantwort",
675
660
  "error_raw_data_area.header.tooltip": "Die Rohfehlerantwort zeigt Back-End-Informationen über den aufgetretenen Fehler an. Sie ist nur für Administratoren sichtbar.",
676
661
  "drillDown.item.in": "am",
677
- "messages.genAi.visualisation.saved.success": "Großartig! Wir haben Ihre Visualisierung gespeichert.",
678
- "messages.genAi.visualisation.saved.error": "Hoppla, beim Speichern Ihrer Visualisierung ist ein Problem aufgetreten.",
679
- "messages.genAi.visualisation.saved.error.detail": "{errorType}: {errorMessage}",
680
- "messages.genAi.visualisation.link.copied": "Der Visualisierungslink wurde in Ihre Zwischenablage kopiert.",
681
662
  "messages.showMore": "Mehr anzeigen",
682
663
  "messages.showLess": "Weniger anzeigen",
683
- "gen-ai.ask-assistant.search": "Erstellen Sie eine neue Visualisierung basierend auf: {question}",
684
- "gd.gen-ai.feedback.success": "<b>Erfolg.</b> Wir haben Ihr Feedback erhalten und werden es nutzen, um die Erfahrung zu verbessern.",
685
- "gd.gen-ai.feedback.error": "<b>Fehler.</b> Wir konnten Ihr Feedback nicht senden – versuchen Sie es später erneut.",
686
664
  "apply": "Anwenden",
687
665
  "cancel": "Abbrechen",
688
666
  "dialogs.export.submit": "Exportieren",
@@ -521,8 +521,6 @@
521
521
  "shortcut.computing_recommendation": "<strong>Computing</strong> recommendation…",
522
522
  "shortcut.measure_cant_be_trended": "This metric cannot be trended.",
523
523
  "shortcut.single_metric": "View \"{decoratedTitle}\"{br} as a <strong>column chart</strong>",
524
- "gs.header.analyze": "Analyse",
525
- "gs.header.logout": "Log out",
526
524
  "gs.header.helpMenu.firstSteps": "First steps in Analytical Designer",
527
525
  "gs.header.helpMenu.visualizing": "Visualising your data",
528
526
  "gs.header.helpMenu.sorting": "Sorting and filtering your results",
@@ -638,14 +636,6 @@
638
636
  "adAlertDialog.unsaved.changes.leave.anyway": "Leave anyway",
639
637
  "adAlertDialog.unsaved.changes.headline": "Your changes are not saved",
640
638
  "adAlertDialog.unsaved.changes.message": "If you leave now, all changes will be lost.",
641
- "communityEdition.badge.text": "Community Edition",
642
- "communityEdition.dialog.header": "About GoodData.CN Community Edition",
643
- "communityEdition.dialog.info": "The Community Edition is meant for evaluation purposes only.",
644
- "communityEdition.dialog.copyright": "Copyright (c) {year} GoodData Corporation.",
645
- "communityEdition.dialog.link.license": "License",
646
- "communityEdition.dialog.link.attribution": "OSS Attribution file",
647
- "communityEdition.dialog.link.privacy": "Privacy policy",
648
- "communityEdition.dialog.button.close": "Close",
649
639
  "dataSampler.checkbox.label": "Data sampling",
650
640
  "dataSampler.tooltip": "Use a random sample of rows to increase the computation speed. <b>This setting will be temporarily enabled only for the current analysis.</b>",
651
641
  "dataSampler.dropdown.button.label": "set to",
@@ -662,11 +652,6 @@
662
652
  "embedInsightDialog.embed.menu.title": "Embed visualisation",
663
653
  "embedInsightDialog.embed.analytical.designer.menu.title": "How to embed this application",
664
654
  "embedInsightDialog.embed.disable.message.empty.report": "Empty visualisation cannot be embedded.",
665
- "contractExpiredDialog.buttonTitle": "Contact us",
666
- "contractExpiredDialog.trial.title": "Your trial period has expired",
667
- "contractExpiredDialog.trial.description": "Contact us if you would like to continue using GoodData Cloud.",
668
- "contractExpiredDialog.nonTrial.title": "Your access is restricted",
669
- "contractExpiredDialog.nonTrial.description": "Contact the account administrator to regain access.",
670
655
  "catalog.clipboard.copy.id": "ID",
671
656
  "catalog.clipboard.copy.id.tooltip": "Copy to clipboard",
672
657
  "catalog.clipboard.copy.id.message": "The ID was copied to your clipboard.",
@@ -674,15 +659,8 @@
674
659
  "error_raw_data_area.header": "Raw error response",
675
660
  "error_raw_data_area.header.tooltip": "The raw error response shows back-end information about the error that has occurred. It is only visible to the administrators.",
676
661
  "drillDown.item.in": "in",
677
- "messages.genAi.visualisation.saved.success": "Great! We've saved your visualisation.",
678
- "messages.genAi.visualisation.saved.error": "Unfortunately, there was an issue when saving your visualisation.",
679
- "messages.genAi.visualisation.saved.error.detail": "{errorType}: {errorMessage}",
680
- "messages.genAi.visualisation.link.copied": "The visualisation link has been copied to your clipboard.",
681
662
  "messages.showMore": "Show more",
682
663
  "messages.showLess": "Show less",
683
- "gen-ai.ask-assistant.search": "Create new visualisation based on: {question}",
684
- "gd.gen-ai.feedback.success": "<b>Success</b> We’ve received your feedback and will use it to enhance the experience",
685
- "gd.gen-ai.feedback.error": "<b>Error</b> We couldn’t send your feedback — please try again later",
686
664
  "apply": "Apply",
687
665
  "cancel": "Cancel",
688
666
  "dialogs.export.submit": "Export",