@gooddata/sdk-ui-dashboard 11.65.0-alpha.0 → 11.65.0-alpha.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/NOTICE +72077 -4
- package/esm/__version.d.ts +1 -1
- package/esm/__version.d.ts.map +1 -1
- package/esm/__version.js +1 -1
- package/esm/assets/type-csv-formatted.svg +1 -1
- package/esm/assets/type-csv-raw.svg +1 -1
- package/esm/index.d.ts +7 -4
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +3 -2
- package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/resolveDashboardConfig.d.ts.map +1 -1
- package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/resolveDashboardConfig.js +1 -3
- package/esm/model/commandHandlers/filterContext/attributeFilter/changeAttributeDisplayFormHandler.d.ts.map +1 -1
- package/esm/model/commandHandlers/filterContext/attributeFilter/changeAttributeDisplayFormHandler.js +8 -7
- package/esm/model/commandHandlers/filterContext/attributeFilter/changeAttributeFilterSelectionHandler.d.ts.map +1 -1
- package/esm/model/commandHandlers/filterContext/attributeFilter/changeAttributeFilterSelectionHandler.js +19 -28
- package/esm/model/commandHandlers/filterContext/attributeFilter/removeAttributeFiltersHandler.d.ts.map +1 -1
- package/esm/model/commandHandlers/filterContext/attributeFilter/removeAttributeFiltersHandler.js +4 -5
- package/esm/model/commandHandlers/filterContext/attributeFilter/replaceAttributeFilterItemSelectionHandler.d.ts.map +1 -1
- package/esm/model/commandHandlers/filterContext/attributeFilter/replaceAttributeFilterItemSelectionHandler.js +14 -15
- package/esm/model/commandHandlers/filterContext/attributeFilter/resolveDisplayFormMetadata.d.ts +4 -1
- package/esm/model/commandHandlers/filterContext/attributeFilter/resolveDisplayFormMetadata.d.ts.map +1 -1
- package/esm/model/commandHandlers/filterContext/attributeFilter/resolveDisplayFormMetadata.js +11 -2
- package/esm/model/commandHandlers/filterContext/changeFilterContextSelectionHandler.d.ts.map +1 -1
- package/esm/model/commandHandlers/filterContext/changeFilterContextSelectionHandler.js +23 -45
- package/esm/model/commandHandlers/filterContext/common.d.ts +6 -5
- package/esm/model/commandHandlers/filterContext/common.d.ts.map +1 -1
- package/esm/model/commandHandlers/filterContext/common.js +12 -18
- package/esm/model/commandHandlers/filterContext/dateFilter/changeDateFilterSelectionHandler.d.ts.map +1 -1
- package/esm/model/commandHandlers/filterContext/dateFilter/changeDateFilterSelectionHandler.js +30 -36
- package/esm/model/commandHandlers/filterContext/measureValueFilter/changeMeasureValueFilterConditionHandler.d.ts.map +1 -1
- package/esm/model/commandHandlers/filterContext/measureValueFilter/changeMeasureValueFilterConditionHandler.js +11 -17
- package/esm/model/commandHandlers/filterContext/measureValueFilter/changeMeasureValueFilterDimensionalityHandler.d.ts.map +1 -1
- package/esm/model/commandHandlers/filterContext/measureValueFilter/changeMeasureValueFilterDimensionalityHandler.js +7 -10
- package/esm/model/commandHandlers/filterContext/tabSync/expandActionsForTabSync.d.ts +15 -0
- package/esm/model/commandHandlers/filterContext/tabSync/expandActionsForTabSync.d.ts.map +1 -0
- package/esm/model/commandHandlers/filterContext/tabSync/expandActionsForTabSync.js +88 -0
- package/esm/model/commandHandlers/filterContext/tabSync/tabSyncRules.d.ts +11 -0
- package/esm/model/commandHandlers/filterContext/tabSync/tabSyncRules.d.ts.map +1 -0
- package/esm/model/commandHandlers/filterContext/tabSync/tabSyncRules.js +335 -0
- package/esm/model/commandHandlers/filterContext/tabSync/tabSyncSaga.d.ts +52 -0
- package/esm/model/commandHandlers/filterContext/tabSync/tabSyncSaga.d.ts.map +1 -0
- package/esm/model/commandHandlers/filterContext/tabSync/tabSyncSaga.js +60 -0
- package/esm/model/commandHandlers/filterContext/tabSync/tabSyncScope.d.ts +69 -0
- package/esm/model/commandHandlers/filterContext/tabSync/tabSyncScope.d.ts.map +1 -0
- package/esm/model/commandHandlers/filterContext/tabSync/tabSyncScope.js +2 -0
- package/esm/model/commandHandlers/parameters/changeParameterValuesHandler.d.ts +2 -1
- package/esm/model/commandHandlers/parameters/changeParameterValuesHandler.d.ts.map +1 -1
- package/esm/model/commandHandlers/parameters/changeParameterValuesHandler.js +41 -10
- package/esm/model/commands/parameters.d.ts +11 -1
- package/esm/model/commands/parameters.d.ts.map +1 -1
- package/esm/model/commands/parameters.js +2 -1
- package/esm/model/events/base.d.ts +1 -1
- package/esm/model/events/base.d.ts.map +1 -1
- package/esm/model/events/index.d.ts +2 -1
- package/esm/model/events/index.d.ts.map +1 -1
- package/esm/model/events/insightEditor.d.ts +128 -0
- package/esm/model/events/insightEditor.d.ts.map +1 -0
- package/esm/model/events/insightEditor.js +74 -0
- package/esm/model/queryServices/queryAttributeElements.js +1 -0
- package/esm/model/react/useInitializeDashboardStore.d.ts.map +1 -1
- package/esm/model/react/useInitializeDashboardStore.js +4 -9
- package/esm/model/store/config/configReducers.d.ts +4 -8
- package/esm/model/store/config/configReducers.d.ts.map +1 -1
- package/esm/model/store/config/configReducers.js +6 -12
- package/esm/model/store/config/configSelectors.d.ts +24 -0
- package/esm/model/store/config/configSelectors.d.ts.map +1 -1
- package/esm/model/store/config/configSelectors.js +30 -4
- package/esm/model/store/config/index.d.ts +2 -3
- package/esm/model/store/config/index.d.ts.map +1 -1
- package/esm/model/store/tabs/attributeFilterConfigs/attributeFilterConfigsReducers.d.ts +75 -5
- package/esm/model/store/tabs/attributeFilterConfigs/attributeFilterConfigsReducers.d.ts.map +1 -1
- package/esm/model/store/tabs/attributeFilterConfigs/attributeFilterConfigsReducers.js +35 -60
- package/esm/model/store/tabs/dateFilterConfigs/dateFilterConfigsReducers.js +1 -1
- package/esm/model/store/tabs/filterContext/filterContextReducers.d.ts +139 -31
- package/esm/model/store/tabs/filterContext/filterContextReducers.d.ts.map +1 -1
- package/esm/model/store/tabs/filterContext/filterContextReducers.js +314 -529
- package/esm/model/store/tabs/filterContext/filterSync.d.ts +35 -13
- package/esm/model/store/tabs/filterContext/filterSync.d.ts.map +1 -1
- package/esm/model/store/tabs/filterContext/filterSync.js +79 -58
- package/esm/model/store/tabs/index.d.ts +10 -12
- package/esm/model/store/tabs/index.d.ts.map +1 -1
- package/esm/model/store/tabs/layout/layoutReducers.d.ts +1 -0
- package/esm/model/store/tabs/layout/layoutReducers.d.ts.map +1 -1
- package/esm/model/store/tabs/measureValueFilterConfigs/measureValueFilterConfigsReducers.d.ts.map +1 -1
- package/esm/model/store/tabs/parameters/parametersReducers.d.ts +0 -5
- package/esm/model/store/tabs/parameters/parametersReducers.d.ts.map +1 -1
- package/esm/model/store/tabs/parameters/parametersReducers.js +8 -7
- package/esm/model/store/tabs/parameters/parametersSelectors.d.ts +7 -0
- package/esm/model/store/tabs/parameters/parametersSelectors.d.ts.map +1 -1
- package/esm/model/store/tabs/parameters/parametersSelectors.js +16 -0
- package/esm/model/store/tabs/tabsReducers.d.ts +8 -4
- package/esm/model/store/tabs/tabsReducers.d.ts.map +1 -1
- package/esm/model/store/tabs/tabsReducers.js +15 -18
- package/esm/model/store/tabs/tabsState.d.ts +0 -10
- package/esm/model/store/tabs/tabsState.d.ts.map +1 -1
- package/esm/model/store/tabs/tabsState.js +0 -20
- package/esm/model/store/ui/index.d.ts +2 -0
- package/esm/model/store/ui/index.d.ts.map +1 -1
- package/esm/model/store/ui/uiReducers.d.ts +6 -0
- package/esm/model/store/ui/uiReducers.d.ts.map +1 -1
- package/esm/model/store/ui/uiReducers.js +8 -0
- package/esm/model/store/ui/uiSelectors.d.ts +7 -0
- package/esm/model/store/ui/uiSelectors.d.ts.map +1 -1
- package/esm/model/store/ui/uiSelectors.js +6 -0
- package/esm/model/store/ui/uiState.d.ts +5 -0
- package/esm/model/store/ui/uiState.d.ts.map +1 -1
- package/esm/model/store/ui/uiState.js +1 -0
- package/esm/model/types/attributeFilterTypes.d.ts +5 -0
- package/esm/model/types/attributeFilterTypes.d.ts.map +1 -1
- package/esm/model/types/attributeFilterTypes.js +1 -1
- package/esm/model/types/commonTypes.d.ts +38 -22
- package/esm/model/types/commonTypes.d.ts.map +1 -1
- package/esm/model/types/insightEditorTypes.d.ts +43 -0
- package/esm/model/types/insightEditorTypes.d.ts.map +1 -0
- package/esm/model/types/insightEditorTypes.js +2 -0
- package/esm/model/utils/attributeFilterMatching.d.ts +10 -0
- package/esm/model/utils/attributeFilterMatching.d.ts.map +1 -1
- package/esm/model/utils/attributeFilterMatching.js +14 -3
- package/esm/model/utils/attributeFilterSelectionTypeCompatibility.d.ts +8 -0
- package/esm/model/utils/attributeFilterSelectionTypeCompatibility.d.ts.map +1 -1
- package/esm/model/utils/attributeFilterSelectionTypeCompatibility.js +14 -4
- package/esm/presentation/automations/alerting/hooks/useAttributeValuesFromExecResults.d.ts +33 -2
- package/esm/presentation/automations/alerting/hooks/useAttributeValuesFromExecResults.d.ts.map +1 -1
- package/esm/presentation/automations/alerting/hooks/useAttributeValuesFromExecResults.js +29 -13
- package/esm/presentation/automations/alerting/state/useAlertSupportedMetrics.d.ts.map +1 -1
- package/esm/presentation/automations/alerting/state/useAlertSupportedMetrics.js +3 -2
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/Attachments/DashboardAttachments.d.ts.map +1 -1
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/Attachments/DashboardAttachments.js +3 -3
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/Attachments/WidgetAttachments.d.ts.map +1 -1
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/Attachments/WidgetAttachments.js +5 -4
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/RecipientsSelect/LiveRegionLastSelectContainer.d.ts +9 -0
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/RecipientsSelect/LiveRegionLastSelectContainer.d.ts.map +1 -0
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/RecipientsSelect/LiveRegionLastSelectContainer.js +12 -0
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/RecipientsSelect/RecipientsSelect.d.ts.map +1 -1
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/RecipientsSelect/RecipientsSelect.js +3 -3
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/RecipientsSelect/RecipientsSelectRenderer.d.ts.map +1 -1
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/RecipientsSelect/RecipientsSelectRenderer.js +14 -7
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/RecipientsSelect/RecipientsSelectionDescription.d.ts +12 -0
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/RecipientsSelect/RecipientsSelectionDescription.d.ts.map +1 -0
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/RecipientsSelect/RecipientsSelectionDescription.js +30 -0
- package/esm/presentation/automations/scheduledEmail/utils/users.d.ts +1 -0
- package/esm/presentation/automations/scheduledEmail/utils/users.d.ts.map +1 -1
- package/esm/presentation/automations/scheduledEmail/utils/users.js +3 -0
- package/esm/presentation/automations/shared/automationFilters/utils.d.ts +4 -0
- package/esm/presentation/automations/shared/automationFilters/utils.d.ts.map +1 -1
- package/esm/presentation/automations/shared/automationFilters/utils.js +12 -5
- package/esm/presentation/dashboard/DashboardHeader/DashboardHeader.d.ts +1 -1
- package/esm/presentation/dashboard/DashboardHeader/DashboardHeader.d.ts.map +1 -1
- package/esm/presentation/dashboard/DashboardHeader/DashboardHeader.js +2 -11
- package/esm/presentation/dashboard/DashboardSidebar/CreationPanel.d.ts.map +1 -1
- package/esm/presentation/dashboard/DashboardSidebar/CreationPanel.js +10 -1
- package/esm/presentation/dashboard/DefaultDashboardContent/DashboardContentLoader.d.ts +5 -0
- package/esm/presentation/dashboard/DefaultDashboardContent/DashboardContentLoader.d.ts.map +1 -0
- package/esm/presentation/dashboard/DefaultDashboardContent/DashboardContentLoader.js +27 -0
- package/esm/presentation/dashboard/DefaultDashboardContent/DefaultDashboardMainContent.d.ts.map +1 -1
- package/esm/presentation/dashboard/DefaultDashboardContent/DefaultDashboardMainContent.js +7 -2
- package/esm/presentation/dashboard/components/DashboardAiComposingOverlay.d.ts +4 -0
- package/esm/presentation/dashboard/components/DashboardAiComposingOverlay.d.ts.map +1 -0
- package/esm/presentation/dashboard/components/DashboardAiComposingOverlay.js +151 -0
- package/esm/presentation/dashboard/components/DashboardInner.d.ts.map +1 -1
- package/esm/presentation/dashboard/components/DashboardInner.js +17 -14
- package/esm/presentation/dashboard/components/DashboardInteractionComposing.d.ts +8 -0
- package/esm/presentation/dashboard/components/DashboardInteractionComposing.d.ts.map +1 -0
- package/esm/presentation/dashboard/components/DashboardInteractionComposing.js +23 -0
- package/esm/presentation/dashboard/components/DashboardInteractionLock.d.ts +8 -0
- package/esm/presentation/dashboard/components/DashboardInteractionLock.d.ts.map +1 -0
- package/esm/presentation/dashboard/components/DashboardInteractionLock.js +29 -0
- package/esm/presentation/dashboard/components/DashboardScreenSizeContext.d.ts.map +1 -1
- package/esm/presentation/dashboard/components/DashboardScreenSizeContext.js +10 -7
- package/esm/presentation/dashboard/components/ToastMessages.d.ts.map +1 -1
- package/esm/presentation/dashboard/components/ToastMessages.js +6 -3
- package/esm/presentation/dashboard/components/useEditModeLayoutNoteMessages.d.ts +6 -0
- package/esm/presentation/dashboard/components/useEditModeLayoutNoteMessages.d.ts.map +1 -0
- package/esm/presentation/dashboard/components/useEditModeLayoutNoteMessages.js +48 -0
- package/esm/presentation/dashboard/hooks/useDashboard.d.ts.map +1 -1
- package/esm/presentation/dashboard/hooks/useDashboard.js +3 -2
- package/esm/presentation/dashboard/types.d.ts +5 -0
- package/esm/presentation/dashboard/types.d.ts.map +1 -1
- package/esm/presentation/dragAndDrop/draggableWidget/AddDashboardLayoutWidgetButton.d.ts.map +1 -1
- package/esm/presentation/dragAndDrop/draggableWidget/AddDashboardLayoutWidgetButton.js +2 -4
- package/esm/presentation/dragAndDrop/draggableWidget/AddRichTextWidgetButton.d.ts.map +1 -1
- package/esm/presentation/dragAndDrop/draggableWidget/AddRichTextWidgetButton.js +3 -3
- package/esm/presentation/dragAndDrop/draggableWidget/AddVisualizationSwitcherWidgetButton.d.ts.map +1 -1
- package/esm/presentation/dragAndDrop/draggableWidget/AddVisualizationSwitcherWidgetButton.js +2 -4
- package/esm/presentation/drill/utils/drillDownUtils.d.ts.map +1 -1
- package/esm/presentation/drill/utils/drillDownUtils.js +3 -2
- package/esm/presentation/export/hooks/useDashboardRelatedFilters.d.ts +8 -1
- package/esm/presentation/export/hooks/useDashboardRelatedFilters.d.ts.map +1 -1
- package/esm/presentation/export/hooks/useDashboardRelatedFilters.js +21 -5
- package/esm/presentation/filterBar/attributeFilter/DefaultDashboardAttributeFilter.d.ts.map +1 -1
- package/esm/presentation/filterBar/attributeFilter/DefaultDashboardAttributeFilter.js +3 -2
- package/esm/presentation/filterBar/attributeFilter/addAttributeFilter/AddAttributeFilterPlaceholder.d.ts.map +1 -1
- package/esm/presentation/filterBar/attributeFilter/addAttributeFilter/AddAttributeFilterPlaceholder.js +3 -2
- package/esm/presentation/filterBar/attributeFilter/addAttributeFilter/attributeListItemTooltip/AttributeListItemTooltip.d.ts.map +1 -1
- package/esm/presentation/filterBar/attributeFilter/addAttributeFilter/attributeListItemTooltip/AttributeListItemTooltip.js +4 -1
- package/esm/presentation/filterBar/attributeFilter/addAttributeFilter/attributeListItemTooltip/AttributeListItemTooltipContent.d.ts +6 -2
- package/esm/presentation/filterBar/attributeFilter/addAttributeFilter/attributeListItemTooltip/AttributeListItemTooltipContent.d.ts.map +1 -1
- package/esm/presentation/filterBar/attributeFilter/addAttributeFilter/attributeListItemTooltip/AttributeListItemTooltipContent.js +8 -4
- package/esm/presentation/filterBar/filterBar/filterViews/FilterViewDeleteConfirm.d.ts +2 -1
- package/esm/presentation/filterBar/filterBar/filterViews/FilterViewDeleteConfirm.d.ts.map +1 -1
- package/esm/presentation/filterBar/filterBar/filterViews/FilterViewDeleteConfirm.js +2 -2
- package/esm/presentation/filterBar/filterBar/filterViews/FilterViewsList.d.ts.map +1 -1
- package/esm/presentation/filterBar/filterBar/filterViews/FilterViewsList.js +11 -5
- package/esm/presentation/filterBar/filterBar/hooks/useResetFiltersButton.d.ts.map +1 -1
- package/esm/presentation/filterBar/filterBar/hooks/useResetFiltersButton.js +4 -1
- package/esm/presentation/insightEditor/InsightEditorContent.d.ts +26 -0
- package/esm/presentation/insightEditor/InsightEditorContent.d.ts.map +1 -0
- package/esm/presentation/insightEditor/InsightEditorContent.js +158 -0
- package/esm/presentation/insightEditor/InsightEditorCreatePanelItem.d.ts +7 -0
- package/esm/presentation/insightEditor/InsightEditorCreatePanelItem.d.ts.map +1 -0
- package/esm/presentation/insightEditor/InsightEditorCreatePanelItem.js +25 -0
- package/esm/presentation/insightEditor/InsightEditorOverlay.d.ts +6 -0
- package/esm/presentation/insightEditor/InsightEditorOverlay.d.ts.map +1 -0
- package/esm/presentation/insightEditor/InsightEditorOverlay.js +110 -0
- package/esm/presentation/insightEditor/InsightEditorPermissionsContext.d.ts +10 -0
- package/esm/presentation/insightEditor/InsightEditorPermissionsContext.d.ts.map +1 -0
- package/esm/presentation/insightEditor/InsightEditorPermissionsContext.js +18 -0
- package/esm/presentation/insightEditor/InsightEditorPlaceholder.d.ts +7 -0
- package/esm/presentation/insightEditor/InsightEditorPlaceholder.d.ts.map +1 -0
- package/esm/presentation/insightEditor/InsightEditorPlaceholder.js +15 -0
- package/esm/presentation/insightEditor/filterContext/attributeFilters.d.ts +4 -0
- package/esm/presentation/insightEditor/filterContext/attributeFilters.d.ts.map +1 -0
- package/esm/presentation/insightEditor/filterContext/attributeFilters.js +115 -0
- package/esm/presentation/insightEditor/filterContext/dateFilters.d.ts +5 -0
- package/esm/presentation/insightEditor/filterContext/dateFilters.d.ts.map +1 -0
- package/esm/presentation/insightEditor/filterContext/dateFilters.js +117 -0
- package/esm/presentation/insightEditor/filterContext/filterIntersection.d.ts +7 -0
- package/esm/presentation/insightEditor/filterContext/filterIntersection.d.ts.map +1 -0
- package/esm/presentation/insightEditor/filterContext/filterIntersection.js +149 -0
- package/esm/presentation/insightEditor/filterContext/insightFilterContext.d.ts +26 -0
- package/esm/presentation/insightEditor/filterContext/insightFilterContext.d.ts.map +1 -0
- package/esm/presentation/insightEditor/filterContext/insightFilterContext.js +72 -0
- package/esm/presentation/insightEditor/filterContext/measureValueFilters.d.ts +20 -0
- package/esm/presentation/insightEditor/filterContext/measureValueFilters.d.ts.map +1 -0
- package/esm/presentation/insightEditor/filterContext/measureValueFilters.js +76 -0
- package/esm/presentation/insightEditor/filterContext/objQualifiers.d.ts +11 -0
- package/esm/presentation/insightEditor/filterContext/objQualifiers.d.ts.map +1 -0
- package/esm/presentation/insightEditor/filterContext/objQualifiers.js +18 -0
- package/esm/presentation/insightEditor/insightEditorEscapeGuard.d.ts +18 -0
- package/esm/presentation/insightEditor/insightEditorEscapeGuard.d.ts.map +1 -0
- package/esm/presentation/insightEditor/insightEditorEscapeGuard.js +24 -0
- package/esm/presentation/insightEditor/insightEditorRoute.d.ts +34 -0
- package/esm/presentation/insightEditor/insightEditorRoute.d.ts.map +1 -0
- package/esm/presentation/insightEditor/insightEditorRoute.js +48 -0
- package/esm/presentation/insightEditor/types.d.ts +7 -0
- package/esm/presentation/insightEditor/types.d.ts.map +1 -0
- package/esm/presentation/insightEditor/types.js +2 -0
- package/esm/presentation/insightEditor/useCanCreateInsightInEditor.d.ts +5 -0
- package/esm/presentation/insightEditor/useCanCreateInsightInEditor.d.ts.map +1 -0
- package/esm/presentation/insightEditor/useCanCreateInsightInEditor.js +14 -0
- package/esm/presentation/insightEditor/useExploreFilterTransfer.d.ts +21 -0
- package/esm/presentation/insightEditor/useExploreFilterTransfer.d.ts.map +1 -0
- package/esm/presentation/insightEditor/useExploreFilterTransfer.js +193 -0
- package/esm/presentation/insightEditor/useInsightEditPermissions.d.ts +17 -0
- package/esm/presentation/insightEditor/useInsightEditPermissions.d.ts.map +1 -0
- package/esm/presentation/insightEditor/useInsightEditPermissions.js +42 -0
- package/esm/presentation/insightEditor/useInsightEditorMenuItems.d.ts +23 -0
- package/esm/presentation/insightEditor/useInsightEditorMenuItems.d.ts.map +1 -0
- package/esm/presentation/insightEditor/useInsightEditorMenuItems.js +126 -0
- package/esm/presentation/insightEditor/useInsightEditorSession.d.ts +19 -0
- package/esm/presentation/insightEditor/useInsightEditorSession.d.ts.map +1 -0
- package/esm/presentation/insightEditor/useInsightEditorSession.js +141 -0
- package/esm/presentation/insightList/InsightList.d.ts.map +1 -1
- package/esm/presentation/insightList/InsightList.js +10 -5
- package/esm/presentation/localization/bundles/de-DE.localization-bundle.d.ts +6 -0
- package/esm/presentation/localization/bundles/de-DE.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/de-DE.localization-bundle.js +48 -42
- package/esm/presentation/localization/bundles/en-AU.localization-bundle.d.ts +6 -0
- package/esm/presentation/localization/bundles/en-AU.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/en-AU.localization-bundle.js +6 -0
- package/esm/presentation/localization/bundles/en-GB.localization-bundle.d.ts +6 -0
- package/esm/presentation/localization/bundles/en-GB.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/en-GB.localization-bundle.js +11 -5
- package/esm/presentation/localization/bundles/en-US.localization-bundle.d.ts +64 -0
- package/esm/presentation/localization/bundles/en-US.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/en-US.localization-bundle.js +64 -0
- package/esm/presentation/localization/bundles/es-419.localization-bundle.d.ts +6 -0
- package/esm/presentation/localization/bundles/es-419.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/es-419.localization-bundle.js +6 -0
- package/esm/presentation/localization/bundles/es-ES.localization-bundle.d.ts +6 -0
- package/esm/presentation/localization/bundles/es-ES.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/es-ES.localization-bundle.js +6 -0
- package/esm/presentation/localization/bundles/fi-FI.localization-bundle.d.ts +6 -0
- package/esm/presentation/localization/bundles/fi-FI.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/fi-FI.localization-bundle.js +6 -0
- package/esm/presentation/localization/bundles/fr-CA.localization-bundle.d.ts +6 -0
- package/esm/presentation/localization/bundles/fr-CA.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/fr-CA.localization-bundle.js +6 -0
- package/esm/presentation/localization/bundles/fr-FR.localization-bundle.d.ts +6 -0
- package/esm/presentation/localization/bundles/fr-FR.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/fr-FR.localization-bundle.js +187 -181
- package/esm/presentation/localization/bundles/id-ID.localization-bundle.d.ts +6 -0
- package/esm/presentation/localization/bundles/id-ID.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/id-ID.localization-bundle.js +6 -0
- package/esm/presentation/localization/bundles/it-IT.localization-bundle.d.ts +6 -0
- package/esm/presentation/localization/bundles/it-IT.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/it-IT.localization-bundle.js +6 -0
- package/esm/presentation/localization/bundles/ja-JP.localization-bundle.d.ts +6 -0
- package/esm/presentation/localization/bundles/ja-JP.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/ja-JP.localization-bundle.js +6 -0
- package/esm/presentation/localization/bundles/ko-KR.localization-bundle.d.ts +6 -0
- package/esm/presentation/localization/bundles/ko-KR.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/ko-KR.localization-bundle.js +6 -0
- package/esm/presentation/localization/bundles/nl-NL.localization-bundle.d.ts +6 -0
- package/esm/presentation/localization/bundles/nl-NL.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/nl-NL.localization-bundle.js +6 -0
- package/esm/presentation/localization/bundles/pl-PL.localization-bundle.d.ts +6 -0
- package/esm/presentation/localization/bundles/pl-PL.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/pl-PL.localization-bundle.js +6 -0
- package/esm/presentation/localization/bundles/pt-BR.localization-bundle.d.ts +6 -0
- package/esm/presentation/localization/bundles/pt-BR.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/pt-BR.localization-bundle.js +6 -0
- package/esm/presentation/localization/bundles/pt-PT.localization-bundle.d.ts +6 -0
- package/esm/presentation/localization/bundles/pt-PT.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/pt-PT.localization-bundle.js +6 -0
- package/esm/presentation/localization/bundles/ru-RU.localization-bundle.d.ts +6 -0
- package/esm/presentation/localization/bundles/ru-RU.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/ru-RU.localization-bundle.js +6 -0
- package/esm/presentation/localization/bundles/sl-SI.localization-bundle.d.ts +6 -0
- package/esm/presentation/localization/bundles/sl-SI.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/sl-SI.localization-bundle.js +6 -0
- package/esm/presentation/localization/bundles/th-TH.localization-bundle.d.ts +6 -0
- package/esm/presentation/localization/bundles/th-TH.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/th-TH.localization-bundle.js +6 -0
- package/esm/presentation/localization/bundles/tr-TR.localization-bundle.d.ts +6 -0
- package/esm/presentation/localization/bundles/tr-TR.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/tr-TR.localization-bundle.js +6 -0
- package/esm/presentation/localization/bundles/uk-UA.localization-bundle.d.ts +6 -0
- package/esm/presentation/localization/bundles/uk-UA.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/uk-UA.localization-bundle.js +6 -0
- package/esm/presentation/localization/bundles/vi-VN.localization-bundle.d.ts +6 -0
- package/esm/presentation/localization/bundles/vi-VN.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/vi-VN.localization-bundle.js +6 -0
- package/esm/presentation/localization/bundles/zh-HK.localization-bundle.d.ts +6 -0
- package/esm/presentation/localization/bundles/zh-HK.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/zh-HK.localization-bundle.js +6 -0
- package/esm/presentation/localization/bundles/zh-Hans.localization-bundle.d.ts +6 -0
- package/esm/presentation/localization/bundles/zh-Hans.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/zh-Hans.localization-bundle.js +6 -0
- package/esm/presentation/localization/bundles/zh-Hant.localization-bundle.d.ts +6 -0
- package/esm/presentation/localization/bundles/zh-Hant.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/zh-Hant.localization-bundle.js +7 -1
- package/esm/presentation/topBar/buttonBar/button/editButton/DefaultEditButton.d.ts.map +1 -1
- package/esm/presentation/topBar/buttonBar/button/editButton/DefaultEditButton.js +2 -4
- package/esm/presentation/topBar/buttonBar/button/saveAsButton/DefaultSaveAsNewButton.d.ts.map +1 -1
- package/esm/presentation/topBar/buttonBar/button/saveAsButton/DefaultSaveAsNewButton.js +3 -2
- package/esm/presentation/topBar/buttonBar/button/saveButton/DefaultSaveButton.d.ts.map +1 -1
- package/esm/presentation/topBar/buttonBar/button/saveButton/DefaultSaveButton.js +3 -2
- package/esm/presentation/topBar/buttonBar/button/settingButton/DefaultSettingButton.d.ts.map +1 -1
- package/esm/presentation/topBar/buttonBar/button/settingButton/DefaultSettingButton.js +3 -2
- package/esm/presentation/topBar/buttonBar/button/shareButton/DefaultShareButton.d.ts.map +1 -1
- package/esm/presentation/topBar/buttonBar/button/shareButton/DefaultShareButton.js +3 -2
- package/esm/presentation/topBar/title/EditableTitle.d.ts.map +1 -1
- package/esm/presentation/topBar/title/EditableTitle.js +6 -0
- package/esm/presentation/widget/insight/DefaultDashboardInsightComponentSetFactory.d.ts +1 -1
- package/esm/presentation/widget/insight/DefaultDashboardInsightComponentSetFactory.d.ts.map +1 -1
- package/esm/presentation/widget/insight/DefaultDashboardInsightComponentSetFactory.js +13 -1
- package/esm/presentation/widget/insightMenu/DefaultDashboardInsightMenu/DashboardInsightMenu/index.d.ts.map +1 -1
- package/esm/presentation/widget/insightMenu/DefaultDashboardInsightMenu/DashboardInsightMenu/index.js +10 -1
- package/esm/presentation/widget/richText/EditModeDashboardRichText.js +1 -1
- package/esm/presentation/widget/visualizationSwitcher/EditModeDashboardVisualizationSwitcher.js +1 -1
- package/esm/presentation/widget/visualizationSwitcher/configuration/ToolbarTop.js +2 -2
- package/esm/presentation/widget/widget/InsightWidget/useEditableInsightMenu.d.ts.map +1 -1
- package/esm/presentation/widget/widget/InsightWidget/useEditableInsightMenu.js +5 -1
- package/esm/presentation/widget/widget/InsightWidget/useInsightMenu.d.ts.map +1 -1
- package/esm/presentation/widget/widget/InsightWidget/useInsightMenu.js +4 -1
- package/esm/sdk-ui-dashboard.d.ts +528 -68
- package/package.json +23 -21
- package/styles/css/alerting.css +1 -1
- package/styles/css/alerting.css.map +1 -1
- package/styles/css/attributeFilterConfig.css +3 -3
- package/styles/css/automationFilters.css +1 -1
- package/styles/css/configurationPanel.css +2 -2
- package/styles/css/configurationPanel.css.map +1 -1
- package/styles/css/dashboard.css +149 -86
- package/styles/css/dashboard.css.map +1 -1
- package/styles/css/dashboardContentLoader.css +45 -0
- package/styles/css/dashboardContentLoader.css.map +1 -0
- package/styles/css/dashboardNestedLayoutToolbar.css.map +1 -1
- package/styles/css/dashboardNestedLayoutWidget.css +1 -1
- package/styles/css/dashboardSettingsDialog.css +1 -1
- package/styles/css/dragAndDrop.css +0 -8
- package/styles/css/dragAndDrop.css.map +1 -1
- package/styles/css/drillConfigPanel.css +7 -7
- package/styles/css/drillConfigPanel.css.map +1 -1
- package/styles/css/filterBar.css +4 -4
- package/styles/css/filterBar.css.map +1 -1
- package/styles/css/grouped-navigation.css +2 -2
- package/styles/css/grouped-navigation.css.map +1 -1
- package/styles/css/icons.css.map +1 -1
- package/styles/css/insightConfiguration.css +1 -1
- package/styles/css/insightConfiguration.css.map +1 -1
- package/styles/css/insightEditor.css +46 -0
- package/styles/css/insightEditor.css.map +1 -0
- package/styles/css/kpi.css +2 -2
- package/styles/css/kpi.css.map +1 -1
- package/styles/css/kpi_alert_dialog.css +2 -2
- package/styles/css/layout.css +5 -5
- package/styles/css/layout.css.map +1 -1
- package/styles/css/main.css +343 -218
- package/styles/css/main.css.map +1 -1
- package/styles/css/notifications_channels_dialog.css +2 -2
- package/styles/css/notifications_channels_dialog.css.map +1 -1
- package/styles/css/resizing.css.map +1 -1
- package/styles/css/richTextWidget.css.map +1 -1
- package/styles/css/saveAsDialog.css.map +1 -1
- package/styles/css/sidebar.css +35 -10
- package/styles/css/sidebar.css.map +1 -1
- package/styles/css/topBar.css.map +1 -1
- package/styles/css/visualization.css.map +1 -1
- package/styles/css/visualizationSwitcherHeader.css.map +1 -1
- package/styles/css/visualizationSwitcherToolbar.css +1 -1
- package/styles/css/visualizationSwitcherToolbar.css.map +1 -1
- package/styles/css/visualizationSwitcherWidget.css +1 -1
- package/styles/css/visualizationSwitcherWidget.css.map +1 -1
- package/styles/scss/_variables.scss +3 -2
- package/styles/scss/_zIndexes.scss +4 -0
- package/styles/scss/attributeFilterConfig.scss +1 -1
- package/styles/scss/configurationPanel.scss +1 -1
- package/styles/scss/dashboard.scss +113 -94
- package/styles/scss/dashboardContentLoader.scss +45 -0
- package/styles/scss/dragAndDrop.scss +2 -9
- package/styles/scss/drillConfigPanel.scss +3 -3
- package/styles/scss/insightEditor.scss +53 -0
- package/styles/scss/layout.scss +1 -1
- package/styles/scss/main.scss +1 -0
- package/styles/scss/sidebar.scss +47 -12
- package/esm/presentation/dashboard/components/DashboardSkeleton.d.ts +0 -5
- package/esm/presentation/dashboard/components/DashboardSkeleton.d.ts.map +0 -1
- package/esm/presentation/dashboard/components/DashboardSkeleton.js +0 -20
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
// (C) 2019-2026 GoodData Corporation
|
|
2
2
|
import { useCallback, useEffect, useState } from "react";
|
|
3
3
|
import { areObjRefsEqual, isResultAttributeHeader, } from "@gooddata/sdk-model";
|
|
4
|
-
import { DataViewFacade } from "@gooddata/sdk-ui";
|
|
4
|
+
import { DataViewFacade, createNumberFormatter, formatAttributeHeaderValues, } from "@gooddata/sdk-ui";
|
|
5
5
|
/**
|
|
6
6
|
* Reads the widget's execution result and exposes the attribute values and measure values in it.
|
|
7
7
|
*
|
|
8
8
|
* @internal
|
|
9
9
|
*/
|
|
10
|
-
export function useAttributeValuesFromExecResults(execResult) {
|
|
10
|
+
export function useAttributeValuesFromExecResults(execResult, formatting) {
|
|
11
|
+
const separators = formatting?.separators;
|
|
11
12
|
// Derive loading from the envelope's own isLoading flag, not from the
|
|
12
13
|
// presence of executionResult: an errored execution has no executionResult
|
|
13
14
|
// but is no longer loading, and there is no readAll() promise to clear the
|
|
@@ -23,7 +24,7 @@ export function useAttributeValuesFromExecResults(execResult) {
|
|
|
23
24
|
.readAll()
|
|
24
25
|
.then((data) => {
|
|
25
26
|
if (!cancelled) {
|
|
26
|
-
setDataView(DataViewFacade.for(data));
|
|
27
|
+
setDataView(DataViewFacade.for(formatAttributeHeaderValues(data, createNumberFormatter(separators))));
|
|
27
28
|
setIsResultLoading(false);
|
|
28
29
|
}
|
|
29
30
|
})
|
|
@@ -43,7 +44,7 @@ export function useAttributeValuesFromExecResults(execResult) {
|
|
|
43
44
|
return () => {
|
|
44
45
|
cancelled = true;
|
|
45
46
|
};
|
|
46
|
-
}, [execResult]);
|
|
47
|
+
}, [execResult, separators]);
|
|
47
48
|
const getAttributeValues = useCallback((attr) => {
|
|
48
49
|
const header = findAttributeHeader(dataView, attr);
|
|
49
50
|
const indexes = findDimIndexes(dataView, header);
|
|
@@ -69,7 +70,16 @@ export function useAttributeValuesFromExecResults(execResult) {
|
|
|
69
70
|
getMetricValue,
|
|
70
71
|
};
|
|
71
72
|
}
|
|
72
|
-
|
|
73
|
+
/**
|
|
74
|
+
* Sums the measure values of the series scoped by the given raw attribute values.
|
|
75
|
+
*
|
|
76
|
+
* @remarks
|
|
77
|
+
* Matching works on raw element names: `scopeTitles()` return raw names, so the values passed in must be
|
|
78
|
+
* raw too, never the formatted titles shown in the UI.
|
|
79
|
+
*
|
|
80
|
+
* @internal exported for tests
|
|
81
|
+
*/
|
|
82
|
+
export function calculatePredictedValue(data, values) {
|
|
73
83
|
return data.reduce((total, series) => {
|
|
74
84
|
return (total +
|
|
75
85
|
Array.from(series).reduce((acc, item) => {
|
|
@@ -84,15 +94,21 @@ function calculatePredictedValue(data, values) {
|
|
|
84
94
|
}, 0));
|
|
85
95
|
}, 0);
|
|
86
96
|
}
|
|
87
|
-
|
|
97
|
+
/**
|
|
98
|
+
* Raw names of the attribute elements to predict the value for: the element the filter value names, or
|
|
99
|
+
* every element when there is none.
|
|
100
|
+
*
|
|
101
|
+
* @remarks
|
|
102
|
+
* The filter value is a raw element value, so it is matched against the raw name and uri, not against the
|
|
103
|
+
* formatted title (dates, numeric computed attributes) shown in the UI; the raw names are returned to match
|
|
104
|
+
* the raw scope titles in {@link calculatePredictedValue}.
|
|
105
|
+
*
|
|
106
|
+
* @internal exported for tests
|
|
107
|
+
*/
|
|
108
|
+
export function calculateValues(dataView, indexes, value) {
|
|
88
109
|
return findAttributeValues(dataView, indexes)
|
|
89
|
-
.
|
|
90
|
-
.
|
|
91
|
-
if (value) {
|
|
92
|
-
return v === value;
|
|
93
|
-
}
|
|
94
|
-
return true;
|
|
95
|
-
});
|
|
110
|
+
.filter((v) => !value || v.name === value || v.value === value)
|
|
111
|
+
.map((v) => v.name);
|
|
96
112
|
}
|
|
97
113
|
// By display form, not catalog attribute: two display forms of one attribute are two descriptors.
|
|
98
114
|
function findAttributeHeader(dataView, attr) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAlertSupportedMetrics.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/automations/alerting/state/useAlertSupportedMetrics.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,yBAAyB,EAAE,KAAK,QAAQ,EAAE,KAAK,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAYlG,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEzD,MAAM,WAAW,8BAA8B;IAC3C,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,yBAAyB,CAAC;CAC3C;AAED;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CAAC,EACrC,OAAO,EACP,MAAM,EACN,WAAW,GACd,EAAE,8BAA8B,GAAG,sBAAsB,
|
|
1
|
+
{"version":3,"file":"useAlertSupportedMetrics.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/automations/alerting/state/useAlertSupportedMetrics.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,yBAAyB,EAAE,KAAK,QAAQ,EAAE,KAAK,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAYlG,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEzD,MAAM,WAAW,8BAA8B;IAC3C,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,yBAAyB,CAAC;CAC3C;AAED;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CAAC,EACrC,OAAO,EACP,MAAM,EACN,WAAW,GACd,EAAE,8BAA8B,GAAG,sBAAsB,CAiDzD"}
|
|
@@ -17,7 +17,7 @@ import { getSupportedInsightAttributesByInsight, getSupportedInsightMeasuresByIn
|
|
|
17
17
|
* @internal
|
|
18
18
|
*/
|
|
19
19
|
export function useAlertSupportedMetrics({ insight, widget, alertToEdit, }) {
|
|
20
|
-
const { locale, catalogDateDatasets, catalogAttributes } = useAutomationsContext();
|
|
20
|
+
const { locale, separators, catalogDateDatasets, catalogAttributes } = useAutomationsContext();
|
|
21
21
|
const { executionResultByRef } = useAlertingDialogContext();
|
|
22
22
|
const execResult = executionResultByRef(widget?.ref);
|
|
23
23
|
const [effectiveInsight, setEffectiveInsight] = useState(insight);
|
|
@@ -31,7 +31,8 @@ export function useAlertSupportedMetrics({ insight, widget, alertToEdit, }) {
|
|
|
31
31
|
}, [execResult?.executionResult]);
|
|
32
32
|
const supportedMeasures = useMemo(() => getSupportedInsightMeasuresByInsight(effectiveInsight, catalogDateDatasets, alertToEdit), [effectiveInsight, catalogDateDatasets, alertToEdit]);
|
|
33
33
|
const supportedAttributes = useMemo(() => getSupportedInsightAttributesByInsight(insight, catalogAttributes, catalogDateDatasets, alertToEdit), [insight, catalogDateDatasets, catalogAttributes, alertToEdit]);
|
|
34
|
-
|
|
34
|
+
// element values of numeric computed attributes are offered formatted, as the widget shows them
|
|
35
|
+
const { isResultLoading, getAttributeValues, getMetricValue } = useAttributeValuesFromExecResults(execResult, { separators });
|
|
35
36
|
return {
|
|
36
37
|
measureFormatMap,
|
|
37
38
|
supportedMeasures,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DashboardAttachments.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/Attachments/DashboardAttachments.tsx"],"names":[],"mappings":"AAUA,OAAO,EAAE,KAAK,8CAA8C,EAAE,MAAM,mBAAmB,CAAC;AAUxF,wBAAgB,oBAAoB,CAAC,EACjC,gBAAgB,EAChB,gBAAgB,EAChB,4BAA4B,EAC5B,mBAAmB,EACnB,YAAY,EACZ,oBAAoB,EACpB,qBAAqB,EACrB,eAAe,EACf,iBAAiB,EACjB,wBAAwB,GAC3B,EAAE,8CAA8C,
|
|
1
|
+
{"version":3,"file":"DashboardAttachments.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/Attachments/DashboardAttachments.tsx"],"names":[],"mappings":"AAUA,OAAO,EAAE,KAAK,8CAA8C,EAAE,MAAM,mBAAmB,CAAC;AAUxF,wBAAgB,oBAAoB,CAAC,EACjC,gBAAgB,EAChB,gBAAgB,EAChB,4BAA4B,EAC5B,mBAAmB,EACnB,YAAY,EACZ,oBAAoB,EACpB,qBAAqB,EACrB,eAAe,EACf,iBAAiB,EACjB,wBAAwB,GAC3B,EAAE,8CAA8C,2CAqIhD"}
|
|
@@ -44,8 +44,8 @@ export function DashboardAttachments({ dashboardFilters, isCrossFiltering, onDas
|
|
|
44
44
|
setTimeout(() => {
|
|
45
45
|
setAnnouncement(intl.formatMessage({ id: "dialogs.schedule.management.attachments.removed" }, { format: attachment }));
|
|
46
46
|
});
|
|
47
|
-
//
|
|
48
|
-
if (
|
|
47
|
+
// Hidden formats are preserved, but only visible chips can receive focus.
|
|
48
|
+
if (visibleSelectedAttachments.some((att) => att !== attachment)) {
|
|
49
49
|
focusAttachmentGroup();
|
|
50
50
|
}
|
|
51
51
|
else {
|
|
@@ -74,7 +74,7 @@ export function DashboardAttachments({ dashboardFilters, isCrossFiltering, onDas
|
|
|
74
74
|
selected: selectedAttachments.includes(format),
|
|
75
75
|
})), onChange: handleChange, mode: "dashboard", onAddButtonRef: (ref) => {
|
|
76
76
|
addButtonRef.current = ref;
|
|
77
|
-
} }), isCrossFiltering && selectedAttachments.length > 0 ? (_jsx(Message, { type: "progress", className: "gd-attachment-list-message", children: _jsx(FormattedMessage, { id: "dialogs.schedule.management.attachments.message", values: {
|
|
77
|
+
} }), visibleSelectedAttachments.length === 0 && selectedAttachments.length > 0 ? (_jsx(Message, { type: "progress", className: "gd-attachment-list-message", accessibilityConfig: { role: "status" }, children: _jsx(FormattedMessage, { id: "scheduledEmail.attachments.noVisibleAttachments" }) })) : null, isCrossFiltering && selectedAttachments.length > 0 ? (_jsx(Message, { type: "progress", className: "gd-attachment-list-message", children: _jsx(FormattedMessage, { id: "dialogs.schedule.management.attachments.message", values: {
|
|
78
78
|
strong: (chunks) => _jsx("strong", { children: chunks }),
|
|
79
79
|
} }) })) : null] }) }, selectedAttachments.join()), _jsx("div", { className: "sr-only", "aria-live": "polite", "aria-atomic": "true", role: "status", children: announcement })] }));
|
|
80
80
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WidgetAttachments.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/Attachments/WidgetAttachments.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"WidgetAttachments.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/Attachments/WidgetAttachments.tsx"],"names":[],"mappings":"AAUA,OAAO,EAAE,KAAK,2CAA2C,EAAE,MAAM,mBAAmB,CAAC;AAmBrF,wBAAgB,iBAAiB,CAAC,EAC9B,mBAAmB,EACnB,yBAAyB,EACzB,YAAY,EACZ,oBAAoB,EACpB,WAAW,EACX,mBAAmB,EACnB,WAAW,EACX,mBAAmB,EACnB,cAAc,EACd,sBAAsB,EACtB,qBAAqB,EACrB,0BAA0B,EAC1B,eAAe,EACf,iBAAiB,EACjB,wBAAwB,GAC3B,EAAE,2CAA2C,2CAqI7C"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
// (C) 2019-2026 GoodData Corporation
|
|
3
3
|
import { useCallback, useRef, useState } from "react";
|
|
4
|
-
import { useIntl } from "react-intl";
|
|
4
|
+
import { FormattedMessage, useIntl } from "react-intl";
|
|
5
|
+
import { Message } from "@gooddata/sdk-ui-kit";
|
|
5
6
|
import { AUTOMATION_ATTACHMENTS_GROUP_LABEL_ID } from "../../../../../constants/automations.js";
|
|
6
7
|
import { partitionAttachments } from "./attachmentFormats.js";
|
|
7
8
|
import { AttachmentsList } from "./AttachmentsList.js";
|
|
@@ -55,8 +56,8 @@ export function WidgetAttachments({ selectedAttachments, onWidgetAttachmentsChan
|
|
|
55
56
|
setTimeout(() => {
|
|
56
57
|
setAnnouncement(intl.formatMessage({ id: "dialogs.schedule.management.attachments.removed" }, { format: attachment }));
|
|
57
58
|
});
|
|
58
|
-
//
|
|
59
|
-
if (
|
|
59
|
+
// Hidden formats are preserved, but only visible chips can receive focus.
|
|
60
|
+
if (visibleSelectedAttachments.some((att) => att !== attachment)) {
|
|
60
61
|
focusAttachmentGroup();
|
|
61
62
|
}
|
|
62
63
|
else {
|
|
@@ -86,5 +87,5 @@ export function WidgetAttachments({ selectedAttachments, onWidgetAttachmentsChan
|
|
|
86
87
|
selected: selectedAttachments.includes(format),
|
|
87
88
|
})), onChange: handleChange, mode: "widget", onAddButtonRef: (ref) => {
|
|
88
89
|
addButtonRef.current = ref;
|
|
89
|
-
} })] }) }, selectedAttachments.join()), _jsx("div", { className: "sr-only", "aria-live": "polite", "aria-atomic": "true", role: "status", children: announcement })] }));
|
|
90
|
+
} }), visibleSelectedAttachments.length === 0 && selectedAttachments.length > 0 ? (_jsx(Message, { type: "progress", className: "gd-attachment-list-message", accessibilityConfig: { role: "status" }, children: _jsx(FormattedMessage, { id: "scheduledEmail.attachments.noVisibleAttachments" }) })) : null] }) }, selectedAttachments.join()), _jsx("div", { className: "sr-only", "aria-live": "polite", "aria-atomic": "true", role: "status", children: announcement })] }));
|
|
90
91
|
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type ReactElement } from "react";
|
|
2
|
+
import { type ContainerProps } from "react-select";
|
|
3
|
+
import { type IAutomationRecipient } from "@gooddata/sdk-model";
|
|
4
|
+
/**
|
|
5
|
+
* React-select 5.x renders its hidden live region as the first child; rendering it last keeps screen readers
|
|
6
|
+
* from stopping on it between the field label and the recipients. Guarded by RecipientsSelect.test.tsx.
|
|
7
|
+
*/
|
|
8
|
+
export declare function LiveRegionLastSelectContainer(props: ContainerProps<IAutomationRecipient, boolean>): ReactElement;
|
|
9
|
+
//# sourceMappingURL=LiveRegionLastSelectContainer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LiveRegionLastSelectContainer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/RecipientsSelect/LiveRegionLastSelectContainer.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAY,KAAK,YAAY,EAAE,MAAM,OAAO,CAAC;AAEpD,OAAO,EAAE,KAAK,cAAc,EAAc,MAAM,cAAc,CAAC;AAE/D,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAEhE;;;GAGG;AACH,wBAAgB,6BAA6B,CACzC,KAAK,EAAE,cAAc,CAAC,oBAAoB,EAAE,OAAO,CAAC,GACrD,YAAY,CASd"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
// (C) 2026 GoodData Corporation
|
|
3
|
+
import { Children } from "react";
|
|
4
|
+
import { components } from "react-select";
|
|
5
|
+
/**
|
|
6
|
+
* React-select 5.x renders its hidden live region as the first child; rendering it last keeps screen readers
|
|
7
|
+
* from stopping on it between the field label and the recipients. Guarded by RecipientsSelect.test.tsx.
|
|
8
|
+
*/
|
|
9
|
+
export function LiveRegionLastSelectContainer(props) {
|
|
10
|
+
const [liveRegion, ...rest] = Children.toArray(props.children);
|
|
11
|
+
return (_jsxs(components.SelectContainer, { ...props, children: [rest, liveRegion] }));
|
|
12
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RecipientsSelect.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/RecipientsSelect/RecipientsSelect.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,aAAa,EAAW,MAAM,OAAO,CAAC;AAIpD,OAAO,EACH,KAAK,oBAAoB,EACzB,KAAK,8BAA8B,EACnC,KAAK,kCAAkC,EAC1C,MAAM,qBAAqB,CAAC;AAU7B,UAAU,sBAAsB;IAC5B;;OAEG;IACH,KAAK,EAAE,oBAAoB,EAAE,CAAC;IAE9B;;OAEG;IACH,QAAQ,EAAE,CAAC,eAAe,EAAE,oBAAoB,EAAE,KAAK,IAAI,CAAC;IAE5D;;OAEG;IACH,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAElC;;OAEG;IACH,6BAA6B,CAAC,EAAE,OAAO,CAAC;IACxC;;OAEG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B;;OAEG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAElC;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,oBAAoB,CAAC,EAAE,8BAA8B,EAAE,GAAG,kCAAkC,EAAE,CAAC;IAE/F;;OAEG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAE/B;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,eAAe,CAAC,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;IAE7C;;OAEG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAC;CACtC;AAED,wBAAgB,gBAAgB,CAAC,EAC7B,EAAE,EACF,KAAK,EACL,QAAQ,EACR,UAAU,EACV,mBAAmB,EACnB,uBAAuB,EACvB,6BAA6B,EAC7B,aAAa,EACb,SAAS,EACT,oBAAoB,EACpB,qBAAqB,EACrB,SAAgB,EAChB,eAAe,EACf,yBAAyB,GAC5B,EAAE,sBAAsB,
|
|
1
|
+
{"version":3,"file":"RecipientsSelect.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/RecipientsSelect/RecipientsSelect.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,aAAa,EAAW,MAAM,OAAO,CAAC;AAIpD,OAAO,EACH,KAAK,oBAAoB,EACzB,KAAK,8BAA8B,EACnC,KAAK,kCAAkC,EAC1C,MAAM,qBAAqB,CAAC;AAU7B,UAAU,sBAAsB;IAC5B;;OAEG;IACH,KAAK,EAAE,oBAAoB,EAAE,CAAC;IAE9B;;OAEG;IACH,QAAQ,EAAE,CAAC,eAAe,EAAE,oBAAoB,EAAE,KAAK,IAAI,CAAC;IAE5D;;OAEG;IACH,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAElC;;OAEG;IACH,6BAA6B,CAAC,EAAE,OAAO,CAAC;IACxC;;OAEG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B;;OAEG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAElC;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,oBAAoB,CAAC,EAAE,8BAA8B,EAAE,GAAG,kCAAkC,EAAE,CAAC;IAE/F;;OAEG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAE/B;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,eAAe,CAAC,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;IAE7C;;OAEG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAC;CACtC;AAED,wBAAgB,gBAAgB,CAAC,EAC7B,EAAE,EACF,KAAK,EACL,QAAQ,EACR,UAAU,EACV,mBAAmB,EACnB,uBAAuB,EACvB,6BAA6B,EAC7B,aAAa,EACb,SAAS,EACT,oBAAoB,EACpB,qBAAqB,EACrB,SAAgB,EAChB,eAAe,EACf,yBAAyB,GAC5B,EAAE,sBAAsB,2CAwExB"}
|
|
@@ -5,7 +5,7 @@ import { sortBy } from "lodash-es";
|
|
|
5
5
|
import { DETAILED_ANNOUNCEMENT_THRESHOLD, UiSearchResultsAnnouncement } from "@gooddata/sdk-ui-kit";
|
|
6
6
|
import { useWorkspaceUsersSearch } from "../../../../shared/hooks/useWorkspaceUsersSearch.js";
|
|
7
7
|
import { convertUserToAutomationRecipient } from "../../../../shared/utils/automationUtils.js";
|
|
8
|
-
import { createUser, matchRecipient } from "../../../utils/users.js";
|
|
8
|
+
import { createUser, getRecipientLabel, matchRecipient } from "../../../utils/users.js";
|
|
9
9
|
import { isEmail } from "../../../utils/validate.js";
|
|
10
10
|
import { RecipientsSelectRenderer } from "./RecipientsSelectRenderer.js";
|
|
11
11
|
export function RecipientsSelect({ id, value, onChange, loggedUser, allowEmptySelection, allowExternalRecipients, allowOnlyLoggedUserRecipients, maxRecipients, className, notificationChannels, notificationChannelId, showLabel = true, onKeyDownSubmit, externalRecipientOverride, }) {
|
|
@@ -37,6 +37,6 @@ export function RecipientsSelect({ id, value, onChange, loggedUser, allowEmptySe
|
|
|
37
37
|
externalRecipientOverride,
|
|
38
38
|
]);
|
|
39
39
|
const hasSettledResults = !isLoading && (isServerSearch ? users !== undefined : Boolean(search));
|
|
40
|
-
const announcedResultValues = useMemo(() => options.slice(0, DETAILED_ANNOUNCEMENT_THRESHOLD).map(
|
|
41
|
-
return (_jsxs(_Fragment, { children: [_jsx(
|
|
40
|
+
const announcedResultValues = useMemo(() => options.slice(0, DETAILED_ANNOUNCEMENT_THRESHOLD).map(getRecipientLabel), [options]);
|
|
41
|
+
return (_jsxs(_Fragment, { children: [_jsx(RecipientsSelectRenderer, { id: id, canListUsersInProject: true, isMulti: true, options: options, value: value, onChange: onChange, onSearch: onSearch, onActivate: onActivate, isLoading: isLoading, loggedUser: loggedUser, allowOnlyLoggedUserRecipients: allowOnlyLoggedUserRecipients, allowEmptySelection: allowEmptySelection, allowExternalRecipients: allowExternalRecipients, maxRecipients: maxRecipients, className: className, notificationChannel: notificationChannel, usersError: usersError, showLabel: showLabel, onKeyDownSubmit: onKeyDownSubmit, externalRecipientOverride: externalRecipientOverride }), _jsx(UiSearchResultsAnnouncement, { totalResults: hasSettledResults ? options.length : undefined, resultValues: announcedResultValues })] }));
|
|
42
42
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RecipientsSelectRenderer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/RecipientsSelect/RecipientsSelectRenderer.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,aAAa,EAAqE,MAAM,OAAO,CAAC;AAiB9G,OAAO,EACH,KAAK,oBAAoB,EACzB,KAAK,8BAA8B,EACnC,KAAK,kCAAkC,EAE1C,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACH,KAAK,gBAAgB,EAKxB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"RecipientsSelectRenderer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/RecipientsSelect/RecipientsSelectRenderer.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,aAAa,EAAqE,MAAM,OAAO,CAAC;AAiB9G,OAAO,EACH,KAAK,oBAAoB,EACzB,KAAK,8BAA8B,EACnC,KAAK,kCAAkC,EAE1C,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACH,KAAK,gBAAgB,EAKxB,MAAM,kBAAkB,CAAC;AAkG1B,MAAM,WAAW,8BAA8B;IAC3C;;OAEG;IACH,KAAK,EAAE,oBAAoB,EAAE,CAAC;IAE9B;;OAEG;IACH,OAAO,EAAE,oBAAoB,EAAE,CAAC;IAEhC;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,aAAa,EAAE,oBAAoB,EAAE,KAAK,IAAI,CAAC;IAE3D;;OAEG;IACH,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAEnC;;OAEG;IACH,UAAU,EAAE,MAAM,IAAI,CAAC;IAEvB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAE9B;;OAEG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAEhC;;OAEG;IACH,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAElC;;OAEG;IACH,6BAA6B,CAAC,EAAE,OAAO,CAAC;IAExC;;OAEG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B;;OAEG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAElC;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,mBAAmB,CAAC,EAAE,8BAA8B,GAAG,kCAAkC,CAAC;IAE1F;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,eAAe,CAAC,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;IAE7C;;OAEG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAC;CACtC;AAQD,eAAO,MAAM,wBAAwB,8CAC1B,8BAA8B,6CAmwBvC,CAAC"}
|
|
@@ -9,7 +9,10 @@ import { isAutomationUserRecipient, } from "@gooddata/sdk-model";
|
|
|
9
9
|
import { ValidationContextStore, createInvalidDatapoint, createInvalidNode, useValidationContextValue, } from "@gooddata/sdk-ui";
|
|
10
10
|
import { LoadingMask, Message, Overlay, OverlayController, OverlayControllerProvider, UiIcon, UiTooltip, isEscapeKey, makeKeyboardNavigation, } from "@gooddata/sdk-ui-kit";
|
|
11
11
|
import { DASHBOARD_DIALOG_OVERS_Z_INDEX } from "../../../../../constants/zIndex.js";
|
|
12
|
+
import { getRecipientLabel } from "../../../utils/users.js";
|
|
12
13
|
import { isEmail } from "../../../utils/validate.js";
|
|
14
|
+
import { LiveRegionLastSelectContainer } from "./LiveRegionLastSelectContainer.js";
|
|
15
|
+
import { RecipientsSelectionDescription } from "./RecipientsSelectionDescription.js";
|
|
13
16
|
const MAXIMUM_RECIPIENTS_RECEIVE = 60;
|
|
14
17
|
const PADDING = 16;
|
|
15
18
|
const LOADING_MENU_HEIGHT = 50;
|
|
@@ -113,12 +116,12 @@ export const RecipientsSelectRenderer = memo(function RecipientsSelectRenderer(p
|
|
|
113
116
|
const invalidUnknownRecipients = value.filter((v) => v.type === "unknownUser");
|
|
114
117
|
const invalidUnknownError = !!invalidUnknownRecipients.length;
|
|
115
118
|
const invalidRecipientsValues = [...invalidExternalRecipients, ...invalidUnknownRecipients]
|
|
116
|
-
.map(
|
|
119
|
+
.map(getRecipientLabel)
|
|
117
120
|
.join(", ");
|
|
118
121
|
const authorOnlyError = allowOnlyLoggedUserRecipients &&
|
|
119
122
|
((value.length === 1 && value[0].id !== loggedUser?.id) || value.length > 1);
|
|
120
123
|
const missingEmailRecipients = value.filter((v) => !getHasEmail(v));
|
|
121
|
-
const missingEmailRecipientsValues = missingEmailRecipients.map(
|
|
124
|
+
const missingEmailRecipientsValues = missingEmailRecipients.map(getRecipientLabel).join(", ");
|
|
122
125
|
const missingEmailError = !!missingEmailRecipients.length;
|
|
123
126
|
return {
|
|
124
127
|
maxRecipientsError,
|
|
@@ -229,7 +232,7 @@ export const RecipientsSelectRenderer = memo(function RecipientsSelectRenderer(p
|
|
|
229
232
|
const { data, children } = multiValueProps;
|
|
230
233
|
// MultiValueRemove component from react-select
|
|
231
234
|
const removeIcon = children[1];
|
|
232
|
-
const name = data
|
|
235
|
+
const name = getRecipientLabel(data);
|
|
233
236
|
const hasEmail = getHasEmail(data);
|
|
234
237
|
const noExternal = data.type === "externalUser" && !allowExternalRecipients;
|
|
235
238
|
const invalidExternal = data.type === "unknownUser";
|
|
@@ -260,13 +263,16 @@ export const RecipientsSelectRenderer = memo(function RecipientsSelectRenderer(p
|
|
|
260
263
|
return renderEmptyContainer();
|
|
261
264
|
}, [renderEmptyContainer]);
|
|
262
265
|
const renderOptionLabel = useCallback((recipient) => {
|
|
263
|
-
const displayName = recipient
|
|
266
|
+
const displayName = getRecipientLabel(recipient);
|
|
264
267
|
const email = isAutomationUserRecipient(recipient) ? (recipient.email ?? "") : "";
|
|
265
268
|
const renderValue = renderRecipientValue(recipient);
|
|
266
269
|
return (_jsx(UiTooltip, { anchor: _jsxs("div", { className: "gd-recipient-option-item s-gd-recipient-option-item", children: [_jsx("span", { className: "gd-recipient-option-label-item s-gd-recipient-option-label-item", children: displayName }), allowExternalRecipients && recipient.type === "externalUser" ? (_jsxs("span", { className: "gd-recipient-quest", children: ["\u00A0", _jsx(FormattedMessage, { id: "dialogs.schedule.email.user.guest" })] })) : (renderValue), !externalRecipientOverride &&
|
|
267
270
|
allowExternalRecipients &&
|
|
268
271
|
recipient.type === "externalUser" ? (_jsx("div", { className: "gd-recipient-option-label-external-warning", children: _jsx(Message, { type: "warning", children: _jsx(FormattedMessage, { id: "dialogs.schedule.email.user.warning.external", values: { email: displayName } }) }) })) : null] }), content: isEmail(email) ? `${displayName} (${email})` : displayName, variant: "default", arrowPlacement: "right", triggerBy: ["hover", "focus"] }));
|
|
269
272
|
}, [allowExternalRecipients, externalRecipientOverride, renderRecipientValue]);
|
|
273
|
+
const descriptionId = `${id}-description`;
|
|
274
|
+
const errorId = `${id}-error`;
|
|
275
|
+
const ariaDescribedBy = isValid ? descriptionId : `${descriptionId} ${errorId}`;
|
|
270
276
|
const renderInputContainer = useCallback((inputProps) => {
|
|
271
277
|
if (!isMulti) {
|
|
272
278
|
return renderEmptyContainer();
|
|
@@ -287,8 +293,8 @@ export const RecipientsSelectRenderer = memo(function RecipientsSelectRenderer(p
|
|
|
287
293
|
inputProps.innerRef(ref);
|
|
288
294
|
}
|
|
289
295
|
}, autoComplete: "new-password" // common hack for Safari to not autocomplete
|
|
290
|
-
, "aria-invalid": !isValid, "aria-describedby":
|
|
291
|
-
}, [isMulti, id, isValid, renderEmptyContainer]);
|
|
296
|
+
, "aria-invalid": !isValid, "aria-describedby": ariaDescribedBy }) }));
|
|
297
|
+
}, [isMulti, id, isValid, ariaDescribedBy, renderEmptyContainer]);
|
|
292
298
|
const handleKeyboardRecipientRemove = useCallback((index) => {
|
|
293
299
|
if (index < 0 || index >= value.length) {
|
|
294
300
|
return;
|
|
@@ -437,6 +443,7 @@ export const RecipientsSelectRenderer = memo(function RecipientsSelectRenderer(p
|
|
|
437
443
|
}, [canListUsersInProject, onActivate]);
|
|
438
444
|
const creatableSelectComponent = {
|
|
439
445
|
...ReactSelectComponents,
|
|
446
|
+
SelectContainer: LiveRegionLastSelectContainer,
|
|
440
447
|
IndicatorsContainer: renderEmptyContainer,
|
|
441
448
|
Input: renderInputContainer,
|
|
442
449
|
MultiValueContainer: renderMultiValueContainer,
|
|
@@ -496,5 +503,5 @@ export const RecipientsSelectRenderer = memo(function RecipientsSelectRenderer(p
|
|
|
496
503
|
// Options arrive pre-filtered (server search, or the owner's options memo).
|
|
497
504
|
filterOption: null, isClearable: false, isDisabled: !isMulti, isMulti: isMulti, onChange:
|
|
498
505
|
// using as any as it would be too tricky to type properly
|
|
499
|
-
handleOnChange, onInputChange: handleSearchChange, onMenuOpen: onMenuOpen, onMenuClose: () => setState((prev) => ({ ...prev, menuOpen: false })), onKeyDown: handleKeyDown, options: options, onBlur: onBlur, value: value, getOptionValue: (o) => o.id, getOptionLabel:
|
|
506
|
+
handleOnChange, onInputChange: handleSearchChange, onMenuOpen: onMenuOpen, onMenuClose: () => setState((prev) => ({ ...prev, menuOpen: false })), onKeyDown: handleKeyDown, options: options, onBlur: onBlur, value: value, getOptionValue: (o) => o.id, getOptionLabel: getRecipientLabel, "aria-invalid": !isValid }), _jsx(RecipientsSelectionDescription, { id: descriptionId, recipients: value }), isValid ? (renderExternalRecipientsNote ? (_jsx("div", { className: "gd-recipients-field-note", children: _jsx(FormattedMessage, { id: "dialogs.schedule.email.recipients.note" }) })) : allowOnlyLoggedUserRecipients ? (_jsx("div", { className: "gd-recipients-field-note", children: _jsx(FormattedMessage, { id: "dialogs.schedule.email.destinationWarning" }) })) : null) : (_jsx("div", { id: errorId, className: "gd-recipients-field-error", children: getInvalidDatapoints().map((invalidDatapoint) => (_jsx("div", { id: invalidDatapoint.id, className: "gd-recipients-field-error-item", children: invalidDatapoint.message }, invalidDatapoint.id))) }))] })] }) }));
|
|
500
507
|
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type ReactElement } from "react";
|
|
2
|
+
import { type IAutomationRecipient } from "@gooddata/sdk-model";
|
|
3
|
+
interface IRecipientsSelectionDescriptionProps {
|
|
4
|
+
id: string;
|
|
5
|
+
recipients: readonly IAutomationRecipient[];
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Hidden screen reader description of the selected recipients, referenced by the recipients input.
|
|
9
|
+
*/
|
|
10
|
+
export declare function RecipientsSelectionDescription({ id, recipients, }: IRecipientsSelectionDescriptionProps): ReactElement;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=RecipientsSelectionDescription.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RecipientsSelectionDescription.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/RecipientsSelect/RecipientsSelectionDescription.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,OAAO,CAAC;AAI1C,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AA8BhE,UAAU,oCAAoC;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,SAAS,oBAAoB,EAAE,CAAC;CAC/C;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAAC,EAC3C,EAAE,EACF,UAAU,GACb,EAAE,oCAAoC,GAAG,YAAY,CAQrD"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { defineMessages, useIntl } from "react-intl";
|
|
3
|
+
import { DETAILED_ANNOUNCEMENT_THRESHOLD } from "@gooddata/sdk-ui-kit";
|
|
4
|
+
import { getRecipientLabel } from "../../../utils/users.js";
|
|
5
|
+
const messages = defineMessages({
|
|
6
|
+
selectedNone: { id: "dialogs.schedule.email.recipients.selected.none" },
|
|
7
|
+
selectedFew: { id: "dialogs.schedule.email.recipients.selected.few" },
|
|
8
|
+
selectedMany: { id: "dialogs.schedule.email.recipients.selected.many" },
|
|
9
|
+
navigationHint: { id: "dialogs.schedule.email.recipients.navigationHint" },
|
|
10
|
+
});
|
|
11
|
+
function describeRecipients(intl, recipients) {
|
|
12
|
+
const count = recipients.length;
|
|
13
|
+
if (count === 0) {
|
|
14
|
+
return intl.formatMessage(messages.selectedNone);
|
|
15
|
+
}
|
|
16
|
+
const selection = count <= DETAILED_ANNOUNCEMENT_THRESHOLD
|
|
17
|
+
? intl.formatMessage(messages.selectedFew, {
|
|
18
|
+
count,
|
|
19
|
+
names: intl.formatList(recipients.map(getRecipientLabel), { type: "unit" }),
|
|
20
|
+
})
|
|
21
|
+
: intl.formatMessage(messages.selectedMany, { count });
|
|
22
|
+
return `${selection} ${intl.formatMessage(messages.navigationHint)}`;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Hidden screen reader description of the selected recipients, referenced by the recipients input.
|
|
26
|
+
*/
|
|
27
|
+
export function RecipientsSelectionDescription({ id, recipients, }) {
|
|
28
|
+
const intl = useIntl();
|
|
29
|
+
return (_jsx("span", { id: id, hidden: true, children: describeRecipients(intl, recipients) }));
|
|
30
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type IAutomationRecipient } from "@gooddata/sdk-model";
|
|
2
2
|
export declare function matchRecipient(user: IAutomationRecipient, search: string): boolean;
|
|
3
|
+
export declare function getRecipientLabel(recipient: IAutomationRecipient): string;
|
|
3
4
|
export declare function createUser(search: string): IAutomationRecipient;
|
|
4
5
|
//# sourceMappingURL=users.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"users.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/automations/scheduledEmail/utils/users.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,oBAAoB,EAAkC,MAAM,qBAAqB,CAAC;AAIhG,wBAAgB,cAAc,CAAC,IAAI,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,WAexE;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,oBAAoB,CAQ/D"}
|
|
1
|
+
{"version":3,"file":"users.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/automations/scheduledEmail/utils/users.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,oBAAoB,EAAkC,MAAM,qBAAqB,CAAC;AAIhG,wBAAgB,cAAc,CAAC,IAAI,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,WAexE;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,oBAAoB,GAAG,MAAM,CAEzE;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,oBAAoB,CAQ/D"}
|
|
@@ -14,6 +14,9 @@ export function matchRecipient(user, search) {
|
|
|
14
14
|
lowerCaseId?.includes(lowerCaseSearch)) ??
|
|
15
15
|
false);
|
|
16
16
|
}
|
|
17
|
+
export function getRecipientLabel(recipient) {
|
|
18
|
+
return recipient.name || recipient.id;
|
|
19
|
+
}
|
|
17
20
|
export function createUser(search) {
|
|
18
21
|
const hasEmail = isEmail(search);
|
|
19
22
|
return {
|
|
@@ -39,6 +39,10 @@ export declare const getFilterByLocalIdentifier: (localIdentifier: string | unde
|
|
|
39
39
|
*/
|
|
40
40
|
export declare function isAllTimeDateFilterFixed(f: IFilter): boolean;
|
|
41
41
|
export declare function areFiltersEqual(filter1: IFilter, filter2: IFilter): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Values to compare date filters by. A bounded range never matches an empty date, so a missing
|
|
44
|
+
* `emptyValueHandling` counts as "exclude" there; on an all-time filter it means no filtering at all.
|
|
45
|
+
*/
|
|
42
46
|
export declare function dateFilterValues(filter: IDateFilter): import("@gooddata/sdk-model").IAbsoluteDateFilterValues | import("@gooddata/sdk-model").IRelativeDateFilterValues;
|
|
43
47
|
export declare function isFilterIgnoredByWidget(filter: FilterContextItem, widget: ExtendedDashboardWidget): boolean;
|
|
44
48
|
export declare function isFilterMatch(filter1: IFilter, filter2: IFilter): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/automations/shared/automationFilters/utils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,EACH,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,+BAA+B,EACpC,KAAK,8BAA8B,EACnC,KAAK,kCAAkC,EACvC,KAAK,WAAW,EAChB,KAAK,OAAO,EACZ,KAAK,MAAM,EA6Bd,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AAEtF,eAAO,MAAM,wBAAwB,WAAY,iBAAiB,KAAG,MAAM,GAAG,SAE7E,CAAC;AAEF,eAAO,MAAM,iCAAiC,YAAa,iBAAiB,EAAE,KAAG,OAEhF,CAAC;AAEF,eAAO,MAAM,6BAA6B,YAC7B,iBAAiB,WACjB,iBAAiB,KAC3B,OAEF,CAAC;AAEF;;;GAGG;AACH,wBAAgB,iBAAiB,CAC7B,OAAO,EAAE,iBAAiB,EAAE,EAC5B,OAAO,EAAE,iBAAiB,GAC3B,iBAAiB,EAAE,CAErB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC5B,OAAO,EAAE,iBAAiB,EAAE,EAC5B,QAAQ,EAAE,iBAAiB,GAC5B,iBAAiB,EAAE,CAErB;AAiBD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAC9B,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,iBAAiB,EAAE,EAC/B,UAAU,EAAE,iBAAiB,EAAE,EAC/B,YAAY,EAAE,mBAAmB,EAAE,GACpC,iBAAiB,GAAG,SAAS,CAuB/B;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACjC,cAAc,EAAE,MAAM,EACtB,gBAAgB,EAAE,iBAAiB,EAAE,EACrC,UAAU,EAAE,iBAAiB,EAAE,EAC/B,YAAY,EAAE,mBAAmB,EAAE,GACpC,iBAAiB,GAAG,SAAS,CAmB/B;AAED,eAAO,MAAM,qBAAqB,eAClB,iBAAiB,EAAE,mBACd,iBAAiB,EAAE,wBAOvC,CAAC;AAEF,eAAO,MAAM,6BAA6B,YAC7B,iBAAiB,EAAE,cAChB,iBAAiB,EAAE,oBACb,+BAA+B,EAAE,KACpD,iBAAiB,EAsBnB,CAAC;AAEF,eAAO,MAAM,2BAA2B,YAC3B,iBAAiB,EAAE,YAClB,eAAe,EAAE,cACf,kCAAkC,EAAE,KACjD,eAAe,EAiBjB,CAAC;AAEF,eAAO,MAAM,+BAA+B,YAC/B,iBAAiB,EAAE,eACf,mBAAmB,EAAE,eACrB,8BAA8B,EAAE,KAC9C,mBAAmB,EAoBrB,CAAC;AAEF,eAAO,MAAM,yBAAyB,QAC7B,MAAM,WACF,iBAAiB,EAAE,KAC7B,iBAAiB,GAAG,SAWtB,CAAC;AAEF,eAAO,MAAM,mBAAmB,YACnB,iBAAiB,EAAE,GAAG,SAAS,oBACtB,+BAA+B,EAAE,eACtC,8BAA8B,EAAE,cACjC,kCAAkC,EAAE,4BACtB,OAAO,sBACb,OAAO,KAC5B,iBAAiB,EAwBnB,CAAC;AAEF,eAAO,MAAM,0BAA0B,oBAClB,MAAM,GAAG,SAAS,WAC1B,iBAAiB,EAAE,KAC7B,iBAAiB,GAAG,SAStB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAuB5D;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAyD3E;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/automations/shared/automationFilters/utils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,EACH,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,+BAA+B,EACpC,KAAK,8BAA8B,EACnC,KAAK,kCAAkC,EACvC,KAAK,WAAW,EAChB,KAAK,OAAO,EACZ,KAAK,MAAM,EA6Bd,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AAEtF,eAAO,MAAM,wBAAwB,WAAY,iBAAiB,KAAG,MAAM,GAAG,SAE7E,CAAC;AAEF,eAAO,MAAM,iCAAiC,YAAa,iBAAiB,EAAE,KAAG,OAEhF,CAAC;AAEF,eAAO,MAAM,6BAA6B,YAC7B,iBAAiB,WACjB,iBAAiB,KAC3B,OAEF,CAAC;AAEF;;;GAGG;AACH,wBAAgB,iBAAiB,CAC7B,OAAO,EAAE,iBAAiB,EAAE,EAC5B,OAAO,EAAE,iBAAiB,GAC3B,iBAAiB,EAAE,CAErB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC5B,OAAO,EAAE,iBAAiB,EAAE,EAC5B,QAAQ,EAAE,iBAAiB,GAC5B,iBAAiB,EAAE,CAErB;AAiBD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAC9B,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,iBAAiB,EAAE,EAC/B,UAAU,EAAE,iBAAiB,EAAE,EAC/B,YAAY,EAAE,mBAAmB,EAAE,GACpC,iBAAiB,GAAG,SAAS,CAuB/B;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACjC,cAAc,EAAE,MAAM,EACtB,gBAAgB,EAAE,iBAAiB,EAAE,EACrC,UAAU,EAAE,iBAAiB,EAAE,EAC/B,YAAY,EAAE,mBAAmB,EAAE,GACpC,iBAAiB,GAAG,SAAS,CAmB/B;AAED,eAAO,MAAM,qBAAqB,eAClB,iBAAiB,EAAE,mBACd,iBAAiB,EAAE,wBAOvC,CAAC;AAEF,eAAO,MAAM,6BAA6B,YAC7B,iBAAiB,EAAE,cAChB,iBAAiB,EAAE,oBACb,+BAA+B,EAAE,KACpD,iBAAiB,EAsBnB,CAAC;AAEF,eAAO,MAAM,2BAA2B,YAC3B,iBAAiB,EAAE,YAClB,eAAe,EAAE,cACf,kCAAkC,EAAE,KACjD,eAAe,EAiBjB,CAAC;AAEF,eAAO,MAAM,+BAA+B,YAC/B,iBAAiB,EAAE,eACf,mBAAmB,EAAE,eACrB,8BAA8B,EAAE,KAC9C,mBAAmB,EAoBrB,CAAC;AAEF,eAAO,MAAM,yBAAyB,QAC7B,MAAM,WACF,iBAAiB,EAAE,KAC7B,iBAAiB,GAAG,SAWtB,CAAC;AAEF,eAAO,MAAM,mBAAmB,YACnB,iBAAiB,EAAE,GAAG,SAAS,oBACtB,+BAA+B,EAAE,eACtC,8BAA8B,EAAE,cACjC,kCAAkC,EAAE,4BACtB,OAAO,sBACb,OAAO,KAC5B,iBAAiB,EAwBnB,CAAC;AAEF,eAAO,MAAM,0BAA0B,oBAClB,MAAM,GAAG,SAAS,WAC1B,iBAAiB,EAAE,KAC7B,iBAAiB,GAAG,SAStB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAuB5D;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAyD3E;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,qHAUnD;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,uBAAuB,GAAG,OAAO,CA+B3G;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAazE;AAED,eAAO,MAAM,cAAc,WACf,iBAAiB,iBACV,iBAAiB,EAAE,mBACjB,mBAAmB,EAAE,QAChC,SAAS,KAChB,MAyCF,CAAC"}
|
|
@@ -226,8 +226,8 @@ export function areFiltersEqual(filter1, filter2) {
|
|
|
226
226
|
else if (isAbsoluteDateFilter(filter1) && isAbsoluteDateFilter(filter2)) {
|
|
227
227
|
// An automation does not store a granularity that has no period literal, so the granularity counts
|
|
228
228
|
// only when both filters have one.
|
|
229
|
-
const { granularity: granularity1, ...values1 } =
|
|
230
|
-
const { granularity: granularity2, ...values2 } =
|
|
229
|
+
const { granularity: granularity1, ...values1 } = dateFilterValues(filter1);
|
|
230
|
+
const { granularity: granularity2, ...values2 } = dateFilterValues(filter2);
|
|
231
231
|
return (isEqual(values1, values2) &&
|
|
232
232
|
(granularity1 === undefined || granularity2 === undefined || granularity1 === granularity2));
|
|
233
233
|
}
|
|
@@ -237,11 +237,18 @@ export function areFiltersEqual(filter1, filter2) {
|
|
|
237
237
|
// Filter types are different
|
|
238
238
|
return isEqual(filter1, filter2);
|
|
239
239
|
}
|
|
240
|
+
/**
|
|
241
|
+
* Values to compare date filters by. A bounded range never matches an empty date, so a missing
|
|
242
|
+
* `emptyValueHandling` counts as "exclude" there; on an all-time filter it means no filtering at all.
|
|
243
|
+
*/
|
|
240
244
|
export function dateFilterValues(filter) {
|
|
241
|
-
|
|
242
|
-
|
|
245
|
+
const values = isAbsoluteDateFilter(filter)
|
|
246
|
+
? absoluteDateFilterValues(filter)
|
|
247
|
+
: relativeDateFilterValues(filter);
|
|
248
|
+
if (values.emptyValueHandling !== undefined || isAllTimeDateFilterFixed(filter)) {
|
|
249
|
+
return values;
|
|
243
250
|
}
|
|
244
|
-
return
|
|
251
|
+
return { ...values, emptyValueHandling: "exclude" };
|
|
245
252
|
}
|
|
246
253
|
export function isFilterIgnoredByWidget(filter, widget) {
|
|
247
254
|
if (!isInsightWidget(widget)) {
|
|
@@ -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;
|
|
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;
|
|
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;AA6E1C,wBAAgB,oBAAoB,4CAInC;AAID,wBAAgB,eAAe,IAAI,YAAY,CA6B9C"}
|
|
@@ -1,6 +1,4 @@
|
|
|
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 { selectIsAiLoading } from "../../../model/store/config/configSelectors.js";
|
|
4
2
|
import { ScheduledEmailAutomationsProvider, ScheduledEmailConnector, } from "../../automations/connectors/ScheduledEmailConnector.js";
|
|
5
3
|
import { CancelEditDialog } from "../../cancelEditDialog/CancelEditDialog.js";
|
|
6
4
|
import { useCancelEditDialog } from "../../cancelEditDialog/DefaultCancelEditDialog.js";
|
|
@@ -21,6 +19,7 @@ import { useTopBarProps } from "../../topBar/topBar/DefaultTopBar.js";
|
|
|
21
19
|
import { TopBar } from "../../topBar/topBar/TopBar.js";
|
|
22
20
|
import { useWidgetDeleteDialogProps } from "../../widgetDeleteDialog/DefaultWidgetDeleteDialog.js";
|
|
23
21
|
import { WidgetDeleteDialog } from "../../widgetDeleteDialog/WidgetDeleteDialog.js";
|
|
22
|
+
import { DashboardInteractionLock } from "../components/DashboardInteractionLock.js";
|
|
24
23
|
import { ToastMessages } from "../components/ToastMessages.js";
|
|
25
24
|
import { AlertingDialogProvider } from "./AlertingDialogProvider.js";
|
|
26
25
|
import { DashboardTabs, useDashboardTabsProps } from "./DashboardTabs.js";
|
|
@@ -55,10 +54,6 @@ function TopBarWrapper() {
|
|
|
55
54
|
}
|
|
56
55
|
function FilterBarWrapper() {
|
|
57
56
|
const filterBarProps = useFilterBarProps();
|
|
58
|
-
const isAiLoading = useDashboardSelector(selectIsAiLoading);
|
|
59
|
-
if (isAiLoading) {
|
|
60
|
-
return null;
|
|
61
|
-
}
|
|
62
57
|
return _jsx(FilterBar, { ...filterBarProps });
|
|
63
58
|
}
|
|
64
59
|
function CancelEditDialogWrapper() {
|
|
@@ -67,14 +62,10 @@ function CancelEditDialogWrapper() {
|
|
|
67
62
|
}
|
|
68
63
|
export function DashboardTabsWrapper() {
|
|
69
64
|
const dashboardTabsProps = useDashboardTabsProps();
|
|
70
|
-
const isAiLoading = useDashboardSelector(selectIsAiLoading);
|
|
71
|
-
if (isAiLoading) {
|
|
72
|
-
return null;
|
|
73
|
-
}
|
|
74
65
|
return _jsx(DashboardTabs, { ...dashboardTabsProps });
|
|
75
66
|
}
|
|
76
67
|
// split the header parts of the dashboard so that changes to their state
|
|
77
68
|
// (e.g. opening email dialog) do not re-render the dashboard body
|
|
78
69
|
export function DashboardHeader() {
|
|
79
|
-
return (_jsxs(_Fragment, { children: [_jsx(ToastMessages, {}), _jsx(ExportXlsxDialogProvider, {}), _jsx(ExportCsvDialogProvider, {}), _jsx(ExportTabularPdfDialogProvider, {}), _jsx(ExportTemplateDialogProvider, {}), _jsx(ScheduledEmailAutomationsProvider, { children: _jsx(ScheduledEmailConnector, {}) }), _jsx(AlertingDialogProvider, {}), _jsx(ShareDialogDashboardHeader, {}), _jsx(SettingsDialogProvider, {}), _jsx(DensityDialogProvider, {}), _jsx(TimezoneDialogProvider, {}), _jsx(DeleteDialogWrapper, {}), _jsx(WidgetDeleteDialogWrapper, {}), _jsx(KpiDeleteDialogWrapper, {}), _jsx(SaveAsDialogWrapper, {}), _jsx(InsightNotSavedDialogWrapper, {}), _jsx(TopBarWrapper, {}), _jsx(DashboardTabsWrapper, {}), _jsx(FilterBarWrapper, {}), _jsx(CancelEditDialogWrapper, {})] }));
|
|
70
|
+
return (_jsxs(_Fragment, { children: [_jsx(ToastMessages, {}), _jsx(ExportXlsxDialogProvider, {}), _jsx(ExportCsvDialogProvider, {}), _jsx(ExportTabularPdfDialogProvider, {}), _jsx(ExportTemplateDialogProvider, {}), _jsx(ScheduledEmailAutomationsProvider, { children: _jsx(ScheduledEmailConnector, {}) }), _jsx(AlertingDialogProvider, {}), _jsx(ShareDialogDashboardHeader, {}), _jsx(SettingsDialogProvider, {}), _jsx(DensityDialogProvider, {}), _jsx(TimezoneDialogProvider, {}), _jsx(DeleteDialogWrapper, {}), _jsx(WidgetDeleteDialogWrapper, {}), _jsx(KpiDeleteDialogWrapper, {}), _jsx(SaveAsDialogWrapper, {}), _jsx(InsightNotSavedDialogWrapper, {}), _jsx(TopBarWrapper, {}), _jsxs(DashboardInteractionLock, { children: [_jsx(DashboardTabsWrapper, {}), _jsx(FilterBarWrapper, {})] }), _jsx(CancelEditDialogWrapper, {})] }));
|
|
80
71
|
}
|
|
@@ -1 +1 @@
|
|
|
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,EAEH,KAAK,qCAAqC,EAC1C,KAAK,qCAAqC,EAC7C,MAAM,4BAA4B,CAAC;
|
|
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,EAEH,KAAK,qCAAqC,EAC1C,KAAK,qCAAqC,EAC7C,MAAM,4BAA4B,CAAC;AAkBpC,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,2CAyIvD"}
|
|
@@ -9,6 +9,9 @@ import { useDashboardSelector } from "../../../model/react/DashboardStoreProvide
|
|
|
9
9
|
import { selectSupportsRichTextWidgets } from "../../../model/store/backendCapabilities/backendCapabilitiesSelectors.js";
|
|
10
10
|
import { selectIsAiLoading } from "../../../model/store/config/configSelectors.js";
|
|
11
11
|
import { selectIsNewDashboard } from "../../../model/store/meta/metaSelectors.js";
|
|
12
|
+
import { InsightEditorCreatePanelItem } from "../../insightEditor/InsightEditorCreatePanelItem.js";
|
|
13
|
+
import { InsightEditorPlaceholder } from "../../insightEditor/InsightEditorPlaceholder.js";
|
|
14
|
+
import { useCanCreateInsightInEditor } from "../../insightEditor/useCanCreateInsightInEditor.js";
|
|
12
15
|
import { DraggableInsightList } from "./DraggableInsightList/DraggableInsightList.js";
|
|
13
16
|
import { SidebarCollapseToggle } from "./SidebarCollapseToggle.js";
|
|
14
17
|
import { useResizableSidebar } from "./useResizableSidebarState.js";
|
|
@@ -35,9 +38,14 @@ export function CreationPanel(props) {
|
|
|
35
38
|
const RichTextWidgetComponentSet = props.RichTextWidgetComponentSet;
|
|
36
39
|
const VisualizationSwitcherWidgetComponentSet = props.VisualizationSwitcherWidgetComponentSet;
|
|
37
40
|
const DashboardLayoutWidgetComponentSet = props.DashboardLayoutWidgetComponentSet;
|
|
41
|
+
const canCreateInsightInEditor = useCanCreateInsightInEditor();
|
|
38
42
|
const addItemPanelItems = useMemo(() => {
|
|
43
|
+
// A customization can wrap one of the two editor components, so either of them marks the editor.
|
|
44
|
+
const creating = InsightWidgetComponentSet.creating;
|
|
45
|
+
const isInsightEditorItem = creating?.CreatePanelListItemComponent === InsightEditorCreatePanelItem ||
|
|
46
|
+
creating?.CreatingPlaceholderComponent === InsightEditorPlaceholder;
|
|
39
47
|
const items = compact([
|
|
40
|
-
InsightWidgetComponentSet.creating,
|
|
48
|
+
(!isInsightEditorItem || canCreateInsightInEditor) && InsightWidgetComponentSet.creating,
|
|
41
49
|
AttributeFilterComponentSet.creating,
|
|
42
50
|
DashboardLayoutWidgetComponentSet.creating,
|
|
43
51
|
VisualizationSwitcherWidgetComponentSet.creating,
|
|
@@ -61,6 +69,7 @@ export function CreationPanel(props) {
|
|
|
61
69
|
WrapCreatePanelItemWithDragComponent,
|
|
62
70
|
isAiLoading,
|
|
63
71
|
isRailCollapsed,
|
|
72
|
+
canCreateInsightInEditor,
|
|
64
73
|
]);
|
|
65
74
|
return (_jsx("div", { className: cx("configuration-panel creation-panel", className), children: _jsxs("div", { className: "configuration-panel-content", children: [_jsxs("div", { className: "gd-creation-panel-header flex-panel-item-nostretch", children: [canCollapse ? (_jsx(SidebarCollapseToggle, { isCollapsed: isCollapsed, onToggle: () => {
|
|
66
75
|
setFocusSearch(false);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardContentLoader.d.ts","sourceRoot":"","sources":["../../../../src/presentation/dashboard/DefaultDashboardContent/DashboardContentLoader.tsx"],"names":[],"mappings":"AA0BA;;GAEG;AACH,wBAAgB,sBAAsB,4CAgCrC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
// (C) 2026 GoodData Corporation
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import { FormattedMessage } from "react-intl";
|
|
5
|
+
import { UiSkeleton } from "@gooddata/sdk-ui-kit";
|
|
6
|
+
function createDashboardContentLoaderRow() {
|
|
7
|
+
if (Math.random() < 0.5) {
|
|
8
|
+
return { widths: [50, 50] };
|
|
9
|
+
}
|
|
10
|
+
const firstDivider = Math.floor(Math.random() * 41);
|
|
11
|
+
const secondDivider = Math.floor(Math.random() * 41);
|
|
12
|
+
const [lowerDivider, upperDivider] = [firstDivider, secondDivider].sort((a, b) => a - b);
|
|
13
|
+
return {
|
|
14
|
+
widths: [20 + lowerDivider, 20 + upperDivider - lowerDivider, 60 - upperDivider],
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* @internal
|
|
19
|
+
*/
|
|
20
|
+
export function DashboardContentLoader() {
|
|
21
|
+
const [row] = useState(() => createDashboardContentLoaderRow());
|
|
22
|
+
return (_jsxs("div", { className: "gd-dashboard-content-loader", role: "status", children: [_jsx("span", { className: "gd-dashboard-content-loader__status", children: _jsx(FormattedMessage, { id: "loading" }) }), _jsx("div", { className: "gd-dashboard-content-loader__charts", "data-testid": "dashboard-content-loader-row", "aria-hidden": "true", style: {
|
|
23
|
+
"--dashboard-content-loader-columns": row.widths
|
|
24
|
+
.map((width) => `minmax(0, ${width}fr)`)
|
|
25
|
+
.join(" "),
|
|
26
|
+
}, children: Array.from({ length: row.widths.length }, (_, index) => (_jsx("div", { className: "gd-dashboard-content-loader__chart", "data-testid": "dashboard-content-loader-chart", children: _jsx(UiSkeleton, { itemHeight: 440, itemWidth: "45%" }) }, index))) })] }));
|
|
27
|
+
}
|