@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.
- package/esm/MeasureValueFilter/AttributePicker.d.ts +26 -0
- package/esm/MeasureValueFilter/AttributePicker.d.ts.map +1 -0
- package/esm/MeasureValueFilter/AttributePicker.js +137 -0
- package/esm/MeasureValueFilter/AttributePicker.js.map +1 -0
- package/esm/MeasureValueFilter/DimensionalitySection.d.ts +28 -0
- package/esm/MeasureValueFilter/DimensionalitySection.d.ts.map +1 -0
- package/esm/MeasureValueFilter/DimensionalitySection.js +104 -0
- package/esm/MeasureValueFilter/DimensionalitySection.js.map +1 -0
- package/esm/MeasureValueFilter/Dropdown.d.ts +6 -2
- package/esm/MeasureValueFilter/Dropdown.d.ts.map +1 -1
- package/esm/MeasureValueFilter/Dropdown.js +4 -4
- package/esm/MeasureValueFilter/Dropdown.js.map +1 -1
- package/esm/MeasureValueFilter/DropdownBody.d.ts +6 -2
- package/esm/MeasureValueFilter/DropdownBody.d.ts.map +1 -1
- package/esm/MeasureValueFilter/DropdownBody.js +83 -22
- package/esm/MeasureValueFilter/DropdownBody.js.map +1 -1
- package/esm/MeasureValueFilter/MeasureValueFilterDropdown.d.ts.map +1 -1
- package/esm/MeasureValueFilter/MeasureValueFilterDropdown.js +18 -7
- package/esm/MeasureValueFilter/MeasureValueFilterDropdown.js.map +1 -1
- package/esm/MeasureValueFilter/helpers/intervalIncludesZero.d.ts +34 -0
- package/esm/MeasureValueFilter/helpers/intervalIncludesZero.d.ts.map +1 -0
- package/esm/MeasureValueFilter/helpers/intervalIncludesZero.js +95 -0
- package/esm/MeasureValueFilter/helpers/intervalIncludesZero.js.map +1 -0
- package/esm/MeasureValueFilter/types.d.ts +3 -0
- package/esm/MeasureValueFilter/types.d.ts.map +1 -1
- package/esm/MeasureValueFilter/typings.d.ts +28 -1
- package/esm/MeasureValueFilter/typings.d.ts.map +1 -1
- package/esm/MeasureValueFilter/typings.js.map +1 -1
- package/esm/index.d.ts +3 -1
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +1 -9
- package/esm/index.js.map +1 -1
- package/esm/sdk-ui-filters.d.ts +69 -0
- package/package.json +10 -10
- package/styles/css/main.css +81 -0
- package/styles/css/main.css.map +1 -1
- package/styles/css/measureValueFilter.css +81 -0
- package/styles/css/measureValueFilter.css.map +1 -1
- 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":";AAAA,gCAAgC;AAEhC,OAAO,EAAsC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAExG,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAEH,KAAK,EACL,OAAO,EACP,QAAQ,EACR,wBAAwB,EACxB,UAAU,EACV,MAAM,EACN,YAAY,EACZ,SAAS,GAEZ,MAAM,sBAAsB,CAAC;AAS9B,SAAS,4BAA4B,CAAC,EAClC,IAAI,EACJ,SAAS,EACT,SAAS,EACT,QAAQ,GAC8C;IACtD,MAAM,EAAE,kBAAkB,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC;IACpD,MAAM,UAAU,GACZ,kBAAkB,CAAC,IAAI,KAAK,mBAAmB,IAAI,kBAAkB,CAAC,IAAI,KAAK,aAAa,CAAC;IACjG,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC;IACtD,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAErD,OAAO,CACH,eACI,SAAS,EAAE,uDAAuD,SAAS,CAAC,CAAC,CAAC,qCAAqC,CAAC,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,qCAAqC,CAAC,CAAC,CAAC,EAAE,EAAE,EACnL,OAAO,EAAE,QAAQ,sBACC,kBAAkB,CAAC,IAAI,IAAI,WAAW,aAExD,KAAC,UAAU,IAAC,OAAO,EAAE,SAAS,EAAE,cAAc,SAAG,EACjD,KAAC,MAAM,IAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,SAAG,EACjE,eAAM,SAAS,EAAC,+BAA+B,YAAE,kBAAkB,CAAC,KAAK,GAAQ,IAC/E,CACT,CAAC;AACN,CAAC;AAqBD;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,eAAe,CAAC,EACzD,cAAc,EACd,KAAK,EACL,QAAQ,EACR,aAAa,GACO;IACpB,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,SAAS,GAAG,KAAK,EAAE,CAAC;IAC1B,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAc,IAAI,GAAG,EAAE,CAAC,CAAC;IACvE,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACrD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAuB,WAAW,CAAC,CAAC;IAEhF,sCAAsC;IACtC,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE;QAC7C,IAAI,aAAa,GAAG,KAAK,CAAC;QAC1B,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;YAChC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,KAAK,mBAAmB,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa,CAAC;YACpF,IAAI,UAAU,EAAE,CAAC;gBACb,QAAQ,GAAG,IAAI,CAAC;YACpB,CAAC;iBAAM,CAAC;gBACJ,aAAa,GAAG,IAAI,CAAC;YACzB,CAAC;YACD,IAAI,aAAa,IAAI,QAAQ;gBAAE,MAAM;QACzC,CAAC;QACD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC;IACvC,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;IAErB,8CAA8C;IAC9C,MAAM,cAAc,GAAG,aAAa,IAAI,QAAQ,CAAC;IAEjD,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,KAAsB,EAAE,EAAE;QACxD,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACnC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,uBAAuB,GAAG,WAAW,CACvC,CAAC,CAAgB,EAAE,EAAE;QACjB,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,CAAC,CAAC,eAAe,EAAE,CAAC;QACxB,CAAC;IACL,CAAC,EACD,CAAC,YAAY,CAAC,CACjB,CAAC;IAEF,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,IAAyB,EAAU,EAAE;QAChE,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC;QAC5B,IAAI,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;YACpB,OAAO,GAAG,CAAC,eAAe,CAAC;QAC/B,CAAC;QACD,IAAI,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,GAAG,CAAC,UAAU,CAAC;QAC1B,CAAC;QACD,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAChB,OAAO,GAAG,CAAC,GAAG,CAAC;QACnB,CAAC;QACD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,gBAAgB,GAAG,WAAW,CAAC,CAAC,IAAyD,EAAE,EAAE;QAC/F,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;QACvB,cAAc,CAAC,CAAC,IAAI,EAAE,EAAE;YACpB,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;YAC7B,IAAI,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBACrB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC1B,CAAC;iBAAM,CAAC;gBACJ,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACvB,CAAC;YACD,OAAO,MAAM,CAAC;QAClB,CAAC,CAAC,CAAC;IACP,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;QAC/B,MAAM,UAAU,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrF,KAAK,CAAC,UAAU,CAAC,CAAC;IACtB,CAAC,EAAE,CAAC,cAAc,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;IAEpD,MAAM,aAAa,GAAG,WAAW,CAAC,IAAI,KAAK,CAAC,CAAC;IAE7C,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,EAAE;QAC/B,IAAI,KAAK,GAAG,cAAc,CAAC;QAE3B,uCAAuC;QACvC,IAAI,cAAc,EAAE,CAAC;YACjB,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;gBAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,KAAK,mBAAmB,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa,CAAC;gBACpF,OAAO,UAAU,KAAK,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;YAC5D,CAAC,CAAC,CAAC;QACP,CAAC;QAED,0BAA0B;QAC1B,IAAI,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC;YACtB,MAAM,WAAW,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC;YAC/C,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;QACnF,CAAC;QAED,OAAO,KAAK,CAAC;IACjB,CAAC,EAAE,CAAC,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC,CAAC;IAE/D,MAAM,YAAY,GAAG,OAAO,CAAC,GAA0D,EAAE;QACrF,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YAC9B,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAC/B,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC1C,OAAO;gBACH,IAAI,EAAE,aAAa;gBACnB,EAAE,EAAE,MAAM;gBACV,WAAW,EAAE,IAAI,CAAC,KAAK;gBACvB,IAAI,EAAE;oBACF,kBAAkB,EAAE,IAAI;oBACxB,SAAS;iBACZ;aACJ,CAAC;QACN,CAAC,CAAC,CAAC;IACP,CAAC,EAAE,CAAC,aAAa,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;IAE5C,OAAO,CACH,KAAC,OAAO,IACJ,OAAO,EAAE,aAAa,EACtB,WAAW,EAAE;YACT,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;YAC1C,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;YAC3C,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;YAC1C,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;SAC9C,EACD,YAAY,EAAC,cAAc,EAC3B,mBAAmB,QACnB,aAAa,QACb,OAAO,EAAE,QAAQ,YAEjB,cAAK,SAAS,EAAC,qBAAqB,YAChC,eAAK,SAAS,EAAC,qDAAqD,aAChE,eAAK,SAAS,EAAC,gCAAgC,aAC3C,eAAK,SAAS,EAAC,sCAAsC,aACjD,KAAC,MAAM,IAAC,IAAI,EAAC,cAAc,EAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAC,iBAAiB,EAAC,UAAU,SAAG,EAC1E,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,2BAA2B,EAAE,CAAC,IACtD,EACN,KAAC,YAAY,IACT,IAAI,EAAC,OAAO,EACZ,OAAO,EAAC,MAAM,EACd,IAAI,EAAC,OAAO,EACZ,OAAO,EAAE,QAAQ,EACjB,mBAAmB,EAAE;oCACjB,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC;iCAClD,EACD,UAAU,EAAC,8BAA8B,GAC3C,IACA,EACN,cAAK,SAAS,EAAC,oCAAoC,YAC/C,KAAC,KAAK,IACF,SAAS,EAAC,sCAAsC,EAChD,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,YAAY,EACtB,aAAa,EAAE,uBAAuB,EACtC,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,4BAA4B,EAAE,CAAC,EACrE,SAAS,QACT,UAAU,QACV,QAAQ,QACR,OAAO,QACP,mBAAmB,EAAE;gCACjB,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,mCAAmC,EAAE,CAAC;6BAC7E,GACH,GACA,EACL,cAAc,CAAC,CAAC,CAAC,CACd,cAAK,SAAS,EAAC,qCAAqC,YAChD,MAAC,wBAAwB,IAAC,MAAM,EAAC,MAAM,aACnC,KAAC,YAAY,IACT,IAAI,EAAC,cAAc,EACnB,SAAS,EAAC,SAAS,EACnB,IAAI,EAAC,OAAO,EACZ,OAAO,EAAC,WAAW,EACnB,QAAQ,EAAE,UAAU,KAAK,WAAW,EACpC,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,WAAW,CAAC,EACzC,mBAAmB,EAAE;wCACjB,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC;4CAC1B,EAAE,EAAE,uCAAuC;yCAC9C,CAAC;qCACL,EACD,UAAU,EAAC,0CAA0C,GACvD,EACF,KAAC,YAAY,IACT,IAAI,EAAC,MAAM,EACX,SAAS,EAAC,SAAS,EACnB,IAAI,EAAC,OAAO,EACZ,OAAO,EAAC,WAAW,EACnB,QAAQ,EAAE,UAAU,KAAK,MAAM,EAC/B,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,EACpC,mBAAmB,EAAE;wCACjB,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC;4CAC1B,EAAE,EAAE,kCAAkC;yCACzC,CAAC;qCACL,EACD,UAAU,EAAC,qCAAqC,GAClD,IACqB,GACzB,CACT,CAAC,CAAC,CAAC,IAAI,EACR,cAAK,SAAS,EAAC,iCAAiC,YAC3C,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACzB,cAAK,SAAS,EAAC,oCAAoC,YAC9C,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,+BAA+B,EAAE,CAAC,GAC1D,CACT,CAAC,CAAC,CAAC,CACA,8BACK,cAAc,CAAC,CAAC,CAAC,CACd,cAAK,SAAS,EAAC,qCAAqC,YAC/C,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,wCAAwC,EAAE,CAAC,GACnE,CACT,CAAC,CAAC,CAAC,IAAI,EACR,KAAC,SAAS,IACN,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,gBAAgB,EAC1B,mBAAmB,EAAE,KAAK,EAC1B,SAAS,QACT,wBAAwB,EAAE,4BAA4B,EACtD,cAAc,EAAE;wCACZ,EAAE,EAAE,SAAS;wCACb,YAAY,EAAE,IAAI,CAAC,aAAa,CAAC;4CAC7B,EAAE,EAAE,2BAA2B;yCAClC,CAAC;qCACL,EACD,UAAU,EAAC,6BAA6B,GAC1C,IACH,CACN,GACC,EACN,eAAK,SAAS,EAAC,gCAAgC,aAC3C,KAAC,QAAQ,IACL,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,OAAO,EACZ,OAAO,EAAE,QAAQ,EACjB,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,GAC7C,EACF,KAAC,QAAQ,IACL,OAAO,EAAC,SAAS,EACjB,IAAI,EAAC,OAAO,EACZ,OAAO,EAAE,SAAS,EAClB,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,yBAAyB,EAAE,CAAC,EAC5D,UAAU,EAAE,aAAa,GAC3B,IACA,IACJ,GACJ,GACA,CACb,CAAC;AACN,CAAC,CAAC,CAAC"}
|
|
@@ -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":";AAAA,gCAAgC;AAEhC,OAAO,EAIH,IAAI,EACJ,WAAW,EACX,OAAO,EACP,MAAM,EACN,QAAQ,GACX,MAAM,OAAO,CAAC;AAEf,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAEjG,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAYvD,SAAS,aAAa,CAAC,EACnB,QAAQ,EACR,eAAe,EACf,UAAU,EACV,OAAO,EACP,SAAS,EACT,OAAO,GACW;IAClB,IAAI,CAAC,eAAe,EAAE,CAAC;QACnB,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,OAAO,CACH,eAAK,SAAS,EAAC,mCAAmC,aAC7C,QAAQ,EACT,MAAC,kBAAkB,eACf,KAAC,YAAY,IACT,GAAG,EAAE,SAAS,EACd,IAAI,EAAC,MAAM,EACX,IAAI,EAAC,OAAO,EACZ,OAAO,EAAC,UAAU,EAClB,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,OAAO,GAClB,EACF,KAAC,MAAM,IAAC,WAAW,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,YAAG,OAAO,GAAU,IAC5C,IACnB,CACT,CAAC;AACN,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CACtC,CAAoC,EACpC,CAAoC,EAC7B,EAAE;IACT,MAAM,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IACvB,MAAM,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAEvB,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;QAClC,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,6CAA6C;IAC7C,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAC1B,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAC9E,CAAC;AACN,CAAC,CAAC;AAiBF;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC,SAAS,qBAAqB,CAAC,EACrE,cAAc,EACd,qBAAqB,EACrB,sBAAsB,GACI;IAC1B,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IAEvB,6DAA6D;IAC7D,MAAM,kBAAkB,GAAG,MAAM,CAA2B,IAAI,CAAC,CAAC;IAElE,iFAAiF;IACjF,MAAM,CAAC,qBAAqB,EAAE,wBAAwB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC1E,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAA0B,YAAY,CAAC,CAAC;IAEpF,iEAAiE;IACjE,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAqB,IAAI,CAAC,CAAC;IAEnF;;;OAGG;IACH,MAAM,qBAAqB,GAAG,OAAO,CAAC,GAAG,EAAE;QACvC,OAAO,CAAC,0BAA0B,CAAC,cAAc,EAAE,qBAAqB,CAAC,CAAC;IAC9E,CAAC,EAAE,CAAC,cAAc,EAAE,qBAAqB,CAAC,CAAC,CAAC;IAE5C;;;OAGG;IACH,MAAM,4BAA4B,GAAG,OAAO,CAAC,GAAG,EAAE;QAC9C,IAAI,CAAC,qBAAqB,EAAE,MAAM,EAAE,CAAC;YACjC,OAAO,EAAE,CAAC;QACd,CAAC;QACD,OAAO,qBAAqB,CAAC,MAAM,CAC/B,CAAC,WAAW,EAAE,EAAE,CACZ,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAChC,eAAe,CAAC,WAAW,CAAC,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC,CACjE,CACR,CAAC;IACN,CAAC,EAAE,CAAC,qBAAqB,EAAE,cAAc,CAAC,CAAC,CAAC;IAE5C,0DAA0D;IAC1D,MAAM,mBAAmB,GAAG,4BAA4B,CAAC,MAAM,KAAK,CAAC,CAAC;IAEtE,MAAM,0BAA0B,GAAG,WAAW,CAC1C,CAAC,KAAa,EAAE,EAAE;QACd,sBAAsB,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC;IACzE,CAAC,EACD,CAAC,cAAc,EAAE,sBAAsB,CAAC,CAC3C,CAAC;IAEF;;OAEG;IACH,MAAM,yBAAyB,GAAG,WAAW,CAAC,GAAG,EAAE;QAC/C,sBAAsB,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC;IACxD,CAAC,EAAE,CAAC,qBAAqB,EAAE,sBAAsB,CAAC,CAAC,CAAC;IAEpD,MAAM,+BAA+B,GAAG,WAAW,CAAC,GAAG,EAAE;QACrD,IAAI,4BAA4B,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1C,aAAa,CAAC,QAAQ,CAAC,CAAC;YACxB,wBAAwB,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC;IACL,CAAC,EAAE,CAAC,4BAA4B,CAAC,MAAM,CAAC,CAAC,CAAC;IAE1C,MAAM,mCAAmC,GAAG,WAAW,CACnD,CAAC,KAAoC,EAAE,EAAE;QACrC,IAAI,4BAA4B,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1C,aAAa,CAAC,YAAY,CAAC,CAAC;YAC5B,mBAAmB,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YACzC,wBAAwB,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC;IACL,CAAC,EACD,CAAC,4BAA4B,CAAC,MAAM,CAAC,CACxC,CAAC;IAEF,MAAM,0BAA0B,GAAG,WAAW,CAAC,GAAG,EAAE;QAChD,wBAAwB,CAAC,KAAK,CAAC,CAAC;QAChC,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,4BAA4B,GAAG,WAAW,CAC5C,CAAC,KAA4B,EAAE,EAAE;QAC7B,sBAAsB,CAAC,CAAC,GAAG,cAAc,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC;QACtD,wBAAwB,CAAC,KAAK,CAAC,CAAC;QAChC,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC,EACD,CAAC,cAAc,EAAE,sBAAsB,CAAC,CAC3C,CAAC;IAEF,MAAM,gBAAgB,GAAG,mBAAmB;QACxC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,+CAA+C,EAAE,CAAC;QAC7E,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,sCAAsC,EAAE,CAAC,CAAC;IAEzE,6CAA6C;IAC7C,MAAM,YAAY,GAAG,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC;IAE7F,OAAO,CACH,eAAK,SAAS,EAAC,oEAAoE,aAC/E,eAAK,SAAS,EAAC,8BAA8B,aACzC,0BAAQ,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,4BAA4B,EAAE,CAAC,GAAS,EACxE,qBAAqB,CAAC,CAAC,CAAC,CACrB,yBACI,MAAC,kBAAkB,eACf,KAAC,QAAQ,IACL,IAAI,EAAC,OAAO,EACZ,OAAO,EAAC,UAAU,EAClB,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,0BAA0B,EAAE,CAAC,EAC7D,OAAO,EAAE,yBAAyB,GACpC,EACF,KAAC,MAAM,IAAC,WAAW,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,YACpC,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,kCAAkC,EAAE,CAAC,GAC1D,IACQ,GAClB,CACV,CAAC,CAAC,CAAC,IAAI,IACN,EACL,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CACzB,cAAK,SAAS,EAAC,6BAA6B,YACvC,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;oBAChC,4EAA4E;oBAC5E,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,KAAK,mBAAmB,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa,CAAC;oBACpF,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC;oBAClD,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;oBAErD,OAAO,CACH,KAAC,aAAa,IAEV,eAAe,EAAE,KAAK,KAAK,cAAc,CAAC,MAAM,GAAG,CAAC,EACpD,UAAU,EAAE,mBAAmB,EAC/B,OAAO,EAAE,gBAAgB,EACzB,SAAS,EAAE,kBAAkB,EAC7B,OAAO,EAAE,+BAA+B,YAExC,KAAC,KAAK,IACF,OAAO,EAAC,UAAU,EAClB,IAAI,EAAC,OAAO,EACZ,UAAU,EAAE,IAAI,EAChB,eAAe,EAAE,SAAS,EAC1B,KAAK,EAAE,IAAI,CAAC,KAAK,EACjB,WAAW,QACX,QAAQ,EAAE,GAAG,EAAE,CAAC,0BAA0B,CAAC,KAAK,CAAC,EACjD,UAAU,EAAE,sBAAsB,KAAK,EAAE,GAC3C,IAhBG,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAiBxB,CACnB,CAAC;gBACN,CAAC,CAAC,GACA,CACT,CAAC,CAAC,CAAC,CACA,KAAC,QAAQ,IACL,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,kCAAkC,EAAE,CAAC,EACrE,OAAO,EAAC,UAAU,EAClB,IAAI,EAAC,OAAO,EACZ,UAAU,EAAC,MAAM,EACjB,UAAU,EAAE,mBAAmB,EAC/B,OAAO,EAAE,mCAAmC,GAC9C,CACL,EACA,qBAAqB,IAAI,YAAY,CAAC,CAAC,CAAC,CACrC,KAAC,eAAe,IACZ,cAAc,EAAE,4BAA4B,EAC5C,aAAa,EAAE,YAAY,EAC3B,KAAK,EAAE,4BAA4B,EACnC,QAAQ,EAAE,0BAA0B,GACtC,CACL,CAAC,CAAC,CAAC,IAAI,IACN,CACT,CAAC;AACN,CAAC,CAAC,CAAC"}
|
|
@@ -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;
|
|
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;
|
|
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":"
|
|
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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
|
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
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
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
|
-
}, [
|
|
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
|
-
|
|
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 }) }));
|