@gravity-ui/date-components 1.0.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/LICENSE +21 -0
- package/README.md +15 -0
- package/dist/cjs/components/Calendar/Calendar.css +220 -0
- package/dist/cjs/components/Calendar/Calendar.d.ts +13 -0
- package/dist/cjs/components/Calendar/Calendar.js +15 -0
- package/dist/cjs/components/Calendar/CalendarBase.d.ts +18 -0
- package/dist/cjs/components/Calendar/CalendarBase.js +89 -0
- package/dist/cjs/components/Calendar/RangeCalendar.d.ts +13 -0
- package/dist/cjs/components/Calendar/RangeCalendar.js +22 -0
- package/dist/cjs/components/Calendar/hooks/types.d.ts +124 -0
- package/dist/cjs/components/Calendar/hooks/types.js +2 -0
- package/dist/cjs/components/Calendar/hooks/useCalendarCellProps.d.ts +19 -0
- package/dist/cjs/components/Calendar/hooks/useCalendarCellProps.js +98 -0
- package/dist/cjs/components/Calendar/hooks/useCalendarGridProps.d.ts +5 -0
- package/dist/cjs/components/Calendar/hooks/useCalendarGridProps.js +57 -0
- package/dist/cjs/components/Calendar/hooks/useCalendarProps.d.ts +10 -0
- package/dist/cjs/components/Calendar/hooks/useCalendarProps.js +110 -0
- package/dist/cjs/components/Calendar/hooks/useCalendarState.d.ts +7 -0
- package/dist/cjs/components/Calendar/hooks/useCalendarState.js +178 -0
- package/dist/cjs/components/Calendar/hooks/useRangeCalendarState.d.ts +7 -0
- package/dist/cjs/components/Calendar/hooks/useRangeCalendarState.js +82 -0
- package/dist/cjs/components/Calendar/i18n/en.json +4 -0
- package/dist/cjs/components/Calendar/i18n/index.d.ts +1 -0
- package/dist/cjs/components/Calendar/i18n/index.js +11 -0
- package/dist/cjs/components/Calendar/i18n/ru.json +4 -0
- package/dist/cjs/components/Calendar/index.d.ts +8 -0
- package/dist/cjs/components/Calendar/index.js +23 -0
- package/dist/cjs/components/Calendar/utils.d.ts +4 -0
- package/dist/cjs/components/Calendar/utils.js +40 -0
- package/dist/cjs/components/DateField/DateField.css +4 -0
- package/dist/cjs/components/DateField/DateField.d.ts +6 -0
- package/dist/cjs/components/DateField/DateField.js +38 -0
- package/dist/cjs/components/DateField/hooks/useDateFieldProps.d.ts +6 -0
- package/dist/cjs/components/DateField/hooks/useDateFieldProps.js +203 -0
- package/dist/cjs/components/DateField/hooks/useDateFieldState.d.ts +67 -0
- package/dist/cjs/components/DateField/hooks/useDateFieldState.js +628 -0
- package/dist/cjs/components/DateField/i18n/en.json +10 -0
- package/dist/cjs/components/DateField/i18n/index.d.ts +1 -0
- package/dist/cjs/components/DateField/i18n/index.js +11 -0
- package/dist/cjs/components/DateField/i18n/ru.json +10 -0
- package/dist/cjs/components/DateField/index.d.ts +3 -0
- package/dist/cjs/components/DateField/index.js +19 -0
- package/dist/cjs/components/DateField/types.d.ts +67 -0
- package/dist/cjs/components/DateField/types.js +2 -0
- package/dist/cjs/components/DateField/utils.d.ts +14 -0
- package/dist/cjs/components/DateField/utils.js +276 -0
- package/dist/cjs/components/DatePicker/DatePicker.css +19 -0
- package/dist/cjs/components/DatePicker/DatePicker.d.ts +5 -0
- package/dist/cjs/components/DatePicker/DatePicker.js +66 -0
- package/dist/cjs/components/DatePicker/DesktopCalendar.d.ts +15 -0
- package/dist/cjs/components/DatePicker/DesktopCalendar.js +56 -0
- package/dist/cjs/components/DatePicker/MobileCalendar.css +49 -0
- package/dist/cjs/components/DatePicker/MobileCalendar.d.ts +14 -0
- package/dist/cjs/components/DatePicker/MobileCalendar.js +78 -0
- package/dist/cjs/components/DatePicker/hooks/useDatePickerState.d.ts +45 -0
- package/dist/cjs/components/DatePicker/hooks/useDatePickerState.js +114 -0
- package/dist/cjs/components/DatePicker/i18n/en.json +3 -0
- package/dist/cjs/components/DatePicker/i18n/index.d.ts +1 -0
- package/dist/cjs/components/DatePicker/i18n/index.js +11 -0
- package/dist/cjs/components/DatePicker/i18n/ru.json +3 -0
- package/dist/cjs/components/DatePicker/index.d.ts +2 -0
- package/dist/cjs/components/DatePicker/index.js +18 -0
- package/dist/cjs/components/DatePicker/utils.d.ts +1 -0
- package/dist/cjs/components/DatePicker/utils.js +5 -0
- package/dist/cjs/components/RelativeDateField/RelativeDateField.css +16 -0
- package/dist/cjs/components/RelativeDateField/RelativeDateField.d.ts +11 -0
- package/dist/cjs/components/RelativeDateField/RelativeDateField.js +37 -0
- package/dist/cjs/components/RelativeDateField/hooks/useRelativeDateFieldProps.d.ts +12 -0
- package/dist/cjs/components/RelativeDateField/hooks/useRelativeDateFieldProps.js +66 -0
- package/dist/cjs/components/RelativeDateField/hooks/useRelativeDateFieldState.d.ts +30 -0
- package/dist/cjs/components/RelativeDateField/hooks/useRelativeDateFieldState.js +66 -0
- package/dist/cjs/components/RelativeDateField/index.d.ts +3 -0
- package/dist/cjs/components/RelativeDateField/index.js +19 -0
- package/dist/cjs/components/RelativeDatePicker/RelativeDatePicker.css +16 -0
- package/dist/cjs/components/RelativeDatePicker/RelativeDatePicker.d.ts +6 -0
- package/dist/cjs/components/RelativeDatePicker/RelativeDatePicker.js +32 -0
- package/dist/cjs/components/RelativeDatePicker/hooks/useRelativeDatePickerProps.d.ts +17 -0
- package/dist/cjs/components/RelativeDatePicker/hooks/useRelativeDatePickerProps.js +175 -0
- package/dist/cjs/components/RelativeDatePicker/hooks/useRelativeDatePickerState.d.ts +36 -0
- package/dist/cjs/components/RelativeDatePicker/hooks/useRelativeDatePickerState.js +109 -0
- package/dist/cjs/components/RelativeDatePicker/i18n/en.json +4 -0
- package/dist/cjs/components/RelativeDatePicker/i18n/index.d.ts +1 -0
- package/dist/cjs/components/RelativeDatePicker/i18n/index.js +11 -0
- package/dist/cjs/components/RelativeDatePicker/i18n/ru.json +4 -0
- package/dist/cjs/components/RelativeDatePicker/index.d.ts +3 -0
- package/dist/cjs/components/RelativeDatePicker/index.js +19 -0
- package/dist/cjs/components/hooks/useControlledState.d.ts +1 -0
- package/dist/cjs/components/hooks/useControlledState.js +30 -0
- package/dist/cjs/components/index.d.ts +5 -0
- package/dist/cjs/components/index.js +21 -0
- package/dist/cjs/components/types/datePicker.d.ts +16 -0
- package/dist/cjs/components/types/datePicker.js +2 -0
- package/dist/cjs/components/types/events.d.ts +17 -0
- package/dist/cjs/components/types/events.js +2 -0
- package/dist/cjs/components/types/index.d.ts +4 -0
- package/dist/cjs/components/types/index.js +2 -0
- package/dist/cjs/components/types/inputs.d.ts +79 -0
- package/dist/cjs/components/types/inputs.js +2 -0
- package/dist/cjs/components/types/style.d.ts +7 -0
- package/dist/cjs/components/types/style.js +2 -0
- package/dist/cjs/components/utils/getButtonSizeForInput.d.ts +2 -0
- package/dist/cjs/components/utils/getButtonSizeForInput.js +20 -0
- package/dist/cjs/components/utils/mergeProps.d.ts +13 -0
- package/dist/cjs/components/utils/mergeProps.js +47 -0
- package/dist/cjs/components/variables.css +0 -0
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.js +17 -0
- package/dist/cjs/utils/cn.d.ts +2 -0
- package/dist/cjs/utils/cn.js +6 -0
- package/dist/esm/components/Calendar/Calendar.css +220 -0
- package/dist/esm/components/Calendar/Calendar.d.ts +13 -0
- package/dist/esm/components/Calendar/Calendar.js +9 -0
- package/dist/esm/components/Calendar/CalendarBase.d.ts +18 -0
- package/dist/esm/components/Calendar/CalendarBase.js +83 -0
- package/dist/esm/components/Calendar/RangeCalendar.d.ts +13 -0
- package/dist/esm/components/Calendar/RangeCalendar.js +16 -0
- package/dist/esm/components/Calendar/hooks/types.d.ts +124 -0
- package/dist/esm/components/Calendar/hooks/types.js +1 -0
- package/dist/esm/components/Calendar/hooks/useCalendarCellProps.d.ts +19 -0
- package/dist/esm/components/Calendar/hooks/useCalendarCellProps.js +91 -0
- package/dist/esm/components/Calendar/hooks/useCalendarGridProps.d.ts +5 -0
- package/dist/esm/components/Calendar/hooks/useCalendarGridProps.js +54 -0
- package/dist/esm/components/Calendar/hooks/useCalendarProps.d.ts +10 -0
- package/dist/esm/components/Calendar/hooks/useCalendarProps.js +103 -0
- package/dist/esm/components/Calendar/hooks/useCalendarState.d.ts +7 -0
- package/dist/esm/components/Calendar/hooks/useCalendarState.js +171 -0
- package/dist/esm/components/Calendar/hooks/useRangeCalendarState.d.ts +7 -0
- package/dist/esm/components/Calendar/hooks/useRangeCalendarState.js +75 -0
- package/dist/esm/components/Calendar/i18n/en.json +4 -0
- package/dist/esm/components/Calendar/i18n/index.d.ts +1 -0
- package/dist/esm/components/Calendar/i18n/index.js +5 -0
- package/dist/esm/components/Calendar/i18n/ru.json +4 -0
- package/dist/esm/components/Calendar/index.d.ts +8 -0
- package/dist/esm/components/Calendar/index.js +7 -0
- package/dist/esm/components/Calendar/utils.d.ts +4 -0
- package/dist/esm/components/Calendar/utils.js +34 -0
- package/dist/esm/components/DateField/DateField.css +4 -0
- package/dist/esm/components/DateField/DateField.d.ts +6 -0
- package/dist/esm/components/DateField/DateField.js +31 -0
- package/dist/esm/components/DateField/hooks/useDateFieldProps.d.ts +6 -0
- package/dist/esm/components/DateField/hooks/useDateFieldProps.js +196 -0
- package/dist/esm/components/DateField/hooks/useDateFieldState.d.ts +67 -0
- package/dist/esm/components/DateField/hooks/useDateFieldState.js +621 -0
- package/dist/esm/components/DateField/i18n/en.json +10 -0
- package/dist/esm/components/DateField/i18n/index.d.ts +1 -0
- package/dist/esm/components/DateField/i18n/index.js +5 -0
- package/dist/esm/components/DateField/i18n/ru.json +10 -0
- package/dist/esm/components/DateField/index.d.ts +3 -0
- package/dist/esm/components/DateField/index.js +3 -0
- package/dist/esm/components/DateField/types.d.ts +67 -0
- package/dist/esm/components/DateField/types.js +1 -0
- package/dist/esm/components/DateField/utils.d.ts +14 -0
- package/dist/esm/components/DateField/utils.js +268 -0
- package/dist/esm/components/DatePicker/DatePicker.css +19 -0
- package/dist/esm/components/DatePicker/DatePicker.d.ts +5 -0
- package/dist/esm/components/DatePicker/DatePicker.js +59 -0
- package/dist/esm/components/DatePicker/DesktopCalendar.d.ts +15 -0
- package/dist/esm/components/DatePicker/DesktopCalendar.js +48 -0
- package/dist/esm/components/DatePicker/MobileCalendar.css +49 -0
- package/dist/esm/components/DatePicker/MobileCalendar.d.ts +14 -0
- package/dist/esm/components/DatePicker/MobileCalendar.js +73 -0
- package/dist/esm/components/DatePicker/hooks/useDatePickerState.d.ts +45 -0
- package/dist/esm/components/DatePicker/hooks/useDatePickerState.js +107 -0
- package/dist/esm/components/DatePicker/i18n/en.json +3 -0
- package/dist/esm/components/DatePicker/i18n/index.d.ts +1 -0
- package/dist/esm/components/DatePicker/i18n/index.js +5 -0
- package/dist/esm/components/DatePicker/i18n/ru.json +3 -0
- package/dist/esm/components/DatePicker/index.d.ts +2 -0
- package/dist/esm/components/DatePicker/index.js +2 -0
- package/dist/esm/components/DatePicker/utils.d.ts +1 -0
- package/dist/esm/components/DatePicker/utils.js +2 -0
- package/dist/esm/components/RelativeDateField/RelativeDateField.css +16 -0
- package/dist/esm/components/RelativeDateField/RelativeDateField.d.ts +11 -0
- package/dist/esm/components/RelativeDateField/RelativeDateField.js +30 -0
- package/dist/esm/components/RelativeDateField/hooks/useRelativeDateFieldProps.d.ts +12 -0
- package/dist/esm/components/RelativeDateField/hooks/useRelativeDateFieldProps.js +59 -0
- package/dist/esm/components/RelativeDateField/hooks/useRelativeDateFieldState.d.ts +30 -0
- package/dist/esm/components/RelativeDateField/hooks/useRelativeDateFieldState.js +59 -0
- package/dist/esm/components/RelativeDateField/index.d.ts +3 -0
- package/dist/esm/components/RelativeDateField/index.js +3 -0
- package/dist/esm/components/RelativeDatePicker/RelativeDatePicker.css +16 -0
- package/dist/esm/components/RelativeDatePicker/RelativeDatePicker.d.ts +6 -0
- package/dist/esm/components/RelativeDatePicker/RelativeDatePicker.js +25 -0
- package/dist/esm/components/RelativeDatePicker/hooks/useRelativeDatePickerProps.d.ts +17 -0
- package/dist/esm/components/RelativeDatePicker/hooks/useRelativeDatePickerProps.js +168 -0
- package/dist/esm/components/RelativeDatePicker/hooks/useRelativeDatePickerState.d.ts +36 -0
- package/dist/esm/components/RelativeDatePicker/hooks/useRelativeDatePickerState.js +102 -0
- package/dist/esm/components/RelativeDatePicker/i18n/en.json +4 -0
- package/dist/esm/components/RelativeDatePicker/i18n/index.d.ts +1 -0
- package/dist/esm/components/RelativeDatePicker/i18n/index.js +5 -0
- package/dist/esm/components/RelativeDatePicker/i18n/ru.json +4 -0
- package/dist/esm/components/RelativeDatePicker/index.d.ts +3 -0
- package/dist/esm/components/RelativeDatePicker/index.js +3 -0
- package/dist/esm/components/hooks/useControlledState.d.ts +1 -0
- package/dist/esm/components/hooks/useControlledState.js +23 -0
- package/dist/esm/components/index.d.ts +5 -0
- package/dist/esm/components/index.js +5 -0
- package/dist/esm/components/types/datePicker.d.ts +16 -0
- package/dist/esm/components/types/datePicker.js +1 -0
- package/dist/esm/components/types/events.d.ts +17 -0
- package/dist/esm/components/types/events.js +1 -0
- package/dist/esm/components/types/index.d.ts +4 -0
- package/dist/esm/components/types/index.js +1 -0
- package/dist/esm/components/types/inputs.d.ts +79 -0
- package/dist/esm/components/types/inputs.js +1 -0
- package/dist/esm/components/types/style.d.ts +7 -0
- package/dist/esm/components/types/style.js +1 -0
- package/dist/esm/components/utils/getButtonSizeForInput.d.ts +2 -0
- package/dist/esm/components/utils/getButtonSizeForInput.js +16 -0
- package/dist/esm/components/utils/mergeProps.d.ts +13 -0
- package/dist/esm/components/utils/mergeProps.js +43 -0
- package/dist/esm/components/variables.css +0 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/utils/cn.d.ts +2 -0
- package/dist/esm/utils/cn.js +3 -0
- package/package.json +119 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { DateTime } from '@gravity-ui/date-utils';
|
|
2
|
+
import type { DateFieldState } from '../../DateField';
|
|
3
|
+
import type { DatePickerState } from '../../DatePicker';
|
|
4
|
+
import type { RelativeDateFieldState } from '../../RelativeDateField';
|
|
5
|
+
import type { DateFieldBase } from '../../types';
|
|
6
|
+
export type Value = {
|
|
7
|
+
type: 'absolute';
|
|
8
|
+
value: DateTime;
|
|
9
|
+
} | {
|
|
10
|
+
type: 'relative';
|
|
11
|
+
value: string;
|
|
12
|
+
};
|
|
13
|
+
export type RelativeDatePickerMode = Value['type'];
|
|
14
|
+
export interface RelativeDatePickerStateOptions extends DateFieldBase<Value> {
|
|
15
|
+
}
|
|
16
|
+
export interface RelativeDatePickerState {
|
|
17
|
+
value: Value | null;
|
|
18
|
+
setValue: (value: Value | null) => void;
|
|
19
|
+
mode: RelativeDatePickerMode;
|
|
20
|
+
setMode: (mode: RelativeDatePickerMode) => void;
|
|
21
|
+
datePickerState: DatePickerState;
|
|
22
|
+
dateFieldState: DateFieldState;
|
|
23
|
+
relativeDateState: RelativeDateFieldState;
|
|
24
|
+
selectedDate: DateTime | null;
|
|
25
|
+
/**
|
|
26
|
+
* Whether the field is disabled.
|
|
27
|
+
*/
|
|
28
|
+
disabled?: boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Whether the value is immutable.
|
|
31
|
+
*/
|
|
32
|
+
readOnly?: boolean;
|
|
33
|
+
isActive: boolean;
|
|
34
|
+
setActive: (isActive: boolean) => void;
|
|
35
|
+
}
|
|
36
|
+
export declare function useRelativeDatePickerState(props: RelativeDatePickerStateOptions): RelativeDatePickerState;
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { useDateFieldState } from '../../DateField';
|
|
3
|
+
import { useDatePickerState } from '../../DatePicker';
|
|
4
|
+
import { useRelativeDateFieldState } from '../../RelativeDateField';
|
|
5
|
+
import { useControlledState } from '../../hooks/useControlledState';
|
|
6
|
+
export function useRelativeDatePickerState(props) {
|
|
7
|
+
const [value, setValue] = useControlledState(props.value, props.defaultValue, props.onUpdate);
|
|
8
|
+
const [mode, setMode] = React.useState((value === null || value === void 0 ? void 0 : value.type) === 'relative' ? 'relative' : 'absolute');
|
|
9
|
+
const [prevValue, setPrevValue] = React.useState(value);
|
|
10
|
+
if (value !== prevValue) {
|
|
11
|
+
setPrevValue(value);
|
|
12
|
+
if (value) {
|
|
13
|
+
setMode(value.type);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
const [valueDate, setValueDate] = React.useState((value === null || value === void 0 ? void 0 : value.type) === 'absolute' ? value.value : null);
|
|
17
|
+
if ((value === null || value === void 0 ? void 0 : value.type) === 'absolute' && value.value !== valueDate) {
|
|
18
|
+
setValueDate(value.value);
|
|
19
|
+
}
|
|
20
|
+
const datePickerState = useDatePickerState({
|
|
21
|
+
value: valueDate,
|
|
22
|
+
onUpdate: (date) => {
|
|
23
|
+
setValueDate(date);
|
|
24
|
+
if ((value === null || value === void 0 ? void 0 : value.type) === 'absolute' && (date === null || date === void 0 ? void 0 : date.isSame(value.value))) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
setValue(date ? { type: 'absolute', value: date } : null);
|
|
28
|
+
},
|
|
29
|
+
format: props.format,
|
|
30
|
+
placeholderValue: props.placeholderValue,
|
|
31
|
+
timeZone: props.timeZone,
|
|
32
|
+
disabled: props.disabled,
|
|
33
|
+
readOnly: props.readOnly,
|
|
34
|
+
});
|
|
35
|
+
const dateFieldState = useDateFieldState({
|
|
36
|
+
value: valueDate,
|
|
37
|
+
onUpdate: datePickerState.setValue,
|
|
38
|
+
format: props.format,
|
|
39
|
+
placeholderValue: props.placeholderValue,
|
|
40
|
+
timeZone: props.timeZone,
|
|
41
|
+
disabled: props.disabled,
|
|
42
|
+
readOnly: props.readOnly,
|
|
43
|
+
});
|
|
44
|
+
const [valueRelative, setValueRelative] = React.useState((value === null || value === void 0 ? void 0 : value.type) === 'relative' ? value.value : null);
|
|
45
|
+
if ((value === null || value === void 0 ? void 0 : value.type) === 'relative' && value.value !== valueRelative) {
|
|
46
|
+
setValueRelative(value.value);
|
|
47
|
+
}
|
|
48
|
+
const relativeDateState = useRelativeDateFieldState({
|
|
49
|
+
value: valueRelative,
|
|
50
|
+
onUpdate: (v) => {
|
|
51
|
+
setValueRelative(v);
|
|
52
|
+
if ((value === null || value === void 0 ? void 0 : value.type) === 'relative' && v === value.value) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
setValue(v ? { type: 'relative', value: v } : null);
|
|
56
|
+
},
|
|
57
|
+
disabled: props.disabled,
|
|
58
|
+
readOnly: props.readOnly,
|
|
59
|
+
});
|
|
60
|
+
if (!value) {
|
|
61
|
+
if (mode === 'absolute' && valueDate) {
|
|
62
|
+
setValueDate(null);
|
|
63
|
+
}
|
|
64
|
+
else if (mode === 'relative' && valueRelative) {
|
|
65
|
+
setValueRelative(null);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const selectedDate = mode === 'relative' ? relativeDateState.parsedDate : datePickerState.dateValue;
|
|
69
|
+
const [isActive, setActive] = React.useState(false);
|
|
70
|
+
return {
|
|
71
|
+
value: value !== null && value !== void 0 ? value : null,
|
|
72
|
+
setValue(v) {
|
|
73
|
+
if (props.readOnly || props.disabled) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
setValue(v);
|
|
77
|
+
},
|
|
78
|
+
disabled: props.disabled,
|
|
79
|
+
readOnly: props.readOnly,
|
|
80
|
+
mode,
|
|
81
|
+
setMode(newMode) {
|
|
82
|
+
if (props.readOnly || props.disabled || newMode === mode) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
setMode(newMode);
|
|
86
|
+
if (newMode === 'relative') {
|
|
87
|
+
if ((!value && valueRelative) || value) {
|
|
88
|
+
setValue(valueRelative ? { type: 'relative', value: valueRelative } : null);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
else if ((!value && valueDate) || value) {
|
|
92
|
+
setValue(valueDate ? { type: 'absolute', value: valueDate } : null);
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
datePickerState,
|
|
96
|
+
dateFieldState,
|
|
97
|
+
relativeDateState,
|
|
98
|
+
selectedDate,
|
|
99
|
+
isActive,
|
|
100
|
+
setActive,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const i18n: (key: "Calendar" | "Formula input mode", params?: import("@gravity-ui/i18n").Params | undefined) => string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function useControlledState<T, C extends T = T>(value: T, defaultValue: T, onUpdate?: (value: C, ...args: any[]) => void): readonly [T, (newValue: C, ...args: any[]) => void];
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export function useControlledState(value, defaultValue, onUpdate) {
|
|
3
|
+
const [innerValue, setInnerValue] = React.useState(defaultValue);
|
|
4
|
+
const [wasControlled] = React.useState(value !== undefined);
|
|
5
|
+
const isControlled = value !== undefined;
|
|
6
|
+
if (wasControlled !== isControlled) {
|
|
7
|
+
console.warn(`WARN: A component changed from ${wasControlled ? 'controlled' : 'uncontrolled'} to ${isControlled ? 'controlled' : 'uncontrolled'}.`);
|
|
8
|
+
}
|
|
9
|
+
const currentValueRef = React.useRef(isControlled ? value : defaultValue);
|
|
10
|
+
React.useEffect(() => {
|
|
11
|
+
currentValueRef.current = value;
|
|
12
|
+
}, [value]);
|
|
13
|
+
const setState = React.useCallback((newValue, ...args) => {
|
|
14
|
+
if (!Object.is(currentValueRef.current, newValue)) {
|
|
15
|
+
onUpdate === null || onUpdate === void 0 ? void 0 : onUpdate(newValue, ...args);
|
|
16
|
+
}
|
|
17
|
+
if (!isControlled) {
|
|
18
|
+
currentValueRef.current = newValue;
|
|
19
|
+
setInnerValue(newValue);
|
|
20
|
+
}
|
|
21
|
+
}, [isControlled, onUpdate]);
|
|
22
|
+
return [isControlled ? value : innerValue, setState];
|
|
23
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { DateTime } from '@gravity-ui/date-utils';
|
|
2
|
+
import type { InputBase, Validation, ValueBase } from './inputs';
|
|
3
|
+
export interface DateFieldBase<T = DateTime> extends ValueBase<T, T | null>, InputBase, Validation {
|
|
4
|
+
/** The minimum allowed date that a user may select. */
|
|
5
|
+
minValue?: DateTime;
|
|
6
|
+
/** The maximum allowed date that a user may select. */
|
|
7
|
+
maxValue?: DateTime;
|
|
8
|
+
/** Callback that is called for each date of the calendar. If it returns true, then the date is unavailable. */
|
|
9
|
+
isDateUnavailable?: (date: DateTime) => boolean;
|
|
10
|
+
/** Format of the date when rendered in the input. [Available formats](https://day.js.org/docs/en/display/format) */
|
|
11
|
+
format?: string;
|
|
12
|
+
/** 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. */
|
|
13
|
+
placeholderValue?: DateTime;
|
|
14
|
+
/** */
|
|
15
|
+
timeZone?: string;
|
|
16
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
export interface KeyboardEvents {
|
|
3
|
+
/** Handler that is called when a key is pressed. */
|
|
4
|
+
onKeyDown?: (e: React.KeyboardEvent) => void;
|
|
5
|
+
/** Handler that is called when a key is released. */
|
|
6
|
+
onKeyUp?: (e: React.KeyboardEvent) => void;
|
|
7
|
+
}
|
|
8
|
+
export interface FocusEvents<Target = Element> {
|
|
9
|
+
/** Handler that is called when the element receives focus. */
|
|
10
|
+
onFocus?: (e: React.FocusEvent<Target>) => void;
|
|
11
|
+
/** Handler that is called when the element loses focus. */
|
|
12
|
+
onBlur?: (e: React.FocusEvent<Target>) => void;
|
|
13
|
+
}
|
|
14
|
+
export interface FocusableProps<Target = Element> extends FocusEvents<Target> {
|
|
15
|
+
/** Whether the element should receive focus on render. */
|
|
16
|
+
autoFocus?: boolean;
|
|
17
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import type { TextInputProps as TextInputBaseProps, TextInputPin, TextInputSize, TextInputView } from '@gravity-ui/uikit';
|
|
3
|
+
export type ValidationState = 'invalid';
|
|
4
|
+
export interface AccessibilityProps {
|
|
5
|
+
/** Defines a string value that labels the current element. */
|
|
6
|
+
'aria-label'?: string;
|
|
7
|
+
/** Identifies the element (or elements) that labels the current element. */
|
|
8
|
+
'aria-labelledby'?: string;
|
|
9
|
+
/** Identifies the element (or elements) that describes the object. */
|
|
10
|
+
'aria-describedby'?: string;
|
|
11
|
+
/** Identifies the element (or elements) that provide a detailed, extended description for the object. */
|
|
12
|
+
'aria-details'?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface ValueBase<T, C = T> {
|
|
15
|
+
/** The current value (controlled). */
|
|
16
|
+
value?: T | null;
|
|
17
|
+
/** The default value (uncontrolled). */
|
|
18
|
+
defaultValue?: T;
|
|
19
|
+
/** Handler that is called when the value changes. */
|
|
20
|
+
onUpdate?: (value: C) => void;
|
|
21
|
+
}
|
|
22
|
+
export interface Validation {
|
|
23
|
+
/** Whether the input should display its "invalid" visual styling */
|
|
24
|
+
validationState?: ValidationState;
|
|
25
|
+
/** An error message for the field */
|
|
26
|
+
errorMessage?: React.ReactNode;
|
|
27
|
+
}
|
|
28
|
+
export interface DomProps {
|
|
29
|
+
/** The element's unique identifier. */
|
|
30
|
+
id?: string;
|
|
31
|
+
}
|
|
32
|
+
export interface InputBase {
|
|
33
|
+
/**
|
|
34
|
+
* Whether the field is disabled.
|
|
35
|
+
* @default false
|
|
36
|
+
*/
|
|
37
|
+
disabled?: boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Whether the calendar value is immutable.
|
|
40
|
+
* @default false
|
|
41
|
+
*/
|
|
42
|
+
readOnly?: boolean;
|
|
43
|
+
}
|
|
44
|
+
export interface TextInputProps {
|
|
45
|
+
/** The size of the element */
|
|
46
|
+
size?: TextInputSize;
|
|
47
|
+
/**
|
|
48
|
+
* Corner rounding
|
|
49
|
+
* @default 'round-round'
|
|
50
|
+
*/
|
|
51
|
+
pin?: TextInputPin;
|
|
52
|
+
/** Control view */
|
|
53
|
+
view?: TextInputView;
|
|
54
|
+
/** Inner field label */
|
|
55
|
+
label?: TextInputBaseProps['label'];
|
|
56
|
+
/** Text that appears in the field when it has no value set */
|
|
57
|
+
placeholder?: string;
|
|
58
|
+
/**
|
|
59
|
+
* Show clear button
|
|
60
|
+
* @default false
|
|
61
|
+
*/
|
|
62
|
+
hasClear?: boolean;
|
|
63
|
+
}
|
|
64
|
+
export interface TextInputExtendProps {
|
|
65
|
+
/**
|
|
66
|
+
* User`s node rendered before label and input
|
|
67
|
+
*/
|
|
68
|
+
leftContent?: TextInputBaseProps['leftContent'];
|
|
69
|
+
/**
|
|
70
|
+
* User`s node rendered after input and clear button
|
|
71
|
+
*/
|
|
72
|
+
rightContent?: TextInputBaseProps['rightContent'];
|
|
73
|
+
}
|
|
74
|
+
export interface RangeValue<T> {
|
|
75
|
+
/** The start value of the range. */
|
|
76
|
+
start: T;
|
|
77
|
+
/** The end value of the range. */
|
|
78
|
+
end: T;
|
|
79
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
[key: string]: any;
|
|
3
|
+
}
|
|
4
|
+
type PropsArgs = Props | undefined | null;
|
|
5
|
+
type TupleTypes<T> = {
|
|
6
|
+
[P in keyof T]: T[P];
|
|
7
|
+
} extends {
|
|
8
|
+
[key: number]: infer V;
|
|
9
|
+
} ? NullToObject<V> : never;
|
|
10
|
+
type NullToObject<T> = T extends null | undefined ? {} : T;
|
|
11
|
+
type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
|
|
12
|
+
export declare function mergeProps<T extends PropsArgs[]>(...args: T): UnionToIntersection<TupleTypes<T>>;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export function mergeProps(...args) {
|
|
2
|
+
const result = Object.assign({}, args[0]);
|
|
3
|
+
for (let i = 1; i < args.length; i++) {
|
|
4
|
+
const props = args[i];
|
|
5
|
+
if (!props) {
|
|
6
|
+
continue;
|
|
7
|
+
}
|
|
8
|
+
for (const key of Object.keys(props)) {
|
|
9
|
+
const left = result[key];
|
|
10
|
+
const right = props[key];
|
|
11
|
+
if (typeof left === 'function' &&
|
|
12
|
+
typeof right === 'function' &&
|
|
13
|
+
key.startsWith('on') &&
|
|
14
|
+
key.charCodeAt(2) >= /* A */ 65 &&
|
|
15
|
+
key.charCodeAt(2) <= /* Z */ 90) {
|
|
16
|
+
result[key] = chain(left, right);
|
|
17
|
+
}
|
|
18
|
+
else if (key === 'className' &&
|
|
19
|
+
typeof left === 'string' &&
|
|
20
|
+
typeof right === 'string') {
|
|
21
|
+
result[key] = left + ' ' + right;
|
|
22
|
+
}
|
|
23
|
+
else if (key === 'controlProps' &&
|
|
24
|
+
typeof left === 'object' &&
|
|
25
|
+
typeof right === 'object') {
|
|
26
|
+
result[key] = mergeProps(left, right);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
result[key] = right === undefined ? left : right;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return result;
|
|
34
|
+
}
|
|
35
|
+
function chain(...fns) {
|
|
36
|
+
return (...args) => {
|
|
37
|
+
for (const callback of fns) {
|
|
38
|
+
if (typeof callback === 'function') {
|
|
39
|
+
callback(...args);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
}
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './components';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './components';
|
package/package.json
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@gravity-ui/date-components",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"main": "dist/cjs/index.js",
|
|
7
|
+
"module": "./dist/esm/index.js",
|
|
8
|
+
"types": "./dist/esm/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
"./package.json": "./package.json",
|
|
11
|
+
".": {
|
|
12
|
+
"types": "./dist/esm/index.d.js",
|
|
13
|
+
"import": "./dist/esm/index.js",
|
|
14
|
+
"default": "./dist/cjs/index.js"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"sideEffects": [
|
|
18
|
+
"*.css",
|
|
19
|
+
"*.scss"
|
|
20
|
+
],
|
|
21
|
+
"files": [
|
|
22
|
+
"dist"
|
|
23
|
+
],
|
|
24
|
+
"repository": {
|
|
25
|
+
"type": "git",
|
|
26
|
+
"url": "git+https://github.com/gravity-ui/date-components.git"
|
|
27
|
+
},
|
|
28
|
+
"bugs": {
|
|
29
|
+
"url": "https://github.com/gravity-ui/date-components/issues"
|
|
30
|
+
},
|
|
31
|
+
"homepage": "https://github.com/gravity-ui/date-components#readme",
|
|
32
|
+
"scripts": {
|
|
33
|
+
"prepare": "husky install",
|
|
34
|
+
"lint": "run-p lint:*",
|
|
35
|
+
"lint:js": "eslint --ext .js,.jsx,.ts,.tsx .",
|
|
36
|
+
"lint:styles": "stylelint 'src/**/*.scss'",
|
|
37
|
+
"lint:other": "npm run prettier -- --check",
|
|
38
|
+
"prettier": "prettier '**/*.{md,yaml,yml,json}'",
|
|
39
|
+
"typecheck": "tsc --noEmit",
|
|
40
|
+
"test": "jest",
|
|
41
|
+
"clean": "gulp clean",
|
|
42
|
+
"build": "gulp",
|
|
43
|
+
"start": "storybook dev",
|
|
44
|
+
"build-storybook": "storybook build -c .storybook -o storybook-static",
|
|
45
|
+
"prepublishOnly": "npm run build"
|
|
46
|
+
},
|
|
47
|
+
"dependencies": {
|
|
48
|
+
"@bem-react/classname": "^1.6.0",
|
|
49
|
+
"@gravity-ui/date-utils": "^1.4.1",
|
|
50
|
+
"@gravity-ui/icons": "^2.2.0"
|
|
51
|
+
},
|
|
52
|
+
"devDependencies": {
|
|
53
|
+
"@babel/preset-env": "^7.22.9",
|
|
54
|
+
"@babel/preset-react": "^7.22.5",
|
|
55
|
+
"@babel/preset-typescript": "^7.22.5",
|
|
56
|
+
"@commitlint/cli": "^17.6.7",
|
|
57
|
+
"@commitlint/config-conventional": "^17.6.7",
|
|
58
|
+
"@gravity-ui/eslint-config": "^2.1.1",
|
|
59
|
+
"@gravity-ui/prettier-config": "^1.0.1",
|
|
60
|
+
"@gravity-ui/stylelint-config": "^2.0.0",
|
|
61
|
+
"@gravity-ui/tsconfig": "^1.0.0",
|
|
62
|
+
"@gravity-ui/uikit": "^5.0.0",
|
|
63
|
+
"@storybook/addon-a11y": "^7.2.1",
|
|
64
|
+
"@storybook/addon-essentials": "^7.2.1",
|
|
65
|
+
"@storybook/api": "^7.2.1",
|
|
66
|
+
"@storybook/preset-scss": "^1.0.3",
|
|
67
|
+
"@storybook/react": "^7.2.1",
|
|
68
|
+
"@storybook/react-webpack5": "^7.2.1",
|
|
69
|
+
"@testing-library/jest-dom": "^5.17.0",
|
|
70
|
+
"@testing-library/react": "^14.0.0",
|
|
71
|
+
"@testing-library/user-event": "^14.4.3",
|
|
72
|
+
"@types/jest": "^29.5.3",
|
|
73
|
+
"@types/react": "^18.2.15",
|
|
74
|
+
"@types/react-dom": "^18.2.7",
|
|
75
|
+
"cross-env": "^7.0.3",
|
|
76
|
+
"eslint": "^8.45.0",
|
|
77
|
+
"eslint-plugin-testing-library": "^5.11.0",
|
|
78
|
+
"gulp": "^4.0.2",
|
|
79
|
+
"gulp-cli": "^2.3.0",
|
|
80
|
+
"gulp-dart-sass": "^1.1.0",
|
|
81
|
+
"gulp-replace": "^1.1.4",
|
|
82
|
+
"gulp-typescript": "^5.0.1",
|
|
83
|
+
"husky": "^8.0.3",
|
|
84
|
+
"jest": "^29.5.0",
|
|
85
|
+
"jest-environment-jsdom": "^29.5.0",
|
|
86
|
+
"jest-transform-css": "^6.0.1",
|
|
87
|
+
"nano-staged": "^0.8.0",
|
|
88
|
+
"npm-run-all": "^4.1.5",
|
|
89
|
+
"prettier": "^2.8.8",
|
|
90
|
+
"react": "^18.2.0",
|
|
91
|
+
"react-dom": "^18.2.0",
|
|
92
|
+
"sass": "^1.64.1",
|
|
93
|
+
"sass-loader": "^13.3.2",
|
|
94
|
+
"storybook": "^7.2.1",
|
|
95
|
+
"style-loader": "^3.3.3",
|
|
96
|
+
"stylelint": "^15.10.2",
|
|
97
|
+
"ts-jest": "^29.1.1",
|
|
98
|
+
"typescript": "^5.1.6"
|
|
99
|
+
},
|
|
100
|
+
"peerDependencies": {
|
|
101
|
+
"@gravity-ui/uikit": "^5.0.0",
|
|
102
|
+
"react": "^17.0.0 || ^18.0.0",
|
|
103
|
+
"react-dom": "^17.0.0 || ^18.0.0"
|
|
104
|
+
},
|
|
105
|
+
"overrides": {
|
|
106
|
+
"stylelint": "^15.10.2"
|
|
107
|
+
},
|
|
108
|
+
"nano-staged": {
|
|
109
|
+
"*.{scss}": [
|
|
110
|
+
"stylelint --fix --quiet"
|
|
111
|
+
],
|
|
112
|
+
"*.{js,jsx,ts,tsx}": [
|
|
113
|
+
"eslint --fix --quiet"
|
|
114
|
+
],
|
|
115
|
+
"*.{md,json,yml,yaml}": [
|
|
116
|
+
"prettier --write"
|
|
117
|
+
]
|
|
118
|
+
}
|
|
119
|
+
}
|