@gravity-ui/date-components 2.8.3 → 2.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/components/CalendarView/Calendar.css +1 -1
- package/dist/cjs/components/CalendarView/CalendarView.js +3 -2
- package/dist/cjs/components/CalendarView/hooks/types.d.ts +2 -0
- package/dist/cjs/components/CalendarView/hooks/useCalendarCellProps.js +22 -19
- package/dist/cjs/components/CalendarView/hooks/useCalendarGridProps.js +2 -1
- package/dist/cjs/components/CalendarView/hooks/useCalendarProps.js +2 -1
- package/dist/cjs/components/CalendarView/hooks/useCalendarState.js +14 -8
- package/dist/cjs/components/CalendarView/hooks/useRangeCalendarState.js +1 -2
- package/dist/cjs/components/CalendarView/utils.d.ts +0 -1
- package/dist/cjs/components/CalendarView/utils.js +0 -10
- package/dist/cjs/components/DateField/hooks/useDateFieldProps.js +1 -4
- package/dist/cjs/components/RangeDatePicker/RangeDatePicker.js +1 -1
- package/dist/cjs/components/RelativeDateField/hooks/useRelativeDateFieldProps.js +1 -0
- package/dist/cjs/components/RelativeRangeDatePicker/RelativeRangeDatePicker.css +0 -34
- package/dist/cjs/components/RelativeRangeDatePicker/RelativeRangeDatePicker.d.ts +1 -30
- package/dist/cjs/components/RelativeRangeDatePicker/RelativeRangeDatePicker.js +16 -50
- package/dist/cjs/components/RelativeRangeDatePicker/components/Control/Control.css +34 -0
- package/dist/cjs/components/RelativeRangeDatePicker/components/Control/Control.d.ts +16 -0
- package/dist/cjs/components/RelativeRangeDatePicker/components/Control/Control.js +64 -0
- package/dist/cjs/components/RelativeRangeDatePicker/components/Control/i18n/en.json +3 -0
- package/dist/cjs/components/RelativeRangeDatePicker/components/Control/i18n/index.d.ts +1 -0
- package/dist/cjs/components/RelativeRangeDatePicker/components/Control/i18n/index.js +11 -0
- package/dist/cjs/components/RelativeRangeDatePicker/components/Control/i18n/ru.json +3 -0
- package/dist/cjs/components/RelativeRangeDatePicker/components/PickerDialog/PickerDialog.d.ts +1 -1
- package/dist/cjs/components/RelativeRangeDatePicker/components/PickerDialog/useRelativeRangeDatePickerDialogState.d.ts +1 -1
- package/dist/cjs/components/RelativeRangeDatePicker/components/Zones/Zones.js +2 -2
- package/dist/cjs/components/RelativeRangeDatePicker/i18n/en.json +1 -2
- package/dist/cjs/components/RelativeRangeDatePicker/i18n/index.d.ts +1 -1
- package/dist/cjs/components/RelativeRangeDatePicker/i18n/ru.json +1 -2
- package/dist/cjs/components/RelativeRangeDatePicker/types.d.ts +42 -0
- package/dist/cjs/components/RelativeRangeDatePicker/types.js +2 -0
- package/dist/cjs/components/utils/dates.d.ts +3 -0
- package/dist/cjs/components/utils/dates.js +18 -0
- package/dist/esm/components/CalendarView/Calendar.css +1 -1
- package/dist/esm/components/CalendarView/CalendarView.js +3 -2
- package/dist/esm/components/CalendarView/hooks/types.d.ts +2 -0
- package/dist/esm/components/CalendarView/hooks/useCalendarCellProps.js +22 -19
- package/dist/esm/components/CalendarView/hooks/useCalendarGridProps.js +2 -1
- package/dist/esm/components/CalendarView/hooks/useCalendarProps.js +2 -1
- package/dist/esm/components/CalendarView/hooks/useCalendarState.js +9 -3
- package/dist/esm/components/CalendarView/hooks/useRangeCalendarState.js +1 -2
- package/dist/esm/components/CalendarView/utils.d.ts +0 -1
- package/dist/esm/components/CalendarView/utils.js +0 -9
- package/dist/esm/components/DateField/hooks/useDateFieldProps.js +1 -4
- package/dist/esm/components/RangeDatePicker/RangeDatePicker.js +1 -1
- package/dist/esm/components/RelativeDateField/hooks/useRelativeDateFieldProps.js +1 -0
- package/dist/esm/components/RelativeRangeDatePicker/RelativeRangeDatePicker.css +0 -34
- package/dist/esm/components/RelativeRangeDatePicker/RelativeRangeDatePicker.d.ts +1 -30
- package/dist/esm/components/RelativeRangeDatePicker/RelativeRangeDatePicker.js +17 -51
- package/dist/esm/components/RelativeRangeDatePicker/components/Control/Control.css +34 -0
- package/dist/esm/components/RelativeRangeDatePicker/components/Control/Control.d.ts +16 -0
- package/dist/esm/components/RelativeRangeDatePicker/components/Control/Control.js +58 -0
- package/dist/esm/components/RelativeRangeDatePicker/components/Control/i18n/en.json +3 -0
- package/dist/esm/components/RelativeRangeDatePicker/components/Control/i18n/index.d.ts +1 -0
- package/dist/esm/components/RelativeRangeDatePicker/components/Control/i18n/index.js +5 -0
- package/dist/esm/components/RelativeRangeDatePicker/components/Control/i18n/ru.json +3 -0
- package/dist/esm/components/RelativeRangeDatePicker/components/PickerDialog/PickerDialog.d.ts +1 -1
- package/dist/esm/components/RelativeRangeDatePicker/components/PickerDialog/useRelativeRangeDatePickerDialogState.d.ts +1 -1
- package/dist/esm/components/RelativeRangeDatePicker/components/Zones/Zones.js +2 -2
- package/dist/esm/components/RelativeRangeDatePicker/i18n/en.json +1 -2
- package/dist/esm/components/RelativeRangeDatePicker/i18n/index.d.ts +1 -1
- package/dist/esm/components/RelativeRangeDatePicker/i18n/ru.json +1 -2
- package/dist/esm/components/RelativeRangeDatePicker/types.d.ts +42 -0
- package/dist/esm/components/RelativeRangeDatePicker/types.js +1 -0
- package/dist/esm/components/utils/dates.d.ts +3 -0
- package/dist/esm/components/utils/dates.js +15 -0
- package/package.json +1 -1
|
@@ -10,6 +10,7 @@ const react_1 = __importDefault(require("react"));
|
|
|
10
10
|
const icons_1 = require("@gravity-ui/icons");
|
|
11
11
|
const uikit_1 = require("@gravity-ui/uikit");
|
|
12
12
|
const cn_1 = require("../../utils/cn");
|
|
13
|
+
const dates_1 = require("../utils/dates");
|
|
13
14
|
const useCalendarCellProps_1 = require("./hooks/useCalendarCellProps");
|
|
14
15
|
const useCalendarGridProps_1 = require("./hooks/useCalendarGridProps");
|
|
15
16
|
const useCalendarProps_1 = require("./hooks/useCalendarProps");
|
|
@@ -62,14 +63,14 @@ function Content({ className, state, animation, onAnimationEnd }) {
|
|
|
62
63
|
function Weekdays({ state }) {
|
|
63
64
|
const weekdays = (0, utils_1.getWeekDays)();
|
|
64
65
|
return ((0, jsx_runtime_1.jsx)("div", { className: b('grid-row'), role: "row", children: weekdays.map((date) => {
|
|
65
|
-
return ((0, jsx_runtime_1.jsx)("div", { className: b('weekday', { weekend: state.isWeekend(date) }), role: "columnheader", "aria-label":
|
|
66
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: b('weekday', { weekend: state.isWeekend(date) }), role: "columnheader", "aria-label": (0, dates_1.formatDateTime)(date, 'dddd', state.timeZone), children: (0, dates_1.formatDateTime)(date, 'dd', state.timeZone) }, date.day()));
|
|
66
67
|
}) }));
|
|
67
68
|
}
|
|
68
69
|
function CalendarGridCells({ state }) {
|
|
69
70
|
const rowsInPeriod = state.mode === 'days' ? 6 : 4;
|
|
70
71
|
const columnsInRow = state.mode === 'days' ? 7 : 3 + (state.mode === 'quarters' ? 1 : 0);
|
|
71
72
|
const days = (0, utils_1.getDaysInPeriod)(state.startDate, state.endDate, state.mode);
|
|
72
|
-
return ((0, jsx_runtime_1.jsx)("div", { className: b('grid-rowgroup', { mode: state.mode }), role: "rowgroup", children: [...new Array(rowsInPeriod).keys()].map((rowIndex) => ((0, jsx_runtime_1.jsxs)("div", { className: b('grid-row'), role: "row", children: [state.mode === 'quarters' ? ((0, jsx_runtime_1.jsx)("span", { role: "rowheader", className: b('grid-rowgroup-header'), children: days[rowIndex * columnsInRow]
|
|
73
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: b('grid-rowgroup', { mode: state.mode }), role: "rowgroup", children: [...new Array(rowsInPeriod).keys()].map((rowIndex) => ((0, jsx_runtime_1.jsxs)("div", { className: b('grid-row'), role: "row", children: [state.mode === 'quarters' ? ((0, jsx_runtime_1.jsx)("span", { role: "rowheader", className: b('grid-rowgroup-header'), children: (0, dates_1.formatDateTime)(days[rowIndex * columnsInRow], 'YYYY', state.timeZone) })) : null, days
|
|
73
74
|
.slice(rowIndex * columnsInRow, (rowIndex + 1) * columnsInRow)
|
|
74
75
|
.map((date) => {
|
|
75
76
|
return (0, jsx_runtime_1.jsx)(CalendarCell, { date: date, state: state }, date.unix());
|
|
@@ -8,6 +8,8 @@ export interface CalendarStateOptionsBase extends InputBase {
|
|
|
8
8
|
maxValue?: DateTime;
|
|
9
9
|
/** Callback that is called for each date of the calendar. If it returns true, then the date is unavailable. */
|
|
10
10
|
isDateUnavailable?: (date: DateTime) => boolean;
|
|
11
|
+
/** Callback that is called for each date of the calendar. If it returns true, then the date is weekend. */
|
|
12
|
+
isWeekend?: (date: DateTime) => boolean;
|
|
11
13
|
/**
|
|
12
14
|
* Which timezone use to show values. Example: 'default', 'system', 'Europe/Amsterdam'.
|
|
13
15
|
* @default The timezone of the `value` or `defaultValue` or `focusedValue` or `defaultFocusedValue`, 'default' otherwise.
|
|
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.useCalendarCellProps = useCalendarCellProps;
|
|
7
7
|
const react_1 = __importDefault(require("react"));
|
|
8
|
+
const dates_1 = require("../../utils/dates");
|
|
8
9
|
function useCalendarCellProps(date, state) {
|
|
9
10
|
const ref = react_1.default.useRef(null);
|
|
10
11
|
const isFocused = state.isCellFocused(date);
|
|
@@ -26,7 +27,7 @@ function useCalendarCellProps(date, state) {
|
|
|
26
27
|
const isSelectable = !isDisabled && !isUnavailable;
|
|
27
28
|
const isCurrent = state.isCurrent(date);
|
|
28
29
|
const isWeekend = state.isWeekend(date);
|
|
29
|
-
const label = getDateLabel(date, state
|
|
30
|
+
const label = getDateLabel(date, state);
|
|
30
31
|
const cellProps = {
|
|
31
32
|
role: 'gridcell',
|
|
32
33
|
'aria-selected': isSelected ? 'true' : undefined,
|
|
@@ -58,15 +59,15 @@ function useCalendarCellProps(date, state) {
|
|
|
58
59
|
}
|
|
59
60
|
},
|
|
60
61
|
};
|
|
61
|
-
let formattedDate =
|
|
62
|
+
let formattedDate = (0, dates_1.formatDateTime)(date, 'D', state.timeZone);
|
|
62
63
|
if (state.mode === 'months') {
|
|
63
|
-
formattedDate =
|
|
64
|
+
formattedDate = (0, dates_1.formatDateTime)(date, 'MMM', state.timeZone);
|
|
64
65
|
}
|
|
65
66
|
else if (state.mode === 'quarters') {
|
|
66
|
-
formattedDate =
|
|
67
|
+
formattedDate = (0, dates_1.formatDateTime)(date, '[Q]Q', state.timeZone);
|
|
67
68
|
}
|
|
68
69
|
else if (state.mode === 'years') {
|
|
69
|
-
formattedDate =
|
|
70
|
+
formattedDate = (0, dates_1.formatDateTime)(date, 'YYYY', state.timeZone);
|
|
70
71
|
}
|
|
71
72
|
return {
|
|
72
73
|
cellProps,
|
|
@@ -83,19 +84,21 @@ function useCalendarCellProps(date, state) {
|
|
|
83
84
|
isWeekend,
|
|
84
85
|
};
|
|
85
86
|
}
|
|
86
|
-
function getDateLabel(date,
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
87
|
+
function getDateLabel(date, state) {
|
|
88
|
+
switch (state.mode) {
|
|
89
|
+
case 'days': {
|
|
90
|
+
return `${(0, dates_1.formatDateTime)(date, 'dddd', state.timeZone)}, ${(0, dates_1.formatDateTime)(date, 'LL', state.timeZone)}`;
|
|
91
|
+
}
|
|
92
|
+
case 'months': {
|
|
93
|
+
return `${(0, dates_1.formatDateTime)(date, 'MMMM YYYY', state.timeZone)}`;
|
|
94
|
+
}
|
|
95
|
+
case 'quarters': {
|
|
96
|
+
return `${(0, dates_1.formatDateTime)(date, '[Q]Q YYYY', state.timeZone)}`;
|
|
97
|
+
}
|
|
98
|
+
case 'years': {
|
|
99
|
+
return `${(0, dates_1.formatDateTime)(date, 'YYYY', state.timeZone)}`;
|
|
100
|
+
}
|
|
101
|
+
default:
|
|
102
|
+
return '';
|
|
99
103
|
}
|
|
100
|
-
return label;
|
|
101
104
|
}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.useCalendarGridProps = useCalendarGridProps;
|
|
4
4
|
const uikit_1 = require("@gravity-ui/uikit");
|
|
5
|
+
const dates_1 = require("../../utils/dates");
|
|
5
6
|
function useCalendarGridProps(state) {
|
|
6
7
|
const { focusWithinProps } = (0, uikit_1.useFocusWithin)({
|
|
7
8
|
onFocusWithinChange: (isFocused) => {
|
|
@@ -10,7 +11,7 @@ function useCalendarGridProps(state) {
|
|
|
10
11
|
});
|
|
11
12
|
const gridProps = Object.assign(Object.assign({ role: 'grid', 'aria-label': state.mode === 'years' || state.mode === 'quarters'
|
|
12
13
|
? `${state.startDate.year()} — ${state.endDate.year()}`
|
|
13
|
-
: state.focusedDate
|
|
14
|
+
: (0, dates_1.formatDateTime)(state.focusedDate, state.mode === 'days' ? 'MMMM YYYY' : 'YYYY', state.timeZone), 'aria-disabled': state.disabled ? 'true' : undefined, 'aria-readonly': state.readOnly ? 'true' : undefined }, focusWithinProps), { onKeyDown: (e) => {
|
|
14
15
|
if (e.key === 'ArrowRight') {
|
|
15
16
|
e.preventDefault();
|
|
16
17
|
state.focusNextCell();
|
|
@@ -6,13 +6,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.useCalendarProps = useCalendarProps;
|
|
7
7
|
const react_1 = __importDefault(require("react"));
|
|
8
8
|
const uikit_1 = require("@gravity-ui/uikit");
|
|
9
|
+
const dates_1 = require("../../utils/dates");
|
|
9
10
|
const i18n_1 = require("../i18n");
|
|
10
11
|
const buttonDisabledClassName = 'yc-button_disabled g-button_disabled';
|
|
11
12
|
// eslint-disable-next-line complexity
|
|
12
13
|
function useCalendarProps(props, state) {
|
|
13
14
|
const title = state.mode === 'years' || state.mode === 'quarters'
|
|
14
15
|
? `${state.startDate.year()} — ${state.endDate.year()}`
|
|
15
|
-
: state.focusedDate
|
|
16
|
+
: (0, dates_1.formatDateTime)(state.focusedDate, state.mode === 'days' ? 'MMMM YYYY' : 'YYYY', state.timeZone);
|
|
16
17
|
const { focusWithinProps } = (0, uikit_1.useFocusWithin)({
|
|
17
18
|
onFocusWithin: props.onFocus,
|
|
18
19
|
onBlurWithin: props.onBlur,
|
|
@@ -32,25 +32,25 @@ function useCalendarState(props) {
|
|
|
32
32
|
if (!props.focusedValue) {
|
|
33
33
|
return props.focusedValue;
|
|
34
34
|
}
|
|
35
|
-
return (0,
|
|
35
|
+
return (0, dates_1.constrainValue)(props.focusedValue.timeZone(timeZone), minValue, maxValue);
|
|
36
36
|
}, [props.focusedValue, minValue, maxValue, timeZone]);
|
|
37
37
|
const defaultFocusedValue = react_1.default.useMemo(() => {
|
|
38
38
|
var _a;
|
|
39
39
|
const defaultValue = ((_a = (props.defaultFocusedValue ? props.defaultFocusedValue : value)) === null || _a === void 0 ? void 0 : _a.timeZone(timeZone)) ||
|
|
40
40
|
(0, dates_1.createPlaceholderValue)({ timeZone }).startOf(minMode);
|
|
41
|
-
return (0,
|
|
41
|
+
return (0, dates_1.constrainValue)(defaultValue, minValue, maxValue);
|
|
42
42
|
}, [maxValue, minValue, props.defaultFocusedValue, timeZone, value, minMode]);
|
|
43
43
|
const [focusedDateInner, setFocusedDate] = (0, uikit_1.useControlledState)(focusedValue, defaultFocusedValue, (date) => {
|
|
44
44
|
var _a;
|
|
45
45
|
(_a = props.onFocusUpdate) === null || _a === void 0 ? void 0 : _a.call(props, date.timeZone(inputTimeZone));
|
|
46
46
|
});
|
|
47
|
-
const focusedDate = (_c = focusedDateInner === null || focusedDateInner === void 0 ? void 0 : focusedDateInner.timeZone(timeZone)) !== null && _c !== void 0 ? _c : (0,
|
|
47
|
+
const focusedDate = (_c = focusedDateInner === null || focusedDateInner === void 0 ? void 0 : focusedDateInner.timeZone(timeZone)) !== null && _c !== void 0 ? _c : (0, dates_1.constrainValue)((0, dates_1.createPlaceholderValue)({ timeZone }), minValue, maxValue);
|
|
48
48
|
if (isInvalid(focusedDate, minValue, maxValue)) {
|
|
49
49
|
// If the focused date was moved to an invalid value, it can't be focused, so constrain it.
|
|
50
|
-
setFocusedDate((0,
|
|
50
|
+
setFocusedDate((0, dates_1.constrainValue)(focusedDate, minValue, maxValue));
|
|
51
51
|
}
|
|
52
52
|
function focusCell(date) {
|
|
53
|
-
setFocusedDate((0,
|
|
53
|
+
setFocusedDate((0, dates_1.constrainValue)(date.startOf(currentMode), minValue, maxValue));
|
|
54
54
|
}
|
|
55
55
|
const [isFocused, setFocused] = react_1.default.useState(props.autoFocus || false);
|
|
56
56
|
const startDate = getStartDate(focusedDate, currentMode);
|
|
@@ -61,7 +61,7 @@ function useCalendarState(props) {
|
|
|
61
61
|
value,
|
|
62
62
|
setValue(date) {
|
|
63
63
|
if (!disabled && !readOnly) {
|
|
64
|
-
let newValue = (0,
|
|
64
|
+
let newValue = (0, dates_1.constrainValue)(date, minValue, maxValue);
|
|
65
65
|
if (this.isCellUnavailable(newValue)) {
|
|
66
66
|
return;
|
|
67
67
|
}
|
|
@@ -199,7 +199,13 @@ function useCalendarState(props) {
|
|
|
199
199
|
return this.disabled || this.isInvalid(date);
|
|
200
200
|
},
|
|
201
201
|
isWeekend(date) {
|
|
202
|
-
|
|
202
|
+
if (this.mode !== 'days') {
|
|
203
|
+
return false;
|
|
204
|
+
}
|
|
205
|
+
if (typeof props.isWeekend === 'function') {
|
|
206
|
+
return props.isWeekend(date);
|
|
207
|
+
}
|
|
208
|
+
return (0, dates_1.isWeekend)(date);
|
|
203
209
|
},
|
|
204
210
|
isCurrent(date) {
|
|
205
211
|
return (0, date_utils_1.dateTime)({ timeZone }).isSame(date, this.mode);
|
|
@@ -237,6 +243,6 @@ function getEndDate(date, mode) {
|
|
|
237
243
|
return startDate.add({ [mode]: 11 });
|
|
238
244
|
}
|
|
239
245
|
function isInvalid(date, minValue, maxValue, mode = 'days') {
|
|
240
|
-
const constrainedDate = (0,
|
|
246
|
+
const constrainedDate = (0, dates_1.constrainValue)(date, minValue, maxValue);
|
|
241
247
|
return !constrainedDate.isSame(date, mode);
|
|
242
248
|
}
|
|
@@ -6,7 +6,6 @@ const react_1 = tslib_1.__importDefault(require("react"));
|
|
|
6
6
|
const uikit_1 = require("@gravity-ui/uikit");
|
|
7
7
|
const dates_1 = require("../../utils/dates");
|
|
8
8
|
const useDefaultTimeZone_1 = require("../../utils/useDefaultTimeZone");
|
|
9
|
-
const utils_1 = require("../utils");
|
|
10
9
|
const useCalendarState_1 = require("./useCalendarState");
|
|
11
10
|
function useRangeCalendarState(props) {
|
|
12
11
|
var _a;
|
|
@@ -40,7 +39,7 @@ function useRangeCalendarState(props) {
|
|
|
40
39
|
if (props.readOnly) {
|
|
41
40
|
return;
|
|
42
41
|
}
|
|
43
|
-
const newDate = (0,
|
|
42
|
+
const newDate = (0, dates_1.constrainValue)(date, calendar.minValue, calendar.maxValue);
|
|
44
43
|
if (calendar.isCellUnavailable(newDate)) {
|
|
45
44
|
return;
|
|
46
45
|
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type { DateTime } from '@gravity-ui/date-utils';
|
|
2
2
|
import type { CalendarLayout } from './hooks/types';
|
|
3
|
-
export declare function constrainValue(value: DateTime, minValue: DateTime | undefined, maxValue: DateTime | undefined): DateTime;
|
|
4
3
|
export declare function getDaysInPeriod(startDate: DateTime, _endDate: DateTime, mode: CalendarLayout): DateTime[];
|
|
5
4
|
export declare function getWeekDays(): DateTime[];
|
|
6
5
|
export declare const calendarLayouts: CalendarLayout[];
|
|
@@ -1,19 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.calendarLayouts = void 0;
|
|
4
|
-
exports.constrainValue = constrainValue;
|
|
5
4
|
exports.getDaysInPeriod = getDaysInPeriod;
|
|
6
5
|
exports.getWeekDays = getWeekDays;
|
|
7
6
|
const date_utils_1 = require("@gravity-ui/date-utils");
|
|
8
|
-
function constrainValue(value, minValue, maxValue) {
|
|
9
|
-
if (minValue && value.isBefore(minValue)) {
|
|
10
|
-
return minValue;
|
|
11
|
-
}
|
|
12
|
-
if (maxValue && maxValue.isBefore(value)) {
|
|
13
|
-
return maxValue;
|
|
14
|
-
}
|
|
15
|
-
return value;
|
|
16
|
-
}
|
|
17
7
|
function getDaysInPeriod(startDate, _endDate, mode) {
|
|
18
8
|
const days = [];
|
|
19
9
|
if (mode === 'days') {
|
|
@@ -40,10 +40,6 @@ function useDateFieldProps(state, props) {
|
|
|
40
40
|
});
|
|
41
41
|
function syncSelectionFromDOM() {
|
|
42
42
|
var _a, _b;
|
|
43
|
-
if (state.readOnly) {
|
|
44
|
-
setSelectedSections(-1);
|
|
45
|
-
return;
|
|
46
|
-
}
|
|
47
43
|
state.focusSectionInPosition((_b = (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.selectionStart) !== null && _b !== void 0 ? _b : 0);
|
|
48
44
|
setInnerState({});
|
|
49
45
|
}
|
|
@@ -165,6 +161,7 @@ function useDateFieldProps(state, props) {
|
|
|
165
161
|
'aria-describedby': props['aria-describedby'] || undefined,
|
|
166
162
|
'aria-details': props['aria-details'] || undefined,
|
|
167
163
|
'aria-disabled': state.disabled || undefined,
|
|
164
|
+
readOnly: state.readOnly,
|
|
168
165
|
inputMode,
|
|
169
166
|
onClick() {
|
|
170
167
|
syncSelectionFromDOM();
|
|
@@ -22,7 +22,7 @@ function RangeDatePicker(_a) {
|
|
|
22
22
|
const state = (0, useRangeDatePickerState_1.useRangeDatePickerState)(props);
|
|
23
23
|
const { groupProps, fieldProps, calendarButtonProps, popupProps, calendarProps, timeInputProps } = (0, DatePicker_1.useDatePickerProps)(state, props);
|
|
24
24
|
const isOnlyTime = state.hasTime && !state.hasDate;
|
|
25
|
-
return ((0, jsx_runtime_1.jsxs)("div", Object.assign({ className: b(null, className) }, groupProps, { children: [!isOnlyTime && ((0, jsx_runtime_1.jsx)("div", { ref: anchorRef, className: b('popup-anchor'), children: (0, jsx_runtime_1.jsx)(uikit_1.Popup, Object.assign({ anchorRef: anchorRef }, popupProps, { children: (0, jsx_runtime_1.jsxs)("div", { className: b('popup-content'), children: [typeof props.children === 'function' ? (props.children(Object.assign(Object.assign({}, calendarProps), { value: state.value }))) : ((0, jsx_runtime_1.jsx)(Calendar_1.RangeCalendar, Object.assign({}, calendarProps, { value: state.value }))), state.hasTime && ((0, jsx_runtime_1.jsx)("div", { className: b('time-field-wrapper'), children: (0, jsx_runtime_1.jsx)(RangeDateField_1.RangeDateField, Object.assign({}, timeInputProps)) }))] }) })) })), (0, jsx_runtime_1.jsx)(uikit_1.TextInput, Object.assign({}, fieldProps, { className: b('field'),
|
|
25
|
+
return ((0, jsx_runtime_1.jsxs)("div", Object.assign({ className: b(null, className) }, groupProps, { children: [!isOnlyTime && ((0, jsx_runtime_1.jsx)("div", { ref: anchorRef, className: b('popup-anchor'), children: (0, jsx_runtime_1.jsx)(uikit_1.Popup, Object.assign({ anchorRef: anchorRef }, popupProps, { children: (0, jsx_runtime_1.jsxs)("div", { className: b('popup-content'), children: [typeof props.children === 'function' ? (props.children(Object.assign(Object.assign({}, calendarProps), { value: state.value }))) : ((0, jsx_runtime_1.jsx)(Calendar_1.RangeCalendar, Object.assign({}, calendarProps, { value: state.value }))), state.hasTime && ((0, jsx_runtime_1.jsx)("div", { className: b('time-field-wrapper'), children: (0, jsx_runtime_1.jsx)(RangeDateField_1.RangeDateField, Object.assign({}, timeInputProps)) }))] }) })) })), (0, jsx_runtime_1.jsx)(uikit_1.TextInput, Object.assign({}, fieldProps, { className: b('field'), endContent: (0, jsx_runtime_1.jsxs)(react_1.default.Fragment, { children: [!isOnlyTime && ((0, jsx_runtime_1.jsx)(uikit_1.Button, Object.assign({}, calendarButtonProps, { children: (0, jsx_runtime_1.jsx)(uikit_1.Icon, { data: icons_1.Calendar }) }))), isOnlyTime && ((0, jsx_runtime_1.jsx)(StubButton_1.StubButton, { size: calendarButtonProps.size, icon: icons_1.Clock }))] }) })), (0, jsx_runtime_1.jsx)(HiddenInput_1.HiddenInput, { name: props.name, form: props.form, onReset: (v) => {
|
|
26
26
|
state.dateFieldState.setDate(v);
|
|
27
27
|
}, value: state.value, toStringValue: (v) => (v ? v.start.toISOString() : ''), disabled: state.disabled }), (0, jsx_runtime_1.jsx)(HiddenInput_1.HiddenInput, { name: props.name, form: props.form, value: state.value, toStringValue: (v) => (v ? v.end.toISOString() : ''), disabled: state.disabled })] })));
|
|
28
28
|
}
|
|
@@ -40,6 +40,7 @@ function useRelativeDateFieldProps(state, props) {
|
|
|
40
40
|
'aria-describedby': props['aria-describedby'] || undefined,
|
|
41
41
|
'aria-details': props['aria-details'] || undefined,
|
|
42
42
|
'aria-disabled': state.disabled || undefined,
|
|
43
|
+
readOnly: state.readOnly,
|
|
43
44
|
},
|
|
44
45
|
},
|
|
45
46
|
calendarProps: {
|
|
@@ -2,40 +2,6 @@
|
|
|
2
2
|
position: relative;
|
|
3
3
|
display: inline-flex;
|
|
4
4
|
}
|
|
5
|
-
.g-date-relative-range-date-picker__input {
|
|
6
|
-
caret-color: transparent;
|
|
7
|
-
}
|
|
8
|
-
.g-date-relative-range-date-picker__input_mobile {
|
|
9
|
-
pointer-events: none;
|
|
10
|
-
}
|
|
11
|
-
.g-date-relative-range-date-picker__mobile-trigger {
|
|
12
|
-
--_--g-date-mobile-trigger-clear-width: 0px;
|
|
13
|
-
--_--g-date-mobile-trigger-errors-width: 0px;
|
|
14
|
-
--_--g-date-mobile-trigger-button-width: 24px;
|
|
15
|
-
position: absolute;
|
|
16
|
-
inset: 0;
|
|
17
|
-
inset-inline-end: calc(var(--g-spacing-2) + var(--_--g-date-mobile-trigger-button-width) + var(--_--g-date-mobile-trigger-clear-width) + var(--_--g-date-mobile-trigger-errors-width));
|
|
18
|
-
opacity: 0;
|
|
19
|
-
}
|
|
20
|
-
.g-date-relative-range-date-picker__mobile-trigger_size_s {
|
|
21
|
-
--_--g-date-mobile-trigger-button-width: 20px;
|
|
22
|
-
}
|
|
23
|
-
.g-date-relative-range-date-picker__mobile-trigger_size_l {
|
|
24
|
-
--_--g-date-mobile-trigger-button-width: 28px;
|
|
25
|
-
}
|
|
26
|
-
.g-date-relative-range-date-picker__mobile-trigger_size_xl {
|
|
27
|
-
--_--g-date-mobile-trigger-button-width: 36px;
|
|
28
|
-
}
|
|
29
|
-
.g-date-relative-range-date-picker__mobile-trigger_has-clear {
|
|
30
|
-
--_--g-date-mobile-trigger-clear-width: calc(
|
|
31
|
-
var(--_--g-date-mobile-trigger-button-width) + 2px
|
|
32
|
-
);
|
|
33
|
-
}
|
|
34
|
-
.g-date-relative-range-date-picker__mobile-trigger_has-errors {
|
|
35
|
-
--_--g-date-mobile-trigger-errors-width: calc(
|
|
36
|
-
var(--_--g-date-mobile-trigger-button-width) + 2px
|
|
37
|
-
);
|
|
38
|
-
}
|
|
39
5
|
.g-date-relative-range-date-picker__value-label {
|
|
40
6
|
display: flex;
|
|
41
7
|
width: 100%;
|
|
@@ -1,32 +1,3 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type { Value } from '../RelativeDatePicker';
|
|
3
|
-
import type { DomProps, FocusableProps, InputBase, InputDOMProps, RangeValue, StyleProps, TextInputProps, Validation } from '../types';
|
|
4
|
-
import type { Preset } from './components/Presets/defaultPresets';
|
|
5
|
-
import type { PresetTab } from './components/Presets/utils';
|
|
6
|
-
import type { RelativeRangeDatePickerStateOptions } from './hooks/useRelativeRangeDatePickerState';
|
|
1
|
+
import type { RelativeRangeDatePickerProps } from './types';
|
|
7
2
|
import './RelativeRangeDatePicker.css';
|
|
8
|
-
export interface RelativeRangeDatePickerProps extends RelativeRangeDatePickerStateOptions, DomProps, InputBase, InputDOMProps, TextInputProps, Validation, FocusableProps, StyleProps {
|
|
9
|
-
/** Format of the date when rendered in the input. [Available formats](https://day.js.org/docs/en/display/format) */
|
|
10
|
-
format?: string;
|
|
11
|
-
/** A placeholder date that controls the default values of each segment when the user first interacts with them. Defaults to today's date at midnight. */
|
|
12
|
-
placeholderValue?: DateTime;
|
|
13
|
-
/** Apply changes with button */
|
|
14
|
-
withApplyButton?: boolean;
|
|
15
|
-
/** Show time zone selector */
|
|
16
|
-
withZonesList?: boolean;
|
|
17
|
-
/** Show relative range presets */
|
|
18
|
-
withPresets?: boolean;
|
|
19
|
-
/** Custom preset tabs */
|
|
20
|
-
presetTabs?: PresetTab[];
|
|
21
|
-
/** Custom docs for presets, if empty array docs will be hidden */
|
|
22
|
-
docs?: Preset[];
|
|
23
|
-
/** Show selected relative values as absolute dates */
|
|
24
|
-
alwaysShowAsAbsolute?: boolean;
|
|
25
|
-
/** */
|
|
26
|
-
getRangeTitle?: (value: RangeValue<Value | null> | null, timeZone: string) => string;
|
|
27
|
-
/** Sets the CSS className for the popup element. */
|
|
28
|
-
popupClassName?: string;
|
|
29
|
-
/** Handler that is called when the popup's open state changes. */
|
|
30
|
-
onOpenChange?: (open: boolean) => void;
|
|
31
|
-
}
|
|
32
3
|
export declare function RelativeRangeDatePicker(props: RelativeRangeDatePickerProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -7,19 +7,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
7
7
|
exports.RelativeRangeDatePicker = RelativeRangeDatePicker;
|
|
8
8
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
9
9
|
const react_1 = __importDefault(require("react"));
|
|
10
|
-
const icons_1 = require("@gravity-ui/icons");
|
|
11
10
|
const uikit_1 = require("@gravity-ui/uikit");
|
|
12
11
|
const cn_1 = require("../../utils/cn");
|
|
13
12
|
const HiddenInput_1 = require("../HiddenInput/HiddenInput");
|
|
14
|
-
const
|
|
13
|
+
const Control_1 = require("./components/Control/Control");
|
|
15
14
|
const PickerDialog_1 = require("./components/PickerDialog/PickerDialog");
|
|
16
15
|
const useRelativeRangeDatePickerState_1 = require("./hooks/useRelativeRangeDatePickerState");
|
|
17
|
-
const i18n_1 = require("./i18n");
|
|
18
|
-
const utils_1 = require("./utils");
|
|
19
16
|
require("./RelativeRangeDatePicker.css");
|
|
20
17
|
const b = (0, cn_1.block)('relative-range-date-picker');
|
|
21
18
|
function RelativeRangeDatePicker(props) {
|
|
22
|
-
var _a;
|
|
23
19
|
const state = (0, useRelativeRangeDatePickerState_1.useRelativeRangeDatePickerState)(props);
|
|
24
20
|
const isMobile = (0, uikit_1.useMobile)();
|
|
25
21
|
const anchorRef = react_1.default.useRef(null);
|
|
@@ -42,37 +38,14 @@ function RelativeRangeDatePicker(props) {
|
|
|
42
38
|
}
|
|
43
39
|
},
|
|
44
40
|
});
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
alwaysShowAsAbsolute: alwaysShowAsAbsolute,
|
|
53
|
-
format,
|
|
54
|
-
presets: presetTabs === null || presetTabs === void 0 ? void 0 : presetTabs.flatMap(({ presets }) => presets),
|
|
55
|
-
}), [alwaysShowAsAbsolute, format, getRangeTitle, presetTabs, state.timeZone, state.value]);
|
|
56
|
-
const validationState = props.validationState || (state.isInvalid ? 'invalid' : undefined);
|
|
57
|
-
const errorMessage = (_a = props.errorMessage) !== null && _a !== void 0 ? _a : state.errors.join('\n');
|
|
58
|
-
return ((0, jsx_runtime_1.jsxs)("div", Object.assign({ ref: anchorRef }, focusWithinProps, { className: b(null, props.className), style: props.style, children: [(0, jsx_runtime_1.jsx)(uikit_1.TextInput, { id: props.id, autoFocus: props.autoFocus, controlRef: inputRef, value: text, placeholder: props.placeholder, onUpdate: (v) => {
|
|
59
|
-
if (!props.readOnly && !v) {
|
|
60
|
-
state.setValue(null, 'default');
|
|
41
|
+
return ((0, jsx_runtime_1.jsxs)("div", Object.assign({ ref: anchorRef }, focusWithinProps, { className: b(null, props.className), style: props.style, children: [(0, jsx_runtime_1.jsx)(Control_1.Control, { props: props, state: state, open: open, isMobile: isMobile, ref: inputRef, onClick: () => {
|
|
42
|
+
if (props.disabled) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
if (!open) {
|
|
46
|
+
setIsActive(true);
|
|
47
|
+
setOpen(true);
|
|
61
48
|
}
|
|
62
|
-
}, controlProps: {
|
|
63
|
-
role: 'combobox',
|
|
64
|
-
'aria-expanded': open,
|
|
65
|
-
disabled: isMobile,
|
|
66
|
-
className: b('input', { mobile: isMobile }),
|
|
67
|
-
onClick: () => {
|
|
68
|
-
if (props.disabled) {
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
if (!open) {
|
|
72
|
-
setIsActive(true);
|
|
73
|
-
setOpen(true);
|
|
74
|
-
}
|
|
75
|
-
},
|
|
76
49
|
}, onKeyDown: (e) => {
|
|
77
50
|
if (props.disabled) {
|
|
78
51
|
return;
|
|
@@ -81,26 +54,19 @@ function RelativeRangeDatePicker(props) {
|
|
|
81
54
|
e.preventDefault();
|
|
82
55
|
setOpen(true);
|
|
83
56
|
}
|
|
57
|
+
}, onClickCalendar: () => {
|
|
58
|
+
setIsActive(true);
|
|
59
|
+
setOpen(!open);
|
|
84
60
|
}, onFocus: () => {
|
|
85
61
|
if (!isActive) {
|
|
86
62
|
setIsActive(true);
|
|
87
63
|
setOpen(true);
|
|
88
64
|
}
|
|
89
|
-
},
|
|
90
|
-
|
|
91
|
-
'
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
setIsActive(true);
|
|
95
|
-
setOpen(!open);
|
|
96
|
-
}, children: (0, jsx_runtime_1.jsx)(uikit_1.Icon, { data: icons_1.Calendar }) }) }), isMobile ? ((0, jsx_runtime_1.jsx)("button", { className: b('mobile-trigger', {
|
|
97
|
-
'has-clear': Boolean(props.hasClear && state.value),
|
|
98
|
-
'has-errors': state.isInvalid && props.errorPlacement === 'inside',
|
|
99
|
-
size: props.size,
|
|
100
|
-
}), onClick: () => {
|
|
101
|
-
setIsActive(true);
|
|
102
|
-
setOpen(true);
|
|
103
|
-
} })) : null, (0, jsx_runtime_1.jsx)(HiddenInput_1.HiddenInput, { name: props.name, form: props.form, value: state.value, toStringValue: (v) => { var _a, _b; return (_b = (_a = v === null || v === void 0 ? void 0 : v.start) === null || _a === void 0 ? void 0 : _a.type) !== null && _b !== void 0 ? _b : ''; }, disabled: props.disabled }), (0, jsx_runtime_1.jsx)(HiddenInput_1.HiddenInput, { name: props.name, form: props.form, value: state.value, toStringValue: (v) => { var _a; return getNativeValue((_a = v === null || v === void 0 ? void 0 : v.start) !== null && _a !== void 0 ? _a : null); }, disabled: props.disabled }), (0, jsx_runtime_1.jsx)(HiddenInput_1.HiddenInput, { name: props.name, form: props.form, value: state.value, toStringValue: (v) => { var _a, _b; return (_b = (_a = v === null || v === void 0 ? void 0 : v.end) === null || _a === void 0 ? void 0 : _a.type) !== null && _b !== void 0 ? _b : ''; }, disabled: props.disabled }), (0, jsx_runtime_1.jsx)(HiddenInput_1.HiddenInput, { name: props.name, form: props.form, value: state.value, toStringValue: (v) => { var _a; return getNativeValue((_a = v === null || v === void 0 ? void 0 : v.end) !== null && _a !== void 0 ? _a : null); }, disabled: props.disabled }), (0, jsx_runtime_1.jsx)(HiddenInput_1.HiddenInput, { name: props.name, form: props.form, onReset: (v) => {
|
|
65
|
+
}, onUpdate: (v) => {
|
|
66
|
+
if (!props.readOnly && !v) {
|
|
67
|
+
state.setValue(null, 'default');
|
|
68
|
+
}
|
|
69
|
+
} }), (0, jsx_runtime_1.jsx)(HiddenInput_1.HiddenInput, { name: props.name, form: props.form, value: state.value, toStringValue: (v) => { var _a, _b; return (_b = (_a = v === null || v === void 0 ? void 0 : v.start) === null || _a === void 0 ? void 0 : _a.type) !== null && _b !== void 0 ? _b : ''; }, disabled: props.disabled }), (0, jsx_runtime_1.jsx)(HiddenInput_1.HiddenInput, { name: props.name, form: props.form, value: state.value, toStringValue: (v) => { var _a; return getNativeValue((_a = v === null || v === void 0 ? void 0 : v.start) !== null && _a !== void 0 ? _a : null); }, disabled: props.disabled }), (0, jsx_runtime_1.jsx)(HiddenInput_1.HiddenInput, { name: props.name, form: props.form, value: state.value, toStringValue: (v) => { var _a, _b; return (_b = (_a = v === null || v === void 0 ? void 0 : v.end) === null || _a === void 0 ? void 0 : _a.type) !== null && _b !== void 0 ? _b : ''; }, disabled: props.disabled }), (0, jsx_runtime_1.jsx)(HiddenInput_1.HiddenInput, { name: props.name, form: props.form, value: state.value, toStringValue: (v) => { var _a; return getNativeValue((_a = v === null || v === void 0 ? void 0 : v.end) !== null && _a !== void 0 ? _a : null); }, disabled: props.disabled }), (0, jsx_runtime_1.jsx)(HiddenInput_1.HiddenInput, { name: props.name, form: props.form, onReset: (v) => {
|
|
104
70
|
state.setValue(v.value, v.timeZone);
|
|
105
71
|
}, value: { value: state.value, timeZone: state.timeZone }, toStringValue: (v) => v.timeZone, disabled: props.disabled }), (0, jsx_runtime_1.jsx)(PickerDialog_1.PickerDialog, { state: state, props: props, open: open, onClose: () => {
|
|
106
72
|
setOpen(false);
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
.g-date-relative-range-date-picker-control__input {
|
|
2
|
+
caret-color: transparent;
|
|
3
|
+
}
|
|
4
|
+
.g-date-relative-range-date-picker-control__input_mobile {
|
|
5
|
+
pointer-events: none;
|
|
6
|
+
}
|
|
7
|
+
.g-date-relative-range-date-picker-control__mobile-trigger {
|
|
8
|
+
--_--g-date-mobile-trigger-clear-width: 0px;
|
|
9
|
+
--_--g-date-mobile-trigger-errors-width: 0px;
|
|
10
|
+
--_--g-date-mobile-trigger-button-width: 24px;
|
|
11
|
+
position: absolute;
|
|
12
|
+
inset: 0;
|
|
13
|
+
inset-inline-end: calc(var(--g-spacing-2) + var(--_--g-date-mobile-trigger-button-width) + var(--_--g-date-mobile-trigger-clear-width) + var(--_--g-date-mobile-trigger-errors-width));
|
|
14
|
+
opacity: 0;
|
|
15
|
+
}
|
|
16
|
+
.g-date-relative-range-date-picker-control__mobile-trigger_size_s {
|
|
17
|
+
--_--g-date-mobile-trigger-button-width: 20px;
|
|
18
|
+
}
|
|
19
|
+
.g-date-relative-range-date-picker-control__mobile-trigger_size_l {
|
|
20
|
+
--_--g-date-mobile-trigger-button-width: 28px;
|
|
21
|
+
}
|
|
22
|
+
.g-date-relative-range-date-picker-control__mobile-trigger_size_xl {
|
|
23
|
+
--_--g-date-mobile-trigger-button-width: 36px;
|
|
24
|
+
}
|
|
25
|
+
.g-date-relative-range-date-picker-control__mobile-trigger_has-clear {
|
|
26
|
+
--_--g-date-mobile-trigger-clear-width: calc(
|
|
27
|
+
var(--_--g-date-mobile-trigger-button-width) + 2px
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
.g-date-relative-range-date-picker-control__mobile-trigger_has-errors {
|
|
31
|
+
--_--g-date-mobile-trigger-errors-width: calc(
|
|
32
|
+
var(--_--g-date-mobile-trigger-button-width) + 2px
|
|
33
|
+
);
|
|
34
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { RelativeRangeDatePickerState } from '../../hooks/useRelativeRangeDatePickerState';
|
|
3
|
+
import type { RelativeRangeDatePickerProps } from '../../types';
|
|
4
|
+
import './Control.css';
|
|
5
|
+
export type ControlProps = {
|
|
6
|
+
props: RelativeRangeDatePickerProps;
|
|
7
|
+
state: RelativeRangeDatePickerState;
|
|
8
|
+
open: boolean;
|
|
9
|
+
isMobile?: boolean;
|
|
10
|
+
onClick: (e: React.MouseEvent<HTMLElement>) => void;
|
|
11
|
+
onKeyDown: (e: React.KeyboardEvent<HTMLElement>) => void;
|
|
12
|
+
onFocus: (e: React.FocusEvent<HTMLElement>) => void;
|
|
13
|
+
onClickCalendar: (e: React.MouseEvent<HTMLElement>) => void;
|
|
14
|
+
onUpdate: (value: string) => void;
|
|
15
|
+
};
|
|
16
|
+
export declare const Control: React.ForwardRefExoticComponent<ControlProps & React.RefAttributes<HTMLInputElement>>;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.Control = void 0;
|
|
7
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
8
|
+
const react_1 = __importDefault(require("react"));
|
|
9
|
+
const icons_1 = require("@gravity-ui/icons");
|
|
10
|
+
const uikit_1 = require("@gravity-ui/uikit");
|
|
11
|
+
const cn_1 = require("../../../../utils/cn");
|
|
12
|
+
const getButtonSizeForInput_1 = require("../../../utils/getButtonSizeForInput");
|
|
13
|
+
const utils_1 = require("../../utils");
|
|
14
|
+
const i18n_1 = require("./i18n");
|
|
15
|
+
require("./Control.css");
|
|
16
|
+
const b = (0, cn_1.block)('relative-range-date-picker-control');
|
|
17
|
+
exports.Control = react_1.default.forwardRef(({ props, state, open, isMobile, onClick, onKeyDown, onFocus, onClickCalendar, onUpdate }, ref) => {
|
|
18
|
+
var _a;
|
|
19
|
+
const { alwaysShowAsAbsolute, presetTabs, getRangeTitle } = props;
|
|
20
|
+
const format = props.format || 'L';
|
|
21
|
+
const text = react_1.default.useMemo(() => typeof getRangeTitle === 'function'
|
|
22
|
+
? getRangeTitle(state.value, state.timeZone)
|
|
23
|
+
: (0, utils_1.getDefaultTitle)({
|
|
24
|
+
value: state.value,
|
|
25
|
+
timeZone: state.timeZone,
|
|
26
|
+
alwaysShowAsAbsolute,
|
|
27
|
+
format,
|
|
28
|
+
presets: presetTabs === null || presetTabs === void 0 ? void 0 : presetTabs.flatMap(({ presets }) => presets),
|
|
29
|
+
}), [alwaysShowAsAbsolute, format, getRangeTitle, presetTabs, state.timeZone, state.value]);
|
|
30
|
+
const validationState = props.validationState || (state.isInvalid ? 'invalid' : undefined);
|
|
31
|
+
const errorMessage = (_a = props.errorMessage) !== null && _a !== void 0 ? _a : state.errors.join('\n');
|
|
32
|
+
const triggerProps = {
|
|
33
|
+
id: props.id,
|
|
34
|
+
role: 'combobox',
|
|
35
|
+
'aria-haspopup': 'dialog',
|
|
36
|
+
'aria-expanded': open,
|
|
37
|
+
'aria-label': props['aria-label'],
|
|
38
|
+
'aria-labelledby': props['aria-labelledby'],
|
|
39
|
+
'aria-describedby': props['aria-describedby'],
|
|
40
|
+
'aria-details': props['aria-details'],
|
|
41
|
+
disabled: props.disabled,
|
|
42
|
+
readOnly: props.readOnly,
|
|
43
|
+
onClick: onClickCalendar,
|
|
44
|
+
onKeyDown,
|
|
45
|
+
};
|
|
46
|
+
return props.renderControl ? (props.renderControl({
|
|
47
|
+
ref,
|
|
48
|
+
value: state.value,
|
|
49
|
+
title: text,
|
|
50
|
+
validationState,
|
|
51
|
+
errorMessage,
|
|
52
|
+
open,
|
|
53
|
+
triggerProps,
|
|
54
|
+
})) : ((0, jsx_runtime_1.jsxs)(react_1.default.Fragment, { children: [(0, jsx_runtime_1.jsx)(uikit_1.TextInput, { id: props.id, autoFocus: props.autoFocus, controlRef: ref, value: text, placeholder: props.placeholder, onUpdate: onUpdate, controlProps: Object.assign(Object.assign({ className: b('input', { mobile: isMobile }) }, triggerProps), { disabled: isMobile, onClick }), onKeyDown: onKeyDown, onFocus: onFocus, validationState: validationState, errorMessage: errorMessage, errorPlacement: props.errorPlacement, pin: props.pin, size: props.size, label: props.label, hasClear: props.hasClear, disabled: props.disabled, endContent: (0, jsx_runtime_1.jsx)(uikit_1.Button, { view: "flat-secondary", size: (0, getButtonSizeForInput_1.getButtonSizeForInput)(props.size), disabled: props.disabled, extraProps: {
|
|
55
|
+
'aria-haspopup': 'dialog',
|
|
56
|
+
'aria-expanded': open,
|
|
57
|
+
'aria-label': (0, i18n_1.i18n)('Range date picker'),
|
|
58
|
+
}, onClick: onClickCalendar, children: (0, jsx_runtime_1.jsx)(uikit_1.Icon, { data: icons_1.Calendar }) }) }), isMobile ? ((0, jsx_runtime_1.jsx)("button", { className: b('mobile-trigger', {
|
|
59
|
+
'has-clear': Boolean(props.hasClear && state.value),
|
|
60
|
+
'has-errors': state.isInvalid && props.errorPlacement === 'inside',
|
|
61
|
+
size: props.size,
|
|
62
|
+
}), onClick: onClick })) : null] }));
|
|
63
|
+
});
|
|
64
|
+
exports.Control.displayName = 'Control';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const i18n: (key: "Range date picker", params?: import("@gravity-ui/i18n").Params | undefined) => string;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.i18n = void 0;
|
|
7
|
+
const i18n_1 = require("@gravity-ui/uikit/i18n");
|
|
8
|
+
const cn_1 = require("../../../../../utils/cn");
|
|
9
|
+
const en_json_1 = __importDefault(require("./en.json"));
|
|
10
|
+
const ru_json_1 = __importDefault(require("./ru.json"));
|
|
11
|
+
exports.i18n = (0, i18n_1.addComponentKeysets)({ en: en_json_1.default, ru: ru_json_1.default }, `${cn_1.NAMESPACE}relative-range-date-picker-control`);
|