@gooddata/sdk-ui-dashboard 11.53.0-alpha.0 → 11.53.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/NOTICE +59 -9
  2. package/esm/__version.d.ts +1 -1
  3. package/esm/__version.js +1 -1
  4. package/esm/index.d.ts +6 -6
  5. package/esm/index.d.ts.map +1 -1
  6. package/esm/index.js +3 -4
  7. package/esm/internal.d.ts +1 -1
  8. package/esm/internal.d.ts.map +1 -1
  9. package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/resolveDashboardConfig.d.ts.map +1 -1
  10. package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/resolveDashboardConfig.js +2 -0
  11. package/esm/model/commandHandlers/dashboard/saveDashboardHandler.d.ts.map +1 -1
  12. package/esm/model/commandHandlers/dashboard/saveDashboardHandler.js +43 -8
  13. package/esm/model/react/useInitializeDashboardStore.d.ts.map +1 -1
  14. package/esm/model/react/useInitializeDashboardStore.js +11 -0
  15. package/esm/model/store/config/configReducers.d.ts +8 -0
  16. package/esm/model/store/config/configReducers.d.ts.map +1 -1
  17. package/esm/model/store/config/configReducers.js +12 -0
  18. package/esm/model/store/config/configSelectors.d.ts +12 -0
  19. package/esm/model/store/config/configSelectors.d.ts.map +1 -1
  20. package/esm/model/store/config/configSelectors.js +16 -0
  21. package/esm/model/store/config/index.d.ts +2 -0
  22. package/esm/model/store/config/index.d.ts.map +1 -1
  23. package/esm/model/store/dashboardStore.d.ts.map +1 -1
  24. package/esm/model/store/dashboardStore.js +1 -0
  25. package/esm/model/store/drill/drillReducers.d.ts.map +1 -1
  26. package/esm/model/store/drill/drillReducers.js +2 -1
  27. package/esm/model/types/commonTypes.d.ts +21 -0
  28. package/esm/model/types/commonTypes.d.ts.map +1 -1
  29. package/esm/presentation/automations/alerting/DefaultAlertingDialog/AlertingDialogHeader.d.ts +1 -11
  30. package/esm/presentation/automations/alerting/DefaultAlertingDialog/AlertingDialogHeader.d.ts.map +1 -1
  31. package/esm/presentation/automations/alerting/DefaultAlertingDialog/AlertingDialogHeader.js +7 -11
  32. package/esm/presentation/automations/alerting/DefaultAlertingDialog/DefaultAlertingDialog.d.ts +6 -3
  33. package/esm/presentation/automations/alerting/DefaultAlertingDialog/DefaultAlertingDialog.d.ts.map +1 -1
  34. package/esm/presentation/automations/alerting/DefaultAlertingDialog/DefaultAlertingDialog.js +25 -6
  35. package/esm/presentation/automations/alerting/state/AlertingDialogStateProvider.d.ts +1 -5
  36. package/esm/presentation/automations/alerting/state/AlertingDialogStateProvider.d.ts.map +1 -1
  37. package/esm/presentation/automations/alerting/state/AlertingDialogStateProvider.js +1 -5
  38. package/esm/presentation/automations/alerting/state/useAlertFormState.d.ts +1 -1
  39. package/esm/presentation/automations/alerting/state/useAlertFormState.d.ts.map +1 -1
  40. package/esm/presentation/automations/alerting/state/useAlertFormState.js +5 -4
  41. package/esm/presentation/automations/alerting/types.d.ts +51 -15
  42. package/esm/presentation/automations/alerting/types.d.ts.map +1 -1
  43. package/esm/presentation/automations/contexts/AlertingDialogContext.d.ts +0 -26
  44. package/esm/presentation/automations/contexts/AlertingDialogContext.d.ts.map +1 -1
  45. package/esm/presentation/automations/contexts/AlertingDialogContext.js +0 -26
  46. package/esm/presentation/automations/contexts/ScheduledEmailDialogContext.d.ts +0 -9
  47. package/esm/presentation/automations/contexts/ScheduledEmailDialogContext.d.ts.map +1 -1
  48. package/esm/presentation/automations/contexts/ScheduledEmailDialogContext.js +0 -9
  49. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/DefaultScheduledEmailDialog.d.ts +23 -3
  50. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/DefaultScheduledEmailDialog.d.ts.map +1 -1
  51. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/DefaultScheduledEmailDialog.js +43 -6
  52. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/Header/ScheduleEmailDialogHeader.d.ts +1 -12
  53. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/Header/ScheduleEmailDialogHeader.d.ts.map +1 -1
  54. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/Header/ScheduleEmailDialogHeader.js +10 -14
  55. package/esm/presentation/automations/scheduledEmail/state/useScheduledEmailFormState.d.ts +1 -1
  56. package/esm/presentation/automations/scheduledEmail/state/useScheduledEmailFormState.d.ts.map +1 -1
  57. package/esm/presentation/automations/scheduledEmail/state/useScheduledEmailFormState.js +3 -2
  58. package/esm/presentation/automations/scheduledEmail/types.d.ts +55 -15
  59. package/esm/presentation/automations/scheduledEmail/types.d.ts.map +1 -1
  60. package/esm/presentation/automations/shared/automationFilters/components/AutomationParameter.d.ts.map +1 -1
  61. package/esm/presentation/automations/shared/automationFilters/components/AutomationParameter.js +2 -2
  62. package/esm/presentation/automations/shared/filters/conversions.d.ts +6 -6
  63. package/esm/presentation/automations/shared/filters/conversions.d.ts.map +1 -1
  64. package/esm/presentation/automations/shared/filters/conversions.js +48 -30
  65. package/esm/presentation/automations/shared/filters/index.d.ts +1 -1
  66. package/esm/presentation/automations/shared/filters/index.d.ts.map +1 -1
  67. package/esm/presentation/automations/shared/filters/index.js +1 -1
  68. package/esm/presentation/automations/shared/slots/types.d.ts +58 -0
  69. package/esm/presentation/automations/shared/slots/types.d.ts.map +1 -0
  70. package/esm/presentation/automations/shared/slots/types.js +2 -0
  71. package/esm/presentation/automations/shared/utils/automationTitle.d.ts +5 -0
  72. package/esm/presentation/automations/shared/utils/automationTitle.d.ts.map +1 -0
  73. package/esm/presentation/automations/shared/utils/automationTitle.js +7 -0
  74. package/esm/presentation/dashboard/DashboardHeader/DashboardHeader.d.ts +1 -1
  75. package/esm/presentation/dashboard/DashboardHeader/DashboardHeader.d.ts.map +1 -1
  76. package/esm/presentation/dashboard/DashboardHeader/DashboardHeader.js +10 -0
  77. package/esm/presentation/dashboard/DashboardSidebar/CreationPanel.d.ts.map +1 -1
  78. package/esm/presentation/dashboard/DashboardSidebar/CreationPanel.js +5 -2
  79. package/esm/presentation/dashboard/DashboardSidebar/DraggableInsightList/DraggableInsightList.d.ts +2 -1
  80. package/esm/presentation/dashboard/DashboardSidebar/DraggableInsightList/DraggableInsightList.d.ts.map +1 -1
  81. package/esm/presentation/dashboard/DashboardSidebar/DraggableInsightList/DraggableInsightList.js +2 -2
  82. package/esm/presentation/dashboard/DashboardSidebar/DraggableInsightList/DraggableInsightListCore.d.ts +1 -1
  83. package/esm/presentation/dashboard/DashboardSidebar/DraggableInsightList/DraggableInsightListCore.d.ts.map +1 -1
  84. package/esm/presentation/dashboard/DashboardSidebar/DraggableInsightList/DraggableInsightListCore.js +3 -3
  85. package/esm/presentation/dashboard/DashboardSidebar/DraggableInsightList/DraggableInsightListItemWrapper.d.ts +2 -1
  86. package/esm/presentation/dashboard/DashboardSidebar/DraggableInsightList/DraggableInsightListItemWrapper.d.ts.map +1 -1
  87. package/esm/presentation/dashboard/DashboardSidebar/DraggableInsightList/DraggableInsightListItemWrapper.js +3 -2
  88. package/esm/presentation/dashboard/components/DashboardInner.d.ts.map +1 -1
  89. package/esm/presentation/dashboard/components/DashboardInner.js +9 -5
  90. package/esm/presentation/dashboard/components/DashboardSkeleton.d.ts +5 -0
  91. package/esm/presentation/dashboard/components/DashboardSkeleton.d.ts.map +1 -0
  92. package/esm/presentation/dashboard/components/DashboardSkeleton.js +30 -0
  93. package/esm/presentation/dragAndDrop/WrapInsightListItemWithDrag.d.ts +1 -1
  94. package/esm/presentation/dragAndDrop/WrapInsightListItemWithDrag.d.ts.map +1 -1
  95. package/esm/presentation/dragAndDrop/WrapInsightListItemWithDrag.js +3 -3
  96. package/esm/presentation/dragAndDrop/draggableParameterFilter/DefaultParameterDraggingComponent.d.ts.map +1 -1
  97. package/esm/presentation/dragAndDrop/draggableParameterFilter/DefaultParameterDraggingComponent.js +9 -2
  98. package/esm/presentation/dragAndDrop/draggableWidget/DraggableInsightListItem.d.ts +1 -0
  99. package/esm/presentation/dragAndDrop/draggableWidget/DraggableInsightListItem.d.ts.map +1 -1
  100. package/esm/presentation/dragAndDrop/draggableWidget/DraggableInsightListItem.js +2 -2
  101. package/esm/presentation/dragAndDrop/types.d.ts +2 -0
  102. package/esm/presentation/dragAndDrop/types.d.ts.map +1 -1
  103. package/esm/presentation/filterBar/filterBar/DefaultFilterBarContainer.d.ts.map +1 -1
  104. package/esm/presentation/filterBar/filterBar/DefaultFilterBarContainer.js +15 -3
  105. package/esm/presentation/filterBar/parameterFilter/DashboardParameterFilter.d.ts.map +1 -1
  106. package/esm/presentation/filterBar/parameterFilter/DashboardParameterFilter.js +4 -3
  107. package/esm/presentation/insightList/types.d.ts +1 -0
  108. package/esm/presentation/insightList/types.d.ts.map +1 -1
  109. package/esm/presentation/topBar/buttonBar/button/cancelButton/DefaultCancelButton.d.ts +1 -1
  110. package/esm/presentation/topBar/buttonBar/button/cancelButton/DefaultCancelButton.d.ts.map +1 -1
  111. package/esm/presentation/topBar/buttonBar/button/cancelButton/DefaultCancelButton.js +3 -2
  112. package/esm/presentation/topBar/buttonBar/button/cancelButton/types.d.ts +1 -0
  113. package/esm/presentation/topBar/buttonBar/button/cancelButton/types.d.ts.map +1 -1
  114. package/esm/presentation/topBar/buttonBar/button/cancelButton/types.js +1 -1
  115. package/esm/presentation/topBar/buttonBar/button/editButton/DefaultEditButton.d.ts.map +1 -1
  116. package/esm/presentation/topBar/buttonBar/button/editButton/DefaultEditButton.js +3 -2
  117. package/esm/presentation/topBar/buttonBar/button/saveAsButton/DefaultSaveAsNewButton.d.ts +1 -1
  118. package/esm/presentation/topBar/buttonBar/button/saveAsButton/DefaultSaveAsNewButton.d.ts.map +1 -1
  119. package/esm/presentation/topBar/buttonBar/button/saveAsButton/DefaultSaveAsNewButton.js +5 -2
  120. package/esm/presentation/topBar/buttonBar/button/saveAsButton/types.d.ts +1 -0
  121. package/esm/presentation/topBar/buttonBar/button/saveAsButton/types.d.ts.map +1 -1
  122. package/esm/presentation/topBar/buttonBar/button/saveAsButton/types.js +1 -1
  123. package/esm/presentation/topBar/buttonBar/button/saveButton/DefaultSaveButton.d.ts.map +1 -1
  124. package/esm/presentation/topBar/buttonBar/button/saveButton/DefaultSaveButton.js +3 -1
  125. package/esm/presentation/topBar/buttonBar/button/settingButton/DefaultSettingButton.d.ts.map +1 -1
  126. package/esm/presentation/topBar/buttonBar/button/settingButton/DefaultSettingButton.js +3 -1
  127. package/esm/presentation/topBar/buttonBar/button/shareButton/DefaultShareButton.d.ts +1 -1
  128. package/esm/presentation/topBar/buttonBar/button/shareButton/DefaultShareButton.d.ts.map +1 -1
  129. package/esm/presentation/topBar/buttonBar/button/shareButton/DefaultShareButton.js +5 -2
  130. package/esm/presentation/topBar/buttonBar/button/shareButton/types.d.ts +1 -0
  131. package/esm/presentation/topBar/buttonBar/button/shareButton/types.d.ts.map +1 -1
  132. package/esm/presentation/topBar/buttonBar/button/shareButton/types.js +1 -0
  133. package/esm/presentation/topBar/menuButton/DefaultMenuButton.d.ts +1 -1
  134. package/esm/presentation/topBar/menuButton/DefaultMenuButton.d.ts.map +1 -1
  135. package/esm/presentation/topBar/menuButton/DefaultMenuButton.js +7 -2
  136. package/esm/presentation/topBar/menuButton/types.d.ts +4 -0
  137. package/esm/presentation/topBar/menuButton/types.d.ts.map +1 -1
  138. package/esm/presentation/widget/common/configuration/DateDatasetDropdown.d.ts.map +1 -1
  139. package/esm/presentation/widget/common/configuration/DateDatasetDropdown.js +93 -27
  140. package/esm/presentation/widget/common/configuration/utils.d.ts +3 -0
  141. package/esm/presentation/widget/common/configuration/utils.d.ts.map +1 -1
  142. package/esm/presentation/widget/common/configuration/utils.js +14 -2
  143. package/esm/sdk-ui-dashboard.d.ts +234 -88
  144. package/package.json +21 -21
  145. package/styles/css/dashboard.css +118 -0
  146. package/styles/css/dashboard.css.map +1 -1
  147. package/styles/css/main.css +180 -44
  148. package/styles/css/main.css.map +1 -1
  149. package/styles/scss/dashboard.scss +96 -0
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { useIntl } from "react-intl";
3
- import { DashboardParameterModeValues } from "@gooddata/sdk-model";
3
+ import { DashboardParameterModeValues, getParameterValueTitle, } from "@gooddata/sdk-model";
4
4
  import { Dropdown, ParameterControl, UiChip, UiTooltip, isActionKey, useIdPrefixed, } from "@gooddata/sdk-ui-kit";
