@gooddata/sdk-ui-filters 11.14.0-alpha.1 → 11.14.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/esm/MeasureValueFilter/AttributePicker.d.ts +26 -0
  2. package/esm/MeasureValueFilter/AttributePicker.d.ts.map +1 -0
  3. package/esm/MeasureValueFilter/AttributePicker.js +137 -0
  4. package/esm/MeasureValueFilter/AttributePicker.js.map +1 -0
  5. package/esm/MeasureValueFilter/DimensionalitySection.d.ts +28 -0
  6. package/esm/MeasureValueFilter/DimensionalitySection.d.ts.map +1 -0
  7. package/esm/MeasureValueFilter/DimensionalitySection.js +104 -0
  8. package/esm/MeasureValueFilter/DimensionalitySection.js.map +1 -0
  9. package/esm/MeasureValueFilter/Dropdown.d.ts +6 -2
  10. package/esm/MeasureValueFilter/Dropdown.d.ts.map +1 -1
  11. package/esm/MeasureValueFilter/Dropdown.js +4 -4
  12. package/esm/MeasureValueFilter/Dropdown.js.map +1 -1
  13. package/esm/MeasureValueFilter/DropdownBody.d.ts +6 -2
  14. package/esm/MeasureValueFilter/DropdownBody.d.ts.map +1 -1
  15. package/esm/MeasureValueFilter/DropdownBody.js +83 -22
  16. package/esm/MeasureValueFilter/DropdownBody.js.map +1 -1
  17. package/esm/MeasureValueFilter/MeasureValueFilterDropdown.d.ts.map +1 -1
  18. package/esm/MeasureValueFilter/MeasureValueFilterDropdown.js +18 -7
  19. package/esm/MeasureValueFilter/MeasureValueFilterDropdown.js.map +1 -1
  20. package/esm/MeasureValueFilter/helpers/intervalIncludesZero.d.ts +34 -0
  21. package/esm/MeasureValueFilter/helpers/intervalIncludesZero.d.ts.map +1 -0
  22. package/esm/MeasureValueFilter/helpers/intervalIncludesZero.js +95 -0
  23. package/esm/MeasureValueFilter/helpers/intervalIncludesZero.js.map +1 -0
  24. package/esm/MeasureValueFilter/types.d.ts +3 -0
  25. package/esm/MeasureValueFilter/types.d.ts.map +1 -1
  26. package/esm/MeasureValueFilter/typings.d.ts +28 -1
  27. package/esm/MeasureValueFilter/typings.d.ts.map +1 -1
  28. package/esm/MeasureValueFilter/typings.js.map +1 -1
  29. package/esm/index.d.ts +3 -1
  30. package/esm/index.d.ts.map +1 -1
  31. package/esm/index.js +1 -9
  32. package/esm/index.js.map +1 -1
  33. package/esm/sdk-ui-filters.d.ts +69 -0
  34. package/package.json +10 -10
  35. package/styles/css/main.css +81 -0
  36. package/styles/css/main.css.map +1 -1
  37. package/styles/css/measureValueFilter.css +81 -0
  38. package/styles/css/measureValueFilter.css.map +1 -1
  39. package/styles/scss/measureValueFilter.scss +92 -0
