@geotab/zenith 1.15.4 → 1.16.1

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 (78) hide show
  1. package/README.md +8 -0
  2. package/dist/calendar/calendar.d.ts +4 -2
  3. package/dist/calendar/calendar.js +73 -76
  4. package/dist/calendar/calendarUtils.d.ts +5 -2
  5. package/dist/calendar/calendarUtils.js +8 -34
  6. package/dist/calendar/dateUtils.d.ts +6 -1
  7. package/dist/calendar/dateUtils.js +25 -94
  8. package/dist/commonStyles/pillStyles/pillContent.less +2 -2
  9. package/dist/dateInput/dateInput.js +7 -5
  10. package/dist/dateInputInner/dateInputInner.js +396 -97
  11. package/dist/dateInputInner/dateInputInnerControlBlock.d.ts +6 -1
  12. package/dist/dateInputInner/dateInputInnerControlBlock.js +17 -6
  13. package/dist/dateInputInner/dateInputInnerReducer.d.ts +109 -0
  14. package/dist/dateInputInner/dateInputInnerReducer.js +134 -0
  15. package/dist/dateRange/dateRange.d.ts +1 -0
  16. package/dist/dateRange/dateRange.js +26 -24
  17. package/dist/dateRange/dateRangeUtils.d.ts +1 -0
  18. package/dist/dateRangeInner/dateRangeInner.d.ts +2 -2
  19. package/dist/dateRangeInner/dateRangeInner.js +15 -17
  20. package/dist/dropdown/dropdown.js +6 -2
  21. package/dist/filtersBar/components/filtersBarDropdown/filtersBarDropdown.d.ts +1 -1
  22. package/dist/filtersBar/components/filtersBarDropdown/filtersBarDropdown.js +1 -1
  23. package/dist/filtersBar/components/filtersBarPeriodPicker/filtersBarPeriodPicker.js +10 -10
  24. package/dist/filtersBar/components/filtersBarPeriodPicker/getRangeOption.d.ts +8 -2
  25. package/dist/filtersBar/components/filtersBarPeriodPicker/getRangeOption.js +25 -11
  26. package/dist/filtersBar/components/filtersBarPeriodPicker/normalizeDates.js +10 -8
  27. package/dist/header/components/collapsedItemsControl/collapsedItemsControl.js +1 -1
  28. package/dist/header/header.js +2 -1
  29. package/dist/header/headerContext.d.ts +9 -0
  30. package/dist/header/headerContext.js +8 -0
  31. package/dist/header/headerHelpers.js +6 -3
  32. package/dist/header/headerMenu.d.ts +2 -0
  33. package/dist/header/headerMenu.js +2 -2
  34. package/dist/index.css +110 -23
  35. package/dist/index.d.ts +2 -2
  36. package/dist/index.js +15 -18
  37. package/dist/menu/components/menuItem.js +5 -2
  38. package/dist/parallelSelection/parallelSelection.d.ts +2 -0
  39. package/dist/parallelSelection/parallelSelection.js +2 -2
  40. package/dist/timePicker/timePicker.d.ts +1 -0
  41. package/dist/timePicker/timePicker.js +4 -4
  42. package/dist/utils/dateInputUtils/useTodayButton.d.ts +5 -0
  43. package/dist/utils/dateInputUtils/useTodayButton.js +16 -0
  44. package/dist/utils/localization/translations/cs-json.d.ts +1 -0
  45. package/dist/utils/localization/translations/cs-json.js +2 -1
  46. package/dist/utils/localization/translations/de-json.d.ts +1 -0
  47. package/dist/utils/localization/translations/de-json.js +2 -1
  48. package/dist/utils/localization/translations/en-json.d.ts +16 -0
  49. package/dist/utils/localization/translations/en-json.js +17 -1
  50. package/dist/utils/localization/translations/es-json.d.ts +1 -0
  51. package/dist/utils/localization/translations/es-json.js +2 -1
  52. package/dist/utils/localization/translations/fr-FR-json.d.ts +1 -0
  53. package/dist/utils/localization/translations/fr-FR-json.js +2 -1
  54. package/dist/utils/localization/translations/fr-json.d.ts +1 -0
  55. package/dist/utils/localization/translations/fr-json.js +2 -1
  56. package/dist/utils/localization/translations/id-json.d.ts +1 -0
  57. package/dist/utils/localization/translations/id-json.js +2 -1
  58. package/dist/utils/localization/translations/it-json.d.ts +1 -0
  59. package/dist/utils/localization/translations/it-json.js +2 -1
  60. package/dist/utils/localization/translations/ja-json.d.ts +1 -0
  61. package/dist/utils/localization/translations/ja-json.js +2 -1
  62. package/dist/utils/localization/translations/ms-json.d.ts +1 -0
  63. package/dist/utils/localization/translations/ms-json.js +2 -1
  64. package/dist/utils/localization/translations/nl-json.d.ts +1 -0
  65. package/dist/utils/localization/translations/nl-json.js +2 -1
  66. package/dist/utils/localization/translations/pl-json.d.ts +1 -0
  67. package/dist/utils/localization/translations/pl-json.js +2 -1
  68. package/dist/utils/localization/translations/pt-BR-json.d.ts +1 -0
  69. package/dist/utils/localization/translations/pt-BR-json.js +2 -1
  70. package/dist/utils/localization/translations/sv-json.d.ts +1 -0
  71. package/dist/utils/localization/translations/sv-json.js +2 -1
  72. package/dist/utils/localization/translations/th-json.d.ts +1 -0
  73. package/dist/utils/localization/translations/th-json.js +2 -1
  74. package/dist/utils/localization/translations/tr-json.d.ts +1 -0
  75. package/dist/utils/localization/translations/tr-json.js +2 -1
  76. package/dist/utils/localization/translations/zh-Hans-json.d.ts +1 -0
  77. package/dist/utils/localization/translations/zh-Hans-json.js +2 -1
  78. package/package.json +3 -3
@@ -1,23 +1,34 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.TRANSLATIONS = exports.DateInputInnerControlBlock = void 0;
4
7
  const jsx_runtime_1 = require("react/jsx-runtime");
8
+ const react_1 = require("react");
5
9
  const textInputRaw_1 = require("../textInputRaw/textInputRaw");
6
10
  const timePicker_1 = require("../timePicker/timePicker");
7
11
  const useLanguage_1 = require("../utils/localization/useLanguage");
8
12
  const classNames_1 = require("../commonHelpers/classNames/classNames");
9
13
  const formFieldError_1 = require("../formFieldError/formFieldError");
