@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.
Files changed (74) hide show
  1. package/README.md +22 -0
  2. package/dist/banner/bannerMultipLine.js +4 -2
  3. package/dist/commonStyles/common.less +1 -0
  4. package/dist/commonStyles/rangeFieldMixin.less +23 -0
  5. package/dist/dataFeed/dataFeedColumnsItems.js +3 -0
  6. package/dist/dateRange/dateRange.js +9 -45
  7. package/dist/dropdown/dropdown.js +2 -1
  8. package/dist/dropdown/dropdownList.d.ts +0 -4
  9. package/dist/dropdown/dropdownList.js +1 -7
  10. package/dist/filtersBar/components/filtersBarDropdown/filtersBarDropdown.js +5 -8
  11. package/dist/filtersBar/components/filtersBarGroupButton/filtersBarGroupButton.js +1 -1
  12. package/dist/filtersBar/components/filtersBarGroupsFilter/filtersBarGroupsFilter.js +2 -2
  13. package/dist/filtersBar/components/filtersBarPeriodPicker/filtersBarPeriodPicker.js +1 -1
  14. package/dist/filtersBar/filtersBar.js +28 -2
  15. package/dist/filtersBar/filtersBarSidePanel/components/filtersBarSidePanelRange/filtersBarSidePanelRange.js +19 -3
  16. package/dist/filtersBar/filtersBarSidePanel/hooks/useDirection.d.ts +7 -0
  17. package/dist/filtersBar/filtersBarSidePanel/hooks/useDirection.js +32 -0
  18. package/dist/filtersBar/filtersContainer/filtersContainer.js +1 -1
  19. package/dist/groupsFilter/groupsFilter.js +7 -3
  20. package/dist/header/header.js +5 -1
  21. package/dist/index.css +670 -279
  22. package/dist/index.d.ts +3 -0
  23. package/dist/index.js +8 -2
  24. package/dist/range/range.js +10 -3
  25. package/dist/range/rangeField.d.ts +3 -1
  26. package/dist/range/rangeField.js +3 -2
  27. package/dist/skeleton/skeleton.js +3 -1
  28. package/dist/skeletonList/skeletonList.d.ts +10 -0
  29. package/dist/skeletonList/skeletonList.js +23 -0
  30. package/dist/summaries/summaries.d.ts +10 -0
  31. package/dist/summaries/summaries.js +12 -0
  32. package/dist/summaries/utils/splitIntoPairs.d.ts +3 -0
  33. package/dist/summaries/utils/splitIntoPairs.js +12 -0
  34. package/dist/summary/summary.d.ts +14 -0
  35. package/dist/summary/summary.js +17 -0
  36. package/dist/utils/headerButtons/headerButtonsProvider.d.ts +17 -0
  37. package/dist/utils/headerButtons/headerButtonsProvider.js +20 -0
  38. package/dist/utils/localization/translations/cs-json.d.ts +1 -0
  39. package/dist/utils/localization/translations/cs-json.js +2 -1
  40. package/dist/utils/localization/translations/de-json.d.ts +1 -0
  41. package/dist/utils/localization/translations/de-json.js +2 -1
  42. package/dist/utils/localization/translations/en-json.d.ts +1 -0
  43. package/dist/utils/localization/translations/en-json.js +2 -1
  44. package/dist/utils/localization/translations/es-json.d.ts +1 -0
  45. package/dist/utils/localization/translations/es-json.js +2 -1
  46. package/dist/utils/localization/translations/fr-FR-json.d.ts +1 -0
  47. package/dist/utils/localization/translations/fr-FR-json.js +2 -1
  48. package/dist/utils/localization/translations/fr-json.d.ts +1 -0
  49. package/dist/utils/localization/translations/fr-json.js +2 -1
  50. package/dist/utils/localization/translations/id-json.d.ts +1 -0
  51. package/dist/utils/localization/translations/id-json.js +2 -1
  52. package/dist/utils/localization/translations/it-json.d.ts +1 -0
  53. package/dist/utils/localization/translations/it-json.js +2 -1
  54. package/dist/utils/localization/translations/ja-json.d.ts +1 -0
  55. package/dist/utils/localization/translations/ja-json.js +2 -1
  56. package/dist/utils/localization/translations/ko-KR-json.d.ts +1 -0
  57. package/dist/utils/localization/translations/ko-KR-json.js +2 -1
  58. package/dist/utils/localization/translations/ms-json.d.ts +1 -0
  59. package/dist/utils/localization/translations/ms-json.js +2 -1
  60. package/dist/utils/localization/translations/nl-json.d.ts +1 -0
  61. package/dist/utils/localization/translations/nl-json.js +2 -1
  62. package/dist/utils/localization/translations/pl-json.d.ts +1 -0
  63. package/dist/utils/localization/translations/pl-json.js +2 -1
  64. package/dist/utils/localization/translations/pt-BR-json.d.ts +1 -0
  65. package/dist/utils/localization/translations/pt-BR-json.js +2 -1
  66. package/dist/utils/localization/translations/sv-json.d.ts +1 -0
  67. package/dist/utils/localization/translations/sv-json.js +2 -1
  68. package/dist/utils/localization/translations/th-json.d.ts +1 -0
  69. package/dist/utils/localization/translations/th-json.js +2 -1
  70. package/dist/utils/localization/translations/tr-json.d.ts +1 -0
  71. package/dist/utils/localization/translations/tr-json.js +2 -1
  72. package/dist/utils/localization/translations/zh-Hans-json.d.ts +1 -0
  73. package/dist/utils/localization/translations/zh-Hans-json.js +2 -1
  74. 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