5
5
  /**
6
6
  * Workspace parameter as an editable chip in automation dialogs.
@@ -11,7 +11,7 @@ export function AutomationParameter({ parameter, onChange, onDelete, overlayPosi
11
11
  const intl = useIntl();
12
12
  const { ref, title, value, mode, definition } = parameter;
13
13
  const testId = `automation-parameter-${ref.identifier}`;
14
- const label = intl.formatMessage({ id: "dialogs.automation.parameters.chip" }, { title, value });
14
+ const label = intl.formatMessage({ id: "dialogs.automation.parameters.chip" }, { title, value: getParameterValueTitle(definition, value) });
15
15
  const lockedTooltip = intl.formatMessage({ id: "dialogs.automation.filters.lockedTooltip" });
16
16
  const deleteAriaLabel = intl.formatMessage({ id: "dialogs.automation.filters.deleteAriaLabel" });
17
17
  const tooltipId = useIdPrefixed("automation-parameter-tooltip");
@@ -17,14 +17,14 @@ export declare const getAppliedWidgetFilters: (selectedAutomationFilters: Filter
17
17
  export declare const getAppliedDashboardFilters: (selectedAutomationFilters: FilterContextItem[], dashboardHiddenFilters: FilterContextItem[], storeFilters?: boolean | undefined) => FilterContextItem[] | undefined;
18
18
  export declare function dashboardFilterToFilterContextItem(filter: IDashboardFilter, keepDatasets: boolean): FilterContextItem | undefined;
19
19
  /**
20
- * Resolve MVF dimensionality localIdRefs to stable identifierRefs using the insight's attributes.
20
+ * Resolve filter dimensionality localIdRefs to stable identifierRefs using the insight's attributes.
21
21
  *
22
- * Measure value filters may reference attributes in their dimensionality via localIdRef,
23
- * which is only meaningful within the insight's own execution context. When these filters
24
- * are used in an alert execution (which may not include the original attributes), the
25
- * localIdRefs become dangling. This function resolves them to display form identifierRefs.
22
+ * Measure value filters (in `dimensionality`) and ranking filters (in `attributes`) may reference
23
+ * attributes via localIdRef, which is only meaningful within the insight's own execution context.
24
+ * When these filters are used in an alert execution (which may not include the original attributes),
25
+ * the localIdRefs become dangling. This function resolves them to display form identifierRefs.
26
26
  */