10
- const DateInputInnerControlBlock = ({ className, title, id, dateText, timePickerValue, placeholder, handleSetDateText, onBlurDateChangeHandler, requireSelection, selectTime, timeChangeHandler, isMobileView }) => {
14
+ const react_2 = __importDefault(require("react"));
15
+ const useDriveClassName_1 = require("../utils/theme/useDriveClassName");
16
+ // eslint-disable-next-line @typescript-eslint/naming-convention
17
+ exports.DateInputInnerControlBlock = react_2.default.forwardRef(function InnerDateInputControlBlock(props, ref) {
18
+ const { className, title, id, dateText, timePickerValue, placeholder, handleSetDateText, onBlurDateChangeHandler, requireSelection, selectTime, timeChangeHandler, isMobileView, isActiveField, assistiveText } = props;
11
19
  const { translate } = (0, useLanguage_1.useLanguage)();
20
+ const driveAssistiveClass = (0, useDriveClassName_1.useDriveClassName)("zen-form-field__text");
12
21
  const isHasDateError = requireSelection && !dateText;
13
22
  const isHasTimeError = requireSelection && !timePickerValue;
23
+ const memoizedDateInput = (0, react_1.useMemo)(() => (0, jsx_runtime_1.jsx)(textInputRaw_1.TextInputRaw, { className: (0, classNames_1.classNames)(["zen-date-input-inner__text-input", isActiveField ? "zen-date-input-inner__text-input--active" : ""]), id: id, value: dateText, onChange: handleSetDateText, onBlur: onBlurDateChangeHandler, placeholder: placeholder, autocomplete: "off", isError: isHasDateError, ref: ref }), [dateText, handleSetDateText, id, isActiveField, isHasDateError, onBlurDateChangeHandler, placeholder, ref]);
24
+ const memoizedTimeSelect = (0, react_1.useMemo)(() => selectTime
25
+ ? (0, jsx_runtime_1.jsxs)("div", { className: "zen-date-input-inner__inputs-block-item", children: [(0, jsx_runtime_1.jsx)(timePicker_1.TimePicker, { className: (0, classNames_1.classNames)(["zen-date-input-inner__text-input", isActiveField ? "zen-date-input-inner__text-input--active" : "",
26
+ isHasTimeError ? "zen-date-input-inner__text-input--error" : ""]), value: timePickerValue, onChange: timeChangeHandler, isMobileView: isMobileView, fullWidth: true, dataTimeId: id }), isHasTimeError ? (0, jsx_runtime_1.jsx)(formFieldError_1.FormFieldError, { error: translate("The time must be set") }) : null] })
27
+ : null, [isActiveField, isHasTimeError, isMobileView, selectTime, timeChangeHandler, timePickerValue, translate, id]);
14
28
  return (0, jsx_runtime_1.jsxs)("div", { className: (0, classNames_1.classNames)(["zen-date-input-inner__control-block", className || ""]), children: [title
15
29
  ? (0, jsx_runtime_1.jsx)("label", { htmlFor: id, className: "zen-date-input-inner__label", children: title })
16
- : null, (0, jsx_runtime_1.jsxs)("div", { className: "zen-date-input-inner__inputs-block", children: [(0, jsx_runtime_1.jsxs)("div", { className: "zen-date-input-inner__inputs-block-item", children: [(0, jsx_runtime_1.jsx)(textInputRaw_1.TextInputRaw, { className: "zen-date-input-inner__text-input", id: id, value: dateText, onChange: handleSetDateText, onBlur: onBlurDateChangeHandler, placeholder: placeholder, autocomplete: "off", isError: isHasDateError }), isHasDateError ? (0, jsx_runtime_1.jsx)(formFieldError_1.FormFieldError, { error: translate("The date must be set") }) : null] }), selectTime
17
- ? (0, jsx_runtime_1.jsxs)("div", { className: "zen-date-input-inner__inputs-block-item", children: [(0, jsx_runtime_1.jsx)(timePicker_1.TimePicker, { className: (0, classNames_1.classNames)(["zen-date-input-inner__text-input", isHasTimeError ? "zen-date-input-inner__text-input--error" : ""]), value: timePickerValue, onChange: timeChangeHandler, isMobileView: isMobileView, fullWidth: true }), isHasTimeError ? (0, jsx_runtime_1.jsx)(formFieldError_1.FormFieldError, { error: translate("The time must be set") }) : null] })
18
- : null] })] });
19
- };
20
- exports.DateInputInnerControlBlock = DateInputInnerControlBlock;
30
+ : null, (0, jsx_runtime_1.jsxs)("div", { className: "zen-date-input-inner__inputs-block", children: [(0, jsx_runtime_1.jsxs)("div", { className: "zen-date-input-inner__inputs-block-item", children: [memoizedDateInput, isHasDateError ? (0, jsx_runtime_1.jsx)(formFieldError_1.FormFieldError, { error: translate("The date must be set") }) : null] }), memoizedTimeSelect] }), assistiveText ? (0, jsx_runtime_1.jsx)("div", { className: (0, classNames_1.classNames)(["zen-date-input-inner__assistive-text", "zen-form-field__text", driveAssistiveClass || ""]), children: assistiveText }) : null] });
31
+ });
21
32
  exports.TRANSLATIONS = [
22
33
  "The date must be set",
23
34
  "The time must be set"
@@ -0,0 +1,109 @@
1
+ import { Reducer } from "react";
2
+ export type TActiveField = "start" | "end";
3
+ export declare const AssistiveText: {
4
+ readonly DateAdjusted: "date-adjusted";
5
+ readonly TimeAdjusted: "time-adjusted";
6
+ readonly None: "none";
7
+ };
8
+ export type TAssistiveText = typeof AssistiveText[keyof typeof AssistiveText];
9
+ export interface IDateInputInnerState {
10
+ dateRangeMode: boolean;
11
+ startDateId: string;
12
+ endDateId: string;
13
+ startDateText: string;
14
+ endDateText: string;
15
+ startAssistiveText: TAssistiveText;
16
+ endAssistiveText: TAssistiveText;
17
+ currentActiveField: TActiveField;
18
+ inputKeyDownBehavior: TActiveField | undefined;
19
+ }
20
+ export declare enum DateInputInnerStateActionType {
21
+ ChangeCalendarValue = "CHANGE_CALENDAR_VALUE",
22
+ ChangeStartDateText = "CHANGE_START_DATE_TEXT",
23
+ ChangeEndDateText = "CHANGE_END_DATE_TEXT",
24
+ ChangePeriod = "CHANGE_PERIOD",
25
+ ChangeStartAssistiveText = "CHANGE_START_ASSISTIVE_TEXT",
26
+ ChangeEndAssistiveText = "CHANGE_END_ASSISTIVE_TEXT",
27
+ ChangeActiveField = "CHANGE_ACTIVE_FIELD",
28
+ ToggleActiveField = "TOGGLE_ACTIVE_FIELD",
29
+ ChangeDateRangeMode = "CHANGE_DATE_RANGE_MODE",
30
+ UpdateDateText = "UPDATE_DATE_TEXT",
31
+ ChangeInputKeydownBehavior = "CHANGE_INPUT_KEYDOWN_BEHAVIOR"
32
+ }
33
+ interface IChangePeriodValuePayload {
34
+ start: string;
35
+ end: string;
36
+ startAssistiveText?: TAssistiveText;
37
+ endAssistiveText?: TAssistiveText;
38
+ nextActiveField?: TActiveField;
39
+ emittedBy?: TActiveField;
40
+ inputKeyDownBehavior?: TActiveField | undefined;
41
+ }
42
+ interface IChangeCalendarValuePayload {
43
+ start: string;
44
+ end: string;
45
+ hasAssistiveText: boolean;
46
+ }
47
+ interface IUpdateDateTextPayload {
48
+ start: string;
49
+ end: string;
50
+ }
51
+ interface IChangeCalendarValueAction {
52
+ type: DateInputInnerStateActionType.ChangeCalendarValue;
53
+ payload: IChangeCalendarValuePayload;
54
+ }
55
+ interface IChangePeriodAction {
56
+ type: DateInputInnerStateActionType.ChangePeriod;
57
+ payload: IChangePeriodValuePayload;
58
+ }
59
+ interface IChangeStartDateTextAction {
60
+ type: DateInputInnerStateActionType.ChangeStartDateText;
61
+ payload: string;
62
+ }
63
+ interface IChangeEndDateTextAction {
64
+ type: DateInputInnerStateActionType.ChangeEndDateText;
65
+ payload: string;
66
+ }
67
+ interface IChangeStartAssistiveTextAction {
68
+ type: DateInputInnerStateActionType.ChangeStartAssistiveText;
69
+ payload: TAssistiveText;
70
+ }
71
+ interface IChangeEndAssistiveTextAction {
72
+ type: DateInputInnerStateActionType.ChangeEndAssistiveText;
73
+ payload: TAssistiveText;
74
+ }
75
+ interface IChangeActiveFieldAction {
76
+ type: DateInputInnerStateActionType.ChangeActiveField;
77
+ payload: TActiveField;
78
+ }
79
+ interface IToggleActiveFieldAction {
80
+ type: DateInputInnerStateActionType.ToggleActiveField;
81
+ }
82
+ interface IChangeDateRangeModeAction {
83
+ type: DateInputInnerStateActionType.ChangeDateRangeMode;
84
+ payload: boolean;
85
+ }
86
+ interface IUpdateDateTextAction {
87
+ type: DateInputInnerStateActionType.UpdateDateText;
88
+ payload: IUpdateDateTextPayload;
89
+ }
90
+ interface IChangeInputKeydownBehaviorAction {
91
+ type: DateInputInnerStateActionType.ChangeInputKeydownBehavior;
92
+ payload: TActiveField | undefined;
93
+ }
94
+ export type TDateInputInnerStateAction = IChangeCalendarValueAction | IChangeStartDateTextAction | IChangeEndDateTextAction | IChangeStartAssistiveTextAction | IChangeEndAssistiveTextAction | IChangeActiveFieldAction | IToggleActiveFieldAction | IChangeDateRangeModeAction | IChangePeriodAction | IUpdateDateTextAction | IChangeInputKeydownBehaviorAction;
95
+ export interface IDateInputInnerReducer<T extends IDateInputInnerState = IDateInputInnerState> extends Reducer<T, TDateInputInnerStateAction> {
96
+ }
97
+ export declare const getInitialDateInputInnerState: (id: string, startText: string, endText: string, dateRange?: boolean) => {
98
+ dateRangeMode: boolean;
99
+ startDateId: string;
100
+ endDateId: string;
101
+ startDateText: string;
102
+ endDateText: string;
103
+ startAssistiveText: "none";
104
+ endAssistiveText: "none";
105
+ currentActiveField: TActiveField;
106
+ inputKeyDownBehavior: TActiveField;
107
+ };
108
+ export declare function dateInputInnerReducer<T>(state: IDateInputInnerState, action: TDateInputInnerStateAction): IDateInputInnerState | T;
109
+ export {};
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.dateInputInnerReducer = exports.getInitialDateInputInnerState = exports.DateInputInnerStateActionType = exports.AssistiveText = void 0;
4
+ exports.AssistiveText = {
5
+ DateAdjusted: "date-adjusted",
6
+ TimeAdjusted: "time-adjusted",
7
+ None: "none"
8
+ };
9
+ var DateInputInnerStateActionType;
10
+ (function (DateInputInnerStateActionType) {
11
+ DateInputInnerStateActionType["ChangeCalendarValue"] = "CHANGE_CALENDAR_VALUE";
12
+ DateInputInnerStateActionType["ChangeStartDateText"] = "CHANGE_START_DATE_TEXT";
13
+ DateInputInnerStateActionType["ChangeEndDateText"] = "CHANGE_END_DATE_TEXT";
14
+ DateInputInnerStateActionType["ChangePeriod"] = "CHANGE_PERIOD";
15
+ DateInputInnerStateActionType["ChangeStartAssistiveText"] = "CHANGE_START_ASSISTIVE_TEXT";
16
+ DateInputInnerStateActionType["ChangeEndAssistiveText"] = "CHANGE_END_ASSISTIVE_TEXT";
17
+ DateInputInnerStateActionType["ChangeActiveField"] = "CHANGE_ACTIVE_FIELD";
18
+ DateInputInnerStateActionType["ToggleActiveField"] = "TOGGLE_ACTIVE_FIELD";
19
+ DateInputInnerStateActionType["ChangeDateRangeMode"] = "CHANGE_DATE_RANGE_MODE";
20
+ DateInputInnerStateActionType["UpdateDateText"] = "UPDATE_DATE_TEXT";
21
+ DateInputInnerStateActionType["ChangeInputKeydownBehavior"] = "CHANGE_INPUT_KEYDOWN_BEHAVIOR";
22
+ })(DateInputInnerStateActionType || (exports.DateInputInnerStateActionType = DateInputInnerStateActionType = {}));
23
+ const getInitialDateInputInnerState = (id, startText, endText, dateRange) => ({
24
+ dateRangeMode: dateRange || false,
25
+ startDateId: `${id}-start`,
26
+ endDateId: `${id}-end`,
27
+ startDateText: startText,
28
+ endDateText: endText,
29
+ startAssistiveText: exports.AssistiveText.None,
30
+ endAssistiveText: exports.AssistiveText.None,
31
+ currentActiveField: "start",
32
+ inputKeyDownBehavior: "start"
33
+ });
34
+ exports.getInitialDateInputInnerState = getInitialDateInputInnerState;
35
+ // eslint-disable-next-line complexity
36
+ function dateInputInnerReducer(state, action) {
37
+ if (action.type === DateInputInnerStateActionType.ChangePeriod) {
38
+ const getEndAssistiveText = () => {
39
+ if (!state.dateRangeMode) {
40
+ return exports.AssistiveText.None;
41
+ }
42
+ if (action.payload.emittedBy === "end" && state.currentActiveField === "end") {
43
+ return exports.AssistiveText.None;
44
+ }
45
+ if (action.payload.emittedBy === "start" && state.currentActiveField === "start") {
46
+ return action.payload.endAssistiveText;
47
+ }
48
+ return action.payload.endAssistiveText || state.endAssistiveText;
49
+ };
50
+ const getStartAssistiveText = () => {
51
+ if (!state.dateRangeMode) {
52
+ return exports.AssistiveText.None;
53
+ }
54
+ if (action.payload.emittedBy === "start" && state.currentActiveField === "start") {
55
+ return exports.AssistiveText.None;
56
+ }
57
+ if (action.payload.emittedBy === "end" && state.currentActiveField === "end") {
58
+ return action.payload.startAssistiveText;
59
+ }
60
+ return action.payload.startAssistiveText || state.startAssistiveText;
61
+ };
62
+ return Object.assign(Object.assign({}, state), { currentActiveField: action.payload.emittedBy || action.payload.nextActiveField || state.currentActiveField, inputKeyDownBehavior: action.payload.emittedBy || action.payload.nextActiveField || state.inputKeyDownBehavior, startDateText: action.payload.start, endDateText: state.dateRangeMode ? action.payload.end : state.endDateText, startAssistiveText: getStartAssistiveText(), endAssistiveText: getEndAssistiveText() });
63
+ }
64
+ if (action.type === DateInputInnerStateActionType.ChangeCalendarValue) {
65
+ const nextActiveField = state.currentActiveField === "start" ? "end" : "start";
66
+ const getNextStartAssistiveText = () => {
67
+ if (!state.dateRangeMode) {
68
+ return exports.AssistiveText.None;
69
+ }
70
+ if (state.currentActiveField === "start") {
71
+ return exports.AssistiveText.None;
72
+ }
73
+ return state.startDateText !== action.payload.start || action.payload.hasAssistiveText ? exports.AssistiveText.DateAdjusted : exports.AssistiveText.None;
74
+ };
75
+ const getNextEndAssistiveText = () => {
76
+ if (!state.dateRangeMode) {
77
+ return exports.AssistiveText.None;
78
+ }
79
+ if (state.currentActiveField === "end") {
80
+ return exports.AssistiveText.None;
81
+ }
82
+ return state.endDateText !== action.payload.end || action.payload.hasAssistiveText ? exports.AssistiveText.DateAdjusted : exports.AssistiveText.None;
83
+ };
84
+ return Object.assign(Object.assign({}, state), { startDateText: action.payload.start, endDateText: state.dateRangeMode ? action.payload.end : state.endDateText, startAssistiveText: getNextStartAssistiveText(), endAssistiveText: getNextEndAssistiveText(), currentActiveField: state.dateRangeMode ? nextActiveField : "start", inputKeyDownBehavior: state.dateRangeMode ? nextActiveField : "start" });
85
+ }
86
+ if (action.type === DateInputInnerStateActionType.ChangeStartDateText) {
87
+ if (action.payload === state.startDateText) {
88
+ return state;
89
+ }
90
+ return Object.assign(Object.assign({}, state), { startDateText: action.payload });
91
+ }
92
+ if (action.type === DateInputInnerStateActionType.ChangeEndDateText) {
93
+ if (action.payload === state.endDateText || !state.dateRangeMode) {
94
+ return state;
95
+ }
96
+ return Object.assign(Object.assign({}, state), { endDateText: action.payload });
97
+ }
98
+ if (action.type === DateInputInnerStateActionType.UpdateDateText) {
99
+ if (action.payload.end === state.endDateText && action.payload.start === state.startDateText) {
100
+ return state;
101
+ }
102
+ return Object.assign(Object.assign({}, state), { startDateText: action.payload.start, endDateText: action.payload.end });
103
+ }
104
+ if (action.type === DateInputInnerStateActionType.ChangeStartAssistiveText) {
105
+ if (!state.dateRangeMode) {
106
+ return state;
107
+ }
108
+ return Object.assign(Object.assign({}, state), { startAssistiveText: action.payload });
109
+ }
110
+ if (action.type === DateInputInnerStateActionType.ChangeEndAssistiveText) {
111
+ return Object.assign(Object.assign({}, state), { endAssistiveText: action.payload });
112
+ }
113
+ if (action.type === DateInputInnerStateActionType.ChangeActiveField) {
114
+ return Object.assign(Object.assign({}, state), { currentActiveField: action.payload, inputKeyDownBehavior: action.payload, startAssistiveText: state.currentActiveField === "start" ? exports.AssistiveText.None : state.startAssistiveText, endAssistiveText: state.currentActiveField === "end" ? exports.AssistiveText.None : state.endAssistiveText });
115
+ }
116
+ if (action.type === DateInputInnerStateActionType.ChangeInputKeydownBehavior) {
117
+ return Object.assign(Object.assign({}, state), { inputKeyDownBehavior: action.payload });
118
+ }
119
+ if (action.type === DateInputInnerStateActionType.ToggleActiveField) {
120
+ if (!state.dateRangeMode) {
121
+ return state;
122
+ }
123
+ return Object.assign(Object.assign({}, state), { currentActiveField: state.currentActiveField === "start" ? "end" : "start", inputKeyDownBehavior: state.currentActiveField === "start" ? "end" : "start", startAssistiveText: state.currentActiveField === "start" ? exports.AssistiveText.None : state.startAssistiveText, endAssistiveText: state.currentActiveField === "end" ? exports.AssistiveText.None : state.endAssistiveText });
124
+ }
125
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
126
+ if (action.type === DateInputInnerStateActionType.ChangeDateRangeMode) {
127
+ if (state.dateRangeMode === action.payload) {
128
+ return state;
129
+ }
130
+ return Object.assign(Object.assign({}, state), { dateRangeMode: action.payload });
131
+ }
132
+ return state;
133
+ }
134
+ exports.dateInputInnerReducer = dateInputInnerReducer;
@@ -34,6 +34,7 @@ export interface IDateRangeUnsetValue extends IDateRangeBase {
34
34
  onChange: (value: IDateRangeValue | undefined) => void;
35
35
  allowUnsetValue: true;
36
36
  }
37
+ export declare const parseLabel: (option: IDateRangeValue, dateFormat: string, translate: (str: string) => string, toLacalFn: (date: Date | string) => Date) => string;
37
38
  export declare const DateRange: React.FC<IDateRange | IDateRangeUnsetValue>;
38
39
  export declare const TRANSLATIONS: string[];
39
40
  export {};
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TRANSLATIONS = exports.DateRange = void 0;
3
+ exports.TRANSLATIONS = exports.DateRange = exports.parseLabel = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const textIconButton_1 = require("../textIconButton/textIconButton");
6
6
  const button_1 = require("../button/button");
@@ -31,10 +31,12 @@ const parseLabel = (option, dateFormat, translate, toLacalFn) => {
31
31
  }
32
32
  return `${(0, formatDate_1.formatDate)(localeFrom, dateFormat, translate)} - ${(0, formatDate_1.formatDate)(localeTo, dateFormat, translate)}`;
33
33
  };