- bannerOptions.blockClassName, className || "",
31
+ bannerBlockClassName || "",
32
+ bannerOptions.blockClassName, className,
31
33
  "zen-banner__block--multiline",
32
34
  "zen-banner__block--" + size
33
35
  ]);
@@ -11,6 +11,7 @@
11
11
  @import "link/link.less";
12
12
  @import "selectButton.less";
13
13
  @import "zIndex.less";
14
+ @import "rangeFieldMixin.less";
14
15
 
15
16
  @border-width-default: 1px;
16
17
  @border-radius-default: 4px;
@@ -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
- }, [checkIsRangeDisable, handleStepperClick, selectedRange]);
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
- }, [checkIsRangeDisable, handleStepperClick, selectedRange]);
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
- const memoizedAlertData = (0, react_1.useMemo)(() => {
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)(dropdownList_1.WaitingList, { width: currentWidth });
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.WaitingList = exports.EmptyList = void 0;
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 isLimitedWidth = (0, react_1.useMemo)(() => props.width && props.width >= 280, [props.width]);
44
- const componentWidth = (0, react_1.useMemo)(() => useSidePanelView ? (props.searchField === false ? (isLimitedWidth ? undefined : props.width) : (isLimitedWidth ? undefined : props.width || 180)) : props.width, [useSidePanelView, props.searchField, isLimitedWidth, props.width]);
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 && props.searchField === false && isLimitedWidth ? true : props.fullWidthTriggerButton, onChange: (newValue) => {
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: [isLimitedWidth ? (0, jsx_runtime_1.jsx)("div", { style: { width: props.width ? `${props.width}px` : "100%", maxWidth: "100%" }, children: component }) : 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] }) });
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.useEffect)(() => {
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, isAllFiltersVisible, isMobile]);
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 memoizedMinRangeField = (0, react_1.useMemo)(() => (0, jsx_runtime_1.jsx)(rangeField_1.RangeField, { className: (0, classNames_1.classNames)(["zen-filters-bar-side-panel-range__item", "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, hideErrorText: true, disabled: disabled }), [translate, unit, labelMin, currentValue.min, errorType, min, max, handleChange, disabled]);
41
- const memoizedMaxRangeField = (0, react_1.useMemo)(() => (0, jsx_runtime_1.jsx)(rangeField_1.RangeField, { className: (0, classNames_1.classNames)(["zen-filters-bar-side-panel-range__item", "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, hideErrorText: true, disabled: disabled }), [max, min, labelMax, handleChange, currentValue.max, translate, unit, errorType, disabled]);
42
- return (0, jsx_runtime_1.jsxs)("div", { id: intId, className: (0, classNames_1.classNames)(["zen-filters-bar-side-panel-range", className || ""]), children: [(0, jsx_runtime_1.jsxs)("div", { className: "zen-filters-bar-side-panel-range__items-container", children: [memoizedMinRangeField, memoizedMaxRangeField] }), errorType !== undefined ? (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) || ""] })
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,7 @@
1
+ export type TDirection = "column" | "row";
2
+ interface IUseDirectionProps {
3
+ directionState: TDirection;
4
+ setContainerNode: (node: HTMLDivElement | null) => void;
5
+ }
6
+ export declare const useDirection: (direction?: TDirection) => IUseDirectionProps;
7
+ export {};
@@ -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)(waiting_1.Waiting, { className: "zen-groups-filter__waiting", isLoading: !Object.keys(state.groupsMap).length, delay: 100 })] }) }), uiState.isOpenAdvancedFilter && getAdvancedDialog] });
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 = [