27
- export declare function resolveMvfDimensionalityLocalRefs(filters: IFilter[], insight: IInsight | undefined): IFilter[];
27
+ export declare function resolveFilterDimensionalityLocalRefs(filters: IFilter[], insight: IInsight | undefined): IFilter[];
28
28
  /**
29
29
  * Matches all-time date filters that are *noop*, i.e. that have no effect on execution.
30
30
  *
@@ -1 +1 @@
1
- {"version":3,"file":"conversions.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/automations/shared/filters/conversions.ts"],"names":[],"mappings":"AAKA,OAAO,EAEH,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC7B,KAAK,OAAO,EACZ,KAAK,QAAQ,EAkChB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AAEtF,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,eAAO,MAAM,0BAA0B,kMAmCtC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,+BAA+B,+OAuB3C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,uBAAuB,wRA+CnC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,0BAA0B,sKAyBtC,CAAC;AAEF,wBAAgB,kCAAkC,CAC9C,MAAM,EAAE,gBAAgB,EACxB,YAAY,EAAE,OAAO,GACtB,iBAAiB,GAAG,SAAS,CA8E/B;AAED;;;;;;;GAOG;AACH,wBAAgB,iCAAiC,CAC7C,OAAO,EAAE,OAAO,EAAE,EAClB,OAAO,EAAE,QAAQ,GAAG,SAAS,GAC9B,OAAO,EAAE,CA4CX;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CA0BhE"}
1
+ {"version":3,"file":"conversions.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/automations/shared/filters/conversions.ts"],"names":[],"mappings":"AAKA,OAAO,EAEH,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC7B,KAAK,OAAO,EACZ,KAAK,QAAQ,EAmChB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AAEtF,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,eAAO,MAAM,0BAA0B,kMAmCtC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,+BAA+B,+OAuB3C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,uBAAuB,wRA+CnC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,0BAA0B,sKAyBtC,CAAC;AAEF,wBAAgB,kCAAkC,CAC9C,MAAM,EAAE,gBAAgB,EACxB,YAAY,EAAE,OAAO,GACtB,iBAAiB,GAAG,SAAS,CA8E/B;AAED;;;;;;;GAOG;AACH,wBAAgB,oCAAoC,CAChD,OAAO,EAAE,OAAO,EAAE,EAClB,OAAO,EAAE,QAAQ,GAAG,SAAS,GAC9B,OAAO,EAAE,CAiDX;AAyBD;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CA0BhE"}
@@ -1,7 +1,7 @@
1
1
  // (C) 2025-2026 GoodData Corporation
2
2
  import { compact } from "lodash-es";
3
3
  import { NotSupported } from "@gooddata/sdk-backend-spi";
4
- import { attributeLocalId, dashboardFilterLocalIdentifier, filterAttributeElements, filterLocalIdentifier, filterObjRef, hasMeasureValueFilterConditions, insightAttributes, isAbsoluteDateFilter, isAllDashboardMeasureValueFilter, isAllTimeDateFilter, isAllValuesAttributeFilter, isAllValuesDashboardAttributeFilter, isArbitraryAttributeFilter, isAttributeFilterWithSelection, isDashboardDateFilter, isDashboardMeasureValueFilter, isDateFilter, isInsightWidget, isLocalIdRef, isMatchAttributeFilter, isMeasureValueFilter, isNegativeAttributeFilter, isNoopAllTimeDashboardDateFilter, isObjRef, isRelativeBoundedDateFilter, isRelativeDateFilter, measureValueFilterConditions, measureValueFilterMeasure, mergeFilters, newAbsoluteDashboardDateFilter, newAllTimeDashboardDateFilter, newRelativeDashboardDateFilter, } from "@gooddata/sdk-model";
4
+ import { attributeLocalId, dashboardFilterLocalIdentifier, filterAttributeElements, filterLocalIdentifier, filterObjRef, hasMeasureValueFilterConditions, insightAttributes, isAbsoluteDateFilter, isAllDashboardMeasureValueFilter, isAllTimeDateFilter, isAllValuesAttributeFilter, isAllValuesDashboardAttributeFilter, isArbitraryAttributeFilter, isAttributeFilterWithSelection, isDashboardDateFilter, isDashboardMeasureValueFilter, isDateFilter, isInsightWidget, isLocalIdRef, isMatchAttributeFilter, isMeasureValueFilter, isNegativeAttributeFilter, isNoopAllTimeDashboardDateFilter, isObjRef, isRankingFilter, isRelativeBoundedDateFilter, isRelativeDateFilter, measureValueFilterConditions, measureValueFilterMeasure, mergeFilters, newAbsoluteDashboardDateFilter, newAllTimeDashboardDateFilter, newRelativeDashboardDateFilter, } from "@gooddata/sdk-model";
5
5
  import { filterContextItemsToDashboardFiltersByWidget } from "../../../../converters/filterConverters.js";
6
6
  import { removeIgnoredWidgetFilters } from "../../../../model/utils/widgetFilters.js";
7
7
  export const getVisibleFiltersByFilters = (selectedFilters, visibleFiltersMetadata, storeFilters) => {
@@ -63,9 +63,9 @@ export const getAppliedWidgetFilters = (selectedAutomationFilters, dashboardHidd
63
63
  const filtersToUse = mergeInsightFilters
64
64
  ? mergeFilters(insight?.insight?.filters ?? [], selectedExecutionFilters, commonDateFilterId)
65
65
  : selectedExecutionFilters;
66
- // Resolve MVF dimensionality localIdRefs to stable identifierRefs so that
66
+ // Resolve MVF / ranking filter dimensionality localIdRefs to stable identifierRefs so that
67
67
  // alert executions (which have empty attributes) don't contain dangling refs.
68
- const resolvedFilters = resolveMvfDimensionalityLocalRefs(filtersToUse, insight);
68
+ const resolvedFilters = resolveFilterDimensionalityLocalRefs(filtersToUse, insight);
69
69
  // Strip noop filters - they have no effect on execution.
70
70
  return resolvedFilters.filter((filter) => {
71
71
  // Strip noop "All time" date filters (implicit default with no extra configuration).
@@ -168,14 +168,14 @@ export function dashboardFilterToFilterContextItem(filter, keepDatasets) {
168
168
  throw new NotSupported(`Unsupported filter type! Please provide valid dashboard filter. Filter: ${JSON.stringify(filter)}`);
169
169
  }
170
170
  /**
171
- * Resolve MVF dimensionality localIdRefs to stable identifierRefs using the insight's attributes.
171
+ * Resolve filter dimensionality localIdRefs to stable identifierRefs using the insight's attributes.
172
172
  *
173
- * Measure value filters may reference attributes in their dimensionality via localIdRef,
174
- * which is only meaningful within the insight's own execution context. When these filters
175
- * are used in an alert execution (which may not include the original attributes), the
176
- * localIdRefs become dangling. This function resolves them to display form identifierRefs.
173
+ * Measure value filters (in `dimensionality`) and ranking filters (in `attributes`) may reference
174
+ * attributes via localIdRef, which is only meaningful within the insight's own execution context.
175
+ * When these filters are used in an alert execution (which may not include the original attributes),
176
+ * the localIdRefs become dangling. This function resolves them to display form identifierRefs.
177
177
  */