34
+ exports.parseLabel = parseLabel;
34
35
  const DateRange = ({ className, classNamePopup, defaultValue, value, onChange, options: optionsArg, type, id, disabled, dropDownTitle, hasApplyButton, disableFutureDates, disablePastDates, disableDatesBefore, disableDatesAfter, withCalendar, lockStartDate, lockEndDate, timeSelect, error, allowUnsetValue = false }) => {
35
36
  const { translate } = (0, useLanguage_1.useLanguage)();
36
37
  const isMobile = (0, useMobile_1.useMobile)();
37
38
  const drivePopupClassName = (0, useDriveClassName_1.useDriveClassName)("zen-date-range-popup");
39
+ const driveWrapperClassName = (0, useDriveClassName_1.useDriveClassName)("zen-date-range-popup-wrapper");
38
40
  const [showMobileCalendar, setShowMobileCalendar] = (0, react_1.useState)(false);
39
41
  const { dateFormat, toLocalDateTime, toReverseOffsetDateTime, weekStartsOnSunday } = (0, react_1.useContext)(userFormatContext_1.userFormatContext);
40
42
  const [selectedRange, setSelectedRange] = (0, react_1.useState)(value);
@@ -43,17 +45,13 @@ const DateRange = ({ className, classNamePopup, defaultValue, value, onChange, o
43
45
  const [isOpen, setIsOpen] = (0, react_1.useState)(false);
44
46
  const prevIsOpenRef = (0, react_1.useRef)(false);
45
47
  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));
46
- const isCustomDefaultState = !defaultValue && !selectedRange || (defaultValue === null || defaultValue === void 0 ? void 0 : defaultValue.label) === dateRangeInner_1.CUSTOM_CALENDAR_ID
47
- && customDate.from && customDate.to && (defaultValue.from.toISOString() === customDate.from && defaultValue.to.toISOString() === customDate.to) || false;
48
48
  const triggerRef = (0, react_1.useRef)(null);
49
49
  const [prevSelection, setPrevSelection] = (0, react_1.useState)(value);
50
50
  const componentId = (0, useUniqueId_1.useUniqueId)();
51
51
  const calendarLabel = translate(dateRangeInner_1.CUSTOM_CALENDAR_ID);
52
- const options = (0, react_1.useMemo)(() => optionsArg.map(option => (0, getRangeOption_1.getRangeOption)(option, translate, toLocalDateTime, weekStartsOnSunday ? "Sunday" : "Monday", toReverseOffsetDateTime))
53
- .filter(option => !!option), [optionsArg, translate, toLocalDateTime, weekStartsOnSunday, toReverseOffsetDateTime]);
54
- const dateRangeOptions = (0, react_1.useMemo)(() => options.map(option => ({ id: option.id, label: option.label })).filter(el => el.id !== dateRangeInner_1.CUSTOM_CALENDAR_ID), [options]);
55
- const hasCustomOption = (0, react_1.useMemo)(() => optionsArg.find(option => option === dateRangeInner_1.CUSTOM_CALENDAR_ID) !== undefined
56
- || optionsArg.find(option => option.label === dateRangeInner_1.CUSTOM_CALENDAR_ID) !== undefined || withCalendar, [optionsArg, withCalendar]);
52
+ const getCustomRange = (0, react_1.useCallback)(() => ({ from: (prevSelection === null || prevSelection === void 0 ? void 0 : prevSelection.from) || new Date(), to: (prevSelection === null || prevSelection === void 0 ? void 0 : prevSelection.to) || new Date() }), [prevSelection]);
53
+ const options = (0, react_1.useMemo)(() => (0, getRangeOption_1.getRangeOptionsArray)(optionsArg, translate, toLocalDateTime, weekStartsOnSunday ? "Sunday" : "Monday", toReverseOffsetDateTime, withCalendar || false, prevSelection && prevSelection.label === dateRangeInner_1.CUSTOM_CALENDAR_ID, prevSelection ? getCustomRange : undefined), [optionsArg, translate, toLocalDateTime, weekStartsOnSunday, toReverseOffsetDateTime, withCalendar, prevSelection, getCustomRange]);
54
+ const hasCustomOption = (0, react_1.useMemo)(() => options.find(option => option.id === dateRangeInner_1.CUSTOM_CALENDAR_ID) !== undefined, [options]);
57
55
  const cssClass = (0, classNames_1.classNames)([
58
56
  "zen-date-range",
59
57
  error ? "zen-date-range--error" : "",
@@ -71,7 +69,7 @@ const DateRange = ({ className, classNamePopup, defaultValue, value, onChange, o
71
69
  if (selection && val !== dateRangeInner_1.CUSTOM_CALENDAR_ID) {
72
70
  return selection.label;
73
71
  }
74
- return parseLabel(rangeValue, dateFormat, translate, toLocalDateTime);
72
+ return (0, exports.parseLabel)(rangeValue, dateFormat, translate, toLocalDateTime);
75
73
  }, [dateFormat, options, translate, toLocalDateTime]);
76
74
  (0, react_1.useEffect)(() => {
77
75
  if ((prevSelection === null || prevSelection === void 0 ? void 0 : prevSelection.label) !== (value === null || value === void 0 ? void 0 : value.label)) {
@@ -80,9 +78,10 @@ const DateRange = ({ className, classNamePopup, defaultValue, value, onChange, o
80
78
  }
81
79
  }, [prevSelection === null || prevSelection === void 0 ? void 0 : prevSelection.label, value]);
82
80
  const handleDateRangeSelection = (0, react_1.useCallback)((newVal) => {
81
+ var _a, _b;
83
82
  const selection = options.find(option => option.id === newVal);
84
83
  newVal === dateRangeInner_1.CUSTOM_CALENDAR_ID && setShowMobileCalendar(true);
85
- if (selection) {
84
+ if (selection && newVal !== dateRangeInner_1.CUSTOM_CALENDAR_ID && selection.getRange) {
86
85
  const range = selection.getRange();
87
86
  const normalizedDates = (0, normalizeDates_1.normalizeDates)(range.from.toISOString(), range.to.toISOString(), disableFutureDates, disablePastDates, disableDatesBefore, disableDatesAfter);
88
87
  const newRange = newVal === dateRangeInner_1.CUSTOM_CALENDAR_ID ?
@@ -93,7 +92,9 @@ const DateRange = ({ className, classNamePopup, defaultValue, value, onChange, o
93
92
  !hasApplyButton && onChange(Object.assign({ label: selection.id }, newRange));
94
93
  }
95
94
  else {
96
- const normalizedDates = (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);
95
+ const startDateForNormalize = ((_a = selection === null || selection === void 0 ? void 0 : selection.getRange) === null || _a === void 0 ? void 0 : _a.call(selection)) && (selectedRange === null || selectedRange === void 0 ? void 0 : selectedRange.label) !== newVal ? selection.getRange().from.toISOString() : value === null || value === void 0 ? void 0 : value.from.toISOString();
96
+ const endDateForNormalize = ((_b = selection === null || selection === void 0 ? void 0 : selection.getRange) === null || _b === void 0 ? void 0 : _b.call(selection)) && (selectedRange === null || selectedRange === void 0 ? void 0 : selectedRange.label) !== newVal ? selection.getRange().to.toISOString() : value === null || value === void 0 ? void 0 : value.to.toISOString();
97
+ const normalizedDates = (0, normalizeDates_1.normalizeDates)(startDateForNormalize, endDateForNormalize, disableFutureDates, disablePastDates, disableDatesBefore, disableDatesAfter);
97
98
  const newRange = newVal === dateRangeInner_1.CUSTOM_CALENDAR_ID ?
98
99
  { from: new Date(normalizedDates.from), to: new Date(normalizedDates.to) }
99
100
  : undefined;
@@ -104,7 +105,7 @@ const DateRange = ({ className, classNamePopup, defaultValue, value, onChange, o
104
105
  !hasApplyButton && onChange({ label: newVal, from: newValueFrom, to: newValueTo });
105
106
  }
106
107
  !hasApplyButton && newVal !== dateRangeInner_1.CUSTOM_CALENDAR_ID && setIsOpen(false);
107
- }, [options, hasApplyButton, disableFutureDates, disablePastDates, disableDatesBefore, disableDatesAfter, onChange, value === null || value === void 0 ? void 0 : value.from, value === null || value === void 0 ? void 0 : value.to]);
108
+ }, [options, hasApplyButton, disableFutureDates, disablePastDates, disableDatesBefore, disableDatesAfter, onChange, 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.to]);
108
109
  const handleRangeSelection = (0, react_1.useCallback)(() => {
109
110
  if (selectedRange === null || selectedRange === void 0 ? void 0 : selectedRange.label) {
110
111
  const newState = { label: selectedRange.label, from: new Date(customDate.from), to: new Date(customDate.to) };
@@ -143,12 +144,13 @@ const DateRange = ({ className, classNamePopup, defaultValue, value, onChange, o
143
144
  }, []);
144
145
  (0, react_1.useEffect)(() => {
145
146
  setCustomDate({ from: value === null || value === void 0 ? void 0 : value.from.toISOString(), to: value === null || value === void 0 ? void 0 : value.to.toISOString() });
147
+ setPrevSelection(value);
146
148
  }, [value]);
147
149
  const range = (0, react_1.useMemo)(() => ({ from: customDate.from, to: customDate.to }), [customDate.from, customDate.to]);
148
- const component = (0, react_1.useMemo)(() => (0, jsx_runtime_1.jsx)(dateRangeInner_1.DateRangeInner, { id: id || componentId, options: dateRangeOptions, onOptionSelect: handleDateRangeSelection, onCalendarSelect: hasCustomOption ? (val) => {
150
+ const component = (0, react_1.useMemo)(() => (0, jsx_runtime_1.jsx)(dateRangeInner_1.DateRangeInner, { id: id || componentId, options: options, onOptionSelect: handleDateRangeSelection, onCalendarSelect: hasCustomOption ? (val) => {
149
151
  setCustomDate({ from: lockStartDate || val.from, to: lockEndDate || (lockStartDate ? val.to || val.from : val.to) });
150
- } : undefined, selection: selectedRange === null || selectedRange === void 0 ? void 0 : selectedRange.label, range: range, timeSelect: timeSelect, disableFutureDates: disableFutureDates, disablePastDates: disablePastDates, disableDatesBefore: disableDatesBefore, disableDatesAfter: disableDatesAfter, showMobileCalendar: isMobile ? showMobileCalendar : undefined, setShowMobileCalendar: isMobile ? setShowMobileCalendar : undefined }), [id, componentId, dateRangeOptions, handleDateRangeSelection, hasCustomOption, selectedRange === null || selectedRange === void 0 ? void 0 : selectedRange.label, range, timeSelect,
151
- disableFutureDates, disablePastDates, disableDatesBefore, disableDatesAfter, isMobile, showMobileCalendar, lockStartDate, lockEndDate]);
152
+ } : undefined, selection: selectedRange === null || selectedRange === void 0 ? void 0 : selectedRange.label, range: range, timeSelect: timeSelect, disableFutureDates: disableFutureDates, disablePastDates: disablePastDates, disableDatesBefore: disableDatesBefore, disableDatesAfter: disableDatesAfter, showMobileCalendar: isMobile ? showMobileCalendar : undefined, setShowMobileCalendar: isMobile ? setShowMobileCalendar : undefined }), [id, componentId, options, handleDateRangeSelection, hasCustomOption, selectedRange === null || selectedRange === void 0 ? void 0 : selectedRange.label, range, timeSelect, disableFutureDates, disablePastDates,
153
+ disableDatesBefore, disableDatesAfter, isMobile, showMobileCalendar, lockStartDate, lockEndDate]);
152
154
  const memoizedHandleClose = (0, react_1.useCallback)(() => {
153
155
  setIsOpen(false);
154
156
  }, [setIsOpen]);
@@ -161,18 +163,17 @@ const DateRange = ({ className, classNamePopup, defaultValue, value, onChange, o
161
163
  }
162
164
  return selectedRange.label === (value === null || value === void 0 ? void 0 : value.label) && customDate.from === value.from.toISOString() && customDate.to === value.to.toISOString();
163
165
  }, [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]);
164
- const memoizedDesktopView = (0, react_1.useMemo)(() => (0, jsx_runtime_1.jsx)(controlledPopup_1.ControlledPopup, { className: (0, classNames_1.classNames)(["zen-date-range-popup-wrapper", classNamePopup !== null && classNamePopup !== void 0 ? classNamePopup : ""]), 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 || ""]), 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: [isCustomDateOption ? null : (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) &&
165
- (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 ? (0, jsx_runtime_1.jsx)(button_1.Button, { className: "zen-date-range-popup__button-reset", type: buttonType_1.ButtonType.Tertiary, disabled: isCustomDefaultState, onClick: handleClearClick, children: translate("Reset") }) : null, (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, handleApplyClick, handleCancelClick, handleClearClick, hasApplyButton, isCustomDateOption, isCustomDefaultState, isDefaultState, isOpen, isValueNotChanged, selectedRange, title, translate]);
166
+ const memoizedDesktopView = (0, react_1.useMemo)(() => (0, jsx_runtime_1.jsx)(controlledPopup_1.ControlledPopup, { className: (0, classNames_1.classNames)(["zen-date-range-popup-wrapper", driveWrapperClassName || ""]), 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) &&
167
+ (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, driveWrapperClassName, handleApplyClick, handleCancelClick, handleClearClick, hasApplyButton, isCustomDateOption, isDefaultState, isOpen, isValueNotChanged, selectedRange, title, translate]);
166
168
  const memoizedMobileFooter = (0, react_1.useMemo)(() => {
167
- const clearButton = showMobileCalendar ? null : (0, jsx_runtime_1.jsx)(button_1.Button, { type: buttonType_1.ButtonType.Tertiary, disabled: isDefaultState, onClick: handleClearClick, children: translate("Clear") });
169
+ const clearButton = (0, jsx_runtime_1.jsx)(button_1.Button, { type: buttonType_1.ButtonType.Tertiary, disabled: isDefaultState, onClick: handleClearClick, children: translate("Clear") });
168
170
  const cancelButton = hasApplyButton && !showMobileCalendar ? (0, jsx_runtime_1.jsx)(button_1.Button, { type: buttonType_1.ButtonType.Secondary, onClick: handleCancelClick, children: translate("Cancel") }) : null;
169
- const resetButton = showMobileCalendar ? (0, jsx_runtime_1.jsx)(button_1.Button, { type: buttonType_1.ButtonType.Secondary, disabled: isCustomDefaultState, onClick: handleClearClick, children: translate("Reset") }) : null;
170
171
  const applyButton = showMobileCalendar || hasApplyButton ?
171
172
  (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;
172
- return (0, jsx_runtime_1.jsxs)(footerButtons_1.FooterButtons, { children: [clearButton, cancelButton, applyButton, resetButton] });
173
- }, [customDate.from, customDate.to, handleApplyClick, handleCancelClick, handleClearClick, hasApplyButton, isCustomDateOption, isCustomDefaultState, isDefaultState, isValueNotChanged,
174
- selectedRange, showMobileCalendar, translate]);
175
- const memoizedMobileView = (0, react_1.useMemo)(() => (0, jsx_runtime_1.jsxs)(mobileSheet_1.MobileSheet, { className: (0, classNames_1.classNames)(["zen-date-range-mobile-sheet", classNamePopup || ""]), label: translate("Date range"), triggerRef: triggerRef, isOpen: isOpen, onHidePanel: memoizedHandleClose, onCloseClick: memoizedHandleClose, useTrapFocusWithTrigger: true, isBackVisible: showMobileCalendar, onBackClick: handleMobileBackClick, children: [(0, jsx_runtime_1.jsx)(mobileSheet_1.MobileSheet.Title, { children: showMobileCalendar ? calendarLabel : title }), (0, jsx_runtime_1.jsx)(mobileSheet_1.MobileSheet.Content, { children: component }), (0, jsx_runtime_1.jsx)(mobileSheet_1.MobileSheet.Footer, { children: memoizedMobileFooter })] }), [calendarLabel, classNamePopup, component, handleMobileBackClick, isOpen, memoizedHandleClose, memoizedMobileFooter, showMobileCalendar, title, translate]);
173
+ return (0, jsx_runtime_1.jsxs)(footerButtons_1.FooterButtons, { children: [applyButton, cancelButton, clearButton] });
174
+ }, [customDate.from, customDate.to, handleApplyClick, handleCancelClick, handleClearClick, hasApplyButton, isCustomDateOption, isDefaultState, isValueNotChanged, selectedRange,
175
+ showMobileCalendar, translate]);
176
+ const memoizedMobileView = (0, react_1.useMemo)(() => (0, jsx_runtime_1.jsxs)(mobileSheet_1.MobileSheet, { className: (0, classNames_1.classNames)(["zen-date-range-mobile-sheet", classNamePopup ? `${classNamePopup}--mobile-sheet` : ""]), label: translate("Date range"), triggerRef: triggerRef, isOpen: isOpen, onHidePanel: memoizedHandleClose, onCloseClick: memoizedHandleClose, useTrapFocusWithTrigger: true, isBackVisible: showMobileCalendar, onBackClick: handleMobileBackClick, children: [(0, jsx_runtime_1.jsx)(mobileSheet_1.MobileSheet.Title, { children: showMobileCalendar ? calendarLabel : title }), (0, jsx_runtime_1.jsx)(mobileSheet_1.MobileSheet.Content, { children: component }), (0, jsx_runtime_1.jsx)(mobileSheet_1.MobileSheet.Footer, { children: memoizedMobileFooter })] }), [calendarLabel, classNamePopup, component, handleMobileBackClick, isOpen, memoizedHandleClose, memoizedMobileFooter, showMobileCalendar, title, translate]);
176
177
  (0, react_1.useEffect)(() => {
177
178
  if (!isOpen && prevIsOpenRef.current) {
178
179
  setTimeout(() => {
@@ -191,5 +192,6 @@ exports.TRANSLATIONS = [
191
192
  "Clear",
192
193
  "Cancel",
193
194
  "Apply",
194
- "Reset"
195
+ "Reset",
196
+ "Today"
195
197
  ];
@@ -10,6 +10,7 @@ export interface IDateRangeValue extends IDateRange {
10
10
  export interface IDateRangeOption {
11
11
  label: string;
12
12
  getRange: () => IDateRange;
13
+ hasSecondaryLabel?: boolean;
13
14
  }
14
15
  export type TDateRangeOption = IDateRangeOption | TDateRangeName;
15
16
  type TToLocalDateTime = (d: Date | string) => Date;
@@ -2,10 +2,10 @@
2
2
  import "./dateRangeInner.less";
3
3
  import { IZenComponentProps } from "../commonHelpers/zenComponent";
4
4
  import { ICalendarRange } from "../calendar/calendar";
5
- import { IDateRangeInnerOption, TDateRangeName } from "../filtersBar/components/filtersBarPeriodPicker/getRangeOption";
5
+ import { IDateRangeOptionsItem } from "../filtersBar/components/filtersBarPeriodPicker/getRangeOption";
6
6
  export interface IDateRangeInner extends IZenComponentProps {
7
7
  id: string;
8
- options: IDateRangeInnerOption[] | TDateRangeName[];
8
+ options: IDateRangeOptionsItem[];
9
9
  onOptionSelect: (selection: string) => void;
10
10
  onCalendarSelect?: (range: ICalendarRange) => void;
11
11
  selection?: string;
@@ -8,41 +8,38 @@ const react_1 = require("react");
8
8
  const useLanguage_1 = require("../utils/localization/useLanguage");
9
9
  const userFormatContext_1 = require("../utils/userFormat/userFormatContext");
10
10
  const formatDate_1 = require("../utils/formatDate");
11
- const getRangeOption_1 = require("../filtersBar/components/filtersBarPeriodPicker/getRangeOption");
12
11
  const iconChevronRight_1 = require("../icons/iconChevronRight");
12
+ const dateRange_1 = require("../dateRange/dateRange");
13
+ const normalizeDates_1 = require("../filtersBar/components/filtersBarPeriodPicker/normalizeDates");
14
+ const classNames_1 = require("../commonHelpers/classNames/classNames");
13
15
  exports.CUSTOM_CALENDAR_ID = "Custom";
14
16
  const DateRangeInner = ({ id, options: optionsArg, selection, range = { from: undefined, to: undefined }, onOptionSelect, onCalendarSelect, timeSelect, disableFutureDates, disablePastDates, disableDatesAfter, disableDatesBefore, showMobileCalendar, setShowMobileCalendar }) => {
15
17
  const { translate } = (0, useLanguage_1.useLanguage)();
16
18
  const isMobileView = !!setShowMobileCalendar;
17
- const { dateFormat, weekStartsOnSunday, toLocalDateTime, toReverseOffsetDateTime } = (0, react_1.useContext)(userFormatContext_1.userFormatContext);
19
+ const { dateFormat, weekStartsOnSunday, toLocalDateTime } = (0, react_1.useContext)(userFormatContext_1.userFormatContext);
18
20
  const dateFormatter = (d) => (0, formatDate_1.formatDate)(toLocalDateTime(d), dateFormat, translate);
19
21
  const dateDeformatter = (d) => (0, formatDate_1.deformatDate)(d, dateFormat, translate) || new Date("");
20
22
  const isCalendarVisible = !!onCalendarSelect;
21
23
  const calendarLabel = translate(exports.CUSTOM_CALENDAR_ID);
22
- const options = (0, react_1.useMemo)(() => optionsArg.map((opt) => (0, getRangeOption_1.getRangeInnerOption)(opt, translate, toLocalDateTime, weekStartsOnSunday ? "Sunday" : "Monday", toReverseOffsetDateTime))
23
- .filter(opt => !!opt), [optionsArg, translate, toLocalDateTime, weekStartsOnSunday, toReverseOffsetDateTime]);
24
+ const normalizedUnknownRange = (0, react_1.useMemo)(() => (0, normalizeDates_1.normalizeDates)(undefined, undefined, disableFutureDates, disablePastDates, disableDatesBefore, disableDatesAfter), [disableDatesAfter, disableDatesBefore, disableFutureDates, disablePastDates]);
25
+ const options = (0, react_1.useMemo)(() => optionsArg.map((opt) => (Object.assign(Object.assign({}, opt), (opt.hasSecondaryLabel ? { secondaryLabel: opt.getRange ? (0, dateRange_1.parseLabel)(Object.assign({ label: opt.label }, opt.getRange()), dateFormat, translate, toLocalDateTime)
26
+ : (0, dateRange_1.parseLabel)({ label: "unknown", from: new Date(normalizedUnknownRange.from), to: new Date(normalizedUnknownRange.to) }, dateFormat, translate, toLocalDateTime) } : {})))), [optionsArg, dateFormat, translate, toLocalDateTime, normalizedUnknownRange.from, normalizedUnknownRange.to]);
24
27
  const items = (0, react_1.useMemo)(() => {
25
28
  const handleButtonClick = () => {
26
29
  setShowMobileCalendar && setShowMobileCalendar(true);
27
30
  selection !== exports.CUSTOM_CALENDAR_ID && onOptionSelect(exports.CUSTOM_CALENDAR_ID);
28
31
  };
29
- const mobileCustomLabel = (label) => (0, jsx_runtime_1.jsxs)("button", { type: "button", className: "zen-date-range-inner__mobile-custom-label", onClick: handleButtonClick, children: [(0, jsx_runtime_1.jsx)("div", { children: label }), (0, jsx_runtime_1.jsx)("div", { className: "zen-date-range-inner__mobile-custom-icon-wrapper", children: (0, jsx_runtime_1.jsx)(iconChevronRight_1.IconChevronRight, { size: "large" }) })] });
32
+ const mobileCustomLabel = (label, secondaryLabel) => (0, jsx_runtime_1.jsxs)("button", { type: "button", onClick: handleButtonClick, className: (0, classNames_1.classNames)(["zen-date-range-inner__mobile-custom-label", secondaryLabel === undefined ? "zen-date-range-inner__mobile-custom-label--no-secondary" : ""]), children: [(0, jsx_runtime_1.jsxs)("div", { className: "zen-date-range-inner__range-label", children: [(0, jsx_runtime_1.jsx)("div", { children: label }), secondaryLabel ? (0, jsx_runtime_1.jsx)("div", { className: "zen-date-range-inner__label-secondary", children: secondaryLabel }) : null] }), (0, jsx_runtime_1.jsx)("div", { className: "zen-date-range-inner__mobile-custom-icon-wrapper", children: (0, jsx_runtime_1.jsx)(iconChevronRight_1.IconChevronRight, { size: "large" }) })] });
33
+ const getLabel = (mainLabel, secondaryLabel) => (0, jsx_runtime_1.jsxs)("div", { className: "zen-date-range-inner__range-label", children: [(0, jsx_runtime_1.jsx)("div", { children: mainLabel }), secondaryLabel ? (0, jsx_runtime_1.jsx)("div", { className: "zen-date-range-inner__label-secondary", children: secondaryLabel }) : null] });
30
34
  const optionsToPass = options.map(option => ({
31
35
  id: option.id,
32
36
  value: option.id,
33
- children: option.label,
37
+ children: isMobileView && option.id === "Custom" ? mobileCustomLabel(calendarLabel, option.secondaryLabel)
38
+ : getLabel(option.label, option.secondaryLabel),
34
39
  key: option.id
35
40
  }));
36
- if (isCalendarVisible) {
37
- optionsToPass.push({
38
- id: exports.CUSTOM_CALENDAR_ID,
39
- value: exports.CUSTOM_CALENDAR_ID,
40
- children: isMobileView ? mobileCustomLabel(calendarLabel) : calendarLabel,
41
- key: exports.CUSTOM_CALENDAR_ID
42
- });
43
- }
44
41
  return optionsToPass;
45
- }, [calendarLabel, isCalendarVisible, isMobileView, onOptionSelect, options, selection, setShowMobileCalendar]);
42
+ }, [calendarLabel, isMobileView, onOptionSelect, options, selection, setShowMobileCalendar]);
46
43
  const calendarId = (0, react_1.useMemo)(() => `${id}-calendar`, [id]);
47
44
  const optionSelectHandler = (0, react_1.useCallback)(e => {
48
45
  let selectedValue = e.target.value;
@@ -66,11 +63,12 @@ const DateRangeInner = ({ id, options: optionsArg, selection, range = { from: un
66
63
  return null;
67
64
  }, [id, isCalendarVisible, isMobileView, items, optionSelectHandler, selection, showMobileCalendar]);
68
65
  return (0, jsx_runtime_1.jsxs)("div", { id: id, className: "zen-date-range-inner", children: [memoizedRadioGroup, isCalendarVisible && selection === exports.CUSTOM_CALENDAR_ID && (!isMobileView || showMobileCalendar)
69
- ? (0, jsx_runtime_1.jsx)("div", { className: "zen-date-range-inner__calendar-wrapper", children: (0, jsx_runtime_1.jsx)(dateInputInner_1.DateInputInner, { id: calendarId, value: range, onChange: calendarSelectHandler, dateFormat: dateFormat, dateFormatter: dateFormatter, dateDeformatter: dateDeformatter, startDayOfWeek: weekStartsOnSunday ? 0 : 1, disableFutureDates: disableFutureDates, disablePastDates: disablePastDates, disableDatesBefore: disableDatesBefore, disableDatesAfter: disableDatesAfter, dateRangeMode: true, selectTime: timeSelect, isMobileView: isMobileCalendar, requireSelection: true }) })
66
+ ? (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: (0, jsx_runtime_1.jsx)("div", { className: "zen-date-range-inner__calendar-wrapper", children: (0, jsx_runtime_1.jsx)(dateInputInner_1.DateInputInner, { id: calendarId, value: range, onChange: calendarSelectHandler, dateFormat: dateFormat, dateFormatter: dateFormatter, dateDeformatter: dateDeformatter, startDayOfWeek: weekStartsOnSunday ? 0 : 1, disableFutureDates: disableFutureDates, disablePastDates: disablePastDates, disableDatesBefore: disableDatesBefore, disableDatesAfter: disableDatesAfter, dateRangeMode: true, selectTime: timeSelect, isMobileView: isMobileCalendar, requireSelection: true }) }) })
70
67
  : null] });
71
68
  };
72
69
  exports.DateRangeInner = DateRangeInner;
73
70
  exports.TRANSLATIONS = [
74
71
  "Custom Date",
75
- "Custom Date and Time range"
72
+ "Custom Date and Time range",
73
+ "Today"
76
74
  ];
@@ -72,6 +72,7 @@ const Dropdown = ({ className, classNamePopup, getData, errorHandler, dataItems,
72
72
  return Promise.all(promises).then((items) => {
73
73
  const result = items.filter(el => el !== undefined);
74
74
  dispatchState({ type: stateActionType_1.StateActionType.UpdateSelectedItems, payload: result });
75
+ getNamedItemsHasBeenCalled.current = false;
75
76
  }).catch(() => {
76
77
  dispatchState({ type: stateActionType_1.StateActionType.UpdateSelectedItems, payload: [] });
77
78
  });
@@ -257,10 +258,13 @@ const Dropdown = ({ className, classNamePopup, getData, errorHandler, dataItems,
257
258
  }, [isMobile, searchField, state.inputValue, inputRef, state.currentId]);
258
259
  (0, react_1.useEffect)(() => {
259
260
  if ((Object.keys(state.groupsMap).length === 0 && Object.keys(state.groupsMapSelected).length === 0) || !getNamedItems || getNamedItemsHasBeenCalled.current) {
260
- return;
261
+ return undefined;
261
262
  }
262
263
  getNamedItemsHasBeenCalled.current = true;
263
- getNamedItems((items) => (0, dropdownHelper_1.prepareSelectedIdsToItems)(items, state.groupsMap, state.groupsMapSelected));
264
+ const timeoutId = setTimeout(() => {
265
+ getNamedItems((items) => (0, dropdownHelper_1.prepareSelectedIdsToItems)(items, state.groupsMap, state.groupsMapSelected));
266
+ }, 200);
267
+ return () => clearTimeout(timeoutId);
264
268
  }, [getNamedItems, state.groupsMap, state.groupsMapSelected]);
265
269
  (0, react_1.useEffect)(() => {
266
270
  if (state.hasDataProblem && multiselect) {
@@ -5,7 +5,7 @@ import { IDropdown } from "../../../dropdown/dropdown";
5
5
  export interface IFiltersBarDropdownState {
6
6
  selectedOption: string[];
7
7
  }
8
- interface IFiltersBarDropdownProps extends Pick<IDropdown, "translate" | "placeholder" | "inputId" | "disabled" | "getData" | "dataItems" | "defaultValue" | "errorHandler" | "listLimit" | "title" | "triggerAriaLabel" | "filterName" | "showCounterPill" | "showSelection" | "searchField" | "multiselect" | "selectAllButton" | "hasApplyButton" | "dialogAriaLabel" | "fullWidthTriggerButton" | "width" | "forceSelection" | "sortFn" | "classNamePopup"> {
8
+ interface IFiltersBarDropdownProps extends Pick<IDropdown, "translate" | "placeholder" | "inputId" | "disabled" | "getData" | "dataItems" | "defaultValue" | "errorHandler" | "listLimit" | "title" | "triggerAriaLabel" | "filterName" | "showCounterPill" | "showSelection" | "searchField" | "multiselect" | "selectAllButton" | "hasApplyButton" | "dialogAriaLabel" | "fullWidthTriggerButton" | "width" | "forceSelection" | "sortFn" | "classNamePopup" | "getSelectedItem"> {
9
9
  }
10
10
  export interface IFiltersBarDropdown extends IFiltersBarItem<IFiltersBarDropdownState, IFiltersBarDropdownProps> {
11
11
  className?: string;
@@ -30,7 +30,7 @@ const FiltersBarDropdown = ({ sidePanelTitle, className, props, state, useSidePa
30
30
  onChange({ selectedOption: selectedOption.map(el => el.id) });
31
31
  }, error: undefined, fullWidthTriggerButton: useSidePanelView ? true : props.fullWidthTriggerButton, hasApplyButton: useSidePanelView ? false : props.hasApplyButton, getNamedItems: useSidePanelView ? (fn) => {
32
32
  namedItemsFnRef.current = fn;
33
- setNamedFnReady(true);
33
+ setNamedFnReady(val => !val);
34
34
  } : undefined }));
35
35
  if (!useSidePanelView) {
36
36
  return component;