@gravity-ui/date-components 2.9.0 → 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/RelativeRangeDatePicker/RelativeRangeDatePicker.css +0 -34
- package/dist/cjs/components/RelativeRangeDatePicker/RelativeRangeDatePicker.d.ts +1 -30
- package/dist/cjs/components/RelativeRangeDatePicker/RelativeRangeDatePicker.js +16 -51
- 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/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/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 -52
- 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/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/package.json +1 -1
|
@@ -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,38 +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
|
-
readOnly: props.readOnly,
|
|
67
|
-
className: b('input', { mobile: isMobile }),
|
|
68
|
-
onClick: () => {
|
|
69
|
-
if (props.disabled) {
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
if (!open) {
|
|
73
|
-
setIsActive(true);
|
|
74
|
-
setOpen(true);
|
|
75
|
-
}
|
|
76
|
-
},
|
|
77
49
|
}, onKeyDown: (e) => {
|
|
78
50
|
if (props.disabled) {
|
|
79
51
|
return;
|
|
@@ -82,26 +54,19 @@ function RelativeRangeDatePicker(props) {
|
|
|
82
54
|
e.preventDefault();
|
|
83
55
|
setOpen(true);
|
|
84
56
|
}
|
|
57
|
+
}, onClickCalendar: () => {
|
|
58
|
+
setIsActive(true);
|
|
59
|
+
setOpen(!open);
|
|
85
60
|
}, onFocus: () => {
|
|
86
61
|
if (!isActive) {
|
|
87
62
|
setIsActive(true);
|
|
88
63
|
setOpen(true);
|
|
89
64
|
}
|
|
90
|
-
},
|
|
91
|
-
|
|
92
|
-
'
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
setIsActive(true);
|
|
96
|
-
setOpen(!open);
|
|
97
|
-
}, children: (0, jsx_runtime_1.jsx)(uikit_1.Icon, { data: icons_1.Calendar }) }) }), isMobile ? ((0, jsx_runtime_1.jsx)("button", { className: b('mobile-trigger', {
|
|
98
|
-
'has-clear': Boolean(props.hasClear && state.value),
|
|
99
|
-
'has-errors': state.isInvalid && props.errorPlacement === 'inside',
|
|
100
|
-
size: props.size,
|
|
101
|
-
}), onClick: () => {
|
|
102
|
-
setIsActive(true);
|
|
103
|
-
setOpen(true);
|
|
104
|
-
} })) : 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) => {
|
|
105
70
|
state.setValue(v.value, v.timeZone);
|
|
106
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: () => {
|
|
107
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`);
|
package/dist/cjs/components/RelativeRangeDatePicker/components/PickerDialog/PickerDialog.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { RelativeRangeDatePickerProps } from '../../RelativeRangeDatePicker';
|
|
2
1
|
import type { RelativeRangeDatePickerState } from '../../hooks/useRelativeRangeDatePickerState';
|
|
2
|
+
import type { RelativeRangeDatePickerProps } from '../../types';
|
|
3
3
|
import './PickerDialog.css';
|
|
4
4
|
export interface PickerDialogProps {
|
|
5
5
|
className?: string;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Value } from '../../../RelativeDatePicker';
|
|
2
|
-
import type { RelativeRangeDatePickerProps } from '../../RelativeRangeDatePicker';
|
|
3
2
|
import type { RelativeRangeDatePickerState } from '../../hooks/useRelativeRangeDatePickerState';
|
|
3
|
+
import type { RelativeRangeDatePickerProps } from '../../types';
|
|
4
4
|
export declare function useRelativeRangeDatePickerDialogState(state: RelativeRangeDatePickerState, props: RelativeRangeDatePickerProps): {
|
|
5
5
|
start: Value | null;
|
|
6
6
|
end: Value | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const i18n: (key: "\"From\"" | "\"From\" is required." | "\"To\"" | "\"To\" is required." | "\"From\" can't be after \"To\"." | "to"
|
|
1
|
+
export declare const i18n: (key: "\"From\"" | "\"From\" is required." | "\"To\"" | "\"To\" is required." | "\"From\" can't be after \"To\"." | "to", params?: import("@gravity-ui/i18n").Params | undefined) => string;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { DateTime } from '@gravity-ui/date-utils';
|
|
2
|
+
import type { Value } from '../RelativeDatePicker';
|
|
3
|
+
import type { AccessibilityProps, 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, RelativeRangeDatePickerValue } from './hooks/useRelativeRangeDatePickerState';
|
|
7
|
+
export type RelativeRangeDatePickerTriggerProps = Pick<React.InputHTMLAttributes<HTMLElement>, 'id' | 'role' | 'aria-controls' | 'aria-haspopup' | 'aria-expanded' | 'aria-label' | 'aria-labelledby' | 'aria-describedby' | 'aria-details' | 'onClick' | 'onKeyDown' | 'disabled' | 'readOnly'>;
|
|
8
|
+
export interface RelativeRangeDatePickerRenderControlProps {
|
|
9
|
+
ref: React.Ref<HTMLElement>;
|
|
10
|
+
value: RelativeRangeDatePickerValue | null;
|
|
11
|
+
title: string;
|
|
12
|
+
errorMessage?: React.ReactNode;
|
|
13
|
+
validationState?: 'invalid';
|
|
14
|
+
open: boolean;
|
|
15
|
+
triggerProps: RelativeRangeDatePickerTriggerProps;
|
|
16
|
+
}
|
|
17
|
+
export interface RelativeRangeDatePickerProps extends RelativeRangeDatePickerStateOptions, DomProps, AccessibilityProps, InputBase, InputDOMProps, TextInputProps, Validation, FocusableProps, StyleProps {
|
|
18
|
+
/** Format of the date when rendered in the input. [Available formats](https://day.js.org/docs/en/display/format) */
|
|
19
|
+
format?: string;
|
|
20
|
+
/** 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. */
|
|
21
|
+
placeholderValue?: DateTime;
|
|
22
|
+
/** Apply changes with button */
|
|
23
|
+
withApplyButton?: boolean;
|
|
24
|
+
/** Show time zone selector */
|
|
25
|
+
withZonesList?: boolean;
|
|
26
|
+
/** Show relative range presets */
|
|
27
|
+
withPresets?: boolean;
|
|
28
|
+
/** Custom preset tabs */
|
|
29
|
+
presetTabs?: PresetTab[];
|
|
30
|
+
/** Custom docs for presets, if empty array docs will be hidden */
|
|
31
|
+
docs?: Preset[];
|
|
32
|
+
/** Show selected relative values as absolute dates */
|
|
33
|
+
alwaysShowAsAbsolute?: boolean;
|
|
34
|
+
/** */
|
|
35
|
+
getRangeTitle?: (value: RangeValue<Value | null> | null, timeZone: string) => string;
|
|
36
|
+
/** Sets the CSS className for the popup element. */
|
|
37
|
+
popupClassName?: string;
|
|
38
|
+
/** Handler that is called when the popup's open state changes. */
|
|
39
|
+
onOpenChange?: (open: boolean) => void;
|
|
40
|
+
/** Used to render control. */
|
|
41
|
+
renderControl?: (props: RelativeRangeDatePickerRenderControlProps) => React.ReactElement;
|
|
42
|
+
}
|
|
@@ -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;
|
|
@@ -1,19 +1,15 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import React from 'react';
|
|
4
|
-
import {
|
|
5
|
-
import { Button, Icon, TextInput, useControlledState, useFocusWithin, useMobile, } from '@gravity-ui/uikit';
|
|
4
|
+
import { useControlledState, useFocusWithin, useMobile } from '@gravity-ui/uikit';
|
|
6
5
|
import { block } from '../../utils/cn';
|
|
7
6
|
import { HiddenInput } from '../HiddenInput/HiddenInput';
|
|
8
|
-
import {
|
|
7
|
+
import { Control } from './components/Control/Control';
|
|
9
8
|
import { PickerDialog } from './components/PickerDialog/PickerDialog';
|
|
10
9
|
import { useRelativeRangeDatePickerState } from './hooks/useRelativeRangeDatePickerState';
|
|
11
|
-
import { i18n } from './i18n';
|
|
12
|
-
import { getDefaultTitle } from './utils';
|
|
13
10
|
import './RelativeRangeDatePicker.css';
|
|
14
11
|
const b = block('relative-range-date-picker');
|
|
15
12
|
export function RelativeRangeDatePicker(props) {
|
|
16
|
-
var _a;
|
|
17
13
|
const state = useRelativeRangeDatePickerState(props);
|
|
18
14
|
const isMobile = useMobile();
|
|
19
15
|
const anchorRef = React.useRef(null);
|
|
@@ -36,38 +32,14 @@ export function RelativeRangeDatePicker(props) {
|
|
|
36
32
|
}
|
|
37
33
|
},
|
|
38
34
|
});
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
alwaysShowAsAbsolute: alwaysShowAsAbsolute,
|
|
47
|
-
format,
|
|
48
|
-
presets: presetTabs === null || presetTabs === void 0 ? void 0 : presetTabs.flatMap(({ presets }) => presets),
|
|
49
|
-
}), [alwaysShowAsAbsolute, format, getRangeTitle, presetTabs, state.timeZone, state.value]);
|
|
50
|
-
const validationState = props.validationState || (state.isInvalid ? 'invalid' : undefined);
|
|
51
|
-
const errorMessage = (_a = props.errorMessage) !== null && _a !== void 0 ? _a : state.errors.join('\n');
|
|
52
|
-
return (_jsxs("div", Object.assign({ ref: anchorRef }, focusWithinProps, { className: b(null, props.className), style: props.style, children: [_jsx(TextInput, { id: props.id, autoFocus: props.autoFocus, controlRef: inputRef, value: text, placeholder: props.placeholder, onUpdate: (v) => {
|
|
53
|
-
if (!props.readOnly && !v) {
|
|
54
|
-
state.setValue(null, 'default');
|
|
35
|
+
return (_jsxs("div", Object.assign({ ref: anchorRef }, focusWithinProps, { className: b(null, props.className), style: props.style, children: [_jsx(Control, { props: props, state: state, open: open, isMobile: isMobile, ref: inputRef, onClick: () => {
|
|
36
|
+
if (props.disabled) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
if (!open) {
|
|
40
|
+
setIsActive(true);
|
|
41
|
+
setOpen(true);
|
|
55
42
|
}
|
|
56
|
-
}, controlProps: {
|
|
57
|
-
role: 'combobox',
|
|
58
|
-
'aria-expanded': open,
|
|
59
|
-
disabled: isMobile,
|
|
60
|
-
readOnly: props.readOnly,
|
|
61
|
-
className: b('input', { mobile: isMobile }),
|
|
62
|
-
onClick: () => {
|
|
63
|
-
if (props.disabled) {
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
if (!open) {
|
|
67
|
-
setIsActive(true);
|
|
68
|
-
setOpen(true);
|
|
69
|
-
}
|
|
70
|
-
},
|
|
71
43
|
}, onKeyDown: (e) => {
|
|
72
44
|
if (props.disabled) {
|
|
73
45
|
return;
|
|
@@ -76,26 +48,19 @@ export function RelativeRangeDatePicker(props) {
|
|
|
76
48
|
e.preventDefault();
|
|
77
49
|
setOpen(true);
|
|
78
50
|
}
|
|
51
|
+
}, onClickCalendar: () => {
|
|
52
|
+
setIsActive(true);
|
|
53
|
+
setOpen(!open);
|
|
79
54
|
}, onFocus: () => {
|
|
80
55
|
if (!isActive) {
|
|
81
56
|
setIsActive(true);
|
|
82
57
|
setOpen(true);
|
|
83
58
|
}
|
|
84
|
-
},
|
|
85
|
-
|
|
86
|
-
'
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
setIsActive(true);
|
|
90
|
-
setOpen(!open);
|
|
91
|
-
}, children: _jsx(Icon, { data: CalendarIcon }) }) }), isMobile ? (_jsx("button", { className: b('mobile-trigger', {
|
|
92
|
-
'has-clear': Boolean(props.hasClear && state.value),
|
|
93
|
-
'has-errors': state.isInvalid && props.errorPlacement === 'inside',
|
|
94
|
-
size: props.size,
|
|
95
|
-
}), onClick: () => {
|
|
96
|
-
setIsActive(true);
|
|
97
|
-
setOpen(true);
|
|
98
|
-
} })) : null, _jsx(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 }), _jsx(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 }), _jsx(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 }), _jsx(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 }), _jsx(HiddenInput, { name: props.name, form: props.form, onReset: (v) => {
|
|
59
|
+
}, onUpdate: (v) => {
|
|
60
|
+
if (!props.readOnly && !v) {
|
|
61
|
+
state.setValue(null, 'default');
|
|
62
|
+
}
|
|
63
|
+
} }), _jsx(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 }), _jsx(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 }), _jsx(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 }), _jsx(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 }), _jsx(HiddenInput, { name: props.name, form: props.form, onReset: (v) => {
|
|
99
64
|
state.setValue(v.value, v.timeZone);
|
|
100
65
|
}, value: { value: state.value, timeZone: state.timeZone }, toStringValue: (v) => v.timeZone, disabled: props.disabled }), _jsx(PickerDialog, { state: state, props: props, open: open, onClose: () => {
|
|
101
66
|
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,58 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { Calendar as CalendarIcon } from '@gravity-ui/icons';
|
|
4
|
+
import { Button, Icon, TextInput } from '@gravity-ui/uikit';
|
|
5
|
+
import { block } from '../../../../utils/cn';
|
|
6
|
+
import { getButtonSizeForInput } from '../../../utils/getButtonSizeForInput';
|
|
7
|
+
import { getDefaultTitle } from '../../utils';
|
|
8
|
+
import { i18n } from './i18n';
|
|
9
|
+
import './Control.css';
|
|
10
|
+
const b = block('relative-range-date-picker-control');
|
|
11
|
+
export const Control = React.forwardRef(({ props, state, open, isMobile, onClick, onKeyDown, onFocus, onClickCalendar, onUpdate }, ref) => {
|
|
12
|
+
var _a;
|
|
13
|
+
const { alwaysShowAsAbsolute, presetTabs, getRangeTitle } = props;
|
|
14
|
+
const format = props.format || 'L';
|
|
15
|
+
const text = React.useMemo(() => typeof getRangeTitle === 'function'
|
|
16
|
+
? getRangeTitle(state.value, state.timeZone)
|
|
17
|
+
: getDefaultTitle({
|
|
18
|
+
value: state.value,
|
|
19
|
+
timeZone: state.timeZone,
|
|
20
|
+
alwaysShowAsAbsolute,
|
|
21
|
+
format,
|
|
22
|
+
presets: presetTabs === null || presetTabs === void 0 ? void 0 : presetTabs.flatMap(({ presets }) => presets),
|
|
23
|
+
}), [alwaysShowAsAbsolute, format, getRangeTitle, presetTabs, state.timeZone, state.value]);
|
|
24
|
+
const validationState = props.validationState || (state.isInvalid ? 'invalid' : undefined);
|
|
25
|
+
const errorMessage = (_a = props.errorMessage) !== null && _a !== void 0 ? _a : state.errors.join('\n');
|
|
26
|
+
const triggerProps = {
|
|
27
|
+
id: props.id,
|
|
28
|
+
role: 'combobox',
|
|
29
|
+
'aria-haspopup': 'dialog',
|
|
30
|
+
'aria-expanded': open,
|
|
31
|
+
'aria-label': props['aria-label'],
|
|
32
|
+
'aria-labelledby': props['aria-labelledby'],
|
|
33
|
+
'aria-describedby': props['aria-describedby'],
|
|
34
|
+
'aria-details': props['aria-details'],
|
|
35
|
+
disabled: props.disabled,
|
|
36
|
+
readOnly: props.readOnly,
|
|
37
|
+
onClick: onClickCalendar,
|
|
38
|
+
onKeyDown,
|
|
39
|
+
};
|
|
40
|
+
return props.renderControl ? (props.renderControl({
|
|
41
|
+
ref,
|
|
42
|
+
value: state.value,
|
|
43
|
+
title: text,
|
|
44
|
+
validationState,
|
|
45
|
+
errorMessage,
|
|
46
|
+
open,
|
|
47
|
+
triggerProps,
|
|
48
|
+
})) : (_jsxs(React.Fragment, { children: [_jsx(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: _jsx(Button, { view: "flat-secondary", size: getButtonSizeForInput(props.size), disabled: props.disabled, extraProps: {
|
|
49
|
+
'aria-haspopup': 'dialog',
|
|
50
|
+
'aria-expanded': open,
|
|
51
|
+
'aria-label': i18n('Range date picker'),
|
|
52
|
+
}, onClick: onClickCalendar, children: _jsx(Icon, { data: CalendarIcon }) }) }), isMobile ? (_jsx("button", { className: b('mobile-trigger', {
|
|
53
|
+
'has-clear': Boolean(props.hasClear && state.value),
|
|
54
|
+
'has-errors': state.isInvalid && props.errorPlacement === 'inside',
|
|
55
|
+
size: props.size,
|
|
56
|
+
}), onClick: onClick })) : null] }));
|
|
57
|
+
});
|
|
58
|
+
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,5 @@
|
|
|
1
|
+
import { addComponentKeysets } from '@gravity-ui/uikit/i18n';
|
|
2
|
+
import { NAMESPACE } from '../../../../../utils/cn';
|
|
3
|
+
import en from './en.json';
|
|
4
|
+
import ru from './ru.json';
|
|
5
|
+
export const i18n = addComponentKeysets({ en, ru }, `${NAMESPACE}relative-range-date-picker-control`);
|
package/dist/esm/components/RelativeRangeDatePicker/components/PickerDialog/PickerDialog.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { RelativeRangeDatePickerProps } from '../../RelativeRangeDatePicker';
|
|
2
1
|
import type { RelativeRangeDatePickerState } from '../../hooks/useRelativeRangeDatePickerState';
|
|
2
|
+
import type { RelativeRangeDatePickerProps } from '../../types';
|
|
3
3
|
import './PickerDialog.css';
|
|
4
4
|
export interface PickerDialogProps {
|
|
5
5
|
className?: string;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Value } from '../../../RelativeDatePicker';
|
|
2
|
-
import type { RelativeRangeDatePickerProps } from '../../RelativeRangeDatePicker';
|
|
3
2
|
import type { RelativeRangeDatePickerState } from '../../hooks/useRelativeRangeDatePickerState';
|
|
3
|
+
import type { RelativeRangeDatePickerProps } from '../../types';
|
|
4
4
|
export declare function useRelativeRangeDatePickerDialogState(state: RelativeRangeDatePickerState, props: RelativeRangeDatePickerProps): {
|
|
5
5
|
start: Value | null;
|
|
6
6
|
end: Value | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const i18n: (key: "\"From\"" | "\"From\" is required." | "\"To\"" | "\"To\" is required." | "\"From\" can't be after \"To\"." | "to"
|
|
1
|
+
export declare const i18n: (key: "\"From\"" | "\"From\" is required." | "\"To\"" | "\"To\" is required." | "\"From\" can't be after \"To\"." | "to", params?: import("@gravity-ui/i18n").Params | undefined) => string;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { DateTime } from '@gravity-ui/date-utils';
|
|
2
|
+
import type { Value } from '../RelativeDatePicker';
|
|
3
|
+
import type { AccessibilityProps, 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, RelativeRangeDatePickerValue } from './hooks/useRelativeRangeDatePickerState';
|
|
7
|
+
export type RelativeRangeDatePickerTriggerProps = Pick<React.InputHTMLAttributes<HTMLElement>, 'id' | 'role' | 'aria-controls' | 'aria-haspopup' | 'aria-expanded' | 'aria-label' | 'aria-labelledby' | 'aria-describedby' | 'aria-details' | 'onClick' | 'onKeyDown' | 'disabled' | 'readOnly'>;
|
|
8
|
+
export interface RelativeRangeDatePickerRenderControlProps {
|
|
9
|
+
ref: React.Ref<HTMLElement>;
|
|
10
|
+
value: RelativeRangeDatePickerValue | null;
|
|
11
|
+
title: string;
|
|
12
|
+
errorMessage?: React.ReactNode;
|
|
13
|
+
validationState?: 'invalid';
|
|
14
|
+
open: boolean;
|
|
15
|
+
triggerProps: RelativeRangeDatePickerTriggerProps;
|
|
16
|
+
}
|
|
17
|
+
export interface RelativeRangeDatePickerProps extends RelativeRangeDatePickerStateOptions, DomProps, AccessibilityProps, InputBase, InputDOMProps, TextInputProps, Validation, FocusableProps, StyleProps {
|
|
18
|
+
/** Format of the date when rendered in the input. [Available formats](https://day.js.org/docs/en/display/format) */
|
|
19
|
+
format?: string;
|
|
20
|
+
/** 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. */
|
|
21
|
+
placeholderValue?: DateTime;
|
|
22
|
+
/** Apply changes with button */
|
|
23
|
+
withApplyButton?: boolean;
|
|
24
|
+
/** Show time zone selector */
|
|
25
|
+
withZonesList?: boolean;
|
|
26
|
+
/** Show relative range presets */
|
|
27
|
+
withPresets?: boolean;
|
|
28
|
+
/** Custom preset tabs */
|
|
29
|
+
presetTabs?: PresetTab[];
|
|
30
|
+
/** Custom docs for presets, if empty array docs will be hidden */
|
|
31
|
+
docs?: Preset[];
|
|
32
|
+
/** Show selected relative values as absolute dates */
|
|
33
|
+
alwaysShowAsAbsolute?: boolean;
|
|
34
|
+
/** */
|
|
35
|
+
getRangeTitle?: (value: RangeValue<Value | null> | null, timeZone: string) => string;
|
|
36
|
+
/** Sets the CSS className for the popup element. */
|
|
37
|
+
popupClassName?: string;
|
|
38
|
+
/** Handler that is called when the popup's open state changes. */
|
|
39
|
+
onOpenChange?: (open: boolean) => void;
|
|
40
|
+
/** Used to render control. */
|
|
41
|
+
renderControl?: (props: RelativeRangeDatePickerRenderControlProps) => React.ReactElement;
|
|
42
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|