@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.
- package/README.md +8 -0
- package/dist/calendar/calendar.d.ts +4 -2
- package/dist/calendar/calendar.js +73 -76
- package/dist/calendar/calendarUtils.d.ts +5 -2
- package/dist/calendar/calendarUtils.js +8 -34
- package/dist/calendar/dateUtils.d.ts +6 -1
- package/dist/calendar/dateUtils.js +25 -94
- package/dist/commonStyles/pillStyles/pillContent.less +2 -2
- package/dist/dateInput/dateInput.js +7 -5
- package/dist/dateInputInner/dateInputInner.js +396 -97
- package/dist/dateInputInner/dateInputInnerControlBlock.d.ts +6 -1
- package/dist/dateInputInner/dateInputInnerControlBlock.js +17 -6
- package/dist/dateInputInner/dateInputInnerReducer.d.ts +109 -0
- package/dist/dateInputInner/dateInputInnerReducer.js +134 -0
- package/dist/dateRange/dateRange.d.ts +1 -0
- package/dist/dateRange/dateRange.js +26 -24
- package/dist/dateRange/dateRangeUtils.d.ts +1 -0
- package/dist/dateRangeInner/dateRangeInner.d.ts +2 -2
- package/dist/dateRangeInner/dateRangeInner.js +15 -17
- package/dist/dropdown/dropdown.js +6 -2
- package/dist/filtersBar/components/filtersBarDropdown/filtersBarDropdown.d.ts +1 -1
- package/dist/filtersBar/components/filtersBarDropdown/filtersBarDropdown.js +1 -1
- package/dist/filtersBar/components/filtersBarPeriodPicker/filtersBarPeriodPicker.js +10 -10
- package/dist/filtersBar/components/filtersBarPeriodPicker/getRangeOption.d.ts +8 -2
- package/dist/filtersBar/components/filtersBarPeriodPicker/getRangeOption.js +25 -11
- package/dist/filtersBar/components/filtersBarPeriodPicker/normalizeDates.js +10 -8
- package/dist/header/components/collapsedItemsControl/collapsedItemsControl.js +1 -1
- package/dist/header/header.js +2 -1
- package/dist/header/headerContext.d.ts +9 -0
- package/dist/header/headerContext.js +8 -0
- package/dist/header/headerHelpers.js +6 -3
- package/dist/header/headerMenu.d.ts +2 -0
- package/dist/header/headerMenu.js +2 -2
- package/dist/index.css +110 -23
- package/dist/index.d.ts +2 -2
- package/dist/index.js +15 -18
- package/dist/menu/components/menuItem.js +5 -2
- package/dist/parallelSelection/parallelSelection.d.ts +2 -0
- package/dist/parallelSelection/parallelSelection.js +2 -2
- package/dist/timePicker/timePicker.d.ts +1 -0
- package/dist/timePicker/timePicker.js +4 -4
- package/dist/utils/dateInputUtils/useTodayButton.d.ts +5 -0
- package/dist/utils/dateInputUtils/useTodayButton.js +16 -0
- package/dist/utils/localization/translations/cs-json.d.ts +1 -0
- package/dist/utils/localization/translations/cs-json.js +2 -1
- package/dist/utils/localization/translations/de-json.d.ts +1 -0
- package/dist/utils/localization/translations/de-json.js +2 -1
- package/dist/utils/localization/translations/en-json.d.ts +16 -0
- package/dist/utils/localization/translations/en-json.js +17 -1
- package/dist/utils/localization/translations/es-json.d.ts +1 -0
- package/dist/utils/localization/translations/es-json.js +2 -1
- package/dist/utils/localization/translations/fr-FR-json.d.ts +1 -0
- package/dist/utils/localization/translations/fr-FR-json.js +2 -1
- package/dist/utils/localization/translations/fr-json.d.ts +1 -0
- package/dist/utils/localization/translations/fr-json.js +2 -1
- package/dist/utils/localization/translations/id-json.d.ts +1 -0
- package/dist/utils/localization/translations/id-json.js +2 -1
- package/dist/utils/localization/translations/it-json.d.ts +1 -0
- package/dist/utils/localization/translations/it-json.js +2 -1
- package/dist/utils/localization/translations/ja-json.d.ts +1 -0
- package/dist/utils/localization/translations/ja-json.js +2 -1
- package/dist/utils/localization/translations/ms-json.d.ts +1 -0
- package/dist/utils/localization/translations/ms-json.js +2 -1
- package/dist/utils/localization/translations/nl-json.d.ts +1 -0
- package/dist/utils/localization/translations/nl-json.js +2 -1
- package/dist/utils/localization/translations/pl-json.d.ts +1 -0
- package/dist/utils/localization/translations/pl-json.js +2 -1
- package/dist/utils/localization/translations/pt-BR-json.d.ts +1 -0
- package/dist/utils/localization/translations/pt-BR-json.js +2 -1
- package/dist/utils/localization/translations/sv-json.d.ts +1 -0
- package/dist/utils/localization/translations/sv-json.js +2 -1
- package/dist/utils/localization/translations/th-json.d.ts +1 -0
- package/dist/utils/localization/translations/th-json.js +2 -1
- package/dist/utils/localization/translations/tr-json.d.ts +1 -0
- package/dist/utils/localization/translations/tr-json.js +2 -1
- package/dist/utils/localization/translations/zh-Hans-json.d.ts +1 -0
- package/dist/utils/localization/translations/zh-Hans-json.js +2 -1
- package/package.json +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
|
|
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)(
|
|
17
|
-
|
|
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
|
|
53
|
-
|
|
54
|
-
const
|
|
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
|
|
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:
|
|
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,
|
|
151
|
-
|
|
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",
|
|
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") }),
|
|
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 =
|
|
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: [
|
|
173
|
-
}, [customDate.from, customDate.to, handleApplyClick, handleCancelClick, handleClearClick, hasApplyButton, isCustomDateOption,
|
|
174
|
-
|
|
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
|
|
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 {
|
|
5
|
+
import { IDateRangeOptionsItem } from "../filtersBar/components/filtersBarPeriodPicker/getRangeOption";
|
|
6
6
|
export interface IDateRangeInner extends IZenComponentProps {
|
|
7
7
|
id: string;
|
|
8
|
-
options:
|
|
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
|
|
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
|
|
23
|
-
|
|
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",
|
|
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.
|
|
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,
|
|
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
|
-
|
|
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(
|
|
33
|
+
setNamedFnReady(val => !val);
|
|
34
34
|
} : undefined }));
|
|
35
35
|
if (!useSidePanelView) {
|
|
36
36
|
return component;
|