178
- export function resolveMvfDimensionalityLocalRefs(filters, insight) {
178
+ export function resolveFilterDimensionalityLocalRefs(filters, insight) {
179
179
  if (!insight) {
180
180
  return filters;
181
181
  }
@@ -187,31 +187,49 @@ export function resolveMvfDimensionalityLocalRefs(filters, insight) {
187
187
  return filters;
188
188
  }
189
189
  return filters.map((filter) => {
190
- if (!isMeasureValueFilter(filter)) {
191
- return filter;
190
+ if (isMeasureValueFilter(filter)) {
191
+ const resolvedDimensionality = resolveDimensionalityItems(filter.measureValueFilter.dimensionality, attributeLocalIdToDisplayForm);
192
+ return resolvedDimensionality
193
+ ? {
194
+ ...filter,
195
+ measureValueFilter: {
196
+ ...filter.measureValueFilter,
197
+ dimensionality: resolvedDimensionality,
198
+ },
199
+ }
200
+ : filter;
192
201
  }
193
- const dimensionality = filter.measureValueFilter.dimensionality;
194
- if (!dimensionality?.length) {
195
- return filter;
202
+ if (isRankingFilter(filter)) {
203
+ const resolvedAttributes = resolveDimensionalityItems(filter.rankingFilter.attributes, attributeLocalIdToDisplayForm);
204
+ return resolvedAttributes
205
+ ? {
206
+ ...filter,
207
+ rankingFilter: {
208
+ ...filter.rankingFilter,
209
+ attributes: resolvedAttributes,
210
+ },
211
+ }
212
+ : filter;
196
213
  }
197
- const resolvedDimensionality = dimensionality.map((item) => {
198
- if (!isLocalIdRef(item)) {
199
- return item;
200
- }
201
- return attributeLocalIdToDisplayForm.get(item.localIdentifier) ?? item;
202
- });
203
- const changed = dimensionality.some((item, i) => item !== resolvedDimensionality[i]);
204
- if (!changed) {
205
- return filter;
214
+ return filter;
215
+ });
216
+ }
217
+ /**
218
+ * Resolve localIdRef dimensionality items to display form refs; returns undefined when there is
219
+ * nothing to resolve (empty dimensionality or no item changed), so callers can keep the original filter.
220
+ */
221
+ function resolveDimensionalityItems(dimensionality, attributeLocalIdToDisplayForm) {
222
+ if (!dimensionality?.length) {
223
+ return undefined;
224
+ }
225
+ const resolved = dimensionality.map((item) => {
226
+ if (!isLocalIdRef(item)) {
227
+ return item;
206
228
  }
207
- return {
208
- ...filter,
209
- measureValueFilter: {
210
- ...filter.measureValueFilter,
211
- dimensionality: resolvedDimensionality,
212
- },
213
- };
229
+ return attributeLocalIdToDisplayForm.get(item.localIdentifier) ?? item;
214
230
  });
231
+ const changed = dimensionality.some((item, i) => item !== resolved[i]);
232
+ return changed ? resolved : undefined;
215
233
  }
216
234
  /**
217
235
  * Matches all-time date filters that are *noop*, i.e. that have no effect on execution.
@@ -1,2 +1,2 @@
1
- export { getVisibleFiltersByFilters, getVisibleFiltersByFiltersByTab, getAppliedWidgetFilters, getAppliedDashboardFilters, dashboardFilterToFilterContextItem, resolveMvfDimensionalityLocalRefs, isNoopAllTimeDateFilterFixed, } from "./conversions.js";
1
+ export { getVisibleFiltersByFilters, getVisibleFiltersByFiltersByTab, getAppliedWidgetFilters, getAppliedDashboardFilters, dashboardFilterToFilterContextItem, resolveFilterDimensionalityLocalRefs, isNoopAllTimeDateFilterFixed, } from "./conversions.js";
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/automations/shared/filters/index.ts"],"names":[],"mappings":"AAIA,OAAO,EACH,0BAA0B,EAC1B,+BAA+B,EAC/B,uBAAuB,EACvB,0BAA0B,EAC1B,kCAAkC,EAClC,iCAAiC,EACjC,4BAA4B,GAC/B,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/automations/shared/filters/index.ts"],"names":[],"mappings":"AAIA,OAAO,EACH,0BAA0B,EAC1B,+BAA+B,EAC/B,uBAAuB,EACvB,0BAA0B,EAC1B,kCAAkC,EAClC,oCAAoC,EACpC,4BAA4B,GAC/B,MAAM,kBAAkB,CAAC"}
@@ -1,3 +1,3 @@
1
1
  // (C) 2026 GoodData Corporation
2
2
  /* oxlint-disable no-barrel-files/no-barrel-files */
3
- export { getVisibleFiltersByFilters, getVisibleFiltersByFiltersByTab, getAppliedWidgetFilters, getAppliedDashboardFilters, dashboardFilterToFilterContextItem, resolveMvfDimensionalityLocalRefs, isNoopAllTimeDateFilterFixed, } from "./conversions.js";
3
+ export { getVisibleFiltersByFilters, getVisibleFiltersByFiltersByTab, getAppliedWidgetFilters, getAppliedDashboardFilters, dashboardFilterToFilterContextItem, resolveFilterDimensionalityLocalRefs, isNoopAllTimeDateFilterFixed, } from "./conversions.js";
@@ -0,0 +1,58 @@
1
+ import { type ComponentType, type ReactNode } from "react";
2
+ /**
3
+ * Contract of a section-level slot: the default implementation and the exact props the default
4
+ * dialog would render it with.
5
+ *
6
+ * The component a customer assigns to a slot is rendered as an element type, so its reference
7
+ * identity is load-bearing: define it at module scope (or memoize it), never inline in a render
8
+ * function — an inline definition gets a fresh identity on every render of the declaring
9
+ * component, which unmounts and remounts the region, losing focus and transient DOM state.
10
+ *
11
+ * Render `<Default {...defaultProps} />` inside your own markup to wrap the region rather than
12
+ * replace it; a slot that does not spread `defaultProps` onto `Default` loses the default
13
+ * behavior wired through them (including the dialog's initial-focus ref).
14
+ *
15
+ * @alpha
16
+ */
17
+ export interface ISlotProps<TProps> {
18
+ /**
19
+ * The default implementation of the region.
20
+ */
21
+ Default: ComponentType<TProps>;
22
+ /**
23
+ * The exact props the default dialog would render {@link ISlotProps.Default} with.
24
+ */
25
+ defaultProps: TProps;
26
+ }
27
+ /**
28
+ * Members shared by both automation dialogs' header regions.
29
+ *
30
+ * @alpha
31
+ */
32
+ export interface IAutomationDialogHeaderProps {
33
+ /**
34
+ * Current automation title.
35
+ */
36
+ title: string;
37
+ /**
38
+ * Placeholder shown while the title is empty.
39
+ */
40
+ placeholder: string;
41
+ /**
42
+ * Whether the secondary title row is shown.
43
+ */
44
+ isSecondaryTitleVisible?: boolean;
45
+ /**
46
+ * Secondary title text (e.g. the widget name).
47
+ */
48
+ secondaryTitle?: string;
49
+ /**
50
+ * Icon rendered before the secondary title.
51
+ */
52
+ secondaryTitleIcon: ReactNode;
53
+ /**
54
+ * Called on every title change with the new value. The dialog validates the title itself.
55
+ */
56
+ onChange: (value: string) => void;
57
+ }
58
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/automations/shared/slots/types.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAE3D;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,UAAU,CAAC,MAAM;IAC9B;;OAEG;IACH,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAE/B;;OAEG;IACH,YAAY,EAAE,MAAM,CAAC;CACxB;AAED;;;;GAIG;AACH,MAAM,WAAW,4BAA4B;IACzC;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAElC;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,kBAAkB,EAAE,SAAS,CAAC;IAE9B;;OAEG;IACH,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC"}
@@ -0,0 +1,2 @@
1
+ // (C) 2026 GoodData Corporation
2
+ export {};
@@ -0,0 +1,5 @@
1
+ /** Maximum permitted length for an automation title, inclusive. */
2
+ export declare const MAX_AUTOMATION_TITLE_LENGTH = 255;
3
+ /** Returns whether an automation title is within the permitted length. */
4
+ export declare function isAutomationTitleValid(value: string): boolean;
5
+ //# sourceMappingURL=automationTitle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"automationTitle.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/automations/shared/utils/automationTitle.ts"],"names":[],"mappings":"AAEA,mEAAmE;AACnE,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAE/C,0EAA0E;AAC1E,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE7D"}
@@ -0,0 +1,7 @@
1
+ // (C) 2026 GoodData Corporation
2
+ /** Maximum permitted length for an automation title, inclusive. */
3
+ export const MAX_AUTOMATION_TITLE_LENGTH = 255;
4
+ /** Returns whether an automation title is within the permitted length. */
5
+ export function isAutomationTitleValid(value) {
6
+ return value.length <= MAX_AUTOMATION_TITLE_LENGTH;
7
+ }
@@ -1,4 +1,4 @@
1
1
  import { type ReactElement } from "react";
2
- export declare function DashboardTabsWrapper(): import("react/jsx-runtime").JSX.Element;
2
+ export declare function DashboardTabsWrapper(): import("react/jsx-runtime").JSX.Element | null;
3
3
  export declare function DashboardHeader(): ReactElement;
4
4
  //# sourceMappingURL=DashboardHeader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DashboardHeader.d.ts","sourceRoot":"","sources":["../../../../src/presentation/dashboard/DashboardHeader/DashboardHeader.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,OAAO,CAAC;AAsE1C,wBAAgB,oBAAoB,4CAGnC;AAID,wBAAgB,eAAe,IAAI,YAAY,CA0B9C"}
1
+ {"version":3,"file":"DashboardHeader.d.ts","sourceRoot":"","sources":["../../../../src/presentation/dashboard/DashboardHeader/DashboardHeader.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,OAAO,CAAC;AA4E1C,wBAAgB,oBAAoB,mDAOnC;AAID,wBAAgB,eAAe,IAAI,YAAY,CA0B9C"}
@@ -1,4 +1,6 @@
1
1
  import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useDashboardSelector } from "../../../model/react/DashboardStoreProvider.js";
3
+ import { selectIsAiGenerating } from "../../../model/store/config/configSelectors.js";
2
4
  import { ScheduledEmailAutomationsProvider, ScheduledEmailConnector, } from "../../automations/connectors/ScheduledEmailConnector.js";
3
5
  import { CancelEditDialog } from "../../cancelEditDialog/CancelEditDialog.js";
4
6
  import { useCancelEditDialog } from "../../cancelEditDialog/DefaultCancelEditDialog.js";
@@ -49,6 +51,10 @@ function TopBarWrapper() {
49
51
  }
50
52
  function FilterBarWrapper() {
51
53
  const filterBarProps = useFilterBarProps();
54
+ const isAiGenerating = useDashboardSelector(selectIsAiGenerating);
55
+ if (isAiGenerating) {
56
+ return null;
57
+ }
52
58
  return _jsx(FilterBar, { ...filterBarProps });
53
59
  }
54
60
  function CancelEditDialogWrapper() {
@@ -57,6 +63,10 @@ function CancelEditDialogWrapper() {
57
63
  }
58
64
  export function DashboardTabsWrapper() {
59
65
  const dashboardTabsProps = useDashboardTabsProps();
66
+ const isAiGenerating = useDashboardSelector(selectIsAiGenerating);
67
+ if (isAiGenerating) {
68
+ return null;
69
+ }
60
70
  return _jsx(DashboardTabs, { ...dashboardTabsProps });
61
71
  }
62
72
  // split the header parts of the dashboard so that changes to their state
@@ -1 +1 @@
1
- {"version":3,"file":"CreationPanel.d.ts","sourceRoot":"","sources":["../../../../src/presentation/dashboard/DashboardSidebar/CreationPanel.tsx"],"names":[],"mappings":"AAaA,OAAO,EACH,KAAK,2BAA2B,EAChC,KAAK,iCAAiC,EACtC,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,uCAAuC,EAC/C,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACH,KAAK,qCAAqC,EAC1C,KAAK,qCAAqC,EAC7C,MAAM,4BAA4B,CAAC;AAIpC,UAAU,mBAAmB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oCAAoC,CAAC,EAAE,qCAAqC,CAAC;IAC7E,oCAAoC,CAAC,EAAE,qCAAqC,CAAC;IAC7E,2BAA2B,CAAC,EAAE,2BAA2B,CAAC;IAC1D,yBAAyB,CAAC,EAAE,yBAAyB,CAAC;IACtD,0BAA0B,CAAC,EAAE,0BAA0B,CAAC;IACxD,uCAAuC,CAAC,EAAE,uCAAuC,CAAC;IAClF,iCAAiC,CAAC,EAAE,iCAAiC,CAAC;CACzE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,mBAAmB,2CA8DvD"}
1
+ {"version":3,"file":"CreationPanel.d.ts","sourceRoot":"","sources":["../../../../src/presentation/dashboard/DashboardSidebar/CreationPanel.tsx"],"names":[],"mappings":"AAcA,OAAO,EACH,KAAK,2BAA2B,EAChC,KAAK,iCAAiC,EACtC,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,uCAAuC,EAC/C,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACH,KAAK,qCAAqC,EAC1C,KAAK,qCAAqC,EAC7C,MAAM,4BAA4B,CAAC;AAIpC,UAAU,mBAAmB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oCAAoC,CAAC,EAAE,qCAAqC,CAAC;IAC7E,oCAAoC,CAAC,EAAE,qCAAqC,CAAC;IAC7E,2BAA2B,CAAC,EAAE,2BAA2B,CAAC;IAC1D,yBAAyB,CAAC,EAAE,yBAAyB,CAAC;IACtD,0BAA0B,CAAC,EAAE,0BAA0B,CAAC;IACxD,uCAAuC,CAAC,EAAE,uCAAuC,CAAC;IAClF,iCAAiC,CAAC,EAAE,iCAAiC,CAAC;CACzE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,mBAAmB,2CAkEvD"}
@@ -7,12 +7,14 @@ import { FormattedMessage } from "react-intl";
7
7
  import { Typography } from "@gooddata/sdk-ui-kit";
8
8
  import { useDashboardSelector } from "../../../model/react/DashboardStoreProvider.js";
9
9
  import { selectSupportsRichTextWidgets } from "../../../model/store/backendCapabilities/backendCapabilitiesSelectors.js";
10
+ import { selectIsAiGenerating } from "../../../model/store/config/configSelectors.js";
10
11
  import { selectIsNewDashboard } from "../../../model/store/meta/metaSelectors.js";
11
12
  import { DraggableInsightList } from "./DraggableInsightList/DraggableInsightList.js";
12
13
  export function CreationPanel(props) {
13
14
  const { className, WrapCreatePanelItemWithDragComponent, WrapInsightListItemWithDragComponent } = props;
14
15
  const supportsRichText = useDashboardSelector(selectSupportsRichTextWidgets);
15
16
  const isNewDashboard = useDashboardSelector(selectIsNewDashboard);
17
+ const isAiGenerating = useDashboardSelector(selectIsAiGenerating);
16
18
  const AttributeFilterComponentSet = props.AttributeFilterComponentSet;
17
19
  const InsightWidgetComponentSet = props.InsightWidgetComponentSet;
18
20
  const RichTextWidgetComponentSet = props.RichTextWidgetComponentSet;
@@ -27,7 +29,7 @@ export function CreationPanel(props) {
27
29
  supportsRichText && RichTextWidgetComponentSet.creating,
28
30
  ]);
29
31
  return sortBy(items, (item) => item.priority ?? 0).map(({ CreatePanelListItemComponent, type }) => {
30
- return (_jsx(CreatePanelListItemComponent, { WrapCreatePanelItemWithDragComponent: WrapCreatePanelItemWithDragComponent }, type));
32
+ return (_jsx(CreatePanelListItemComponent, { WrapCreatePanelItemWithDragComponent: WrapCreatePanelItemWithDragComponent, disabled: isAiGenerating }, type));
31
33
  });
32
34
  }, [
33
35
  AttributeFilterComponentSet,
@@ -37,12 +39,13 @@ export function CreationPanel(props) {
37
39
  DashboardLayoutWidgetComponentSet,
38
40
  supportsRichText,
39
41
  WrapCreatePanelItemWithDragComponent,
42
+ isAiGenerating,
40
43
  ]);
41
44
  return (_jsx("div", { className: cx("configuration-panel creation-panel", className), children: _jsxs("div", { className: "configuration-panel-content", children: [
42
45
  _jsx(Typography, { tagName: "h2", className: "flex-panel-item-nostretch", children: _jsx(FormattedMessage, { id: "visualizationsList.dragToAdd" }) }), _jsxs("div", { className: "configuration-category drag-to-add", children: [
43
46
  _jsx(Typography, { tagName: "h3", children: _jsx(FormattedMessage, { id: "addPanel.newItem" }) }), _jsx("div", { className: "add-item-panel", children: addItemPanelItems })
44
47
  ] }), _jsxs("div", { className: "configuration-category configuration-category-vis drag-to-add flex-panel-item-stretch", children: [
45
- _jsx(Typography, { tagName: "h3", children: _jsx(FormattedMessage, { id: "visualizationsList.savedVisualizations" }) }), _jsx(DraggableInsightList, { WrapInsightListItemWithDragComponent: WrapInsightListItemWithDragComponent, recalculateSizeReference: className, searchAutofocus: !isNewDashboard })
48
+ _jsx(Typography, { tagName: "h3", children: _jsx(FormattedMessage, { id: "visualizationsList.savedVisualizations" }) }), _jsx(DraggableInsightList, { WrapInsightListItemWithDragComponent: WrapInsightListItemWithDragComponent, recalculateSizeReference: className, searchAutofocus: !isNewDashboard, disabled: isAiGenerating })
46
49
  ] })
47
50
  ] }) }));
48
51
  }
@@ -3,7 +3,8 @@ interface IDraggableInsightListProps {
3
3
  WrapInsightListItemWithDragComponent?: IWrapInsightListItemWithDragComponent;
4
4
  recalculateSizeReference?: string;
5
5
  searchAutofocus?: boolean;
6
+ disabled?: boolean;
6
7
  }
7
- export declare function DraggableInsightList({ recalculateSizeReference, searchAutofocus, WrapInsightListItemWithDragComponent }: IDraggableInsightListProps): import("react/jsx-runtime").JSX.Element;
8
+ export declare function DraggableInsightList({ recalculateSizeReference, searchAutofocus, WrapInsightListItemWithDragComponent, disabled }: IDraggableInsightListProps): import("react/jsx-runtime").JSX.Element;
8
9
  export {};
9
10
  //# sourceMappingURL=DraggableInsightList.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DraggableInsightList.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/dashboard/DashboardSidebar/DraggableInsightList/DraggableInsightList.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,qCAAqC,EAAE,MAAM,+BAA+B,CAAC;AAI3F,UAAU,0BAA0B;IAChC,oCAAoC,CAAC,EAAE,qCAAqC,CAAC;IAC7E,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,wBAAgB,oBAAoB,CAAC,EACjC,wBAAwB,EACxB,eAAe,EACf,oCAAoC,EACvC,EAAE,0BAA0B,2CAsB5B"}
1
+ {"version":3,"file":"DraggableInsightList.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/dashboard/DashboardSidebar/DraggableInsightList/DraggableInsightList.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,qCAAqC,EAAE,MAAM,+BAA+B,CAAC;AAI3F,UAAU,0BAA0B;IAChC,oCAAoC,CAAC,EAAE,qCAAqC,CAAC;IAC7E,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAgB,oBAAoB,CAAC,EACjC,wBAAwB,EACxB,eAAe,EACf,oCAAoC,EACpC,QAAQ,EACX,EAAE,0BAA0B,2CAuB5B"}
@@ -3,10 +3,10 @@ import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import { useEffect, useRef } from "react";
4
4
  import { FlexDimensions } from "@gooddata/sdk-ui-kit";
5
5
  import { DraggableInsightListCore } from "./DraggableInsightListCore.js";
6
- export function DraggableInsightList({ recalculateSizeReference, searchAutofocus, WrapInsightListItemWithDragComponent, }) {
6
+ export function DraggableInsightList({ recalculateSizeReference, searchAutofocus, WrapInsightListItemWithDragComponent, disabled, }) {
7
7
  const flexRef = useRef(null);
8
8
  useEffect(() => {
9
9
  flexRef.current?.updateSize();
10
10
  }, [recalculateSizeReference]);
11
- return (_jsx("div", { className: "gd-visualizations-list gd-flex-item-stretch gd-flex-row-container", children: _jsx(FlexDimensions, { ref: flexRef, measureHeight: true, measureWidth: true, className: "visualizations-flex-dimensions", children: _jsx(DraggableInsightListCore, { WrapInsightListItemWithDragComponent: WrapInsightListItemWithDragComponent, searchAutofocus: searchAutofocus }) }) }));
11
+ return (_jsx("div", { className: "gd-visualizations-list gd-flex-item-stretch gd-flex-row-container", children: _jsx(FlexDimensions, { ref: flexRef, measureHeight: true, measureWidth: true, className: "visualizations-flex-dimensions", children: _jsx(DraggableInsightListCore, { WrapInsightListItemWithDragComponent: WrapInsightListItemWithDragComponent, searchAutofocus: searchAutofocus, disabled: disabled }) }) }));
12
12
  }
@@ -1,3 +1,3 @@
1
1
  import { type IInsightListProps } from "../../../insightList/types.js";
2
- export declare function DraggableInsightListCore({ WrapInsightListItemWithDragComponent, ...remainingProps }: IInsightListProps): import("react/jsx-runtime").JSX.Element;
2
+ export declare function DraggableInsightListCore({ WrapInsightListItemWithDragComponent, disabled, ...remainingProps }: IInsightListProps): import("react/jsx-runtime").JSX.Element;
3
3
  //# sourceMappingURL=DraggableInsightListCore.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DraggableInsightListCore.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/dashboard/DashboardSidebar/DraggableInsightList/DraggableInsightListCore.tsx"],"names":[],"mappings":"AAsBA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAIvE,wBAAgB,wBAAwB,CAAC,EACrC,oCAAoC,EACpC,GAAG,cAAc,EACpB,EAAE,iBAAiB,2CAsDnB"}
1
+ {"version":3,"file":"DraggableInsightListCore.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/dashboard/DashboardSidebar/DraggableInsightList/DraggableInsightListCore.tsx"],"names":[],"mappings":"AAsBA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAIvE,wBAAgB,wBAAwB,CAAC,EACrC,oCAAoC,EACpC,QAAQ,EACR,GAAG,cAAc,EACpB,EAAE,iBAAiB,2CAwDnB"}
@@ -10,11 +10,11 @@ import { useDashboardComponentsContext } from "../../../dashboardContexts/Dashbo
10
10
  import { InsightList } from "../../../insightList/InsightList.js";
11
11
  import { InsightListDivider } from "../../../insightList/InsightListDivider.js";
12
12
  import { DraggableInsightListItemWrapper } from "./DraggableInsightListItemWrapper.js";
13
- export function DraggableInsightListCore({ WrapInsightListItemWithDragComponent, ...remainingProps }) {
13
+ export function DraggableInsightListCore({ WrapInsightListItemWithDragComponent, disabled, ...remainingProps }) {
14
14
  const userInteraction = useDashboardUserInteraction();
15
15
  const settings = useDashboardSelector(selectSettings);
16
16
  const { LoadingComponent } = useDashboardComponentsContext();
17
- return (_jsx(InsightList, { ...remainingProps, renderItem: ({ item: insight, width, isFirst, isLast }) => {
17
+ return (_jsx(InsightList, { ...remainingProps, disabled: disabled, renderItem: ({ item: insight, width, isFirst, isLast }) => {
18
18
  if (!insight) {
19
19
  return _jsx(InsightListItem, { isLoading: true });
20
20
  }
@@ -34,6 +34,6 @@ export function DraggableInsightListCore({ WrapInsightListItemWithDragComponent,
34
34
  };
35
35
  return (_jsx(DraggableInsightListItemWrapper, { WrapInsightListItemWithDragComponent: WrapInsightListItemWithDragComponent, title: insightTitle(insight), description: description, showDescriptionPanel: true, type: visualizationType, width: width, className: classNames, updated: insightUpdated(insight) ?? insightCreated(insight), isLocked: insightIsLocked(insight), insight: insight, onDescriptionPanelOpen: () => {
36
36
  userInteraction.descriptionTooltipOpened(eventPayload);
37
- }, metadataTimeZone: settings?.metadataTimeZone, useReferences: true, LoadingComponent: LoadingComponent }));
37
+ }, metadataTimeZone: settings?.metadataTimeZone, useReferences: true, LoadingComponent: LoadingComponent, disabled: disabled }));
38
38
  } }));
39
39
  }
@@ -5,8 +5,9 @@ interface IDraggableInsightListItemWrapperProps extends IInsightListItemProps {
5
5
  WrapInsightListItemWithDragComponent?: IWrapInsightListItemWithDragComponent;
6
6
  className?: string;
7
7
  insight: IInsight;
8
+ disabled?: boolean;
8
9
  }
9
10
  export declare function DraggableInsightListItemBody(props: CustomDashboardInsightListItemComponentProps): import("react/jsx-runtime").JSX.Element;
10
- export declare function DraggableInsightListItemWrapper({ WrapInsightListItemWithDragComponent, className, isLocked, title, description, showDescriptionPanel, type, updated, insight, onDescriptionPanelOpen, metadataTimeZone, useReferences, LoadingComponent, filters, width }: IDraggableInsightListItemWrapperProps): import("react/jsx-runtime").JSX.Element;
11
+ export declare function DraggableInsightListItemWrapper({ WrapInsightListItemWithDragComponent, className, isLocked, title, description, showDescriptionPanel, type, updated, insight, onDescriptionPanelOpen, metadataTimeZone, useReferences, LoadingComponent, filters, width, disabled }: IDraggableInsightListItemWrapperProps): import("react/jsx-runtime").JSX.Element;
11
12
  export {};
12
13
  //# sourceMappingURL=DraggableInsightListItemWrapper.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DraggableInsightListItemWrapper.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/dashboard/DashboardSidebar/DraggableInsightList/DraggableInsightListItemWrapper.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,KAAK,qBAAqB,EAAmB,MAAM,sBAAsB,CAAC;AAGnF,OAAO,EACH,KAAK,4CAA4C,EACjD,KAAK,qCAAqC,EAC7C,MAAM,+BAA+B,CAAC;AAEvC,UAAU,qCAAsC,SAAQ,qBAAqB;IACzE,oCAAoC,CAAC,EAAE,qCAAqC,CAAC;IAC7E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,QAAQ,CAAC;CACrB;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,4CAA4C,2CAO/F;AAED,wBAAgB,+BAA+B,CAAC,EAC5C,oCAAoC,EACpC,SAAS,EACT,QAAQ,EACR,KAAK,EACL,WAAW,EACX,oBAAoB,EACpB,IAAI,EACJ,OAAO,EACP,OAAO,EACP,sBAAsB,EACtB,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,OAAO,EACP,KAAK,EACR,EAAE,qCAAqC,2CAuBvC"}
1
+ {"version":3,"file":"DraggableInsightListItemWrapper.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/dashboard/DashboardSidebar/DraggableInsightList/DraggableInsightListItemWrapper.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,KAAK,qBAAqB,EAAmB,MAAM,sBAAsB,CAAC;AAGnF,OAAO,EACH,KAAK,4CAA4C,EACjD,KAAK,qCAAqC,EAC7C,MAAM,+BAA+B,CAAC;AAEvC,UAAU,qCAAsC,SAAQ,qBAAqB;IACzE,oCAAoC,CAAC,EAAE,qCAAqC,CAAC;IAC7E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,QAAQ,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,4CAA4C,2CAO/F;AAED,wBAAgB,+BAA+B,CAAC,EAC5C,oCAAoC,EACpC,SAAS,EACT,QAAQ,EACR,KAAK,EACL,WAAW,EACX,oBAAoB,EACpB,IAAI,EACJ,OAAO,EACP,OAAO,EACP,sBAAsB,EACtB,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,OAAO,EACP,KAAK,EACL,QAAQ,EACX,EAAE,qCAAqC,2CAyBvC"}
@@ -5,7 +5,7 @@ export function DraggableInsightListItemBody(props) {
5
5
  const { className } = props;
6
6
  return (_jsx("div", { className: className, children: _jsx(InsightListItem, { ...props }) }));
7
7
  }
8
- export function DraggableInsightListItemWrapper({ WrapInsightListItemWithDragComponent, className, isLocked, title, description, showDescriptionPanel, type, updated, insight, onDescriptionPanelOpen, metadataTimeZone, useReferences, LoadingComponent, filters, width, }) {
8
+ export function DraggableInsightListItemWrapper({ WrapInsightListItemWithDragComponent, className, isLocked, title, description, showDescriptionPanel, type, updated, insight, onDescriptionPanelOpen, metadataTimeZone, useReferences, LoadingComponent, filters, width, disabled, }) {
9
9
  return (_jsx(DraggableInsightListItem, { WrapInsightListItemWithDragComponent: WrapInsightListItemWithDragComponent, ListItemComponent: DraggableInsightListItemBody, listItemComponentProps: {
10
10
  className,
11
11
  isLocked,
@@ -20,5 +20,6 @@ export function DraggableInsightListItemWrapper({ WrapInsightListItemWithDragCom
20
20
  LoadingComponent,
21
21
  filters,
22
22
  width,
23
- }, insight: insight }));
23
+ disabled,
24
+ }, insight: insight, disabled: disabled }));
24
25
  }
@@ -1 +1 @@
1
- {"version":3,"file":"DashboardInner.d.ts","sourceRoot":"","sources":["../../../../src/presentation/dashboard/components/DashboardInner.tsx"],"names":[],"mappings":"AAwCA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAOnD,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,2CA4GpD"}
1
+ {"version":3,"file":"DashboardInner.d.ts","sourceRoot":"","sources":["../../../../src/presentation/dashboard/components/DashboardInner.tsx"],"names":[],"mappings":"AA4CA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAQnD,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,2CAwHpD"}
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  // (C) 2022-2026 GoodData Corporation
3
3
  import { useEffect, useRef } from "react";
4
4
  import cx from "classnames";
@@ -7,7 +7,7 @@ import { useDashboardSelector } from "../../../model/react/DashboardStoreProvide
7
7
  import { useDashboardAutomations } from "../../../model/react/useDashboardAutomations/useDashboardAutomations.js";
8
8
  import { selectAccessibleDashboardsLoaded } from "../../../model/store/accessibleDashboards/accessibleDashboardsSelectors.js";
9
9
  import { selectCatalogIsLoaded } from "../../../model/store/catalog/catalogSelectors.js";
10
- import { selectLocale, selectSettings } from "../../../model/store/config/configSelectors.js";
10
+ import { selectIsAiGenerating, selectLocale, selectSettings, } from "../../../model/store/config/configSelectors.js";
11
11
  import { selectIsInEditMode } from "../../../model/store/renderMode/renderModeSelectors.js";
12
12
  import { selectDashboardDensity } from "../../../model/store/ui/uiSelectors.js";
13
13
  import { DASHBOARD_HEADER_OVERLAYS_Z_INDEX, DASHBOARD_TOASTS_OVERLAY_Z_INDEX, } from "../../constants/zIndex.js";
@@ -25,6 +25,7 @@ import { DashboardSidebar } from "../DashboardSidebar/DashboardSidebar.js";
25
25
  import { RenderModeAwareDashboardSidebar } from "../DashboardSidebar/RenderModeAwareDashboardSidebar.js";
26
26
  import { ResizableSidebarProvider, useResizableSidebarState, } from "../DashboardSidebar/SidebarResizeContext.js";
27
27
  import { DashboardScreenSizeProvider } from "./DashboardScreenSizeContext.js";
28
+ import { DashboardSkeleton } from "./DashboardSkeleton.js";
28
29
  const overlayController = OverlayController.getInstance(DASHBOARD_HEADER_OVERLAYS_Z_INDEX);
29
30
  const toastsOverlayController = OverlayController.getInstance(DASHBOARD_TOASTS_OVERLAY_Z_INDEX);
30
31
  export function DashboardInner(props) {
@@ -34,6 +35,7 @@ export function DashboardInner(props) {
34
35
  const accessibleDashboardsLoaded = useDashboardSelector(selectAccessibleDashboardsLoaded);
35
36
  const density = useDashboardSelector(selectDashboardDensity);
36
37
  const settings = useDashboardSelector(selectSettings);
38
+ const isAiGenerating = useDashboardSelector(selectIsAiGenerating);
37
39
  const enableEnhancedInsightPicker = settings?.enableEnhancedInsightPicker ?? false;
38
40
  const headerRef = useRef(null);
39
41
  const layoutRef = useRef(null);
@@ -75,11 +77,13 @@ export function DashboardInner(props) {
75
77
  }), children: [
76
78
  _jsx(DragLayerComponent, {}), _jsxs("div", { className: cx("gd-dashboards-root gd-flex-container", {
77
79
  "gd-dashboards-root--floating-toolbar": enableEnhancedInsightPicker,
80
+ "sdk-dashboard-generating": isAiGenerating,
78
81
  }), style: dashboardsRootStyle, children: [
79
82
  _jsx(DashboardSidebar, { DefaultSidebar: RenderModeAwareDashboardSidebar, DeleteDropZoneComponent: DeleteDropZone, WrapCreatePanelItemWithDragComponent: WrapCreatePanelItemWithDrag, WrapInsightListItemWithDragComponent: WrapInsightListItemWithDrag }), _jsxs("main", { className: dashboardContentClassNames, ...mainContentNavigationProps, children: [
80
- _jsx("div", { className: "gd-dash-header-wrapper gd-dash-header-wrapper-sdk-8-12", ref: headerRef, children: _jsx(OverlayControllerProvider, { overlayController: overlayController, children: _jsx(DashboardHeader, {}) }) }), _jsxs("div", { className: "gd-flex-item-stretch dash-section dash-section-kpis", ref: layoutRef, children: [
81
- _jsx(DashboardScreenSizeProvider, { children: _jsx(DashboardContent, { ...props }) }), enableEnhancedInsightPicker ? _jsx(FilterDeleteOverlay, {}) : null] }), _jsx("div", { className: "gd-dash-bottom-position-pixel", ref: bottomRef })
82
- ] })
83
+ _jsx("div", { className: "gd-dash-header-wrapper gd-dash-header-wrapper-sdk-8-12", ref: headerRef, children: _jsx(OverlayControllerProvider, { overlayController: overlayController, children: _jsx(DashboardHeader, {}) }) }), isAiGenerating ? (_jsx("div", { className: "gd-flex-item-stretch dash-section dash-section-kpis", children: _jsx(DashboardScreenSizeProvider, { children: _jsx(DashboardSkeleton, {}) }) })) : (_jsxs(_Fragment, { children: [
84
+ _jsxs("div", { className: "gd-flex-item-stretch dash-section dash-section-kpis", ref: layoutRef, children: [
85
+ _jsx(DashboardScreenSizeProvider, { children: _jsx(DashboardContent, { ...props }) }), enableEnhancedInsightPicker ? _jsx(FilterDeleteOverlay, {}) : null] }), _jsx("div", { className: "gd-dash-bottom-position-pixel", ref: bottomRef })
86
+ ] }))] })
83
87
  ] }), _jsx(Toolbar, {})
84
88
  ] }) })
