@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
@@ -10,21 +10,53 @@ const useDriveClassName_1 = require("../utils/theme/useDriveClassName");
10
10
  const classNames_1 = require("../commonHelpers/classNames/classNames");
11
11
  const dateInputInnerControlBlock_1 = require("./dateInputInnerControlBlock");
12
12
  const userFormatContext_1 = require("../utils/userFormat/userFormatContext");
13
+ const dateInputInnerReducer_1 = require("./dateInputInnerReducer");
14
+ const useTodayButton_1 = require("../utils/dateInputUtils/useTodayButton");
13
15
  const DateInputInner = ({ id, value, dateFormatter, dateDeformatter, dateFormat, onChange, dateRangeMode, selectTime, disableFutureDates, disablePastDates, disableDatesAfter, disableDatesBefore, startDayOfWeek, yearRange, title, isMobileView, requireSelection = false }) => {
16
+ var _a;
14
17
  const { translate } = (0, useLanguage_1.useLanguage)();
15
18
  const { toLocalDateTime, toReverseOffsetDateTime } = (0, react_1.useContext)(userFormatContext_1.userFormatContext);
19
+ const { isTodayDisabled, todayFrom, todayTo } = (0, useTodayButton_1.useTodayButton)(dateRangeMode, disableFutureDates, disablePastDates, disableDatesBefore, disableDatesAfter);
16
20
  const driveClassName = (0, useDriveClassName_1.useDriveClassName)("zen-date-input-inner");
17
- const startDateId = `${id}-start`;
18
- const [startDateText, setStartDateText] = (0, react_1.useState)(value.from ? dateFormatter(value.from) : "");
19
- const previousActiveElement = (0, react_1.useRef)(null);
21
+ const [state, dispatchState] = (0, react_1.useReducer)(dateInputInnerReducer_1.dateInputInnerReducer, (0, dateInputInnerReducer_1.getInitialDateInputInnerState)(id, value.from ? dateFormatter(value.from) : "", value.to ? dateFormatter(value.to) : "", dateRangeMode));
22
+ const currentDateValuesRef = (0, react_1.useRef)({ from: value.from, to: value.to });
23
+ const currentSelectedFieldRef = (0, react_1.useRef)(undefined);
24
+ const startInputRef = (0, react_1.useRef)(null);
25
+ const endInputRef = (0, react_1.useRef)(null);
20
26
  (0, react_1.useEffect)(() => {
21
- setStartDateText(value.from ? dateFormatter(value.from) : "");
27
+ dispatchState({ type: dateInputInnerReducer_1.DateInputInnerStateActionType.ChangeStartDateText, payload: value.from ? dateFormatter(value.from) : "" });
22
28
  }, [value.from, dateFormatter]);
23
- const endDateId = `${id}-end`;
24
- const [endDateText, setEndDateText] = (0, react_1.useState)(value.to ? dateFormatter(value.to) : "");
25
29
  (0, react_1.useEffect)(() => {
26
- setEndDateText(value.to ? dateFormatter(value.to) : "");
30
+ dispatchState({ type: dateInputInnerReducer_1.DateInputInnerStateActionType.ChangeEndDateText, payload: value.to ? dateFormatter(value.to) : "" });
27
31
  }, [value.to, dateFormatter]);
32
+ (0, react_1.useEffect)(() => {
33
+ var _a, _b;
34
+ if (value.from !== currentDateValuesRef.current.from || value.to !== currentDateValuesRef.current.to) {
35
+ currentDateValuesRef.current = { from: value.from, to: value.to };
36
+ dispatchState({ type: dateInputInnerReducer_1.DateInputInnerStateActionType.ChangeActiveField, payload: "start" });
37
+ currentSelectedFieldRef.current = undefined;
38
+ (_a = startInputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
39
+ (_b = startInputRef.current) === null || _b === void 0 ? void 0 : _b.select();
40
+ }
41
+ }, [value.from, value.to, currentDateValuesRef]);
42
+ (0, react_1.useEffect)(() => {
43
+ dispatchState({ type: dateInputInnerReducer_1.DateInputInnerStateActionType.ChangeDateRangeMode, payload: dateRangeMode || false });
44
+ }, [dateRangeMode]);
45
+ (0, react_1.useEffect)(() => {
46
+ if (startInputRef.current) {
47
+ startInputRef.current.focus();
48
+ startInputRef.current.select();
49
+ }
50
+ }, [startInputRef]);
51
+ const getAssistiveText = (0, react_1.useCallback)((txtKey, isStart) => {
52
+ if (txtKey === dateInputInnerReducer_1.AssistiveText.DateAdjusted) {
53
+ return translate(isStart ? "Start date has been adjusted." : "End date has been adjusted.");
54
+ }
55
+ if (txtKey === dateInputInnerReducer_1.AssistiveText.TimeAdjusted) {
56
+ return translate(isStart ? "Start time has been adjusted." : "End time has been adjusted.");
57
+ }
58
+ return undefined;
59
+ }, [translate]);
28
60
  const calendarValue = (0, react_1.useMemo)(() => ({ from: value.from ? toLocalDateTime(value.from).toISOString() : undefined, to: value.to ? toLocalDateTime(value.to).toISOString() : undefined }), [toLocalDateTime, value.from, value.to]);
29
61
  const disableDatesBeforeValue = (0, react_1.useMemo)(() => disableDatesBefore ? toLocalDateTime(disableDatesBefore).toISOString() : undefined, [toLocalDateTime, disableDatesBefore]);
30
62
  const disableDatesAfterValue = (0, react_1.useMemo)(() => disableDatesAfter ? toLocalDateTime(disableDatesAfter).toISOString() : undefined, [toLocalDateTime, disableDatesAfter]);
@@ -42,154 +74,421 @@ const DateInputInner = ({ id, value, dateFormatter, dateDeformatter, dateFormat,
42
74
  setTimePickerValueToPrev(timePickerValueTo);
43
75
  }
44
76
  }, [timePickerValueTo]);
45
- const startDateChangeHandler = (0, react_1.useCallback)(e => {
77
+ const resetStartDateChanges = (0, react_1.useCallback)((resetKeydownBehavior = false) => {
78
+ dispatchState({ type: dateInputInnerReducer_1.DateInputInnerStateActionType.ChangeStartDateText, payload: value.from ? dateFormatter(value.from) : "" });
79
+ resetKeydownBehavior && dispatchState({ type: dateInputInnerReducer_1.DateInputInnerStateActionType.ChangeInputKeydownBehavior, payload: undefined });
80
+ }, [dateFormatter, value.from]);
81
+ const adjustTime = (0, react_1.useCallback)((dDate, dateLike) => {
82
+ if (!dateLike) {
83
+ return dDate;
84
+ }
85
+ // const dateLike = toLocalDateTime(prevVal);
86
+ dDate.setHours(dateLike.getHours());
87
+ dDate.setMinutes(dateLike.getMinutes());
88
+ dDate.setSeconds(dateLike.getSeconds());
89
+ return dDate;
90
+ }, []);
91
+ const startDateChangeHandler = (0, react_1.useCallback)((e, isBlur = false) => {
46
92
  const newValue = e.target.value;
47
- const deformattedDate = dateDeformatter(newValue);
93
+ currentSelectedFieldRef.current = undefined;
94
+ let deformattedDate = dateDeformatter(newValue);
48
95
  if (!(0, dateUtils_1.isValidDate)(deformattedDate)) {
49
- setStartDateText(value.from ? dateFormatter(value.from) : "");
96
+ resetStartDateChanges(true);
50
97
  return;
51
98
  }
52
- if (value.from) {
53
- const dateLike = toLocalDateTime(value.from);
54
- deformattedDate.setHours(dateLike.getHours());
55
- deformattedDate.setMinutes(dateLike.getMinutes());
56
- deformattedDate.setSeconds(dateLike.getSeconds());
57
- }
99
+ deformattedDate = adjustTime(deformattedDate, value.from ? toLocalDateTime(value.from) : undefined);
58
100
  if ((0, dateUtils_1.isValidationDateError)(deformattedDate, toReverseOffsetDateTime, disableFutureDates, disablePastDates, disableDatesBefore, disableDatesAfter)) {
59
101
  // if date is invalid, do not update the state
60
- setStartDateText(value.from ? dateFormatter(value.from) : "");
102
+ resetStartDateChanges(true);
103
+ return;
104
+ }
105
+ const newValidDates = (0, dateUtils_1.getValidDatesForStart)(toReverseOffsetDateTime, deformattedDate, value.to ? toLocalDateTime(value.to) : undefined, disableFutureDates, disablePastDates, disableDatesBefore, disableDatesAfter);
106
+ const newStateValue = {
107
+ start: dateFormatter(toReverseOffsetDateTime(newValidDates.start)),
108
+ end: dateRangeMode ? (newValidDates.end ? dateFormatter(toReverseOffsetDateTime(newValidDates.end)) : "") : value.to || "",
109
+ startAssistiveText: isBlur && state.currentActiveField === "start" ? dateInputInnerReducer_1.AssistiveText.None : undefined,
110
+ endAssistiveText: isBlur && state.currentActiveField === "start"
111
+ ? (value.to && newValidDates.end && (newValidDates.end.getTime() !== new Date(toLocalDateTime(value.to)).getTime()) ? dateInputInnerReducer_1.AssistiveText.DateAdjusted : dateInputInnerReducer_1.AssistiveText.None)
112
+ : undefined
113
+ };
114
+ const startDateToPass = toReverseOffsetDateTime(newValidDates.start).toISOString();
115
+ const endDateToPass = dateRangeMode ? (newValidDates.end ? toReverseOffsetDateTime(newValidDates.end).toISOString() : undefined) : value.to;
116
+ currentDateValuesRef.current = { from: startDateToPass, to: endDateToPass };
117
+ dispatchState({ type: dateInputInnerReducer_1.DateInputInnerStateActionType.ChangePeriod, payload: newStateValue });
118
+ const isDateChanged = value.from !== startDateToPass || value.to !== endDateToPass;
119
+ isDateChanged && onChange({ from: startDateToPass, to: endDateToPass });
120
+ }, [dateDeformatter, adjustTime, value.from, value.to, toReverseOffsetDateTime, disableFutureDates, disablePastDates, disableDatesBefore, disableDatesAfter,
121
+ toLocalDateTime, dateFormatter, dateRangeMode, state.currentActiveField, onChange, resetStartDateChanges]);
122
+ const startDateChangeOnArrow = (0, react_1.useCallback)((oldValue, delta) => {
123
+ let deformattedDate = dateDeformatter(oldValue);
124
+ deformattedDate.setDate(deformattedDate.getDate() + delta);
125
+ if (!(0, dateUtils_1.isValidDate)(deformattedDate)) {
126
+ resetStartDateChanges();
61
127
  return;
62
128
  }
63
- const endDateToPass = (0, dateUtils_1.getValidDate)(toReverseOffsetDateTime, false, value.to ? toLocalDateTime(value.to) : undefined, deformattedDate, undefined, disableFutureDates, disablePastDates, disableDatesBefore, disableDatesAfter);
64
- if (value.to && endDateToPass && (endDateToPass.getTime() !== new Date(toLocalDateTime(value.to)).getTime())) {
65
- setEndDateText(dateFormatter(toReverseOffsetDateTime(endDateToPass)));
129
+ deformattedDate = adjustTime(deformattedDate, value.from ? toLocalDateTime(value.from) : undefined);
130
+ if ((0, dateUtils_1.isValidationDateError)(deformattedDate, toReverseOffsetDateTime, disableFutureDates, disablePastDates, disableDatesBefore, disableDatesAfter)) {
131
+ // if date is invalid, do not update the state
132
+ resetStartDateChanges();
133
+ return;
66
134
  }
67
- onChange({ from: toReverseOffsetDateTime(deformattedDate).toISOString(), to: endDateToPass ? toReverseOffsetDateTime(endDateToPass).toISOString() : undefined });
68
- }, [dateDeformatter, value.from, value.to, toReverseOffsetDateTime, disableFutureDates, disablePastDates, disableDatesBefore, disableDatesAfter,
69
- toLocalDateTime, onChange, dateFormatter]);
135
+ const newValidDates = (0, dateUtils_1.getValidDatesForStart)(toReverseOffsetDateTime, deformattedDate, value.to ? toLocalDateTime(value.to) : undefined, disableFutureDates, disablePastDates, disableDatesBefore, disableDatesAfter);
136
+ const newStateValue = {
137
+ emittedBy: "start",
138
+ start: dateFormatter(toReverseOffsetDateTime(newValidDates.start)),
139
+ end: dateRangeMode ? (newValidDates.end ? dateFormatter(toReverseOffsetDateTime(newValidDates.end)) : "") : value.to || "",
140
+ startAssistiveText: dateInputInnerReducer_1.AssistiveText.None,
141
+ endAssistiveText: (value.to && newValidDates.end && (newValidDates.end.getTime() !== new Date(toLocalDateTime(value.to)).getTime()) ? dateInputInnerReducer_1.AssistiveText.DateAdjusted : dateInputInnerReducer_1.AssistiveText.None),
142
+ inputKeyDownBehavior: "start"
143
+ };
144
+ const startDateToPass = toReverseOffsetDateTime(newValidDates.start).toISOString();
145
+ const endDateToPass = dateRangeMode ? (newValidDates.end ? toReverseOffsetDateTime(newValidDates.end).toISOString() : undefined) : value.to;
146
+ currentDateValuesRef.current = { from: startDateToPass, to: endDateToPass };
147
+ dispatchState({ type: dateInputInnerReducer_1.DateInputInnerStateActionType.ChangePeriod, payload: newStateValue });
148
+ onChange({ from: startDateToPass, to: endDateToPass });
149
+ currentSelectedFieldRef.current = startInputRef.current || undefined;
150
+ }, [dateDeformatter, adjustTime, value.from, value.to, toReverseOffsetDateTime, disableFutureDates, disablePastDates, disableDatesBefore, disableDatesAfter, toLocalDateTime, dateFormatter,
151
+ dateRangeMode, onChange, resetStartDateChanges]);
70
152
  const startTimeChangeHandler = (0, react_1.useCallback)((time) => {
153
+ currentSelectedFieldRef.current = undefined;
71
154
  const startDateToCopyTime = time;
72
155
  let newValueFrom = value.from ? toLocalDateTime(value.from) : startDateToCopyTime;
73
- if (value.from) {
74
- newValueFrom.setHours(startDateToCopyTime.getHours());
75
- newValueFrom.setMinutes(startDateToCopyTime.getMinutes());
76
- newValueFrom.setSeconds(startDateToCopyTime.getSeconds());
77
- }
156
+ newValueFrom = adjustTime(newValueFrom, startDateToCopyTime);
78
157
  if (!(0, dateUtils_1.isValidDate)(newValueFrom)) {
79
- setStartDateText(value.from ? dateFormatter(value.from) : "");
158
+ resetStartDateChanges();
80
159
  return;
81
160
  }
82
161
  if ((0, dateUtils_1.isValidationDateError)(newValueFrom, toReverseOffsetDateTime, disableFutureDates, disablePastDates, disableDatesBefore, disableDatesAfter)) {
83
162
  const newValidDate = (0, dateUtils_1.getValidTime)(newValueFrom, value.from, disableFutureDates, disablePastDates, disableDatesBefore, disableDatesAfter);
84
163
  if (!newValidDate) {
85
- setStartDateText(value.from ? dateFormatter(value.from) : "");
164
+ resetStartDateChanges();
86
165
  return;
87
166
  }
88
167
  newValueFrom = newValidDate;
89
168
  }
90
- if (dateRangeMode && value.to && (toReverseOffsetDateTime(newValueFrom) > new Date(value.to))) {
91
- setStartDateText(value.from ? dateFormatter(value.from) : "");
92
- return;
93
- }
94
- onChange({ from: toReverseOffsetDateTime(newValueFrom).toISOString(), to: value.to });
95
- }, [value.from, value.to, toLocalDateTime, toReverseOffsetDateTime, disableFutureDates, disablePastDates, disableDatesBefore, disableDatesAfter, dateRangeMode, onChange, dateFormatter]);
96
- const endDateChangeHandler = (0, react_1.useCallback)(e => {
169
+ const startEndOrderValid = !dateRangeMode || !value.to ? true : toReverseOffsetDateTime(newValueFrom) <= new Date(value.to);
170
+ const newStateValue = {
171
+ start: dateFormatter(toReverseOffsetDateTime(newValueFrom)),
172
+ end: startEndOrderValid ? (dateRangeMode ? (value.to ? dateFormatter(value.to) : "") : value.to || "") : dateFormatter(toReverseOffsetDateTime(newValueFrom)),
173
+ startAssistiveText: dateInputInnerReducer_1.AssistiveText.None,
174
+ endAssistiveText: startEndOrderValid ? dateInputInnerReducer_1.AssistiveText.None : dateInputInnerReducer_1.AssistiveText.TimeAdjusted,
175
+ nextActiveField: startEndOrderValid ? undefined : "end"
176
+ };
177
+ const startDateToPass = toReverseOffsetDateTime(newValueFrom).toISOString();
178
+ const endDateToPass = startEndOrderValid ? value.to : toReverseOffsetDateTime(newValueFrom).toISOString();
179
+ currentDateValuesRef.current = { from: startDateToPass, to: endDateToPass };
180
+ dispatchState({ type: dateInputInnerReducer_1.DateInputInnerStateActionType.ChangePeriod, payload: newStateValue });
181
+ dispatchState({ type: dateInputInnerReducer_1.DateInputInnerStateActionType.ChangeStartAssistiveText, payload: dateInputInnerReducer_1.AssistiveText.None });
182
+ onChange({ from: startDateToPass, to: endDateToPass });
183
+ }, [value.from, value.to, toLocalDateTime, adjustTime, toReverseOffsetDateTime, disableFutureDates, disablePastDates, disableDatesBefore, disableDatesAfter, dateRangeMode,
184
+ dateFormatter, onChange, resetStartDateChanges]);
185
+ const resetEndDateChanges = (0, react_1.useCallback)((resetKeydownBehavior = false) => {
186
+ dispatchState({ type: dateInputInnerReducer_1.DateInputInnerStateActionType.ChangeEndDateText, payload: value.to ? dateFormatter(value.to) : "" });
187
+ resetKeydownBehavior && dispatchState({ type: dateInputInnerReducer_1.DateInputInnerStateActionType.ChangeInputKeydownBehavior, payload: undefined });
188
+ }, [dateFormatter, value.to]);
189
+ const endDateChangeHandler = (0, react_1.useCallback)((e, isBlur = false) => {
97
190
  const newValue = e.target.value;
98
- const deformattedDate = dateDeformatter(newValue);
191
+ currentSelectedFieldRef.current = undefined;
192
+ let deformattedDate = dateDeformatter(newValue);
99
193
  if (!(0, dateUtils_1.isValidDate)(deformattedDate)) {
100
- setEndDateText(value.to ? dateFormatter(value.to) : "");
194
+ resetEndDateChanges(true);
101
195
  return;
102
196
  }
103
- if (value.to) {
104
- const dateLike = toLocalDateTime(value.to);
105
- deformattedDate.setHours(dateLike.getHours());
106
- deformattedDate.setMinutes(dateLike.getMinutes());
107
- deformattedDate.setSeconds(dateLike.getSeconds());
108
- }
197
+ deformattedDate = adjustTime(deformattedDate, value.to ? toLocalDateTime(value.to) : undefined);
109
198
  if ((0, dateUtils_1.isValidationDateError)(deformattedDate, toReverseOffsetDateTime, disableFutureDates, disablePastDates, disableDatesBefore, disableDatesAfter)) {
110
199
  // if date is invalid, do not update the state
111
- setEndDateText(value.to ? dateFormatter(value.to) : "");
200
+ resetEndDateChanges(true);
201
+ return;
202
+ }
203
+ const newValidDates = (0, dateUtils_1.getValidDatesForEnd)(toReverseOffsetDateTime, deformattedDate, value.from ? toLocalDateTime(value.from) : undefined, disableFutureDates, disablePastDates, disableDatesBefore, disableDatesAfter);
204
+ const newStateValue = {
205
+ start: newValidDates.start ? dateFormatter(toReverseOffsetDateTime(newValidDates.start)) : "",
206
+ end: dateFormatter(toReverseOffsetDateTime(newValidDates.end)),
207
+ startAssistiveText: isBlur && state.currentActiveField === "end"
208
+ ? (value.from && newValidDates.start && (newValidDates.start.getTime() !== new Date(toLocalDateTime(value.from)).getTime()) ? dateInputInnerReducer_1.AssistiveText.DateAdjusted : dateInputInnerReducer_1.AssistiveText.None)
209
+ : undefined,
210
+ endAssistiveText: isBlur && state.currentActiveField === "end" ? dateInputInnerReducer_1.AssistiveText.None : undefined
211
+ };
212
+ const startDateToPass = newValidDates.start ? toReverseOffsetDateTime(newValidDates.start).toISOString() : undefined;
213
+ const endDateToPass = toReverseOffsetDateTime(newValidDates.end).toISOString();
214
+ currentDateValuesRef.current = { from: startDateToPass, to: endDateToPass };
215
+ dispatchState({ type: dateInputInnerReducer_1.DateInputInnerStateActionType.ChangePeriod, payload: newStateValue });
216
+ const isDateChanged = value.from !== startDateToPass || value.to !== endDateToPass;
217
+ isDateChanged && onChange({ from: startDateToPass, to: endDateToPass });
218
+ }, [dateDeformatter, adjustTime, value.to, value.from, toReverseOffsetDateTime, disableFutureDates, disablePastDates, disableDatesBefore, disableDatesAfter, toLocalDateTime, dateFormatter,
219
+ state.currentActiveField, onChange, resetEndDateChanges]);
220
+ const endDateChangeOnArrow = (0, react_1.useCallback)((oldValue, delta) => {
221
+ let deformattedDate = dateDeformatter(oldValue);
222
+ deformattedDate.setDate(deformattedDate.getDate() + delta);
223
+ if (!(0, dateUtils_1.isValidDate)(deformattedDate)) {
224
+ resetEndDateChanges();
112
225
  return;
113
226
  }
114
- const startDateToPass = (0, dateUtils_1.getValidDate)(toReverseOffsetDateTime, true, value.from ? toLocalDateTime(value.from) : undefined, undefined, deformattedDate, disableFutureDates, disablePastDates, disableDatesBefore, disableDatesAfter);
115
- if (value.from && startDateToPass && (startDateToPass.getTime() !== new Date(toLocalDateTime(value.from)).getTime())) {
116
- setEndDateText(dateFormatter(toReverseOffsetDateTime(startDateToPass)));
227
+ deformattedDate = adjustTime(deformattedDate, value.to ? toLocalDateTime(value.to) : undefined);
228
+ if ((0, dateUtils_1.isValidationDateError)(deformattedDate, toReverseOffsetDateTime, disableFutureDates, disablePastDates, disableDatesBefore, disableDatesAfter)) {
229
+ // if date is invalid, do not update the state
230
+ resetEndDateChanges();
231
+ return;
117
232
  }
118
- onChange({ from: startDateToPass ? toReverseOffsetDateTime(startDateToPass).toISOString() : undefined, to: toReverseOffsetDateTime(deformattedDate).toISOString() });
119
- }, [dateDeformatter, disableFutureDates, toReverseOffsetDateTime, disablePastDates, disableDatesAfter, disableDatesBefore, value.to, value.from, toLocalDateTime, onChange, dateFormatter]);
233
+ const newValidDates = (0, dateUtils_1.getValidDatesForEnd)(toReverseOffsetDateTime, deformattedDate, value.from ? toLocalDateTime(value.from) : undefined, disableFutureDates, disablePastDates, disableDatesBefore, disableDatesAfter);
234
+ const newStateValue = {
235
+ emittedBy: "end",
236
+ start: newValidDates.start ? dateFormatter(toReverseOffsetDateTime(newValidDates.start)) : "",
237
+ end: dateFormatter(toReverseOffsetDateTime(newValidDates.end)),
238
+ startAssistiveText: value.from && newValidDates.start && (newValidDates.start.getTime() !== new Date(toLocalDateTime(value.from)).getTime())
239
+ ? dateInputInnerReducer_1.AssistiveText.DateAdjusted : dateInputInnerReducer_1.AssistiveText.None,
240
+ endAssistiveText: dateInputInnerReducer_1.AssistiveText.None,
241
+ inputKeyDownBehavior: "end"
242
+ };
243
+ const startDateToPass = newValidDates.start ? toReverseOffsetDateTime(newValidDates.start).toISOString() : undefined;
244
+ const endDateToPass = toReverseOffsetDateTime(newValidDates.end).toISOString();
245
+ currentDateValuesRef.current = { from: startDateToPass, to: endDateToPass };
246
+ dispatchState({ type: dateInputInnerReducer_1.DateInputInnerStateActionType.ChangePeriod, payload: newStateValue });
247
+ onChange({ from: startDateToPass, to: endDateToPass });
248
+ currentSelectedFieldRef.current = endInputRef.current || undefined;
249
+ }, [dateDeformatter, adjustTime, value.to, value.from, toReverseOffsetDateTime, disableFutureDates, disablePastDates, disableDatesBefore, disableDatesAfter,
250
+ toLocalDateTime, dateFormatter, onChange, resetEndDateChanges]);
120
251
  const endTimeChangeHandler = (0, react_1.useCallback)((time) => {
121
252
  const endDateToCopyTime = time;
253
+ currentSelectedFieldRef.current = undefined;
122
254
  let newValueTo = value.to ? toLocalDateTime(value.to) : endDateToCopyTime;
123
- if (value.to) {
124
- newValueTo.setHours(endDateToCopyTime.getHours());
125
- newValueTo.setMinutes(endDateToCopyTime.getMinutes());
126
- newValueTo.setSeconds(endDateToCopyTime.getSeconds());
127
- }
255
+ newValueTo = adjustTime(newValueTo, endDateToCopyTime);
128
256
  if (!(0, dateUtils_1.isValidDate)(newValueTo)) {
129
- setEndDateText(value.to ? dateFormatter(value.to) : "");
257
+ resetEndDateChanges();
130
258
  return;
131
259
  }
132
260
  if ((0, dateUtils_1.isValidationDateError)(newValueTo, toReverseOffsetDateTime, disableFutureDates, disablePastDates, disableDatesBefore, disableDatesAfter)) {
133
261
  const newValidDate = (0, dateUtils_1.getValidTime)(newValueTo, value.to, disableFutureDates, disablePastDates, disableDatesBefore, disableDatesAfter);
134
262
  if (!newValidDate) {
135
- setEndDateText(value.to ? dateFormatter(value.to) : "");
263
+ resetEndDateChanges();
136
264
  return;
137
265
  }
138
266
  newValueTo = newValidDate;
139
267
  return;
140
268
  }
141
- if (dateRangeMode && value.from && (toReverseOffsetDateTime(newValueTo) < new Date(value.from)
142
- || (0, dateUtils_1.isDifferentPeriod)(new Date(value.from), newValueTo, disableFutureDates, disablePastDates, disableDatesBefore, disableDatesAfter))) {
143
- setEndDateText(value.to ? dateFormatter(value.to) : "");
144
- return;
145
- }
146
- onChange({ from: value.from, to: toReverseOffsetDateTime(newValueTo).toISOString() });
147
- }, [value.to, value.from, toLocalDateTime, toReverseOffsetDateTime, disableFutureDates, disablePastDates, disableDatesBefore, disableDatesAfter, dateRangeMode, onChange, dateFormatter]);
148
- const calendarChangeHandler = (0, react_1.useCallback)((range) => {
149
- const currentStartDate = range.from && new Date(range.from);
150
- const startDateToCopyTime = value.from ? toLocalDateTime(value.from) : timePickerValueFromPrev;
151
- if (currentStartDate && startDateToCopyTime) {
152
- currentStartDate.setHours(startDateToCopyTime.getHours());
153
- currentStartDate.setMinutes(startDateToCopyTime.getMinutes());
154
- currentStartDate.setSeconds(startDateToCopyTime.getSeconds());
269
+ const startEndOrderValid = !dateRangeMode || !value.from ? true : new Date(value.from) <= toReverseOffsetDateTime(newValueTo);
270
+ const newStateValue = {
271
+ start: startEndOrderValid ? (value.from ? dateFormatter(toReverseOffsetDateTime(value.from)) : "") : dateFormatter(toReverseOffsetDateTime(newValueTo)),
272
+ end: dateFormatter(toReverseOffsetDateTime(newValueTo)),
273
+ startAssistiveText: startEndOrderValid ? dateInputInnerReducer_1.AssistiveText.None : dateInputInnerReducer_1.AssistiveText.TimeAdjusted,
274
+ endAssistiveText: dateInputInnerReducer_1.AssistiveText.None,
275
+ nextActiveField: startEndOrderValid ? undefined : "start"
276
+ };
277
+ const startDateToPass = startEndOrderValid ? value.from : toReverseOffsetDateTime(newValueTo).toISOString();
278
+ const endDateToPass = toReverseOffsetDateTime(newValueTo).toISOString();
279
+ currentDateValuesRef.current = { from: startDateToPass, to: endDateToPass };
280
+ dispatchState({ type: dateInputInnerReducer_1.DateInputInnerStateActionType.ChangePeriod, payload: newStateValue });
281
+ dispatchState({ type: dateInputInnerReducer_1.DateInputInnerStateActionType.ChangeEndAssistiveText, payload: dateInputInnerReducer_1.AssistiveText.None });
282
+ onChange({ from: startDateToPass, to: endDateToPass });
283
+ }, [value.to, value.from, toLocalDateTime, adjustTime, toReverseOffsetDateTime, disableFutureDates, disablePastDates, disableDatesBefore, disableDatesAfter, dateRangeMode,
284
+ dateFormatter, onChange, resetEndDateChanges]);
285
+ const getCurrentActiveField = (0, react_1.useCallback)(() => state.currentActiveField, [state.currentActiveField]);
286
+ // eslint-disable-next-line complexity
287
+ const calendarChangeHandler = (0, react_1.useCallback)((range, currentActiveField) => {
288
+ currentSelectedFieldRef.current = dateRangeMode ? undefined : startInputRef.current || undefined;
289
+ let currentStartDate = range.from && new Date(range.from);
290
+ const startDateToCopyTime = value.from ? toLocalDateTime(value.from) : (timePickerValueFromPrev || new Date((0, dateUtils_1.toDayStart)(toLocalDateTime(new Date()).toISOString())));
291
+ let currentEndDate = range.to && new Date(range.to);
292
+ const endDateToCopyTime = value.to ? toLocalDateTime(value.to) : (timePickerValueToPrev || new Date((0, dateUtils_1.toDayStart)(toLocalDateTime(new Date()).toISOString())));
293
+ let rangeFrom = range.from;
294
+ let rangeTo = range.to;
295
+ if (currentStartDate) {
296
+ currentStartDate = adjustTime(currentStartDate, startDateToCopyTime);
155
297
  const isValidationError = (0, dateUtils_1.isValidationDateError)(currentStartDate, toReverseOffsetDateTime, disableFutureDates, disablePastDates, disableDatesBefore, disableDatesAfter);
156
- range.from = toReverseOffsetDateTime(isValidationError ? new Date(range.from) : currentStartDate).toISOString();
157
- }
158
- const currentEndDate = range.to && new Date(range.to);
159
- const endDateToCopyTime = value.to ? toLocalDateTime(value.to) : timePickerValueToPrev;
160
- if (currentEndDate && endDateToCopyTime) {
161
- currentEndDate.setHours(endDateToCopyTime.getHours());
162
- currentEndDate.setMinutes(endDateToCopyTime.getMinutes());
163
- currentEndDate.setSeconds(endDateToCopyTime.getSeconds());
298
+ rangeFrom = toReverseOffsetDateTime(isValidationError ? new Date(range.from) : currentStartDate).toISOString();
299
+ }
300
+ if (currentEndDate) {
301
+ currentEndDate = adjustTime(currentEndDate, endDateToCopyTime);
164
302
  const isValidationError = (0, dateUtils_1.isValidationDateError)(currentEndDate, toReverseOffsetDateTime, disableFutureDates, disablePastDates, disableDatesBefore, disableDatesAfter);
165
- range.to = toReverseOffsetDateTime(isValidationError ? new Date(range.to) : currentEndDate).toISOString();
303
+ rangeTo = toReverseOffsetDateTime(isValidationError ? new Date(range.to) : currentEndDate).toISOString();
304
+ }
305
+ if (rangeFrom && rangeTo && new Date(rangeFrom) > new Date(rangeTo)) {
306
+ range.from = !currentActiveField || currentActiveField === "start" ? rangeFrom : rangeTo;
307
+ range.to = currentActiveField && currentActiveField === "end" ? rangeTo : rangeFrom;
166
308
  }
167
- setStartDateText(range.from ? dateFormatter(range.from) : "");
168
- setEndDateText(range.to ? dateFormatter(range.to) : "");
309
+ else {
310
+ range.from = rangeFrom || (dateRangeMode ? rangeTo : undefined);
311
+ range.to = rangeTo || (dateRangeMode ? rangeFrom : undefined);
312
+ }
313
+ const newStateValue = {
314
+ start: range.from ? dateFormatter(range.from) : "",
315
+ end: range.to ? dateFormatter(range.to) : "",
316
+ hasAssistiveText: currentActiveField === "start" ? range.to !== value.to : range.from !== value.from
317
+ };
318
+ currentDateValuesRef.current = Object.assign({}, range);
319
+ dispatchState({ type: dateInputInnerReducer_1.DateInputInnerStateActionType.ChangeCalendarValue, payload: newStateValue });
169
320
  onChange(range);
170
- }, [value.from, value.to, toLocalDateTime, timePickerValueFromPrev, timePickerValueToPrev, dateFormatter, onChange, toReverseOffsetDateTime,
321
+ }, [dateRangeMode, value.from, value.to, toLocalDateTime, timePickerValueFromPrev, timePickerValueToPrev, dateFormatter, onChange, adjustTime, toReverseOffsetDateTime,
171
322
  disableFutureDates, disablePastDates, disableDatesBefore, disableDatesAfter]);
172
323
  const handleSetStartDateText = (0, react_1.useCallback)((e) => {
173
- setStartDateText(e.target.value);
324
+ dispatchState({ type: dateInputInnerReducer_1.DateInputInnerStateActionType.ChangeStartDateText, payload: e.target.value });
174
325
  }, []);
175
326
  const handleSetEndDateText = (0, react_1.useCallback)((e) => {
176
- setEndDateText(e.target.value);
177
- }, []);
178
- const handleOnFocus = (0, react_1.useCallback)(() => {
179
- previousActiveElement.current = document.activeElement;
327
+ dispatchState({ type: dateInputInnerReducer_1.DateInputInnerStateActionType.ChangeEndDateText, payload: e.target.value });
180
328
  }, []);
181
- const handleOnBlur = (0, react_1.useCallback)(() => {
182
- if (previousActiveElement.current) {
183
- previousActiveElement.current = null;
329
+ // eslint-disable-next-line complexity
330
+ const handleOnClick = (0, react_1.useCallback)((e) => {
331
+ if (e.target instanceof HTMLElement && e.target.tagName === "INPUT" && e.target.getAttribute("id") === state.startDateId) {
332
+ state.currentActiveField === "end" && dispatchState({ type: dateInputInnerReducer_1.DateInputInnerStateActionType.ChangeActiveField, payload: "start" });
333
+ state.currentActiveField === "start" && dispatchState({ type: dateInputInnerReducer_1.DateInputInnerStateActionType.ChangeInputKeydownBehavior, payload: undefined });
184
334
  }
185
- }, []);
186
- return (0, jsx_runtime_1.jsxs)("div", { className: (0, classNames_1.classNames)(["zen-date-input-inner", driveClassName || "", isMobileView ? "zen-date-input-inner--mobile-view" : ""]), children: [(0, jsx_runtime_1.jsxs)("div", { className: "zen-date-input-inner__controls-block", onFocus: handleOnFocus, onBlur: handleOnBlur, children: [(0, jsx_runtime_1.jsx)(dateInputInnerControlBlock_1.DateInputInnerControlBlock, { className: "zen-date-input-inner__control-start", title: title || title === undefined ? title || translate(dateRangeMode ? "Start date" : "Pick a date") : undefined, id: startDateId, dateText: startDateText, placeholder: dateFormat, handleSetDateText: handleSetStartDateText, onBlurDateChangeHandler: startDateChangeHandler, requireSelection: requireSelection, selectTime: selectTime, timePickerValue: timePickerValueFrom || timePickerValueFromPrev, isMobileView: isMobileView, timeChangeHandler: startTimeChangeHandler }), dateRangeMode
187
- ? (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { className: "zen-date-input-inner__separator" }), (0, jsx_runtime_1.jsx)(dateInputInnerControlBlock_1.DateInputInnerControlBlock, { className: "zen-date-input-inner__control-end", title: translate("End date"), id: endDateId, dateText: endDateText, placeholder: dateFormat, handleSetDateText: handleSetEndDateText, onBlurDateChangeHandler: endDateChangeHandler, requireSelection: requireSelection, selectTime: selectTime, timePickerValue: timePickerValueTo || timePickerValueToPrev, isMobileView: isMobileView, timeChangeHandler: endTimeChangeHandler })] })
188
- : null] }), (0, jsx_runtime_1.jsx)("div", { className: "zen-date-input-inner__calendar", children: (0, jsx_runtime_1.jsx)(calendar_1.Calendar, { id: id, value: calendarValue, onChange: calendarChangeHandler, dateRangeMode: dateRangeMode, disableFutureDates: disableFutureDates, disablePastDates: disablePastDates, disableDatesAfter: disableDatesAfterValue, disableDatesBefore: disableDatesBeforeValue, startDayOfWeek: startDayOfWeek, yearRange: yearRange, isMobileView: isMobileView, getPreviousActiveElement: () => previousActiveElement.current }) })] });
335
+ if (e.target instanceof HTMLElement && e.target.tagName === "INPUT" && e.target.getAttribute("id") === state.endDateId) {
336
+ state.currentActiveField === "start" && dispatchState({ type: dateInputInnerReducer_1.DateInputInnerStateActionType.ChangeActiveField, payload: "end" });
337
+ state.currentActiveField === "end" && dispatchState({ type: dateInputInnerReducer_1.DateInputInnerStateActionType.ChangeInputKeydownBehavior, payload: undefined });
338
+ }
339
+ let targetEl = e.target === e.currentTarget ? undefined : e.target;
340
+ while (targetEl) {
341
+ if (targetEl instanceof HTMLElement && targetEl.tagName === "BUTTON" && targetEl.getAttribute("data-time") === state.startDateId) {
342
+ targetEl = undefined;
343
+ }
344
+ if (targetEl instanceof HTMLElement && targetEl.tagName === "BUTTON" && targetEl.getAttribute("data-time") === state.endDateId) {
345
+ targetEl = undefined;
346
+ }
347
+ targetEl = !targetEl || targetEl.parentNode === e.currentTarget ? undefined : targetEl.parentNode;
348
+ }
349
+ }, [state.currentActiveField, state.endDateId, state.startDateId]);
350
+ // eslint-disable-next-line complexity
351
+ const handleOnKeyDown = (0, react_1.useCallback)((e) => {
352
+ if (e.key === "Enter") {
353
+ if (e.target instanceof HTMLElement && e.target.tagName === "INPUT" && e.target.getAttribute("id") === state.startDateId) {
354
+ state.currentActiveField === "start" && startDateChangeHandler(e, true);
355
+ dispatchState({ type: dateInputInnerReducer_1.DateInputInnerStateActionType.ToggleActiveField });
356
+ }
357
+ if (e.target instanceof HTMLElement && e.target.tagName === "INPUT" && e.target.getAttribute("id") === state.endDateId) {
358
+ state.currentActiveField === "end" && endDateChangeHandler(e, true);
359
+ dispatchState({ type: dateInputInnerReducer_1.DateInputInnerStateActionType.ToggleActiveField });
360
+ }
361
+ }
362
+ if (e.key === "Tab") {
363
+ if (e.target instanceof HTMLElement && e.target.tagName === "INPUT" && e.target.getAttribute("id") === state.startDateId) {
364
+ currentSelectedFieldRef.current = undefined;
365
+ state.currentActiveField === "start" && dispatchState({ type: dateInputInnerReducer_1.DateInputInnerStateActionType.ChangeStartAssistiveText, payload: dateInputInnerReducer_1.AssistiveText.None });
366
+ state.currentActiveField === "start" && dispatchState({ type: dateInputInnerReducer_1.DateInputInnerStateActionType.ChangeInputKeydownBehavior, payload: undefined });
367
+ }
368
+ if (e.target instanceof HTMLElement && e.target.tagName === "INPUT" && e.target.getAttribute("id") === state.endDateId) {
369
+ currentSelectedFieldRef.current = undefined;
370
+ state.currentActiveField === "end" && dispatchState({ type: dateInputInnerReducer_1.DateInputInnerStateActionType.ChangeEndAssistiveText, payload: dateInputInnerReducer_1.AssistiveText.None });
371
+ state.currentActiveField === "end" && dispatchState({ type: dateInputInnerReducer_1.DateInputInnerStateActionType.ChangeInputKeydownBehavior, payload: undefined });
372
+ }
373
+ }
374
+ if (e.key === "Backspace" && e.target instanceof HTMLElement && e.target.tagName === "INPUT") {
375
+ currentSelectedFieldRef.current = undefined;
376
+ }
377
+ if (e.key === "ArrowDown" && state.inputKeyDownBehavior) {
378
+ if (e.target instanceof HTMLElement && e.target.tagName === "INPUT" && e.target.getAttribute("id") === state.startDateId) {
379
+ const newValue = e.target.value;
380
+ startDateChangeOnArrow(newValue, 7);
381
+ }
382
+ if (e.target instanceof HTMLElement && e.target.tagName === "INPUT" && e.target.getAttribute("id") === state.endDateId) {
383
+ const newValue = e.target.value;
384
+ endDateChangeOnArrow(newValue, 7);
385
+ }
386
+ }
387
+ if (e.key === "ArrowUp" && state.inputKeyDownBehavior) {
388
+ if (e.target instanceof HTMLElement && e.target.tagName === "INPUT" && e.target.getAttribute("id") === state.startDateId) {
389
+ const newValue = e.target.value;
390
+ startDateChangeOnArrow(newValue, -7);
391
+ }
392
+ if (e.target instanceof HTMLElement && e.target.tagName === "INPUT" && e.target.getAttribute("id") === state.endDateId) {
393
+ const newValue = e.target.value;
394
+ endDateChangeOnArrow(newValue, -7);
395
+ }
396
+ }
397
+ if (e.key === "ArrowRight" && state.inputKeyDownBehavior) {
398
+ if (e.target instanceof HTMLElement && e.target.tagName === "INPUT" && e.target.getAttribute("id") === state.startDateId) {
399
+ const newValue = e.target.value;
400
+ startDateChangeOnArrow(newValue, 1);
401
+ }
402
+ if (e.target instanceof HTMLElement && e.target.tagName === "INPUT" && e.target.getAttribute("id") === state.endDateId) {
403
+ const newValue = e.target.value;
404
+ endDateChangeOnArrow(newValue, 1);
405
+ }
406
+ }
407
+ if (e.key === "ArrowLeft" && state.inputKeyDownBehavior) {
408
+ if (e.target instanceof HTMLElement && e.target.tagName === "INPUT" && e.target.getAttribute("id") === state.startDateId) {
409
+ const newValue = e.target.value;
410
+ startDateChangeOnArrow(newValue, -1);
411
+ }
412
+ if (e.target instanceof HTMLElement && e.target.tagName === "INPUT" && e.target.getAttribute("id") === state.endDateId) {
413
+ const newValue = e.target.value;
414
+ endDateChangeOnArrow(newValue, -1);
415
+ }
416
+ }
417
+ }, [state.startDateId, state.endDateId, state.currentActiveField, state.inputKeyDownBehavior, startDateChangeHandler, endDateChangeHandler, startDateChangeOnArrow, endDateChangeOnArrow]);
418
+ const rangeArgs = (0, react_1.useMemo)(() => ({
419
+ onClick: handleOnClick,
420
+ onKeyDown: handleOnKeyDown
421
+ }), [handleOnClick, handleOnKeyDown]);
422
+ (0, react_1.useEffect)(() => {
423
+ var _a, _b, _c, _d;
424
+ if (state.currentActiveField === "start") {
425
+ (_a = startInputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
426
+ state.inputKeyDownBehavior === "start" && ((_b = startInputRef.current) === null || _b === void 0 ? void 0 : _b.select());
427
+ }
428
+ if (state.currentActiveField === "end") {
429
+ (_c = endInputRef.current) === null || _c === void 0 ? void 0 : _c.focus();
430
+ state.inputKeyDownBehavior === "end" && ((_d = endInputRef.current) === null || _d === void 0 ? void 0 : _d.select());
431
+ }
432
+ }, [state.currentActiveField, state.inputKeyDownBehavior]);
433
+ (0, react_1.useEffect)(() => {
434
+ var _a, _b;
435
+ if (state.inputKeyDownBehavior === "start") {
436
+ (_a = startInputRef.current) === null || _a === void 0 ? void 0 : _a.select();
437
+ }
438
+ if (state.inputKeyDownBehavior === "end") {
439
+ (_b = endInputRef.current) === null || _b === void 0 ? void 0 : _b.select();
440
+ }
441
+ }, [state.inputKeyDownBehavior]);
442
+ const handleBlurStart = (0, react_1.useCallback)((e) => {
443
+ currentSelectedFieldRef.current = undefined;
444
+ startDateChangeHandler(e, true);
445
+ }, [startDateChangeHandler]);
446
+ const handleBlurEnd = (0, react_1.useCallback)((e) => {
447
+ currentSelectedFieldRef.current = undefined;
448
+ endDateChangeHandler(e, true);
449
+ }, [endDateChangeHandler]);
450
+ const handleTodayButtonClick = (0, react_1.useCallback)((e) => {
451
+ const currentActiveField = getCurrentActiveField();
452
+ let newValidDates;
453
+ if (currentActiveField === "start") {
454
+ const todayFromWithTime = adjustTime(toLocalDateTime(todayFrom), value.from ? toLocalDateTime(value.from) : undefined);
455
+ newValidDates = (0, dateUtils_1.getValidDatesForStart)(toReverseOffsetDateTime, todayFromWithTime, value.to ? toLocalDateTime(value.to) : undefined, disableFutureDates, disablePastDates, disableDatesBefore, disableDatesAfter);
456
+ }
457
+ else {
458
+ const todayToWithTime = adjustTime(toLocalDateTime(todayTo), value.to ? toLocalDateTime(value.to) : undefined);
459
+ newValidDates = (0, dateUtils_1.getValidDatesForEnd)(toReverseOffsetDateTime, todayToWithTime, value.from ? toLocalDateTime(value.from) : undefined, disableFutureDates, disablePastDates, disableDatesBefore, disableDatesAfter);
460
+ }
461
+ const startDateToPass = newValidDates.start ? toReverseOffsetDateTime(newValidDates.start).toISOString() : undefined;
462
+ const endDateToPass = newValidDates.end ? toReverseOffsetDateTime(newValidDates.end).toISOString() : undefined;
463
+ const newStateValue = {
464
+ start: newValidDates.start ? dateFormatter(toReverseOffsetDateTime(newValidDates.start)) : "",
465
+ end: newValidDates.end ? dateFormatter(toReverseOffsetDateTime(newValidDates.end)) : "",
466
+ startAssistiveText: currentActiveField === "end" && startDateToPass !== value.from ? dateInputInnerReducer_1.AssistiveText.DateAdjusted : dateInputInnerReducer_1.AssistiveText.None,
467
+ endAssistiveText: currentActiveField === "start" && endDateToPass !== value.to ? dateInputInnerReducer_1.AssistiveText.DateAdjusted : dateInputInnerReducer_1.AssistiveText.None
468
+ };
469
+ currentSelectedFieldRef.current = dateRangeMode ? undefined : startInputRef.current || undefined;
470
+ e.target.blur();
471
+ currentDateValuesRef.current = { from: startDateToPass, to: dateRangeMode ? endDateToPass : value.to };
472
+ dispatchState({ type: dateInputInnerReducer_1.DateInputInnerStateActionType.ChangePeriod, payload: newStateValue });
473
+ dispatchState({ type: dateInputInnerReducer_1.DateInputInnerStateActionType.ChangeActiveField, payload: currentActiveField === "start" ? "end" : "start" });
474
+ onChange({ from: startDateToPass, to: dateRangeMode ? endDateToPass : value.to });
475
+ }, [adjustTime, dateFormatter, dateRangeMode, disableDatesAfter, disableDatesBefore, disableFutureDates, disablePastDates, getCurrentActiveField, onChange, toLocalDateTime,
476
+ toReverseOffsetDateTime, todayFrom, todayTo, value.from, value.to]);
477
+ const memoizedStartInputComponent = (0, react_1.useMemo)(() => (0, jsx_runtime_1.jsx)(dateInputInnerControlBlock_1.DateInputInnerControlBlock, { className: "zen-date-input-inner__control-start", title: title || title === undefined ? title || translate(dateRangeMode ? "Start date" : "Pick a date") : undefined, id: state.startDateId, ref: startInputRef, dateText: state.startDateText, placeholder: dateFormat, handleSetDateText: handleSetStartDateText, onBlurDateChangeHandler: handleBlurStart, requireSelection: requireSelection, selectTime: selectTime, timePickerValue: timePickerValueFrom || timePickerValueFromPrev, isMobileView: isMobileView, timeChangeHandler: startTimeChangeHandler, isActiveField: dateRangeMode ? state.currentActiveField === "start" : false, assistiveText: dateRangeMode ? getAssistiveText(state.startAssistiveText, true) : undefined, isSelected: state.currentActiveField === "start" && state.inputKeyDownBehavior === "start" }), [title, translate, dateRangeMode, state.startDateId, state.startDateText, state.currentActiveField, state.startAssistiveText, state.inputKeyDownBehavior, dateFormat,
478
+ handleSetStartDateText, handleBlurStart, requireSelection, selectTime, timePickerValueFrom, timePickerValueFromPrev, isMobileView, startTimeChangeHandler, getAssistiveText]);
479
+ const memoizedEndInputComponent = (0, react_1.useMemo)(() => dateRangeMode
480
+ ? (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { className: "zen-date-input-inner__separator" }), (0, jsx_runtime_1.jsx)(dateInputInnerControlBlock_1.DateInputInnerControlBlock, { className: "zen-date-input-inner__control-end", title: translate("End date"), id: state.endDateId, ref: endInputRef, dateText: state.endDateText, placeholder: dateFormat, handleSetDateText: handleSetEndDateText, onBlurDateChangeHandler: handleBlurEnd, requireSelection: requireSelection, selectTime: selectTime, timePickerValue: timePickerValueTo || timePickerValueToPrev, isMobileView: isMobileView, timeChangeHandler: endTimeChangeHandler, isActiveField: state.currentActiveField === "end", assistiveText: getAssistiveText(state.endAssistiveText, false), isSelected: state.currentActiveField === "end" && state.inputKeyDownBehavior === "end" })] }) : null, [dateRangeMode, translate, state.endDateId, state.endDateText, state.currentActiveField, state.endAssistiveText, state.inputKeyDownBehavior, dateFormat, handleSetEndDateText, handleBlurEnd,
481
+ requireSelection, selectTime, timePickerValueTo, timePickerValueToPrev, isMobileView, endTimeChangeHandler, getAssistiveText]);
482
+ (_a = currentSelectedFieldRef.current) === null || _a === void 0 ? void 0 : _a.select();
483
+ return (0, jsx_runtime_1.jsxs)("div", { className: (0, classNames_1.classNames)(["zen-date-input-inner", driveClassName || "", isMobileView ? "zen-date-input-inner--mobile-view" : ""]), children: [(0, jsx_runtime_1.jsxs)("div", Object.assign({ className: "zen-date-input-inner__controls-block" }, rangeArgs, { children: [memoizedStartInputComponent, memoizedEndInputComponent] })), (0, jsx_runtime_1.jsx)("div", { className: "zen-date-input-inner__calendar", children: (0, jsx_runtime_1.jsx)(calendar_1.Calendar, { id: id, value: calendarValue, onChange: calendarChangeHandler, dateRangeMode: dateRangeMode, disableFutureDates: disableFutureDates, disablePastDates: disablePastDates, disableDatesAfter: disableDatesAfterValue, disableDatesBefore: disableDatesBeforeValue, startDayOfWeek: startDayOfWeek, yearRange: yearRange, isMobileView: isMobileView, getCurrentActiveField: dateRangeMode ? getCurrentActiveField : undefined, onTodayButtonClick: isTodayDisabled ? undefined : handleTodayButtonClick }) })] });
189
484
  };
