@skbkontur/react-ui 6.1.7-65057.0 → 6.1.7-8e9d5.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/components/TimePicker/TimePicker.d.ts +36 -29
- package/components/TimePicker/TimePicker.js +234 -132
- package/components/TimePicker/TimePicker.js.map +1 -1
- package/components/TimePicker/TimePicker.styles.d.ts +2 -2
- package/components/TimePicker/TimePicker.styles.js +4 -4
- package/components/TimePicker/TimePicker.styles.js.map +1 -1
- package/components/TimePicker/TimePickerItems.d.ts +5 -1
- package/components/TimePicker/TimePickerItems.js +16 -13
- package/components/TimePicker/TimePickerItems.js.map +1 -1
- package/components/TimePicker/TimePickerMobilePopup.d.ts +5 -2
- package/components/TimePicker/TimePickerMobilePopup.js +3 -3
- package/components/TimePicker/TimePickerMobilePopup.js.map +1 -1
- package/components/TimePicker/TimePickerPopup.d.ts +5 -1
- package/components/TimePicker/TimePickerPopup.js +2 -2
- package/components/TimePicker/TimePickerPopup.js.map +1 -1
- package/components/TimePicker/helpers/TimePicker.constants.d.ts +3 -1
- package/components/TimePicker/helpers/TimePicker.constants.js +3 -7
- package/components/TimePicker/helpers/TimePicker.constants.js.map +1 -1
- package/components/TimePicker/helpers/TimePicker.editing.d.ts +1 -5
- package/components/TimePicker/helpers/TimePicker.editing.js +8 -35
- package/components/TimePicker/helpers/TimePicker.editing.js.map +1 -1
- package/components/TimePicker/helpers/TimePicker.shared.d.ts +15 -24
- package/components/TimePicker/helpers/TimePicker.shared.js +13 -27
- package/components/TimePicker/helpers/TimePicker.shared.js.map +1 -1
- package/components/TimePicker/helpers/TimePicker.value.d.ts +3 -13
- package/components/TimePicker/helpers/TimePicker.value.js +13 -43
- package/components/TimePicker/helpers/TimePicker.value.js.map +1 -1
- package/components/TimePicker/helpers/scrollSelectedItemIntoView.d.ts +2 -0
- package/components/TimePicker/helpers/scrollSelectedItemIntoView.js +2 -0
- package/components/TimePicker/helpers/scrollSelectedItemIntoView.js.map +1 -1
- package/components/TimePicker/helpers/validateTimePicker.js +2 -4
- package/components/TimePicker/helpers/validateTimePicker.js.map +1 -1
- package/components/TimePicker/hooks/useTimePickerDropdown.js +9 -25
- package/components/TimePicker/hooks/useTimePickerDropdown.js.map +1 -1
- package/components/TimePicker/hooks/useTimePickerSource.d.ts +3 -1
- package/components/TimePicker/hooks/useTimePickerSource.js +14 -6
- package/components/TimePicker/hooks/useTimePickerSource.js.map +1 -1
- package/components/TimePicker/hooks/useTimePickerValue.d.ts +9 -4
- package/components/TimePicker/hooks/useTimePickerValue.js +22 -23
- package/components/TimePicker/hooks/useTimePickerValue.js.map +1 -1
- package/components/TimePicker/index.d.ts +1 -1
- package/components/TimePicker/index.js.map +1 -1
- package/components/TimePicker/locale/locales/en.js +2 -0
- package/components/TimePicker/locale/locales/en.js.map +1 -1
- package/components/TimePicker/locale/locales/ru.js +2 -0
- package/components/TimePicker/locale/locales/ru.js.map +1 -1
- package/components/TimePicker/locale/types.d.ts +2 -0
- package/components/TimePicker/locale/types.js.map +1 -1
- package/internal/NativeTimeInput/NativeTimeInput.d.ts +4 -0
- package/internal/NativeTimeInput/NativeTimeInput.js +7 -2
- package/internal/NativeTimeInput/NativeTimeInput.js.map +1 -1
- package/internal/NativeTimeInput/NativeTimeInput.utils.d.ts +2 -0
- package/internal/NativeTimeInput/NativeTimeInput.utils.js +4 -8
- package/internal/NativeTimeInput/NativeTimeInput.utils.js.map +1 -1
- package/internal/TimeInput/TimeFragments.d.ts +0 -1
- package/internal/TimeInput/TimeFragments.js +30 -8
- package/internal/TimeInput/TimeFragments.js.map +1 -1
- package/internal/TimeInput/TimeFragments.styles.d.ts +15 -0
- package/internal/TimeInput/TimeFragments.styles.js +39 -9
- package/internal/TimeInput/TimeFragments.styles.js.map +1 -1
- package/internal/TimeInput/TimeInput.d.ts +0 -1
- package/internal/TimeInput/TimeInput.js +0 -1
- package/internal/TimeInput/TimeInput.js.map +1 -1
- package/package.json +1 -1
|
@@ -22,23 +22,25 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
22
22
|
};
|
|
23
23
|
import React, { useCallback, useContext, useEffect, useImperativeHandle, useLayoutEffect, useMemo, useRef, useState, } from 'react';
|
|
24
24
|
import { CommonWrapper } from '../../internal/CommonWrapper/index.js';
|
|
25
|
+
import { extractCommonProps } from '../../internal/CommonWrapper/utils/extractCommonProps.js';
|
|
25
26
|
import { LoadingIcon } from '../../internal/icons2022/LoadingIcon.js';
|
|
26
27
|
import { NativeTimeInput } from '../../internal/NativeTimeInput/index.js';
|
|
27
28
|
import { TimeInput } from '../../internal/TimeInput/index.js';
|
|
28
|
-
import { isIOS
|
|
29
|
+
import { isIOS } from '../../lib/client.js';
|
|
29
30
|
import { isKeyArrowDown, isKeyArrowLeft, isKeyArrowRight, isKeyArrowUp, isKeyBackspace, isKeyChar, isKeyDelete, isKeyEnter, isKeyEscape, isKeySpace, isKeyTab, isModShift, isShortcutSelectAll, } from '../../lib/events/keyboard/identifiers.js';
|
|
30
31
|
import { forwardRefAndName } from '../../lib/forwardRefAndName.js';
|
|
31
32
|
import { useLocaleForControl } from '../../lib/locale/useLocaleForControl.js';
|
|
32
33
|
import { useStyles } from '../../lib/renderEnvironment/index.js';
|
|
33
34
|
import { ThemeContext } from '../../lib/theming/ThemeContext.js';
|
|
34
35
|
import { getRandomID } from '../../lib/utils.js';
|
|
36
|
+
import { useResponsiveLayout } from '../ResponsiveLayout/index.js';
|
|
35
37
|
import { scrollSelectedItemIntoView } from './helpers/scrollSelectedItemIntoView.js';
|
|
36
38
|
import { DIGIT_REGEXP, EMPTY_SEGMENT, EMPTY_VALUE, TimePickerDataTids } from './helpers/TimePicker.constants.js';
|
|
37
39
|
import { commitTimeSegmentOnLeave, deleteTimeSegmentDigit, formatDigitToTimeSegment, shiftTimeSegmentValue, } from './helpers/TimePicker.editing.js';
|
|
38
40
|
import { getTimePickerPopupMaxHeight } from './helpers/TimePicker.layout.js';
|
|
39
41
|
import { getNextTimeSegment, getPreviousTimeSegment } from './helpers/TimePicker.selection.js';
|
|
40
42
|
import { isNavigableMenuElement, isTimeItem, isTimeItemObject, isTimeMenuItem, timeValueToItem, } from './helpers/TimePicker.shared.js';
|
|
41
|
-
import {
|
|
43
|
+
import { filterTimeItems, getEmptyDisplayValue, getTimeFilterQuery, getTimeValueString, isTimeDisplayEmpty, normalizeTimeValue, parsePastedTimeValue, replaceTimeSegment, resolveTimeItems, } from './helpers/TimePicker.value.js';
|
|
42
44
|
import { validateTimePicker } from './helpers/validateTimePicker.js';
|
|
43
45
|
import { useTimePickerDropdown } from './hooks/useTimePickerDropdown.js';
|
|
44
46
|
import { useTimePickerSelection } from './hooks/useTimePickerSelection.js';
|
|
@@ -56,28 +58,43 @@ var EMPTY_MENU_ITEMS = [];
|
|
|
56
58
|
*/
|
|
57
59
|
export var TimePicker = Object.assign(forwardRefAndName('TimePicker', function (props, ref) {
|
|
58
60
|
var _a;
|
|
59
|
-
|
|
61
|
+
// `className`, `style` и data-атрибуты применяет `CommonWrapper` к корневому элементу,
|
|
62
|
+
// поэтому в поле ввода они не должны уехать повторно.
|
|
63
|
+
var _b = extractCommonProps(props), notCommonProps = _b[1];
|
|
64
|
+
var disabled = notCommonProps.disabled, _c = notCommonProps.useMobileNativeTimePicker, useMobileNativeTimePicker = _c === void 0 ? false : _c, _d = notCommonProps.format, format = _d === void 0 ? 'HH:mm' : _d, _e = notCommonProps.size, size = _e === void 0 ? 'small' : _e, source = notCommonProps.source, renderItem = notCommonProps.renderItem, menuPos = notCommonProps.menuPos, menuAlign = notCommonProps.menuAlign, menuWidth = notCommonProps.menuWidth, minTime = notCommonProps.minTime, maxTime = notCommonProps.maxTime, rightIcon = notCommonProps.rightIcon, suffix = notCommonProps.suffix, corners = notCommonProps.corners, value = notCommonProps.value, valueToItem = notCommonProps.valueToItem, onValueChange = notCommonProps.onValueChange, onInputValueChange = notCommonProps.onInputValueChange, onUnexpectedInput = notCommonProps.onUnexpectedInput, onFocus = notCommonProps.onFocus, onBlur = notCommonProps.onBlur, onClick = notCommonProps.onClick, onKeyDown = notCommonProps.onKeyDown, onPaste = notCommonProps.onPaste, inputProps = __rest(notCommonProps, ["disabled", "useMobileNativeTimePicker", "format", "size", "source", "renderItem", "menuPos", "menuAlign", "menuWidth", "minTime", "maxTime", "rightIcon", "suffix", "corners", "value", "valueToItem", "onValueChange", "onInputValueChange", "onUnexpectedInput", "onFocus", "onBlur", "onClick", "onKeyDown", "onPaste"]);
|
|
60
65
|
var theme = useContext(ThemeContext);
|
|
61
66
|
var styles = useStyles(getStyles);
|
|
62
67
|
var locale = useLocaleForControl('TimePicker', TimePickerLocaleHelper);
|
|
63
|
-
var
|
|
68
|
+
var _f = useState(false), isInputFocused = _f[0], setIsInputFocused = _f[1];
|
|
64
69
|
var inputRef = useRef(null);
|
|
65
70
|
var mobileInputRef = useRef(null);
|
|
66
71
|
var nativeInputRef = useRef(null);
|
|
67
72
|
var rootRef = useRef(null);
|
|
68
73
|
var itemRefs = useRef(new Map());
|
|
69
74
|
var isMouseFocusRef = useRef(false);
|
|
70
|
-
|
|
75
|
+
/** Сегмент, по которому нажали мышью, или `null`, если нажали мимо сегментов. */
|
|
71
76
|
var mouseDownSegmentRef = useRef(null);
|
|
72
77
|
var mobileBlurEventRef = useRef(null);
|
|
73
78
|
var shouldSkipOpenOnFocusRef = useRef(false);
|
|
79
|
+
/**
|
|
80
|
+
* Контрол считает себя сфокусированным: о фокусе сообщено наружу, а сессия ввода не закончена.
|
|
81
|
+
* Внутри одной сессии фокус может переезжать между полем и инпутом мобильного попапа —
|
|
82
|
+
* например вместе со сменой верстки, — и такой переезд не начинает сессию заново.
|
|
83
|
+
*/
|
|
84
|
+
var isControlFocusedRef = useRef(false);
|
|
85
|
+
/** Фокус, который контрол сам переводит в скрытый нативный инпут, открывая системный пикер. */
|
|
86
|
+
var isMovingFocusToNativePickerRef = useRef(false);
|
|
74
87
|
var popupIdRef = useRef(TimePickerDataTids.popup + getRandomID());
|
|
75
|
-
|
|
76
|
-
|
|
88
|
+
/**
|
|
89
|
+
* Мобильная версия включается медиавыражением темы, как в ComboBox:
|
|
90
|
+
* поле переключается между мобильной и десктопной версией вместе с версткой страницы.
|
|
91
|
+
*/
|
|
92
|
+
var isMobileLayout = useResponsiveLayout().isMobile;
|
|
93
|
+
var canUseMobileNativeTimePicker = useMobileNativeTimePicker && isMobileLayout;
|
|
77
94
|
var isSourceFunction = typeof source === 'function';
|
|
78
95
|
var hasDropdown = isSourceFunction || (Array.isArray(source) && source.length > 0);
|
|
79
|
-
var
|
|
80
|
-
var
|
|
96
|
+
var _g = useState(false), isDropdownOpened = _g[0], setIsDropdownOpened = _g[1];
|
|
97
|
+
var _h = useState(false), isEditedAfterOpen = _h[0], setIsEditedAfterOpen = _h[1];
|
|
81
98
|
/**
|
|
82
99
|
* Форма элементов функции-источника: последняя, о которой компонент знает.
|
|
83
100
|
* Форма запоминается, потому что элементы функции очищаются при закрытии меню,
|
|
@@ -94,18 +111,53 @@ export var TimePicker = Object.assign(forwardRefAndName('TimePicker', function (
|
|
|
94
111
|
var shouldBuildItemAsObjectRef = useRef(false);
|
|
95
112
|
var valueToItemRef = useRef(valueToItem);
|
|
96
113
|
valueToItemRef.current = valueToItem;
|
|
97
|
-
var handleCommitValue = useCallback(function (
|
|
114
|
+
var handleCommitValue = useCallback(function (nextValue, item) {
|
|
98
115
|
var _a, _b;
|
|
99
116
|
if (!onValueChange) {
|
|
100
117
|
return;
|
|
101
118
|
}
|
|
102
|
-
if (
|
|
103
|
-
|
|
119
|
+
if (nextValue === EMPTY_VALUE) {
|
|
120
|
+
// Пустое значение повторяет форму элементов: у объектов элемента нет, а строка остается строкой.
|
|
121
|
+
onValueChange(shouldBuildItemAsObjectRef.current ? null : EMPTY_VALUE);
|
|
104
122
|
return;
|
|
105
123
|
}
|
|
106
|
-
var nextItem = (_b = item !== null && item !== void 0 ? item : (_a = valueToItemRef.current) === null || _a === void 0 ? void 0 : _a.call(valueToItemRef,
|
|
107
|
-
onValueChange(nextItem
|
|
124
|
+
var nextItem = (_b = item !== null && item !== void 0 ? item : (_a = valueToItemRef.current) === null || _a === void 0 ? void 0 : _a.call(valueToItemRef, nextValue)) !== null && _b !== void 0 ? _b : timeValueToItem(nextValue, shouldBuildItemAsObjectRef.current);
|
|
125
|
+
onValueChange(nextItem);
|
|
108
126
|
}, [onValueChange]);
|
|
127
|
+
var onBlurRef = useRef(onBlur);
|
|
128
|
+
onBlurRef.current = onBlur;
|
|
129
|
+
var pendingBlurEventRef = useRef(null);
|
|
130
|
+
var _j = useState(0), blurRequestId = _j[0], setBlurRequestId = _j[1];
|
|
131
|
+
/**
|
|
132
|
+
* Завершает сессию фокуса и откладывает `onBlur` до конца рендера, как это делает ComboBox.
|
|
133
|
+
* Значение коммитится синхронно с потерей фокуса, поэтому вызванный тут же `onBlur`
|
|
134
|
+
* попал бы в обработчик с состоянием родителя до изменения значения — например с пустым временем.
|
|
135
|
+
* Событие может отсутствовать: сессия все равно закрывается, но наружу ничего не уходит.
|
|
136
|
+
*/
|
|
137
|
+
var emitBlur = useCallback(function (event) {
|
|
138
|
+
if (!isControlFocusedRef.current) {
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
isControlFocusedRef.current = false;
|
|
142
|
+
if (!event || !onBlurRef.current) {
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
event.persist();
|
|
146
|
+
pendingBlurEventRef.current = event;
|
|
147
|
+
setBlurRequestId(function (currentId) { return currentId + 1; });
|
|
148
|
+
}, []);
|
|
149
|
+
var flushPendingBlur = useCallback(function () {
|
|
150
|
+
var _a;
|
|
151
|
+
var pendingBlurEvent = pendingBlurEventRef.current;
|
|
152
|
+
if (!pendingBlurEvent) {
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
pendingBlurEventRef.current = null;
|
|
156
|
+
(_a = onBlurRef.current) === null || _a === void 0 ? void 0 : _a.call(onBlurRef, pendingBlurEvent);
|
|
157
|
+
}, []);
|
|
158
|
+
useEffect(flushPendingBlur, [blurRequestId, flushPendingBlur]);
|
|
159
|
+
/** Родитель мог убрать поле в ответ на коммит значения — отложенное событие все равно должно уйти. */
|
|
160
|
+
useEffect(function () { return flushPendingBlur; }, [flushPendingBlur]);
|
|
109
161
|
var _k = useTimePickerValue({
|
|
110
162
|
isInputFocused: isInputFocused,
|
|
111
163
|
format: format,
|
|
@@ -113,9 +165,9 @@ export var TimePicker = Object.assign(forwardRefAndName('TimePicker', function (
|
|
|
113
165
|
isValueControlled: value !== undefined,
|
|
114
166
|
onCommitValue: handleCommitValue,
|
|
115
167
|
onInputValueChange: onInputValueChange,
|
|
116
|
-
}), editingValue = _k.editingValue, editingValueRef = _k.editingValueRef, updateEditingValue = _k.updateEditingValue, commitEditingValue = _k.commitEditingValue, commitValue = _k.commitValue, commitItem = _k.commitItem;
|
|
168
|
+
}), editingValue = _k.editingValue, editingValueRef = _k.editingValueRef, committedValue = _k.committedValue, updateEditingValue = _k.updateEditingValue, commitEditingValue = _k.commitEditingValue, commitValue = _k.commitValue, commitItem = _k.commitItem;
|
|
117
169
|
var filterQuery = isEditedAfterOpen ? getTimeFilterQuery(editingValue, format) : EMPTY_VALUE;
|
|
118
|
-
var _l = useTimePickerSource({ source: source, format: format, isDropdownOpened: isDropdownOpened, filterQuery: filterQuery }), sourceValueItems = _l.items, fetchedItemsQuery = _l.fetchedQuery, isLoadingItems = _l.isLoading;
|
|
170
|
+
var _l = useTimePickerSource({ source: source, format: format, isDropdownOpened: isDropdownOpened, filterQuery: filterQuery }), sourceValueItems = _l.items, fetchedItemsQuery = _l.fetchedQuery, isLoadingItems = _l.isLoading, isSourceFailed = _l.isFailed, retrySource = _l.retry;
|
|
119
171
|
useEffect(function () {
|
|
120
172
|
if (!isSourceFunction || sourceValueItems.some(isTimeItem)) {
|
|
121
173
|
lastSourceItemShapeRef.current = sourceValueItems.some(function (item) { return isTimeItem(item) && isTimeItemObject(item); });
|
|
@@ -123,17 +175,17 @@ export var TimePicker = Object.assign(forwardRefAndName('TimePicker', function (
|
|
|
123
175
|
shouldBuildItemAsObjectRef.current =
|
|
124
176
|
lastSourceItemShapeRef.current === true || (value !== null && value !== undefined && isTimeItemObject(value));
|
|
125
177
|
}, [isSourceFunction, sourceValueItems, value]);
|
|
126
|
-
var
|
|
127
|
-
/**
|
|
128
|
-
* Элементы для отрисовки: время и подпись достаются из элемента,
|
|
129
|
-
* а `disabled` дополняется проверкой диапазона `minTime`/`maxTime`.
|
|
130
|
-
* Исходный элемент сохраняется как есть — именно он уходит в `onValueChange`.
|
|
131
|
-
*/
|
|
132
|
-
var resolvedItems = useMemo(function () { return resolveTimeItems(filteredItems, format, minTime, maxTime); }, [maxTime, minTime, format, filteredItems]);
|
|
178
|
+
var resolvedItems = useMemo(function () { return resolveTimeItems(filterTimeItems(sourceValueItems, filterQuery, format), format, minTime, maxTime); }, [filterQuery, format, maxTime, minTime, sourceValueItems]);
|
|
133
179
|
var popupMaxHeight = getTimePickerPopupMaxHeight(size, theme);
|
|
134
180
|
var ariaPlaceholder = format === 'HH:mm' ? locale.ariaPlaceholderHHMM : locale.ariaPlaceholderHHMMSS;
|
|
135
|
-
|
|
136
|
-
|
|
181
|
+
/**
|
|
182
|
+
* Время, отмеченное в меню выбранным.
|
|
183
|
+
* Пока пользователь не начал править значение при открытом меню, это то же время, что в поле.
|
|
184
|
+
* С началом правки отмечено остается закоммиченное значение: набор фильтра — например `10` —
|
|
185
|
+
* не должен отмечать элемент `10:00` как уже выбранный.
|
|
186
|
+
*/
|
|
187
|
+
var selectedValue = normalizeTimeValue(isEditedAfterOpen ? committedValue : editingValue, format);
|
|
188
|
+
var selectedItemIndex = resolvedItems.findIndex(function (item) { return isTimeMenuItem(item) && normalizeTimeValue(item.value, format) === selectedValue; });
|
|
137
189
|
var autoHighlightKey = null;
|
|
138
190
|
if (filterQuery !== EMPTY_VALUE) {
|
|
139
191
|
if (isSourceFunction) {
|
|
@@ -145,12 +197,16 @@ export var TimePicker = Object.assign(forwardRefAndName('TimePicker', function (
|
|
|
145
197
|
autoHighlightKey = "source-array:".concat(filterQuery);
|
|
146
198
|
}
|
|
147
199
|
}
|
|
148
|
-
var canUseMobileDropdownTimePicker = hasDropdown &&
|
|
200
|
+
var canUseMobileDropdownTimePicker = hasDropdown && isMobileLayout && !canUseMobileNativeTimePicker;
|
|
201
|
+
/** Ввод идет в мобильном попапе: он открыт, а нативного пикера в этом режиме нет. */
|
|
202
|
+
var isMobileDropdownActive = canUseMobileDropdownTimePicker && isDropdownOpened;
|
|
149
203
|
/**
|
|
150
204
|
* Меню с одними лишь заголовками и разделителями показывать не о чем,
|
|
151
205
|
* поэтому при активном фильтре нужен хотя бы один подошедший элемент со временем.
|
|
152
206
|
*/
|
|
153
|
-
var hasDropdownContent = isLoadingItems ||
|
|
207
|
+
var hasDropdownContent = isLoadingItems ||
|
|
208
|
+
isSourceFailed ||
|
|
209
|
+
(filterQuery === EMPTY_VALUE ? resolvedItems.length > 0 : resolvedItems.some(isTimeMenuItem));
|
|
154
210
|
/**
|
|
155
211
|
* Элементы, с которыми работает клавиатура.
|
|
156
212
|
* Пока меню скрыто, их нет: иначе стрелки ходили бы по невидимому списку,
|
|
@@ -159,16 +215,16 @@ export var TimePicker = Object.assign(forwardRefAndName('TimePicker', function (
|
|
|
159
215
|
var menuItems = hasDropdownContent ? resolvedItems : EMPTY_MENU_ITEMS;
|
|
160
216
|
var inputRightIcon = isLoadingItems && resolvedItems.length > 0 ? (React.createElement("span", { "data-tid": TimePickerDataTids.inputLoading },
|
|
161
217
|
React.createElement(LoadingIcon, { size: size }))) : (rightIcon);
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
}
|
|
218
|
+
/** Сфокусированное поле всегда показывает сегменты, а пустое без фокуса — ничего. */
|
|
219
|
+
var getDisplayValue = function () {
|
|
220
|
+
if (isInputFocused) {
|
|
221
|
+
return editingValue || getEmptyDisplayValue(format);
|
|
222
|
+
}
|
|
223
|
+
return isTimeDisplayEmpty(editingValue) ? EMPTY_VALUE : editingValue;
|
|
224
|
+
};
|
|
225
|
+
var displayValue = getDisplayValue();
|
|
169
226
|
var resetMouseInteractionState = useCallback(function () {
|
|
170
227
|
isMouseFocusRef.current = false;
|
|
171
|
-
isMouseDownOnFragmentRef.current = false;
|
|
172
228
|
mouseDownSegmentRef.current = null;
|
|
173
229
|
}, []);
|
|
174
230
|
var updateEditingValueAfterUserEdit = useCallback(function (nextEditingValue) {
|
|
@@ -186,13 +242,21 @@ export var TimePicker = Object.assign(forwardRefAndName('TimePicker', function (
|
|
|
186
242
|
if (!canUseMobileNativeTimePicker || disabled) {
|
|
187
243
|
return;
|
|
188
244
|
}
|
|
245
|
+
// На iOS системный пикер открывается только фокусом, поэтому фокус уходит из поля в скрытый инпут.
|
|
246
|
+
isMovingFocusToNativePickerRef.current = true;
|
|
189
247
|
if (isIOS) {
|
|
190
248
|
(_a = nativeInputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
191
249
|
}
|
|
192
250
|
else {
|
|
193
251
|
(_b = nativeInputRef.current) === null || _b === void 0 ? void 0 : _b.click();
|
|
194
252
|
}
|
|
253
|
+
isMovingFocusToNativePickerRef.current = false;
|
|
195
254
|
}, [canUseMobileNativeTimePicker, disabled]);
|
|
255
|
+
/** Фокус ушел в скрытый нативный инпут: для внешнего мира контрол остается активным. */
|
|
256
|
+
var isFocusMovedToNativePicker = function (event) {
|
|
257
|
+
return isMovingFocusToNativePickerRef.current ||
|
|
258
|
+
(nativeInputRef.current !== null && event.relatedTarget === nativeInputRef.current.getNode());
|
|
259
|
+
};
|
|
196
260
|
var _m = useTimePickerDropdown({
|
|
197
261
|
disabled: disabled,
|
|
198
262
|
hasDropdown: hasDropdown,
|
|
@@ -215,65 +279,59 @@ export var TimePicker = Object.assign(forwardRefAndName('TimePicker', function (
|
|
|
215
279
|
var popupId = popupIdRef.current;
|
|
216
280
|
var highlightedMenuItem = highlightedItemIndex === null ? undefined : menuItems[highlightedItemIndex];
|
|
217
281
|
/** Кастомный `MenuItem` может принести свой `id` — тогда указывать нужно именно на него. */
|
|
218
|
-
var activeDescendantId =
|
|
282
|
+
var activeDescendantId = highlightedMenuItem
|
|
219
283
|
? ((_a = (isNavigableMenuElement(highlightedMenuItem) ? highlightedMenuItem.props.id : undefined)) !== null && _a !== void 0 ? _a : "".concat(popupId, "-item-").concat(highlightedItemIndex))
|
|
220
284
|
: undefined;
|
|
221
|
-
var
|
|
222
|
-
var getActiveInput = useCallback(function () { return (canUseMobileDropdownTimePicker && isDropdownOpened ? mobileInputRef.current : inputRef.current); }, [canUseMobileDropdownTimePicker, isDropdownOpened]);
|
|
285
|
+
var getActiveInput = useCallback(function () { return (isMobileDropdownActive ? mobileInputRef.current : inputRef.current); }, [isMobileDropdownActive]);
|
|
223
286
|
var _o = useTimePickerSelection({
|
|
224
287
|
isInputFocused: isInputFocused,
|
|
225
288
|
format: format,
|
|
226
289
|
displayValue: displayValue,
|
|
227
290
|
getInput: getActiveInput,
|
|
228
291
|
}), selection = _o.selection, selectedSegment = _o.selectedSegment, selectSegment = _o.selectSegment, selectAll = _o.selectAll, syncSelectionWithDOM = _o.syncSelectionWithDOM;
|
|
229
|
-
var
|
|
292
|
+
var blinkInput = useCallback(function () {
|
|
230
293
|
var _a;
|
|
231
294
|
(_a = getActiveInput()) === null || _a === void 0 ? void 0 : _a.blink();
|
|
232
295
|
}, [getActiveInput]);
|
|
233
|
-
/**
|
|
234
|
-
* Сообщает о некорректном вводе: нажатой клавише или вставленном значении, которое не может быть временем.
|
|
235
|
-
* Если обработчик не задан, поле вспыхивает само.
|
|
236
|
-
*/
|
|
237
296
|
var handleUnexpectedInput = useCallback(function (unexpectedValue) {
|
|
238
|
-
if (onUnexpectedInput) {
|
|
239
|
-
|
|
297
|
+
if (!onUnexpectedInput) {
|
|
298
|
+
blinkInput();
|
|
240
299
|
return;
|
|
241
300
|
}
|
|
242
|
-
|
|
243
|
-
|
|
301
|
+
var returnedValue = onUnexpectedInput(unexpectedValue, blinkInput);
|
|
302
|
+
if (returnedValue === undefined) {
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
if (returnedValue === null) {
|
|
306
|
+
commitValue(EMPTY_VALUE);
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
commitItem(returnedValue);
|
|
310
|
+
}, [blinkInput, commitItem, commitValue, onUnexpectedInput]);
|
|
311
|
+
/** Закрывает открытое меню: мобильный попап заодно завершает сессию ввода, как потеря фокуса. */
|
|
244
312
|
var closeOpenedDropdown = useCallback(function () {
|
|
245
|
-
var _a;
|
|
246
|
-
if (
|
|
313
|
+
var _a, _b;
|
|
314
|
+
if (isMobileDropdownActive) {
|
|
315
|
+
// Фокус может остаться в любом из двух полей: инпут попапа не всегда получает его —
|
|
316
|
+
// например мобильный браузер отказывается переводить фокус без жеста пользователя.
|
|
317
|
+
// Гасим оба, чтобы закрытие попапа всегда давало событие потери фокуса.
|
|
247
318
|
(_a = mobileInputRef.current) === null || _a === void 0 ? void 0 : _a.blur();
|
|
319
|
+
(_b = inputRef.current) === null || _b === void 0 ? void 0 : _b.blur();
|
|
248
320
|
setIsInputFocused(false);
|
|
249
321
|
resetMouseInteractionState();
|
|
250
322
|
closeDropdown();
|
|
251
323
|
commitEditingValue();
|
|
252
324
|
var blurEvent = mobileBlurEventRef.current;
|
|
253
325
|
mobileBlurEventRef.current = null;
|
|
254
|
-
|
|
255
|
-
onBlur === null || onBlur === void 0 ? void 0 : onBlur(blurEvent);
|
|
256
|
-
}
|
|
326
|
+
emitBlur(blurEvent);
|
|
257
327
|
return;
|
|
258
328
|
}
|
|
259
329
|
closeDropdown();
|
|
260
|
-
}, [
|
|
261
|
-
canUseMobileDropdownTimePicker,
|
|
262
|
-
closeDropdown,
|
|
263
|
-
commitEditingValue,
|
|
264
|
-
isDropdownOpened,
|
|
265
|
-
onBlur,
|
|
266
|
-
resetMouseInteractionState,
|
|
267
|
-
]);
|
|
330
|
+
}, [closeDropdown, commitEditingValue, emitBlur, isMobileDropdownActive, resetMouseInteractionState]);
|
|
268
331
|
var selectItem = useCallback(function (item) {
|
|
269
332
|
commitItem(item);
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
}
|
|
273
|
-
else {
|
|
274
|
-
closeDropdown();
|
|
275
|
-
}
|
|
276
|
-
}, [canUseMobileDropdownTimePicker, closeDropdown, closeOpenedDropdown, commitItem]);
|
|
333
|
+
closeOpenedDropdown();
|
|
334
|
+
}, [closeOpenedDropdown, commitItem]);
|
|
277
335
|
var isSelectHighlightedItem = useCallback(function (event) {
|
|
278
336
|
var _a, _b;
|
|
279
337
|
if (highlightedItemIndex === null) {
|
|
@@ -320,28 +378,23 @@ export var TimePicker = Object.assign(forwardRefAndName('TimePicker', function (
|
|
|
320
378
|
openDropdown();
|
|
321
379
|
}, [canUseMobileNativeTimePicker, disabled, getActiveInput, openDropdown, openNativeTimePicker]);
|
|
322
380
|
var blurInput = useCallback(function () {
|
|
323
|
-
var _a;
|
|
324
|
-
if (
|
|
381
|
+
var _a, _b;
|
|
382
|
+
if (isMobileDropdownActive) {
|
|
325
383
|
closeOpenedDropdown();
|
|
326
384
|
return;
|
|
327
385
|
}
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
}, [closeOpenedDropdown]);
|
|
333
|
-
var blinkInput = useCallback(function () {
|
|
334
|
-
var _a;
|
|
335
|
-
(_a = getActiveInput()) === null || _a === void 0 ? void 0 : _a.blink();
|
|
336
|
-
}, [getActiveInput]);
|
|
386
|
+
// В нативном режиме фокус держит скрытый инпут системного пикера.
|
|
387
|
+
(_a = nativeInputRef.current) === null || _a === void 0 ? void 0 : _a.blur();
|
|
388
|
+
(_b = getActiveInput()) === null || _b === void 0 ? void 0 : _b.blur();
|
|
389
|
+
}, [closeOpenedDropdown, getActiveInput, isMobileDropdownActive]);
|
|
337
390
|
useImperativeHandle(ref, function () { return ({
|
|
338
391
|
focus: focusInput,
|
|
339
392
|
blur: blurInput,
|
|
340
393
|
blink: blinkInput,
|
|
341
394
|
open: openInputDropdown,
|
|
342
|
-
close:
|
|
395
|
+
close: closeOpenedDropdown,
|
|
343
396
|
getRootNode: function () { return rootRef.current; },
|
|
344
|
-
}); }, [blinkInput, blurInput,
|
|
397
|
+
}); }, [blinkInput, blurInput, closeOpenedDropdown, focusInput, openInputDropdown]);
|
|
345
398
|
useLayoutEffect(function () {
|
|
346
399
|
if (!isDropdownOpened) {
|
|
347
400
|
return;
|
|
@@ -363,7 +416,7 @@ export var TimePicker = Object.assign(forwardRefAndName('TimePicker', function (
|
|
|
363
416
|
if (!disabled) {
|
|
364
417
|
return;
|
|
365
418
|
}
|
|
366
|
-
if (
|
|
419
|
+
if (isMobileDropdownActive) {
|
|
367
420
|
closeOpenedDropdown();
|
|
368
421
|
return;
|
|
369
422
|
}
|
|
@@ -376,94 +429,149 @@ export var TimePicker = Object.assign(forwardRefAndName('TimePicker', function (
|
|
|
376
429
|
commitEditingValue();
|
|
377
430
|
}
|
|
378
431
|
}, [
|
|
379
|
-
canUseMobileDropdownTimePicker,
|
|
380
432
|
closeDropdown,
|
|
381
433
|
closeOpenedDropdown,
|
|
382
434
|
commitEditingValue,
|
|
383
435
|
disabled,
|
|
384
436
|
isDropdownOpened,
|
|
385
437
|
isInputFocused,
|
|
438
|
+
isMobileDropdownActive,
|
|
386
439
|
resetMouseInteractionState,
|
|
387
440
|
]);
|
|
441
|
+
var previousIsMobileLayoutRef = useRef(isMobileLayout);
|
|
442
|
+
/**
|
|
443
|
+
* Смена верстки переносит открытое меню в нужную версию: как в ComboBox, меню не закрывается.
|
|
444
|
+
* Начатый ввод переезжает вместе с ним, а если переезжать некуда — коммитится, как при потере фокуса.
|
|
445
|
+
*/
|
|
388
446
|
useEffect(function () {
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
447
|
+
if (previousIsMobileLayoutRef.current === isMobileLayout) {
|
|
448
|
+
return;
|
|
449
|
+
}
|
|
450
|
+
previousIsMobileLayoutRef.current = isMobileLayout;
|
|
451
|
+
// Запомненный blur остался от прошлой верстки: как потеря фокуса контрола он больше не годится.
|
|
452
|
+
mobileBlurEventRef.current = null;
|
|
453
|
+
if (isMobileLayout) {
|
|
454
|
+
// Ввод продолжится в инпуте попапа, только если попап открывается вместе со сменой верстки.
|
|
455
|
+
if (isInputFocused && !isMobileDropdownActive) {
|
|
456
|
+
setIsInputFocused(false);
|
|
457
|
+
resetMouseInteractionState();
|
|
458
|
+
commitEditingValue();
|
|
459
|
+
}
|
|
460
|
+
// В режиме нативного пикера своего меню нет.
|
|
461
|
+
if (isDropdownOpened && canUseMobileNativeTimePicker) {
|
|
462
|
+
closeDropdown();
|
|
463
|
+
}
|
|
464
|
+
return;
|
|
465
|
+
}
|
|
466
|
+
/**
|
|
467
|
+
* Десктопное меню закрывается по потере фокуса поля, поэтому без фокуса в контроле
|
|
468
|
+
* его нечем было бы закрыть: мобильный попап мог быть открыт и без фокуса в своем инпуте.
|
|
469
|
+
* Если же фокус был, его вернет в поле `useTimePickerSelection`.
|
|
470
|
+
*/
|
|
471
|
+
if (isDropdownOpened && !isInputFocused) {
|
|
472
|
+
closeDropdown();
|
|
473
|
+
}
|
|
474
|
+
}, [
|
|
475
|
+
canUseMobileNativeTimePicker,
|
|
476
|
+
closeDropdown,
|
|
477
|
+
commitEditingValue,
|
|
478
|
+
isDropdownOpened,
|
|
479
|
+
isInputFocused,
|
|
480
|
+
isMobileDropdownActive,
|
|
481
|
+
isMobileLayout,
|
|
482
|
+
resetMouseInteractionState,
|
|
483
|
+
]);
|
|
484
|
+
/** Сообщает о фокусе один раз за сессию: переезд фокуса внутри контрола наружу не виден. */
|
|
485
|
+
var emitFocus = function (event) {
|
|
486
|
+
if (isControlFocusedRef.current) {
|
|
487
|
+
return;
|
|
488
|
+
}
|
|
489
|
+
isControlFocusedRef.current = true;
|
|
490
|
+
onFocus === null || onFocus === void 0 ? void 0 : onFocus(event);
|
|
491
|
+
};
|
|
395
492
|
var handleFocusBySource = function (event, isMobilePopupInput) {
|
|
396
493
|
var shouldSkipOpenDropdown = shouldSkipOpenOnFocusRef.current;
|
|
397
494
|
shouldSkipOpenOnFocusRef.current = false;
|
|
495
|
+
var isFocusMovedInsideControl = isControlFocusedRef.current;
|
|
398
496
|
if (canUseMobileNativeTimePicker) {
|
|
497
|
+
// Фокус сообщается до открытия пикера: иначе увод фокуса в нативный инпут закрыл бы сессию.
|
|
498
|
+
emitFocus(event);
|
|
399
499
|
if (!shouldSkipOpenDropdown) {
|
|
400
500
|
openNativeTimePicker();
|
|
401
501
|
}
|
|
402
|
-
onFocus === null || onFocus === void 0 ? void 0 : onFocus(event);
|
|
403
502
|
return;
|
|
404
503
|
}
|
|
405
504
|
if (canUseMobileDropdownTimePicker && !isMobilePopupInput) {
|
|
406
505
|
if (!shouldSkipOpenDropdown) {
|
|
407
506
|
openDropdown();
|
|
408
507
|
}
|
|
508
|
+
// Дальше ввод идет в инпуте попапа, но фокус контрол получает здесь.
|
|
509
|
+
emitFocus(event);
|
|
409
510
|
return;
|
|
410
511
|
}
|
|
411
512
|
setIsInputFocused(true);
|
|
412
513
|
if (!shouldSkipOpenDropdown) {
|
|
413
514
|
openDropdown();
|
|
414
515
|
}
|
|
415
|
-
if (
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
}
|
|
419
|
-
else if (mouseDownSegmentRef.current) {
|
|
420
|
-
selectSegment(mouseDownSegmentRef.current);
|
|
421
|
-
}
|
|
516
|
+
if (mouseDownSegmentRef.current && !isInputFocused) {
|
|
517
|
+
// По пустому полю ввод всегда начинается с часов, а по заполненному — с сегмента под курсором.
|
|
518
|
+
selectSegment(isTimeDisplayEmpty(editingValueRef.current) ? 'hours' : mouseDownSegmentRef.current);
|
|
422
519
|
}
|
|
423
520
|
else {
|
|
424
|
-
|
|
521
|
+
// Переезд фокуса внутри контрола продолжает начатый ввод, поэтому сегмент сохраняется:
|
|
522
|
+
// иначе следующая цифра ушла бы в часы и затерла бы набранное время.
|
|
523
|
+
selectSegment(isFocusMovedInsideControl ? selectedSegment : 'hours');
|
|
425
524
|
}
|
|
426
|
-
|
|
525
|
+
emitFocus(event);
|
|
427
526
|
};
|
|
428
527
|
var handleFocus = function (event) { return handleFocusBySource(event, false); };
|
|
429
528
|
var handleMobileFocus = function (event) { return handleFocusBySource(event, true); };
|
|
430
529
|
var handleBlurBySource = function (event, isMobilePopupInput) {
|
|
431
|
-
|
|
432
|
-
|
|
530
|
+
/**
|
|
531
|
+
* Пока открыт мобильный попап, фокус ходит между полем и его инпутом: контрол остается активным,
|
|
532
|
+
* поэтому наружу о таком blur сообщать нечего. Событие запоминается на случай,
|
|
533
|
+
* если фокус в инпуте попапа так и не оказался — тогда именно оно уйдет в `onBlur` при закрытии.
|
|
534
|
+
*/
|
|
535
|
+
if (isMobileDropdownActive) {
|
|
536
|
+
event.persist();
|
|
537
|
+
mobileBlurEventRef.current = event;
|
|
433
538
|
return;
|
|
434
539
|
}
|
|
435
|
-
if (
|
|
540
|
+
if (canUseMobileNativeTimePicker) {
|
|
541
|
+
if (isFocusMovedToNativePicker(event)) {
|
|
542
|
+
return;
|
|
543
|
+
}
|
|
544
|
+
// Ввод в мобильной версии не идет через поле, но незакоммиченное значение могло остаться
|
|
545
|
+
// от десктопной версии, если верстка сменилась посреди ввода.
|
|
546
|
+
if (isInputFocused) {
|
|
547
|
+
setIsInputFocused(false);
|
|
548
|
+
resetMouseInteractionState();
|
|
549
|
+
commitEditingValue();
|
|
550
|
+
}
|
|
551
|
+
emitBlur(event);
|
|
436
552
|
return;
|
|
437
553
|
}
|
|
554
|
+
// Инпут закрытого попапа фокуса уже не держит, но его blur может прийти на размонтировании.
|
|
438
555
|
if (isMobilePopupInput) {
|
|
439
|
-
event.persist();
|
|
440
|
-
mobileBlurEventRef.current = event;
|
|
441
556
|
return;
|
|
442
557
|
}
|
|
443
558
|
setIsInputFocused(false);
|
|
444
559
|
resetMouseInteractionState();
|
|
445
560
|
closeDropdown();
|
|
446
561
|
commitEditingValue();
|
|
447
|
-
|
|
562
|
+
emitBlur(event);
|
|
448
563
|
};
|
|
449
564
|
var handleBlur = function (event) { return handleBlurBySource(event, false); };
|
|
450
565
|
var handleMobileBlur = function (event) { return handleBlurBySource(event, true); };
|
|
451
|
-
var
|
|
566
|
+
var handleClick = function (event) {
|
|
452
567
|
if (canUseMobileNativeTimePicker) {
|
|
453
568
|
openNativeTimePicker();
|
|
454
|
-
onClick === null || onClick === void 0 ? void 0 : onClick(event);
|
|
455
|
-
return;
|
|
456
569
|
}
|
|
457
|
-
|
|
570
|
+
else {
|
|
458
571
|
openDropdown();
|
|
459
|
-
onClick === null || onClick === void 0 ? void 0 : onClick(event);
|
|
460
|
-
return;
|
|
461
572
|
}
|
|
462
|
-
openDropdown();
|
|
463
573
|
onClick === null || onClick === void 0 ? void 0 : onClick(event);
|
|
464
574
|
};
|
|
465
|
-
var handleClick = function (event) { return handleClickBySource(event, false); };
|
|
466
|
-
var handleMobileClick = function (event) { return handleClickBySource(event, true); };
|
|
467
575
|
var handleMouseDownCaptureBySource = function (event, isMobilePopupInput) {
|
|
468
576
|
var _a, _b;
|
|
469
577
|
if (canUseMobileNativeTimePicker || (canUseMobileDropdownTimePicker && !isMobilePopupInput)) {
|
|
@@ -471,12 +579,10 @@ export var TimePicker = Object.assign(forwardRefAndName('TimePicker', function (
|
|
|
471
579
|
}
|
|
472
580
|
var currentInputRef = isMobilePopupInput ? mobileInputRef : inputRef;
|
|
473
581
|
var segment = (_b = (_a = currentInputRef.current) === null || _a === void 0 ? void 0 : _a.getSegment(event.target)) !== null && _b !== void 0 ? _b : null;
|
|
474
|
-
|
|
475
|
-
if (isInputFocused && !isFragment) {
|
|
582
|
+
if (isInputFocused && segment === null) {
|
|
476
583
|
event.preventDefault();
|
|
477
584
|
}
|
|
478
585
|
isMouseFocusRef.current = !isInputFocused;
|
|
479
|
-
isMouseDownOnFragmentRef.current = isFragment;
|
|
480
586
|
mouseDownSegmentRef.current = segment;
|
|
481
587
|
};
|
|
482
588
|
var handleMouseDownCapture = function (event) {
|
|
@@ -637,29 +743,28 @@ export var TimePicker = Object.assign(forwardRefAndName('TimePicker', function (
|
|
|
637
743
|
if (isKeyEscape(event)) {
|
|
638
744
|
if (isDropdownOpened) {
|
|
639
745
|
event.preventDefault();
|
|
640
|
-
|
|
641
|
-
closeOpenedDropdown();
|
|
642
|
-
}
|
|
643
|
-
else {
|
|
644
|
-
closeDropdown();
|
|
645
|
-
}
|
|
746
|
+
closeOpenedDropdown();
|
|
646
747
|
}
|
|
647
748
|
return;
|
|
648
749
|
}
|
|
649
750
|
if (isKeyEnter(event)) {
|
|
751
|
+
if (isSourceFailed) {
|
|
752
|
+
event.preventDefault();
|
|
753
|
+
retrySource();
|
|
754
|
+
return;
|
|
755
|
+
}
|
|
650
756
|
if (isSelectHighlightedItem(event)) {
|
|
651
757
|
event.preventDefault();
|
|
652
758
|
return;
|
|
653
759
|
}
|
|
654
|
-
if (
|
|
760
|
+
if (isMobileDropdownActive) {
|
|
655
761
|
event.preventDefault();
|
|
656
762
|
closeOpenedDropdown();
|
|
657
763
|
return;
|
|
658
764
|
}
|
|
659
|
-
// Enter не выбирает элемент, а лишь подтверждает введенное значение,
|
|
660
|
-
// поэтому коммитим значение как при потере фокуса и подсвечиваем поле.
|
|
765
|
+
// Enter не выбирает элемент, а лишь подтверждает введенное значение, как потеря фокуса.
|
|
661
766
|
commitEditingValue();
|
|
662
|
-
|
|
767
|
+
blinkInput();
|
|
663
768
|
if (isDropdownOpened) {
|
|
664
769
|
event.preventDefault();
|
|
665
770
|
closeDropdown();
|
|
@@ -711,19 +816,16 @@ export var TimePicker = Object.assign(forwardRefAndName('TimePicker', function (
|
|
|
711
816
|
};
|
|
712
817
|
var handlePaste = function (event) { return handlePasteBySource(event, false); };
|
|
713
818
|
var handleMobilePaste = function (event) { return handlePasteBySource(event, true); };
|
|
714
|
-
var handleNativeValueChange = useCallback(function (nextValue) {
|
|
715
|
-
commitValue(nextValue);
|
|
716
|
-
}, [commitValue]);
|
|
717
819
|
return (React.createElement(CommonWrapper, __assign({}, props),
|
|
718
820
|
React.createElement("span", { ref: rootRef, className: styles.root(), "data-tid": TimePickerDataTids.root },
|
|
719
821
|
React.createElement(TimeInput, __assign({}, inputProps, { "data-tid": TimePickerDataTids.input, ref: inputRef, disabled: disabled, hasDropdown: hasDropdown, size: size, format: format, corners: corners, rightIcon: inputRightIcon, suffix: suffix, value: displayValue, "aria-haspopup": hasDropdown ? 'listbox' : undefined, "aria-expanded": !isMobileDropdownActive && hasDropdown && isDropdownOpened && hasDropdownContent ? true : undefined, "aria-controls": !isMobileDropdownActive && hasDropdown && isDropdownOpened && hasDropdownContent ? popupId : undefined, "aria-activedescendant": isMobileDropdownActive ? undefined : activeDescendantId, "aria-placeholder": ariaPlaceholder, "aria-busy": isLoadingItems || undefined, onClick: handleClick, onBlur: handleBlur, onFocus: handleFocus, onMouseDownCapture: handleMouseDownCapture, onMouseUp: handleMouseUp, onKeyDown: handleKeyDown, onSelectSegment: handleSelectSegmentByMouse, onPaste: handlePaste })),
|
|
720
|
-
canUseMobileNativeTimePicker && (React.createElement(NativeTimeInput, { "data-tid": TimePickerDataTids.nativeInput, disabled: disabled, ref: nativeInputRef, format: format, minTime: minTime, maxTime: maxTime, value: editingValue, onValueChange:
|
|
721
|
-
|
|
822
|
+
canUseMobileNativeTimePicker && (React.createElement(NativeTimeInput, { "data-tid": TimePickerDataTids.nativeInput, disabled: disabled, ref: nativeInputRef, format: format, minTime: minTime, maxTime: maxTime, value: editingValue, onValueChange: commitValue, onBlur: emitBlur })),
|
|
823
|
+
isMobileDropdownActive && (React.createElement(TimePickerMobilePopup, { id: popupId, value: displayValue, inputRef: mobileInputRef, disabled: disabled, format: format, size: size, rightIcon: inputRightIcon, suffix: suffix, resolvedItems: resolvedItems, renderItem: renderItem, isLoading: isLoadingItems, isFailed: isSourceFailed, errorNetworkButton: locale.errorNetworkButton, errorNetworkMessage: locale.errorNetworkMessage, highlightedItemIndex: highlightedItemIndex, selectedValue: selectedValue, itemRefs: itemRefs, error: props.error, warning: props.warning, "aria-describedby": props['aria-describedby'], "aria-label": props['aria-label'], "aria-placeholder": ariaPlaceholder, "aria-haspopup": 'listbox', "aria-expanded": resolvedItems.length > 0 || isLoadingItems || isSourceFailed ? true : undefined, "aria-controls": resolvedItems.length > 0 || isLoadingItems || isSourceFailed ? popupId : undefined, "aria-activedescendant": activeDescendantId, onFocus: handleMobileFocus, onBlur: handleMobileBlur, onClick: handleClick, onKeyDown: handleMobileKeyDown, onMouseDownCapture: handleMobileMouseDownCapture, onMouseUp: handleMobileMouseUp, onPaste: handleMobilePaste, onSelectSegment: handleMobileSelectSegmentByMouse, onRetry: retrySource, onSelectItem: selectItem, onCloseRequest: closeOpenedDropdown })),
|
|
722
824
|
hasDropdown &&
|
|
723
825
|
!canUseMobileNativeTimePicker &&
|
|
724
826
|
!canUseMobileDropdownTimePicker &&
|
|
725
827
|
isDropdownOpened &&
|
|
726
828
|
hasDropdownContent &&
|
|
727
|
-
rootRef.current && (React.createElement(TimePickerPopup, { id: popupId, anchorElement: rootRef.current, menuPos: menuPos, menuAlign: menuAlign, menuWidth: menuWidth, popupMaxHeight: popupMaxHeight, format: format, size: size, resolvedItems: resolvedItems, renderItem: renderItem, isLoading: isLoadingItems, highlightedItemIndex: highlightedItemIndex,
|
|
829
|
+
rootRef.current && (React.createElement(TimePickerPopup, { id: popupId, anchorElement: rootRef.current, menuPos: menuPos, menuAlign: menuAlign, menuWidth: menuWidth, popupMaxHeight: popupMaxHeight, format: format, size: size, resolvedItems: resolvedItems, renderItem: renderItem, isLoading: isLoadingItems, isFailed: isSourceFailed, errorNetworkButton: locale.errorNetworkButton, errorNetworkMessage: locale.errorNetworkMessage, highlightedItemIndex: highlightedItemIndex, selectedValue: selectedValue, itemRefs: itemRefs, onRetry: retrySource, onSelectItem: selectItem })))));
|
|
728
830
|
}), { validate: validateTimePicker });
|
|
729
831
|
//# sourceMappingURL=TimePicker.js.map
|