@skbkontur/react-ui 6.1.7-c386f.0 → 6.1.7
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 +13 -0
- package/components/Checkbox/Checkbox.d.ts +0 -5
- package/components/Checkbox/Checkbox.js +21 -42
- package/components/Checkbox/Checkbox.js.map +1 -1
- package/components/Checkbox/Checkbox.mixins.d.ts +0 -2
- package/components/Checkbox/Checkbox.mixins.js +0 -6
- package/components/Checkbox/Checkbox.mixins.js.map +1 -1
- package/components/Checkbox/Checkbox.styles.d.ts +0 -7
- package/components/Checkbox/Checkbox.styles.js +2 -23
- package/components/Checkbox/Checkbox.styles.js.map +1 -1
- package/components/Group/Group.js +2 -3
- package/components/Group/Group.js.map +1 -1
- package/components/Input/Input.d.ts +4 -1
- package/components/Input/Input.js +4 -1
- package/components/Input/Input.js.map +1 -1
- package/components/MenuItem/MenuItem.d.ts +1 -1
- package/components/MenuItem/MenuItem.js.map +1 -1
- package/components/PasswordInput/PasswordInput.js +13 -1
- package/components/PasswordInput/PasswordInput.js.map +1 -1
- package/components/Radio/Radio.d.ts +0 -4
- package/components/Radio/Radio.js +1 -20
- package/components/Radio/Radio.js.map +1 -1
- package/components/Radio/Radio.mixins.d.ts +0 -2
- package/components/Radio/Radio.mixins.js +0 -6
- package/components/Radio/Radio.mixins.js.map +1 -1
- package/components/Radio/Radio.styles.d.ts +0 -6
- package/components/Radio/Radio.styles.js +4 -22
- package/components/Radio/Radio.styles.js.map +1 -1
- package/components/Toggle/Toggle.d.ts +0 -5
- package/components/Toggle/Toggle.js +22 -46
- package/components/Toggle/Toggle.js.map +1 -1
- package/components/Toggle/Toggle.mixins.d.ts +0 -2
- package/components/Toggle/Toggle.mixins.js +0 -6
- package/components/Toggle/Toggle.mixins.js.map +1 -1
- package/components/Toggle/Toggle.styles.d.ts +0 -9
- package/components/Toggle/Toggle.styles.js +2 -29
- package/components/Toggle/Toggle.styles.js.map +1 -1
- package/components/Tooltip/Tooltip.d.ts +2 -0
- package/components/Tooltip/Tooltip.js +25 -4
- package/components/Tooltip/Tooltip.js.map +1 -1
- package/index.d.ts +0 -1
- package/index.js +0 -1
- package/index.js.map +1 -1
- package/internal/themes/BasicTheme.d.ts +0 -65
- package/internal/themes/BasicTheme.js +0 -253
- package/internal/themes/BasicTheme.js.map +1 -1
- package/internal/themes/DarkTheme6_0.js +0 -1
- package/internal/themes/DarkTheme6_0.js.map +1 -1
- package/lib/locale/types.d.ts +0 -2
- package/lib/locale/types.js.map +1 -1
- package/lib/utils.d.ts +0 -2
- package/lib/utils.js +0 -1
- package/lib/utils.js.map +1 -1
- package/package.json +1 -9
- package/components/TimePicker/TimeClockIcon.d.ts +0 -3
- package/components/TimePicker/TimeClockIcon.js +0 -11
- package/components/TimePicker/TimeClockIcon.js.map +0 -1
- package/components/TimePicker/TimePicker.d.ts +0 -153
- package/components/TimePicker/TimePicker.js +0 -739
- package/components/TimePicker/TimePicker.js.map +0 -1
- package/components/TimePicker/TimePicker.styles.d.ts +0 -13
- package/components/TimePicker/TimePicker.styles.js +0 -42
- package/components/TimePicker/TimePicker.styles.js.map +0 -1
- package/components/TimePicker/TimePickerItems.d.ts +0 -20
- package/components/TimePicker/TimePickerItems.js +0 -115
- package/components/TimePicker/TimePickerItems.js.map +0 -1
- package/components/TimePicker/TimePickerMobilePopup.d.ts +0 -45
- package/components/TimePicker/TimePickerMobilePopup.js +0 -45
- package/components/TimePicker/TimePickerMobilePopup.js.map +0 -1
- package/components/TimePicker/TimePickerPopup.d.ts +0 -23
- package/components/TimePicker/TimePickerPopup.js +0 -18
- package/components/TimePicker/TimePickerPopup.js.map +0 -1
- package/components/TimePicker/helpers/TimePicker.constants.d.ts +0 -29
- package/components/TimePicker/helpers/TimePicker.constants.js +0 -38
- package/components/TimePicker/helpers/TimePicker.constants.js.map +0 -1
- package/components/TimePicker/helpers/TimePicker.editing.d.ts +0 -23
- package/components/TimePicker/helpers/TimePicker.editing.js +0 -101
- package/components/TimePicker/helpers/TimePicker.editing.js.map +0 -1
- package/components/TimePicker/helpers/TimePicker.layout.d.ts +0 -6
- package/components/TimePicker/helpers/TimePicker.layout.js +0 -49
- package/components/TimePicker/helpers/TimePicker.layout.js.map +0 -1
- package/components/TimePicker/helpers/TimePicker.selection.d.ts +0 -5
- package/components/TimePicker/helpers/TimePicker.selection.js +0 -23
- package/components/TimePicker/helpers/TimePicker.selection.js.map +0 -1
- package/components/TimePicker/helpers/TimePicker.shared.d.ts +0 -91
- package/components/TimePicker/helpers/TimePicker.shared.js +0 -111
- package/components/TimePicker/helpers/TimePicker.shared.js.map +0 -1
- package/components/TimePicker/helpers/TimePicker.value.d.ts +0 -80
- package/components/TimePicker/helpers/TimePicker.value.js +0 -237
- package/components/TimePicker/helpers/TimePicker.value.js.map +0 -1
- package/components/TimePicker/helpers/scrollSelectedItemIntoView.d.ts +0 -4
- package/components/TimePicker/helpers/scrollSelectedItemIntoView.js +0 -24
- package/components/TimePicker/helpers/scrollSelectedItemIntoView.js.map +0 -1
- package/components/TimePicker/helpers/validateTimePicker.d.ts +0 -8
- package/components/TimePicker/helpers/validateTimePicker.js +0 -17
- package/components/TimePicker/helpers/validateTimePicker.js.map +0 -1
- package/components/TimePicker/hooks/useTimePickerDropdown.d.ts +0 -23
- package/components/TimePicker/hooks/useTimePickerDropdown.js +0 -83
- package/components/TimePicker/hooks/useTimePickerDropdown.js.map +0 -1
- package/components/TimePicker/hooks/useTimePickerSelection.d.ts +0 -18
- package/components/TimePicker/hooks/useTimePickerSelection.js +0 -66
- package/components/TimePicker/hooks/useTimePickerSelection.js.map +0 -1
- package/components/TimePicker/hooks/useTimePickerSource.d.ts +0 -27
- package/components/TimePicker/hooks/useTimePickerSource.js +0 -59
- package/components/TimePicker/hooks/useTimePickerSource.js.map +0 -1
- package/components/TimePicker/hooks/useTimePickerValue.d.ts +0 -33
- package/components/TimePicker/hooks/useTimePickerValue.js +0 -97
- package/components/TimePicker/hooks/useTimePickerValue.js.map +0 -1
- package/components/TimePicker/index.d.ts +0 -4
- package/components/TimePicker/index.js +0 -3
- package/components/TimePicker/index.js.map +0 -1
- package/components/TimePicker/locale/index.d.ts +0 -4
- package/components/TimePicker/locale/index.js +0 -9
- package/components/TimePicker/locale/index.js.map +0 -1
- package/components/TimePicker/locale/locales/en.d.ts +0 -2
- package/components/TimePicker/locale/locales/en.js +0 -5
- package/components/TimePicker/locale/locales/en.js.map +0 -1
- package/components/TimePicker/locale/locales/ru.d.ts +0 -2
- package/components/TimePicker/locale/locales/ru.js +0 -5
- package/components/TimePicker/locale/locales/ru.js.map +0 -1
- package/components/TimePicker/locale/types.d.ts +0 -4
- package/components/TimePicker/locale/types.js +0 -2
- package/components/TimePicker/locale/types.js.map +0 -1
- package/internal/NativeTimeInput/NativeTimeInput.d.ts +0 -16
- package/internal/NativeTimeInput/NativeTimeInput.js +0 -25
- package/internal/NativeTimeInput/NativeTimeInput.js.map +0 -1
- package/internal/NativeTimeInput/NativeTimeInput.styles.d.ts +0 -3
- package/internal/NativeTimeInput/NativeTimeInput.styles.js +0 -15
- package/internal/NativeTimeInput/NativeTimeInput.styles.js.map +0 -1
- package/internal/NativeTimeInput/NativeTimeInput.utils.d.ts +0 -7
- package/internal/NativeTimeInput/NativeTimeInput.utils.js +0 -28
- package/internal/NativeTimeInput/NativeTimeInput.utils.js.map +0 -1
- package/internal/NativeTimeInput/index.d.ts +0 -1
- package/internal/NativeTimeInput/index.js +0 -2
- package/internal/NativeTimeInput/index.js.map +0 -1
- package/internal/TimeInput/TimeFragments.d.ts +0 -15
- package/internal/TimeInput/TimeFragments.js +0 -72
- package/internal/TimeInput/TimeFragments.js.map +0 -1
- package/internal/TimeInput/TimeFragments.styles.d.ts +0 -12
- package/internal/TimeInput/TimeFragments.styles.js +0 -43
- package/internal/TimeInput/TimeFragments.styles.js.map +0 -1
- package/internal/TimeInput/TimeInput.d.ts +0 -22
- package/internal/TimeInput/TimeInput.js +0 -103
- package/internal/TimeInput/TimeInput.js.map +0 -1
- package/internal/TimeInput/TimeInput.styles.d.ts +0 -6
- package/internal/TimeInput/TimeInput.styles.js +0 -21
- package/internal/TimeInput/TimeInput.styles.js.map +0 -1
- package/internal/TimeInput/index.d.ts +0 -1
- package/internal/TimeInput/index.js +0 -2
- package/internal/TimeInput/index.js.map +0 -1
- package/internal/icons2022/TimeClockIcon/TimeClockIcon16Light.d.ts +0 -2
- package/internal/icons2022/TimeClockIcon/TimeClockIcon16Light.js +0 -20
- package/internal/icons2022/TimeClockIcon/TimeClockIcon16Light.js.map +0 -1
- package/internal/icons2022/TimeClockIcon/TimeClockIcon20Light.d.ts +0 -2
- package/internal/icons2022/TimeClockIcon/TimeClockIcon20Light.js +0 -20
- package/internal/icons2022/TimeClockIcon/TimeClockIcon20Light.js.map +0 -1
- package/internal/icons2022/TimeClockIcon/TimeClockIcon24Regular.d.ts +0 -2
- package/internal/icons2022/TimeClockIcon/TimeClockIcon24Regular.js +0 -20
- package/internal/icons2022/TimeClockIcon/TimeClockIcon24Regular.js.map +0 -1
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import { type TimeFormat, type TimeItemValue, type TimePickerExtendedItem, type TimePickerMenuItem, type TimeSegment } from './TimePicker.shared.js';
|
|
2
|
-
/** Проверяет, содержит ли display-значение хотя бы одну введенную цифру. */
|
|
3
|
-
export declare const isTimeDisplayEmpty: (value: string) => boolean;
|
|
4
|
-
/** Приводит значение поля — элемент, строку или пустое значение — к строке времени. */
|
|
5
|
-
export declare const getTimeValueString: (value: TimeItemValue | null | undefined) => string;
|
|
6
|
-
/**
|
|
7
|
-
* Разбирает элементы источника для отрисовки: достает время и подпись,
|
|
8
|
-
* а `disabled` дополняет проверкой диапазона `minTime`/`maxTime`.
|
|
9
|
-
* Исходный элемент сохраняется как есть — именно он уходит в `onValueChange`.
|
|
10
|
-
* React-элементы остаются на своих местах.
|
|
11
|
-
*/
|
|
12
|
-
export declare const resolveTimeItems: <T extends TimeItemValue>(items: Array<TimePickerExtendedItem<T>>, format: TimeFormat, minTime?: string, maxTime?: string) => Array<TimePickerMenuItem<T>>;
|
|
13
|
-
/**
|
|
14
|
-
* Оставляет только элементы, которые компонент умеет показать в меню.
|
|
15
|
-
* Пустые значения — результат условного рендера вроде `isVisible && item` или `items.length && item` —
|
|
16
|
-
* молча отбрасываются, а элементы, из которых не получается собрать время, отбрасываются с предупреждением.
|
|
17
|
-
*/
|
|
18
|
-
export declare const sanitizeTimeItems: <T extends TimeItemValue>(items: Array<TimePickerExtendedItem<T>>, format: TimeFormat) => Array<TimePickerExtendedItem<T>>;
|
|
19
|
-
/**
|
|
20
|
-
* Оставляет в списке только первый элемент для каждого времени.
|
|
21
|
-
* Времена сравниваются после нормализации к текущему формату,
|
|
22
|
-
* поэтому в формате `HH:mm` элементы `12:00` и `12:00:30` считаются одинаковыми.
|
|
23
|
-
* React-элементы не участвуют в сравнении и остаются на своих местах.
|
|
24
|
-
*/
|
|
25
|
-
export declare const dedupeTimeItems: <T extends TimeItemValue>(items: Array<TimePickerExtendedItem<T>>, format: TimeFormat) => Array<TimePickerExtendedItem<T>>;
|
|
26
|
-
/**
|
|
27
|
-
* Проверяет, выходит ли значение за диапазон `minTime`/`maxTime` после нормализации.
|
|
28
|
-
* Пустое значение не считается выходящим за диапазон. Если `minTime > maxTime`, диапазон трактуется как переходящий через полночь.
|
|
29
|
-
*/
|
|
30
|
-
export declare const isTimeValueOutOfRange: (value: string, format: TimeFormat, minTime?: string, maxTime?: string) => boolean;
|
|
31
|
-
/**
|
|
32
|
-
* Нормализует display-значение в committed-форму `HH:mm[:ss]`.
|
|
33
|
-
* Частично заполненные сегменты дополняются и ограничиваются максимумами сегментов.
|
|
34
|
-
*/
|
|
35
|
-
export declare const normalizeTimeValue: (value: string, format: TimeFormat) => string;
|
|
36
|
-
/**
|
|
37
|
-
* Преобразует display-значение в partial raw value для `onValueChange`.
|
|
38
|
-
* Заполненные сегменты дополняются до двух цифр, пропущенные сегменты до последнего заполненного становятся `00`.
|
|
39
|
-
*/
|
|
40
|
-
export declare const serializeTimeValue: (value: string, format: TimeFormat) => string;
|
|
41
|
-
/** Возвращает display-значение с плейсхолдерами из partial или committed value. */
|
|
42
|
-
export declare const getTimeDisplayValue: (value: string, format: TimeFormat) => string;
|
|
43
|
-
/**
|
|
44
|
-
* Возвращает display-значение внешнего `value`.
|
|
45
|
-
* Сегменты, записанные одной цифрой, дополняются нулем, поэтому `9:00` показывается как `09:00` —
|
|
46
|
-
* так же, как компонент показывает время элементов источника.
|
|
47
|
-
* Значение без разделителя остается частично введенным: `1` — это первая цифра часов, а не `01:00`.
|
|
48
|
-
*/
|
|
49
|
-
export declare const getExternalTimeDisplayValue: (value: string, format: TimeFormat) => string;
|
|
50
|
-
/** Заменяет значение выбранного сегмента, сохраняя остальные сегменты display-значения без изменений. */
|
|
51
|
-
export declare const replaceTimeSegment: (value: string, segment: TimeSegment, nextSegmentValue: string, format: TimeFormat) => string;
|
|
52
|
-
/**
|
|
53
|
-
* Проверяет, что вставленное значение похоже на время:
|
|
54
|
-
* это либо сегменты из одной-двух цифр через любой разделитель — `12:30`, `9:5`, `1:23:45`, `12.30`, —
|
|
55
|
-
* либо цифры подряд — `9`, `1230`, `123045`.
|
|
56
|
-
* Строки, из которых время собралось бы случайно — `2026-08-01`, `hello 42`, — временем не считаются.
|
|
57
|
-
*/
|
|
58
|
-
export declare const isTimeLikePastedValue: (value: string) => boolean;
|
|
59
|
-
/**
|
|
60
|
-
* Парсит вставленное пользователем значение и сразу преобразует его в committed-форму.
|
|
61
|
-
* Значение, не похожее на время, отдается как пустое: такую вставку компонент считает некорректным вводом.
|
|
62
|
-
*/
|
|
63
|
-
export declare const parsePastedTimeValue: (value: string, format: TimeFormat) => string;
|
|
64
|
-
/** Возвращает текущее display-значение сегмента или пустой сегмент, если индекс отсутствует. */
|
|
65
|
-
export declare const getTimeSegmentValue: (value: string, segment: TimeSegment, format: TimeFormat) => string;
|
|
66
|
-
/** Возвращает полностью пустое display-значение для выбранной точности времени. */
|
|
67
|
-
export declare const getEmptyDisplayValue: (precision: TimeFormat) => string;
|
|
68
|
-
/**
|
|
69
|
-
* Преобразует display-значение в поисковый запрос для фильтрации элементов.
|
|
70
|
-
* Сегменты содержат только введенные цифры, незаполненный хвост отбрасывается: `12:3_` => `12:3`, `1_:__` => `1`.
|
|
71
|
-
* Позиции сегментов сохраняются, поэтому ведущие незаполненные сегменты остаются пустыми: `__:34` => `:34`.
|
|
72
|
-
* Это нужно для посегментного сравнения в `filterTimeItems` и передается как есть в пользовательскую `source`.
|
|
73
|
-
*/
|
|
74
|
-
export declare const getTimeFilterQuery: (value: string, format: TimeFormat) => string;
|
|
75
|
-
/**
|
|
76
|
-
* Дефолтная функция фильтрации элементов по запросу из поля ввода.
|
|
77
|
-
* Сравнивает запрос посегментно: введенные цифры сегмента должны быть префиксом соответствующего сегмента элемента.
|
|
78
|
-
* Пустой запрос возвращает все элементы.
|
|
79
|
-
*/
|
|
80
|
-
export declare const filterTimeItems: <T extends TimeItemValue>(items: Array<TimePickerExtendedItem<T>>, query: string, format: TimeFormat) => Array<TimePickerExtendedItem<T>>;
|
|
@@ -1,237 +0,0 @@
|
|
|
1
|
-
import warning from 'warning';
|
|
2
|
-
import { DIGIT_REGEXP, EMPTY_SEGMENT, EMPTY_VALUE, NON_DIGIT_REGEXP, TIME_LIKE_DIGITS_REGEXP, TIME_LIKE_SEGMENTS_REGEXP, TIME_SEPARATOR, ZERO_PAD_CHAR, } from './TimePicker.constants.js';
|
|
3
|
-
import { getDigits, getDisplaySegments, getTimeSegments, normalizeTimeSegment, sanitizeSegment, getTimeItemLabel, getTimeItemValue, isTimeItemDisabled, isTimeItem, isTimeItemObject, } from './TimePicker.shared.js';
|
|
4
|
-
/** Проверяет, содержит ли display-значение хотя бы одну введенную цифру. */
|
|
5
|
-
export var isTimeDisplayEmpty = function (value) { return !DIGIT_REGEXP.test(value); };
|
|
6
|
-
/** Приводит значение поля — элемент, строку или пустое значение — к строке времени. */
|
|
7
|
-
export var getTimeValueString = function (value) {
|
|
8
|
-
if (value === null || value === undefined) {
|
|
9
|
-
return EMPTY_VALUE;
|
|
10
|
-
}
|
|
11
|
-
return getTimeItemValue(value);
|
|
12
|
-
};
|
|
13
|
-
/**
|
|
14
|
-
* Разбирает элементы источника для отрисовки: достает время и подпись,
|
|
15
|
-
* а `disabled` дополняет проверкой диапазона `minTime`/`maxTime`.
|
|
16
|
-
* Исходный элемент сохраняется как есть — именно он уходит в `onValueChange`.
|
|
17
|
-
* React-элементы остаются на своих местах.
|
|
18
|
-
*/
|
|
19
|
-
export var resolveTimeItems = function (items, format, minTime, maxTime) {
|
|
20
|
-
return items.map(function (item) {
|
|
21
|
-
if (!isTimeItem(item)) {
|
|
22
|
-
return item;
|
|
23
|
-
}
|
|
24
|
-
var value = getTimeItemValue(item);
|
|
25
|
-
return {
|
|
26
|
-
item: item,
|
|
27
|
-
value: value,
|
|
28
|
-
label: getTimeItemLabel(item),
|
|
29
|
-
disabled: isTimeItemDisabled(item) || isTimeValueOutOfRange(value, format, minTime, maxTime),
|
|
30
|
-
};
|
|
31
|
-
});
|
|
32
|
-
};
|
|
33
|
-
/**
|
|
34
|
-
* Оставляет только элементы, которые компонент умеет показать в меню.
|
|
35
|
-
* Пустые значения — результат условного рендера вроде `isVisible && item` или `items.length && item` —
|
|
36
|
-
* молча отбрасываются, а элементы, из которых не получается собрать время, отбрасываются с предупреждением.
|
|
37
|
-
*/
|
|
38
|
-
export var sanitizeTimeItems = function (items, format) {
|
|
39
|
-
if (!Array.isArray(items)) {
|
|
40
|
-
warning(false, '[TimePicker]: the source function is expected to return an array or a Promise of an array.');
|
|
41
|
-
return [];
|
|
42
|
-
}
|
|
43
|
-
return items.filter(function (item) {
|
|
44
|
-
if (!item) {
|
|
45
|
-
return false;
|
|
46
|
-
}
|
|
47
|
-
if (!isTimeItem(item)) {
|
|
48
|
-
return true;
|
|
49
|
-
}
|
|
50
|
-
if (isTimeItemObject(item) && typeof item.value !== 'string') {
|
|
51
|
-
warning(false, '[TimePicker]: a source item is expected to be a time string or an object with a time value.');
|
|
52
|
-
return false;
|
|
53
|
-
}
|
|
54
|
-
if (normalizeTimeValue(getTimeItemValue(item), format) === EMPTY_VALUE) {
|
|
55
|
-
warning(false, "[TimePicker]: the source item value \"".concat(getTimeItemValue(item), "\" is not a time."));
|
|
56
|
-
return false;
|
|
57
|
-
}
|
|
58
|
-
return true;
|
|
59
|
-
});
|
|
60
|
-
};
|
|
61
|
-
/**
|
|
62
|
-
* Оставляет в списке только первый элемент для каждого времени.
|
|
63
|
-
* Времена сравниваются после нормализации к текущему формату,
|
|
64
|
-
* поэтому в формате `HH:mm` элементы `12:00` и `12:00:30` считаются одинаковыми.
|
|
65
|
-
* React-элементы не участвуют в сравнении и остаются на своих местах.
|
|
66
|
-
*/
|
|
67
|
-
export var dedupeTimeItems = function (items, format) {
|
|
68
|
-
var usedValues = new Set();
|
|
69
|
-
return items.filter(function (item) {
|
|
70
|
-
if (!isTimeItem(item)) {
|
|
71
|
-
return true;
|
|
72
|
-
}
|
|
73
|
-
var normalizedValue = normalizeTimeValue(getTimeItemValue(item), format);
|
|
74
|
-
if (usedValues.has(normalizedValue)) {
|
|
75
|
-
return false;
|
|
76
|
-
}
|
|
77
|
-
usedValues.add(normalizedValue);
|
|
78
|
-
return true;
|
|
79
|
-
});
|
|
80
|
-
};
|
|
81
|
-
/**
|
|
82
|
-
* Проверяет, выходит ли значение за диапазон `minTime`/`maxTime` после нормализации.
|
|
83
|
-
* Пустое значение не считается выходящим за диапазон. Если `minTime > maxTime`, диапазон трактуется как переходящий через полночь.
|
|
84
|
-
*/
|
|
85
|
-
export var isTimeValueOutOfRange = function (value, format, minTime, maxTime) {
|
|
86
|
-
var normalizedValue = normalizeTimeValue(value, format);
|
|
87
|
-
if (normalizedValue === EMPTY_VALUE) {
|
|
88
|
-
return false;
|
|
89
|
-
}
|
|
90
|
-
var normalizedMinTime = normalizeTimeRangeValue(minTime, format);
|
|
91
|
-
var normalizedMaxTime = normalizeTimeRangeValue(maxTime, format);
|
|
92
|
-
if (normalizedMinTime && normalizedMaxTime && normalizedMinTime > normalizedMaxTime) {
|
|
93
|
-
return normalizedValue < normalizedMinTime && normalizedValue > normalizedMaxTime;
|
|
94
|
-
}
|
|
95
|
-
return ((normalizedMinTime !== undefined && normalizedValue < normalizedMinTime) ||
|
|
96
|
-
(normalizedMaxTime !== undefined && normalizedValue > normalizedMaxTime));
|
|
97
|
-
};
|
|
98
|
-
/**
|
|
99
|
-
* Нормализует display-значение в committed-форму `HH:mm[:ss]`.
|
|
100
|
-
* Частично заполненные сегменты дополняются и ограничиваются максимумами сегментов.
|
|
101
|
-
*/
|
|
102
|
-
export var normalizeTimeValue = function (value, format) {
|
|
103
|
-
if (isTimeDisplayEmpty(value)) {
|
|
104
|
-
return EMPTY_VALUE;
|
|
105
|
-
}
|
|
106
|
-
var displaySegments = getDisplaySegments(value, format);
|
|
107
|
-
return getTimeSegments(format)
|
|
108
|
-
.map(function (segment, index) { return normalizeTimeSegment(displaySegments[index], segment); })
|
|
109
|
-
.join(TIME_SEPARATOR);
|
|
110
|
-
};
|
|
111
|
-
var normalizeTimeRangeValue = function (value, format) {
|
|
112
|
-
if (!value) {
|
|
113
|
-
return undefined;
|
|
114
|
-
}
|
|
115
|
-
var normalizedValue = normalizeTimeValue(value, format);
|
|
116
|
-
return normalizedValue === EMPTY_VALUE ? undefined : normalizedValue;
|
|
117
|
-
};
|
|
118
|
-
/**
|
|
119
|
-
* Преобразует display-значение в partial raw value для `onValueChange`.
|
|
120
|
-
* Заполненные сегменты дополняются до двух цифр, пропущенные сегменты до последнего заполненного становятся `00`.
|
|
121
|
-
*/
|
|
122
|
-
export var serializeTimeValue = function (value, format) {
|
|
123
|
-
var serializedSegments = getDisplaySegments(value, format).map(function (segmentValue) {
|
|
124
|
-
var digits = getDigits(segmentValue);
|
|
125
|
-
return digits ? digits.padStart(EMPTY_SEGMENT.length, '0') : EMPTY_VALUE;
|
|
126
|
-
});
|
|
127
|
-
var lastFilledIndex = serializedSegments.reduce(function (result, segmentValue, index) { return (segmentValue ? index : result); }, -1);
|
|
128
|
-
if (lastFilledIndex < 0) {
|
|
129
|
-
return EMPTY_VALUE;
|
|
130
|
-
}
|
|
131
|
-
return serializedSegments
|
|
132
|
-
.slice(0, lastFilledIndex + 1)
|
|
133
|
-
.map(function (segmentValue) { return segmentValue || '00'; })
|
|
134
|
-
.join(TIME_SEPARATOR);
|
|
135
|
-
};
|
|
136
|
-
/** Возвращает display-значение с плейсхолдерами из partial или committed value. */
|
|
137
|
-
export var getTimeDisplayValue = function (value, format) {
|
|
138
|
-
if (value === EMPTY_VALUE) {
|
|
139
|
-
return EMPTY_VALUE;
|
|
140
|
-
}
|
|
141
|
-
return getDisplaySegments(value, format).join(TIME_SEPARATOR);
|
|
142
|
-
};
|
|
143
|
-
/**
|
|
144
|
-
* Возвращает display-значение внешнего `value`.
|
|
145
|
-
* Сегменты, записанные одной цифрой, дополняются нулем, поэтому `9:00` показывается как `09:00` —
|
|
146
|
-
* так же, как компонент показывает время элементов источника.
|
|
147
|
-
* Значение без разделителя остается частично введенным: `1` — это первая цифра часов, а не `01:00`.
|
|
148
|
-
*/
|
|
149
|
-
export var getExternalTimeDisplayValue = function (value, format) {
|
|
150
|
-
if (!value.includes(TIME_SEPARATOR)) {
|
|
151
|
-
return getTimeDisplayValue(value, format);
|
|
152
|
-
}
|
|
153
|
-
var paddedSegments = value.split(TIME_SEPARATOR).map(function (segmentValue) {
|
|
154
|
-
var digits = getDigits(segmentValue);
|
|
155
|
-
return digits ? digits.padStart(EMPTY_SEGMENT.length, ZERO_PAD_CHAR) : EMPTY_VALUE;
|
|
156
|
-
});
|
|
157
|
-
return getTimeDisplayValue(paddedSegments.join(TIME_SEPARATOR), format);
|
|
158
|
-
};
|
|
159
|
-
/** Заменяет значение выбранного сегмента, сохраняя остальные сегменты display-значения без изменений. */
|
|
160
|
-
export var replaceTimeSegment = function (value, segment, nextSegmentValue, format) {
|
|
161
|
-
var segments = getDisplaySegments(value, format);
|
|
162
|
-
var index = getTimeSegments(format).indexOf(segment);
|
|
163
|
-
segments[index] = sanitizeSegment(nextSegmentValue);
|
|
164
|
-
return segments.join(TIME_SEPARATOR);
|
|
165
|
-
};
|
|
166
|
-
/**
|
|
167
|
-
* Проверяет, что вставленное значение похоже на время:
|
|
168
|
-
* это либо сегменты из одной-двух цифр через любой разделитель — `12:30`, `9:5`, `1:23:45`, `12.30`, —
|
|
169
|
-
* либо цифры подряд — `9`, `1230`, `123045`.
|
|
170
|
-
* Строки, из которых время собралось бы случайно — `2026-08-01`, `hello 42`, — временем не считаются.
|
|
171
|
-
*/
|
|
172
|
-
export var isTimeLikePastedValue = function (value) {
|
|
173
|
-
var trimmedValue = value.trim();
|
|
174
|
-
return TIME_LIKE_SEGMENTS_REGEXP.test(trimmedValue) || TIME_LIKE_DIGITS_REGEXP.test(trimmedValue);
|
|
175
|
-
};
|
|
176
|
-
/**
|
|
177
|
-
* Парсит вставленное пользователем значение и сразу преобразует его в committed-форму.
|
|
178
|
-
* Значение, не похожее на время, отдается как пустое: такую вставку компонент считает некорректным вводом.
|
|
179
|
-
*/
|
|
180
|
-
export var parsePastedTimeValue = function (value, format) {
|
|
181
|
-
var trimmedValue = value.trim();
|
|
182
|
-
if (!DIGIT_REGEXP.test(trimmedValue) || !isTimeLikePastedValue(trimmedValue)) {
|
|
183
|
-
return EMPTY_VALUE;
|
|
184
|
-
}
|
|
185
|
-
// Разделители сегментов приводятся к одному виду, чтобы `9.5` разбирался так же, как `9:5`.
|
|
186
|
-
var normalizedSeparators = TIME_LIKE_SEGMENTS_REGEXP.test(trimmedValue)
|
|
187
|
-
? trimmedValue.split(NON_DIGIT_REGEXP).join(TIME_SEPARATOR)
|
|
188
|
-
: trimmedValue;
|
|
189
|
-
var segments = getDisplaySegments(normalizedSeparators, format);
|
|
190
|
-
return normalizeTimeValue(segments.join(TIME_SEPARATOR), format);
|
|
191
|
-
};
|
|
192
|
-
/** Возвращает текущее display-значение сегмента или пустой сегмент, если индекс отсутствует. */
|
|
193
|
-
export var getTimeSegmentValue = function (value, segment, format) {
|
|
194
|
-
var _a;
|
|
195
|
-
var segments = getDisplaySegments(value, format);
|
|
196
|
-
var index = getTimeSegments(format).indexOf(segment);
|
|
197
|
-
return (_a = segments[index]) !== null && _a !== void 0 ? _a : EMPTY_SEGMENT;
|
|
198
|
-
};
|
|
199
|
-
/** Возвращает полностью пустое display-значение для выбранной точности времени. */
|
|
200
|
-
export var getEmptyDisplayValue = function (precision) {
|
|
201
|
-
return getTimeSegments(precision)
|
|
202
|
-
.map(function () { return EMPTY_SEGMENT; })
|
|
203
|
-
.join(TIME_SEPARATOR);
|
|
204
|
-
};
|
|
205
|
-
/**
|
|
206
|
-
* Преобразует display-значение в поисковый запрос для фильтрации элементов.
|
|
207
|
-
* Сегменты содержат только введенные цифры, незаполненный хвост отбрасывается: `12:3_` => `12:3`, `1_:__` => `1`.
|
|
208
|
-
* Позиции сегментов сохраняются, поэтому ведущие незаполненные сегменты остаются пустыми: `__:34` => `:34`.
|
|
209
|
-
* Это нужно для посегментного сравнения в `filterTimeItems` и передается как есть в пользовательскую `source`.
|
|
210
|
-
*/
|
|
211
|
-
export var getTimeFilterQuery = function (value, format) {
|
|
212
|
-
var segments = getDisplaySegments(value, format).map(getDigits);
|
|
213
|
-
var lastFilledIndex = segments.reduce(function (result, segmentValue, index) { return (segmentValue ? index : result); }, -1);
|
|
214
|
-
if (lastFilledIndex < 0) {
|
|
215
|
-
return EMPTY_VALUE;
|
|
216
|
-
}
|
|
217
|
-
return segments.slice(0, lastFilledIndex + 1).join(TIME_SEPARATOR);
|
|
218
|
-
};
|
|
219
|
-
/**
|
|
220
|
-
* Дефолтная функция фильтрации элементов по запросу из поля ввода.
|
|
221
|
-
* Сравнивает запрос посегментно: введенные цифры сегмента должны быть префиксом соответствующего сегмента элемента.
|
|
222
|
-
* Пустой запрос возвращает все элементы.
|
|
223
|
-
*/
|
|
224
|
-
export var filterTimeItems = function (items, query, format) {
|
|
225
|
-
var querySegments = query.split(TIME_SEPARATOR).map(getDigits);
|
|
226
|
-
if (querySegments.every(function (segmentValue) { return !segmentValue; })) {
|
|
227
|
-
return items;
|
|
228
|
-
}
|
|
229
|
-
return items.filter(function (item) {
|
|
230
|
-
if (!isTimeItem(item)) {
|
|
231
|
-
return true;
|
|
232
|
-
}
|
|
233
|
-
var itemSegments = getDisplaySegments(normalizeTimeValue(getTimeItemValue(item), format), format);
|
|
234
|
-
return querySegments.every(function (segmentValue, index) { var _a; return !segmentValue || ((_a = itemSegments[index]) !== null && _a !== void 0 ? _a : EMPTY_VALUE).startsWith(segmentValue); });
|
|
235
|
-
});
|
|
236
|
-
};
|
|
237
|
-
//# sourceMappingURL=TimePicker.value.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TimePicker.value.js","sourceRoot":"","sources":["TimePicker.value.ts"],"names":[],"mappings":"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","sourcesContent":["import warning from 'warning';\n\nimport {\n DIGIT_REGEXP,\n EMPTY_SEGMENT,\n EMPTY_VALUE,\n NON_DIGIT_REGEXP,\n TIME_LIKE_DIGITS_REGEXP,\n TIME_LIKE_SEGMENTS_REGEXP,\n TIME_SEPARATOR,\n ZERO_PAD_CHAR,\n} from './TimePicker.constants.js';\nimport {\n getDigits,\n getDisplaySegments,\n getTimeSegments,\n normalizeTimeSegment,\n sanitizeSegment,\n getTimeItemLabel,\n getTimeItemValue,\n isTimeItemDisabled,\n type TimeFormat,\n type TimeItemValue,\n type TimePickerExtendedItem,\n type TimePickerMenuItem,\n type TimeSegment,\n isTimeItem,\n isTimeItemObject,\n} from './TimePicker.shared.js';\n\n/** Проверяет, содержит ли display-значение хотя бы одну введенную цифру. */\nexport const isTimeDisplayEmpty = (value: string): boolean => !DIGIT_REGEXP.test(value);\n\n/** Приводит значение поля — элемент, строку или пустое значение — к строке времени. */\nexport const getTimeValueString = (value: TimeItemValue | null | undefined): string => {\n if (value === null || value === undefined) {\n return EMPTY_VALUE;\n }\n\n return getTimeItemValue(value);\n};\n\n/**\n * Разбирает элементы источника для отрисовки: достает время и подпись,\n * а `disabled` дополняет проверкой диапазона `minTime`/`maxTime`.\n * Исходный элемент сохраняется как есть — именно он уходит в `onValueChange`.\n * React-элементы остаются на своих местах.\n */\nexport const resolveTimeItems = <T extends TimeItemValue>(\n items: Array<TimePickerExtendedItem<T>>,\n format: TimeFormat,\n minTime?: string,\n maxTime?: string,\n): Array<TimePickerMenuItem<T>> =>\n items.map((item) => {\n if (!isTimeItem(item)) {\n return item;\n }\n\n const value = getTimeItemValue(item);\n\n return {\n item,\n value,\n label: getTimeItemLabel(item),\n disabled: isTimeItemDisabled(item) || isTimeValueOutOfRange(value, format, minTime, maxTime),\n };\n });\n\n/**\n * Оставляет только элементы, которые компонент умеет показать в меню.\n * Пустые значения — результат условного рендера вроде `isVisible && item` или `items.length && item` —\n * молча отбрасываются, а элементы, из которых не получается собрать время, отбрасываются с предупреждением.\n */\nexport const sanitizeTimeItems = <T extends TimeItemValue>(\n items: Array<TimePickerExtendedItem<T>>,\n format: TimeFormat,\n): Array<TimePickerExtendedItem<T>> => {\n if (!Array.isArray(items)) {\n warning(false, '[TimePicker]: the source function is expected to return an array or a Promise of an array.');\n\n return [];\n }\n\n return items.filter((item) => {\n if (!item) {\n return false;\n }\n\n if (!isTimeItem(item)) {\n return true;\n }\n\n if (isTimeItemObject(item) && typeof item.value !== 'string') {\n warning(false, '[TimePicker]: a source item is expected to be a time string or an object with a time value.');\n\n return false;\n }\n\n if (normalizeTimeValue(getTimeItemValue(item), format) === EMPTY_VALUE) {\n warning(false, `[TimePicker]: the source item value \"${getTimeItemValue(item)}\" is not a time.`);\n\n return false;\n }\n\n return true;\n });\n};\n\n/**\n * Оставляет в списке только первый элемент для каждого времени.\n * Времена сравниваются после нормализации к текущему формату,\n * поэтому в формате `HH:mm` элементы `12:00` и `12:00:30` считаются одинаковыми.\n * React-элементы не участвуют в сравнении и остаются на своих местах.\n */\nexport const dedupeTimeItems = <T extends TimeItemValue>(\n items: Array<TimePickerExtendedItem<T>>,\n format: TimeFormat,\n): Array<TimePickerExtendedItem<T>> => {\n const usedValues = new Set<string>();\n\n return items.filter((item) => {\n if (!isTimeItem(item)) {\n return true;\n }\n\n const normalizedValue = normalizeTimeValue(getTimeItemValue(item), format);\n\n if (usedValues.has(normalizedValue)) {\n return false;\n }\n\n usedValues.add(normalizedValue);\n\n return true;\n });\n};\n\n/**\n * Проверяет, выходит ли значение за диапазон `minTime`/`maxTime` после нормализации.\n * Пустое значение не считается выходящим за диапазон. Если `minTime > maxTime`, диапазон трактуется как переходящий через полночь.\n */\nexport const isTimeValueOutOfRange = (\n value: string,\n format: TimeFormat,\n minTime?: string,\n maxTime?: string,\n): boolean => {\n const normalizedValue = normalizeTimeValue(value, format);\n\n if (normalizedValue === EMPTY_VALUE) {\n return false;\n }\n\n const normalizedMinTime = normalizeTimeRangeValue(minTime, format);\n const normalizedMaxTime = normalizeTimeRangeValue(maxTime, format);\n\n if (normalizedMinTime && normalizedMaxTime && normalizedMinTime > normalizedMaxTime) {\n return normalizedValue < normalizedMinTime && normalizedValue > normalizedMaxTime;\n }\n\n return (\n (normalizedMinTime !== undefined && normalizedValue < normalizedMinTime) ||\n (normalizedMaxTime !== undefined && normalizedValue > normalizedMaxTime)\n );\n};\n\n/**\n * Нормализует display-значение в committed-форму `HH:mm[:ss]`.\n * Частично заполненные сегменты дополняются и ограничиваются максимумами сегментов.\n */\nexport const normalizeTimeValue = (value: string, format: TimeFormat): string => {\n if (isTimeDisplayEmpty(value)) {\n return EMPTY_VALUE;\n }\n\n const displaySegments = getDisplaySegments(value, format);\n\n return getTimeSegments(format)\n .map((segment, index) => normalizeTimeSegment(displaySegments[index], segment))\n .join(TIME_SEPARATOR);\n};\n\nconst normalizeTimeRangeValue = (value: string | undefined, format: TimeFormat): string | undefined => {\n if (!value) {\n return undefined;\n }\n\n const normalizedValue = normalizeTimeValue(value, format);\n\n return normalizedValue === EMPTY_VALUE ? undefined : normalizedValue;\n};\n\n/**\n * Преобразует display-значение в partial raw value для `onValueChange`.\n * Заполненные сегменты дополняются до двух цифр, пропущенные сегменты до последнего заполненного становятся `00`.\n */\nexport const serializeTimeValue = (value: string, format: TimeFormat): string => {\n const serializedSegments = getDisplaySegments(value, format).map((segmentValue) => {\n const digits = getDigits(segmentValue);\n\n return digits ? digits.padStart(EMPTY_SEGMENT.length, '0') : EMPTY_VALUE;\n });\n\n const lastFilledIndex = serializedSegments.reduce(\n (result, segmentValue, index) => (segmentValue ? index : result),\n -1,\n );\n\n if (lastFilledIndex < 0) {\n return EMPTY_VALUE;\n }\n\n return serializedSegments\n .slice(0, lastFilledIndex + 1)\n .map((segmentValue) => segmentValue || '00')\n .join(TIME_SEPARATOR);\n};\n\n/** Возвращает display-значение с плейсхолдерами из partial или committed value. */\nexport const getTimeDisplayValue = (value: string, format: TimeFormat): string => {\n if (value === EMPTY_VALUE) {\n return EMPTY_VALUE;\n }\n\n return getDisplaySegments(value, format).join(TIME_SEPARATOR);\n};\n\n/**\n * Возвращает display-значение внешнего `value`.\n * Сегменты, записанные одной цифрой, дополняются нулем, поэтому `9:00` показывается как `09:00` —\n * так же, как компонент показывает время элементов источника.\n * Значение без разделителя остается частично введенным: `1` — это первая цифра часов, а не `01:00`.\n */\nexport const getExternalTimeDisplayValue = (value: string, format: TimeFormat): string => {\n if (!value.includes(TIME_SEPARATOR)) {\n return getTimeDisplayValue(value, format);\n }\n\n const paddedSegments = value.split(TIME_SEPARATOR).map((segmentValue) => {\n const digits = getDigits(segmentValue);\n\n return digits ? digits.padStart(EMPTY_SEGMENT.length, ZERO_PAD_CHAR) : EMPTY_VALUE;\n });\n\n return getTimeDisplayValue(paddedSegments.join(TIME_SEPARATOR), format);\n};\n\n/** Заменяет значение выбранного сегмента, сохраняя остальные сегменты display-значения без изменений. */\nexport const replaceTimeSegment = (\n value: string,\n segment: TimeSegment,\n nextSegmentValue: string,\n format: TimeFormat,\n): string => {\n const segments = getDisplaySegments(value, format);\n const index = getTimeSegments(format).indexOf(segment);\n\n segments[index] = sanitizeSegment(nextSegmentValue);\n\n return segments.join(TIME_SEPARATOR);\n};\n\n/**\n * Проверяет, что вставленное значение похоже на время:\n * это либо сегменты из одной-двух цифр через любой разделитель — `12:30`, `9:5`, `1:23:45`, `12.30`, —\n * либо цифры подряд — `9`, `1230`, `123045`.\n * Строки, из которых время собралось бы случайно — `2026-08-01`, `hello 42`, — временем не считаются.\n */\nexport const isTimeLikePastedValue = (value: string): boolean => {\n const trimmedValue = value.trim();\n\n return TIME_LIKE_SEGMENTS_REGEXP.test(trimmedValue) || TIME_LIKE_DIGITS_REGEXP.test(trimmedValue);\n};\n\n/**\n * Парсит вставленное пользователем значение и сразу преобразует его в committed-форму.\n * Значение, не похожее на время, отдается как пустое: такую вставку компонент считает некорректным вводом.\n */\nexport const parsePastedTimeValue = (value: string, format: TimeFormat): string => {\n const trimmedValue = value.trim();\n\n if (!DIGIT_REGEXP.test(trimmedValue) || !isTimeLikePastedValue(trimmedValue)) {\n return EMPTY_VALUE;\n }\n\n // Разделители сегментов приводятся к одному виду, чтобы `9.5` разбирался так же, как `9:5`.\n const normalizedSeparators = TIME_LIKE_SEGMENTS_REGEXP.test(trimmedValue)\n ? trimmedValue.split(NON_DIGIT_REGEXP).join(TIME_SEPARATOR)\n : trimmedValue;\n\n const segments = getDisplaySegments(normalizedSeparators, format);\n\n return normalizeTimeValue(segments.join(TIME_SEPARATOR), format);\n};\n\n/** Возвращает текущее display-значение сегмента или пустой сегмент, если индекс отсутствует. */\nexport const getTimeSegmentValue = (value: string, segment: TimeSegment, format: TimeFormat): string => {\n const segments = getDisplaySegments(value, format);\n const index = getTimeSegments(format).indexOf(segment);\n\n return segments[index] ?? EMPTY_SEGMENT;\n};\n\n/** Возвращает полностью пустое display-значение для выбранной точности времени. */\nexport const getEmptyDisplayValue = (precision: TimeFormat): string =>\n getTimeSegments(precision)\n .map(() => EMPTY_SEGMENT)\n .join(TIME_SEPARATOR);\n\n/**\n * Преобразует display-значение в поисковый запрос для фильтрации элементов.\n * Сегменты содержат только введенные цифры, незаполненный хвост отбрасывается: `12:3_` => `12:3`, `1_:__` => `1`.\n * Позиции сегментов сохраняются, поэтому ведущие незаполненные сегменты остаются пустыми: `__:34` => `:34`.\n * Это нужно для посегментного сравнения в `filterTimeItems` и передается как есть в пользовательскую `source`.\n */\nexport const getTimeFilterQuery = (value: string, format: TimeFormat): string => {\n const segments = getDisplaySegments(value, format).map(getDigits);\n\n const lastFilledIndex = segments.reduce((result, segmentValue, index) => (segmentValue ? index : result), -1);\n\n if (lastFilledIndex < 0) {\n return EMPTY_VALUE;\n }\n\n return segments.slice(0, lastFilledIndex + 1).join(TIME_SEPARATOR);\n};\n\n/**\n * Дефолтная функция фильтрации элементов по запросу из поля ввода.\n * Сравнивает запрос посегментно: введенные цифры сегмента должны быть префиксом соответствующего сегмента элемента.\n * Пустой запрос возвращает все элементы.\n */\nexport const filterTimeItems = <T extends TimeItemValue>(\n items: Array<TimePickerExtendedItem<T>>,\n query: string,\n format: TimeFormat,\n): Array<TimePickerExtendedItem<T>> => {\n const querySegments = query.split(TIME_SEPARATOR).map(getDigits);\n\n if (querySegments.every((segmentValue) => !segmentValue)) {\n return items;\n }\n\n return items.filter((item) => {\n if (!isTimeItem(item)) {\n return true;\n }\n\n const itemSegments = getDisplaySegments(normalizeTimeValue(getTimeItemValue(item), format), format);\n\n return querySegments.every(\n (segmentValue, index) => !segmentValue || (itemSegments[index] ?? EMPTY_VALUE).startsWith(segmentValue),\n );\n });\n};\n"]}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { findNearestScrollableParent } from '../../../lib/dom/scrollYCenterIntoNearestScrollable.js';
|
|
2
|
-
import { getOwnerGlobalObject, isBrowser } from '../../../lib/globalObject.js';
|
|
3
|
-
/**
|
|
4
|
-
* Прокручивает ближайший scrollable-контейнер так, чтобы выбранный элемент оказался ближе к центру viewport контейнера.
|
|
5
|
-
*/
|
|
6
|
-
export var scrollSelectedItemIntoView = function (element) {
|
|
7
|
-
var globalObject = getOwnerGlobalObject(element);
|
|
8
|
-
if (!isBrowser(globalObject)) {
|
|
9
|
-
return;
|
|
10
|
-
}
|
|
11
|
-
var parent = findNearestScrollableParent(element);
|
|
12
|
-
if (!parent) {
|
|
13
|
-
return;
|
|
14
|
-
}
|
|
15
|
-
var elementRect = element.getBoundingClientRect();
|
|
16
|
-
var parentRect = parent.getBoundingClientRect();
|
|
17
|
-
var scrollTopPos = elementRect.top - parentRect.top;
|
|
18
|
-
var scrollBottomPos = elementRect.bottom - parentRect.bottom;
|
|
19
|
-
var scrollCenterPos = (scrollTopPos + scrollBottomPos) / 2;
|
|
20
|
-
if (scrollCenterPos !== 0) {
|
|
21
|
-
parent.scrollTo({ top: parent.scrollTop + scrollCenterPos });
|
|
22
|
-
}
|
|
23
|
-
};
|
|
24
|
-
//# sourceMappingURL=scrollSelectedItemIntoView.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scrollSelectedItemIntoView.js","sourceRoot":"","sources":["scrollSelectedItemIntoView.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,wDAAwD,CAAC;AACrG,OAAO,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAE/E;;GAEG;AACH,MAAM,CAAC,IAAM,0BAA0B,GAAG,UAAC,OAAoB;IAC7D,IAAM,YAAY,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAEnD,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,OAAO;IACT,CAAC;IAED,IAAM,MAAM,GAAG,2BAA2B,CAAC,OAAO,CAAC,CAAC;IAEpD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO;IACT,CAAC;IAED,IAAM,WAAW,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;IACpD,IAAM,UAAU,GAAG,MAAM,CAAC,qBAAqB,EAAE,CAAC;IAElD,IAAM,YAAY,GAAG,WAAW,CAAC,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC;IACtD,IAAM,eAAe,GAAG,WAAW,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IAC/D,IAAM,eAAe,GAAG,CAAC,YAAY,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IAE7D,IAAI,eAAe,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,SAAS,GAAG,eAAe,EAAE,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC,CAAC","sourcesContent":["import { findNearestScrollableParent } from '../../../lib/dom/scrollYCenterIntoNearestScrollable.js';\nimport { getOwnerGlobalObject, isBrowser } from '../../../lib/globalObject.js';\n\n/**\n * Прокручивает ближайший scrollable-контейнер так, чтобы выбранный элемент оказался ближе к центру viewport контейнера.\n */\nexport const scrollSelectedItemIntoView = (element: HTMLElement): void => {\n const globalObject = getOwnerGlobalObject(element);\n\n if (!isBrowser(globalObject)) {\n return;\n }\n\n const parent = findNearestScrollableParent(element);\n\n if (!parent) {\n return;\n }\n\n const elementRect = element.getBoundingClientRect();\n const parentRect = parent.getBoundingClientRect();\n\n const scrollTopPos = elementRect.top - parentRect.top;\n const scrollBottomPos = elementRect.bottom - parentRect.bottom;\n const scrollCenterPos = (scrollTopPos + scrollBottomPos) / 2;\n\n if (scrollCenterPos !== 0) {\n parent.scrollTo({ top: parent.scrollTop + scrollCenterPos });\n }\n};\n"]}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import type { Nullable } from '../../../typings/utility-types.js';
|
|
2
|
-
import type { TimeFormat, TimeItem } from './TimePicker.shared.js';
|
|
3
|
-
export interface TimePickerValidationOptions {
|
|
4
|
-
format?: TimeFormat;
|
|
5
|
-
minTime?: string;
|
|
6
|
-
maxTime?: string;
|
|
7
|
-
}
|
|
8
|
-
export declare const validateTimePicker: (value: Nullable<string | TimeItem>, options?: TimePickerValidationOptions) => boolean;
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { getTimeDisplayValue, getTimeValueString, isTimeValueOutOfRange, normalizeTimeValue, } from './TimePicker.value.js';
|
|
2
|
-
export var validateTimePicker = function (value, options) {
|
|
3
|
-
if (options === void 0) { options = {}; }
|
|
4
|
-
var timeValue = getTimeValueString(value);
|
|
5
|
-
if (!timeValue) {
|
|
6
|
-
return false;
|
|
7
|
-
}
|
|
8
|
-
var _a = options.format, format = _a === void 0 ? 'HH:mm' : _a, minTime = options.minTime, maxTime = options.maxTime;
|
|
9
|
-
if (getTimeDisplayValue(timeValue, format) !== timeValue) {
|
|
10
|
-
return false;
|
|
11
|
-
}
|
|
12
|
-
if (normalizeTimeValue(timeValue, format) !== timeValue) {
|
|
13
|
-
return false;
|
|
14
|
-
}
|
|
15
|
-
return !isTimeValueOutOfRange(timeValue, format, minTime, maxTime);
|
|
16
|
-
};
|
|
17
|
-
//# sourceMappingURL=validateTimePicker.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validateTimePicker.js","sourceRoot":"","sources":["validateTimePicker.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAQ/B,MAAM,CAAC,IAAM,kBAAkB,GAAG,UAChC,KAAkC,EAClC,OAAyC;IAAzC,wBAAA,EAAA,YAAyC;IAEzC,IAAM,SAAS,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAE5C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,IAAA,KAAuC,OAAO,OAA9B,EAAhB,MAAM,mBAAG,OAAO,KAAA,EAAE,OAAO,GAAc,OAAO,QAArB,EAAE,OAAO,GAAK,OAAO,QAAZ,CAAa;IAEvD,IAAI,mBAAmB,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,SAAS,EAAE,CAAC;QACzD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,kBAAkB,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,SAAS,EAAE,CAAC;QACxD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,CAAC,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACrE,CAAC,CAAC","sourcesContent":["import type { Nullable } from '../../../typings/utility-types.js';\nimport type { TimeFormat, TimeItem } from './TimePicker.shared.js';\nimport {\n getTimeDisplayValue,\n getTimeValueString,\n isTimeValueOutOfRange,\n normalizeTimeValue,\n} from './TimePicker.value.js';\n\nexport interface TimePickerValidationOptions {\n format?: TimeFormat;\n minTime?: string;\n maxTime?: string;\n}\n\nexport const validateTimePicker = (\n value: Nullable<string | TimeItem>,\n options: TimePickerValidationOptions = {},\n): boolean => {\n const timeValue = getTimeValueString(value);\n\n if (!timeValue) {\n return false;\n }\n\n const { format = 'HH:mm', minTime, maxTime } = options;\n\n if (getTimeDisplayValue(timeValue, format) !== timeValue) {\n return false;\n }\n\n if (normalizeTimeValue(timeValue, format) !== timeValue) {\n return false;\n }\n\n return !isTimeValueOutOfRange(timeValue, format, minTime, maxTime);\n};\n"]}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { type TimeItemValue, type TimePickerMenuItem } from '../helpers/TimePicker.shared.js';
|
|
2
|
-
interface UseTimePickerDropdownOptions<T extends TimeItemValue> {
|
|
3
|
-
hasDropdown: boolean;
|
|
4
|
-
disabled?: boolean;
|
|
5
|
-
items: Array<TimePickerMenuItem<T>>;
|
|
6
|
-
selectedItemIndex: number | null;
|
|
7
|
-
autoHighlightKey: string | null;
|
|
8
|
-
/**
|
|
9
|
-
* Состоянием открытости владеет компонент: от него зависит запрос элементов,
|
|
10
|
-
* а элементы, в свою очередь, нужны этому хуку для навигации.
|
|
11
|
-
*/
|
|
12
|
-
isDropdownOpened: boolean;
|
|
13
|
-
setIsDropdownOpened(isOpened: boolean): void;
|
|
14
|
-
}
|
|
15
|
-
interface UseTimePickerDropdownResult {
|
|
16
|
-
highlightedItemIndex: number | null;
|
|
17
|
-
openDropdown(): void;
|
|
18
|
-
closeDropdown(): void;
|
|
19
|
-
resetHighlightedItem(): void;
|
|
20
|
-
tryNavigateItems(step: 1 | -1): boolean;
|
|
21
|
-
}
|
|
22
|
-
export declare const useTimePickerDropdown: <T extends TimeItemValue>(options: UseTimePickerDropdownOptions<T>) => UseTimePickerDropdownResult;
|
|
23
|
-
export {};
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
2
|
-
import { isHighlightableMenuItem, isTimeMenuItem, } from '../helpers/TimePicker.shared.js';
|
|
3
|
-
export var useTimePickerDropdown = function (options) {
|
|
4
|
-
var hasDropdown = options.hasDropdown, disabled = options.disabled, items = options.items, selectedItemIndex = options.selectedItemIndex, autoHighlightKey = options.autoHighlightKey, isDropdownOpened = options.isDropdownOpened, setIsDropdownOpened = options.setIsDropdownOpened;
|
|
5
|
-
var _a = useState(null), highlightedItemIndex = _a[0], setHighlightedItemIndex = _a[1];
|
|
6
|
-
var lastAutoHighlightKeyRef = useRef(null);
|
|
7
|
-
var openDropdown = useCallback(function () {
|
|
8
|
-
if (!hasDropdown || disabled) {
|
|
9
|
-
return;
|
|
10
|
-
}
|
|
11
|
-
setIsDropdownOpened(true);
|
|
12
|
-
}, [disabled, hasDropdown, setIsDropdownOpened]);
|
|
13
|
-
var closeDropdown = useCallback(function () {
|
|
14
|
-
setIsDropdownOpened(false);
|
|
15
|
-
setHighlightedItemIndex(null);
|
|
16
|
-
}, [setIsDropdownOpened]);
|
|
17
|
-
var resetHighlightedItem = useCallback(function () {
|
|
18
|
-
setHighlightedItemIndex(null);
|
|
19
|
-
}, []);
|
|
20
|
-
useEffect(function () {
|
|
21
|
-
if (lastAutoHighlightKeyRef.current === autoHighlightKey) {
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
lastAutoHighlightKeyRef.current = autoHighlightKey;
|
|
25
|
-
if (autoHighlightKey === null) {
|
|
26
|
-
setHighlightedItemIndex(null);
|
|
27
|
-
return;
|
|
28
|
-
}
|
|
29
|
-
var firstEnabledItemIndex = items.findIndex(function (item) { return isTimeMenuItem(item) && !item.disabled; });
|
|
30
|
-
setHighlightedItemIndex(firstEnabledItemIndex >= 0 ? firstEnabledItemIndex : null);
|
|
31
|
-
}, [autoHighlightKey, items]);
|
|
32
|
-
useEffect(function () {
|
|
33
|
-
setHighlightedItemIndex(function (current) {
|
|
34
|
-
if (current === null) {
|
|
35
|
-
return current;
|
|
36
|
-
}
|
|
37
|
-
var item = items[current];
|
|
38
|
-
return !item || !isHighlightableMenuItem(item) ? null : current;
|
|
39
|
-
});
|
|
40
|
-
}, [items]);
|
|
41
|
-
var tryNavigateItems = useCallback(function (step) {
|
|
42
|
-
if (!hasDropdown || !isDropdownOpened) {
|
|
43
|
-
return false;
|
|
44
|
-
}
|
|
45
|
-
var enabledIndexes = items
|
|
46
|
-
.map(function (item, index) { return ({ item: item, index: index }); })
|
|
47
|
-
.filter(function (_a) {
|
|
48
|
-
var item = _a.item;
|
|
49
|
-
return isHighlightableMenuItem(item);
|
|
50
|
-
})
|
|
51
|
-
.map(function (_a) {
|
|
52
|
-
var index = _a.index;
|
|
53
|
-
return index;
|
|
54
|
-
});
|
|
55
|
-
if (enabledIndexes.length === 0) {
|
|
56
|
-
return false;
|
|
57
|
-
}
|
|
58
|
-
if (highlightedItemIndex === null) {
|
|
59
|
-
if (selectedItemIndex !== null) {
|
|
60
|
-
var selectedEnabledIndex = enabledIndexes.indexOf(selectedItemIndex);
|
|
61
|
-
if (selectedEnabledIndex >= 0) {
|
|
62
|
-
var nextEnabledIndex_1 = enabledIndexes[selectedEnabledIndex + step];
|
|
63
|
-
setHighlightedItemIndex(nextEnabledIndex_1 !== null && nextEnabledIndex_1 !== void 0 ? nextEnabledIndex_1 : (step > 0 ? enabledIndexes[0] : enabledIndexes[enabledIndexes.length - 1]));
|
|
64
|
-
return true;
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
setHighlightedItemIndex(step > 0 ? enabledIndexes[0] : enabledIndexes[enabledIndexes.length - 1]);
|
|
68
|
-
return true;
|
|
69
|
-
}
|
|
70
|
-
var currentIndex = enabledIndexes.indexOf(highlightedItemIndex);
|
|
71
|
-
var nextEnabledIndex = enabledIndexes[currentIndex + step];
|
|
72
|
-
setHighlightedItemIndex(nextEnabledIndex !== null && nextEnabledIndex !== void 0 ? nextEnabledIndex : (step > 0 ? enabledIndexes[0] : enabledIndexes[enabledIndexes.length - 1]));
|
|
73
|
-
return true;
|
|
74
|
-
}, [hasDropdown, highlightedItemIndex, isDropdownOpened, selectedItemIndex, items]);
|
|
75
|
-
return {
|
|
76
|
-
highlightedItemIndex: highlightedItemIndex,
|
|
77
|
-
openDropdown: openDropdown,
|
|
78
|
-
closeDropdown: closeDropdown,
|
|
79
|
-
resetHighlightedItem: resetHighlightedItem,
|
|
80
|
-
tryNavigateItems: tryNavigateItems,
|
|
81
|
-
};
|
|
82
|
-
};
|
|
83
|
-
//# sourceMappingURL=useTimePickerDropdown.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useTimePickerDropdown.js","sourceRoot":"","sources":["useTimePickerDropdown.ts"],"names":[],"mappings":"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","sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\n\nimport {\n isHighlightableMenuItem,\n isTimeMenuItem,\n type TimeItemValue,\n type TimePickerMenuItem,\n} from '../helpers/TimePicker.shared.js';\n\ninterface UseTimePickerDropdownOptions<T extends TimeItemValue> {\n hasDropdown: boolean;\n disabled?: boolean;\n items: Array<TimePickerMenuItem<T>>;\n selectedItemIndex: number | null;\n autoHighlightKey: string | null;\n /**\n * Состоянием открытости владеет компонент: от него зависит запрос элементов,\n * а элементы, в свою очередь, нужны этому хуку для навигации.\n */\n isDropdownOpened: boolean;\n setIsDropdownOpened(isOpened: boolean): void;\n}\n\ninterface UseTimePickerDropdownResult {\n highlightedItemIndex: number | null;\n openDropdown(): void;\n closeDropdown(): void;\n resetHighlightedItem(): void;\n tryNavigateItems(step: 1 | -1): boolean;\n}\n\nexport const useTimePickerDropdown = <T extends TimeItemValue>(\n options: UseTimePickerDropdownOptions<T>,\n): UseTimePickerDropdownResult => {\n const { hasDropdown, disabled, items, selectedItemIndex, autoHighlightKey, isDropdownOpened, setIsDropdownOpened } =\n options;\n\n const [highlightedItemIndex, setHighlightedItemIndex] = useState<number | null>(null);\n const lastAutoHighlightKeyRef = useRef<string | null>(null);\n\n const openDropdown = useCallback(() => {\n if (!hasDropdown || disabled) {\n return;\n }\n\n setIsDropdownOpened(true);\n }, [disabled, hasDropdown, setIsDropdownOpened]);\n\n const closeDropdown = useCallback(() => {\n setIsDropdownOpened(false);\n setHighlightedItemIndex(null);\n }, [setIsDropdownOpened]);\n\n const resetHighlightedItem = useCallback(() => {\n setHighlightedItemIndex(null);\n }, []);\n\n useEffect(() => {\n if (lastAutoHighlightKeyRef.current === autoHighlightKey) {\n return;\n }\n\n lastAutoHighlightKeyRef.current = autoHighlightKey;\n\n if (autoHighlightKey === null) {\n setHighlightedItemIndex(null);\n return;\n }\n\n const firstEnabledItemIndex = items.findIndex((item) => isTimeMenuItem(item) && !item.disabled);\n setHighlightedItemIndex(firstEnabledItemIndex >= 0 ? firstEnabledItemIndex : null);\n }, [autoHighlightKey, items]);\n\n useEffect(() => {\n setHighlightedItemIndex((current) => {\n if (current === null) {\n return current;\n }\n\n const item = items[current];\n\n return !item || !isHighlightableMenuItem(item) ? null : current;\n });\n }, [items]);\n\n const tryNavigateItems = useCallback(\n (step: 1 | -1) => {\n if (!hasDropdown || !isDropdownOpened) {\n return false;\n }\n\n const enabledIndexes = items\n .map((item, index) => ({ item, index }))\n .filter(({ item }) => isHighlightableMenuItem(item))\n .map(({ index }) => index);\n\n if (enabledIndexes.length === 0) {\n return false;\n }\n\n if (highlightedItemIndex === null) {\n if (selectedItemIndex !== null) {\n const selectedEnabledIndex = enabledIndexes.indexOf(selectedItemIndex);\n\n if (selectedEnabledIndex >= 0) {\n const nextEnabledIndex = enabledIndexes[selectedEnabledIndex + step];\n\n setHighlightedItemIndex(\n nextEnabledIndex ?? (step > 0 ? enabledIndexes[0] : enabledIndexes[enabledIndexes.length - 1]),\n );\n return true;\n }\n }\n\n setHighlightedItemIndex(step > 0 ? enabledIndexes[0] : enabledIndexes[enabledIndexes.length - 1]);\n return true;\n }\n\n const currentIndex = enabledIndexes.indexOf(highlightedItemIndex);\n const nextEnabledIndex = enabledIndexes[currentIndex + step];\n\n setHighlightedItemIndex(\n nextEnabledIndex ?? (step > 0 ? enabledIndexes[0] : enabledIndexes[enabledIndexes.length - 1]),\n );\n\n return true;\n },\n [hasDropdown, highlightedItemIndex, isDropdownOpened, selectedItemIndex, items],\n );\n\n return {\n highlightedItemIndex,\n openDropdown,\n closeDropdown,\n resetHighlightedItem,\n tryNavigateItems,\n };\n};\n"]}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import type { TimeInputRef } from '../../../internal/TimeInput/index.js';
|
|
2
|
-
import type { TimeFormat, TimeSegment } from '../helpers/TimePicker.shared.js';
|
|
3
|
-
type TimePickerSelection = TimeSegment | 'all';
|
|
4
|
-
interface UseTimePickerSelectionOptions {
|
|
5
|
-
isInputFocused: boolean;
|
|
6
|
-
format: TimeFormat;
|
|
7
|
-
getInput: () => TimeInputRef | null;
|
|
8
|
-
displayValue: string;
|
|
9
|
-
}
|
|
10
|
-
interface UseTimePickerSelectionResult {
|
|
11
|
-
selection: TimePickerSelection;
|
|
12
|
-
selectedSegment: TimeSegment;
|
|
13
|
-
selectSegment: (segment: TimeSegment) => void;
|
|
14
|
-
selectAll: () => void;
|
|
15
|
-
syncSelectionWithDOM: () => boolean;
|
|
16
|
-
}
|
|
17
|
-
export declare const useTimePickerSelection: (options: UseTimePickerSelectionOptions) => UseTimePickerSelectionResult;
|
|
18
|
-
export {};
|