@@ -0,0 +1,26 @@
1
+ import { type IDimensionalityItem } from "./typings.js";
2
+ interface IAttributePickerProps {
3
+ /**
4
+ * Available items that can be added (items from insight that are not in filter dimensionality).
5
+ */
6
+ availableItems: IDimensionalityItem[];
7
+ /**
8
+ * Callback when items are added.
9
+ */
10
+ onAdd: (items: IDimensionalityItem[]) => void;
11
+ /**
12
+ * Callback when the picker is closed without adding.
13
+ */
14
+ onCancel: () => void;
15
+ /**
16
+ * The element to anchor the overlay to.
17
+ */
18
+ anchorElement: HTMLElement;
19
+ }
20
+ /**
21
+ * @internal
22
+ * AttributePicker dialog for selecting dimensionality items to add to the filter.
23
+ */
24
+ export declare const AttributePicker: import("react").NamedExoticComponent<IAttributePickerProps>;
25
+ export {};
26
+ //# sourceMappingURL=AttributePicker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AttributePicker.d.ts","sourceRoot":"","sources":["../../src/MeasureValueFilter/AttributePicker.tsx"],"names":[],"mappings":"AAoBA,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAgCxD,UAAU,qBAAqB;IAC3B;;OAEG;IACH,cAAc,EAAE,mBAAmB,EAAE,CAAC;IACtC;;OAEG;IACH,KAAK,EAAE,CAAC,KAAK,EAAE,mBAAmB,EAAE,KAAK,IAAI,CAAC;IAC9C;;OAEG;IACH,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB;;OAEG;IACH,aAAa,EAAE,WAAW,CAAC;CAC9B;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,6DAoP1B,CAAC"}
@@ -0,0 +1,137 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ // (C) 2025 GoodData Corporation
3
+ import { memo, useCallback, useId, useMemo, useState } from "react";
4
+ import { useIntl } from "react-intl";
5
+ import { isIdentifierRef, isLocalIdRef, isUriRef } from "@gooddata/sdk-model";
6
+ import { Input, Overlay, UiButton, UiButtonSegmentedControl, UiCheckbox, UiIcon, UiIconButton, UiListbox, } from "@gooddata/sdk-ui-kit";
7
+ function AttributePickerItemComponent({ item, isFocused, isCompact, onSelect, }) {
8
+ const { dimensionalityItem, isChecked } = item.data;
9
+ const isDateItem = dimensionalityItem.type === "chronologicalDate" || dimensionalityItem.type === "genericDate";
10
+ const iconType = isDateItem ? "date" : "ldmAttribute";
11
+ const iconColor = isDateItem ? "primary" : "warning";
12
+ return (_jsxs("div", { className: `gd-ui-kit-listbox__item gd-mvf-attribute-picker-item${isFocused ? " gd-ui-kit-listbox__item--isFocused" : ""}${isCompact ? " gd-ui-kit-listbox__item--isCompact" : ""}`, onClick: onSelect, "data-object-type": dimensionalityItem.type ?? "attribute", children: [_jsx(UiCheckbox, { checked: isChecked, preventDefault: true }), _jsx(UiIcon, { type: iconType, size: 20, color: iconColor, ariaHidden: true }), _jsx("span", { className: "gd-ui-kit-listbox__item-title", children: dimensionalityItem.title })] }));
13
+ }
14
+ /**
15
+ * @internal
16
+ * AttributePicker dialog for selecting dimensionality items to add to the filter.
17
+ */
18
+ export const AttributePicker = memo(function AttributePicker({ availableItems, onAdd, onCancel, anchorElement, }) {
19
+ const intl = useIntl();
20
+ const listboxId = useId();
21
+ const [selectedIds, setSelectedIds] = useState(new Set());
22
+ const [searchString, setSearchString] = useState("");
23
+ const [typeFilter, setTypeFilter] = useState("attribute");
24
+ // Check if we have items of each type
25
+ const { hasAttributes, hasDates } = useMemo(() => {
26
+ let hasAttributes = false;
27
+ let hasDates = false;
28
+ for (const item of availableItems) {
29
+ const isDateItem = item.type === "chronologicalDate" || item.type === "genericDate";
30
+ if (isDateItem) {
31
+ hasDates = true;
32
+ }
33
+ else {
34
+ hasAttributes = true;
35
+ }
36
+ if (hasAttributes && hasDates)
37
+ break;
38
+ }
39
+ return { hasAttributes, hasDates };
40
+ }, [availableItems]);
41
+ // Only show type filter when both types exist
42
+ const showTypeFilter = hasAttributes && hasDates;
43
+ const handleSearch = useCallback((value) => {
44
+ setSearchString(String(value));
45
+ }, []);
46
+ const handleSearchEscKeyPress = useCallback((e) => {
47
+ if (searchString.length > 0) {
48
+ e.stopPropagation();
49
+ }
50
+ }, [searchString]);
51
+ const getItemId = useCallback((item) => {
52
+ const ref = item.identifier;
53
+ if (isLocalIdRef(ref)) {
54
+ return ref.localIdentifier;
55
+ }
56
+ if (isIdentifierRef(ref)) {
57
+ return ref.identifier;
58
+ }
59
+ if (isUriRef(ref)) {
60
+ return ref.uri;
61
+ }
62
+ return String(ref);
63
+ }, []);
64
+ const handleItemToggle = useCallback((item) => {
65
+ const itemId = item.id;
66
+ setSelectedIds((prev) => {
67
+ const newSet = new Set(prev);
68
+ if (newSet.has(itemId)) {
69
+ newSet.delete(itemId);
70
+ }
71
+ else {
72
+ newSet.add(itemId);
73
+ }
74
+ return newSet;
75
+ });
76
+ }, []);
77
+ const handleAdd = useCallback(() => {
78
+ const itemsToAdd = availableItems.filter((item) => selectedIds.has(getItemId(item)));
79
+ onAdd(itemsToAdd);
80
+ }, [availableItems, selectedIds, getItemId, onAdd]);
81
+ const isAddDisabled = selectedIds.size === 0;
82
+ const filteredItems = useMemo(() => {
83
+ let items = availableItems;
84
+ // Filter by type when both types exist
85
+ if (showTypeFilter) {
86
+ items = items.filter((item) => {
87
+ const isDateItem = item.type === "chronologicalDate" || item.type === "genericDate";
88
+ return typeFilter === "date" ? isDateItem : !isDateItem;
89
+ });
90
+ }
91
+ // Filter by search string
92
+ if (searchString.trim()) {
93
+ const lowerSearch = searchString.toLowerCase();
94
+ items = items.filter((item) => item.title.toLowerCase().includes(lowerSearch));
95
+ }
96
+ return items;
97
+ }, [availableItems, searchString, showTypeFilter, typeFilter]);
98
+ const listboxItems = useMemo(() => {
99
+ return filteredItems.map((item) => {
100
+ const itemId = getItemId(item);
101
+ const isChecked = selectedIds.has(itemId);
102
+ return {
103
+ type: "interactive",
104
+ id: itemId,
105
+ stringTitle: item.title,
106
+ data: {
107
+ dimensionalityItem: item,
108
+ isChecked,
109
+ },
110
+ };
111
+ });
112
+ }, [filteredItems, getItemId, selectedIds]);
113
+ return (_jsx(Overlay, { alignTo: anchorElement, alignPoints: [
114
+ { align: "br tr", offset: { x: 4, y: 0 } },
115
+ { align: "bl tl", offset: { x: -4, y: 0 } },
116
+ { align: "tr br", offset: { x: 4, y: 0 } },
117
+ { align: "tl bl", offset: { x: -4, y: 0 } },
118
+ ], positionType: "sameAsTarget", closeOnOutsideClick: true, closeOnEscape: true, onClose: onCancel, children: _jsx("div", { className: "gd-dropdown overlay", children: _jsxs("div", { className: "gd-mvf-attribute-picker-body s-mvf-attribute-picker", children: [_jsxs("div", { className: "gd-mvf-attribute-picker-header", children: [_jsxs("div", { className: "gd-mvf-attribute-picker-header-title", children: [_jsx(UiIcon, { type: "navigateLeft", size: 12, color: "complementary-7", ariaHidden: true }), intl.formatMessage({ id: "mvf.attributePicker.title" })] }), _jsx(UiIconButton, { icon: "close", variant: "bare", size: "small", onClick: onCancel, accessibilityConfig: {
119
+ ariaLabel: intl.formatMessage({ id: "cancel" }),
120
+ }, dataTestId: "s-mvf-attribute-picker-close" })] }), _jsx("div", { className: "gd-mvf-attribute-picker-search-bar", children: _jsx(Input, { className: "gd-mvf-attribute-picker-search-input", value: searchString, onChange: handleSearch, onEscKeyPress: handleSearchEscKeyPress, placeholder: intl.formatMessage({ id: "gs.list.search.placeholder" }), autofocus: true, clearOnEsc: true, isSearch: true, isSmall: true, accessibilityConfig: {
121
+ ariaLabel: intl.formatMessage({ id: "gs.list.acessibility.search.label" }),
122
+ } }) }), showTypeFilter ? (_jsx("div", { className: "gd-mvf-attribute-picker-type-filter", children: _jsxs(UiButtonSegmentedControl, { layout: "fill", children: [_jsx(UiIconButton, { icon: "ldmAttribute", iconColor: "warning", size: "small", variant: "secondary", isActive: typeFilter === "attribute", onClick: () => setTypeFilter("attribute"), accessibilityConfig: {
123
+ ariaLabel: intl.formatMessage({
124
+ id: "mvf.attributePicker.filter.attributes",
125
+ }),
126
+ }, dataTestId: "s-mvf-attribute-picker-filter-attributes" }), _jsx(UiIconButton, { icon: "date", iconColor: "primary", size: "small", variant: "secondary", isActive: typeFilter === "date", onClick: () => setTypeFilter("date"), accessibilityConfig: {
127
+ ariaLabel: intl.formatMessage({
128
+ id: "mvf.attributePicker.filter.dates",
129
+ }),
130
+ }, dataTestId: "s-mvf-attribute-picker-filter-dates" })] }) })) : null, _jsx("div", { className: "gd-mvf-attribute-picker-content", children: listboxItems.length === 0 ? (_jsx("div", { className: "gd-mvf-attribute-picker-no-results", children: intl.formatMessage({ id: "mvf.attributePicker.noResults" }) })) : (_jsxs(_Fragment, { children: [showTypeFilter ? (_jsx("div", { className: "gd-mvf-attribute-picker-list-header", children: intl.formatMessage({ id: "mvf.attributePicker.header.fromInsight" }) })) : null, _jsx(UiListbox, { items: listboxItems, onSelect: handleItemToggle, shouldCloseOnSelect: false, isCompact: true, InteractiveItemComponent: AttributePickerItemComponent, ariaAttributes: {
131
+ id: listboxId,
132
+ "aria-label": intl.formatMessage({
133
+ id: "mvf.attributePicker.title",
134
+ }),
135
+ }, dataTestId: "s-mvf-attribute-picker-list" })] })) }), _jsxs("div", { className: "gd-mvf-attribute-picker-footer", children: [_jsx(UiButton, { variant: "secondary", size: "small", onClick: onCancel, label: intl.formatMessage({ id: "cancel" }) }), _jsx(UiButton, { variant: "primary", size: "small", onClick: handleAdd, label: intl.formatMessage({ id: "mvf.attributePicker.add" }), isDisabled: isAddDisabled })] })] }) }) }));
136
+ });
137
+ //# sourceMappingURL=AttributePicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AttributePicker.js","sourceRoot":"","sources":["../../src/MeasureValueFilter/AttributePicker.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { IDimensionalityItem } from "./typings.js";
2
+ /**
3
+ * Compare two-dimensionality arrays for equality (order-insensitive).
4
+ * Returns true if they contain the same identifiers regardless of order.
5
+ */
6
+ export declare const areDimensionalitySetsEqual: (a: IDimensionalityItem[] | undefined, b: IDimensionalityItem[] | undefined) => boolean;
7
+ interface IDimensionalitySectionProps {
8
+ /**
9
+ * Current dimensionality items in the filter.
10
+ */
11
+ dimensionality: IDimensionalityItem[];
12
+ /**
13
+ * Insight default dimensionality items (from buckets).
14
+ */
15
+ insightDimensionality?: IDimensionalityItem[];
16
+ /**
17
+ * Callback when dimensionality changes.
18
+ */
19
+ onDimensionalityChange: (dimensionality: IDimensionalityItem[]) => void;
20
+ }
21
+ /**
22
+ * @internal
23
+ * Dimensionality section for the measure value filter dropdown.
24
+ * Allows users to select which attributes/dates define the granularity of the filter.
25
+ */
26
+ export declare const DimensionalitySection: import("react").NamedExoticComponent<IDimensionalitySectionProps>;
27
+ export {};
28
+ //# sourceMappingURL=DimensionalitySection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DimensionalitySection.d.ts","sourceRoot":"","sources":["../../src/MeasureValueFilter/DimensionalitySection.tsx"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAyCxD;;;GAGG;AACH,eAAO,MAAM,0BAA0B,GACnC,GAAG,mBAAmB,EAAE,GAAG,SAAS,EACpC,GAAG,mBAAmB,EAAE,GAAG,SAAS,KACrC,OAYF,CAAC;AAEF,UAAU,2BAA2B;IACjC;;OAEG;IACH,cAAc,EAAE,mBAAmB,EAAE,CAAC;IACtC;;OAEG;IACH,qBAAqB,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAC9C;;OAEG;IACH,sBAAsB,EAAE,CAAC,cAAc,EAAE,mBAAmB,EAAE,KAAK,IAAI,CAAC;CAC3E;AAED;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,mEAwKhC,CAAC"}
@@ -0,0 +1,104 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // (C) 2025 GoodData Corporation
3
+ import { memo, useCallback, useMemo, useRef, useState, } from "react";
4
+ import { useIntl } from "react-intl";
5
+ import { areObjRefsEqual, objRefToString } from "@gooddata/sdk-model";
6
+ import { Bubble, BubbleHoverTrigger, UiButton, UiIconButton, UiTag } from "@gooddata/sdk-ui-kit";
7
+ import { AttributePicker } from "./AttributePicker.js";
8
+ function WithAddButton({ children, appendAddButton, isDisabled, tooltip, buttonRef, onClick, }) {
9
+ if (!appendAddButton) {
10
+ return children;
11
+ }
12
+ return (_jsxs("div", { className: "gd-mvf-dimensionality-add-wrapper", children: [children, _jsxs(BubbleHoverTrigger, { children: [_jsx(UiIconButton, { ref: buttonRef, icon: "plus", size: "small", variant: "tertiary", isDisabled: isDisabled, onClick: onClick }), _jsx(Bubble, { alignPoints: [{ align: "bc tc" }], children: tooltip })] })] }));
13
+ }
14
+ /**
15
+ * Compare two-dimensionality arrays for equality (order-insensitive).
16
+ * Returns true if they contain the same identifiers regardless of order.
17
+ */
18
+ export const areDimensionalitySetsEqual = (a, b) => {
19
+ const aItems = a ?? [];
20
+ const bItems = b ?? [];
21
+ if (aItems.length !== bItems.length) {
22
+ return false;
23
+ }
24
+ // Check that every item in 'a' exists in 'b'
25
+ return aItems.every((aItem) => bItems.some((bItem) => areObjRefsEqual(aItem.identifier, bItem.identifier)));
26
+ };
27
+ /**
28
+ * @internal
29
+ * Dimensionality section for the measure value filter dropdown.
30
+ * Allows users to select which attributes/dates define the granularity of the filter.
31
+ */
32
+ export const DimensionalitySection = memo(function DimensionalitySection({ dimensionality, insightDimensionality, onDimensionalityChange, }) {
33
+ const intl = useIntl();
34
+ // Ref for the inline add button (plus icon next to last tag)
35
+ const inlineAddButtonRef = useRef(null);
36
+ // AttributePicker state - stores whether it's open and which button triggered it
37
+ const [isAttributePickerOpen, setIsAttributePickerOpen] = useState(false);
38
+ const [anchorType, setAnchorType] = useState("standalone");
39
+ // Store standalone button anchor separately since it's not a ref
40
+ const [standaloneAnchor, setStandaloneAnchor] = useState(null);
41
+ /**
42
+ * Check if the current dimensionality differs from the insight defaults (order-insensitive).
43
+ * Reset button should be visible when they differ.
44
+ */
45
+ const shouldShowResetButton = useMemo(() => {
46
+ return !areDimensionalitySetsEqual(dimensionality, insightDimensionality);
47
+ }, [dimensionality, insightDimensionality]);
48
+ /**
49
+ * Compute available items for the AttributePicker.
50
+ * These are items from insight dimensionality that are not yet in filter dimensionality.
51
+ */
52
+ const availableDimensionalityItems = useMemo(() => {
53
+ if (!insightDimensionality?.length) {
54
+ return [];
55
+ }
56
+ return insightDimensionality.filter((insightItem) => !dimensionality.some((filterItem) => areObjRefsEqual(insightItem.identifier, filterItem.identifier)));
57
+ }, [insightDimensionality, dimensionality]);
58
+ // Disable add buttons when there are no more items to add
59
+ const isAddButtonDisabled = availableDimensionalityItems.length === 0;
60
+ const handleRemoveDimensionality = useCallback((index) => {
61
+ onDimensionalityChange(dimensionality.filter((_, i) => i !== index));
62
+ }, [dimensionality, onDimensionalityChange]);
63
+ /**
64
+ * Reset dimensionality to insight defaults (bucket attributes).
65
+ */
66
+ const handleResetDimensionality = useCallback(() => {
67
+ onDimensionalityChange(insightDimensionality ?? []);
68
+ }, [insightDimensionality, onDimensionalityChange]);
69
+ const handleOpenInlineAttributePicker = useCallback(() => {
70
+ if (availableDimensionalityItems.length > 0) {
71
+ setAnchorType("inline");
72
+ setIsAttributePickerOpen(true);
73
+ }
74
+ }, [availableDimensionalityItems.length]);
75
+ const handleOpenStandaloneAttributePicker = useCallback((event) => {
76
+ if (availableDimensionalityItems.length > 0) {
77
+ setAnchorType("standalone");
78
+ setStandaloneAnchor(event.currentTarget);
79
+ setIsAttributePickerOpen(true);
80
+ }
81
+ }, [availableDimensionalityItems.length]);
82
+ const handleCloseAttributePicker = useCallback(() => {
83
+ setIsAttributePickerOpen(false);
84
+ setStandaloneAnchor(null);
85
+ }, []);
86
+ const handleAddDimensionalityItems = useCallback((items) => {
87
+ onDimensionalityChange([...dimensionality, ...items]);
88
+ setIsAttributePickerOpen(false);
89
+ setStandaloneAnchor(null);
90
+ }, [dimensionality, onDimensionalityChange]);
91
+ const addButtonTooltip = isAddButtonDisabled
92
+ ? intl.formatMessage({ id: "mvf.dimensionality.addButton.tooltip.disabled" })
93
+ : intl.formatMessage({ id: "mvf.dimensionality.addButton.tooltip" });
94
+ // Determine the actual anchor element to use
95
+ const actualAnchor = anchorType === "inline" ? inlineAddButtonRef.current : standaloneAnchor;
96
+ return (_jsxs("div", { className: "gd-mvf-dropdown-section gd-mvf-dimensionality s-mvf-dimensionality", children: [_jsxs("div", { className: "gd-mvf-dimensionality-header", children: [_jsx("label", { children: intl.formatMessage({ id: "mvf.dimensionality.forEach" }) }), shouldShowResetButton ? (_jsx("span", { children: _jsxs(BubbleHoverTrigger, { children: [_jsx(UiButton, { size: "small", variant: "tertiary", label: intl.formatMessage({ id: "mvf.dimensionality.reset" }), onClick: handleResetDimensionality }), _jsx(Bubble, { alignPoints: [{ align: "bc tc" }], children: intl.formatMessage({ id: "mvf.dimensionality.reset.tooltip" }) })] }) })) : null] }), dimensionality.length > 0 ? (_jsx("div", { className: "gd-mvf-dimensionality-items", children: dimensionality.map((item, index) => {
97
+ // Select icon and color based on item type: date items get date icon (blue)
98
+ const isDateItem = item.type === "chronologicalDate" || item.type === "genericDate";
99
+ const icon = isDateItem ? "date" : "ldmAttribute";
100
+ const iconColor = isDateItem ? "primary" : "warning";
101
+ return (_jsx(WithAddButton, { appendAddButton: index === dimensionality.length - 1, isDisabled: isAddButtonDisabled, tooltip: addButtonTooltip, buttonRef: inlineAddButtonRef, onClick: handleOpenInlineAttributePicker, children: _jsx(UiTag, { variant: "outlined", size: "large", iconBefore: icon, iconBeforeColor: iconColor, label: item.title, isDeletable: true, onDelete: () => handleRemoveDimensionality(index), dataTestId: `dimensionality-tag-${index}` }) }, objRefToString(item.identifier)));
102
+ }) })) : (_jsx(UiButton, { label: intl.formatMessage({ id: "mvf.dimensionality.addAttributes" }), variant: "tertiary", size: "small", iconBefore: "plus", isDisabled: isAddButtonDisabled, onClick: handleOpenStandaloneAttributePicker })), isAttributePickerOpen && actualAnchor ? (_jsx(AttributePicker, { availableItems: availableDimensionalityItems, anchorElement: actualAnchor, onAdd: handleAddDimensionalityItems, onCancel: handleCloseAttributePicker })) : null] }));
103
+ });
104
+ //# sourceMappingURL=DimensionalitySection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DimensionalitySection.js","sourceRoot":"","sources":["../../src/MeasureValueFilter/DimensionalitySection.tsx"],"names":[],"mappings":"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"}
@@ -1,8 +1,9 @@
1
+ import { type ObjRefInScope } from "@gooddata/sdk-model";
1
2
  import { type ISeparators } from "@gooddata/sdk-ui";