85
89
  ] }) }));
@@ -0,0 +1,5 @@
1
+ /**
2
+ * @internal
3
+ */
4
+ export declare function DashboardSkeleton(): import("react/jsx-runtime").JSX.Element;
5
+ //# sourceMappingURL=DashboardSkeleton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DashboardSkeleton.d.ts","sourceRoot":"","sources":["../../../../src/presentation/dashboard/components/DashboardSkeleton.tsx"],"names":[],"mappings":"AAkCA;;GAEG;AACH,wBAAgB,iBAAiB,4CA4ChC"}
@@ -0,0 +1,30 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import Skeleton from "react-loading-skeleton";
3
+ import { useScreenSize } from "./DashboardScreenSizeContext.js";
4
+ function DashboardSkeletonWrapper({ children }) {
5
+ return _jsx("div", { className: "gd-skeleton-wrapper", children: children });
6
+ }
7
+ function DashboardSkeletonFilter({ index }) {
8
+ return (_jsxs("div", { className: "gd-skeleton-filter", children: [
9
+ _jsx(Skeleton, { className: "gd-react-loading-skeleton", width: index % 2 === 0 ? 40 : 80, height: 14 }), _jsx(Skeleton, { className: "gd-react-loading-skeleton", width: index % 2 === 0 ? 80 : 40, height: 14 })
10
+ ] }));
11
+ }
12
+ function DashboardSkeletonFilterBar() {
13
+ return (_jsxs("div", { className: "gd-skeleton-filter-bar", children: [
14
+ _jsx(DashboardSkeletonFilter, { index: 0 }, 0), _jsx(DashboardSkeletonFilter, { index: 1 }, 1), _jsx(DashboardSkeletonFilter, { index: 2 }, 2)
15
+ ] }));
16
+ }
17
+ /**
18
+ * @internal
19
+ */
20
+ export function DashboardSkeleton() {
21
+ const screenSize = useScreenSize();
22
+ const isSmall = screenSize === "xs" || screenSize === "sm";
23
+ return (_jsx("div", { className: "sdk-dashboard-skeleton", children: _jsxs(DashboardSkeletonWrapper, { children: [
24
+ _jsx(DashboardSkeletonFilterBar, {}), _jsx("div", { className: "gd-skeleton-content", children: isSmall ? (_jsxs(_Fragment, { children: [
25
+ _jsx(Skeleton, { containerClassName: "skeleton-flex", className: "gd-react-loading-skeleton", width: "100%", height: 220 }), _jsx(Skeleton, { containerClassName: "skeleton-flex", className: "gd-react-loading-skeleton", width: "100%", height: 220 })
26
+ ] })) : (_jsxs(_Fragment, { children: [
27
+ _jsx(Skeleton, { containerClassName: "skeleton-flex", className: "gd-react-loading-skeleton", width: "100%", height: 440 }), _jsx(Skeleton, { containerClassName: "skeleton-flex", className: "gd-react-loading-skeleton", width: "100%", height: 440 })
28
+ ] })) })
29
+ ] }) }));
30
+ }
@@ -2,5 +2,5 @@ import { type IWrapInsightListItemWithDragProps } from "./types.js";
2
2
  /**
3
3
  * @internal
4
4
  */
