@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.
- package/NOTICE +59 -9
- package/esm/__version.d.ts +1 -1
- package/esm/__version.js +1 -1
- package/esm/index.d.ts +6 -6
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +3 -4
- package/esm/internal.d.ts +1 -1
- package/esm/internal.d.ts.map +1 -1
- package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/resolveDashboardConfig.d.ts.map +1 -1
- package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/resolveDashboardConfig.js +2 -0
- package/esm/model/commandHandlers/dashboard/saveDashboardHandler.d.ts.map +1 -1
- package/esm/model/commandHandlers/dashboard/saveDashboardHandler.js +43 -8
- package/esm/model/react/useInitializeDashboardStore.d.ts.map +1 -1
- package/esm/model/react/useInitializeDashboardStore.js +11 -0
- package/esm/model/store/config/configReducers.d.ts +8 -0
- package/esm/model/store/config/configReducers.d.ts.map +1 -1
- package/esm/model/store/config/configReducers.js +12 -0
- package/esm/model/store/config/configSelectors.d.ts +12 -0
- package/esm/model/store/config/configSelectors.d.ts.map +1 -1
- package/esm/model/store/config/configSelectors.js +16 -0
- package/esm/model/store/config/index.d.ts +2 -0
- package/esm/model/store/config/index.d.ts.map +1 -1
- package/esm/model/store/dashboardStore.d.ts.map +1 -1
- package/esm/model/store/dashboardStore.js +1 -0
- package/esm/model/store/drill/drillReducers.d.ts.map +1 -1
- package/esm/model/store/drill/drillReducers.js +2 -1
- package/esm/model/types/commonTypes.d.ts +21 -0
- package/esm/model/types/commonTypes.d.ts.map +1 -1
- package/esm/presentation/automations/alerting/DefaultAlertingDialog/AlertingDialogHeader.d.ts +1 -11
- package/esm/presentation/automations/alerting/DefaultAlertingDialog/AlertingDialogHeader.d.ts.map +1 -1
- package/esm/presentation/automations/alerting/DefaultAlertingDialog/AlertingDialogHeader.js +7 -11
- package/esm/presentation/automations/alerting/DefaultAlertingDialog/DefaultAlertingDialog.d.ts +6 -3
- package/esm/presentation/automations/alerting/DefaultAlertingDialog/DefaultAlertingDialog.d.ts.map +1 -1
- package/esm/presentation/automations/alerting/DefaultAlertingDialog/DefaultAlertingDialog.js +25 -6
- package/esm/presentation/automations/alerting/state/AlertingDialogStateProvider.d.ts +1 -5
- package/esm/presentation/automations/alerting/state/AlertingDialogStateProvider.d.ts.map +1 -1
- package/esm/presentation/automations/alerting/state/AlertingDialogStateProvider.js +1 -5
- package/esm/presentation/automations/alerting/state/useAlertFormState.d.ts +1 -1
- package/esm/presentation/automations/alerting/state/useAlertFormState.d.ts.map +1 -1
- package/esm/presentation/automations/alerting/state/useAlertFormState.js +5 -4
- package/esm/presentation/automations/alerting/types.d.ts +51 -15
- package/esm/presentation/automations/alerting/types.d.ts.map +1 -1
- package/esm/presentation/automations/contexts/AlertingDialogContext.d.ts +0 -26
- package/esm/presentation/automations/contexts/AlertingDialogContext.d.ts.map +1 -1
- package/esm/presentation/automations/contexts/AlertingDialogContext.js +0 -26
- package/esm/presentation/automations/contexts/ScheduledEmailDialogContext.d.ts +0 -9
- package/esm/presentation/automations/contexts/ScheduledEmailDialogContext.d.ts.map +1 -1
- package/esm/presentation/automations/contexts/ScheduledEmailDialogContext.js +0 -9
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/DefaultScheduledEmailDialog.d.ts +23 -3
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/DefaultScheduledEmailDialog.d.ts.map +1 -1
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/DefaultScheduledEmailDialog.js +43 -6
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/Header/ScheduleEmailDialogHeader.d.ts +1 -12
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/Header/ScheduleEmailDialogHeader.d.ts.map +1 -1
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/Header/ScheduleEmailDialogHeader.js +10 -14
- package/esm/presentation/automations/scheduledEmail/state/useScheduledEmailFormState.d.ts +1 -1
- package/esm/presentation/automations/scheduledEmail/state/useScheduledEmailFormState.d.ts.map +1 -1
- package/esm/presentation/automations/scheduledEmail/state/useScheduledEmailFormState.js +3 -2
- package/esm/presentation/automations/scheduledEmail/types.d.ts +55 -15
- package/esm/presentation/automations/scheduledEmail/types.d.ts.map +1 -1
- package/esm/presentation/automations/shared/automationFilters/components/AutomationParameter.d.ts.map +1 -1
- package/esm/presentation/automations/shared/automationFilters/components/AutomationParameter.js +2 -2
- package/esm/presentation/automations/shared/filters/conversions.d.ts +6 -6
- package/esm/presentation/automations/shared/filters/conversions.d.ts.map +1 -1
- package/esm/presentation/automations/shared/filters/conversions.js +48 -30
- package/esm/presentation/automations/shared/filters/index.d.ts +1 -1
- package/esm/presentation/automations/shared/filters/index.d.ts.map +1 -1
- package/esm/presentation/automations/shared/filters/index.js +1 -1
- package/esm/presentation/automations/shared/slots/types.d.ts +58 -0
- package/esm/presentation/automations/shared/slots/types.d.ts.map +1 -0
- package/esm/presentation/automations/shared/slots/types.js +2 -0
- package/esm/presentation/automations/shared/utils/automationTitle.d.ts +5 -0
- package/esm/presentation/automations/shared/utils/automationTitle.d.ts.map +1 -0
- package/esm/presentation/automations/shared/utils/automationTitle.js +7 -0
- 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 +10 -0
- package/esm/presentation/dashboard/DashboardSidebar/CreationPanel.d.ts.map +1 -1
- package/esm/presentation/dashboard/DashboardSidebar/CreationPanel.js +5 -2
- package/esm/presentation/dashboard/DashboardSidebar/DraggableInsightList/DraggableInsightList.d.ts +2 -1
- package/esm/presentation/dashboard/DashboardSidebar/DraggableInsightList/DraggableInsightList.d.ts.map +1 -1
- package/esm/presentation/dashboard/DashboardSidebar/DraggableInsightList/DraggableInsightList.js +2 -2
- package/esm/presentation/dashboard/DashboardSidebar/DraggableInsightList/DraggableInsightListCore.d.ts +1 -1
- package/esm/presentation/dashboard/DashboardSidebar/DraggableInsightList/DraggableInsightListCore.d.ts.map +1 -1
- package/esm/presentation/dashboard/DashboardSidebar/DraggableInsightList/DraggableInsightListCore.js +3 -3
- package/esm/presentation/dashboard/DashboardSidebar/DraggableInsightList/DraggableInsightListItemWrapper.d.ts +2 -1
- package/esm/presentation/dashboard/DashboardSidebar/DraggableInsightList/DraggableInsightListItemWrapper.d.ts.map +1 -1
- package/esm/presentation/dashboard/DashboardSidebar/DraggableInsightList/DraggableInsightListItemWrapper.js +3 -2
- package/esm/presentation/dashboard/components/DashboardInner.d.ts.map +1 -1
- package/esm/presentation/dashboard/components/DashboardInner.js +9 -5
- package/esm/presentation/dashboard/components/DashboardSkeleton.d.ts +5 -0
- package/esm/presentation/dashboard/components/DashboardSkeleton.d.ts.map +1 -0
- package/esm/presentation/dashboard/components/DashboardSkeleton.js +30 -0
- package/esm/presentation/dragAndDrop/WrapInsightListItemWithDrag.d.ts +1 -1
- package/esm/presentation/dragAndDrop/WrapInsightListItemWithDrag.d.ts.map +1 -1
- package/esm/presentation/dragAndDrop/WrapInsightListItemWithDrag.js +3 -3
- package/esm/presentation/dragAndDrop/draggableParameterFilter/DefaultParameterDraggingComponent.d.ts.map +1 -1
- package/esm/presentation/dragAndDrop/draggableParameterFilter/DefaultParameterDraggingComponent.js +9 -2
- package/esm/presentation/dragAndDrop/draggableWidget/DraggableInsightListItem.d.ts +1 -0
- package/esm/presentation/dragAndDrop/draggableWidget/DraggableInsightListItem.d.ts.map +1 -1
- package/esm/presentation/dragAndDrop/draggableWidget/DraggableInsightListItem.js +2 -2
- package/esm/presentation/dragAndDrop/types.d.ts +2 -0
- package/esm/presentation/dragAndDrop/types.d.ts.map +1 -1
- package/esm/presentation/filterBar/filterBar/DefaultFilterBarContainer.d.ts.map +1 -1
- package/esm/presentation/filterBar/filterBar/DefaultFilterBarContainer.js +15 -3
- package/esm/presentation/filterBar/parameterFilter/DashboardParameterFilter.d.ts.map +1 -1
- package/esm/presentation/filterBar/parameterFilter/DashboardParameterFilter.js +4 -3
- package/esm/presentation/insightList/types.d.ts +1 -0
- package/esm/presentation/insightList/types.d.ts.map +1 -1
- package/esm/presentation/topBar/buttonBar/button/cancelButton/DefaultCancelButton.d.ts +1 -1
- package/esm/presentation/topBar/buttonBar/button/cancelButton/DefaultCancelButton.d.ts.map +1 -1
- package/esm/presentation/topBar/buttonBar/button/cancelButton/DefaultCancelButton.js +3 -2
- package/esm/presentation/topBar/buttonBar/button/cancelButton/types.d.ts +1 -0
- package/esm/presentation/topBar/buttonBar/button/cancelButton/types.d.ts.map +1 -1
- package/esm/presentation/topBar/buttonBar/button/cancelButton/types.js +1 -1
- package/esm/presentation/topBar/buttonBar/button/editButton/DefaultEditButton.d.ts.map +1 -1
- package/esm/presentation/topBar/buttonBar/button/editButton/DefaultEditButton.js +3 -2
- package/esm/presentation/topBar/buttonBar/button/saveAsButton/DefaultSaveAsNewButton.d.ts +1 -1
- package/esm/presentation/topBar/buttonBar/button/saveAsButton/DefaultSaveAsNewButton.d.ts.map +1 -1
- package/esm/presentation/topBar/buttonBar/button/saveAsButton/DefaultSaveAsNewButton.js +5 -2
- package/esm/presentation/topBar/buttonBar/button/saveAsButton/types.d.ts +1 -0
- package/esm/presentation/topBar/buttonBar/button/saveAsButton/types.d.ts.map +1 -1
- package/esm/presentation/topBar/buttonBar/button/saveAsButton/types.js +1 -1
- package/esm/presentation/topBar/buttonBar/button/saveButton/DefaultSaveButton.d.ts.map +1 -1
- package/esm/presentation/topBar/buttonBar/button/saveButton/DefaultSaveButton.js +3 -1
- package/esm/presentation/topBar/buttonBar/button/settingButton/DefaultSettingButton.d.ts.map +1 -1
- package/esm/presentation/topBar/buttonBar/button/settingButton/DefaultSettingButton.js +3 -1
- package/esm/presentation/topBar/buttonBar/button/shareButton/DefaultShareButton.d.ts +1 -1
- package/esm/presentation/topBar/buttonBar/button/shareButton/DefaultShareButton.d.ts.map +1 -1
- package/esm/presentation/topBar/buttonBar/button/shareButton/DefaultShareButton.js +5 -2
- package/esm/presentation/topBar/buttonBar/button/shareButton/types.d.ts +1 -0
- package/esm/presentation/topBar/buttonBar/button/shareButton/types.d.ts.map +1 -1
- package/esm/presentation/topBar/buttonBar/button/shareButton/types.js +1 -0
- package/esm/presentation/topBar/menuButton/DefaultMenuButton.d.ts +1 -1
- package/esm/presentation/topBar/menuButton/DefaultMenuButton.d.ts.map +1 -1
- package/esm/presentation/topBar/menuButton/DefaultMenuButton.js +7 -2
- package/esm/presentation/topBar/menuButton/types.d.ts +4 -0
- package/esm/presentation/topBar/menuButton/types.d.ts.map +1 -1
- package/esm/presentation/widget/common/configuration/DateDatasetDropdown.d.ts.map +1 -1
- package/esm/presentation/widget/common/configuration/DateDatasetDropdown.js +93 -27
- package/esm/presentation/widget/common/configuration/utils.d.ts +3 -0
- package/esm/presentation/widget/common/configuration/utils.d.ts.map +1 -1
- package/esm/presentation/widget/common/configuration/utils.js +14 -2
- package/esm/sdk-ui-dashboard.d.ts +234 -88
- package/package.json +21 -21
- package/styles/css/dashboard.css +118 -0
- package/styles/css/dashboard.css.map +1 -1
- package/styles/css/main.css +180 -44
- package/styles/css/main.css.map +1 -1
- package/styles/scss/dashboard.scss +96 -0
package/esm/presentation/automations/shared/automationFilters/components/AutomationParameter.js
CHANGED
|
@@ -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
|
|
20
|
+
* Resolve filter dimensionality localIdRefs to stable identifierRefs using the insight's attributes.
|
|
21
21
|
*
|
|
22
|
-
* Measure value filters
|
|
23
|
-
* which is only meaningful within the insight's own execution context.
|
|
24
|
-
* are used in an alert execution (which may not include the original attributes),
|
|
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
|
|
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,
|
|
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 =
|
|
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
|
|
171
|
+
* Resolve filter dimensionality localIdRefs to stable identifierRefs using the insight's attributes.
|
|
172
172
|
*
|
|
173
|
-
* Measure value filters
|
|
174
|
-
* which is only meaningful within the insight's own execution context.
|
|
175
|
-
* are used in an alert execution (which may not include the original attributes),
|
|
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
|
|
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 (
|
|
191
|
-
|
|
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
|
-
|
|
194
|
-
|
|
195
|
-
return
|
|
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
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
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,
|
|
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,
|
|
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,
|
|
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,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;
|
|
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":"
|
|
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
|
}
|
package/esm/presentation/dashboard/DashboardSidebar/DraggableInsightList/DraggableInsightList.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/esm/presentation/dashboard/DashboardSidebar/DraggableInsightList/DraggableInsightList.js
CHANGED
|
@@ -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,
|
|
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"}
|
package/esm/presentation/dashboard/DashboardSidebar/DraggableInsightList/DraggableInsightListCore.js
CHANGED
|
@@ -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;
|
|
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
|
-
|
|
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":"
|
|
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, {}) }) }),
|
|
81
|
-
|
|
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 @@
|
|
|
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
|
}
|