@geotab/zenith 1.23.0 → 1.24.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 +22 -0
- package/dist/banner/bannerMultipLine.js +4 -2
- package/dist/commonStyles/common.less +1 -0
- package/dist/commonStyles/rangeFieldMixin.less +23 -0
- package/dist/dataFeed/dataFeedColumnsItems.js +3 -0
- package/dist/dateRange/dateRange.js +9 -45
- package/dist/dropdown/dropdown.js +2 -1
- package/dist/dropdown/dropdownList.d.ts +0 -4
- package/dist/dropdown/dropdownList.js +1 -7
- package/dist/filtersBar/components/filtersBarDropdown/filtersBarDropdown.js +5 -8
- package/dist/filtersBar/components/filtersBarGroupButton/filtersBarGroupButton.js +1 -1
- package/dist/filtersBar/components/filtersBarGroupsFilter/filtersBarGroupsFilter.js +2 -2
- package/dist/filtersBar/components/filtersBarPeriodPicker/filtersBarPeriodPicker.js +1 -1
- package/dist/filtersBar/filtersBar.js +28 -2
- package/dist/filtersBar/filtersBarSidePanel/components/filtersBarSidePanelRange/filtersBarSidePanelRange.js +19 -3
- package/dist/filtersBar/filtersBarSidePanel/hooks/useDirection.d.ts +7 -0
- package/dist/filtersBar/filtersBarSidePanel/hooks/useDirection.js +32 -0
- package/dist/filtersBar/filtersContainer/filtersContainer.js +1 -1
- package/dist/groupsFilter/groupsFilter.js +7 -3
- package/dist/header/header.js +5 -1
- package/dist/index.css +670 -279
- package/dist/index.d.ts +3 -0
- package/dist/index.js +8 -2
- package/dist/range/range.js +10 -3
- package/dist/range/rangeField.d.ts +3 -1
- package/dist/range/rangeField.js +3 -2
- package/dist/skeleton/skeleton.js +3 -1
- package/dist/skeletonList/skeletonList.d.ts +10 -0
- package/dist/skeletonList/skeletonList.js +23 -0
- package/dist/summaries/summaries.d.ts +10 -0
- package/dist/summaries/summaries.js +12 -0
- package/dist/summaries/utils/splitIntoPairs.d.ts +3 -0
- package/dist/summaries/utils/splitIntoPairs.js +12 -0
- package/dist/summary/summary.d.ts +14 -0
- package/dist/summary/summary.js +17 -0
- package/dist/utils/headerButtons/headerButtonsProvider.d.ts +17 -0
- package/dist/utils/headerButtons/headerButtonsProvider.js +20 -0
- package/dist/utils/localization/translations/cs-json.d.ts +1 -0
- package/dist/utils/localization/translations/cs-json.js +2 -1
- package/dist/utils/localization/translations/de-json.d.ts +1 -0
- package/dist/utils/localization/translations/de-json.js +2 -1
- package/dist/utils/localization/translations/en-json.d.ts +1 -0
- package/dist/utils/localization/translations/en-json.js +2 -1
- package/dist/utils/localization/translations/es-json.d.ts +1 -0
- package/dist/utils/localization/translations/es-json.js +2 -1
- package/dist/utils/localization/translations/fr-FR-json.d.ts +1 -0
- package/dist/utils/localization/translations/fr-FR-json.js +2 -1
- package/dist/utils/localization/translations/fr-json.d.ts +1 -0
- package/dist/utils/localization/translations/fr-json.js +2 -1
- package/dist/utils/localization/translations/id-json.d.ts +1 -0
- package/dist/utils/localization/translations/id-json.js +2 -1
- package/dist/utils/localization/translations/it-json.d.ts +1 -0
- package/dist/utils/localization/translations/it-json.js +2 -1
- package/dist/utils/localization/translations/ja-json.d.ts +1 -0
- package/dist/utils/localization/translations/ja-json.js +2 -1
- package/dist/utils/localization/translations/ko-KR-json.d.ts +1 -0
- package/dist/utils/localization/translations/ko-KR-json.js +2 -1
- package/dist/utils/localization/translations/ms-json.d.ts +1 -0
- package/dist/utils/localization/translations/ms-json.js +2 -1
- package/dist/utils/localization/translations/nl-json.d.ts +1 -0
- package/dist/utils/localization/translations/nl-json.js +2 -1
- package/dist/utils/localization/translations/pl-json.d.ts +1 -0
- package/dist/utils/localization/translations/pl-json.js +2 -1
- package/dist/utils/localization/translations/pt-BR-json.d.ts +1 -0
- package/dist/utils/localization/translations/pt-BR-json.js +2 -1
- package/dist/utils/localization/translations/sv-json.d.ts +1 -0
- package/dist/utils/localization/translations/sv-json.js +2 -1
- package/dist/utils/localization/translations/th-json.d.ts +1 -0
- package/dist/utils/localization/translations/th-json.js +2 -1
- package/dist/utils/localization/translations/tr-json.d.ts +1 -0
- package/dist/utils/localization/translations/tr-json.js +2 -1
- package/dist/utils/localization/translations/zh-Hans-json.d.ts +1 -0
- package/dist/utils/localization/translations/zh-Hans-json.js +2 -1
- package/package.json +4 -2
package/README.md
CHANGED
|
@@ -40,6 +40,28 @@ Zenith library provides components defined in Zenith Design System. It includes
|
|
|
40
40
|
|
|
41
41
|
## Change log
|
|
42
42
|
|
|
43
|
+
### 1.24.0
|
|
44
|
+
|
|
45
|
+
* * Create `Summary` component
|
|
46
|
+
* Create `Mobile banner` and fix DriveApp banner paddings
|
|
47
|
+
* Create context provider for buttons in `Header`
|
|
48
|
+
* Allow `Pill` to be used without text
|
|
49
|
+
* Fix `DataGrid` padding in `Layout`
|
|
50
|
+
* Update `DateRange` with stepper: step button can be in a disabled state
|
|
51
|
+
* Improve outline state in components
|
|
52
|
+
* Align image in `ListItem` to the center when it's small
|
|
53
|
+
* Set a height limit for the `ExpandablePill`
|
|
54
|
+
* Update `Alert` to accommodate 4 lines of text
|
|
55
|
+
* Update loading state `Dropdown` and `GroupsFilter`
|
|
56
|
+
* Improve `Range` and `FiltersBarRange` components appearance
|
|
57
|
+
* Limit `SidePanel` width
|
|
58
|
+
* Resolve React library vulnerability issue
|
|
59
|
+
* Fix `DateRange` issue: Cannot clear date range back to initial or default value when only 'Custom' date range option is used
|
|
60
|
+
* Fix `Dropdown` issue: wrong colors on active state
|
|
61
|
+
* Fix `Action columns` issue: failing to load in Mobile view
|
|
62
|
+
* Fix `Groups filter` issue: losing focus after removing all symbols
|
|
63
|
+
* Fix `FiltersBar` issue: mobile `SidePanel` state reset
|
|
64
|
+
|
|
43
65
|
### 1.23.0
|
|
44
66
|
|
|
45
67
|
* Add the property `target` to `Modal` buttons
|
|
@@ -15,9 +15,10 @@ const button_1 = require("../button/button");
|
|
|
15
15
|
const useDriveClassName_1 = require("../utils/theme/useDriveClassName");
|
|
16
16
|
const react_1 = require("react");
|
|
17
17
|
const useNodeText_1 = require("../utils/useNodeText");
|
|
18
|
-
const BannerMultiline = ({ children, header, type = "warning", icon, action, onClose, role, ariaAtomic, ariaLive, size = bannerUtils_1.DEFAULT_BANNER_SIZE, primaryAction, className }) => {
|
|
18
|
+
const BannerMultiline = ({ children, header, type = "warning", icon, action, onClose, role, ariaAtomic, ariaLive, size = bannerUtils_1.DEFAULT_BANNER_SIZE, primaryAction, className = "" }) => {
|
|
19
19
|
const bannerOptions = (0, bannerUtils_1.getBannerOptions)(type);
|
|
20
20
|
const { translate } = (0, useLanguage_1.useLanguage)();
|
|
21
|
+
const bannerBlockClassName = (0, useDriveClassName_1.useDriveClassName)("zen-banner__block");
|
|
21
22
|
const bannerHeaderClassName = (0, useDriveClassName_1.useDriveClassName)("zen-banner__header");
|
|
22
23
|
const bannerMessageClassName = (0, useDriveClassName_1.useDriveClassName)("zen-banner__message");
|
|
23
24
|
const closeButtonClassName = (0, useDriveClassName_1.useDriveClassName)("zen-banner__close-button");
|
|
@@ -27,7 +28,8 @@ const BannerMultiline = ({ children, header, type = "warning", icon, action, onC
|
|
|
27
28
|
const blockClassNames = (0, classNames_1.classNames)([
|
|
28
29
|
"zen-banner",
|
|
29
30
|
"zen-banner__block",
|
|
30
|
-
|
|
31
|
+
bannerBlockClassName || "",
|
|
32
|
+
bannerOptions.blockClassName, className,
|
|
31
33
|
"zen-banner__block--multiline",
|
|
32
34
|
"zen-banner__block--" + size
|
|
33
35
|
]);
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
.zen-range-field-wrapper-column {
|
|
2
|
+
display: grid;
|
|
3
|
+
grid-template-columns: minmax(min-content, auto) minmax(auto, 168px) minmax(0, auto);
|
|
4
|
+
grid-template-rows: auto auto;
|
|
5
|
+
gap: 4px 8px;
|
|
6
|
+
align-items: center;
|
|
7
|
+
justify-items: start;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
.zen-range-field-wrapper-row {
|
|
11
|
+
display: grid;
|
|
12
|
+
align-items: center;
|
|
13
|
+
justify-items: start;
|
|
14
|
+
grid-template-columns:
|
|
15
|
+
minmax(24px, 32px)
|
|
16
|
+
minmax(64px, 64px)
|
|
17
|
+
minmax(24px, 32px)
|
|
18
|
+
minmax(24px, 32px)
|
|
19
|
+
minmax(64px, 64px)
|
|
20
|
+
minmax(24px, 32px);
|
|
21
|
+
row-gap: 4px;
|
|
22
|
+
column-gap: 8px;
|
|
23
|
+
}
|
|
@@ -21,6 +21,9 @@ const FeedItemInner = ({ columnsList, expanded, collapsedColumnsQty, visibleColu
|
|
|
21
21
|
exports.FeedItem = (0, react_1.memo)(FeedItemInner);
|
|
22
22
|
const ActionFeedItemInner = ({ columnsList, expanded, collapsedColumnsQty, visibleColumns, visibleRows, entity, index, actions, className }) => {
|
|
23
23
|
const actionsComp = (0, react_1.useMemo)(() => {
|
|
24
|
+
if (entity.isLoading) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
24
27
|
if (typeof actions === "function") {
|
|
25
28
|
return (0, jsx_runtime_1.jsx)(actionsMenu_1.ActionsMenu, { entity: entity, render: actions });
|
|
26
29
|
}
|
|
@@ -25,7 +25,6 @@ const areMapsEqual_1 = require("./utils/areMapsEqual");
|
|
|
25
25
|
const iconChevronLeftSmall_1 = require("../icons/iconChevronLeftSmall");
|
|
26
26
|
const useDrive_1 = require("../utils/theme/useDrive");
|
|
27
27
|
const iconChevronRightSmall_1 = require("../icons/iconChevronRightSmall");
|
|
28
|
-
const alert_1 = require("../alert/alert");
|
|
29
28
|
const parseLabel = (option, dateFormat, translate, toLacalFn) => {
|
|
30
29
|
const localeFrom = toLacalFn(option.from);
|
|
31
30
|
const localeTo = toLacalFn(option.to);
|
|
@@ -41,7 +40,6 @@ exports.parseLabel = parseLabel;
|
|
|
41
40
|
const DateRange = ({ className, classNamePopup, defaultValue, value, onChange, options: optionsArg, type, id, disabled, dropDownTitle, hasApplyButton, disableFutureDates, disablePastDates, disableDatesBefore, triggerLabel, disableDatesAfter, withCalendar, lockStartDate, lockEndDate, timeSelect, error, allowUnsetValue = false, stepper = false, classNameWrapper }) => {
|
|
42
41
|
var _a;
|
|
43
42
|
const { translate } = (0, useLanguage_1.useLanguage)();
|
|
44
|
-
const [alertReason, setAlertReason] = (0, react_1.useState)("");
|
|
45
43
|
const isMobile = (0, useMobile_1.useMobile)();
|
|
46
44
|
const isDrive = (0, useDrive_1.useDrive)();
|
|
47
45
|
const driveWrapperTriggerClassName = (0, useDriveClassName_1.useDriveClassName)("zen-date-range-wrapper");
|
|
@@ -52,12 +50,15 @@ const DateRange = ({ className, classNamePopup, defaultValue, value, onChange, o
|
|
|
52
50
|
const optionsMap = (0, react_1.useMemo)(() => (0, getRangeOption_1.getOptionsPeriodMap)(optionsArg, translate, toLocalDateTime, weekStartsOnSunday ? "Sunday" : "Monday", toReverseOffsetDateTime), [optionsArg, toLocalDateTime, toReverseOffsetDateTime, translate, weekStartsOnSunday]);
|
|
53
51
|
const previousStepOption = (0, react_1.useRef)("");
|
|
54
52
|
const [selectedRange, setSelectedRange] = (0, react_1.useState)((0, getRangeOption_1.getSelectedRangeFromValue)(optionsMap, value));
|
|
55
|
-
const isDefaultState = !defaultValue && !selectedRange || (defaultValue === null || defaultValue === void 0 ? void 0 : defaultValue.label) === (selectedRange === null || selectedRange === void 0 ? void 0 : selectedRange.label);
|
|
56
53
|
const [renderContent, setRenderContent] = (0, react_1.useState)(false);
|
|
57
54
|
const isCustomDateOption = (selectedRange === null || selectedRange === void 0 ? void 0 : selectedRange.label) === dateRangeInner_1.CUSTOM_CALENDAR_ID;
|
|
58
55
|
const [isOpen, setIsOpen] = (0, react_1.useState)(false);
|
|
59
56
|
const prevIsOpenRef = (0, react_1.useRef)(false);
|
|
60
57
|
const [customDate, setCustomDate] = (0, react_1.useState)((0, normalizeDates_1.normalizeDates)(value === null || value === void 0 ? void 0 : value.from.toISOString(), value === null || value === void 0 ? void 0 : value.to.toISOString(), disableFutureDates, disablePastDates, disableDatesBefore, disableDatesAfter));
|
|
58
|
+
const isDefaultState = !defaultValue && !selectedRange
|
|
59
|
+
|| defaultValue && selectedRange && defaultValue.label === selectedRange.label && defaultValue.label !== dateRangeInner_1.CUSTOM_CALENDAR_ID
|
|
60
|
+
|| defaultValue && selectedRange && defaultValue.label === selectedRange.label && defaultValue.label === dateRangeInner_1.CUSTOM_CALENDAR_ID && customDate.from && customDate.to
|
|
61
|
+
&& new Date(customDate.from).toISOString() === defaultValue.from.toISOString() && new Date(customDate.to).toISOString() === defaultValue.to.toISOString();
|
|
61
62
|
const triggerRef = (0, react_1.useRef)(null);
|
|
62
63
|
const [prevSelection, setPrevSelection] = (0, react_1.useState)((0, getRangeOption_1.getSelectedRangeFromValue)(optionsMap, value));
|
|
63
64
|
const componentId = (0, useUniqueId_1.useUniqueId)();
|
|
@@ -204,11 +205,11 @@ const DateRange = ({ className, classNamePopup, defaultValue, value, onChange, o
|
|
|
204
205
|
}
|
|
205
206
|
return selectedRange.label === (value === null || value === void 0 ? void 0 : value.label) && customDate.from === value.from.toISOString() && customDate.to === value.to.toISOString();
|
|
206
207
|
}, [customDate.from, customDate.to, hasApplyButton, isCustomDateOption, selectedRange === null || selectedRange === void 0 ? void 0 : selectedRange.label, value === null || value === void 0 ? void 0 : value.from, value === null || value === void 0 ? void 0 : value.label, value === null || value === void 0 ? void 0 : value.to]);
|
|
207
|
-
const memoizedDesktopView = (0, react_1.useMemo)(() => (0, jsx_runtime_1.jsx)(controlledPopup_1.ControlledPopup, { className: (0, classNames_1.classNames)(["zen-date-range-popup-wrapper", driveWrapperPopupClassName || ""]), ariaLabel: translate("Date range"), useTrapFocusWithTrigger: "on", role: "dialog", triggerRef: triggerRef, onOpenChange: setIsOpen, shouldHoldScroll: true, isOpen: isOpen, recalculateOnScroll: true, children: (0, jsx_runtime_1.jsxs)("div", { className: (0, classNames_1.classNames)(["zen-date-range-popup", drivePopupClassName || "", classNamePopup !== null && classNamePopup !== void 0 ? classNamePopup : ""]), children: [(0, jsx_runtime_1.jsx)("div", { className: "zen-date-range-popup__header", children: title }), component, (0, jsx_runtime_1.jsxs)("div", { className: "zen-date-range-popup__footer", children: [(0, jsx_runtime_1.jsx)(button_1.Button, { className: "zen-date-range-popup__button-clear", type: buttonType_1.ButtonType.Tertiary, disabled: isDefaultState, onClick: handleClearClick, children: translate("Clear") }), (!isCustomDateOption && hasApplyButton) &&
|
|
208
|
+
const memoizedDesktopView = (0, react_1.useMemo)(() => (0, jsx_runtime_1.jsx)(controlledPopup_1.ControlledPopup, { className: (0, classNames_1.classNames)(["zen-date-range-popup-wrapper", driveWrapperPopupClassName || ""]), ariaLabel: translate("Date range"), useTrapFocusWithTrigger: "on", role: "dialog", triggerRef: triggerRef, onOpenChange: setIsOpen, shouldHoldScroll: true, isOpen: isOpen, recalculateOnScroll: true, children: (0, jsx_runtime_1.jsxs)("div", { className: (0, classNames_1.classNames)(["zen-date-range-popup", drivePopupClassName || "", classNamePopup !== null && classNamePopup !== void 0 ? classNamePopup : ""]), children: [(0, jsx_runtime_1.jsx)("div", { className: "zen-date-range-popup__header", children: title }), component, (0, jsx_runtime_1.jsxs)("div", { className: "zen-date-range-popup__footer", children: [(0, jsx_runtime_1.jsx)(button_1.Button, { className: "zen-date-range-popup__button-clear", type: buttonType_1.ButtonType.Tertiary, disabled: !!isDefaultState, onClick: handleClearClick, children: translate("Clear") }), (!isCustomDateOption && hasApplyButton) &&
|
|
208
209
|
(0, jsx_runtime_1.jsx)(button_1.Button, { className: "zen-date-range-popup__button-reset", type: buttonType_1.ButtonType.Secondary, onClick: handleCancelClick, children: translate("Cancel") }), (isCustomDateOption || hasApplyButton) && (0, jsx_runtime_1.jsx)(button_1.Button, { className: "zen-date-range-popup__button-apply", type: buttonType_1.ButtonType.Primary, disabled: (isCustomDateOption && (!customDate.from || !customDate.to)) || isValueNotChanged || !selectedRange, onClick: handleApplyClick, children: translate("Apply") })] })] }) }), [classNamePopup, component, customDate.from, customDate.to, drivePopupClassName, driveWrapperPopupClassName, handleApplyClick, handleCancelClick, handleClearClick, hasApplyButton, isCustomDateOption, isDefaultState, isOpen, isValueNotChanged, selectedRange, title, translate]);
|
|
209
210
|
const notFocusedComponent = (0, react_1.useMemo)(() => !range.from && !range.to, [range.from, range.to]);
|
|
210
211
|
const memoizedMobileFooter = (0, react_1.useMemo)(() => {
|
|
211
|
-
const clearButton = (0, jsx_runtime_1.jsx)(button_1.Button, { type: buttonType_1.ButtonType.Tertiary, disabled: isDefaultState, onClick: handleClearClick, children: translate("Clear") });
|
|
212
|
+
const clearButton = (0, jsx_runtime_1.jsx)(button_1.Button, { type: buttonType_1.ButtonType.Tertiary, disabled: !!isDefaultState, onClick: handleClearClick, children: translate("Clear") });
|
|
212
213
|
const cancelButton = hasApplyButton && !showMobileCalendar ? (0, jsx_runtime_1.jsx)(button_1.Button, { type: buttonType_1.ButtonType.Secondary, onClick: handleCancelClick, children: translate("Cancel") }) : null;
|
|
213
214
|
const applyButton = showMobileCalendar || hasApplyButton ?
|
|
214
215
|
(0, jsx_runtime_1.jsx)(button_1.Button, { type: buttonType_1.ButtonType.Primary, disabled: (isCustomDateOption && (!customDate.from || !customDate.to)) || isValueNotChanged || !selectedRange, onClick: handleApplyClick, children: translate("Apply") }) : null;
|
|
@@ -228,28 +229,11 @@ const DateRange = ({ className, classNamePopup, defaultValue, value, onChange, o
|
|
|
228
229
|
return newValue.from.getTime() !== new Date(normalizeNewValue.from).getTime() || newValue.to.getTime() !== new Date(normalizeNewValue.to).getTime();
|
|
229
230
|
}, [disableDatesAfter, disableDatesBefore, disableFutureDates, disablePastDates, selectedRange, toLocalDateTime, toReverseOffsetDateTime, translate]);
|
|
230
231
|
const increaseRange = (0, react_1.useCallback)(() => {
|
|
231
|
-
const isDateDisabled = checkIsRangeDisable(true);
|
|
232
|
-
if (isDateDisabled) {
|
|
233
|
-
setAlertReason(selectedRange ? "NotAvailable" : "NoSelection");
|
|
234
|
-
return;
|
|
235
|
-
}
|
|
236
232
|
selectedRange && handleStepperClick(selectedRange, true);
|
|
237
|
-
}, [
|
|
233
|
+
}, [handleStepperClick, selectedRange]);
|
|
238
234
|
const decreaseRange = (0, react_1.useCallback)(() => {
|
|
239
|
-
const isDateDisabled = checkIsRangeDisable(false);
|
|
240
|
-
if (isDateDisabled) {
|
|
241
|
-
setAlertReason(selectedRange ? "NotAvailable" : "NoSelection");
|
|
242
|
-
return;
|
|
243
|
-
}
|
|
244
235
|
selectedRange && handleStepperClick(selectedRange, false);
|
|
245
|
-
}, [
|
|
246
|
-
const handleCloseAlert = (0, react_1.useCallback)(() => {
|
|
247
|
-
setAlertReason("");
|
|
248
|
-
}, []);
|
|
249
|
-
const handleUnavailableRangeAlert = (0, react_1.useCallback)(() => {
|
|
250
|
-
setAlertReason("");
|
|
251
|
-
setIsOpen(true);
|
|
252
|
-
}, []);
|
|
236
|
+
}, [handleStepperClick, selectedRange]);
|
|
253
237
|
(0, react_1.useEffect)(() => {
|
|
254
238
|
if (!isMobile && !isOpen && prevIsOpenRef.current) {
|
|
255
239
|
setTimeout(() => {
|
|
@@ -270,27 +254,7 @@ const DateRange = ({ className, classNamePopup, defaultValue, value, onChange, o
|
|
|
270
254
|
!defaultValue && !value || (defaultValue === null || defaultValue === void 0 ? void 0 : defaultValue.label) === currentLabel || type && type !== buttonType_1.ButtonType.Secondary ? "" : "zen-date-range--active"
|
|
271
255
|
]);
|
|
272
256
|
const popupTriggerComponent = (0, react_1.useMemo)(() => (0, jsx_runtime_1.jsx)(textIconButton_1.TextIconButton, { htmlType: "button", icon: iconCalendar_1.IconCalendar, iconPosition: textIconButton_1.ButtonIconPosition.Start, className: cssClass, type: type, disabled: disabled, onClick: toggleVisibility, ref: triggerRef, children: buttonLabel }), [cssClass, type, disabled, toggleVisibility, buttonLabel]);
|
|
273
|
-
|
|
274
|
-
if (alertReason === "NotAvailable") {
|
|
275
|
-
return {
|
|
276
|
-
header: translate("Date range not available"),
|
|
277
|
-
text: translate("Some of the dates you selected aren’t available. Please try a different range.")
|
|
278
|
-
};
|
|
279
|
-
}
|
|
280
|
-
if (alertReason === "NoSelection") {
|
|
281
|
-
return {
|
|
282
|
-
header: translate("Choose your date range"),
|
|
283
|
-
text: translate("Please select the dates you want to view.")
|
|
284
|
-
};
|
|
285
|
-
}
|
|
286
|
-
return { header: "", text: "" };
|
|
287
|
-
}, [alertReason, translate]);
|
|
288
|
-
return (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [stepper ? (0, jsx_runtime_1.jsxs)("div", { className: (0, classNames_1.classNames)(["zen-date-range-wrapper", driveWrapperTriggerClassName || "", classNameWrapper || ""]), children: [(0, jsx_runtime_1.jsx)("button", { type: "button", onClick: decreaseRange, className: (0, classNames_1.classNames)(["zen-date-range__stepper", "zen-date-range__stepper--left"]), title: translate("Previous"), children: (0, jsx_runtime_1.jsx)(iconChevronLeftSmall_1.IconChevronLeftSmall, { size: isDrive ? "huge" : "large" }) }), popupTriggerComponent, (0, jsx_runtime_1.jsx)("button", { type: "button", onClick: increaseRange, className: (0, classNames_1.classNames)(["zen-date-range__stepper", "zen-date-range__stepper--right"]), title: translate("Next"), children: (0, jsx_runtime_1.jsx)(iconChevronRightSmall_1.IconChevronRightSmall, { size: isDrive ? "huge" : "large" }) })] }) : popupTriggerComponent, isMobile ? memoizedMobileView : memoizedDesktopView, (0, jsx_runtime_1.jsx)(formFieldError_1.FormFieldError, { error: error }), stepper ? (0, jsx_runtime_1.jsx)(alert_1.Alert, { isOpen: alertReason !== "", header: memoizedAlertData.header, text: memoizedAlertData.text, onClose: handleCloseAlert, type: "warning", buttons: {
|
|
289
|
-
primary: {
|
|
290
|
-
text: translate("Choose dates"),
|
|
291
|
-
onClick: handleUnavailableRangeAlert
|
|
292
|
-
}
|
|
293
|
-
} }) : null] });
|
|
257
|
+
return (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [stepper ? (0, jsx_runtime_1.jsxs)("div", { className: (0, classNames_1.classNames)(["zen-date-range-wrapper", driveWrapperTriggerClassName || "", classNameWrapper || ""]), children: [(0, jsx_runtime_1.jsx)("button", { type: "button", disabled: checkIsRangeDisable(false), onClick: decreaseRange, className: (0, classNames_1.classNames)(["zen-date-range__stepper", "zen-date-range__stepper--left"]), title: translate("Previous"), children: (0, jsx_runtime_1.jsx)(iconChevronLeftSmall_1.IconChevronLeftSmall, { size: isDrive ? "huge" : "large" }) }), popupTriggerComponent, (0, jsx_runtime_1.jsx)("button", { type: "button", disabled: checkIsRangeDisable(true), onClick: increaseRange, className: (0, classNames_1.classNames)(["zen-date-range__stepper", "zen-date-range__stepper--right"]), title: translate("Next"), children: (0, jsx_runtime_1.jsx)(iconChevronRightSmall_1.IconChevronRightSmall, { size: isDrive ? "huge" : "large" }) })] }) : popupTriggerComponent, isMobile ? memoizedMobileView : memoizedDesktopView, (0, jsx_runtime_1.jsx)(formFieldError_1.FormFieldError, { error: error })] });
|
|
294
258
|
};
|
|
295
259
|
exports.DateRange = DateRange;
|
|
296
260
|
exports.TRANSLATIONS = [
|
|
@@ -18,6 +18,7 @@ const useLanguage_1 = require("../utils/localization/useLanguage");
|
|
|
18
18
|
const dropdownPopup_1 = require("./dropdownPopup");
|
|
19
19
|
const useMobile_1 = require("../commonHelpers/hooks/useMobile");
|
|
20
20
|
const useDebounce_1 = require("../commonHelpers/hooks/useDebounce");
|
|
21
|
+
const skeletonList_1 = require("../skeletonList/skeletonList");
|
|
21
22
|
const Dropdown = ({ className, classNamePopup, getData, errorHandler, dataItems, onChange, value, defaultValue, placeholder, dialogAriaLabel, width, isLoading, title, triggerAriaLabel, disabled, inputId, filterName, showCounterPill = true, showSelection, fullWidthTriggerButton, hasApplyButton, searchField = true, multiselect = true, forceSelection = false, selectAllButton = true, getNamedItems, getSelectedItem, buttonType = "secondary", listLimit = 500, alignment = "bottom-left", error, sortFn }) => {
|
|
22
23
|
var _a;
|
|
23
24
|
const isFullSelectionMode = (0, react_1.useMemo)(() => !Array.isArray(value), [value]);
|
|
@@ -358,7 +359,7 @@ const Dropdown = ({ className, classNamePopup, getData, errorHandler, dataItems,
|
|
|
358
359
|
currentWidth = 180;
|
|
359
360
|
}
|
|
360
361
|
if (state.showWaiting || isLoading) {
|
|
361
|
-
return (0, jsx_runtime_1.jsx)(
|
|
362
|
+
return (0, jsx_runtime_1.jsx)(skeletonList_1.SkeletonList, { className: "zen-dropdown-list__container zen-dropdown-list__container--empty", width: currentWidth });
|
|
362
363
|
}
|
|
363
364
|
if (state.showEmptyList) {
|
|
364
365
|
const isClearButtonDisabled = (0, dropdownHelper_1.compareStringsArrays)(state.selectedIds, state.defaultValue);
|
|
@@ -38,10 +38,6 @@ export interface IDropdownList extends IZenComponentProps {
|
|
|
38
38
|
interface IDropdownEmptyList extends Pick<IDropdownList, "translate" | "className" | "width" | "onClearClick" | "onApplyClick" | "onCancelClick" | "hasApplyButton" | "isApplyDisabled" | "isClearButtonDisabled" | "isWithFooter"> {
|
|
39
39
|
}
|
|
40
40
|
export declare const EmptyList: React.FC<IDropdownEmptyList>;
|
|
41
|
-
export declare const WaitingList: React.FC<{
|
|
42
|
-
className?: string;
|
|
43
|
-
width?: number;
|
|
44
|
-
}>;
|
|
45
41
|
export declare const DropdownList: React.FC<IDropdownList>;
|
|
46
42
|
export declare const TRANSLATIONS: string[];
|
|
47
43
|
export {};
|
|
@@ -23,12 +23,11 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
23
23
|
return result;
|
|
24
24
|
};
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.TRANSLATIONS = exports.DropdownList = exports.
|
|
26
|
+
exports.TRANSLATIONS = exports.DropdownList = exports.EmptyList = void 0;
|
|
27
27
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
28
28
|
const react_1 = __importStar(require("react"));
|
|
29
29
|
const checkboxListWithAction_1 = require("../checkboxListWithAction/checkboxListWithAction");
|
|
30
30
|
const classNames_1 = require("../commonHelpers/classNames/classNames");
|
|
31
|
-
const waiting_1 = require("../waiting/waiting");
|
|
32
31
|
const iconBackArrow_1 = require("../icons/deprecated/iconBackArrow");
|
|
33
32
|
const iconCheckRadio_1 = require("../icons/iconCheckRadio");
|
|
34
33
|
const button_1 = require("../button/button");
|
|
@@ -44,11 +43,6 @@ const EmptyList = ({ className, width, onClearClick, onApplyClick, onCancelClick
|
|
|
44
43
|
return (0, jsx_runtime_1.jsxs)("div", Object.assign({}, styleWidth, { className: (0, classNames_1.classNames)(["zen-dropdown-list__container", className || ""]), children: [(0, jsx_runtime_1.jsx)("div", { className: "zen-dropdown-list__container--empty", children: translate("No data") }), isWithFooter ? (0, jsx_runtime_1.jsxs)("div", { className: "zen-dropdown-list__footer", children: [(0, jsx_runtime_1.jsx)(button_1.Button, { onClick: onClearClick, disabled: isClearButtonDisabled, className: "zen-dropdown-list__clear-button", type: buttonType_1.ButtonType.Tertiary, title: translate("Clear"), children: translate("Clear") }), hasApplyButton && (0, jsx_runtime_1.jsxs)("div", { className: "zen-dropdown-list__button-group", children: [(0, jsx_runtime_1.jsx)(button_1.Button, { onClick: onCancelClick, className: "zen-dropdown-list__cancel-button", title: translate("Cancel"), children: translate("Cancel") }), (0, jsx_runtime_1.jsx)(button_1.Button, { onClick: onApplyClick, type: buttonType_1.ButtonType.Primary, disabled: isApplyDisabled, className: "zen-dropdown-list__apply-button", title: translate("Apply"), children: translate("Apply") })] })] }) : null] }));
|
|
45
44
|
};
|
|
46
45
|
exports.EmptyList = EmptyList;
|
|
47
|
-
const WaitingList = ({ className, width }) => {
|
|
48
|
-
const styleWidth = width ? { style: { width: `${width}px` } } : {};
|
|
49
|
-
return (0, jsx_runtime_1.jsx)("div", Object.assign({}, styleWidth, { className: (0, classNames_1.classNames)(["zen-dropdown-list__container zen-dropdown-list__container--empty", className || ""]), children: (0, jsx_runtime_1.jsx)(waiting_1.Waiting, { isLoading: true, delay: Number.MAX_SAFE_INTEGER, hideOverlay: true }) }));
|
|
50
|
-
};
|
|
51
|
-
exports.WaitingList = WaitingList;
|
|
52
46
|
const DropdownList = ({ onBackButtonClick, onSelectAllClick, onClearClick, onApplyClick, onCancelClick, onChange, onSelect, onSingleSelect, listData, isAllSelected, backButtonName, width, minWidth, isSelectAllButtonDisable, hasSelectAllButton, filterName, isMultiselect, hasApplyButton, isApplyDisabled, isClearButtonDisabled, activeValue, forceSelection, isWithFooter, isMobile }) => {
|
|
53
47
|
const { translate } = (0, useLanguage_1.useLanguage)();
|
|
54
48
|
const isDrive = (0, useDrive_1.useDrive)();
|
|
@@ -40,16 +40,13 @@ const FiltersBarDropdown = ({ sidePanelTitle, className, props, state, useSidePa
|
|
|
40
40
|
onChange({ selectedOption: Array.from(selection).filter(el => el !== removedId) });
|
|
41
41
|
}
|
|
42
42
|
}, [isFullSelectionMode, onChange, selection, sortedItems, state]);
|
|
43
|
-
const
|
|
44
|
-
const
|
|
45
|
-
const component = isFullSelectionMode ? (0, jsx_runtime_1.jsx)(dropdown_1.Dropdown
|
|
46
|
-
//after updates in dropdown component if useSidePanelView change condition to (props.searchField === false ? props.width : props.width || 180)
|
|
47
|
-
, Object.assign({}, props, { width: componentWidth, inputId: props.inputId && useSidePanelView ? `${props.inputId}-side-panel` : props.inputId, className: (0, classNames_1.classNames)([className || "", useSidePanelView ? "zen-filters-bar-dropdown--side-panel" : "", !useSidePanelView && !props.width ? "zen-filters-bar-dropdown--toolbar" : ""]), classNamePopup: (0, classNames_1.classNames)(["zen-filters-bar-dropdown-popup", props.classNamePopup || ""]), value: { selected: Array.from(selection), isAllSelected: isCurrentAllSelected || false }, onChange: (newValue) => {
|
|
43
|
+
const componentWidth = (0, react_1.useMemo)(() => useSidePanelView ? undefined : props.width, [useSidePanelView, props.width]);
|
|
44
|
+
const component = isFullSelectionMode ? (0, jsx_runtime_1.jsx)(dropdown_1.Dropdown, Object.assign({}, props, { width: componentWidth, inputId: props.inputId && useSidePanelView ? `${props.inputId}-side-panel` : props.inputId, className: (0, classNames_1.classNames)([className || "", useSidePanelView ? "zen-filters-bar-dropdown--side-panel" : "", !useSidePanelView && !props.width ? "zen-filters-bar-dropdown--toolbar" : ""]), classNamePopup: (0, classNames_1.classNames)(["zen-filters-bar-dropdown-popup", props.classNamePopup || ""]), value: { selected: Array.from(selection), isAllSelected: isCurrentAllSelected || false }, onChange: (newValue) => {
|
|
48
45
|
onChange({ selected: newValue.selected.map(el => el.id), isAllSelected: newValue.isAllSelected || false });
|
|
49
|
-
}, error: undefined, hasApplyButton: useSidePanelView ? false : props.hasApplyButton, getNamedItems: useSidePanelView ? (fn) => {
|
|
46
|
+
}, fullWidthTriggerButton: useSidePanelView ? true : props.fullWidthTriggerButton, error: undefined, hasApplyButton: useSidePanelView ? false : props.hasApplyButton, getNamedItems: useSidePanelView ? (fn) => {
|
|
50
47
|
namedItemsFnRef.current = fn;
|
|
51
48
|
setNamedFnReady(val => !val);
|
|
52
|
-
} : undefined, defaultValue: props.defaultValue, multiselect: true, selectAllButton: true })) : (0, jsx_runtime_1.jsx)(dropdown_1.Dropdown, Object.assign({}, props, { width: componentWidth, inputId: props.inputId && useSidePanelView ? `${props.inputId}-side-panel` : props.inputId, className: (0, classNames_1.classNames)([className || "", useSidePanelView ? "zen-filters-bar-dropdown--side-panel" : "", !useSidePanelView && !props.width ? "zen-filters-bar-dropdown--toolbar" : ""]), classNamePopup: (0, classNames_1.classNames)(["zen-filters-bar-dropdown-popup", props.classNamePopup || ""]), value: Array.from(selection), fullWidthTriggerButton: useSidePanelView
|
|
49
|
+
} : undefined, defaultValue: props.defaultValue, multiselect: true, selectAllButton: true })) : (0, jsx_runtime_1.jsx)(dropdown_1.Dropdown, Object.assign({}, props, { width: componentWidth, inputId: props.inputId && useSidePanelView ? `${props.inputId}-side-panel` : props.inputId, className: (0, classNames_1.classNames)([className || "", useSidePanelView ? "zen-filters-bar-dropdown--side-panel" : "", !useSidePanelView && !props.width ? "zen-filters-bar-dropdown--toolbar" : ""]), classNamePopup: (0, classNames_1.classNames)(["zen-filters-bar-dropdown-popup", props.classNamePopup || ""]), value: Array.from(selection), fullWidthTriggerButton: useSidePanelView ? true : props.fullWidthTriggerButton, onChange: (newValue) => {
|
|
53
50
|
onChange({ selectedOption: newValue.map(el => el.id) });
|
|
54
51
|
}, error: undefined, hasApplyButton: useSidePanelView ? false : props.hasApplyButton, getNamedItems: useSidePanelView ? (fn) => {
|
|
55
52
|
namedItemsFnRef.current = fn;
|
|
@@ -84,7 +81,7 @@ const FiltersBarDropdown = ({ sidePanelTitle, className, props, state, useSidePa
|
|
|
84
81
|
: state.selected) : state.selectedOption })) });
|
|
85
82
|
}
|
|
86
83
|
const namedPills = namedItemsFnRef.current(Array.from(selection)).map(el => (el.name ? el : Object.assign(Object.assign({}, el), { name: "..." })));
|
|
87
|
-
return (0, jsx_runtime_1.jsx)(sidePanelCell_1.SidePanelCell, { title: sidePanelTitle, role: "group", labelledBy: dropdownLabelledId, titleId: dropdownLabelledId, children: (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [
|
|
84
|
+
return (0, jsx_runtime_1.jsx)(sidePanelCell_1.SidePanelCell, { title: sidePanelTitle, role: "group", labelledBy: dropdownLabelledId, titleId: dropdownLabelledId, children: (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [component, props.multiselect || props.multiselect === undefined ? (0, jsx_runtime_1.jsx)(pillBox_1.PillBox, { className: "zen-filters-bar-dropdown__pill-box", selectedPills: namedPills, onRemove: handleRemove }) : null] }) });
|
|
88
85
|
};
|
|
89
86
|
exports.FiltersBarDropdown = FiltersBarDropdown;
|
|
90
87
|
exports.TRANSLATIONS = [...new Set([...dropdown_1.TRANSLATIONS])];
|
|
@@ -14,7 +14,7 @@ const FiltersBarGroupButton = ({ className, state, props, onChange: onChangeStat
|
|
|
14
14
|
const value = event.target.value;
|
|
15
15
|
onChangeState({ selectedValue: value });
|
|
16
16
|
};
|
|
17
|
-
const component = (0, jsx_runtime_1.jsx)(groupButton_1.GroupButton, Object.assign({}, props, { className: (0, classNames_1.classNames)([className !== null && className !== void 0 ? className : ""]), groupData: fullGroupData, onChange: onChangeEvent }));
|
|
17
|
+
const component = (0, jsx_runtime_1.jsx)(groupButton_1.GroupButton, Object.assign({}, props, { fullWidth: useSidePanelView, className: (0, classNames_1.classNames)([className !== null && className !== void 0 ? className : ""]), groupData: fullGroupData, onChange: onChangeEvent }));
|
|
18
18
|
if (!useSidePanelView) {
|
|
19
19
|
return component;
|
|
20
20
|
}
|
|
@@ -6,11 +6,11 @@ const groupsFilter_1 = require("../../../groupsFilter/groupsFilter");
|
|
|
6
6
|
const sidePanelCell_1 = require("../../../sidePanel/sidePanelCell/sidePanelCell");
|
|
7
7
|
const useUniqueId_1 = require("../../../commonHelpers/useUniqueId");
|
|
8
8
|
const FiltersBarGroupsFilter = ({ props, state, sidePanelTitle, useSidePanelView, onChange: onChangeState }) => {
|
|
9
|
-
const component = (0, jsx_runtime_1.jsx)(groupsFilter_1.GroupsFilter, Object.assign({}, props, { initialFilterState: state.value, onChange: (value) => onChangeState({ value }) }));
|
|
9
|
+
const component = (0, jsx_runtime_1.jsx)(groupsFilter_1.GroupsFilter, Object.assign({}, props, { fullSize: useSidePanelView, initialFilterState: state.value, onChange: (value) => onChangeState({ value }) }));
|
|
10
10
|
const groupFilterLabelledId = (0, useUniqueId_1.useUniqueId)();
|
|
11
11
|
if (!useSidePanelView) {
|
|
12
12
|
return component;
|
|
13
13
|
}
|
|
14
|
-
return (0, jsx_runtime_1.jsx)(sidePanelCell_1.SidePanelCell, { title: sidePanelTitle, role: "group", labelledBy: groupFilterLabelledId, titleId: groupFilterLabelledId, children: component });
|
|
14
|
+
return (0, jsx_runtime_1.jsx)(sidePanelCell_1.SidePanelCell, { title: sidePanelTitle, role: "group", labelledBy: groupFilterLabelledId, titleId: groupFilterLabelledId, className: "zen-filters-bar-groups-filter--side-panel", children: component });
|
|
15
15
|
};
|
|
16
16
|
exports.FiltersBarGroupsFilter = FiltersBarGroupsFilter;
|
|
@@ -87,7 +87,7 @@ const FiltersBarPeriodPicker = ({ props, hasApplyButton, className, useSidePanel
|
|
|
87
87
|
const range = (0, react_1.useMemo)(() => ({ from: customDate.from, to: customDate.to }), [customDate.from, customDate.to]);
|
|
88
88
|
const component = (0, react_1.useMemo)(() => (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: (0, jsx_runtime_1.jsx)(DateRangeInnerMemo, { id: `${id}-daterange`, options: options, onOptionSelect: handleDateRangeSelection, onCalendarSelect: hasCustomOption ? handleCustomDate : undefined, selection: selectedRange === null || selectedRange === void 0 ? void 0 : selectedRange.label, range: range, timeSelect: timeSelect, disableFutureDates: disableFutureDates, disablePastDates: disablePastDates, disableDatesBefore: disableDatesBefore, disableDatesAfter: disableDatesAfter }) }), [id, options, handleDateRangeSelection, hasCustomOption, handleCustomDate, selectedRange === null || selectedRange === void 0 ? void 0 : selectedRange.label, range, timeSelect, disableFutureDates, disablePastDates, disableDatesBefore, disableDatesAfter]);
|
|
89
89
|
const popup = (0, react_1.useMemo)(() => {
|
|
90
|
-
const commonProps = Object.assign(Object.assign({}, props), { hasApplyButton: useSidePanelView ? false : props.hasApplyButton || hasApplyButton, id: id, className: (0, classNames_1.classNames)(["zen-filters-bar-period-picker", className !== null && className !== void 0 ? className : ""]), classNamePopup: (0, classNames_1.classNames)(["zen-filters-bar-period-picker__popup", classNamePopup || ""]), options: optionsArg });
|
|
90
|
+
const commonProps = Object.assign(Object.assign({}, props), { hasApplyButton: useSidePanelView ? false : props.hasApplyButton || hasApplyButton, id: id, className: (0, classNames_1.classNames)(["zen-filters-bar-period-picker", useSidePanelView ? "zen-filters-bar-period-picker--full-width" : "", className !== null && className !== void 0 ? className : ""]), classNamePopup: (0, classNames_1.classNames)(["zen-filters-bar-period-picker__popup", useSidePanelView ? "zen-filters-bar-period-picker__popup--full-width" : "", classNamePopup || ""]), classNameWrapper: (0, classNames_1.classNames)([useSidePanelView ? "zen-filters-bar-period-picker-wrapper" : ""]), options: optionsArg });
|
|
91
91
|
return props.allowUnsetValue ? (0, jsx_runtime_1.jsx)(dateRange_1.DateRange, Object.assign({}, commonProps, { value: state, onChange: onChange, defaultValue: defaultState, allowUnsetValue: true })) : (0, jsx_runtime_1.jsx)(dateRange_1.DateRange, Object.assign({}, commonProps, { value: state, onChange: onChange, defaultValue: defaultState, allowUnsetValue: false }));
|
|
92
92
|
}, [props, useSidePanelView, id, className, classNamePopup, optionsArg, state, onChange, defaultState, hasApplyButton]);
|
|
93
93
|
if (!options.length && !hasCustomOption) {
|
|
@@ -44,6 +44,15 @@ const getCurrentFiltersState = (children) => {
|
|
|
44
44
|
});
|
|
45
45
|
return state;
|
|
46
46
|
};
|
|
47
|
+
const mergeStates = (initialState, newState) => {
|
|
48
|
+
const state = Object.assign({}, initialState);
|
|
49
|
+
Object.keys(newState).forEach(key => {
|
|
50
|
+
if (state[key]) {
|
|
51
|
+
state[key] = newState[key] ? newState[key] : undefined;
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
return state;
|
|
55
|
+
};
|
|
47
56
|
const FiltersBar = ({ className, children, isAllFiltersVisible, hideAllFiltersButton, parentElement, selectedQuantity, ignoreNewFunctionality = false, pillName, pillIcon, pillType, toggleAllFilters, getDefaultFiltersState, onClearAllFilters, onApplyAllFilters }) => {
|
|
48
57
|
const allFiltersRef = (0, react_1.useRef)(null);
|
|
49
58
|
const emptyFiltersRef = (0, react_1.useRef)(null);
|
|
@@ -52,6 +61,8 @@ const FiltersBar = ({ className, children, isAllFiltersVisible, hideAllFiltersBu
|
|
|
52
61
|
const { mobileTriggerRef } = (0, filtersBarProviderTrigger_1.useMobileTrigger)();
|
|
53
62
|
const { setFiltersBarToggleAllFiltersFn, onUpdateNumberOfChangedFiltersFn } = (0, filtersBarProvider_1.useFiltersBarComponent)();
|
|
54
63
|
const isAllFiltersButtonHidden = !isMobile && hideAllFiltersButton;
|
|
64
|
+
const prevIsShouldSync = (0, react_1.useRef)(isMobile && isAllFiltersVisible);
|
|
65
|
+
const prevIsOpen = (0, react_1.useRef)(isAllFiltersVisible);
|
|
55
66
|
(0, react_1.useEffect)(() => {
|
|
56
67
|
var _a, _b;
|
|
57
68
|
if (!isAllFiltersVisible) {
|
|
@@ -82,13 +93,27 @@ const FiltersBar = ({ className, children, isAllFiltersVisible, hideAllFiltersBu
|
|
|
82
93
|
onUpdateNumberOfChangedFiltersFn(filtersBarState.numberOfChangedFilters);
|
|
83
94
|
}
|
|
84
95
|
}, [filtersBarState.numberOfChangedFilters, onUpdateNumberOfChangedFiltersFn]);
|
|
85
|
-
(0, react_1.
|
|
96
|
+
const memoizedShouldUpdate = (0, react_1.useMemo)(() => {
|
|
86
97
|
if (isMobile && isAllFiltersVisible) {
|
|
98
|
+
prevIsShouldSync.current = true;
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
prevIsShouldSync.current = false;
|
|
102
|
+
return false;
|
|
103
|
+
}, [isMobile, isAllFiltersVisible]);
|
|
104
|
+
(0, react_1.useEffect)(() => {
|
|
105
|
+
if (prevIsShouldSync.current && memoizedShouldUpdate) {
|
|
106
|
+
prevIsShouldSync.current = false;
|
|
107
|
+
if (prevIsOpen.current) {
|
|
108
|
+
prevIsOpen.current = false;
|
|
109
|
+
dispatchSidePanelState({ type: sidePanelReducer_1.StateActionType.Reinitialize, payload: mergeStates(stateFromChildren, sidePanelState) });
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
87
112
|
react_1.Children.forEach(filterBarChildren, (child) => {
|
|
88
113
|
dispatchSidePanelState({ type: sidePanelReducer_1.StateActionType.Change, payload: { id: child.props.id, value: { state: child.props.state } } });
|
|
89
114
|
});
|
|
90
115
|
}
|
|
91
|
-
}, [filterBarChildren,
|
|
116
|
+
}, [filterBarChildren, memoizedShouldUpdate, sidePanelState, stateFromChildren]);
|
|
92
117
|
const searchChild = childrenArray.find(child => child && child.type === filtersBarSearch_1.FiltersBarSearch);
|
|
93
118
|
setSearchComponent(searchChild);
|
|
94
119
|
(0, react_1.useEffect)(() => {
|
|
@@ -101,6 +126,7 @@ const FiltersBar = ({ className, children, isAllFiltersVisible, hideAllFiltersBu
|
|
|
101
126
|
});
|
|
102
127
|
}
|
|
103
128
|
toggleAllFilters(value);
|
|
129
|
+
prevIsOpen.current = value;
|
|
104
130
|
}, [isAllFiltersVisible, toggleAllFilters, filterBarChildren]);
|
|
105
131
|
const onClosePanel = (0, react_1.useCallback)(() => toggleAllFiltersCallback(false), [toggleAllFiltersCallback]);
|
|
106
132
|
const handleApplyAllFilters = (0, react_1.useCallback)((isSidePanel) => (value) => {
|
|
@@ -7,6 +7,8 @@ const classNames_1 = require("../../../../commonHelpers/classNames/classNames");
|
|
|
7
7
|
const rangeHelper_1 = require("../../../../range/rangeHelper");
|
|
8
8
|
const useLanguage_1 = require("../../../../utils/localization/useLanguage");
|
|
9
9
|
const rangeField_1 = require("../../../../range/rangeField");
|
|
10
|
+
const useDirection_1 = require("../../hooks/useDirection");
|
|
11
|
+
const useMobile_1 = require("../../../../commonHelpers/hooks/useMobile");
|
|
10
12
|
const formFieldError_1 = require("../../../../formFieldError/formFieldError");
|
|
11
13
|
const FiltersBarSidePanelRange = ({ className, id, onChange, value, unit, min, max, fullBounded, allowEqualMinMax, labelMin, labelMax, disabled }) => {
|
|
12
14
|
const generatedId = (0, react_1.useId)();
|
|
@@ -37,9 +39,23 @@ const FiltersBarSidePanelRange = ({ className, id, onChange, value, unit, min, m
|
|
|
37
39
|
setCurrentValue(value);
|
|
38
40
|
}
|
|
39
41
|
}, [currentValue.min, currentValue.max, value]);
|
|
40
|
-
const
|
|
41
|
-
const
|
|
42
|
-
|
|
42
|
+
const { directionState, setContainerNode } = (0, useDirection_1.useDirection)();
|
|
43
|
+
const isMobile = (0, useMobile_1.useMobile)();
|
|
44
|
+
const setFieldsContainerRef = (0, react_1.useCallback)((node) => {
|
|
45
|
+
setContainerNode(node);
|
|
46
|
+
}, [setContainerNode]);
|
|
47
|
+
const rangeFieldClasses = (0, react_1.useMemo)(() => (0, classNames_1.classNames)([
|
|
48
|
+
"zen-filters-bar-side-panel-range__item",
|
|
49
|
+
isMobile ? "zen-filters-bar-side-panel-range__item--mobile" : "",
|
|
50
|
+
directionState === "column" ? "zen-filters-bar-side-panel-range__item--column" : "zen-filters-bar-side-panel-range__item--row"
|
|
51
|
+
]), [directionState, isMobile]);
|
|
52
|
+
const rangeFieldContainerClasses = (0, react_1.useMemo)(() => (0, classNames_1.classNames)([
|
|
53
|
+
"zen-filters-bar-side-panel-range__items-container",
|
|
54
|
+
directionState === "column" ? "zen-filters-bar-side-panel-range__items-container--column" : "zen-filters-bar-side-panel-range__items-container--row"
|
|
55
|
+
]), [directionState]);
|
|
56
|
+
const memoizedMinRangeField = (0, react_1.useMemo)(() => (0, jsx_runtime_1.jsx)(rangeField_1.RangeField, { className: (0, classNames_1.classNames)([rangeFieldClasses, "zen-filters-bar-side-panel-range__min-field"]), label: labelMin || translate("Min"), unit: unit, value: currentValue.min, id: "min", inputRef: minRef, errorString: (0, rangeHelper_1.getErrorString)("min", currentValue.min, translate, errorType, min, max), onChange: handleChange, max: max, min: min, isMinField: true, direction: directionState, disabled: disabled }), [rangeFieldClasses, labelMin, translate, unit, currentValue.min, errorType, min, max, handleChange, directionState, disabled]);
|
|
57
|
+
const memoizedMaxRangeField = (0, react_1.useMemo)(() => (0, jsx_runtime_1.jsx)(rangeField_1.RangeField, { className: (0, classNames_1.classNames)([rangeFieldClasses, "zen-filters-bar-side-panel-range__max-field"]), label: labelMax || translate("Max"), unit: unit, value: currentValue.max, id: "max", inputRef: maxRef, errorString: (0, rangeHelper_1.getErrorString)("max", currentValue.max, translate, errorType, min, max), onChange: handleChange, max: max, min: min, isMinField: false, direction: directionState, disabled: disabled }), [rangeFieldClasses, labelMax, translate, unit, currentValue.max, errorType, min, max, handleChange, directionState, disabled]);
|
|
58
|
+
return (0, jsx_runtime_1.jsxs)("div", { ref: setFieldsContainerRef, id: intId, className: (0, classNames_1.classNames)(["zen-filters-bar-side-panel-range", className || ""]), children: [(0, jsx_runtime_1.jsxs)("div", { className: rangeFieldContainerClasses, children: [memoizedMinRangeField, memoizedMaxRangeField] }), errorType !== undefined && directionState === "row" ? (0, jsx_runtime_1.jsx)(formFieldError_1.FormFieldError, { className: "zen-filters-bar-side-panel-range__error", error: [(0, rangeHelper_1.getErrorString)("min", currentValue.min, translate, errorType, min, max) || "", (0, rangeHelper_1.getErrorString)("max", currentValue.max, translate, errorType, min, max) || ""] })
|
|
43
59
|
: null] });
|
|
44
60
|
};
|
|
45
61
|
exports.FiltersBarSidePanelRange = FiltersBarSidePanelRange;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useDirection = void 0;
|
|
4
|
+
const react_1 = require("react");
|
|
5
|
+
const useMobile_1 = require("../../../commonHelpers/hooks/useMobile");
|
|
6
|
+
const useDirection = (direction) => {
|
|
7
|
+
const [directionState, setDirectionState] = (0, react_1.useState)(direction);
|
|
8
|
+
const isMobile = (0, useMobile_1.useMobile)();
|
|
9
|
+
const [containerNode, setContainerNode] = (0, react_1.useState)(null);
|
|
10
|
+
(0, react_1.useLayoutEffect)(() => {
|
|
11
|
+
if (direction || !containerNode) {
|
|
12
|
+
setDirectionState(direction);
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
const senseTexts = containerNode.querySelectorAll(".zen-range-field__sense-text");
|
|
16
|
+
const labels = containerNode.querySelectorAll(".zen-range-field__label");
|
|
17
|
+
if (!labels.length) {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
const senseText = senseTexts[0];
|
|
21
|
+
const labelMin = labels[0];
|
|
22
|
+
const labelMax = labels[1];
|
|
23
|
+
if (((senseText && senseText.textContent || "").length > 3) || (labelMin.textContent || "").length > 3 || (labelMax.textContent || "").length > 3) {
|
|
24
|
+
setDirectionState("column");
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
setDirectionState("row");
|
|
28
|
+
}
|
|
29
|
+
}, [containerNode, direction, isMobile]);
|
|
30
|
+
return { directionState: directionState || "row", setContainerNode };
|
|
31
|
+
};
|
|
32
|
+
exports.useDirection = useDirection;
|
|
@@ -95,7 +95,7 @@ const FiltersContainer = ({ className, children, getDefaultFiltersState, ignoreN
|
|
|
95
95
|
window.requestAnimationFrame(animateScroll);
|
|
96
96
|
}
|
|
97
97
|
}, []);
|
|
98
|
-
return (0, jsx_runtime_1.jsxs)("div", { className: (0, classNames_1.classNames)(["zen-filters-toolbar__filters-container", className !== null && className !== void 0 ? className : "", scrollButtonType]), children: [scrollButtonType === "start" || scrollButtonType === "both" ? (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { className: (0, classNames_1.classNames)(["zen-filters-toolbar__gradient", driveClassNameGradient || "", "zen-filters-toolbar__gradient--left"]) }), (0, jsx_runtime_1.jsx)(textIconButton_1.TextIconButton, { title: translate("Scroll left"), className: (0, classNames_1.classNames)(["zen-filters-toolbar__scroller", driveClassNameScroller || "", "zen-filters-toolbar__start"]), icon: iconChevronRight_1.IconChevronRight, iconPosition: textIconButton_1.ButtonIconPosition.Start, onClick: handleScrollButtonClick(scrollableRef.current, -scrollableStep), iconClasses: "zen-filters-toolbar__start-icon" })] }) : null, (0, jsx_runtime_1.jsx)("div", { ref: scrollableRef, className: "zen-filters-toolbar__scrollable", children: (0, jsx_runtime_1.jsx)("div", { className: "zen-filters-toolbar__filters", children: react_1.Children.map(children, (child, index) => {
|
|
98
|
+
return (0, jsx_runtime_1.jsxs)("div", { className: (0, classNames_1.classNames)(["zen-filters-toolbar__filters-container", className !== null && className !== void 0 ? className : "", `zen-filters-toolbar__filters-container--${scrollButtonType || "none"}`]), children: [scrollButtonType === "start" || scrollButtonType === "both" ? (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { className: (0, classNames_1.classNames)(["zen-filters-toolbar__gradient", driveClassNameGradient || "", "zen-filters-toolbar__gradient--left"]) }), (0, jsx_runtime_1.jsx)(textIconButton_1.TextIconButton, { title: translate("Scroll left"), className: (0, classNames_1.classNames)(["zen-filters-toolbar__scroller", driveClassNameScroller || "", "zen-filters-toolbar__start"]), icon: iconChevronRight_1.IconChevronRight, iconPosition: textIconButton_1.ButtonIconPosition.Start, onClick: handleScrollButtonClick(scrollableRef.current, -scrollableStep), iconClasses: "zen-filters-toolbar__start-icon" })] }) : null, (0, jsx_runtime_1.jsx)("div", { ref: scrollableRef, className: "zen-filters-toolbar__scrollable", children: (0, jsx_runtime_1.jsx)("div", { className: "zen-filters-toolbar__filters", children: react_1.Children.map(children, (child, index) => {
|
|
99
99
|
if (child.props.hideInBar && !isFilterStateChanged(child.props.id, child.props.state) || (child.props.hideInBar && ignoreNewFunctionality)) {
|
|
100
100
|
return null;
|
|
101
101
|
}
|
|
@@ -8,7 +8,6 @@ const groupsFilterMenu_1 = require("./groupsFilterMenu");
|
|
|
8
8
|
const groupsFilterInitialState_1 = require("./groupsFilterInitialState");
|
|
9
9
|
const groupsFilterAdjustmentState_1 = require("./groupsFilterAdjustmentState");
|
|
10
10
|
const groupsFilterCurrentlySelectedState_1 = require("./groupsFilterCurrentlySelectedState");
|
|
11
|
-
const waiting_1 = require("../waiting/waiting");
|
|
12
11
|
const stateReducer_1 = require("./stateReducer/stateReducer");
|
|
13
12
|
const stateActionType_1 = require("./stateReducer/stateActionType");
|
|
14
13
|
const groupsHelper_1 = require("./groupsHelper");
|
|
@@ -26,6 +25,7 @@ const classNames_1 = require("../commonHelpers/classNames/classNames");
|
|
|
26
25
|
const advancedGroupsFilter_1 = require("../advancedGroupsFilter/advancedGroupsFilter");
|
|
27
26
|
const useLanguage_1 = require("../utils/localization/useLanguage");
|
|
28
27
|
const groupsFilterAdvancedValue_1 = require("./groupsFilterAdvancedValue");
|
|
28
|
+
const skeletonList_1 = require("../skeletonList/skeletonList");
|
|
29
29
|
const GroupsFilter = ({ fullSize, className, dataLoader, errorHandler, isWithColor, onChange, initialFilterState, options = {}, listLimit = 500 }) => {
|
|
30
30
|
const { translate } = (0, useLanguage_1.useLanguage)();
|
|
31
31
|
const [groupPlaceHolder, setGroupPlaceHolder] = (0, react_1.useState)(options.placeholder || translate("Groups"));
|
|
@@ -36,6 +36,7 @@ const GroupsFilter = ({ fullSize, className, dataLoader, errorHandler, isWithCol
|
|
|
36
36
|
const triggerRef = (0, react_1.useRef)(null);
|
|
37
37
|
const menuRef = (0, react_1.useRef)(null);
|
|
38
38
|
const prevInitialState = (0, react_1.useRef)(initialFilterState);
|
|
39
|
+
const prevSearchField = (0, react_1.useRef)("");
|
|
39
40
|
const blocksMap = (0, react_1.useMemo)(() => [["builtInGroups", "userGroups"], ["advancedGroups", "builtInGroups", "userGroups"], ["builtInGroups", "userGroups"]], []);
|
|
40
41
|
const onOptionsToggle = () => { dispatchUiState({ type: uiStateActionType_1.UiStateActionType.ToggleOpen, payload: undefined }); };
|
|
41
42
|
const handleSetStep = (0, react_1.useCallback)((newStep) => {
|
|
@@ -214,11 +215,14 @@ const GroupsFilter = ({ fullSize, className, dataLoader, errorHandler, isWithCol
|
|
|
214
215
|
if (!uiState.isOpen) {
|
|
215
216
|
return;
|
|
216
217
|
}
|
|
217
|
-
if (uiState.searchValue && uiState.step === groupsFilterInterfaces_1.FilterMenuStep.Initial
|
|
218
|
+
if (uiState.searchValue && uiState.step === groupsFilterInterfaces_1.FilterMenuStep.Initial || uiState.step === groupsFilterInterfaces_1.FilterMenuStep.Initial && uiState.searchValue === ""
|
|
219
|
+
&& prevSearchField.current !== uiState.searchValue) {
|
|
218
220
|
inputRef.current.focus();
|
|
221
|
+
prevSearchField.current = uiState.searchValue;
|
|
219
222
|
}
|
|
220
223
|
else {
|
|
221
224
|
const firstFocusable = (_a = menuRef.current) === null || _a === void 0 ? void 0 : _a.querySelector(focusableSelector_1.FOCUSABLE_SELECTOR);
|
|
225
|
+
prevSearchField.current = "";
|
|
222
226
|
if (firstFocusable && !inputRef.current.value) {
|
|
223
227
|
firstFocusable.focus();
|
|
224
228
|
}
|
|
@@ -245,7 +249,7 @@ const GroupsFilter = ({ fullSize, className, dataLoader, errorHandler, isWithCol
|
|
|
245
249
|
(0, useEscape_1.useEscape)(triggerRef, handleEscape, uiState.isOpen);
|
|
246
250
|
const selectedCount = (0, stateReducerHelper_1.getFrozenCount)(state);
|
|
247
251
|
const isStateHasData = Object.keys(state.groupsMap).length > 0;
|
|
248
|
-
return (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(groupsFilterTrigger_1.GroupsFilterTrigger, { value: uiState.searchValue, onChange: onSearchChange, isOpenPopup: uiState.isOpen, count: selectedCount, withGlobeIcon: state.frozenSideWideState && selectedCount > 0, inputRef: inputRef, handleClick: handleTriggerClick, ref: triggerRef, fullSize: fullSize, placeholder: groupPlaceHolder }), (0, jsx_runtime_1.jsx)(controlledPopup_1.ControlledPopup, { isOpen: uiState.isOpen, className: (0, classNames_1.classNames)(["zen-groups-filter__popup", uiState.isOpenAdvancedFilter ? "zen-groups-filter__popup--inactive" : "", className ? className : ""]), onOpenChange: onOptionsToggle, useTrapFocusWithTrigger: uiState.isOpenAdvancedFilter ? "off" : "withTrigger", shouldHoldScroll: true, triggerRef: triggerRef, ariaLabel: translate("Organization groups filter"), recalculateOnScroll: true, children: (0, jsx_runtime_1.jsxs)("div", { className: "zen-groups-filter-menu", ref: menuRef, children: [isStateHasData && !uiState.isLoadWithError && (0, jsx_runtime_1.jsxs)(groupsFilterMenu_1.GroupsFilterMenu, { onCancelClick: handleCancel, onApplyClick: handleApply, onResetClick: handleReset, isApplyDisabled: !(0, stateReducerHelper_1.isStateChanged)(state), children: [uiState.step === groupsFilterInterfaces_1.FilterMenuStep.Initial && (0, jsx_runtime_1.jsx)(groupsFilterInitialState_1.GroupsFilterInitialState, { siteWideState: state.sideWideState, onDialogButtonClick: handleAdvancedDialogOpen, count: (0, stateReducerHelper_1.getCurrentlySelectedCount)(state), onSiteWideChange: onSideWideChange, onCurrentlySelectedClick: handleCurrentlySelectedClick, searchResult: uiState.searchValue ? getSearchResult() : "", children: getGroupsBox() }), uiState.step === groupsFilterInterfaces_1.FilterMenuStep.Adjustment && (0, jsx_runtime_1.jsx)(groupsFilterAdjustmentState_1.GroupsFilterAdjustmentState, { onBackButtonClick: handleBackButtonClick, onHomeButtonClick: handleHomeButtonClick, onSelectAllClick: selectAllHandler, backButtonName: (0, groupsFilterStatesHelper_1.getBackButtonName)(state, uiState.currentAdjustmentId), isAllSelected: (0, groupsFilterStatesHelper_1.isAllChildrenSelected)(state, uiState.currentAdjustmentId), children: getGroupsBox() }), uiState.step === groupsFilterInterfaces_1.FilterMenuStep.CurrentlySelected && (0, jsx_runtime_1.jsx)(groupsFilterCurrentlySelectedState_1.GroupsFilterCurrentlySelectedState, { siteWideState: state.sideWideState, relation: state.relation, count: (0, stateReducerHelper_1.getCurrentlySelectedCount)(state), onBackButtonClick: basicHandleBackButtonClick, onSiteWideChange: onSideWideChange, onRelationChange: onRelationChange, children: getGroupsBox() })] }), !uiState.isLoadWithError && !isStateHasData && (0, jsx_runtime_1.jsx)(
|
|
252
|
+
return (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(groupsFilterTrigger_1.GroupsFilterTrigger, { value: uiState.searchValue, onChange: onSearchChange, isOpenPopup: uiState.isOpen, count: selectedCount, withGlobeIcon: state.frozenSideWideState && selectedCount > 0, inputRef: inputRef, handleClick: handleTriggerClick, ref: triggerRef, fullSize: fullSize, placeholder: groupPlaceHolder }), (0, jsx_runtime_1.jsx)(controlledPopup_1.ControlledPopup, { isOpen: uiState.isOpen, className: (0, classNames_1.classNames)(["zen-groups-filter__popup", uiState.isOpenAdvancedFilter ? "zen-groups-filter__popup--inactive" : "", className ? className : ""]), onOpenChange: onOptionsToggle, useTrapFocusWithTrigger: uiState.isOpenAdvancedFilter ? "off" : "withTrigger", shouldHoldScroll: true, triggerRef: triggerRef, ariaLabel: translate("Organization groups filter"), recalculateOnScroll: true, children: (0, jsx_runtime_1.jsxs)("div", { className: "zen-groups-filter-menu", ref: menuRef, children: [isStateHasData && !uiState.isLoadWithError && (0, jsx_runtime_1.jsxs)(groupsFilterMenu_1.GroupsFilterMenu, { onCancelClick: handleCancel, onApplyClick: handleApply, onResetClick: handleReset, isApplyDisabled: !(0, stateReducerHelper_1.isStateChanged)(state), children: [uiState.step === groupsFilterInterfaces_1.FilterMenuStep.Initial && (0, jsx_runtime_1.jsx)(groupsFilterInitialState_1.GroupsFilterInitialState, { siteWideState: state.sideWideState, onDialogButtonClick: handleAdvancedDialogOpen, count: (0, stateReducerHelper_1.getCurrentlySelectedCount)(state), onSiteWideChange: onSideWideChange, onCurrentlySelectedClick: handleCurrentlySelectedClick, searchResult: uiState.searchValue ? getSearchResult() : "", children: getGroupsBox() }), uiState.step === groupsFilterInterfaces_1.FilterMenuStep.Adjustment && (0, jsx_runtime_1.jsx)(groupsFilterAdjustmentState_1.GroupsFilterAdjustmentState, { onBackButtonClick: handleBackButtonClick, onHomeButtonClick: handleHomeButtonClick, onSelectAllClick: selectAllHandler, backButtonName: (0, groupsFilterStatesHelper_1.getBackButtonName)(state, uiState.currentAdjustmentId), isAllSelected: (0, groupsFilterStatesHelper_1.isAllChildrenSelected)(state, uiState.currentAdjustmentId), children: getGroupsBox() }), uiState.step === groupsFilterInterfaces_1.FilterMenuStep.CurrentlySelected && (0, jsx_runtime_1.jsx)(groupsFilterCurrentlySelectedState_1.GroupsFilterCurrentlySelectedState, { siteWideState: state.sideWideState, relation: state.relation, count: (0, stateReducerHelper_1.getCurrentlySelectedCount)(state), onBackButtonClick: basicHandleBackButtonClick, onSiteWideChange: onSideWideChange, onRelationChange: onRelationChange, children: getGroupsBox() })] }), !uiState.isLoadWithError && !isStateHasData && !Object.keys(state.groupsMap).length && (0, jsx_runtime_1.jsx)(skeletonList_1.SkeletonList, { className: "zen-groups-filter__waiting" })] }) }), uiState.isOpenAdvancedFilter && getAdvancedDialog] });
|
|
249
253
|
};
|
|
250
254
|
exports.GroupsFilter = GroupsFilter;
|
|
251
255
|
exports.TRANSLATIONS = [
|