@snack-uikit/chips 0.17.0 → 0.19.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/CHANGELOG.md +28 -0
- package/README.md +22 -1
- package/dist/cjs/components/ChipChoice/components/ChipChoiceBase/styles.module.css +6 -6
- package/dist/cjs/components/ChipChoice/components/ChipChoiceDate.d.ts +9 -2
- package/dist/cjs/components/ChipChoice/components/ChipChoiceDate.js +46 -10
- package/dist/cjs/components/ChipChoice/components/ChipChoiceDateRange.js +2 -1
- package/dist/cjs/components/ChipChoice/components/ChipChoiceTime.d.ts +12 -0
- package/dist/cjs/components/ChipChoice/components/ChipChoiceTime.js +123 -0
- package/dist/cjs/components/ChipChoice/components/index.d.ts +1 -0
- package/dist/cjs/components/ChipChoice/components/index.js +2 -1
- package/dist/cjs/components/ChipChoice/constants.d.ts +4 -1
- package/dist/cjs/components/ChipChoice/constants.js +10 -2
- package/dist/cjs/components/ChipChoice/index.d.ts +3 -2
- package/dist/cjs/components/ChipChoice/index.js +1 -0
- package/dist/cjs/components/ChipChoiceRow/components/constants.d.ts +1 -0
- package/dist/cjs/components/ChipChoiceRow/components/constants.js +1 -0
- package/dist/cjs/components/ChipChoiceRow/types.d.ts +7 -1
- package/dist/esm/components/ChipChoice/components/ChipChoiceBase/styles.module.css +6 -6
- package/dist/esm/components/ChipChoice/components/ChipChoiceDate.d.ts +9 -2
- package/dist/esm/components/ChipChoice/components/ChipChoiceDate.js +35 -10
- package/dist/esm/components/ChipChoice/components/ChipChoiceDateRange.js +3 -3
- package/dist/esm/components/ChipChoice/components/ChipChoiceTime.d.ts +12 -0
- package/dist/esm/components/ChipChoice/components/ChipChoiceTime.js +64 -0
- package/dist/esm/components/ChipChoice/components/index.d.ts +1 -0
- package/dist/esm/components/ChipChoice/components/index.js +1 -0
- package/dist/esm/components/ChipChoice/constants.d.ts +4 -1
- package/dist/esm/components/ChipChoice/constants.js +8 -0
- package/dist/esm/components/ChipChoice/index.d.ts +3 -2
- package/dist/esm/components/ChipChoice/index.js +2 -1
- package/dist/esm/components/ChipChoiceRow/components/constants.d.ts +1 -0
- package/dist/esm/components/ChipChoiceRow/components/constants.js +1 -0
- package/dist/esm/components/ChipChoiceRow/types.d.ts +7 -1
- package/package.json +8 -8
- package/src/components/ChipAssist/styles.module.scss +29 -30
- package/src/components/ChipChoice/components/ChipChoiceBase/styles.module.scss +23 -40
- package/src/components/ChipChoice/components/ChipChoiceDate.tsx +62 -12
- package/src/components/ChipChoice/components/ChipChoiceDateRange.tsx +3 -2
- package/src/components/ChipChoice/components/ChipChoiceTime.tsx +125 -0
- package/src/components/ChipChoice/components/index.ts +1 -0
- package/src/components/ChipChoice/constants.ts +11 -1
- package/src/components/ChipChoice/index.ts +10 -1
- package/src/components/ChipChoice/styles.module.scss +32 -31
- package/src/components/ChipChoiceRow/components/constants.ts +1 -0
- package/src/components/ChipChoiceRow/styles.module.scss +2 -2
- package/src/components/ChipChoiceRow/types.ts +5 -0
- package/src/components/ChipToggle/styles.module.scss +45 -46
- package/src/helperComponents/ButtonClearValue/styles.module.scss +14 -14
- package/src/styles.module.scss +11 -11
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,34 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# 0.19.0 (2024-10-31)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
* **PDS-438:** add ChipChoiceTime ([805b98a](https://github.com/cloud-ru-tech/snack-uikit/commit/805b98a2927ff0b38b704cae8f7b0beef3369469))
|
|
12
|
+
* **PDS-438:** chip-choice - hide day in mode=month, add mode=date-time ([3108090](https://github.com/cloud-ru-tech/snack-uikit/commit/310809000629677374ded8280e73249eabe6410e))
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
### BREAKING CHANGES
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
* **PDS-438:** add showSeconds prop, remove locale prop ([0235eb7](https://github.com/cloud-ru-tech/snack-uikit/commit/0235eb7a5a7f7d8ac5e4e7cb03fe6e2408682b54))
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
# 0.18.0 (2024-10-28)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
### Features
|
|
27
|
+
|
|
28
|
+
* **FF-5782:** sass use/forward approach ([3e53869](https://github.com/cloud-ru-tech/snack-uikit/commit/3e53869ace864a7718e434b7f410c15dbd911cd5))
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
|
|
6
34
|
# 0.17.0 (2024-10-28)
|
|
7
35
|
|
|
8
36
|
|
package/README.md
CHANGED
|
@@ -221,7 +221,8 @@ import { PlaceholderSVG } from '@snack-uikit/icons';
|
|
|
221
221
|
| defaultValue | `Date` | - | Значение компонента по-умолчанию |
|
|
222
222
|
| onChange | `(value: Date) => void` | - | Колбек смены значения |
|
|
223
223
|
| valueRender | `(value?: Date) => ReactNode` | - | Колбек формирующий строковое представление выбранного значения. Принимает выбранное значение |
|
|
224
|
-
| mode | "date" \| "month" | - | |
|
|
224
|
+
| mode | "date" \| "month" \| "date-time" | - | |
|
|
225
|
+
| showSeconds | `boolean` | - | |
|
|
225
226
|
## ChipChoice.DateRange
|
|
226
227
|
### Props
|
|
227
228
|
| name | type | default value | description |
|
|
@@ -242,6 +243,26 @@ import { PlaceholderSVG } from '@snack-uikit/icons';
|
|
|
242
243
|
| defaultValue | `Range` | - | Значение компонента по умолчанию |
|
|
243
244
|
| onChange | `(value: Range) => void` | - | Колбек смены значения |
|
|
244
245
|
| valueRender | `(value?: Range) => ReactNode` | - | Колбек формирующий строковое представление выбранного значения. Принимает массив выбранных значений |
|
|
246
|
+
## ChipChoice.Time
|
|
247
|
+
### Props
|
|
248
|
+
| name | type | default value | description |
|
|
249
|
+
|------|------|---------------|-------------|
|
|
250
|
+
| label | `string` | - | Лейбл |
|
|
251
|
+
| disabled | `boolean` | - | Деактивирован ли компонент |
|
|
252
|
+
| loading | `boolean` | - | Состояние загрузки |
|
|
253
|
+
| icon | `ReactElement<any, string \| JSXElementConstructor<any>>` | - | Иконка |
|
|
254
|
+
| className | `string` | - | CSS-класс |
|
|
255
|
+
| tabIndex | `number` | - | HTML tab index |
|
|
256
|
+
| size | enum Size: `"xs"`, `"s"`, `"m"`, `"l"` | - | Размер |
|
|
257
|
+
| onClick | `MouseEventHandler<HTMLButtonElement \| HTMLDivElement>` | - | Колбек обработки клика |
|
|
258
|
+
| showClearButton | `boolean` | true | Отображение кнопки очистки значения |
|
|
259
|
+
| placement | enum Placement: `"left"`, `"left-start"`, `"left-end"`, `"right"`, `"right-start"`, `"right-end"`, `"top"`, `"top-start"`, `"top-end"`, `"bottom"`, `"bottom-start"`, `"bottom-end"` | - | Расположение выпадающего меню |
|
|
260
|
+
| dropDownClassName | `string` | - | |
|
|
261
|
+
| value | `TimeValue` | - | Выбранное значение. |
|
|
262
|
+
| defaultValue | `TimeValue` | - | Значение по-умолчанию для uncontrolled. |
|
|
263
|
+
| showSeconds | `boolean` | - | Показывать ли секунды |
|
|
264
|
+
| onChange | `(value: TimeValue) => void` | - | Колбек смены значения |
|
|
265
|
+
| valueRender | `(value?: TimeValue) => ReactNode` | - | Колбек формирующий строковое представление выбранного значения. Принимает выбранное значение |
|
|
245
266
|
## isAccordionOption
|
|
246
267
|
### Props
|
|
247
268
|
| name | type | default value | description |
|
|
@@ -290,12 +290,12 @@
|
|
|
290
290
|
border-width:var(--border-width-chips-single, 1px);
|
|
291
291
|
}
|
|
292
292
|
.choiceChip[data-size=m] .label{
|
|
293
|
-
font-family:var(--
|
|
294
|
-
font-weight:var(--
|
|
295
|
-
line-height:var(--
|
|
296
|
-
font-size:var(--
|
|
297
|
-
letter-spacing:var(--
|
|
298
|
-
paragraph-spacing:var(--
|
|
293
|
+
font-family:var(--sans-label-l-font-family, SB Sans Interface);
|
|
294
|
+
font-weight:var(--sans-label-l-font-weight, Semibold);
|
|
295
|
+
line-height:var(--sans-label-l-line-height, 20px);
|
|
296
|
+
font-size:var(--sans-label-l-font-size, 14px);
|
|
297
|
+
letter-spacing:var(--sans-label-l-letter-spacing, 0px);
|
|
298
|
+
paragraph-spacing:var(--sans-label-l-paragraph-spacing, 7.7px);
|
|
299
299
|
}
|
|
300
300
|
.choiceChip[data-size=m] .labelLayout{
|
|
301
301
|
padding-left:var(--space-chips-label-layout-padding-m, 8px);
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { ReactNode } from 'react';
|
|
2
2
|
import { CalendarProps } from '@snack-uikit/calendar';
|
|
3
3
|
import { ChipChoiceCommonProps } from '../types';
|
|
4
|
+
type ChipChoiceDateWithSeconds = {
|
|
5
|
+
mode?: 'date-time';
|
|
6
|
+
showSeconds?: boolean;
|
|
7
|
+
};
|
|
4
8
|
export type ChipChoiceDateProps = ChipChoiceCommonProps & {
|
|
5
9
|
/** Значение компонента */
|
|
6
10
|
value?: Date;
|
|
@@ -11,5 +15,8 @@ export type ChipChoiceDateProps = ChipChoiceCommonProps & {
|
|
|
11
15
|
/** Колбек формирующий строковое представление выбранного значения. Принимает выбранное значение */
|
|
12
16
|
valueRender?(value?: Date): ReactNode;
|
|
13
17
|
mode?: Exclude<CalendarProps['mode'], 'range'>;
|
|
14
|
-
}
|
|
15
|
-
|
|
18
|
+
} & (ChipChoiceDateWithSeconds | {
|
|
19
|
+
mode?: 'date' | 'month';
|
|
20
|
+
});
|
|
21
|
+
export declare function ChipChoiceDate({ size, value, defaultValue, onChange, valueRender, dropDownClassName, mode, placement, widthStrategy, ...rest }: ChipChoiceDateProps): import("react/jsx-runtime").JSX.Element;
|
|
22
|
+
export {};
|
|
@@ -23,6 +23,7 @@ const constants_2 = require("../constants");
|
|
|
23
23
|
const hooks_1 = require("../hooks");
|
|
24
24
|
const ChipChoiceBase_1 = require("./ChipChoiceBase");
|
|
25
25
|
function ChipChoiceDate(_a) {
|
|
26
|
+
var _b;
|
|
26
27
|
var {
|
|
27
28
|
size = constants_1.SIZE.S,
|
|
28
29
|
value,
|
|
@@ -30,14 +31,17 @@ function ChipChoiceDate(_a) {
|
|
|
30
31
|
onChange,
|
|
31
32
|
valueRender,
|
|
32
33
|
dropDownClassName,
|
|
33
|
-
mode = 'date'
|
|
34
|
+
mode = 'date',
|
|
35
|
+
placement,
|
|
36
|
+
widthStrategy
|
|
34
37
|
} = _a,
|
|
35
|
-
rest = __rest(_a, ["size", "value", "defaultValue", "onChange", "valueRender", "dropDownClassName", "mode"]);
|
|
38
|
+
rest = __rest(_a, ["size", "value", "defaultValue", "onChange", "valueRender", "dropDownClassName", "mode", "placement", "widthStrategy"]);
|
|
36
39
|
const [selectedValue, setSelectedValue] = (0, utils_1.useValueControl)({
|
|
37
40
|
value,
|
|
38
41
|
defaultValue,
|
|
39
42
|
onChange
|
|
40
43
|
});
|
|
44
|
+
const showSeconds = mode === 'date-time' ? (_b = rest.showSeconds) !== null && _b !== void 0 ? _b : true : undefined;
|
|
41
45
|
const localRef = (0, react_1.useRef)(null);
|
|
42
46
|
const [open, setOpen] = (0, react_1.useState)(false);
|
|
43
47
|
const handleOnKeyDown = (0, hooks_1.useHandleOnKeyDown)({
|
|
@@ -53,20 +57,52 @@ function ChipChoiceDate(_a) {
|
|
|
53
57
|
const {
|
|
54
58
|
t
|
|
55
59
|
} = (0, locale_1.useLocale)('Chips');
|
|
56
|
-
const valueToRender =
|
|
60
|
+
const valueToRender = (0, react_1.useMemo)(() => {
|
|
61
|
+
if (valueRender) {
|
|
62
|
+
return valueRender(selectedValue);
|
|
63
|
+
}
|
|
64
|
+
if (!selectedValue) return t('allLabel');
|
|
65
|
+
const date = new Date(selectedValue);
|
|
66
|
+
if (mode === 'date-time') {
|
|
67
|
+
return date.toLocaleString(constants_2.DEFAULT_LOCALE, {
|
|
68
|
+
year: 'numeric',
|
|
69
|
+
month: 'numeric',
|
|
70
|
+
day: 'numeric',
|
|
71
|
+
hour: '2-digit',
|
|
72
|
+
minute: '2-digit',
|
|
73
|
+
second: showSeconds ? '2-digit' : undefined
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
return date.toLocaleDateString(constants_2.DEFAULT_LOCALE, {
|
|
77
|
+
year: 'numeric',
|
|
78
|
+
month: 'numeric',
|
|
79
|
+
day: mode === 'date' ? 'numeric' : undefined
|
|
80
|
+
});
|
|
81
|
+
}, [mode, selectedValue, showSeconds, t, valueRender]);
|
|
57
82
|
const clearValue = () => setSelectedValue(undefined);
|
|
83
|
+
const handleChangeValue = (0, react_1.useCallback)(value => {
|
|
84
|
+
setSelectedValue(value);
|
|
85
|
+
closeDroplist();
|
|
86
|
+
}, [closeDroplist, setSelectedValue]);
|
|
87
|
+
const navigationStartRef = (0, react_1.useRef)(null);
|
|
88
|
+
const focusNavigationStartItem = () => setTimeout(() => {
|
|
89
|
+
var _a;
|
|
90
|
+
return (_a = navigationStartRef.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
91
|
+
}, 0);
|
|
58
92
|
return (0, jsx_runtime_1.jsx)(dropdown_1.Dropdown, {
|
|
59
93
|
content: (0, jsx_runtime_1.jsx)(calendar_1.Calendar, {
|
|
60
94
|
mode: mode,
|
|
61
95
|
size: constants_2.CALENDAR_SIZE_MAP[size],
|
|
62
96
|
value: selectedValue,
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
97
|
+
fitToContainer: false,
|
|
98
|
+
onChangeValue: handleChangeValue,
|
|
99
|
+
navigationStartRef: navigationStartRef,
|
|
100
|
+
onFocusLeave: closeDroplist,
|
|
101
|
+
showSeconds: showSeconds,
|
|
102
|
+
locale: constants_2.DEFAULT_LOCALE
|
|
69
103
|
}),
|
|
104
|
+
placement: placement,
|
|
105
|
+
widthStrategy: widthStrategy,
|
|
70
106
|
outsideClick: true,
|
|
71
107
|
triggerRef: localRef,
|
|
72
108
|
open: open,
|
|
@@ -79,7 +115,7 @@ function ChipChoiceDate(_a) {
|
|
|
79
115
|
value: selectedValue,
|
|
80
116
|
valueToRender: valueToRender,
|
|
81
117
|
size: size,
|
|
82
|
-
onKeyDown: handleOnKeyDown()
|
|
118
|
+
onKeyDown: handleOnKeyDown(focusNavigationStartItem)
|
|
83
119
|
}))
|
|
84
120
|
});
|
|
85
121
|
}
|
|
@@ -29,7 +29,7 @@ function defaultRangeFormatter(_ref) {
|
|
|
29
29
|
} = _ref;
|
|
30
30
|
if (!value || !value.length) return allLabel;
|
|
31
31
|
const [from, to] = value;
|
|
32
|
-
return `${from.toLocaleDateString()} ${constants_1.DEFAULT_EMPTY_VALUE} ${to.toLocaleDateString()}`;
|
|
32
|
+
return `${from.toLocaleDateString(constants_2.DEFAULT_LOCALE)} ${constants_1.DEFAULT_EMPTY_VALUE} ${to.toLocaleDateString(constants_2.DEFAULT_LOCALE)}`;
|
|
33
33
|
}
|
|
34
34
|
function ChipChoiceDateRange(_a) {
|
|
35
35
|
var {
|
|
@@ -71,6 +71,7 @@ function ChipChoiceDateRange(_a) {
|
|
|
71
71
|
setSelectedValue(value);
|
|
72
72
|
closeDroplist();
|
|
73
73
|
},
|
|
74
|
+
locale: constants_2.DEFAULT_LOCALE,
|
|
74
75
|
// bug with focus
|
|
75
76
|
// navigationStartRef={element => element?.focus()}
|
|
76
77
|
onFocusLeave: closeDroplist
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { TimePickerProps } from '@snack-uikit/calendar';
|
|
3
|
+
import { ChipChoiceCommonProps } from '../types';
|
|
4
|
+
type TimeValue = TimePickerProps['value'];
|
|
5
|
+
export type ChipChoiceTimeProps = Omit<ChipChoiceCommonProps, 'widthStrategy'> & Pick<TimePickerProps, 'value' | 'defaultValue' | 'showSeconds'> & {
|
|
6
|
+
/** Колбек смены значения */
|
|
7
|
+
onChange?(value: TimeValue): void;
|
|
8
|
+
/** Колбек формирующий строковое представление выбранного значения. Принимает выбранное значение */
|
|
9
|
+
valueRender?(value?: TimeValue): ReactNode;
|
|
10
|
+
};
|
|
11
|
+
export declare function ChipChoiceTime({ size, value, defaultValue, onChange, valueRender, dropDownClassName, showSeconds, placement, ...rest }: ChipChoiceTimeProps): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var __rest = void 0 && (void 0).__rest || function (s, e) {
|
|
4
|
+
var t = {};
|
|
5
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];
|
|
6
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
7
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", {
|
|
12
|
+
value: true
|
|
13
|
+
});
|
|
14
|
+
exports.ChipChoiceTime = ChipChoiceTime;
|
|
15
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
16
|
+
const react_1 = require("react");
|
|
17
|
+
const calendar_1 = require("@snack-uikit/calendar");
|
|
18
|
+
const dropdown_1 = require("@snack-uikit/dropdown");
|
|
19
|
+
const locale_1 = require("@snack-uikit/locale");
|
|
20
|
+
const utils_1 = require("@snack-uikit/utils");
|
|
21
|
+
const constants_1 = require("../../../constants");
|
|
22
|
+
const constants_2 = require("../constants");
|
|
23
|
+
const hooks_1 = require("../hooks");
|
|
24
|
+
const ChipChoiceBase_1 = require("./ChipChoiceBase");
|
|
25
|
+
const getStringTimeValue = (time, _ref) => {
|
|
26
|
+
let {
|
|
27
|
+
showSeconds,
|
|
28
|
+
locale
|
|
29
|
+
} = _ref;
|
|
30
|
+
var _a, _b, _c;
|
|
31
|
+
if (!time) {
|
|
32
|
+
return '';
|
|
33
|
+
}
|
|
34
|
+
const date = new Date();
|
|
35
|
+
date.setHours((_a = time.hours) !== null && _a !== void 0 ? _a : 0);
|
|
36
|
+
date.setMinutes((_b = time.minutes) !== null && _b !== void 0 ? _b : 0);
|
|
37
|
+
date.setSeconds((_c = time.seconds) !== null && _c !== void 0 ? _c : 0);
|
|
38
|
+
return date.toLocaleTimeString(locale, {
|
|
39
|
+
hour: 'numeric',
|
|
40
|
+
minute: 'numeric',
|
|
41
|
+
second: showSeconds ? 'numeric' : undefined
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
function ChipChoiceTime(_a) {
|
|
45
|
+
var {
|
|
46
|
+
size = constants_1.SIZE.S,
|
|
47
|
+
value,
|
|
48
|
+
defaultValue,
|
|
49
|
+
onChange,
|
|
50
|
+
valueRender,
|
|
51
|
+
dropDownClassName,
|
|
52
|
+
showSeconds = true,
|
|
53
|
+
placement
|
|
54
|
+
} = _a,
|
|
55
|
+
rest = __rest(_a, ["size", "value", "defaultValue", "onChange", "valueRender", "dropDownClassName", "showSeconds", "placement"]);
|
|
56
|
+
const [selectedValue, setSelectedValue] = (0, utils_1.useValueControl)({
|
|
57
|
+
value,
|
|
58
|
+
defaultValue,
|
|
59
|
+
onChange
|
|
60
|
+
});
|
|
61
|
+
const localRef = (0, react_1.useRef)(null);
|
|
62
|
+
const [open, setOpen] = (0, react_1.useState)(false);
|
|
63
|
+
const handleOnKeyDown = (0, hooks_1.useHandleOnKeyDown)({
|
|
64
|
+
setOpen
|
|
65
|
+
});
|
|
66
|
+
const closeDroplist = (0, react_1.useCallback)(() => {
|
|
67
|
+
setOpen(false);
|
|
68
|
+
setTimeout(() => {
|
|
69
|
+
var _a;
|
|
70
|
+
return (_a = localRef.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
71
|
+
}, 0);
|
|
72
|
+
}, []);
|
|
73
|
+
const {
|
|
74
|
+
t
|
|
75
|
+
} = (0, locale_1.useLocale)('Chips');
|
|
76
|
+
const valueToRender = (0, react_1.useMemo)(() => {
|
|
77
|
+
if (valueRender) {
|
|
78
|
+
return valueRender(selectedValue);
|
|
79
|
+
}
|
|
80
|
+
if (!selectedValue) return t('allLabel');
|
|
81
|
+
return getStringTimeValue(selectedValue, {
|
|
82
|
+
showSeconds,
|
|
83
|
+
locale: constants_2.DEFAULT_LOCALE
|
|
84
|
+
});
|
|
85
|
+
}, [selectedValue, showSeconds, t, valueRender]);
|
|
86
|
+
const clearValue = () => setSelectedValue(undefined);
|
|
87
|
+
const handleChangeValue = (0, react_1.useCallback)(value => {
|
|
88
|
+
setSelectedValue(value);
|
|
89
|
+
closeDroplist();
|
|
90
|
+
}, [closeDroplist, setSelectedValue]);
|
|
91
|
+
const navigationStartRef = (0, react_1.useRef)(null);
|
|
92
|
+
const focusNavigationStartItem = () => setTimeout(() => {
|
|
93
|
+
var _a;
|
|
94
|
+
return (_a = navigationStartRef.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
95
|
+
}, 0);
|
|
96
|
+
return (0, jsx_runtime_1.jsx)(dropdown_1.Dropdown, {
|
|
97
|
+
content: (0, jsx_runtime_1.jsx)(calendar_1.TimePicker, {
|
|
98
|
+
size: constants_2.TIME_PICKER_SIZE_MAP[size],
|
|
99
|
+
value: selectedValue,
|
|
100
|
+
fitToContainer: false,
|
|
101
|
+
onChangeValue: handleChangeValue,
|
|
102
|
+
navigationStartRef: navigationStartRef,
|
|
103
|
+
onFocusLeave: closeDroplist,
|
|
104
|
+
showSeconds: showSeconds
|
|
105
|
+
}),
|
|
106
|
+
placement: placement,
|
|
107
|
+
widthStrategy: 'auto',
|
|
108
|
+
outsideClick: true,
|
|
109
|
+
triggerRef: localRef,
|
|
110
|
+
open: open,
|
|
111
|
+
onOpenChange: setOpen,
|
|
112
|
+
className: dropDownClassName,
|
|
113
|
+
"data-test-id": constants_1.CHIP_CHOICE_TEST_IDS.droplist,
|
|
114
|
+
children: (0, jsx_runtime_1.jsx)(ChipChoiceBase_1.ChipChoiceBase, Object.assign({}, rest, {
|
|
115
|
+
ref: localRef,
|
|
116
|
+
onClearButtonClick: clearValue,
|
|
117
|
+
value: selectedValue,
|
|
118
|
+
valueToRender: valueToRender,
|
|
119
|
+
size: size,
|
|
120
|
+
onKeyDown: handleOnKeyDown(focusNavigationStartItem)
|
|
121
|
+
}))
|
|
122
|
+
});
|
|
123
|
+
}
|
|
@@ -26,4 +26,5 @@ __exportStar(require("./ChipChoiceCustom"), exports);
|
|
|
26
26
|
__exportStar(require("./ChipChoiceSingle"), exports);
|
|
27
27
|
__exportStar(require("./ChipChoiceMultiple"), exports);
|
|
28
28
|
__exportStar(require("./ChipChoiceDate"), exports);
|
|
29
|
-
__exportStar(require("./ChipChoiceDateRange"), exports);
|
|
29
|
+
__exportStar(require("./ChipChoiceDateRange"), exports);
|
|
30
|
+
__exportStar(require("./ChipChoiceTime"), exports);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CalendarProps } from '@snack-uikit/calendar';
|
|
1
|
+
import { CalendarProps, TimePickerProps } from '@snack-uikit/calendar';
|
|
2
2
|
import { DroplistProps } from '@snack-uikit/list';
|
|
3
3
|
import { Size } from '../../types';
|
|
4
4
|
export declare const BUTTON_CLEAR_VALUE_SIZE_MAP: {
|
|
@@ -8,11 +8,14 @@ export declare const BUTTON_CLEAR_VALUE_SIZE_MAP: {
|
|
|
8
8
|
l: "xs";
|
|
9
9
|
};
|
|
10
10
|
export declare const CALENDAR_SIZE_MAP: Record<Size, CalendarProps['size']>;
|
|
11
|
+
export declare const TIME_PICKER_SIZE_MAP: Record<Size, TimePickerProps['size']>;
|
|
11
12
|
export declare const DROPLIST_SIZE_MAP: Record<Size, DroplistProps['size']>;
|
|
12
13
|
export declare const CHIP_CHOICE_TYPE: {
|
|
13
14
|
readonly Multiple: "multiple";
|
|
14
15
|
readonly Date: "date";
|
|
16
|
+
readonly DateTime: "date-time";
|
|
15
17
|
readonly DateRange: "date-range";
|
|
16
18
|
readonly Single: "single";
|
|
17
19
|
readonly Custom: "custom";
|
|
18
20
|
};
|
|
21
|
+
export declare const DEFAULT_LOCALE: Intl.Locale;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.CHIP_CHOICE_TYPE = exports.DROPLIST_SIZE_MAP = exports.CALENDAR_SIZE_MAP = exports.BUTTON_CLEAR_VALUE_SIZE_MAP = void 0;
|
|
6
|
+
exports.DEFAULT_LOCALE = exports.CHIP_CHOICE_TYPE = exports.DROPLIST_SIZE_MAP = exports.TIME_PICKER_SIZE_MAP = exports.CALENDAR_SIZE_MAP = exports.BUTTON_CLEAR_VALUE_SIZE_MAP = void 0;
|
|
7
7
|
const constants_1 = require("../../constants");
|
|
8
8
|
exports.BUTTON_CLEAR_VALUE_SIZE_MAP = {
|
|
9
9
|
[constants_1.SIZE.Xs]: constants_1.BUTTON_SIZE.Xxs,
|
|
@@ -17,6 +17,12 @@ exports.CALENDAR_SIZE_MAP = {
|
|
|
17
17
|
[constants_1.SIZE.M]: 'm',
|
|
18
18
|
[constants_1.SIZE.L]: 'm'
|
|
19
19
|
};
|
|
20
|
+
exports.TIME_PICKER_SIZE_MAP = {
|
|
21
|
+
[constants_1.SIZE.Xs]: 's',
|
|
22
|
+
[constants_1.SIZE.S]: 's',
|
|
23
|
+
[constants_1.SIZE.M]: 'm',
|
|
24
|
+
[constants_1.SIZE.L]: 'l'
|
|
25
|
+
};
|
|
20
26
|
exports.DROPLIST_SIZE_MAP = {
|
|
21
27
|
[constants_1.SIZE.Xs]: 's',
|
|
22
28
|
[constants_1.SIZE.S]: 's',
|
|
@@ -26,7 +32,9 @@ exports.DROPLIST_SIZE_MAP = {
|
|
|
26
32
|
exports.CHIP_CHOICE_TYPE = {
|
|
27
33
|
Multiple: 'multiple',
|
|
28
34
|
Date: 'date',
|
|
35
|
+
DateTime: 'date-time',
|
|
29
36
|
DateRange: 'date-range',
|
|
30
37
|
Single: 'single',
|
|
31
38
|
Custom: 'custom'
|
|
32
|
-
};
|
|
39
|
+
};
|
|
40
|
+
exports.DEFAULT_LOCALE = new Intl.Locale('ru-RU');
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import { ChipChoiceCustom, ChipChoiceCustomProps, ChipChoiceDate, ChipChoiceDateProps, ChipChoiceDateRange, ChipChoiceDateRangeProps, ChipChoiceMultiple, ChipChoiceSingle, CustomContentRenderProps } from './components';
|
|
1
|
+
import { ChipChoiceCustom, ChipChoiceCustomProps, ChipChoiceDate, ChipChoiceDateProps, ChipChoiceDateRange, ChipChoiceDateRangeProps, ChipChoiceMultiple, ChipChoiceSingle, ChipChoiceTime, ChipChoiceTimeProps, CustomContentRenderProps } from './components';
|
|
2
2
|
export type { FilterOption, ChipChoiceMultipleProps, ChipChoiceSingleProps, ContentRenderProps } from './types';
|
|
3
|
-
export type { ChipChoiceCustomProps, ChipChoiceDateProps, ChipChoiceDateRangeProps, CustomContentRenderProps };
|
|
3
|
+
export type { ChipChoiceCustomProps, ChipChoiceDateProps, ChipChoiceDateRangeProps, CustomContentRenderProps, ChipChoiceTimeProps, };
|
|
4
4
|
export declare namespace ChipChoice {
|
|
5
5
|
const Custom: typeof ChipChoiceCustom;
|
|
6
6
|
const Single: typeof ChipChoiceSingle;
|
|
7
7
|
const Multiple: typeof ChipChoiceMultiple;
|
|
8
8
|
const Date: typeof ChipChoiceDate;
|
|
9
9
|
const DateRange: typeof ChipChoiceDateRange;
|
|
10
|
+
const Time: typeof ChipChoiceTime;
|
|
10
11
|
}
|
|
11
12
|
export { isAccordionOption, isBaseOption, isGroupOption, isGroupSelectOption, isNextListOption } from './utils';
|
|
@@ -12,6 +12,7 @@ var ChipChoice;
|
|
|
12
12
|
ChipChoice.Multiple = components_1.ChipChoiceMultiple;
|
|
13
13
|
ChipChoice.Date = components_1.ChipChoiceDate;
|
|
14
14
|
ChipChoice.DateRange = components_1.ChipChoiceDateRange;
|
|
15
|
+
ChipChoice.Time = components_1.ChipChoiceTime;
|
|
15
16
|
})(ChipChoice || (exports.ChipChoice = ChipChoice = {}));
|
|
16
17
|
var utils_1 = require("./utils");
|
|
17
18
|
Object.defineProperty(exports, "isAccordionOption", {
|
|
@@ -2,6 +2,7 @@ export declare const MAP_CHIP_TYPE_TO_COMPONENT: {
|
|
|
2
2
|
single: typeof import("../../ChipChoice/components").ChipChoiceSingle;
|
|
3
3
|
multiple: typeof import("../../ChipChoice/components").ChipChoiceMultiple;
|
|
4
4
|
date: typeof import("../../ChipChoice/components").ChipChoiceDate;
|
|
5
|
+
"date-time": typeof import("../../ChipChoice/components").ChipChoiceDate;
|
|
5
6
|
"date-range": typeof import("../../ChipChoice/components").ChipChoiceDateRange;
|
|
6
7
|
custom: typeof import("../../ChipChoice/components").ChipChoiceCustom;
|
|
7
8
|
};
|
|
@@ -10,6 +10,7 @@ exports.MAP_CHIP_TYPE_TO_COMPONENT = {
|
|
|
10
10
|
[constants_1.CHIP_CHOICE_TYPE.Single]: ChipChoice_1.ChipChoice.Single,
|
|
11
11
|
[constants_1.CHIP_CHOICE_TYPE.Multiple]: ChipChoice_1.ChipChoice.Multiple,
|
|
12
12
|
[constants_1.CHIP_CHOICE_TYPE.Date]: ChipChoice_1.ChipChoice.Date,
|
|
13
|
+
[constants_1.CHIP_CHOICE_TYPE.DateTime]: ChipChoice_1.ChipChoice.Date,
|
|
13
14
|
[constants_1.CHIP_CHOICE_TYPE.DateRange]: ChipChoice_1.ChipChoice.DateRange,
|
|
14
15
|
[constants_1.CHIP_CHOICE_TYPE.Custom]: ChipChoice_1.ChipChoice.Custom
|
|
15
16
|
};
|
|
@@ -15,6 +15,12 @@ type ChipChoiceSingleType = {
|
|
|
15
15
|
type ChipChoiceDateType = {
|
|
16
16
|
type: typeof CHIP_CHOICE_TYPE.Date;
|
|
17
17
|
} & ChipChoiceDateProps;
|
|
18
|
+
type ChipChoiceDateTimeType = {
|
|
19
|
+
type: typeof CHIP_CHOICE_TYPE.DateTime;
|
|
20
|
+
} & Omit<ChipChoiceDateProps, 'mode'> & {
|
|
21
|
+
mode: 'date-time';
|
|
22
|
+
showSeconds?: boolean;
|
|
23
|
+
};
|
|
18
24
|
type ChipChoiceDateRangeType = {
|
|
19
25
|
type: typeof CHIP_CHOICE_TYPE.DateRange;
|
|
20
26
|
} & ChipChoiceDateRangeProps;
|
|
@@ -23,7 +29,7 @@ type ChipChoiceCustomType = {
|
|
|
23
29
|
} & ChipChoiceCustomProps;
|
|
24
30
|
export type ChipChoiceProps = {
|
|
25
31
|
id: string;
|
|
26
|
-
} & (ChipChoiceMultipleType | ChipChoiceSingleType | ChipChoiceDateType | ChipChoiceDateRangeType | ChipChoiceCustomType);
|
|
32
|
+
} & (ChipChoiceMultipleType | ChipChoiceSingleType | ChipChoiceDateType | ChipChoiceDateTimeType | ChipChoiceDateRangeType | ChipChoiceCustomType);
|
|
27
33
|
export type OmitBetter<T, K extends keyof any> = T extends any ? Pick<T, Exclude<keyof T, K>> : never;
|
|
28
34
|
export type FilterValue = Parameters<ChipChoiceProps['onChange']>[number];
|
|
29
35
|
export {};
|
|
@@ -290,12 +290,12 @@
|
|
|
290
290
|
border-width:var(--border-width-chips-single, 1px);
|
|
291
291
|
}
|
|
292
292
|
.choiceChip[data-size=m] .label{
|
|
293
|
-
font-family:var(--
|
|
294
|
-
font-weight:var(--
|
|
295
|
-
line-height:var(--
|
|
296
|
-
font-size:var(--
|
|
297
|
-
letter-spacing:var(--
|
|
298
|
-
paragraph-spacing:var(--
|
|
293
|
+
font-family:var(--sans-label-l-font-family, SB Sans Interface);
|
|
294
|
+
font-weight:var(--sans-label-l-font-weight, Semibold);
|
|
295
|
+
line-height:var(--sans-label-l-line-height, 20px);
|
|
296
|
+
font-size:var(--sans-label-l-font-size, 14px);
|
|
297
|
+
letter-spacing:var(--sans-label-l-letter-spacing, 0px);
|
|
298
|
+
paragraph-spacing:var(--sans-label-l-paragraph-spacing, 7.7px);
|
|
299
299
|
}
|
|
300
300
|
.choiceChip[data-size=m] .labelLayout{
|
|
301
301
|
padding-left:var(--space-chips-label-layout-padding-m, 8px);
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { ReactNode } from 'react';
|
|
2
2
|
import { CalendarProps } from '@snack-uikit/calendar';
|
|
3
3
|
import { ChipChoiceCommonProps } from '../types';
|
|
4
|
+
type ChipChoiceDateWithSeconds = {
|
|
5
|
+
mode?: 'date-time';
|
|
6
|
+
showSeconds?: boolean;
|
|
7
|
+
};
|
|
4
8
|
export type ChipChoiceDateProps = ChipChoiceCommonProps & {
|
|
5
9
|
/** Значение компонента */
|
|
6
10
|
value?: Date;
|
|
@@ -11,5 +15,8 @@ export type ChipChoiceDateProps = ChipChoiceCommonProps & {
|
|
|
11
15
|
/** Колбек формирующий строковое представление выбранного значения. Принимает выбранное значение */
|
|
12
16
|
valueRender?(value?: Date): ReactNode;
|
|
13
17
|
mode?: Exclude<CalendarProps['mode'], 'range'>;
|
|
14
|
-
}
|
|
15
|
-
|
|
18
|
+
} & (ChipChoiceDateWithSeconds | {
|
|
19
|
+
mode?: 'date' | 'month';
|
|
20
|
+
});
|
|
21
|
+
export declare function ChipChoiceDate({ size, value, defaultValue, onChange, valueRender, dropDownClassName, mode, placement, widthStrategy, ...rest }: ChipChoiceDateProps): import("react/jsx-runtime").JSX.Element;
|
|
22
|
+
export {};
|
|
@@ -10,18 +10,20 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
10
10
|
return t;
|
|
11
11
|
};
|
|
12
12
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
13
|
-
import { useCallback, useRef, useState } from 'react';
|
|
13
|
+
import { useCallback, useMemo, useRef, useState } from 'react';
|
|
14
14
|
import { Calendar } from '@snack-uikit/calendar';
|
|
15
15
|
import { Dropdown } from '@snack-uikit/dropdown';
|
|
16
16
|
import { useLocale } from '@snack-uikit/locale';
|
|
17
17
|
import { useValueControl } from '@snack-uikit/utils';
|
|
18
18
|
import { CHIP_CHOICE_TEST_IDS, SIZE } from '../../../constants';
|
|
19
|
-
import { CALENDAR_SIZE_MAP } from '../constants';
|
|
19
|
+
import { CALENDAR_SIZE_MAP, DEFAULT_LOCALE } from '../constants';
|
|
20
20
|
import { useHandleOnKeyDown } from '../hooks';
|
|
21
21
|
import { ChipChoiceBase } from './ChipChoiceBase';
|
|
22
22
|
export function ChipChoiceDate(_a) {
|
|
23
|
-
var
|
|
23
|
+
var _b;
|
|
24
|
+
var { size = SIZE.S, value, defaultValue, onChange, valueRender, dropDownClassName, mode = 'date', placement, widthStrategy } = _a, rest = __rest(_a, ["size", "value", "defaultValue", "onChange", "valueRender", "dropDownClassName", "mode", "placement", "widthStrategy"]);
|
|
24
25
|
const [selectedValue, setSelectedValue] = useValueControl({ value, defaultValue, onChange });
|
|
26
|
+
const showSeconds = mode === 'date-time' ? ((_b = rest.showSeconds) !== null && _b !== void 0 ? _b : true) : undefined;
|
|
25
27
|
const localRef = useRef(null);
|
|
26
28
|
const [open, setOpen] = useState(false);
|
|
27
29
|
const handleOnKeyDown = useHandleOnKeyDown({ setOpen });
|
|
@@ -30,12 +32,35 @@ export function ChipChoiceDate(_a) {
|
|
|
30
32
|
setTimeout(() => { var _a; return (_a = localRef.current) === null || _a === void 0 ? void 0 : _a.focus(); }, 0);
|
|
31
33
|
}, []);
|
|
32
34
|
const { t } = useLocale('Chips');
|
|
33
|
-
const valueToRender =
|
|
34
|
-
|
|
35
|
-
|
|
35
|
+
const valueToRender = useMemo(() => {
|
|
36
|
+
if (valueRender) {
|
|
37
|
+
return valueRender(selectedValue);
|
|
38
|
+
}
|
|
39
|
+
if (!selectedValue)
|
|
40
|
+
return t('allLabel');
|
|
41
|
+
const date = new Date(selectedValue);
|
|
42
|
+
if (mode === 'date-time') {
|
|
43
|
+
return date.toLocaleString(DEFAULT_LOCALE, {
|
|
44
|
+
year: 'numeric',
|
|
45
|
+
month: 'numeric',
|
|
46
|
+
day: 'numeric',
|
|
47
|
+
hour: '2-digit',
|
|
48
|
+
minute: '2-digit',
|
|
49
|
+
second: showSeconds ? '2-digit' : undefined,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
return date.toLocaleDateString(DEFAULT_LOCALE, {
|
|
53
|
+
year: 'numeric',
|
|
54
|
+
month: 'numeric',
|
|
55
|
+
day: mode === 'date' ? 'numeric' : undefined,
|
|
56
|
+
});
|
|
57
|
+
}, [mode, selectedValue, showSeconds, t, valueRender]);
|
|
36
58
|
const clearValue = () => setSelectedValue(undefined);
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
59
|
+
const handleChangeValue = useCallback((value) => {
|
|
60
|
+
setSelectedValue(value);
|
|
61
|
+
closeDroplist();
|
|
62
|
+
}, [closeDroplist, setSelectedValue]);
|
|
63
|
+
const navigationStartRef = useRef(null);
|
|
64
|
+
const focusNavigationStartItem = () => setTimeout(() => { var _a; return (_a = navigationStartRef.current) === null || _a === void 0 ? void 0 : _a.focus(); }, 0);
|
|
65
|
+
return (_jsx(Dropdown, { content: _jsx(Calendar, { mode: mode, size: CALENDAR_SIZE_MAP[size], value: selectedValue, fitToContainer: false, onChangeValue: handleChangeValue, navigationStartRef: navigationStartRef, onFocusLeave: closeDroplist, showSeconds: showSeconds, locale: DEFAULT_LOCALE }), placement: placement, widthStrategy: widthStrategy, outsideClick: true, triggerRef: localRef, open: open, onOpenChange: setOpen, className: dropDownClassName, "data-test-id": CHIP_CHOICE_TEST_IDS.droplist, children: _jsx(ChipChoiceBase, Object.assign({}, rest, { ref: localRef, onClearButtonClick: clearValue, value: selectedValue, valueToRender: valueToRender, size: size, onKeyDown: handleOnKeyDown(focusNavigationStartItem) })) }));
|
|
41
66
|
}
|
|
@@ -16,14 +16,14 @@ import { Calendar } from '@snack-uikit/calendar';
|
|
|
16
16
|
import { Dropdown } from '@snack-uikit/dropdown';
|
|
17
17
|
import { useLocale } from '@snack-uikit/locale';
|
|
18
18
|
import { CHIP_CHOICE_TEST_IDS, DEFAULT_EMPTY_VALUE, SIZE } from '../../../constants';
|
|
19
|
-
import { CALENDAR_SIZE_MAP } from '../constants';
|
|
19
|
+
import { CALENDAR_SIZE_MAP, DEFAULT_LOCALE } from '../constants';
|
|
20
20
|
import { useHandleOnKeyDown } from '../hooks';
|
|
21
21
|
import { ChipChoiceBase } from './ChipChoiceBase';
|
|
22
22
|
function defaultRangeFormatter({ value, allLabel }) {
|
|
23
23
|
if (!value || !value.length)
|
|
24
24
|
return allLabel;
|
|
25
25
|
const [from, to] = value;
|
|
26
|
-
return `${from.toLocaleDateString()} ${DEFAULT_EMPTY_VALUE} ${to.toLocaleDateString()}`;
|
|
26
|
+
return `${from.toLocaleDateString(DEFAULT_LOCALE)} ${DEFAULT_EMPTY_VALUE} ${to.toLocaleDateString(DEFAULT_LOCALE)}`;
|
|
27
27
|
}
|
|
28
28
|
export function ChipChoiceDateRange(_a) {
|
|
29
29
|
var { size = SIZE.S, value, defaultValue, onChange, valueRender, dropDownClassName } = _a, rest = __rest(_a, ["size", "value", "defaultValue", "onChange", "valueRender", "dropDownClassName"]);
|
|
@@ -43,7 +43,7 @@ export function ChipChoiceDateRange(_a) {
|
|
|
43
43
|
return (_jsx(Dropdown, { content: _jsx(Calendar, { mode: 'range', size: CALENDAR_SIZE_MAP[size], value: selectedValue, onChangeValue: value => {
|
|
44
44
|
setSelectedValue(value);
|
|
45
45
|
closeDroplist();
|
|
46
|
-
},
|
|
46
|
+
}, locale: DEFAULT_LOCALE,
|
|
47
47
|
// bug with focus
|
|
48
48
|
// navigationStartRef={element => element?.focus()}
|
|
49
49
|
onFocusLeave: closeDroplist }), outsideClick: true, triggerRef: localRef, open: open, "data-test-id": CHIP_CHOICE_TEST_IDS.droplist, onOpenChange: setOpen, className: dropDownClassName, children: _jsx(ChipChoiceBase, Object.assign({}, rest, { ref: localRef, onClearButtonClick: clearValue, value: selectedValue, valueToRender: valueToRender, size: size, onKeyDown: handleOnKeyDown() })) }));
|