190
485
  exports.DateInputInner = DateInputInner;
191
486
  exports.TRANSLATIONS = [
192
487
  "Pick a date",
193
488
  "Start date",
194
- "End date"
489
+ "End date",
490
+ "Start date has been adjusted.",
491
+ "End date has been adjusted.",
492
+ "Start time has been adjusted.",
493
+ "End time has been adjusted."
195
494
  ];
@@ -1,5 +1,7 @@
1
1
  import { ChangeEvent } from "react";
2
2
  import { IZenComponentProps } from "../commonHelpers/zenComponent";
3
+ import "../formField/formField.less";
4
+ import React from "react";
3
5
  export type TDateFormatter = (date: Date | string) => string;
4
6
  export type TDateDeformatter = (date: string) => Date;
5
7
  interface IDateInputInnerControlBlock extends IZenComponentProps {
@@ -14,7 +16,10 @@ interface IDateInputInnerControlBlock extends IZenComponentProps {
14
16
  handleSetDateText: (e: ChangeEvent<HTMLInputElement>) => void;
15
17
  onBlurDateChangeHandler: (e: any) => void;
16
18
  timeChangeHandler: (time: Date) => void;
19
+ isActiveField: boolean;
20
+ assistiveText?: string;
21
+ isSelected?: boolean;
17
22
  }
18
- export declare const DateInputInnerControlBlock: React.FC<IDateInputInnerControlBlock>;
23
+ export declare const DateInputInnerControlBlock: React.ForwardRefExoticComponent<IDateInputInnerControlBlock & React.RefAttributes<HTMLInputElement>>;
19
24
  export declare const TRANSLATIONS: string[];
20
25
  export {};