5
- export declare function WrapInsightListItemWithDrag({ children, insight, onDragStart }: IWrapInsightListItemWithDragProps): import("react/jsx-runtime").JSX.Element;
5
+ export declare function WrapInsightListItemWithDrag({ children, insight, disabled, onDragStart }: IWrapInsightListItemWithDragProps): import("react/jsx-runtime").JSX.Element;
6
6
  //# sourceMappingURL=WrapInsightListItemWithDrag.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"WrapInsightListItemWithDrag.d.ts","sourceRoot":"","sources":["../../../src/presentation/dragAndDrop/WrapInsightListItemWithDrag.tsx"],"names":[],"mappings":"AAcA,OAAO,EAAE,KAAK,iCAAiC,EAAE,MAAM,YAAY,CAAC;AAGpE;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,EACxC,QAAQ,EACR,OAAO,EACP,WAAW,EACd,EAAE,iCAAiC,2CAmCnC"}
1
+ {"version":3,"file":"WrapInsightListItemWithDrag.d.ts","sourceRoot":"","sources":["../../../src/presentation/dragAndDrop/WrapInsightListItemWithDrag.tsx"],"names":[],"mappings":"AAcA,OAAO,EAAE,KAAK,iCAAiC,EAAE,MAAM,YAAY,CAAC;AAGpE;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,EACxC,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,WAAW,EACd,EAAE,iCAAiC,2CAmCnC"}
@@ -10,7 +10,7 @@ import { useDashboardDrag } from "./useDashboardDrag.js";
10
10
  /**
11
11
  * @internal
12
12
  */
13
- export function WrapInsightListItemWithDrag({ children, insight, onDragStart, }) {
13
+ export function WrapInsightListItemWithDrag({ children, insight, disabled, onDragStart, }) {
14
14
  const isInEditMode = useDashboardSelector(selectIsInEditMode);
15
15
  const settings = useDashboardSelector(selectSettings);
16
16
  const handleDragEnd = useWidgetDragEndHandler();
@@ -26,10 +26,10 @@ export function WrapInsightListItemWithDrag({ children, insight, onDragStart, })
26
26
  },
27
27
  };
28
28
  },
29
- canDrag: isInEditMode,
29
+ canDrag: isInEditMode && !disabled,
30
30
  hideDefaultPreview: false,
31
31
  dragEnd: handleDragEnd,
32
32
  dragStart: onDragStart,
33
- }, [isInEditMode, insight, handleDragEnd]);
33
+ }, [isInEditMode, insight, handleDragEnd, disabled]);
34
34
  return (_jsx("div", { className: classNames({ "is-dragging": isDragging }), ref: dragRef, children: children }));
35
35
  }