2
3
  import { type IMeasureValueFilterValue, type MeasureValueFilterOperator } from "./types.js";
3
- import { type WarningMessage } from "./typings.js";
4
+ import { type IDimensionalityItem, type WarningMessage } from "./typings.js";
4
5
  interface IDropdownProps {
5
- onApply: (operator: MeasureValueFilterOperator | null, value: IMeasureValueFilterValue, treatNullValuesAsZero: boolean) => void;
6
+ onApply: (operator: MeasureValueFilterOperator | null, value: IMeasureValueFilterValue, treatNullValuesAsZero: boolean, dimensionality?: ObjRefInScope[]) => void;
6
7
  onCancel: () => void;
7
8
  operator?: MeasureValueFilterOperator | null;
8
9
  value?: IMeasureValueFilterValue | null;
@@ -14,6 +15,9 @@ interface IDropdownProps {
14
15
  displayTreatNullAsZeroOption?: boolean;
15
16
  treatNullAsZeroValue?: boolean;
16
17
  enableOperatorSelection?: boolean;
18
+ dimensionality?: IDimensionalityItem[];
19
+ insightDimensionality?: IDimensionalityItem[];
20
+ isDimensionalityEnabled?: boolean;
17
21
  }
18
22
  export declare function Dropdown(props: IDropdownProps): import("react/jsx-runtime").JSX.Element;
19
23
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"Dropdown.d.ts","sourceRoot":"","sources":["../../src/MeasureValueFilter/Dropdown.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,WAAW,EAAe,MAAM,kBAAkB,CAAC;AAIjE,OAAO,EAAE,KAAK,wBAAwB,EAAE,KAAK,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAC5F,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAUnD,UAAU,cAAc;IACpB,OAAO,EAAE,CACL,QAAQ,EAAE,0BAA0B,GAAG,IAAI,EAC3C,KAAK,EAAE,wBAAwB,EAC/B,qBAAqB,EAAE,OAAO,KAC7B,IAAI,CAAC;IACV,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,0BAA0B,GAAG,IAAI,CAAC;IAC7C,KAAK,CAAC,EAAE,wBAAwB,GAAG,IAAI,CAAC;IACxC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,WAAW,GAAG,MAAM,CAAC;IAChC,UAAU,CAAC,EAAE,WAAW,CAAC;IACzB,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACrC;AAyDD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,cAAc,2CAM7C"}
1
+ {"version":3,"file":"Dropdown.d.ts","sourceRoot":"","sources":["../../src/MeasureValueFilter/Dropdown.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,KAAK,WAAW,EAAe,MAAM,kBAAkB,CAAC;AAIjE,OAAO,EAAE,KAAK,wBAAwB,EAAE,KAAK,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAC5F,OAAO,EAAE,KAAK,mBAAmB,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAU7E,UAAU,cAAc;IACpB,OAAO,EAAE,CACL,QAAQ,EAAE,0BAA0B,GAAG,IAAI,EAC3C,KAAK,EAAE,wBAAwB,EAC/B,qBAAqB,EAAE,OAAO,EAC9B,cAAc,CAAC,EAAE,aAAa,EAAE,KAC/B,IAAI,CAAC;IACV,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,0BAA0B,GAAG,IAAI,CAAC;IAC7C,KAAK,CAAC,EAAE,wBAAwB,GAAG,IAAI,CAAC;IACxC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,WAAW,GAAG,MAAM,CAAC;IAChC,UAAU,CAAC,EAAE,WAAW,CAAC;IACzB,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,cAAc,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACvC,qBAAqB,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAC9C,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACrC;AAgED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,cAAc,2CAM7C"}
@@ -12,12 +12,12 @@ const alignPoints = ["bl tl", "tl bl", "br tr", "tr br"];
12
12
  */
13
13
  const DROPDOWN_ALIGNMENTS = alignPoints.map((align) => ({ align, offset: { x: 1, y: 0 } }));
14
14
  const DropdownWithIntl = memo(function DropdownWithIntl(props) {
15
- const { operator = "ALL", value = {}, usePercentage, warningMessage, locale, onCancel, anchorEl, separators, displayTreatNullAsZeroOption = false, treatNullAsZeroValue = false, enableOperatorSelection, onApply: onApplyProp, } = props;
16
- const onApply = useCallback((operator, value, treatNullValuesAsZero) => {
17
- onApplyProp(operator, value, treatNullValuesAsZero);
15
+ const { operator = "ALL", value = {}, usePercentage, warningMessage, locale, onCancel, anchorEl, separators, displayTreatNullAsZeroOption = false, treatNullAsZeroValue = false, enableOperatorSelection, onApply: onApplyProp, dimensionality, insightDimensionality, isDimensionalityEnabled, } = props;
16
+ const onApply = useCallback((operator, value, treatNullValuesAsZero, newDimensionality) => {
17
+ onApplyProp(operator, value, treatNullValuesAsZero, newDimensionality);
18
18
  }, [onApplyProp]);
19
19
  const selectedOperator = operator === null ? "ALL" : operator;
20
- return (_jsx(Overlay, { alignTo: anchorEl, alignPoints: DROPDOWN_ALIGNMENTS, closeOnOutsideClick: true, closeOnParentScroll: true, closeOnMouseDrag: true, onClose: onCancel, children: _jsx(DropdownBody, { operator: selectedOperator, value: value ?? {}, usePercentage: usePercentage, warningMessage: warningMessage, locale: locale, onCancel: onCancel, onApply: onApply, separators: separators, displayTreatNullAsZeroOption: displayTreatNullAsZeroOption, treatNullAsZeroValue: treatNullAsZeroValue, enableOperatorSelection: enableOperatorSelection }) }));
20
+ return (_jsx(Overlay, { alignTo: anchorEl, alignPoints: DROPDOWN_ALIGNMENTS, closeOnOutsideClick: true, closeOnParentScroll: true, closeOnMouseDrag: true, onClose: onCancel, children: _jsx(DropdownBody, { operator: selectedOperator, value: value ?? {}, usePercentage: usePercentage, warningMessage: warningMessage, locale: locale, onCancel: onCancel, onApply: onApply, separators: separators, displayTreatNullAsZeroOption: displayTreatNullAsZeroOption, treatNullAsZeroValue: treatNullAsZeroValue, enableOperatorSelection: enableOperatorSelection, dimensionality: dimensionality, insightDimensionality: insightDimensionality, isDimensionalityEnabled: isDimensionalityEnabled }) }));
21
21
  });
22
22
  export function Dropdown(props) {
23
23
  return (_jsx(IntlWrapper, { locale: props.locale, children: _jsx(DropdownWithIntl, { ...props }) }));
@@ -1 +1 @@
1
- {"version":3,"file":"Dropdown.js","sourceRoot":"","sources":["../../src/MeasureValueFilter/Dropdown.tsx"],"names":[],"mappings":";AAAA,qCAAqC;AAErC,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAE1C,OAAO,EAAoB,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAIjD,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACzD;;;;GAIG;AACH,MAAM,mBAAmB,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAqB5F,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,gBAAgB,CAAC,KAAqB;IACzE,MAAM,EACF,QAAQ,GAAG,KAAK,EAChB,KAAK,GAAG,EAAE,EACV,aAAa,EACb,cAAc,EACd,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,4BAA4B,GAAG,KAAK,EACpC,oBAAoB,GAAG,KAAK,EAC5B,uBAAuB,EACvB,OAAO,EAAE,WAAW,GACvB,GAAG,KAAK,CAAC;IAEV,MAAM,OAAO,GAAG,WAAW,CACvB,CACI,QAA2C,EAC3C,KAA+B,EAC/B,qBAA8B,EAChC,EAAE;QACA,WAAW,CAAC,QAAQ,EAAE,KAAK,EAAE,qBAAqB,CAAC,CAAC;IACxD,CAAC,EACD,CAAC,WAAW,CAAC,CAChB,CAAC;IAEF,MAAM,gBAAgB,GAA+B,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;IAE1F,OAAO,CACH,KAAC,OAAO,IACJ,OAAO,EAAE,QAAQ,EACjB,WAAW,EAAE,mBAAmB,EAChC,mBAAmB,QACnB,mBAAmB,QACnB,gBAAgB,QAChB,OAAO,EAAE,QAAQ,YAEjB,KAAC,YAAY,IACT,QAAQ,EAAE,gBAAgB,EAC1B,KAAK,EAAE,KAAK,IAAI,EAAE,EAClB,aAAa,EAAE,aAAa,EAC5B,cAAc,EAAE,cAAc,EAC9B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,UAAU,EACtB,4BAA4B,EAAE,4BAA4B,EAC1D,oBAAoB,EAAE,oBAAoB,EAC1C,uBAAuB,EAAE,uBAAuB,GAClD,GACI,CACb,CAAC;AACN,CAAC,CAAC,CAAC;AAEH,MAAM,UAAU,QAAQ,CAAC,KAAqB;IAC1C,OAAO,CACH,KAAC,WAAW,IAAC,MAAM,EAAE,KAAK,CAAC,MAAM,YAC7B,KAAC,gBAAgB,OAAK,KAAK,GAAI,GACrB,CACjB,CAAC;AACN,CAAC"}
1
+ {"version":3,"file":"Dropdown.js","sourceRoot":"","sources":["../../src/MeasureValueFilter/Dropdown.tsx"],"names":[],"mappings":";AAAA,qCAAqC;AAErC,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAG1C,OAAO,EAAoB,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAIjD,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACzD;;;;GAIG;AACH,MAAM,mBAAmB,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAyB5F,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,gBAAgB,CAAC,KAAqB;IACzE,MAAM,EACF,QAAQ,GAAG,KAAK,EAChB,KAAK,GAAG,EAAE,EACV,aAAa,EACb,cAAc,EACd,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,4BAA4B,GAAG,KAAK,EACpC,oBAAoB,GAAG,KAAK,EAC5B,uBAAuB,EACvB,OAAO,EAAE,WAAW,EACpB,cAAc,EACd,qBAAqB,EACrB,uBAAuB,GAC1B,GAAG,KAAK,CAAC;IAEV,MAAM,OAAO,GAAG,WAAW,CACvB,CACI,QAA2C,EAC3C,KAA+B,EAC/B,qBAA8B,EAC9B,iBAAmC,EACrC,EAAE;QACA,WAAW,CAAC,QAAQ,EAAE,KAAK,EAAE,qBAAqB,EAAE,iBAAiB,CAAC,CAAC;IAC3E,CAAC,EACD,CAAC,WAAW,CAAC,CAChB,CAAC;IAEF,MAAM,gBAAgB,GAA+B,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;IAE1F,OAAO,CACH,KAAC,OAAO,IACJ,OAAO,EAAE,QAAQ,EACjB,WAAW,EAAE,mBAAmB,EAChC,mBAAmB,QACnB,mBAAmB,QACnB,gBAAgB,QAChB,OAAO,EAAE,QAAQ,YAEjB,KAAC,YAAY,IACT,QAAQ,EAAE,gBAAgB,EAC1B,KAAK,EAAE,KAAK,IAAI,EAAE,EAClB,aAAa,EAAE,aAAa,EAC5B,cAAc,EAAE,cAAc,EAC9B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,UAAU,EACtB,4BAA4B,EAAE,4BAA4B,EAC1D,oBAAoB,EAAE,oBAAoB,EAC1C,uBAAuB,EAAE,uBAAuB,EAChD,cAAc,EAAE,cAAc,EAC9B,qBAAqB,EAAE,qBAAqB,EAC5C,uBAAuB,EAAE,uBAAuB,GAClD,GACI,CACb,CAAC;AACN,CAAC,CAAC,CAAC;AAEH,MAAM,UAAU,QAAQ,CAAC,KAAqB;IAC1C,OAAO,CACH,KAAC,WAAW,IAAC,MAAM,EAAE,KAAK,CAAC,MAAM,YAC7B,KAAC,gBAAgB,OAAK,KAAK,GAAI,GACrB,CACjB,CAAC;AACN,CAAC"}
@@ -1,6 +1,7 @@
1
+ import { type ObjRefInScope } from "@gooddata/sdk-model";
1
2
  import { type ISeparators } from "@gooddata/sdk-ui";
2
3
  import { type IMeasureValueFilterValue, type MeasureValueFilterOperator } from "./types.js";
3
- import { type WarningMessage } from "./typings.js";
4
+ import { type IDimensionalityItem, type WarningMessage } from "./typings.js";
4
5
  interface IDropdownBodyProps {
5
6
  operator: MeasureValueFilterOperator;
6
7
  value: IMeasureValueFilterValue;
@@ -9,12 +10,15 @@ interface IDropdownBodyProps {
9
10
  locale?: string;
10
11
  disableAutofocus?: boolean;
11
12
  onCancel?: () => void;
12
- onApply: (operator: MeasureValueFilterOperator | null, value: IMeasureValueFilterValue, treatNullValuesAsZero: boolean) => void;
13
+ onApply: (operator: MeasureValueFilterOperator | null, value: IMeasureValueFilterValue, treatNullValuesAsZero: boolean, dimensionality?: ObjRefInScope[]) => void;
13
14
  separators?: ISeparators;
14
15
  displayTreatNullAsZeroOption?: boolean;
15
16
  treatNullAsZeroValue?: boolean;
16
17
  valuePrecision?: number;
17
18
  enableOperatorSelection?: boolean;
19
+ dimensionality?: IDimensionalityItem[];
20
+ insightDimensionality?: IDimensionalityItem[];
21
+ isDimensionalityEnabled?: boolean;
18
22
  }
19
23
  export declare const DropdownBodyWithIntl: import("react").NamedExoticComponent<IDropdownBodyProps>;
20
24
  export declare const DropdownBody: import("react").NamedExoticComponent<IDropdownBodyProps>;
@@ -1 +1 @@
1
- {"version":3,"file":"DropdownBody.d.ts","sourceRoot":"","sources":["../../src/MeasureValueFilter/DropdownBody.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,WAAW,EAAe,MAAM,kBAAkB,CAAC;AAOjE,OAAO,EAAE,KAAK,wBAAwB,EAAE,KAAK,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAC5F,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAGnD,UAAU,kBAAkB;IACxB,QAAQ,EAAE,0BAA0B,CAAC;IACrC,KAAK,EAAE,wBAAwB,CAAC;IAChC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,OAAO,EAAE,CACL,QAAQ,EAAE,0BAA0B,GAAG,IAAI,EAC3C,KAAK,EAAE,wBAAwB,EAC/B,qBAAqB,EAAE,OAAO,KAC7B,IAAI,CAAC;IACV,UAAU,CAAC,EAAE,WAAW,CAAC;IACzB,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACrC;AAUD,eAAO,MAAM,oBAAoB,0DAgQ/B,CAAC;AAEH,eAAO,MAAM,YAAY,0DAMvB,CAAC"}
1
+ {"version":3,"file":"DropdownBody.d.ts","sourceRoot":"","sources":["../../src/MeasureValueFilter/DropdownBody.tsx"],"names":[],"mappings":"AAMA,OAAO,EACH,KAAK,aAAa,EAGrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,WAAW,EAAe,MAAM,kBAAkB,CAAC;AASjE,OAAO,EAAE,KAAK,wBAAwB,EAAE,KAAK,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAC5F,OAAO,EAAE,KAAK,mBAAmB,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAG7E,UAAU,kBAAkB;IACxB,QAAQ,EAAE,0BAA0B,CAAC;IACrC,KAAK,EAAE,wBAAwB,CAAC;IAChC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,OAAO,EAAE,CACL,QAAQ,EAAE,0BAA0B,GAAG,IAAI,EAC3C,KAAK,EAAE,wBAAwB,EAC/B,qBAAqB,EAAE,OAAO,EAC9B,cAAc,CAAC,EAAE,aAAa,EAAE,KAC/B,IAAI,CAAC;IACV,UAAU,CAAC,EAAE,WAAW,CAAC;IACzB,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,cAAc,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACvC,qBAAqB,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAC9C,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACrC;AAWD,eAAO,MAAM,oBAAoB,0DA+U/B,CAAC;AAEH,eAAO,MAAM,YAAY,0DAMvB,CAAC"}
@@ -1,11 +1,13 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  // (C) 2019-2025 GoodData Corporation
3
- import { memo, useCallback, useState } from "react";
3
+ import { memo, useCallback, useMemo, useState } from "react";
4
4
  import { useIntl } from "react-intl";
5
- import { isComparisonConditionOperator, isRangeConditionOperator } from "@gooddata/sdk-model";
5
+ import { isComparisonConditionOperator, isRangeConditionOperator, } from "@gooddata/sdk-model";
6
6
  import { IntlWrapper } from "@gooddata/sdk-ui";
7
7
  import { Button } from "@gooddata/sdk-ui-kit";
8
8
  import { ComparisonInput } from "./ComparisonInput.js";
9
+ import { DimensionalitySection, areDimensionalitySetsEqual } from "./DimensionalitySection.js";
10
+ import { intervalIncludesZero } from "./helpers/intervalIncludesZero.js";
9
11
  import { OperatorDropdown } from "./OperatorDropdown.js";
10
12
  import { RangeInput } from "./RangeInput.js";
11
13
  import { TreatNullValuesAsZeroCheckbox } from "./TreatNullValuesAsZeroCheckbox.js";
@@ -13,7 +15,7 @@ import { WarningMessageComponent } from "./WarningMessage.js";
13
15
  const DefaultValuePrecision = 6;
14
16
  export const DropdownBodyWithIntl = memo(function DropdownBodyWithIntl(props) {
15
17
  const intl = useIntl();
16
- const { operator: propsOperator, value, usePercentage, treatNullAsZeroValue, valuePrecision = DefaultValuePrecision, } = props;
18
+ const { operator: propsOperator, value, usePercentage, treatNullAsZeroValue, valuePrecision = DefaultValuePrecision, isDimensionalityEnabled = false, insightDimensionality, } = props;
17
19
  const trimToPrecision = useCallback((n) => {
18
20
  if (!n) {
19
21
  return n;
@@ -33,11 +35,16 @@ export const DropdownBodyWithIntl = memo(function DropdownBodyWithIntl(props) {
33
35
  to: trimToPrecision(fromDecimalToPercent(value.to)),
34
36
  };
35
37
  }, [trimToPrecision, fromDecimalToPercent]);
36
- const [state, setState] = useState(() => ({
37
- operator: propsOperator || "ALL",
38
- value: (usePercentage ? convertToPercentageValue(value, propsOperator) : value) || {},
39
- enabledTreatNullValuesAsZero: treatNullAsZeroValue,
40
- }));
38
+ const [state, setState] = useState(() => {
39
+ // If the filter has dimensionality, use it; otherwise fall back to insight dimensionality (bucket defaults)
40
+ const initialDimensionality = (props.dimensionality?.length ?? 0) > 0 ? props.dimensionality : (insightDimensionality ?? []);
41
+ return {
42
+ operator: propsOperator || "ALL",
43
+ value: (usePercentage ? convertToPercentageValue(value, propsOperator) : value) || {},
44
+ enabledTreatNullValuesAsZero: treatNullAsZeroValue,
45
+ dimensionality: initialDimensionality ?? [],
46
+ };
47
+ });
41
48
  const convertToRawValue = useCallback((value, operator) => {
42
49
  if (!value) {
43
50
  return value;
@@ -49,8 +56,16 @@ export const DropdownBodyWithIntl = memo(function DropdownBodyWithIntl(props) {
49
56
  to: trimToPrecision(fromPercentToDecimal(value.to)),
50
57
  };
51
58
  }, [trimToPrecision, fromPercentToDecimal]);
59
+ const isDimensionalityChanged = useCallback(() => !areDimensionalitySetsEqual(props.dimensionality, state.dimensionality), [props.dimensionality, state.dimensionality]);
52
60
  const isChanged = useCallback(() => state.operator !== props.operator ||
53
- state.enabledTreatNullValuesAsZero !== props.treatNullAsZeroValue, [state.operator, state.enabledTreatNullValuesAsZero, props.operator, props.treatNullAsZeroValue]);
61
+ state.enabledTreatNullValuesAsZero !== props.treatNullAsZeroValue ||
62
+ isDimensionalityChanged(), [
63
+ state.operator,
64
+ state.enabledTreatNullValuesAsZero,
65
+ props.operator,
66
+ props.treatNullAsZeroValue,
67
+ isDimensionalityChanged,
68
+ ]);
54
69
  const isApplyButtonDisabledForComparison = useCallback(() => {
55
70
  const { value: stateValue = null } = state.value;
56
71
  if (stateValue === null || Number.isNaN(stateValue)) {
@@ -109,30 +124,76 @@ export const DropdownBodyWithIntl = memo(function DropdownBodyWithIntl(props) {
109
124
  const handleTreatNullAsZeroClicked = useCallback((checked) => {
110
125
  setState((prev) => ({ ...prev, enabledTreatNullValuesAsZero: checked }));
111
126
  }, []);
127
+ const handleDimensionalityChange = useCallback((dimensionality) => {
128
+ setState((prev) => ({ ...prev, dimensionality }));
129
+ }, []);
112
130
  const onApply = useCallback(() => {
113
131
  if (isApplyButtonDisabled()) {
114
132
  return;
115
133
  }
116
- const { enabledTreatNullValuesAsZero, operator: stateOperator, value: stateValue } = state;
134
+ const { enabledTreatNullValuesAsZero, operator: stateOperator, value: stateValue, dimensionality: stateDimensionality, } = state;
117
135
  const { usePercentage } = props;
118
136
  const finalOperator = stateOperator === "ALL" ? null : stateOperator;
119
137
  const finalValue = usePercentage ? convertToRawValue(stateValue, stateOperator) : stateValue;
120
- props.onApply(finalOperator, finalValue, enabledTreatNullValuesAsZero ?? false);
121
- }, [isApplyButtonDisabled, state, props, convertToRawValue]);
122
- const renderInputSection = useCallback(() => {
123
- const { usePercentage, disableAutofocus, separators } = props;
124
- const { operator, value: { value = null, from = null, to = null }, } = state;
125
- if (isComparisonConditionOperator(operator)) {
126
- return (_jsx(ComparisonInput, { value: value, usePercentage: usePercentage ?? false, onValueChange: handleValueChange, onEnterKeyPress: onApply, disableAutofocus: disableAutofocus, separators: separators }));
138
+ // Always include dimensionality in the output.
139
+ // When current dimensionality matches insight defaults (same set, order-insensitive),
140
+ // use the default order from insightDimensionality.
141
+ let finalDimensionality;
142
+ if (insightDimensionality?.length) {
143
+ if (areDimensionalitySetsEqual(stateDimensionality, insightDimensionality)) {
144
+ // Use default order from insight dimensionality
145
+ finalDimensionality = insightDimensionality.map((item) => item.identifier);
146
+ }
147
+ else {
148
+ // Use current state order
149
+ finalDimensionality =
150
+ stateDimensionality.length > 0
151
+ ? stateDimensionality.map((item) => item.identifier)
152
+ : undefined;
153
+ }
154
+ }
155
+ else {
156
+ // No insight defaults - use current state
157
+ finalDimensionality =
158
+ stateDimensionality.length > 0
159
+ ? stateDimensionality.map((item) => item.identifier)
160
+ : undefined;
161
+ }
162
+ props.onApply(finalOperator, finalValue, enabledTreatNullValuesAsZero ?? false, finalDimensionality);
163
+ }, [isApplyButtonDisabled, state, props, convertToRawValue, insightDimensionality]);
164
+ const renderInputSection = useMemo(() => {
165
+ if (isComparisonConditionOperator(state.operator)) {
166
+ return (_jsx(ComparisonInput, { value: state.value.value, usePercentage: props.usePercentage ?? false, onValueChange: handleValueChange, onEnterKeyPress: onApply, disableAutofocus: props.disableAutofocus, separators: props.separators }));
127
167
  }
128
- else if (isRangeConditionOperator(operator)) {
129
- return (_jsx(RangeInput, { from: from, to: to, usePercentage: usePercentage ?? false, onFromChange: handleFromChange, onToChange: handleToChange, onEnterKeyPress: onApply, disableAutofocus: disableAutofocus, separators: separators }));
168
+ else if (isRangeConditionOperator(state.operator)) {
169
+ return (_jsx(RangeInput, { from: state.value.from, to: state.value.to, usePercentage: props.usePercentage ?? false, onFromChange: handleFromChange, onToChange: handleToChange, onEnterKeyPress: onApply, disableAutofocus: props.disableAutofocus, separators: props.separators }));
130
170
  }
131
171
  return null;
132
- }, [props, state, handleValueChange, handleFromChange, handleToChange, onApply]);
172
+ }, [
173
+ handleValueChange,
174
+ handleFromChange,
175
+ handleToChange,
176
+ onApply,
177
+ state.value,
178
+ state.operator,
179
+ props.usePercentage,
180
+ props.disableAutofocus,
181
+ props.separators,
182
+ ]);
133
183
  const { onCancel, warningMessage, displayTreatNullAsZeroOption, enableOperatorSelection } = props;
134
- const { operator, enabledTreatNullValuesAsZero } = state;
135
- return (_jsxs("div", { className: "gd-mvf-dropdown-body gd-dialog gd-dropdown overlay s-mvf-dropdown-body", children: [_jsxs("div", { className: "gd-mvf-dropdown-content", children: [warningMessage ? (_jsx("div", { className: "gd-mvf-dropdown-section", children: _jsx(WarningMessageComponent, { warningMessage: warningMessage }) })) : null, _jsx("div", { className: "gd-mvf-dropdown-section", children: _jsx(OperatorDropdown, { onSelect: handleOperatorSelection, operator: operator, isDisabled: !enableOperatorSelection }) }), operator === "ALL" ? null : (_jsxs("div", { className: "gd-mvf-dropdown-section", children: [renderInputSection(), " ", displayTreatNullAsZeroOption ? (_jsx(TreatNullValuesAsZeroCheckbox, { onChange: handleTreatNullAsZeroClicked, checked: enabledTreatNullValuesAsZero, intl: intl })) : null] }))] }), _jsxs("div", { className: "gd-mvf-dropdown-footer", children: [_jsx(Button, { className: "gd-button-secondary gd-button-small s-mvf-dropdown-cancel", onClick: onCancel, value: intl.formatMessage({ id: "cancel" }) }), _jsx(Button, { className: "gd-button-action gd-button-small s-mvf-dropdown-apply", onClick: onApply, value: intl.formatMessage({ id: "apply" }), disabled: isApplyButtonDisabled() })] })] }));
184
+ const { operator, enabledTreatNullValuesAsZero, dimensionality } = state;
185
+ // Determine if the checkbox should be shown based on whether zero is in the filter interval
186
+ const shouldShowTreatNullAsZeroCheckbox = useMemo(() => {
187
+ if (!displayTreatNullAsZeroOption || operator === "ALL") {
188
+ return false;
189
+ }
190
+ // For comparison operators, use state.value.value
191
+ // For range operators, use state.value.from and state.value.to
192
+ const valueParam = isComparisonConditionOperator(operator) ? state.value.value : state.value.from;
193
+ const toParam = isRangeConditionOperator(operator) ? state.value.to : undefined;
194
+ return intervalIncludesZero(operator, valueParam, toParam);
195
+ }, [displayTreatNullAsZeroOption, operator, state.value]);
196
+ return (_jsxs("div", { className: "gd-mvf-dropdown-body gd-dialog gd-dropdown overlay s-mvf-dropdown-body", children: [_jsxs("div", { className: "gd-mvf-dropdown-content", children: [warningMessage ? (_jsx("div", { className: "gd-mvf-dropdown-section", children: _jsx(WarningMessageComponent, { warningMessage: warningMessage }) })) : null, _jsx("div", { className: "gd-mvf-dropdown-section", children: _jsx(OperatorDropdown, { onSelect: handleOperatorSelection, operator: operator, isDisabled: !enableOperatorSelection }) }), operator === "ALL" ? null : (_jsxs("div", { className: "gd-mvf-dropdown-section", children: [renderInputSection, " ", shouldShowTreatNullAsZeroCheckbox ? (_jsx(TreatNullValuesAsZeroCheckbox, { onChange: handleTreatNullAsZeroClicked, checked: enabledTreatNullValuesAsZero, intl: intl })) : null] })), isDimensionalityEnabled ? (_jsx(DimensionalitySection, { dimensionality: dimensionality, insightDimensionality: insightDimensionality, onDimensionalityChange: handleDimensionalityChange })) : null] }), _jsxs("div", { className: "gd-mvf-dropdown-footer", children: [_jsx(Button, { className: "gd-button-secondary gd-button-small s-mvf-dropdown-cancel", onClick: onCancel, value: intl.formatMessage({ id: "cancel" }) }), _jsx(Button, { className: "gd-button-action gd-button-small s-mvf-dropdown-apply", onClick: onApply, value: intl.formatMessage({ id: "apply" }), disabled: isApplyButtonDisabled() })] })] }));
136
197
  });
137
198
  export const DropdownBody = memo(function DropdownBody(props) {
138
199
  return (_jsx(IntlWrapper, { locale: props.locale, children: _jsx(DropdownBodyWithIntl, { ...props }) }));