@geotab/zenith 1.26.4 → 1.26.5-beta.0
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/README.md +6 -0
- package/dist/absolute/absolute.js +2 -2
- package/dist/chip/chip.d.ts +35 -0
- package/dist/chip/chip.js +105 -0
- package/dist/chip/chipStatusProvider.d.ts +9 -0
- package/dist/chip/chipStatusProvider.js +13 -0
- package/dist/chip/utils/getChipStateClassName.d.ts +2 -0
- package/dist/chip/utils/getChipStateClassName.js +32 -0
- package/dist/chip/utils/useChip.d.ts +10 -0
- package/dist/chip/utils/useChip.js +24 -0
- package/dist/commonHelpers/hooks/useDebouncedMemo.d.ts +2 -0
- package/dist/commonHelpers/hooks/useDebouncedMemo.js +26 -0
- package/dist/commonStyles/shadows/shadows.less +4 -0
- package/dist/dateRange/dateRange.d.ts +2 -1
- package/dist/dateRange/dateRange.js +6 -2
- package/dist/dropdown/dropdown.d.ts +18 -3
- package/dist/dropdown/dropdown.js +63 -31
- package/dist/dropdown/dropdownHelper.d.ts +1 -1
- package/dist/dropdown/dropdownHelper.js +7 -3
- package/dist/dropdown/dropdownList.d.ts +1 -0
- package/dist/dropdown/dropdownList.js +2 -2
- package/dist/dropdown/dropdownPopup.d.ts +1 -0
- package/dist/dropdown/dropdownPopup.js +2 -2
- package/dist/dropdown/stateReducer/stateAction.d.ts +9 -1
- package/dist/dropdown/stateReducer/stateActionType.d.ts +1 -0
- package/dist/dropdown/stateReducer/stateActionType.js +1 -0
- package/dist/dropdown/stateReducer/stateReducer.js +35 -0
- package/dist/dropdown/useDropdownState.d.ts +7 -0
- package/dist/dropdown/useDropdownState.js +10 -0
- package/dist/filters/components/filtersChip.d.ts +9 -0
- package/dist/filters/components/filtersChip.js +28 -0
- package/dist/filters/components/filtersContainer.d.ts +12 -0
- package/dist/filters/components/filtersContainer.js +77 -0
- package/dist/filters/components/filtersCustom.d.ts +13 -0
- package/dist/filters/components/filtersCustom.js +15 -0
- package/dist/filters/components/filtersDateRange.d.ts +33 -0
- package/dist/filters/components/filtersDateRange.js +27 -0
- package/dist/filters/components/filtersDropdown.d.ts +32 -0
- package/dist/filters/components/filtersDropdown.js +42 -0
- package/dist/filters/components/filtersGroups.d.ts +14 -0
- package/dist/filters/components/filtersGroups.js +28 -0
- package/dist/filters/components/filtersItem.d.ts +25 -0
- package/dist/filters/components/filtersItem.js +23 -0
- package/dist/filters/components/filtersModal.d.ts +17 -0
- package/dist/filters/components/filtersModal.js +107 -0
- package/dist/filters/components/filtersModalItem.d.ts +9 -0
- package/dist/filters/components/filtersModalItem.js +74 -0
- package/dist/filters/components/filtersRange.d.ts +11 -0
- package/dist/filters/components/filtersRange.js +27 -0
- package/dist/filters/components/filtersSaveModal.d.ts +7 -0
- package/dist/filters/components/filtersSaveModal.js +53 -0
- package/dist/filters/components/filtersSavedChipComponent.d.ts +2 -0
- package/dist/filters/components/filtersSavedChipComponent.js +66 -0
- package/dist/filters/components/filtersSavedItemsProvider.d.ts +19 -0
- package/dist/filters/components/filtersSavedItemsProvider.js +13 -0
- package/dist/filters/components/filtersSearch.d.ts +16 -0
- package/dist/filters/components/filtersSearch.js +64 -0
- package/dist/filters/components/filtersSearchItemData.d.ts +16 -0
- package/dist/filters/components/filtersSearchItemData.js +42 -0
- package/dist/filters/components/filtersSearchList.d.ts +30 -0
- package/dist/filters/components/filtersSearchList.js +75 -0
- package/dist/filters/components/filtersSelect.d.ts +30 -0
- package/dist/filters/components/filtersSelect.js +51 -0
- package/dist/filters/components/filtersSelectListItem.d.ts +15 -0
- package/dist/filters/components/filtersSelectListItem.js +14 -0
- package/dist/filters/filters.d.ts +99 -0
- package/dist/filters/filters.js +246 -0
- package/dist/filters/filtersHelper.d.ts +40 -0
- package/dist/filters/filtersHelper.js +226 -0
- package/dist/filters/filtersHooks.d.ts +19 -0
- package/dist/filters/filtersHooks.js +25 -0
- package/dist/filtersBar/components/filtersBarDropdownWithCheckbox/filtersBarDropdownWithCheckbox.d.ts +5 -3
- package/dist/groupsFilter/groupsFilter.d.ts +10 -1
- package/dist/groupsFilter/groupsFilter.js +40 -11
- package/dist/header/components/collapsedItemsControl/collapsedItemsControl.js +7 -4
- package/dist/header/headerMenu.d.ts +1 -0
- package/dist/header/headerMenu.js +11 -4
- package/dist/index.css +3453 -2649
- package/dist/index.d.ts +18 -3
- package/dist/index.js +55 -15
- package/dist/layout/layout.js +5 -0
- package/dist/list/list.d.ts +1 -1
- package/dist/list/list.js +3 -2
- package/dist/modal/modal.d.ts +11 -1
- package/dist/modal/modal.js +8 -5
- package/dist/nav/nav.d.ts +1 -0
- package/dist/nav/nav.js +21 -7
- package/dist/nav/navHeader/navHeader.js +1 -1
- package/dist/nav/navItem/navItem.d.ts +4 -2
- package/dist/nav/navItem/navItem.js +25 -10
- package/dist/nav/navMobileBar/navMobileBar.d.ts +11 -0
- package/dist/nav/navMobileBar/navMobileBar.js +33 -0
- package/dist/nav/navSection/navSection.js +52 -1
- package/dist/nav/storyHelpers/storyDecorator.js +2 -1
- package/dist/nav/utils/navUtils.d.ts +6 -1
- package/dist/nav/utils/navUtils.js +48 -1
- package/dist/pageHeader/pageHeader.d.ts +16 -0
- package/dist/pageHeader/pageHeader.js +21 -0
- package/dist/pageHeader/pageHeaderActions.d.ts +10 -0
- package/dist/pageHeader/pageHeaderActions.js +35 -0
- package/dist/pageHeader/pageHeaderButton.d.ts +16 -0
- package/dist/pageHeader/pageHeaderButton.js +26 -0
- package/dist/pageHeader/pageHeaderFilters.d.ts +13 -0
- package/dist/pageHeader/pageHeaderFilters.js +7 -0
- package/dist/pageHeader/pageHeaderHelpers.d.ts +4 -0
- package/dist/pageHeader/pageHeaderHelpers.js +62 -0
- package/dist/pageHeader/pageHeaderMenu.d.ts +9 -0
- package/dist/pageHeader/pageHeaderMenu.js +9 -0
- package/dist/pillBox/components/pillBoxItem.js +1 -1
- package/dist/pillBox/pillBox.d.ts +1 -0
- package/dist/pillBox/pillBox.js +2 -2
- package/dist/range/range.d.ts +2 -1
- package/dist/range/range.js +11 -2
- package/dist/tabs/tabs.d.ts +1 -2
- package/dist/utils/localization/translations/en-json.d.ts +18 -0
- package/dist/utils/localization/translations/en-json.js +19 -1
- package/package.json +1 -1
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ReactElement } from "react";
|
|
2
|
+
import { IZenComponentProps } from "../../commonHelpers/zenComponent";
|
|
3
|
+
import { ITabElement } from "../../tabs/tabs";
|
|
4
|
+
import { TFiltersComponentsItemState, TFiltersComponentsProps } from "./filtersItem";
|
|
5
|
+
import "./filtersModal.less";
|
|
6
|
+
export interface IFiltersModal extends IZenComponentProps {
|
|
7
|
+
isOpen: boolean;
|
|
8
|
+
onClose: () => void;
|
|
9
|
+
onApply: (state: Record<string, TFiltersComponentsItemState>) => void;
|
|
10
|
+
onPin?: () => void;
|
|
11
|
+
isPinned?: boolean;
|
|
12
|
+
tabItems: ITabElement[];
|
|
13
|
+
filters: ReactElement<TFiltersComponentsProps>[];
|
|
14
|
+
externalModalState?: Record<string, TFiltersComponentsItemState>;
|
|
15
|
+
setExternalModalState?: (newState: Partial<Record<string, TFiltersComponentsItemState>>) => void;
|
|
16
|
+
}
|
|
17
|
+
export declare const FiltersModal: ({ isOpen, onClose, onApply, onPin, tabItems, filters, externalModalState, setExternalModalState, isPinned }: IFiltersModal) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FiltersModal = void 0;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const react_1 = require("react");
|
|
6
|
+
const modal_1 = require("../../modal/modal");
|
|
7
|
+
const useLanguage_1 = require("../../utils/localization/useLanguage");
|
|
8
|
+
const tabs_1 = require("../../tabs/tabs");
|
|
9
|
+
const filtersHelper_1 = require("../filtersHelper");
|
|
10
|
+
const filtersModalItem_1 = require("./filtersModalItem");
|
|
11
|
+
const classNames_1 = require("../../commonHelpers/classNames/classNames");
|
|
12
|
+
const filtersSavedItemsProvider_1 = require("./filtersSavedItemsProvider");
|
|
13
|
+
const filtersSelect_1 = require("./filtersSelect");
|
|
14
|
+
const filtersSaveModal_1 = require("./filtersSaveModal");
|
|
15
|
+
const button_1 = require("../../button/button");
|
|
16
|
+
const iconDisk_1 = require("../../icons/iconDisk");
|
|
17
|
+
const useDriveClassName_1 = require("../../utils/theme/useDriveClassName");
|
|
18
|
+
const iconPin2_1 = require("../../icons/iconPin2");
|
|
19
|
+
const FiltersModal = ({ isOpen, onClose, onApply, onPin, tabItems, filters, externalModalState, setExternalModalState, isPinned = false }) => {
|
|
20
|
+
const { translate } = (0, useLanguage_1.useLanguage)();
|
|
21
|
+
const { onSave } = (0, filtersSavedItemsProvider_1.useFiltersSavedItems)();
|
|
22
|
+
const iconDriveClassName = (0, useDriveClassName_1.useDriveClassName)("icon");
|
|
23
|
+
const [activeTabId, setActiveTabId] = (0, react_1.useState)(filtersSelect_1.ALL_SELECT_OPTION_ID);
|
|
24
|
+
const [isSaveModalOpen, setIsSaveModalOpen] = (0, react_1.useState)(false);
|
|
25
|
+
const [filtersInternalModalState, setFiltersInternalModalState] = (0, react_1.useState)((0, filtersHelper_1.createStateObject)(filters, "state"));
|
|
26
|
+
const [initialExternalModalState] = (0, react_1.useState)(externalModalState);
|
|
27
|
+
const onTabChange = (newVal) => {
|
|
28
|
+
setActiveTabId(newVal);
|
|
29
|
+
};
|
|
30
|
+
const externalMode = (0, react_1.useMemo)(() => {
|
|
31
|
+
if (externalModalState === undefined || setExternalModalState === undefined) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
return true;
|
|
35
|
+
}, [externalModalState, setExternalModalState]);
|
|
36
|
+
const handleInternalFiltersStateChange = (0, react_1.useCallback)((id) => (newState) => {
|
|
37
|
+
setFiltersInternalModalState((prevState) => (Object.assign(Object.assign({}, prevState), { [id]: newState })));
|
|
38
|
+
}, []);
|
|
39
|
+
const handleExternalFiltersStateChange = (0, react_1.useCallback)((id) => (newState) => {
|
|
40
|
+
setExternalModalState && setExternalModalState({ [id]: newState });
|
|
41
|
+
}, [setExternalModalState]);
|
|
42
|
+
const currentState = (0, react_1.useMemo)(() => externalMode ? externalModalState
|
|
43
|
+
: filtersInternalModalState, [externalMode, externalModalState, filtersInternalModalState]);
|
|
44
|
+
const currentFilters = (0, react_1.useMemo)(() => filters.filter((item) => currentState.hasOwnProperty(item.props.id)
|
|
45
|
+
&& (typeof item.props.visible === "boolean" ? item.props.visible
|
|
46
|
+
: item.props.visible === undefined ? true : item.props.visible([activeTabId], currentState))), [activeTabId, currentState, filters]);
|
|
47
|
+
const inhibitedFilters = (0, react_1.useMemo)(() => {
|
|
48
|
+
const inhibited = new Set();
|
|
49
|
+
if (externalMode) {
|
|
50
|
+
return inhibited;
|
|
51
|
+
}
|
|
52
|
+
currentFilters.forEach((item) => {
|
|
53
|
+
if (item.props.inhibit && item.props.inhibit.length > 0) {
|
|
54
|
+
item.props.inhibit.forEach((id) => inhibited.add(id));
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
return inhibited;
|
|
58
|
+
}, [currentFilters, externalMode]);
|
|
59
|
+
const handleClearClick = (0, react_1.useCallback)(() => {
|
|
60
|
+
const newState = (0, filtersHelper_1.createStateObject)(filters, "defaultState");
|
|
61
|
+
externalMode && setExternalModalState ? setExternalModalState(Object.assign({}, newState)) : setFiltersInternalModalState(newState);
|
|
62
|
+
}, [externalMode, filters, setExternalModalState]);
|
|
63
|
+
const handleApplyClick = (0, react_1.useCallback)(() => {
|
|
64
|
+
const stateForApply = externalMode ? currentState : {};
|
|
65
|
+
if (!externalMode) {
|
|
66
|
+
Object.keys(currentState).forEach(key => {
|
|
67
|
+
if (!inhibitedFilters.has(key)) {
|
|
68
|
+
stateForApply[key] = currentState[key];
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
onApply(stateForApply);
|
|
73
|
+
onClose();
|
|
74
|
+
}, [currentState, externalMode, inhibitedFilters, onApply, onClose]);
|
|
75
|
+
const handleCancelClick = (0, react_1.useCallback)(() => {
|
|
76
|
+
const newState = (0, filtersHelper_1.createStateObject)(filters, "state");
|
|
77
|
+
externalMode && setExternalModalState ? setExternalModalState(Object.assign({}, newState)) : setFiltersInternalModalState(newState);
|
|
78
|
+
onClose();
|
|
79
|
+
}, [externalMode, filters, onClose, setExternalModalState]);
|
|
80
|
+
const handleExternalModeClose = (0, react_1.useCallback)(() => {
|
|
81
|
+
if (!(externalMode && initialExternalModalState && setExternalModalState)) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
setExternalModalState(initialExternalModalState);
|
|
85
|
+
onClose();
|
|
86
|
+
}, [externalMode, initialExternalModalState, onClose, setExternalModalState]);
|
|
87
|
+
const toggleSaveModal = (0, react_1.useCallback)(() => {
|
|
88
|
+
setIsSaveModalOpen(val => !val);
|
|
89
|
+
}, []);
|
|
90
|
+
const handleSaveFilters = (0, react_1.useCallback)((filterName) => {
|
|
91
|
+
const stateForApply = externalMode ? currentState : {};
|
|
92
|
+
if (!externalMode) {
|
|
93
|
+
Object.keys(currentState).forEach(key => {
|
|
94
|
+
if (!inhibitedFilters.has(key)) {
|
|
95
|
+
stateForApply[key] = currentState[key];
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
onSave && onSave(filterName, stateForApply);
|
|
100
|
+
}, [externalMode, currentState, onSave, inhibitedFilters]);
|
|
101
|
+
const modalItemChangeHandler = (0, react_1.useCallback)((id) => externalMode ? handleExternalFiltersStateChange(id) : handleInternalFiltersStateChange(id), [externalMode, handleExternalFiltersStateChange, handleInternalFiltersStateChange]);
|
|
102
|
+
const tabsContent = (0, react_1.useMemo)(() => currentFilters.filter((item) => !inhibitedFilters.has(item.props.id))
|
|
103
|
+
.map((item) => (0, jsx_runtime_1.jsx)(filtersModalItem_1.FiltersModalItem, { item: item, itemState: currentState[item.props.id], changeHandler: modalItemChangeHandler(item.props.id) }, item.props.id)), [currentFilters, inhibitedFilters, currentState, modalItemChangeHandler]);
|
|
104
|
+
const memoizedActionButtons = (0, react_1.useCallback)((onSaveFn, onPinFn, isPin) => ((0, jsx_runtime_1.jsxs)("div", { className: "zen-filters-modal__header-buttons", children: [onSaveFn && (0, jsx_runtime_1.jsx)(button_1.Button, { type: "tertiary", "data-focusable": "save", className: "zen-filters-modal__save-button zen-filters-modal__header-button", title: translate("Save"), "aria-label": translate("Save"), onClick: onSaveFn, children: (0, jsx_runtime_1.jsx)(iconDisk_1.IconDisk, { description: translate("Save"), className: "svgIcon", size: iconDriveClassName ? "huge" : "large" }) }), onPinFn && (0, jsx_runtime_1.jsx)(button_1.Button, { type: "tertiary", "data-focusable": "pin", className: (0, classNames_1.classNames)(["zen-filters-modal__pin-button", isPin ? "zen-filters-modal__header-button--active" : "", "zen-filters-modal__header-button"]), title: translate("Pin"), "aria-label": translate("Pin"), onClick: onPinFn, children: (0, jsx_runtime_1.jsx)(iconPin2_1.IconPin2, { description: translate("Pin"), className: "svgIcon", size: iconDriveClassName ? "huge" : "large" }) })] })), [iconDriveClassName, translate]);
|
|
105
|
+
return (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)(modal_1.Modal, { className: (0, classNames_1.classNames)(["zen-filters-modal", isSaveModalOpen ? "zen-filters-modal--secondary" : ""]), isOpen: isOpen, onClose: externalMode ? handleExternalModeClose : onClose, title: translate("All Filters"), children: [memoizedActionButtons(onSave ? toggleSaveModal : undefined, onPin, isPinned), (0, jsx_runtime_1.jsx)(tabs_1.Tabs, { activeTabId: activeTabId, onTabChange: onTabChange, tabs: tabItems }), (0, jsx_runtime_1.jsx)("div", { className: "zen-filters-modal__content", children: tabsContent }), (0, jsx_runtime_1.jsx)(modal_1.Modal.TertiaryButton, { type: "tertiary", onClick: handleClearClick, children: translate("Clear") }), (0, jsx_runtime_1.jsx)(modal_1.Modal.SecondaryButton, { onClick: handleCancelClick, children: translate("Cancel") }), (0, jsx_runtime_1.jsx)(modal_1.Modal.PrimaryButton, { onClick: handleApplyClick, children: translate("Apply") })] }), (0, jsx_runtime_1.jsx)(filtersSaveModal_1.FiltersSaveModal, { isOpen: isSaveModalOpen, onClose: toggleSaveModal, onSave: handleSaveFilters })] });
|
|
106
|
+
};
|
|
107
|
+
exports.FiltersModal = FiltersModal;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ReactElement } from "react";
|
|
2
|
+
import { TFiltersComponentsItemState, TFiltersComponentsProps } from "./filtersItem";
|
|
3
|
+
interface IFiltersModalItem {
|
|
4
|
+
item: ReactElement<TFiltersComponentsProps>;
|
|
5
|
+
itemState: TFiltersComponentsItemState;
|
|
6
|
+
changeHandler: (newState: TFiltersComponentsItemState) => void;
|
|
7
|
+
}
|
|
8
|
+
export declare const FiltersModalItem: React.FC<IFiltersModalItem>;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
3
|
+
var t = {};
|
|
4
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
5
|
+
t[p] = s[p];
|
|
6
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
7
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
8
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
9
|
+
t[p[i]] = s[p[i]];
|
|
10
|
+
}
|
|
11
|
+
return t;
|
|
12
|
+
};
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.FiltersModalItem = void 0;
|
|
15
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
16
|
+
const react_1 = require("react");
|
|
17
|
+
const filtersChip_1 = require("./filtersChip");
|
|
18
|
+
const chip_1 = require("../../chip/chip");
|
|
19
|
+
const filtersRange_1 = require("./filtersRange");
|
|
20
|
+
const classNames_1 = require("../../commonHelpers/classNames/classNames");
|
|
21
|
+
const filtersDropdown_1 = require("./filtersDropdown");
|
|
22
|
+
const dropdown_1 = require("../../dropdown/dropdown");
|
|
23
|
+
const filtersGroups_1 = require("./filtersGroups");
|
|
24
|
+
const groupsFilter_1 = require("../../groupsFilter/groupsFilter");
|
|
25
|
+
const filtersDateRange_1 = require("./filtersDateRange");
|
|
26
|
+
const dateRange_1 = require("../../dateRange/dateRange");
|
|
27
|
+
const range_1 = require("../../range/range");
|
|
28
|
+
const chipStatusProvider_1 = require("../../chip/chipStatusProvider");
|
|
29
|
+
const filtersHelper_1 = require("../filtersHelper");
|
|
30
|
+
const FiltersModalItem = ({ item, itemState, changeHandler }) => {
|
|
31
|
+
const status = (0, chipStatusProvider_1.useChipStatus)();
|
|
32
|
+
const getComponent = (0, react_1.useCallback)((elem, currentState, handleStateChange, chipStatus) => {
|
|
33
|
+
const { type, props } = elem;
|
|
34
|
+
switch (type) {
|
|
35
|
+
case filtersChip_1.FiltersChip: {
|
|
36
|
+
const _a = props, { id, state: _globalState, name, onChange: _globalOnChange, className } = _a, otherProps = __rest(_a, ["id", "state", "name", "onChange", "className"]);
|
|
37
|
+
return (0, jsx_runtime_1.jsx)(chip_1.Chip, Object.assign({ id: `${id}-modal` }, otherProps, { active: currentState, status: currentState ? chipStatus || undefined : undefined, onChange: handleStateChange, children: name }));
|
|
38
|
+
}
|
|
39
|
+
case filtersRange_1.FiltersRange: {
|
|
40
|
+
const _b = props, { id, state: _globalState, name, onChange: _globalOnChange, defaultState, className } = _b, otherProps = __rest(_b, ["id", "state", "name", "onChange", "defaultState", "className"]);
|
|
41
|
+
return (0, jsx_runtime_1.jsx)(range_1.Range, Object.assign({}, otherProps, { id: `${id}-modal`, className: (0, classNames_1.classNames)(["zen-filters-modal__item-element", className || ""]), fullWidthTriggerButton: true, label: name, value: currentState, onChange: handleStateChange, defaultValue: defaultState, chip: false }));
|
|
42
|
+
}
|
|
43
|
+
case filtersDropdown_1.FiltersDropdown: {
|
|
44
|
+
const _c = props, { id, name, state: _globalState, onChange: _globalOnChange, defaultState, fetchState, classNamePopup } = _c, otherProps = __rest(_c, ["id", "name", "state", "onChange", "defaultState", "fetchState", "classNamePopup"]);
|
|
45
|
+
const prepareValue = (value) => {
|
|
46
|
+
if (Array.isArray(value)) {
|
|
47
|
+
return value.map((el) => el.id);
|
|
48
|
+
}
|
|
49
|
+
return Object.assign(Object.assign({}, value), { selected: value.selected.map((el) => el.id) });
|
|
50
|
+
};
|
|
51
|
+
const dropdownStateType = (0, filtersHelper_1.getDropdownStateType)(currentState);
|
|
52
|
+
const preparedDefaultState = defaultState ? defaultState : (0, filtersHelper_1.prepareDefaultDropdownState)(dropdownStateType);
|
|
53
|
+
const dropdownProps = Object.assign(Object.assign({}, otherProps), { id: `${id}-modal`, fetchState: fetchState, classNamePopup: (0, classNames_1.classNames)(["zen-filters-modal__item-popup", classNamePopup || ""]), isLoading: undefined, multiselect: dropdownStateType === "fullSelection" || dropdownStateType === "fullSelectionWithCheckbox" ? true : otherProps.multiselect, selectAllButton: dropdownStateType === "fullSelection" || dropdownStateType === "fullSelectionWithCheckbox" ? true : otherProps.selectAllButton, fullWidthTriggerButton: true, errorHandler: (() => { }), placeholder: otherProps.placeholder || name, showSelection: true, value: currentState, onChange: (newValue) => {
|
|
54
|
+
const preparedValue = prepareValue(newValue);
|
|
55
|
+
handleStateChange(preparedValue);
|
|
56
|
+
}, defaultValue: preparedDefaultState, chip: false });
|
|
57
|
+
return (0, jsx_runtime_1.jsx)(dropdown_1.Dropdown, Object.assign({}, dropdownProps));
|
|
58
|
+
}
|
|
59
|
+
case filtersGroups_1.FiltersGroups: {
|
|
60
|
+
const _d = props, { id, state: _globalState, onChange: _globalOnChange } = _d, otherProps = __rest(_d, ["id", "state", "onChange"]);
|
|
61
|
+
return (0, jsx_runtime_1.jsx)(groupsFilter_1.GroupsFilter, Object.assign({ initialFilterState: currentState, onChange: handleStateChange }, otherProps, { chip: false, fullSize: true }));
|
|
62
|
+
}
|
|
63
|
+
case filtersDateRange_1.FiltersDateRange: {
|
|
64
|
+
const _e = props, { id, state: _globalState, onChange: _globalOnChange, defaultState, allowUnsetValue, className } = _e, otherProps = __rest(_e, ["id", "state", "onChange", "defaultState", "allowUnsetValue", "className"]);
|
|
65
|
+
return allowUnsetValue ? (0, jsx_runtime_1.jsx)(dateRange_1.DateRange, Object.assign({}, otherProps, { id: `${id}-modal`, className: (0, classNames_1.classNames)(["zen-filters-modal__item-element", "zen-filters-modal__item-element--centred", className || ""]), value: currentState, onChange: handleStateChange, defaultValue: defaultState, allowUnsetValue: true, chip: false })) : (0, jsx_runtime_1.jsx)(dateRange_1.DateRange, Object.assign({}, otherProps, { id: `${id}-modal`, className: (0, classNames_1.classNames)(["zen-filters-modal__item-element", "zen-filters-modal__item-element--centred", className || ""]), value: currentState, onChange: handleStateChange, defaultValue: defaultState, allowUnsetValue: false, chip: false }));
|
|
66
|
+
}
|
|
67
|
+
default:
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
}, []);
|
|
71
|
+
const memoizedItem = (0, react_1.useMemo)(() => getComponent(item, itemState, changeHandler, status), [getComponent, item, itemState, changeHandler, status]);
|
|
72
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: "zen-filters-modal__item", children: [(0, jsx_runtime_1.jsx)("div", { className: "zen-filters-modal__item-label", children: item.props.name }), (0, jsx_runtime_1.jsx)("div", { children: memoizedItem })] }));
|
|
73
|
+
};
|
|
74
|
+
exports.FiltersModalItem = FiltersModalItem;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import { IFiltersItem } from "./filtersItem";
|
|
3
|
+
import { IRange, IRangeValues } from "../../range/range";
|
|
4
|
+
export interface IFiltersRangeProps extends Pick<IRange, "unit" | "labelMin" | "labelMax" | "disabled" | "triggerAriaLabel" | "min" | "max" | "fullBounded" | "allowEqualMinMax" | "chipIcon"> {
|
|
5
|
+
}
|
|
6
|
+
export interface IFiltersRangeState extends IRangeValues {
|
|
7
|
+
}
|
|
8
|
+
export interface IFiltersRange extends IFiltersItem<IFiltersRangeState>, IFiltersRangeProps {
|
|
9
|
+
}
|
|
10
|
+
export declare const FiltersRangeDisplayName = "FiltersRange";
|
|
11
|
+
export declare const FiltersRange: React.FC<IFiltersRange>;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
3
|
+
var t = {};
|
|
4
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
5
|
+
t[p] = s[p];
|
|
6
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
7
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
8
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
9
|
+
t[p[i]] = s[p[i]];
|
|
10
|
+
}
|
|
11
|
+
return t;
|
|
12
|
+
};
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.FiltersRange = exports.FiltersRangeDisplayName = void 0;
|
|
15
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
16
|
+
const react_1 = require("react");
|
|
17
|
+
const classNames_1 = require("../../commonHelpers/classNames/classNames");
|
|
18
|
+
const iconFilter_1 = require("../../icons/iconFilter");
|
|
19
|
+
const range_1 = require("../../range/range");
|
|
20
|
+
exports.FiltersRangeDisplayName = "FiltersRange";
|
|
21
|
+
const FiltersRange = (_a) => {
|
|
22
|
+
var { className, state, defaultState, name, onChange: onChangeState, id, chipIcon } = _a, otherRangeProps = __rest(_a, ["className", "state", "defaultState", "name", "onChange", "id", "chipIcon"]);
|
|
23
|
+
const component = (0, react_1.useMemo)(() => (0, jsx_runtime_1.jsx)(range_1.Range, Object.assign({}, otherRangeProps, { label: name, value: state, onChange: onChangeState, defaultValue: defaultState, className: (0, classNames_1.classNames)(["zen-filters-range", className || ""]), chip: true, chipId: id, chipName: name, chipIcon: chipIcon || iconFilter_1.IconFilter })), [otherRangeProps, chipIcon, state, onChangeState, defaultState, className, id, name]);
|
|
24
|
+
return component;
|
|
25
|
+
};
|
|
26
|
+
exports.FiltersRange = FiltersRange;
|
|
27
|
+
exports.FiltersRange.displayName = exports.FiltersRangeDisplayName;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import "./filtersModal.less";
|
|
2
|
+
export interface IFiltersModal {
|
|
3
|
+
isOpen: boolean;
|
|
4
|
+
onClose: (isOpen: boolean) => void;
|
|
5
|
+
onSave: (filterName: string) => void;
|
|
6
|
+
}
|
|
7
|
+
export declare const FiltersSaveModal: ({ isOpen, onClose, onSave }: IFiltersModal) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FiltersSaveModal = void 0;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const react_1 = require("react");
|
|
6
|
+
const modal_1 = require("../../modal/modal");
|
|
7
|
+
const useLanguage_1 = require("../../utils/localization/useLanguage");
|
|
8
|
+
const textInput_1 = require("../../textInput/textInput");
|
|
9
|
+
const filtersSavedItemsProvider_1 = require("./filtersSavedItemsProvider");
|
|
10
|
+
const iconDisk_1 = require("../../icons/iconDisk");
|
|
11
|
+
const useDriveClassName_1 = require("../../utils/theme/useDriveClassName");
|
|
12
|
+
const FiltersSaveModal = ({ isOpen, onClose, onSave }) => {
|
|
13
|
+
const { translate } = (0, useLanguage_1.useLanguage)();
|
|
14
|
+
const { items } = (0, filtersSavedItemsProvider_1.useFiltersSavedItems)();
|
|
15
|
+
const iconDriveClassName = (0, useDriveClassName_1.useDriveClassName)("icon");
|
|
16
|
+
const [filterName, setFilterName] = (0, react_1.useState)("");
|
|
17
|
+
const toggleSaveModal = (0, react_1.useCallback)(() => {
|
|
18
|
+
onClose(!isOpen);
|
|
19
|
+
}, [isOpen, onClose]);
|
|
20
|
+
const handleCancelSaveModal = (0, react_1.useCallback)(() => {
|
|
21
|
+
onClose(false);
|
|
22
|
+
setFilterName("");
|
|
23
|
+
}, [onClose]);
|
|
24
|
+
const isValidFilterName = (0, react_1.useCallback)((name, existingNames) => {
|
|
25
|
+
if (!name) {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
return !existingNames.map((item) => item.toLowerCase().trim()).includes(name.toLowerCase().trim());
|
|
29
|
+
}, []);
|
|
30
|
+
const handleApplySaveModal = (0, react_1.useCallback)(() => {
|
|
31
|
+
if (!isValidFilterName(filterName, Array.from(items))) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
onClose(false);
|
|
35
|
+
onSave(filterName);
|
|
36
|
+
setFilterName("");
|
|
37
|
+
}, [filterName, isValidFilterName, items, onClose, onSave]);
|
|
38
|
+
const handleSaveModalFieldChange = (0, react_1.useCallback)((e) => {
|
|
39
|
+
setFilterName(e.target.value);
|
|
40
|
+
}, []);
|
|
41
|
+
const errorText = (0, react_1.useMemo)(() => {
|
|
42
|
+
if (!filterName) {
|
|
43
|
+
return "";
|
|
44
|
+
}
|
|
45
|
+
if (!isValidFilterName(filterName, Array.from(items))) {
|
|
46
|
+
return translate("Title already in use");
|
|
47
|
+
}
|
|
48
|
+
return "";
|
|
49
|
+
}, [filterName, isValidFilterName, items, translate]);
|
|
50
|
+
const saveIcon = (0, react_1.useCallback)(() => (0, jsx_runtime_1.jsx)(iconDisk_1.IconDisk, { description: translate("Save"), className: "svgIcon", size: iconDriveClassName ? "huge" : "large" }), [iconDriveClassName, translate]);
|
|
51
|
+
return (0, jsx_runtime_1.jsxs)(modal_1.Modal, { isOpen: isOpen, onClose: toggleSaveModal, title: translate("Save filters"), children: [(0, jsx_runtime_1.jsx)("div", { className: "zen-filters-modal__content", children: (0, jsx_runtime_1.jsx)(textInput_1.TextInput, { value: filterName, ariaLabel: translate("Filter title"), placeholder: translate("Filter title"), onChange: handleSaveModalFieldChange, maxLength: 100, error: errorText }) }), (0, jsx_runtime_1.jsx)(modal_1.Modal.SecondaryButton, { onClick: handleCancelSaveModal, title: translate("Cancel"), children: translate("Cancel") }), (0, jsx_runtime_1.jsx)(modal_1.Modal.PrimaryButton, { onClick: handleApplySaveModal, icon: saveIcon, title: translate("Save"), children: translate("Save") })] });
|
|
52
|
+
};
|
|
53
|
+
exports.FiltersSaveModal = FiltersSaveModal;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FiltersSavedChipComponent = void 0;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const react_1 = require("react");
|
|
6
|
+
const chip_1 = require("../../chip/chip");
|
|
7
|
+
const iconDisk_1 = require("../../icons/iconDisk");
|
|
8
|
+
const controlledPopup_1 = require("../../controlledPopup/controlledPopup");
|
|
9
|
+
const classNames_1 = require("../../commonHelpers/classNames/classNames");
|
|
10
|
+
const button_1 = require("../../button/button");
|
|
11
|
+
const iconClose_1 = require("../../icons/iconClose");
|
|
12
|
+
const useLanguage_1 = require("../../utils/localization/useLanguage");
|
|
13
|
+
const modal_1 = require("../../modal/modal");
|
|
14
|
+
const filtersSavedItemsProvider_1 = require("./filtersSavedItemsProvider");
|
|
15
|
+
const filtersSaveModal_1 = require("./filtersSaveModal");
|
|
16
|
+
const useDriveClassName_1 = require("../../utils/theme/useDriveClassName");
|
|
17
|
+
const FiltersSavedChipComponent = () => {
|
|
18
|
+
const { translate } = (0, useLanguage_1.useLanguage)();
|
|
19
|
+
const iconDriveClassName = (0, useDriveClassName_1.useDriveClassName)("icon");
|
|
20
|
+
const contentDriveClassName = (0, useDriveClassName_1.useDriveClassName)("zen-filters-saved-popup__content");
|
|
21
|
+
const { items, active, onRemove, onApply, onSave } = (0, filtersSavedItemsProvider_1.useFiltersSavedItems)();
|
|
22
|
+
const [savedChipOpen, setSavedChipOpen] = (0, react_1.useState)(false);
|
|
23
|
+
const [removeModalOpen, setRemoveModalOpen] = (0, react_1.useState)(false);
|
|
24
|
+
const [saveModalOpen, setSaveModalOpen] = (0, react_1.useState)(false);
|
|
25
|
+
const savedChipRef = (0, react_1.useRef)(null);
|
|
26
|
+
const removeChipRef = (0, react_1.useRef)("");
|
|
27
|
+
const handleRemove = (0, react_1.useCallback)((itemKey) => () => {
|
|
28
|
+
removeChipRef.current = itemKey;
|
|
29
|
+
setRemoveModalOpen(true);
|
|
30
|
+
}, []);
|
|
31
|
+
const toggleSavedChipOpen = (0, react_1.useCallback)(() => {
|
|
32
|
+
setSavedChipOpen((prev) => !prev);
|
|
33
|
+
}, []);
|
|
34
|
+
const toggleRemoveModal = (0, react_1.useCallback)(() => {
|
|
35
|
+
setRemoveModalOpen((prev) => !prev);
|
|
36
|
+
}, []);
|
|
37
|
+
const toggleSaveModal = (0, react_1.useCallback)(() => {
|
|
38
|
+
setSaveModalOpen((prev) => !prev);
|
|
39
|
+
}, []);
|
|
40
|
+
const handleCancelRemoveModal = (0, react_1.useCallback)(() => {
|
|
41
|
+
setRemoveModalOpen(false);
|
|
42
|
+
removeChipRef.current = "";
|
|
43
|
+
}, []);
|
|
44
|
+
const handleRemoveItem = (0, react_1.useCallback)((e) => {
|
|
45
|
+
e.stopPropagation();
|
|
46
|
+
setRemoveModalOpen(false);
|
|
47
|
+
onRemove && onRemove(removeChipRef.current);
|
|
48
|
+
removeChipRef.current = "";
|
|
49
|
+
}, [onRemove]);
|
|
50
|
+
const handleFilterSelect = (0, react_1.useCallback)((e) => {
|
|
51
|
+
const filterName = e.target.dataset.filterName;
|
|
52
|
+
filterName && onApply && onApply(filterName);
|
|
53
|
+
}, [onApply]);
|
|
54
|
+
const handleItemKeyDown = (0, react_1.useCallback)((e) => {
|
|
55
|
+
if (e.key === "Enter" || e.key === " ") {
|
|
56
|
+
const filterName = e.currentTarget.dataset.filterName;
|
|
57
|
+
filterName && onApply && onApply(filterName);
|
|
58
|
+
}
|
|
59
|
+
}, [onApply]);
|
|
60
|
+
const saveButton = (0, react_1.useMemo)(() => (0, jsx_runtime_1.jsxs)("button", { type: "button", onClick: toggleSaveModal, className: "zen-filters-saved-popup__action-button", title: translate("Save new filters"), children: [(0, jsx_runtime_1.jsx)(iconDisk_1.IconDisk, { description: translate("Save"), className: "svgIcon", size: iconDriveClassName ? "huge" : "large" }), (0, jsx_runtime_1.jsx)("div", { className: (0, classNames_1.classNames)(["", "zen-ellipsis"]), children: translate("Save new") })] }), [iconDriveClassName, toggleSaveModal, translate]);
|
|
61
|
+
const memoizedItems = (0, react_1.useMemo)(() => Array.from(items), [items]);
|
|
62
|
+
const popupContent = (0, react_1.useMemo)(() => (0, jsx_runtime_1.jsxs)("div", { className: (0, classNames_1.classNames)(["zen-filters-saved-popup__content", contentDriveClassName || ""]), children: [onSave ? saveButton : null, (0, jsx_runtime_1.jsx)("div", { onClick: handleFilterSelect, children: memoizedItems.map((filterName) => ((0, jsx_runtime_1.jsxs)("div", { tabIndex: 0, onKeyDown: handleItemKeyDown, "data-filter-name": filterName, className: (0, classNames_1.classNames)(["zen-filters-saved-popup__item", active.has(filterName) ? "zen-filters-saved-popup__item--active" : ""]), children: [(0, jsx_runtime_1.jsx)("div", { className: "zen-filters-saved-popup__name", "data-filter-name": filterName, children: filterName }), onRemove ? (0, jsx_runtime_1.jsx)(button_1.Button, { type: "tertiary-black", className: "zen-filters-saved-popup__action", onClick: handleRemove(filterName), title: translate("Remove"), "aria-label": translate("Remove"), children: (0, jsx_runtime_1.jsx)(iconClose_1.IconClose, { size: iconDriveClassName ? "huge" : "large", className: "zen-filters-saved-popup__close-icon" }) }) : null] }, filterName))) })] }), [active, contentDriveClassName, handleFilterSelect, handleItemKeyDown, handleRemove, iconDriveClassName, memoizedItems, onRemove, onSave, saveButton, translate]);
|
|
63
|
+
const memoizedStatus = (0, react_1.useMemo)(() => (active.size > 0 && Array.from(items).some(item => active.has(item)) ? "active" : undefined), [active, items]);
|
|
64
|
+
return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(chip_1.Chip, { className: "zen-filters-saved-chip", isOpen: savedChipOpen, status: memoizedStatus, onClick: toggleSavedChipOpen, title: translate("Saved filters"), icon: iconDisk_1.IconDisk, triggerRef: savedChipRef }), (0, jsx_runtime_1.jsx)(controlledPopup_1.ControlledPopup, { isOpen: savedChipOpen, className: (0, classNames_1.classNames)(["zen-filters-saved-popup"]), onOpenChange: toggleSavedChipOpen, useTrapFocusWithTrigger: "on", shouldHoldScroll: true, triggerRef: savedChipRef, ariaLabel: translate("Saved filters"), recalculateOnScroll: true, children: popupContent }), (0, jsx_runtime_1.jsxs)(modal_1.Modal, { isOpen: removeModalOpen, onClose: toggleRemoveModal, title: translate("Remove saved {name} filter?").replace("{name}", removeChipRef.current), children: [(0, jsx_runtime_1.jsx)(modal_1.Modal.SecondaryButton, { onClick: handleCancelRemoveModal, children: translate("Cancel") }), (0, jsx_runtime_1.jsx)(modal_1.Modal.PrimaryButton, { onClick: handleRemoveItem, type: "destructive", children: translate("Confirm") })] }), onSave ? (0, jsx_runtime_1.jsx)(filtersSaveModal_1.FiltersSaveModal, { isOpen: saveModalOpen, onClose: setSaveModalOpen, onSave: onSave }) : null] }));
|
|
65
|
+
};
|
|
66
|
+
exports.FiltersSavedChipComponent = FiltersSavedChipComponent;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { FC, PropsWithChildren } from "react";
|
|
2
|
+
import { TFiltersComponentsItemState } from "./filtersItem";
|
|
3
|
+
export declare const filtersSavedItemsContext: import("react").Context<IFiltersSavedItemsProviderProps>;
|
|
4
|
+
interface IFiltersSavedItemsProviderProps extends PropsWithChildren {
|
|
5
|
+
items: Set<string>;
|
|
6
|
+
active: Set<string>;
|
|
7
|
+
onRemove?: (item: string) => void;
|
|
8
|
+
onApply?: (item: string) => void;
|
|
9
|
+
onSave?: (filterName: string, filterState?: Record<string, TFiltersComponentsItemState>) => void;
|
|
10
|
+
}
|
|
11
|
+
export declare const FiltersSavedItemsProvider: FC<IFiltersSavedItemsProviderProps>;
|
|
12
|
+
export declare const useFiltersSavedItems: () => {
|
|
13
|
+
items: Set<string>;
|
|
14
|
+
active: Set<string>;
|
|
15
|
+
onRemove: ((item: string) => void) | undefined;
|
|
16
|
+
onApply: ((item: string) => void) | undefined;
|
|
17
|
+
onSave: ((filterName: string, filterState?: Record<string, TFiltersComponentsItemState>) => void) | undefined;
|
|
18
|
+
};
|
|
19
|
+
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useFiltersSavedItems = exports.FiltersSavedItemsProvider = exports.filtersSavedItemsContext = void 0;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const react_1 = require("react");
|
|
6
|
+
exports.filtersSavedItemsContext = (0, react_1.createContext)({ items: new Set(), active: new Set(), onRemove: undefined, onApply: undefined, onSave: undefined });
|
|
7
|
+
const FiltersSavedItemsProvider = ({ items, active, onRemove, onApply, onSave, children }) => ((0, jsx_runtime_1.jsx)(exports.filtersSavedItemsContext.Provider, { value: { items, active, onRemove, onApply, onSave }, children: children }));
|
|
8
|
+
exports.FiltersSavedItemsProvider = FiltersSavedItemsProvider;
|
|
9
|
+
const useFiltersSavedItems = () => {
|
|
10
|
+
const { items, active, onRemove, onApply, onSave } = (0, react_1.useContext)(exports.filtersSavedItemsContext);
|
|
11
|
+
return { items, active, onRemove, onApply, onSave };
|
|
12
|
+
};
|
|
13
|
+
exports.useFiltersSavedItems = useFiltersSavedItems;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import "./filtersSearch.less";
|
|
3
|
+
import { ISearchItem } from "./filtersSearchList";
|
|
4
|
+
interface IFiltersSearch {
|
|
5
|
+
id: string;
|
|
6
|
+
name: string;
|
|
7
|
+
value: string;
|
|
8
|
+
onChange: (newValue: string) => void;
|
|
9
|
+
onSearchKeyDown?: (searchValue?: string) => void;
|
|
10
|
+
handleSearchFocus: () => void;
|
|
11
|
+
searchSelection?: ISearchItem[];
|
|
12
|
+
handleRemove?: (id: ISearchItem) => void;
|
|
13
|
+
className?: string;
|
|
14
|
+
}
|
|
15
|
+
export declare const FiltersSearch: React.ForwardRefExoticComponent<IFiltersSearch & React.RefAttributes<HTMLInputElement>>;
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.FiltersSearch = void 0;
|
|
27
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
28
|
+
const react_1 = __importStar(require("react"));
|
|
29
|
+
const classNames_1 = require("../../commonHelpers/classNames/classNames");
|
|
30
|
+
const pillBox_1 = require("../../pillBox/pillBox");
|
|
31
|
+
const filtersSearchList_1 = require("./filtersSearchList");
|
|
32
|
+
const searchInputRaw_1 = require("../../searchInputRaw/searchInputRaw");
|
|
33
|
+
exports.FiltersSearch = react_1.default.forwardRef(({ id, name, value, onChange, onSearchKeyDown, handleSearchFocus, searchSelection, handleRemove, className }, ref) => {
|
|
34
|
+
const isWithPills = Boolean(searchSelection && handleRemove);
|
|
35
|
+
const divider = "_divider_";
|
|
36
|
+
const handleSearchKeyDown = (0, react_1.useCallback)((event) => {
|
|
37
|
+
if (event.code === "Enter") {
|
|
38
|
+
onSearchKeyDown === null || onSearchKeyDown === void 0 ? void 0 : onSearchKeyDown(event.currentTarget.value || undefined);
|
|
39
|
+
}
|
|
40
|
+
}, [onSearchKeyDown]);
|
|
41
|
+
const memoizedPillsArray = react_1.default.useMemo(() => {
|
|
42
|
+
if (!isWithPills || !searchSelection || searchSelection.length === 0) {
|
|
43
|
+
return [];
|
|
44
|
+
}
|
|
45
|
+
const pillsArray = [];
|
|
46
|
+
searchSelection.forEach(item => {
|
|
47
|
+
pillsArray.push({
|
|
48
|
+
id: `${item.type || filtersSearchList_1.NO_TYPED_SEARCH_ITEM}${divider}${item.id}`,
|
|
49
|
+
name: item.name
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
return pillsArray;
|
|
53
|
+
}, [isWithPills, searchSelection]);
|
|
54
|
+
const onRemove = (0, react_1.useCallback)((removedId) => {
|
|
55
|
+
const [type, itemId] = removedId.split(divider);
|
|
56
|
+
const item = searchSelection === null || searchSelection === void 0 ? void 0 : searchSelection.find(el => el.id === itemId);
|
|
57
|
+
if (item) {
|
|
58
|
+
handleRemove === null || handleRemove === void 0 ? void 0 : handleRemove(Object.assign(Object.assign({}, item), { type: type === filtersSearchList_1.NO_TYPED_SEARCH_ITEM ? undefined : type }));
|
|
59
|
+
}
|
|
60
|
+
}, [handleRemove, searchSelection]);
|
|
61
|
+
const searchComponent = (0, react_1.useMemo)(() => (0, jsx_runtime_1.jsx)(searchInputRaw_1.SearchInputRaw, { id: id, ref: ref, placeholder: name, onChange: onChange, onKeyDown: handleSearchKeyDown, onFocus: handleSearchFocus, value: value, className: (0, classNames_1.classNames)(["zen-filters-search__search-input", "zen-filters__search", className || ""]) }), [id, ref, name, onChange, handleSearchKeyDown, handleSearchFocus, value, className]);
|
|
62
|
+
return (0, jsx_runtime_1.jsxs)("div", { className: (0, classNames_1.classNames)(["zen-filters-search", className || ""]), children: [searchComponent, isWithPills && (0, jsx_runtime_1.jsx)("div", { className: "zen-filters-search__selected", children: (0, jsx_runtime_1.jsx)(pillBox_1.PillBox, { hideSelectedLabel: true, maxPills: 3, selectedPills: memoizedPillsArray, onRemove: onRemove }) })] });
|
|
63
|
+
});
|
|
64
|
+
exports.FiltersSearch.displayName = "FiltersSearch";
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { FunctionComponent, ReactNode } from "react";
|
|
2
|
+
import { IIcon } from "../../icons/icon";
|
|
3
|
+
import "./filtersSearchItemData.less";
|
|
4
|
+
export interface ISearchItemData {
|
|
5
|
+
id: string;
|
|
6
|
+
icon?: FunctionComponent<IIcon> | ReactNode;
|
|
7
|
+
iconClassName?: string;
|
|
8
|
+
isActive: boolean;
|
|
9
|
+
name: string;
|
|
10
|
+
secondary?: string;
|
|
11
|
+
onClick?: () => void;
|
|
12
|
+
onClose?: () => void;
|
|
13
|
+
isMobile?: boolean;
|
|
14
|
+
isDrive?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare const FiltersSearchItemData: ({ id, icon, isActive, iconClassName, name, secondary, onClick, onClose, isDrive, isMobile }: ISearchItemData) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FiltersSearchItemData = void 0;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const react_1 = require("react");
|
|
6
|
+
const useLanguage_1 = require("../../utils/localization/useLanguage");
|
|
7
|
+
const button_1 = require("../../button/button");
|
|
8
|
+
const classNames_1 = require("../../commonHelpers/classNames/classNames");
|
|
9
|
+
const isActiveElement_1 = require("../../list/utils/isActiveElement");
|
|
10
|
+
const iconClose_1 = require("../../icons/iconClose");
|
|
11
|
+
const FiltersSearchItemData = ({ id, icon, isActive, iconClassName, name, secondary, onClick, onClose, isDrive, isMobile }) => {
|
|
12
|
+
const { translate } = (0, useLanguage_1.useLanguage)();
|
|
13
|
+
const driveClassName = (0, react_1.useMemo)(() => isDrive
|
|
14
|
+
? isMobile ? "zen-search-item-data--drive" : "zen-search-item-data--drive-tablet"
|
|
15
|
+
: "", [isDrive, isMobile]);
|
|
16
|
+
const renderIcon = (0, react_1.useCallback)((iconComponent, iClassName, className) => {
|
|
17
|
+
if (typeof iconComponent === "function") {
|
|
18
|
+
return (0, react_1.createElement)(iconComponent, { size: "large", className: (0, classNames_1.classNames)([className || "", iClassName || ""]) });
|
|
19
|
+
}
|
|
20
|
+
return iconComponent;
|
|
21
|
+
}, []);
|
|
22
|
+
const handleClick = (0, react_1.useCallback)((e) => {
|
|
23
|
+
if (!onClick) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
if (e.target instanceof HTMLElement && (0, isActiveElement_1.isActiveElement)(e.target)) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
onClick();
|
|
30
|
+
}, [onClick]);
|
|
31
|
+
const handleClose = (0, react_1.useCallback)((e) => {
|
|
32
|
+
if (!onClose) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
e.preventDefault();
|
|
36
|
+
e.stopPropagation();
|
|
37
|
+
onClose();
|
|
38
|
+
}, [onClose]);
|
|
39
|
+
return (0, jsx_runtime_1.jsx)("li", { tabIndex: 0, className: (0, classNames_1.classNames)(["zen-search-item-data", isActive ? "zen-search-item-data--active" : "",
|
|
40
|
+
onClick ? "zen-search-item-data--clickable" : "", driveClassName || ""]), "data-list-item-id": id, onClick: handleClick, children: (0, jsx_runtime_1.jsxs)("div", { className: "zen-search-item-data__main", children: [icon ? (0, jsx_runtime_1.jsx)("div", { className: (0, classNames_1.classNames)(["zen-search-item-data__icon", iconClassName || ""]), children: renderIcon(icon) }) : null, (0, jsx_runtime_1.jsxs)("div", { className: "zen-search-item-data__main-data", children: [(0, jsx_runtime_1.jsxs)("div", { className: "zen-search-item-data__identifier", children: [(0, jsx_runtime_1.jsx)("div", { className: "zen-search-item-data__name", children: name }), secondary ? (0, jsx_runtime_1.jsx)("div", { className: "zen-search-item-data__secondary", children: secondary }) : null] }), onClose ? (0, jsx_runtime_1.jsx)(button_1.Button, { type: "tertiary-black", className: "zen-search-item-data__close", onClick: handleClose, title: translate("Close"), "aria-label": translate("Close"), children: (0, jsx_runtime_1.jsx)(iconClose_1.IconClose, { size: "large", className: "zen-search-item-data__close-icon" }) }) : null] })] }) }, id);
|
|
41
|
+
};
|
|
42
|
+
exports.FiltersSearchItemData = FiltersSearchItemData;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import "./filtersSearchList.less";
|
|
3
|
+
import { IFetchState } from "../filters";
|
|
4
|
+
import { IIcon } from "../../icons/icon";
|
|
5
|
+
export declare const NO_TYPED_SEARCH_ITEM = "noTypedSearchItem";
|
|
6
|
+
export declare const KEYWORD_ID = "keywordId";
|
|
7
|
+
export declare const KEYWORD_TYPE = "keyword";
|
|
8
|
+
export interface ISearchItem {
|
|
9
|
+
id: string;
|
|
10
|
+
name: string;
|
|
11
|
+
description?: string;
|
|
12
|
+
type?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface IRecentSearchItem extends Omit<ISearchItem, "type"> {
|
|
15
|
+
type: string;
|
|
16
|
+
itemsArray: Omit<IRecentSearchItem, "itemsArray">[];
|
|
17
|
+
}
|
|
18
|
+
export interface IRecentSearchItemWithoutId extends Omit<IRecentSearchItem, "id"> {
|
|
19
|
+
}
|
|
20
|
+
export interface ISearchList {
|
|
21
|
+
searchData?: IFetchState<ISearchItem[]>;
|
|
22
|
+
recentSearches?: IFetchState<IRecentSearchItem[]>;
|
|
23
|
+
searchSelection?: ISearchItem[];
|
|
24
|
+
handleSearchItemClick?: (searchItem: ISearchItem) => void;
|
|
25
|
+
handleRecentSearchItemClick?: (recentSearchItem: IRecentSearchItem) => void;
|
|
26
|
+
onRemoveRecentSearchItem?: (itemIds: string[]) => void;
|
|
27
|
+
searchValue: string;
|
|
28
|
+
getIconByType: (type?: string) => React.FC<IIcon>;
|
|
29
|
+
}
|
|
30
|
+
export declare const FiltersSearchList: ({ searchValue, searchData, recentSearches, searchSelection, handleSearchItemClick, onRemoveRecentSearchItem, handleRecentSearchItemClick, getIconByType }: ISearchList) => import("react/jsx-runtime").JSX.Element;
|