@skbkontur/react-ui 6.0.6 → 6.0.7-eab55.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/Autocomplete/Autocomplete.js +15 -4
- package/components/Autocomplete/Autocomplete.js.map +1 -1
- package/components/Calendar/CalendarDay.js +3 -0
- package/components/Calendar/CalendarDay.js.map +1 -1
- package/components/Calendar/DayCellView.styles.d.ts +1 -0
- package/components/Calendar/DayCellView.styles.js +6 -3
- package/components/Calendar/DayCellView.styles.js.map +1 -1
- package/components/DatePicker/MobilePicker.js +1 -1
- package/components/DatePicker/MobilePicker.js.map +1 -1
- package/components/DateRangePicker/DateRangePicker.js +1 -1
- package/components/DateRangePicker/DateRangePicker.js.map +1 -1
- package/components/Loader/Loader.d.ts +12 -4
- package/components/Loader/Loader.js +18 -7
- package/components/Loader/Loader.js.map +1 -1
- package/components/MenuItem/MenuItem.d.ts +1 -0
- package/components/MenuItem/MenuItem.js +17 -1
- package/components/MenuItem/MenuItem.js.map +1 -1
- package/components/MenuItem/MenuItem.styles.d.ts +3 -0
- package/components/MenuItem/MenuItem.styles.js +25 -16
- package/components/MenuItem/MenuItem.styles.js.map +1 -1
- package/components/Select/Select.js +11 -1
- package/components/Select/Select.js.map +1 -1
- package/components/SingleToast/SingleToast.d.ts +8 -10
- package/components/SingleToast/SingleToast.js +8 -10
- package/components/SingleToast/SingleToast.js.map +1 -1
- package/components/Spinner/Spinner.d.ts +23 -33
- package/components/Spinner/Spinner.js +23 -19
- package/components/Spinner/Spinner.js.map +1 -1
- package/components/Spinner/Spinner.styles.d.ts +0 -3
- package/components/Spinner/Spinner.styles.js +6 -15
- package/components/Spinner/Spinner.styles.js.map +1 -1
- package/components/Tabs/Indicator.styles.d.ts +0 -1
- package/components/Tabs/Indicator.styles.js +1 -4
- package/components/Tabs/Indicator.styles.js.map +1 -1
- package/components/Textarea/Textarea.js +1 -1
- package/components/Textarea/Textarea.js.map +1 -1
- package/components/Textarea/Textarea.styles.d.ts +1 -0
- package/components/Textarea/Textarea.styles.js +7 -4
- package/components/Textarea/Textarea.styles.js.map +1 -1
- package/components/Textarea/TextareaCounter.d.ts +2 -0
- package/components/Textarea/TextareaCounter.js +22 -4
- package/components/Textarea/TextareaCounter.js.map +1 -1
- package/components/TimePicker/TimeClockIcon.d.ts +3 -0
- package/components/TimePicker/TimeClockIcon.js +11 -0
- package/components/TimePicker/TimeClockIcon.js.map +1 -0
- package/components/TimePicker/TimeFragmentsView.d.ts +15 -0
- package/components/TimePicker/TimeFragmentsView.js +72 -0
- package/components/TimePicker/TimeFragmentsView.js.map +1 -0
- package/components/TimePicker/TimeFragmentsView.styles.d.ts +12 -0
- package/components/TimePicker/TimeFragmentsView.styles.js +43 -0
- package/components/TimePicker/TimeFragmentsView.styles.js.map +1 -0
- package/components/TimePicker/TimeInput.d.ts +21 -0
- package/components/TimePicker/TimeInput.js +98 -0
- package/components/TimePicker/TimeInput.js.map +1 -0
- package/components/TimePicker/TimePicker.d.ts +59 -0
- package/components/TimePicker/TimePicker.js +478 -0
- package/components/TimePicker/TimePicker.js.map +1 -0
- package/components/TimePicker/TimePicker.styles.d.ts +11 -0
- package/components/TimePicker/TimePicker.styles.js +36 -0
- package/components/TimePicker/TimePicker.styles.js.map +1 -0
- package/components/TimePicker/TimePickerMobilePopup.d.ts +31 -0
- package/components/TimePicker/TimePickerMobilePopup.js +21 -0
- package/components/TimePicker/TimePickerMobilePopup.js.map +1 -0
- package/components/TimePicker/TimePickerPopup.d.ts +19 -0
- package/components/TimePicker/TimePickerPopup.js +18 -0
- package/components/TimePicker/TimePickerPopup.js.map +1 -0
- package/components/TimePicker/TimePickerSlots.d.ts +16 -0
- package/components/TimePicker/TimePickerSlots.js +67 -0
- package/components/TimePicker/TimePickerSlots.js.map +1 -0
- package/components/TimePicker/helpers/TimePicker.constants.d.ts +18 -0
- package/components/TimePicker/helpers/TimePicker.constants.js +41 -0
- package/components/TimePicker/helpers/TimePicker.constants.js.map +1 -0
- package/components/TimePicker/helpers/TimePicker.editing.d.ts +6 -0
- package/components/TimePicker/helpers/TimePicker.editing.js +86 -0
- package/components/TimePicker/helpers/TimePicker.editing.js.map +1 -0
- package/components/TimePicker/helpers/TimePicker.layout.d.ts +7 -0
- package/components/TimePicker/helpers/TimePicker.layout.js +17 -0
- package/components/TimePicker/helpers/TimePicker.layout.js.map +1 -0
- package/components/TimePicker/helpers/TimePicker.selection.d.ts +7 -0
- package/components/TimePicker/helpers/TimePicker.selection.js +51 -0
- package/components/TimePicker/helpers/TimePicker.selection.js.map +1 -0
- package/components/TimePicker/helpers/TimePicker.shared.d.ts +23 -0
- package/components/TimePicker/helpers/TimePicker.shared.js +50 -0
- package/components/TimePicker/helpers/TimePicker.shared.js.map +1 -0
- package/components/TimePicker/helpers/TimePicker.value.d.ts +8 -0
- package/components/TimePicker/helpers/TimePicker.value.js +61 -0
- package/components/TimePicker/helpers/TimePicker.value.js.map +1 -0
- package/components/TimePicker/helpers/scrollSelectedSlotIntoView.d.ts +1 -0
- package/components/TimePicker/helpers/scrollSelectedSlotIntoView.js +21 -0
- package/components/TimePicker/helpers/scrollSelectedSlotIntoView.js.map +1 -0
- package/components/TimePicker/hooks/useTimePickerDropdown.d.ts +17 -0
- package/components/TimePicker/hooks/useTimePickerDropdown.js +62 -0
- package/components/TimePicker/hooks/useTimePickerDropdown.js.map +1 -0
- package/components/TimePicker/hooks/useTimePickerSelection.d.ts +15 -0
- package/components/TimePicker/hooks/useTimePickerSelection.js +43 -0
- package/components/TimePicker/hooks/useTimePickerSelection.js.map +1 -0
- package/components/TimePicker/hooks/useTimePickerValue.d.ts +18 -0
- package/components/TimePicker/hooks/useTimePickerValue.js +48 -0
- package/components/TimePicker/hooks/useTimePickerValue.js.map +1 -0
- package/components/TimePicker/index.d.ts +2 -0
- package/components/TimePicker/index.js +2 -0
- package/components/TimePicker/index.js.map +1 -0
- package/components/Toast/Toast.d.ts +13 -14
- package/components/Toast/Toast.js +3 -3
- package/components/Toast/Toast.js.map +1 -1
- package/components/Toast/ToastView.d.ts +8 -5
- package/components/Toast/ToastView.js +28 -8
- package/components/Toast/ToastView.js.map +1 -1
- package/components/Toast/ToastView.styles.d.ts +7 -0
- package/components/Toast/ToastView.styles.js +30 -8
- package/components/Toast/ToastView.styles.js.map +1 -1
- package/index.d.ts +1 -0
- package/index.js +1 -0
- package/index.js.map +1 -1
- package/internal/CloseButtonIcon/CloseButtonIcon.js +1 -1
- package/internal/CloseButtonIcon/CloseButtonIcon.js.map +1 -1
- package/internal/CommonWrapper/CommonWrapper.js +5 -0
- package/internal/CommonWrapper/CommonWrapper.js.map +1 -1
- package/internal/CustomComboBox/ComboBoxMenu.js +1 -1
- package/internal/CustomComboBox/ComboBoxMenu.js.map +1 -1
- package/internal/CustomComboBox/ComboBoxView.js +13 -2
- package/internal/CustomComboBox/ComboBoxView.js.map +1 -1
- package/internal/Menu/Menu.js +3 -0
- package/internal/Menu/Menu.js.map +1 -1
- package/internal/Menu/Menu.styles.d.ts +1 -0
- package/internal/Menu/Menu.styles.js +13 -10
- package/internal/Menu/Menu.styles.js.map +1 -1
- package/internal/MenuMessage/MenuMessage.js +17 -1
- package/internal/MenuMessage/MenuMessage.js.map +1 -1
- package/internal/MenuMessage/MenuMessage.styles.d.ts +3 -0
- package/internal/MenuMessage/MenuMessage.styles.js +13 -4
- package/internal/MenuMessage/MenuMessage.styles.js.map +1 -1
- package/internal/MobilePopup/MobilePopup.d.ts +8 -0
- package/internal/MobilePopup/MobilePopup.js +34 -11
- package/internal/MobilePopup/MobilePopup.js.map +1 -1
- package/internal/MobilePopup/MobilePopup.styles.d.ts +7 -0
- package/internal/MobilePopup/MobilePopup.styles.js +34 -10
- package/internal/MobilePopup/MobilePopup.styles.js.map +1 -1
- package/internal/MobilePopup/MobilePopupFooter/MobilePopupFooter.d.ts +8 -1
- package/internal/MobilePopup/MobilePopupFooter/MobilePopupFooter.js +18 -1
- package/internal/MobilePopup/MobilePopupFooter/MobilePopupFooter.js.map +1 -1
- package/internal/MobilePopup/MobilePopupFooter/MobilePopupFooter.styles.d.ts +3 -0
- package/internal/MobilePopup/MobilePopupFooter/MobilePopupFooter.styles.js +14 -4
- package/internal/MobilePopup/MobilePopupFooter/MobilePopupFooter.styles.js.map +1 -1
- package/internal/MobilePopup/MobilePopupHeader/MobilePopupHeader.d.ts +4 -0
- package/internal/MobilePopup/MobilePopupHeader/MobilePopupHeader.js +48 -11
- package/internal/MobilePopup/MobilePopupHeader/MobilePopupHeader.js.map +1 -1
- package/internal/MobilePopup/MobilePopupHeader/MobilePopupHeader.styles.d.ts +6 -0
- package/internal/MobilePopup/MobilePopupHeader/MobilePopupHeader.styles.js +28 -8
- package/internal/MobilePopup/MobilePopupHeader/MobilePopupHeader.styles.js.map +1 -1
- package/internal/NativeTimeInput/NativeTimeInput.d.ts +16 -0
- package/internal/NativeTimeInput/NativeTimeInput.js +25 -0
- package/internal/NativeTimeInput/NativeTimeInput.js.map +1 -0
- package/internal/NativeTimeInput/NativeTimeInput.styles.d.ts +3 -0
- package/internal/NativeTimeInput/NativeTimeInput.styles.js +15 -0
- package/internal/NativeTimeInput/NativeTimeInput.styles.js.map +1 -0
- package/internal/NativeTimeInput/index.d.ts +1 -0
- package/internal/NativeTimeInput/index.js +2 -0
- package/internal/NativeTimeInput/index.js.map +1 -0
- package/internal/NativeTimeInput/utils.d.ts +7 -0
- package/internal/NativeTimeInput/utils.js +28 -0
- package/internal/NativeTimeInput/utils.js.map +1 -0
- package/internal/SpinnerIcon/SpinnerIcon.d.ts +3 -3
- package/internal/SpinnerIcon/SpinnerIcon.js +4 -4
- package/internal/SpinnerIcon/SpinnerIcon.js.map +1 -1
- package/internal/icons2022/LoadingIcon.js +1 -1
- package/internal/icons2022/LoadingIcon.js.map +1 -1
- package/internal/icons2022/QuestionCircleIcon/QuestionCircleIcon16Light.d.ts +2 -0
- package/internal/icons2022/QuestionCircleIcon/QuestionCircleIcon16Light.js +21 -0
- package/internal/icons2022/QuestionCircleIcon/QuestionCircleIcon16Light.js.map +1 -0
- package/internal/icons2022/QuestionCircleIcon/QuestionCircleIcon20Regular.d.ts +2 -0
- package/internal/icons2022/QuestionCircleIcon/QuestionCircleIcon20Regular.js +21 -0
- package/internal/icons2022/QuestionCircleIcon/QuestionCircleIcon20Regular.js.map +1 -0
- package/internal/icons2022/QuestionCircleIcon/QuestionCircleIcon24Regular.d.ts +2 -0
- package/internal/icons2022/QuestionCircleIcon/QuestionCircleIcon24Regular.js +21 -0
- package/internal/icons2022/QuestionCircleIcon/QuestionCircleIcon24Regular.js.map +1 -0
- package/internal/icons2022/TimeClockIcon/TimeClockIcon16Light.d.ts +2 -0
- package/internal/icons2022/TimeClockIcon/TimeClockIcon16Light.js +20 -0
- package/internal/icons2022/TimeClockIcon/TimeClockIcon16Light.js.map +1 -0
- package/internal/icons2022/TimeClockIcon/TimeClockIcon20Light.d.ts +2 -0
- package/internal/icons2022/TimeClockIcon/TimeClockIcon20Light.js +20 -0
- package/internal/icons2022/TimeClockIcon/TimeClockIcon20Light.js.map +1 -0
- package/internal/icons2022/TimeClockIcon/TimeClockIcon24Regular.d.ts +2 -0
- package/internal/icons2022/TimeClockIcon/TimeClockIcon24Regular.js +20 -0
- package/internal/icons2022/TimeClockIcon/TimeClockIcon24Regular.js.map +1 -0
- package/internal/themes/BasicTheme.d.ts +51 -4
- package/internal/themes/BasicTheme.js +172 -5
- package/internal/themes/BasicTheme.js.map +1 -1
- package/internal/themes/DarkTheme6_1.d.ts +1 -0
- package/internal/themes/DarkTheme6_1.js +164 -0
- package/internal/themes/DarkTheme6_1.js.map +1 -0
- package/internal/themes/LightTheme6_1.d.ts +1 -0
- package/internal/themes/LightTheme6_1.js +164 -0
- package/internal/themes/LightTheme6_1.js.map +1 -0
- package/lib/theming/themes/DarkTheme.d.ts +1 -0
- package/lib/theming/themes/DarkTheme.js +3 -1
- package/lib/theming/themes/DarkTheme.js.map +1 -1
- package/lib/theming/themes/LightTheme.d.ts +1 -0
- package/lib/theming/themes/LightTheme.js +3 -1
- package/lib/theming/themes/LightTheme.js.map +1 -1
- package/package.json +5 -1
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { SizeProp } from '../../lib/types/props.js';
|
|
3
|
+
import type { TimeSegment, TimePrecision, TimeSlot } from './helpers/TimePicker.shared.js';
|
|
4
|
+
import type { TimeInputRef } from './TimeInput.js';
|
|
5
|
+
interface TimePickerMobilePopupProps {
|
|
6
|
+
opened: boolean;
|
|
7
|
+
value: string;
|
|
8
|
+
inputRef: React.RefObject<TimeInputRef | null>;
|
|
9
|
+
disabled?: boolean;
|
|
10
|
+
precision: TimePrecision;
|
|
11
|
+
size: SizeProp;
|
|
12
|
+
resolvedSlots: TimeSlot[];
|
|
13
|
+
highlightedSlotIndex: number | null;
|
|
14
|
+
normalizedValue: string;
|
|
15
|
+
slotRefs: React.RefObject<Map<number, HTMLSpanElement>>;
|
|
16
|
+
error?: boolean;
|
|
17
|
+
warning?: boolean;
|
|
18
|
+
'aria-describedby'?: string;
|
|
19
|
+
'aria-label'?: string;
|
|
20
|
+
onFocus(event: React.FocusEvent<HTMLInputElement>): void;
|
|
21
|
+
onBlur(event: React.FocusEvent<HTMLInputElement>): void;
|
|
22
|
+
onClick(event: React.MouseEvent<HTMLInputElement>): void;
|
|
23
|
+
onKeyDown(event: React.KeyboardEvent<HTMLInputElement>): void;
|
|
24
|
+
onMouseDownCapture(event: React.MouseEvent<HTMLInputElement>): void;
|
|
25
|
+
onPaste(event: React.ClipboardEvent<HTMLInputElement>): void;
|
|
26
|
+
onSelectSegment(segment: TimeSegment, event: React.MouseEvent<HTMLSpanElement>): void;
|
|
27
|
+
onSelectSlot(slot: TimeSlot): void;
|
|
28
|
+
onCloseRequest(): void;
|
|
29
|
+
}
|
|
30
|
+
export declare const TimePickerMobilePopup: (props: TimePickerMobilePopupProps) => React.JSX.Element;
|
|
31
|
+
export {};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import React, { useLayoutEffect } from 'react';
|
|
2
|
+
import { MobilePopup } from '../../internal/MobilePopup/index.js';
|
|
3
|
+
import { TimeInput } from './TimeInput.js';
|
|
4
|
+
import { TimePickerDataTids } from './TimePicker.js';
|
|
5
|
+
import { TimePickerSlots } from './TimePickerSlots.js';
|
|
6
|
+
export var TimePickerMobilePopup = function (props) {
|
|
7
|
+
var opened = props.opened, value = props.value, inputRef = props.inputRef, disabled = props.disabled, precision = props.precision, size = props.size, resolvedSlots = props.resolvedSlots, highlightedSlotIndex = props.highlightedSlotIndex, normalizedValue = props.normalizedValue, slotRefs = props.slotRefs, error = props.error, warning = props.warning, ariaDescribedby = props["aria-describedby"], ariaLabel = props["aria-label"], onFocus = props.onFocus, onBlur = props.onBlur, onClick = props.onClick, onKeyDown = props.onKeyDown, onMouseDownCapture = props.onMouseDownCapture, onPaste = props.onPaste, onSelectSegment = props.onSelectSegment, onSelectSlot = props.onSelectSlot, onCloseRequest = props.onCloseRequest;
|
|
8
|
+
useLayoutEffect(function () {
|
|
9
|
+
var timer = setTimeout(function () {
|
|
10
|
+
var _a;
|
|
11
|
+
(_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
12
|
+
});
|
|
13
|
+
return function () {
|
|
14
|
+
clearTimeout(timer);
|
|
15
|
+
};
|
|
16
|
+
}, [inputRef]);
|
|
17
|
+
return (React.createElement(MobilePopup, { opened: opened, verticalAlign: 'center', size: size, headerChildComponent: React.createElement(TimeInput, { ref: inputRef, "data-tid": TimePickerDataTids.mobileInput, width: "100%", disabled: disabled, precision: precision, size: size, value: value, error: error, warning: warning, "aria-describedby": ariaDescribedby, "aria-label": ariaLabel, onFocus: onFocus, onBlur: onBlur, onClick: onClick, onKeyDown: onKeyDown, onMouseDownCapture: onMouseDownCapture, onPaste: onPaste, onSelectSegment: onSelectSegment }), onCloseRequest: onCloseRequest },
|
|
18
|
+
React.createElement("div", { "data-tid": TimePickerDataTids.mobilePopup },
|
|
19
|
+
React.createElement(TimePickerSlots, { precision: precision, size: size, resolvedSlots: resolvedSlots, highlightedSlotIndex: highlightedSlotIndex, normalizedValue: normalizedValue, slotRefs: slotRefs, maxHeight: 'auto', disableScrollContainer: true, onSelectSlot: onSelectSlot }))));
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=TimePickerMobilePopup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TimePickerMobilePopup.js","sourceRoot":"","sources":["../../../components/TimePicker/TimePickerMobilePopup.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AAE/C,OAAO,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAC;AAIlE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AA4BvD,MAAM,CAAC,IAAM,qBAAqB,GAAG,UAAC,KAAiC;IAEnE,IAAA,MAAM,GAuBJ,KAAK,OAvBD,EACN,KAAK,GAsBH,KAAK,MAtBF,EACL,QAAQ,GAqBN,KAAK,SArBC,EACR,QAAQ,GAoBN,KAAK,SApBC,EACR,SAAS,GAmBP,KAAK,UAnBE,EACT,IAAI,GAkBF,KAAK,KAlBH,EACJ,aAAa,GAiBX,KAAK,cAjBM,EACb,oBAAoB,GAgBlB,KAAK,qBAhBa,EACpB,eAAe,GAeb,KAAK,gBAfQ,EACf,QAAQ,GAcN,KAAK,SAdC,EACR,KAAK,GAaH,KAAK,MAbF,EACL,OAAO,GAYL,KAAK,QAZA,EACa,eAAe,GAWjC,KAAK,oBAX4B,EACrB,SAAS,GAUrB,KAAK,cAVgB,EACvB,OAAO,GASL,KAAK,QATA,EACP,MAAM,GAQJ,KAAK,OARD,EACN,OAAO,GAOL,KAAK,QAPA,EACP,SAAS,GAMP,KAAK,UANE,EACT,kBAAkB,GAKhB,KAAK,mBALW,EAClB,OAAO,GAIL,KAAK,QAJA,EACP,eAAe,GAGb,KAAK,gBAHQ,EACf,YAAY,GAEV,KAAK,aAFK,EACZ,cAAc,GACZ,KAAK,eADO,CACN;IAEV,eAAe,CAAC;QACd,IAAM,KAAK,GAAG,UAAU,CAAC;;YACvB,MAAA,QAAQ,CAAC,OAAO,0CAAE,KAAK,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,OAAO,CACL,oBAAC,WAAW,IACV,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,QAAQ,EACvB,IAAI,EAAE,IAAI,EACV,oBAAoB,EAClB,oBAAC,SAAS,IACR,GAAG,EAAE,QAAQ,cACH,kBAAkB,CAAC,WAAW,EACxC,KAAK,EAAC,MAAM,EACZ,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,sBACE,eAAe,gBACrB,SAAS,EACrB,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS,EACpB,kBAAkB,EAAE,kBAAkB,EACtC,OAAO,EAAE,OAAO,EAChB,eAAe,EAAE,eAAe,GAChC,EAEJ,cAAc,EAAE,cAAc;QAE9B,yCAAe,kBAAkB,CAAC,WAAW;YAC3C,oBAAC,eAAe,IACd,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,IAAI,EACV,aAAa,EAAE,aAAa,EAC5B,oBAAoB,EAAE,oBAAoB,EAC1C,eAAe,EAAE,eAAe,EAChC,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,MAAM,EACjB,sBAAsB,QACtB,YAAY,EAAE,YAAY,GAC1B,CACE,CACM,CACf,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import React, { useLayoutEffect } from 'react';\n\nimport { MobilePopup } from '../../internal/MobilePopup/index.js';\nimport type { SizeProp } from '../../lib/types/props.js';\nimport type { TimeSegment, TimePrecision, TimeSlot } from './helpers/TimePicker.shared.js';\nimport type { TimeInputRef } from './TimeInput.js';\nimport { TimeInput } from './TimeInput.js';\nimport { TimePickerDataTids } from './TimePicker.js';\nimport { TimePickerSlots } from './TimePickerSlots.js';\n\ninterface TimePickerMobilePopupProps {\n opened: boolean;\n value: string;\n inputRef: React.RefObject<TimeInputRef | null>;\n disabled?: boolean;\n precision: TimePrecision;\n size: SizeProp;\n resolvedSlots: TimeSlot[];\n highlightedSlotIndex: number | null;\n normalizedValue: string;\n slotRefs: React.RefObject<Map<number, HTMLSpanElement>>;\n error?: boolean;\n warning?: boolean;\n 'aria-describedby'?: string;\n 'aria-label'?: string;\n onFocus(event: React.FocusEvent<HTMLInputElement>): void;\n onBlur(event: React.FocusEvent<HTMLInputElement>): void;\n onClick(event: React.MouseEvent<HTMLInputElement>): void;\n onKeyDown(event: React.KeyboardEvent<HTMLInputElement>): void;\n onMouseDownCapture(event: React.MouseEvent<HTMLInputElement>): void;\n onPaste(event: React.ClipboardEvent<HTMLInputElement>): void;\n onSelectSegment(segment: TimeSegment, event: React.MouseEvent<HTMLSpanElement>): void;\n onSelectSlot(slot: TimeSlot): void;\n onCloseRequest(): void;\n}\n\nexport const TimePickerMobilePopup = (props: TimePickerMobilePopupProps) => {\n const {\n opened,\n value,\n inputRef,\n disabled,\n precision,\n size,\n resolvedSlots,\n highlightedSlotIndex,\n normalizedValue,\n slotRefs,\n error,\n warning,\n 'aria-describedby': ariaDescribedby,\n 'aria-label': ariaLabel,\n onFocus,\n onBlur,\n onClick,\n onKeyDown,\n onMouseDownCapture,\n onPaste,\n onSelectSegment,\n onSelectSlot,\n onCloseRequest,\n } = props;\n\n useLayoutEffect(() => {\n const timer = setTimeout(() => {\n inputRef.current?.focus();\n });\n\n return () => {\n clearTimeout(timer);\n };\n }, [inputRef]);\n\n return (\n <MobilePopup\n opened={opened}\n verticalAlign={'center'}\n size={size}\n headerChildComponent={\n <TimeInput\n ref={inputRef}\n data-tid={TimePickerDataTids.mobileInput}\n width=\"100%\"\n disabled={disabled}\n precision={precision}\n size={size}\n value={value}\n error={error}\n warning={warning}\n aria-describedby={ariaDescribedby}\n aria-label={ariaLabel}\n onFocus={onFocus}\n onBlur={onBlur}\n onClick={onClick}\n onKeyDown={onKeyDown}\n onMouseDownCapture={onMouseDownCapture}\n onPaste={onPaste}\n onSelectSegment={onSelectSegment}\n />\n }\n onCloseRequest={onCloseRequest}\n >\n <div data-tid={TimePickerDataTids.mobilePopup}>\n <TimePickerSlots\n precision={precision}\n size={size}\n resolvedSlots={resolvedSlots}\n highlightedSlotIndex={highlightedSlotIndex}\n normalizedValue={normalizedValue}\n slotRefs={slotRefs}\n maxHeight={'auto'}\n disableScrollContainer\n onSelectSlot={onSelectSlot}\n />\n </div>\n </MobilePopup>\n );\n};\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { SizeProp } from '../../lib/types/props.js';
|
|
3
|
+
import type { TimePrecision, TimeSlot } from './helpers/TimePicker.shared.js';
|
|
4
|
+
interface TimePickerPopupProps {
|
|
5
|
+
anchorElement: HTMLElement;
|
|
6
|
+
menuPos?: 'top' | 'bottom';
|
|
7
|
+
menuAlign?: 'left' | 'right';
|
|
8
|
+
menuWidth?: React.CSSProperties['width'];
|
|
9
|
+
popupMaxHeight: string;
|
|
10
|
+
precision: TimePrecision;
|
|
11
|
+
size: SizeProp;
|
|
12
|
+
resolvedSlots: TimeSlot[];
|
|
13
|
+
highlightedSlotIndex: number | null;
|
|
14
|
+
normalizedValue: string;
|
|
15
|
+
slotRefs: React.RefObject<Map<number, HTMLSpanElement>>;
|
|
16
|
+
onSelectSlot(slot: TimeSlot): void;
|
|
17
|
+
}
|
|
18
|
+
export declare const TimePickerPopup: (props: TimePickerPopupProps) => React.JSX.Element;
|
|
19
|
+
export {};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import React, { useContext } from 'react';
|
|
2
|
+
import { Popup } from '../../internal/Popup/index.js';
|
|
3
|
+
import { ZIndex } from '../../internal/ZIndex/index.js';
|
|
4
|
+
import { getMenuPositions } from '../../lib/getMenuPositions.js';
|
|
5
|
+
import { useStyles } from '../../lib/renderEnvironment/index.js';
|
|
6
|
+
import { ThemeContext } from '../../lib/theming/ThemeContext.js';
|
|
7
|
+
import { TimePickerDataTids } from './TimePicker.js';
|
|
8
|
+
import { getStyles } from './TimePicker.styles.js';
|
|
9
|
+
import { TimePickerSlots } from './TimePickerSlots.js';
|
|
10
|
+
export var TimePickerPopup = function (props) {
|
|
11
|
+
var anchorElement = props.anchorElement, menuPos = props.menuPos, menuAlign = props.menuAlign, menuWidth = props.menuWidth, popupMaxHeight = props.popupMaxHeight, precision = props.precision, size = props.size, resolvedSlots = props.resolvedSlots, highlightedSlotIndex = props.highlightedSlotIndex, normalizedValue = props.normalizedValue, slotRefs = props.slotRefs, onSelectSlot = props.onSelectSlot;
|
|
12
|
+
var theme = useContext(ThemeContext);
|
|
13
|
+
var styles = useStyles(getStyles);
|
|
14
|
+
return (React.createElement(Popup, { opened: true, hasShadow: true, anchorElement: anchorElement, "data-tid": TimePickerDataTids.popup, priority: ZIndex.priorities.PopupMenu, margin: parseInt(theme.menuOffsetY) - 1, width: menuWidth, minWidth: menuWidth === undefined ? '100%' : undefined, positions: getMenuPositions(menuPos, menuAlign) },
|
|
15
|
+
React.createElement("div", { className: styles.popup(theme), onMouseDown: function (event) { return event.preventDefault(); } },
|
|
16
|
+
React.createElement(TimePickerSlots, { precision: precision, size: size, resolvedSlots: resolvedSlots, highlightedSlotIndex: highlightedSlotIndex, normalizedValue: normalizedValue, slotRefs: slotRefs, maxHeight: popupMaxHeight, onSelectSlot: onSelectSlot }))));
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=TimePickerPopup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TimePickerPopup.js","sourceRoot":"","sources":["../../../components/TimePicker/TimePickerPopup.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAE1C,OAAO,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,gCAAgC,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAGjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAiBvD,MAAM,CAAC,IAAM,eAAe,GAAG,UAAC,KAA2B;IAEvD,IAAA,aAAa,GAYX,KAAK,cAZM,EACb,OAAO,GAWL,KAAK,QAXA,EACP,SAAS,GAUP,KAAK,UAVE,EACT,SAAS,GASP,KAAK,UATE,EACT,cAAc,GAQZ,KAAK,eARO,EACd,SAAS,GAOP,KAAK,UAPE,EACT,IAAI,GAMF,KAAK,KANH,EACJ,aAAa,GAKX,KAAK,cALM,EACb,oBAAoB,GAIlB,KAAK,qBAJa,EACpB,eAAe,GAGb,KAAK,gBAHQ,EACf,QAAQ,GAEN,KAAK,SAFC,EACR,YAAY,GACV,KAAK,aADK,CACJ;IAEV,IAAM,KAAK,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;IACvC,IAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IAEpC,OAAO,CACL,oBAAC,KAAK,IACJ,MAAM,QACN,SAAS,QACT,aAAa,EAAE,aAAa,cAClB,kBAAkB,CAAC,KAAK,EAClC,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,SAAS,EACrC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,EACvC,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EACtD,SAAS,EAAE,gBAAgB,CAAC,OAAO,EAAE,SAAS,CAAC;QAE/C,6BAAK,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,UAAC,KAAK,IAAK,OAAA,KAAK,CAAC,cAAc,EAAE,EAAtB,CAAsB;YACjF,oBAAC,eAAe,IACd,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,IAAI,EACV,aAAa,EAAE,aAAa,EAC5B,oBAAoB,EAAE,oBAAoB,EAC1C,eAAe,EAAE,eAAe,EAChC,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,cAAc,EACzB,YAAY,EAAE,YAAY,GAC1B,CACE,CACA,CACT,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import React, { useContext } from 'react';\n\nimport { Popup } from '../../internal/Popup/index.js';\nimport { ZIndex } from '../../internal/ZIndex/index.js';\nimport { getMenuPositions } from '../../lib/getMenuPositions.js';\nimport { useStyles } from '../../lib/renderEnvironment/index.js';\nimport { ThemeContext } from '../../lib/theming/ThemeContext.js';\nimport type { SizeProp } from '../../lib/types/props.js';\nimport type { TimePrecision, TimeSlot } from './helpers/TimePicker.shared.js';\nimport { TimePickerDataTids } from './TimePicker.js';\nimport { getStyles } from './TimePicker.styles.js';\nimport { TimePickerSlots } from './TimePickerSlots.js';\n\ninterface TimePickerPopupProps {\n anchorElement: HTMLElement;\n menuPos?: 'top' | 'bottom';\n menuAlign?: 'left' | 'right';\n menuWidth?: React.CSSProperties['width'];\n popupMaxHeight: string;\n precision: TimePrecision;\n size: SizeProp;\n resolvedSlots: TimeSlot[];\n highlightedSlotIndex: number | null;\n normalizedValue: string;\n slotRefs: React.RefObject<Map<number, HTMLSpanElement>>;\n onSelectSlot(slot: TimeSlot): void;\n}\n\nexport const TimePickerPopup = (props: TimePickerPopupProps) => {\n const {\n anchorElement,\n menuPos,\n menuAlign,\n menuWidth,\n popupMaxHeight,\n precision,\n size,\n resolvedSlots,\n highlightedSlotIndex,\n normalizedValue,\n slotRefs,\n onSelectSlot,\n } = props;\n\n const theme = useContext(ThemeContext);\n const styles = useStyles(getStyles);\n\n return (\n <Popup\n opened\n hasShadow\n anchorElement={anchorElement}\n data-tid={TimePickerDataTids.popup}\n priority={ZIndex.priorities.PopupMenu}\n margin={parseInt(theme.menuOffsetY) - 1}\n width={menuWidth}\n minWidth={menuWidth === undefined ? '100%' : undefined}\n positions={getMenuPositions(menuPos, menuAlign)}\n >\n <div className={styles.popup(theme)} onMouseDown={(event) => event.preventDefault()}>\n <TimePickerSlots\n precision={precision}\n size={size}\n resolvedSlots={resolvedSlots}\n highlightedSlotIndex={highlightedSlotIndex}\n normalizedValue={normalizedValue}\n slotRefs={slotRefs}\n maxHeight={popupMaxHeight}\n onSelectSlot={onSelectSlot}\n />\n </div>\n </Popup>\n );\n};\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { SizeProp } from '../../lib/types/props.js';
|
|
3
|
+
import type { TimePrecision, TimeSlot } from './helpers/TimePicker.shared.js';
|
|
4
|
+
interface TimePickerSlotsProps {
|
|
5
|
+
precision: TimePrecision;
|
|
6
|
+
size: SizeProp;
|
|
7
|
+
resolvedSlots: TimeSlot[];
|
|
8
|
+
highlightedSlotIndex: number | null;
|
|
9
|
+
normalizedValue: string;
|
|
10
|
+
slotRefs?: React.RefObject<Map<number, HTMLSpanElement>>;
|
|
11
|
+
maxHeight?: React.CSSProperties['maxHeight'];
|
|
12
|
+
disableScrollContainer?: boolean;
|
|
13
|
+
onSelectSlot(slot: TimeSlot): void;
|
|
14
|
+
}
|
|
15
|
+
export declare const TimePickerSlots: (props: TimePickerSlotsProps) => React.JSX.Element;
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
var __assign = (this && this.__assign) || function () {
|
|
2
|
+
__assign = Object.assign || function(t) {
|
|
3
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
4
|
+
s = arguments[i];
|
|
5
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
6
|
+
t[p] = s[p];
|
|
7
|
+
}
|
|
8
|
+
return t;
|
|
9
|
+
};
|
|
10
|
+
return __assign.apply(this, arguments);
|
|
11
|
+
};
|
|
12
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
13
|
+
var t = {};
|
|
14
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
15
|
+
t[p] = s[p];
|
|
16
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
17
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
18
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
19
|
+
t[p[i]] = s[p[i]];
|
|
20
|
+
}
|
|
21
|
+
return t;
|
|
22
|
+
};
|
|
23
|
+
import React, { useContext } from 'react';
|
|
24
|
+
import { Menu } from '../../internal/Menu/index.js';
|
|
25
|
+
import { useStyles } from '../../lib/renderEnvironment/index.js';
|
|
26
|
+
import { ThemeContext } from '../../lib/theming/ThemeContext.js';
|
|
27
|
+
import { MenuItem } from '../MenuItem/index.js';
|
|
28
|
+
import { normalizeTimeValue } from './helpers/TimePicker.value.js';
|
|
29
|
+
import { TimePickerDataTids } from './TimePicker.js';
|
|
30
|
+
import { getStyles } from './TimePicker.styles.js';
|
|
31
|
+
var SlotRoot = React.forwardRef(function (_a, ref) {
|
|
32
|
+
var _b = _a.disabled, disabled = _b === void 0 ? false : _b, _state = _a.state, props = __rest(_a, ["disabled", "state"]);
|
|
33
|
+
if (disabled) {
|
|
34
|
+
return React.createElement("div", __assign({}, props, { ref: ref }));
|
|
35
|
+
}
|
|
36
|
+
return React.createElement("button", __assign({}, props, { ref: ref, type: "button", disabled: disabled }));
|
|
37
|
+
});
|
|
38
|
+
export var TimePickerSlots = function (props) {
|
|
39
|
+
var precision = props.precision, size = props.size, resolvedSlots = props.resolvedSlots, highlightedSlotIndex = props.highlightedSlotIndex, normalizedValue = props.normalizedValue, slotRefs = props.slotRefs, maxHeight = props.maxHeight, disableScrollContainer = props.disableScrollContainer, onSelectSlot = props.onSelectSlot;
|
|
40
|
+
var theme = useContext(ThemeContext);
|
|
41
|
+
var styles = useStyles(getStyles);
|
|
42
|
+
return (React.createElement(Menu, { hasMargin: false, width: '100%', maxHeight: maxHeight, disableScrollContainer: disableScrollContainer }, resolvedSlots.map(function (slot, index) {
|
|
43
|
+
var normalizedSlot = normalizeTimeValue(slot.time, precision);
|
|
44
|
+
var state;
|
|
45
|
+
if (highlightedSlotIndex === index) {
|
|
46
|
+
state = 'hover';
|
|
47
|
+
}
|
|
48
|
+
else if (normalizedSlot === normalizedValue) {
|
|
49
|
+
state = 'selected';
|
|
50
|
+
}
|
|
51
|
+
return (React.createElement(MenuItem, { key: "".concat(slot.time, "-").concat(index), component: SlotRoot, disabled: slot.disabled, isNotSelectable: slot.disabled, size: size, state: state, onClick: slot.disabled ? undefined : function () { return onSelectSlot(slot); } },
|
|
52
|
+
React.createElement("span", { "data-tid": TimePickerDataTids.slot, className: styles.slot(), ref: function (node) {
|
|
53
|
+
if (!slotRefs) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
if (node) {
|
|
57
|
+
slotRefs.current.set(index, node);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
slotRefs.current.delete(index);
|
|
61
|
+
}
|
|
62
|
+
} },
|
|
63
|
+
React.createElement("span", { className: styles.slotTime() }, normalizedSlot),
|
|
64
|
+
slot.info && React.createElement("span", { className: styles.slotInfo(theme) }, slot.info))));
|
|
65
|
+
})));
|
|
66
|
+
};
|
|
67
|
+
//# sourceMappingURL=TimePickerSlots.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TimePickerSlots.js","sourceRoot":"","sources":["../../../components/TimePicker/TimePickerSlots.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useContext } from 'react';\n\nimport { Menu } from '../../internal/Menu/index.js';\nimport { useStyles } from '../../lib/renderEnvironment/index.js';\nimport { ThemeContext } from '../../lib/theming/ThemeContext.js';\nimport type { SizeProp } from '../../lib/types/props.js';\nimport { MenuItem } from '../MenuItem/index.js';\nimport type { TimePrecision, TimeSlot } from './helpers/TimePicker.shared.js';\nimport { normalizeTimeValue } from './helpers/TimePicker.value.js';\nimport { TimePickerDataTids } from './TimePicker.js';\nimport { getStyles } from './TimePicker.styles.js';\n\nconst SlotRoot = React.forwardRef<\n HTMLElement,\n React.HTMLAttributes<HTMLElement> & { disabled?: boolean; state?: unknown }\n>(({ disabled = false, state: _state, ...props }, ref) => {\n if (disabled) {\n return <div {...props} ref={ref as React.Ref<HTMLDivElement>} />;\n }\n\n return <button {...props} ref={ref as React.Ref<HTMLButtonElement>} type=\"button\" disabled={disabled} />;\n});\n\ninterface TimePickerSlotsProps {\n precision: TimePrecision;\n size: SizeProp;\n resolvedSlots: TimeSlot[];\n highlightedSlotIndex: number | null;\n normalizedValue: string;\n slotRefs?: React.RefObject<Map<number, HTMLSpanElement>>;\n maxHeight?: React.CSSProperties['maxHeight'];\n disableScrollContainer?: boolean;\n onSelectSlot(slot: TimeSlot): void;\n}\n\nexport const TimePickerSlots = (props: TimePickerSlotsProps) => {\n const {\n precision,\n size,\n resolvedSlots,\n highlightedSlotIndex,\n normalizedValue,\n slotRefs,\n maxHeight,\n disableScrollContainer,\n onSelectSlot,\n } = props;\n\n const theme = useContext(ThemeContext);\n const styles = useStyles(getStyles);\n\n return (\n <Menu hasMargin={false} width={'100%'} maxHeight={maxHeight} disableScrollContainer={disableScrollContainer}>\n {resolvedSlots.map((slot, index) => {\n const normalizedSlot = normalizeTimeValue(slot.time, precision);\n\n let state: 'hover' | 'selected' | undefined;\n\n if (highlightedSlotIndex === index) {\n state = 'hover';\n } else if (normalizedSlot === normalizedValue) {\n state = 'selected';\n }\n\n return (\n <MenuItem\n key={`${slot.time}-${index}`}\n component={SlotRoot}\n disabled={slot.disabled}\n isNotSelectable={slot.disabled}\n size={size}\n state={state}\n onClick={slot.disabled ? undefined : () => onSelectSlot(slot)}\n >\n <span\n data-tid={TimePickerDataTids.slot}\n className={styles.slot()}\n ref={(node) => {\n if (!slotRefs) {\n return;\n }\n\n if (node) {\n slotRefs.current.set(index, node);\n } else {\n slotRefs.current.delete(index);\n }\n }}\n >\n <span className={styles.slotTime()}>{normalizedSlot}</span>\n {slot.info && <span className={styles.slotInfo(theme)}>{slot.info}</span>}\n </span>\n </MenuItem>\n );\n })}\n </Menu>\n );\n};\n"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { SizeProp } from '../../../lib/types/props.js';
|
|
2
|
+
import type { TimePrecision, TimeSegment, TimeSlot } from './TimePicker.shared.js';
|
|
3
|
+
export declare const TIME_PLACEHOLDER_CHAR = "\u2212";
|
|
4
|
+
export declare const TIME_SEPARATOR = ":";
|
|
5
|
+
export declare const TIME_SEGMENT_LENGTH = 2;
|
|
6
|
+
export declare const HOURS_MAX_VALUE = 23;
|
|
7
|
+
export declare const MINUTES_AND_SECONDS_MAX_VALUE = 59;
|
|
8
|
+
export declare const ZERO_PAD_CHAR = "0";
|
|
9
|
+
export declare const EMPTY_VALUE = "";
|
|
10
|
+
export declare const DIGIT_REGEXP: RegExp;
|
|
11
|
+
export declare const NON_DIGIT_REGEXP: RegExp;
|
|
12
|
+
export declare const EMPTY_SEGMENT: string;
|
|
13
|
+
export declare const TIME_SEGMENTS_BY_PRECISION: Record<TimePrecision, TimeSegment[]>;
|
|
14
|
+
export declare const MAX_DIGITS_BY_PRECISION: Record<TimePrecision, number>;
|
|
15
|
+
export declare const FIRST_DIGIT_MAX_BY_SEGMENT: Record<TimeSegment, number>;
|
|
16
|
+
export declare const INPUT_WIDTH_BY_SIZE: Record<SizeProp, number>;
|
|
17
|
+
export declare const INPUT_WIDTH_WITH_SECONDS_BY_SIZE: Record<SizeProp, number>;
|
|
18
|
+
export declare const DEFAULT_TIME_PICKER_SLOTS: TimeSlot[];
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export var TIME_PLACEHOLDER_CHAR = '\u2212';
|
|
2
|
+
export var TIME_SEPARATOR = ':';
|
|
3
|
+
export var TIME_SEGMENT_LENGTH = 2;
|
|
4
|
+
var HOURS_FIRST_DIGIT_MAX = 2;
|
|
5
|
+
var MINUTES_AND_SECONDS_FIRST_DIGIT_MAX = 5;
|
|
6
|
+
var MINUTE_PRECISION_DIGITS_COUNT = 4;
|
|
7
|
+
var SECOND_PRECISION_DIGITS_COUNT = 6;
|
|
8
|
+
export var HOURS_MAX_VALUE = 23;
|
|
9
|
+
export var MINUTES_AND_SECONDS_MAX_VALUE = 59;
|
|
10
|
+
export var ZERO_PAD_CHAR = '0';
|
|
11
|
+
export var EMPTY_VALUE = '';
|
|
12
|
+
export var DIGIT_REGEXP = /\d/;
|
|
13
|
+
export var NON_DIGIT_REGEXP = /\D/g;
|
|
14
|
+
export var EMPTY_SEGMENT = TIME_PLACEHOLDER_CHAR.repeat(TIME_SEGMENT_LENGTH);
|
|
15
|
+
export var TIME_SEGMENTS_BY_PRECISION = {
|
|
16
|
+
minute: ['hours', 'minutes'],
|
|
17
|
+
second: ['hours', 'minutes', 'seconds'],
|
|
18
|
+
};
|
|
19
|
+
export var MAX_DIGITS_BY_PRECISION = {
|
|
20
|
+
minute: MINUTE_PRECISION_DIGITS_COUNT,
|
|
21
|
+
second: SECOND_PRECISION_DIGITS_COUNT,
|
|
22
|
+
};
|
|
23
|
+
export var FIRST_DIGIT_MAX_BY_SEGMENT = {
|
|
24
|
+
hours: HOURS_FIRST_DIGIT_MAX,
|
|
25
|
+
minutes: MINUTES_AND_SECONDS_FIRST_DIGIT_MAX,
|
|
26
|
+
seconds: MINUTES_AND_SECONDS_FIRST_DIGIT_MAX,
|
|
27
|
+
};
|
|
28
|
+
export var INPUT_WIDTH_BY_SIZE = {
|
|
29
|
+
small: 80,
|
|
30
|
+
medium: 100,
|
|
31
|
+
large: 120,
|
|
32
|
+
};
|
|
33
|
+
export var INPUT_WIDTH_WITH_SECONDS_BY_SIZE = {
|
|
34
|
+
small: 106,
|
|
35
|
+
medium: 128,
|
|
36
|
+
large: 152,
|
|
37
|
+
};
|
|
38
|
+
export var DEFAULT_TIME_PICKER_SLOTS = Array.from({ length: 10 }, function (_, index) { return ({
|
|
39
|
+
time: "".concat(String(index + 9).padStart(TIME_SEGMENT_LENGTH, ZERO_PAD_CHAR)).concat(TIME_SEPARATOR, "00"),
|
|
40
|
+
}); });
|
|
41
|
+
//# sourceMappingURL=TimePicker.constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TimePicker.constants.js","sourceRoot":"","sources":["../../../../components/TimePicker/helpers/TimePicker.constants.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,IAAM,qBAAqB,GAAG,QAAQ,CAAC;AAC9C,MAAM,CAAC,IAAM,cAAc,GAAG,GAAG,CAAC;AAClC,MAAM,CAAC,IAAM,mBAAmB,GAAG,CAAC,CAAC;AAErC,IAAM,qBAAqB,GAAG,CAAC,CAAC;AAChC,IAAM,mCAAmC,GAAG,CAAC,CAAC;AAC9C,IAAM,6BAA6B,GAAG,CAAC,CAAC;AACxC,IAAM,6BAA6B,GAAG,CAAC,CAAC;AAExC,MAAM,CAAC,IAAM,eAAe,GAAG,EAAE,CAAC;AAClC,MAAM,CAAC,IAAM,6BAA6B,GAAG,EAAE,CAAC;AAChD,MAAM,CAAC,IAAM,aAAa,GAAG,GAAG,CAAC;AACjC,MAAM,CAAC,IAAM,WAAW,GAAG,EAAE,CAAC;AAC9B,MAAM,CAAC,IAAM,YAAY,GAAG,IAAI,CAAC;AACjC,MAAM,CAAC,IAAM,gBAAgB,GAAG,KAAK,CAAC;AACtC,MAAM,CAAC,IAAM,aAAa,GAAG,qBAAqB,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;AAE/E,MAAM,CAAC,IAAM,0BAA0B,GAAyC;IAC9E,MAAM,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC;IAC5B,MAAM,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC;CACxC,CAAC;AAEF,MAAM,CAAC,IAAM,uBAAuB,GAAkC;IACpE,MAAM,EAAE,6BAA6B;IACrC,MAAM,EAAE,6BAA6B;CACtC,CAAC;AAEF,MAAM,CAAC,IAAM,0BAA0B,GAAgC;IACrE,KAAK,EAAE,qBAAqB;IAC5B,OAAO,EAAE,mCAAmC;IAC5C,OAAO,EAAE,mCAAmC;CAC7C,CAAC;AAEF,MAAM,CAAC,IAAM,mBAAmB,GAA6B;IAC3D,KAAK,EAAE,EAAE;IACT,MAAM,EAAE,GAAG;IACX,KAAK,EAAE,GAAG;CACX,CAAC;AAEF,MAAM,CAAC,IAAM,gCAAgC,GAA6B;IACxE,KAAK,EAAE,GAAG;IACV,MAAM,EAAE,GAAG;IACX,KAAK,EAAE,GAAG;CACX,CAAC;AAEF,MAAM,CAAC,IAAM,yBAAyB,GAAe,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,UAAC,CAAC,EAAE,KAAK,IAAK,OAAA,CAAC;IAC7F,IAAI,EAAE,UAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,mBAAmB,EAAE,aAAa,CAAC,SAAG,cAAc,OAAI;CAC7F,CAAC,EAF4F,CAE5F,CAAC,CAAC","sourcesContent":["import type { SizeProp } from '../../../lib/types/props.js';\nimport type { TimePrecision, TimeSegment, TimeSlot } from './TimePicker.shared.js';\n\nexport const TIME_PLACEHOLDER_CHAR = '\\u2212';\nexport const TIME_SEPARATOR = ':';\nexport const TIME_SEGMENT_LENGTH = 2;\n\nconst HOURS_FIRST_DIGIT_MAX = 2;\nconst MINUTES_AND_SECONDS_FIRST_DIGIT_MAX = 5;\nconst MINUTE_PRECISION_DIGITS_COUNT = 4;\nconst SECOND_PRECISION_DIGITS_COUNT = 6;\n\nexport const HOURS_MAX_VALUE = 23;\nexport const MINUTES_AND_SECONDS_MAX_VALUE = 59;\nexport const ZERO_PAD_CHAR = '0';\nexport const EMPTY_VALUE = '';\nexport const DIGIT_REGEXP = /\\d/;\nexport const NON_DIGIT_REGEXP = /\\D/g;\nexport const EMPTY_SEGMENT = TIME_PLACEHOLDER_CHAR.repeat(TIME_SEGMENT_LENGTH);\n\nexport const TIME_SEGMENTS_BY_PRECISION: Record<TimePrecision, TimeSegment[]> = {\n minute: ['hours', 'minutes'],\n second: ['hours', 'minutes', 'seconds'],\n};\n\nexport const MAX_DIGITS_BY_PRECISION: Record<TimePrecision, number> = {\n minute: MINUTE_PRECISION_DIGITS_COUNT,\n second: SECOND_PRECISION_DIGITS_COUNT,\n};\n\nexport const FIRST_DIGIT_MAX_BY_SEGMENT: Record<TimeSegment, number> = {\n hours: HOURS_FIRST_DIGIT_MAX,\n minutes: MINUTES_AND_SECONDS_FIRST_DIGIT_MAX,\n seconds: MINUTES_AND_SECONDS_FIRST_DIGIT_MAX,\n};\n\nexport const INPUT_WIDTH_BY_SIZE: Record<SizeProp, number> = {\n small: 80,\n medium: 100,\n large: 120,\n};\n\nexport const INPUT_WIDTH_WITH_SECONDS_BY_SIZE: Record<SizeProp, number> = {\n small: 106,\n medium: 128,\n large: 152,\n};\n\nexport const DEFAULT_TIME_PICKER_SLOTS: TimeSlot[] = Array.from({ length: 10 }, (_, index) => ({\n time: `${String(index + 9).padStart(TIME_SEGMENT_LENGTH, ZERO_PAD_CHAR)}${TIME_SEPARATOR}00`,\n}));\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type TimeDigitInputResult, type TimePrecision, type TimeSegment } from './TimePicker.shared.js';
|
|
2
|
+
export declare const clearTimeSegment: (value: string, segment: TimeSegment, precision: TimePrecision) => string;
|
|
3
|
+
export declare const deleteTimeSegmentDigit: (value: string, segment: TimeSegment, precision: TimePrecision) => string;
|
|
4
|
+
export declare const commitTimeSegmentOnLeave: (value: string, segment: TimeSegment, precision: TimePrecision) => string;
|
|
5
|
+
export declare const shiftTimeSegmentValue: (value: string, segment: TimeSegment, step: 1 | -1, precision: TimePrecision) => string;
|
|
6
|
+
export declare const formatDigitToTimeSegment: (value: string, segment: TimeSegment, digit: string, precision: TimePrecision) => TimeDigitInputResult;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { DIGIT_REGEXP, EMPTY_SEGMENT, EMPTY_VALUE, FIRST_DIGIT_MAX_BY_SEGMENT, TIME_PLACEHOLDER_CHAR, TIME_SEGMENT_LENGTH, ZERO_PAD_CHAR, } from './TimePicker.constants.js';
|
|
2
|
+
import { getNextTimeSegment } from './TimePicker.selection.js';
|
|
3
|
+
import { getDigits, getTimeSegmentMax, hasPendingSingleDigit, normalizeEditableSegment, } from './TimePicker.shared.js';
|
|
4
|
+
import { getTimeSegmentValue, replaceTimeSegment } from './TimePicker.value.js';
|
|
5
|
+
export var clearTimeSegment = function (value, segment, precision) {
|
|
6
|
+
return replaceTimeSegment(value, segment, EMPTY_SEGMENT, precision);
|
|
7
|
+
};
|
|
8
|
+
export var deleteTimeSegmentDigit = function (value, segment, precision) {
|
|
9
|
+
var currentSegmentValue = getTimeSegmentValue(value, segment, precision);
|
|
10
|
+
var _a = Array.from(currentSegmentValue), first = _a[0], second = _a[1];
|
|
11
|
+
if (DIGIT_REGEXP.test(second !== null && second !== void 0 ? second : EMPTY_VALUE)) {
|
|
12
|
+
return replaceTimeSegment(value, segment, "".concat(first).concat(TIME_PLACEHOLDER_CHAR), precision);
|
|
13
|
+
}
|
|
14
|
+
if (DIGIT_REGEXP.test(first !== null && first !== void 0 ? first : EMPTY_VALUE)) {
|
|
15
|
+
return replaceTimeSegment(value, segment, EMPTY_SEGMENT, precision);
|
|
16
|
+
}
|
|
17
|
+
return value;
|
|
18
|
+
};
|
|
19
|
+
export var commitTimeSegmentOnLeave = function (value, segment, precision) {
|
|
20
|
+
var nextValue = normalizeEditableSegment(getTimeSegmentValue(value, segment, precision), segment);
|
|
21
|
+
if (nextValue === EMPTY_SEGMENT) {
|
|
22
|
+
return replaceTimeSegment(value, segment, EMPTY_SEGMENT, precision);
|
|
23
|
+
}
|
|
24
|
+
return replaceTimeSegment(value, segment, nextValue, precision);
|
|
25
|
+
};
|
|
26
|
+
export var shiftTimeSegmentValue = function (value, segment, step, precision) {
|
|
27
|
+
var currentSegmentValue = getTimeSegmentValue(value, segment, precision);
|
|
28
|
+
var normalizedSegmentValue = normalizeEditableSegment(currentSegmentValue, segment);
|
|
29
|
+
var max = getTimeSegmentMax(segment);
|
|
30
|
+
var current = normalizedSegmentValue === EMPTY_SEGMENT ? 0 : Number(normalizedSegmentValue);
|
|
31
|
+
var next = (current + step + max + 1) % (max + 1);
|
|
32
|
+
return replaceTimeSegment(value, segment, String(next).padStart(TIME_SEGMENT_LENGTH, ZERO_PAD_CHAR), precision);
|
|
33
|
+
};
|
|
34
|
+
export var formatDigitToTimeSegment = function (value, segment, digit, precision) {
|
|
35
|
+
var currentSegmentValue = getTimeSegmentValue(value, segment, precision);
|
|
36
|
+
var nextSegment = getNextTimeSegment(segment, precision);
|
|
37
|
+
var shouldAppend = hasPendingSingleDigit(currentSegmentValue);
|
|
38
|
+
var currentDigits = shouldAppend ? getDigits(currentSegmentValue) : '';
|
|
39
|
+
var firstDigitThreshold = FIRST_DIGIT_MAX_BY_SEGMENT[segment];
|
|
40
|
+
if (currentDigits.length === 0) {
|
|
41
|
+
if (segment === 'hours' && Number(digit) > firstDigitThreshold) {
|
|
42
|
+
var nextValue_1 = replaceTimeSegment(value, segment, "0".concat(digit), precision);
|
|
43
|
+
return {
|
|
44
|
+
isFinalPart: nextSegment === null,
|
|
45
|
+
isCompletedPart: true,
|
|
46
|
+
selectedSegment: nextSegment !== null && nextSegment !== void 0 ? nextSegment : segment,
|
|
47
|
+
nextValue: nextValue_1,
|
|
48
|
+
shouldBlink: false,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
isFinalPart: false,
|
|
53
|
+
isCompletedPart: false,
|
|
54
|
+
selectedSegment: segment,
|
|
55
|
+
nextValue: replaceTimeSegment(value, segment, "".concat(digit).concat(TIME_PLACEHOLDER_CHAR), precision),
|
|
56
|
+
shouldBlink: false,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
if (segment === 'hours' && currentDigits === '2' && Number(digit) > 3) {
|
|
60
|
+
return {
|
|
61
|
+
isFinalPart: false,
|
|
62
|
+
isCompletedPart: false,
|
|
63
|
+
selectedSegment: segment,
|
|
64
|
+
nextValue: value,
|
|
65
|
+
shouldBlink: true,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
if (segment !== 'hours' && Number("".concat(currentDigits).concat(digit)) > getTimeSegmentMax(segment)) {
|
|
69
|
+
return {
|
|
70
|
+
isFinalPart: false,
|
|
71
|
+
isCompletedPart: false,
|
|
72
|
+
selectedSegment: segment,
|
|
73
|
+
nextValue: value,
|
|
74
|
+
shouldBlink: true,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
var nextValue = replaceTimeSegment(value, segment, String(Number("".concat(currentDigits).concat(digit))).padStart(TIME_SEGMENT_LENGTH, ZERO_PAD_CHAR), precision);
|
|
78
|
+
return {
|
|
79
|
+
isFinalPart: nextSegment === null,
|
|
80
|
+
isCompletedPart: true,
|
|
81
|
+
selectedSegment: nextSegment !== null && nextSegment !== void 0 ? nextSegment : segment,
|
|
82
|
+
nextValue: nextValue,
|
|
83
|
+
shouldBlink: false,
|
|
84
|
+
};
|
|
85
|
+
};
|
|
86
|
+
//# sourceMappingURL=TimePicker.editing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TimePicker.editing.js","sourceRoot":"","sources":["../../../../components/TimePicker/helpers/TimePicker.editing.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,aAAa,EACb,WAAW,EACX,0BAA0B,EAC1B,qBAAqB,EACrB,mBAAmB,EACnB,aAAa,GACd,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EACL,SAAS,EACT,iBAAiB,EACjB,qBAAqB,EACrB,wBAAwB,GAIzB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEhF,MAAM,CAAC,IAAM,gBAAgB,GAAG,UAAC,KAAa,EAAE,OAAoB,EAAE,SAAwB;IAC5F,OAAA,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,CAAC;AAA5D,CAA4D,CAAC;AAE/D,MAAM,CAAC,IAAM,sBAAsB,GAAG,UAAC,KAAa,EAAE,OAAoB,EAAE,SAAwB;IAClG,IAAM,mBAAmB,GAAG,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IAErE,IAAA,KAAkB,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,EAAhD,KAAK,QAAA,EAAE,MAAM,QAAmC,CAAC;IAExD,IAAI,YAAY,CAAC,IAAI,CAAC,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,WAAW,CAAC,EAAE,CAAC;QAC7C,OAAO,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,UAAG,KAAK,SAAG,qBAAqB,CAAE,EAAE,SAAS,CAAC,CAAC;IAC3F,CAAC;IAED,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,WAAW,CAAC,EAAE,CAAC;QAC5C,OAAO,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,CAAC,IAAM,wBAAwB,GAAG,UAAC,KAAa,EAAE,OAAoB,EAAE,SAAwB;IACpG,IAAM,SAAS,GAAG,wBAAwB,CAAC,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;IAEpG,IAAI,SAAS,KAAK,aAAa,EAAE,CAAC;QAChC,OAAO,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AAClE,CAAC,CAAC;AAEF,MAAM,CAAC,IAAM,qBAAqB,GAAG,UACnC,KAAa,EACb,OAAoB,EACpB,IAAY,EACZ,SAAwB;IAExB,IAAM,mBAAmB,GAAG,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IAE3E,IAAM,sBAAsB,GAAG,wBAAwB,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;IAEtF,IAAM,GAAG,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAEvC,IAAM,OAAO,GAAG,sBAAsB,KAAK,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;IAC9F,IAAM,IAAI,GAAG,CAAC,OAAO,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAEpD,OAAO,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,mBAAmB,EAAE,aAAa,CAAC,EAAE,SAAS,CAAC,CAAC;AAClH,CAAC,CAAC;AAEF,MAAM,CAAC,IAAM,wBAAwB,GAAG,UACtC,KAAa,EACb,OAAoB,EACpB,KAAa,EACb,SAAwB;IAExB,IAAM,mBAAmB,GAAG,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IAE3E,IAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAE3D,IAAM,YAAY,GAAG,qBAAqB,CAAC,mBAAmB,CAAC,CAAC;IAEhE,IAAM,aAAa,GAAG,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACzE,IAAM,mBAAmB,GAAG,0BAA0B,CAAC,OAAO,CAAC,CAAC;IAEhE,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,IAAI,OAAO,KAAK,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,mBAAmB,EAAE,CAAC;YAC/D,IAAM,WAAS,GAAG,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,WAAI,KAAK,CAAE,EAAE,SAAS,CAAC,CAAC;YAE7E,OAAO;gBACL,WAAW,EAAE,WAAW,KAAK,IAAI;gBACjC,eAAe,EAAE,IAAI;gBACrB,eAAe,EAAE,WAAW,aAAX,WAAW,cAAX,WAAW,GAAI,OAAO;gBACvC,SAAS,aAAA;gBACT,WAAW,EAAE,KAAK;aACnB,CAAC;QACJ,CAAC;QAED,OAAO;YACL,WAAW,EAAE,KAAK;YAClB,eAAe,EAAE,KAAK;YACtB,eAAe,EAAE,OAAO;YACxB,SAAS,EAAE,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,UAAG,KAAK,SAAG,qBAAqB,CAAE,EAAE,SAAS,CAAC;YAC5F,WAAW,EAAE,KAAK;SACnB,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,KAAK,OAAO,IAAI,aAAa,KAAK,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACtE,OAAO;YACL,WAAW,EAAE,KAAK;YAClB,eAAe,EAAE,KAAK;YACtB,eAAe,EAAE,OAAO;YACxB,SAAS,EAAE,KAAK;YAChB,WAAW,EAAE,IAAI;SAClB,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,KAAK,OAAO,IAAI,MAAM,CAAC,UAAG,aAAa,SAAG,KAAK,CAAE,CAAC,GAAG,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3F,OAAO;YACL,WAAW,EAAE,KAAK;YAClB,eAAe,EAAE,KAAK;YACtB,eAAe,EAAE,OAAO;YACxB,SAAS,EAAE,KAAK;YAChB,WAAW,EAAE,IAAI;SAClB,CAAC;IACJ,CAAC;IAED,IAAM,SAAS,GAAG,kBAAkB,CAClC,KAAK,EACL,OAAO,EACP,MAAM,CAAC,MAAM,CAAC,UAAG,aAAa,SAAG,KAAK,CAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,mBAAmB,EAAE,aAAa,CAAC,EACvF,SAAS,CACV,CAAC;IAEF,OAAO;QACL,WAAW,EAAE,WAAW,KAAK,IAAI;QACjC,eAAe,EAAE,IAAI;QACrB,eAAe,EAAE,WAAW,aAAX,WAAW,cAAX,WAAW,GAAI,OAAO;QACvC,SAAS,WAAA;QACT,WAAW,EAAE,KAAK;KACnB,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import {\n DIGIT_REGEXP,\n EMPTY_SEGMENT,\n EMPTY_VALUE,\n FIRST_DIGIT_MAX_BY_SEGMENT,\n TIME_PLACEHOLDER_CHAR,\n TIME_SEGMENT_LENGTH,\n ZERO_PAD_CHAR,\n} from './TimePicker.constants.js';\nimport { getNextTimeSegment } from './TimePicker.selection.js';\nimport {\n getDigits,\n getTimeSegmentMax,\n hasPendingSingleDigit,\n normalizeEditableSegment,\n type TimeDigitInputResult,\n type TimePrecision,\n type TimeSegment,\n} from './TimePicker.shared.js';\nimport { getTimeSegmentValue, replaceTimeSegment } from './TimePicker.value.js';\n\nexport const clearTimeSegment = (value: string, segment: TimeSegment, precision: TimePrecision): string =>\n replaceTimeSegment(value, segment, EMPTY_SEGMENT, precision);\n\nexport const deleteTimeSegmentDigit = (value: string, segment: TimeSegment, precision: TimePrecision): string => {\n const currentSegmentValue = getTimeSegmentValue(value, segment, precision);\n\n const [first, second] = Array.from(currentSegmentValue);\n\n if (DIGIT_REGEXP.test(second ?? EMPTY_VALUE)) {\n return replaceTimeSegment(value, segment, `${first}${TIME_PLACEHOLDER_CHAR}`, precision);\n }\n\n if (DIGIT_REGEXP.test(first ?? EMPTY_VALUE)) {\n return replaceTimeSegment(value, segment, EMPTY_SEGMENT, precision);\n }\n\n return value;\n};\n\nexport const commitTimeSegmentOnLeave = (value: string, segment: TimeSegment, precision: TimePrecision): string => {\n const nextValue = normalizeEditableSegment(getTimeSegmentValue(value, segment, precision), segment);\n\n if (nextValue === EMPTY_SEGMENT) {\n return replaceTimeSegment(value, segment, EMPTY_SEGMENT, precision);\n }\n\n return replaceTimeSegment(value, segment, nextValue, precision);\n};\n\nexport const shiftTimeSegmentValue = (\n value: string,\n segment: TimeSegment,\n step: 1 | -1,\n precision: TimePrecision,\n): string => {\n const currentSegmentValue = getTimeSegmentValue(value, segment, precision);\n\n const normalizedSegmentValue = normalizeEditableSegment(currentSegmentValue, segment);\n\n const max = getTimeSegmentMax(segment);\n\n const current = normalizedSegmentValue === EMPTY_SEGMENT ? 0 : Number(normalizedSegmentValue);\n const next = (current + step + max + 1) % (max + 1);\n\n return replaceTimeSegment(value, segment, String(next).padStart(TIME_SEGMENT_LENGTH, ZERO_PAD_CHAR), precision);\n};\n\nexport const formatDigitToTimeSegment = (\n value: string,\n segment: TimeSegment,\n digit: string,\n precision: TimePrecision,\n): TimeDigitInputResult => {\n const currentSegmentValue = getTimeSegmentValue(value, segment, precision);\n\n const nextSegment = getNextTimeSegment(segment, precision);\n\n const shouldAppend = hasPendingSingleDigit(currentSegmentValue);\n\n const currentDigits = shouldAppend ? getDigits(currentSegmentValue) : '';\n const firstDigitThreshold = FIRST_DIGIT_MAX_BY_SEGMENT[segment];\n\n if (currentDigits.length === 0) {\n if (segment === 'hours' && Number(digit) > firstDigitThreshold) {\n const nextValue = replaceTimeSegment(value, segment, `0${digit}`, precision);\n\n return {\n isFinalPart: nextSegment === null,\n isCompletedPart: true,\n selectedSegment: nextSegment ?? segment,\n nextValue,\n shouldBlink: false,\n };\n }\n\n return {\n isFinalPart: false,\n isCompletedPart: false,\n selectedSegment: segment,\n nextValue: replaceTimeSegment(value, segment, `${digit}${TIME_PLACEHOLDER_CHAR}`, precision),\n shouldBlink: false,\n };\n }\n\n if (segment === 'hours' && currentDigits === '2' && Number(digit) > 3) {\n return {\n isFinalPart: false,\n isCompletedPart: false,\n selectedSegment: segment,\n nextValue: value,\n shouldBlink: true,\n };\n }\n\n if (segment !== 'hours' && Number(`${currentDigits}${digit}`) > getTimeSegmentMax(segment)) {\n return {\n isFinalPart: false,\n isCompletedPart: false,\n selectedSegment: segment,\n nextValue: value,\n shouldBlink: true,\n };\n }\n\n const nextValue = replaceTimeSegment(\n value,\n segment,\n String(Number(`${currentDigits}${digit}`)).padStart(TIME_SEGMENT_LENGTH, ZERO_PAD_CHAR),\n precision,\n );\n\n return {\n isFinalPart: nextSegment === null,\n isCompletedPart: true,\n selectedSegment: nextSegment ?? segment,\n nextValue,\n shouldBlink: false,\n };\n};\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Theme } from '../../../lib/theming/Theme.js';
|
|
2
|
+
import type { SizeProp } from '../../../lib/types/props.js';
|
|
3
|
+
import { DEFAULT_TIME_PICKER_SLOTS } from './TimePicker.constants.js';
|
|
4
|
+
import type { TimePrecision } from './TimePicker.shared.js';
|
|
5
|
+
export { DEFAULT_TIME_PICKER_SLOTS };
|
|
6
|
+
export declare function getTimePickerPopupMaxHeight(size: SizeProp, theme: Theme): string;
|
|
7
|
+
export declare const getTimePickerInputWidth: (size: SizeProp, precision: TimePrecision) => number;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { DEFAULT_TIME_PICKER_SLOTS, INPUT_WIDTH_BY_SIZE, INPUT_WIDTH_WITH_SECONDS_BY_SIZE, } from './TimePicker.constants.js';
|
|
2
|
+
export { DEFAULT_TIME_PICKER_SLOTS };
|
|
3
|
+
export function getTimePickerPopupMaxHeight(size, theme) {
|
|
4
|
+
switch (size) {
|
|
5
|
+
case 'large':
|
|
6
|
+
return theme.timePickerMenuMaxHeightLarge;
|
|
7
|
+
case 'medium':
|
|
8
|
+
return theme.timePickerMenuMaxHeightMedium;
|
|
9
|
+
case 'small':
|
|
10
|
+
default:
|
|
11
|
+
return theme.timePickerMenuMaxHeightSmall;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export var getTimePickerInputWidth = function (size, precision) {
|
|
15
|
+
return precision === 'second' ? INPUT_WIDTH_WITH_SECONDS_BY_SIZE[size] : INPUT_WIDTH_BY_SIZE[size];
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=TimePicker.layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TimePicker.layout.js","sourceRoot":"","sources":["../../../../components/TimePicker/helpers/TimePicker.layout.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,yBAAyB,EACzB,mBAAmB,EACnB,gCAAgC,GACjC,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EAAE,yBAAyB,EAAE,CAAC;AAErC,MAAM,UAAU,2BAA2B,CAAC,IAAc,EAAE,KAAY;IACtE,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,OAAO;YACV,OAAO,KAAK,CAAC,4BAA4B,CAAC;QAE5C,KAAK,QAAQ;YACX,OAAO,KAAK,CAAC,6BAA6B,CAAC;QAE7C,KAAK,OAAO,CAAC;QAEb;YACE,OAAO,KAAK,CAAC,4BAA4B,CAAC;IAC9C,CAAC;AACH,CAAC;AAED,MAAM,CAAC,IAAM,uBAAuB,GAAG,UAAC,IAAc,EAAE,SAAwB;IAC9E,OAAA,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,gCAAgC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC;AAA3F,CAA2F,CAAC","sourcesContent":["import type { Theme } from '../../../lib/theming/Theme.js';\nimport type { SizeProp } from '../../../lib/types/props.js';\nimport {\n DEFAULT_TIME_PICKER_SLOTS,\n INPUT_WIDTH_BY_SIZE,\n INPUT_WIDTH_WITH_SECONDS_BY_SIZE,\n} from './TimePicker.constants.js';\nimport type { TimePrecision } from './TimePicker.shared.js';\n\nexport { DEFAULT_TIME_PICKER_SLOTS };\n\nexport function getTimePickerPopupMaxHeight(size: SizeProp, theme: Theme): string {\n switch (size) {\n case 'large':\n return theme.timePickerMenuMaxHeightLarge;\n\n case 'medium':\n return theme.timePickerMenuMaxHeightMedium;\n\n case 'small':\n\n default:\n return theme.timePickerMenuMaxHeightSmall;\n }\n}\n\nexport const getTimePickerInputWidth = (size: SizeProp, precision: TimePrecision): number =>\n precision === 'second' ? INPUT_WIDTH_WITH_SECONDS_BY_SIZE[size] : INPUT_WIDTH_BY_SIZE[size];\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type TimePrecision, type TimeSegment } from './TimePicker.shared.js';
|
|
2
|
+
export type TimeSelectionRange = [start: number, end: number];
|
|
3
|
+
export declare const getTimeSegmentSelectionRange: (segment: TimeSegment, precision: TimePrecision) => TimeSelectionRange;
|
|
4
|
+
export declare const getTimeSegmentSelectionNodeRange: (segment: TimeSegment, precision: TimePrecision) => TimeSelectionRange;
|
|
5
|
+
export declare const getTimeSegmentByCursorPosition: (position: number | null, precision: TimePrecision) => TimeSegment;
|
|
6
|
+
export declare const getNextTimeSegment: (segment: TimeSegment, precision: TimePrecision) => TimeSegment | null;
|
|
7
|
+
export declare const getPreviousTimeSegment: (segment: TimeSegment) => TimeSegment | null;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { TIME_SEGMENT_LENGTH, TIME_SEPARATOR } from './TimePicker.constants.js';
|
|
2
|
+
import { getTimeSegments } from './TimePicker.shared.js';
|
|
3
|
+
export var getTimeSegmentSelectionRange = function (segment, precision) {
|
|
4
|
+
var segments = getTimeSegments(precision);
|
|
5
|
+
var index = segments.indexOf(segment);
|
|
6
|
+
if (index < 0) {
|
|
7
|
+
return [0, TIME_SEGMENT_LENGTH];
|
|
8
|
+
}
|
|
9
|
+
var start = index * (TIME_SEGMENT_LENGTH + TIME_SEPARATOR.length);
|
|
10
|
+
return [start, start + TIME_SEGMENT_LENGTH];
|
|
11
|
+
};
|
|
12
|
+
export var getTimeSegmentSelectionNodeRange = function (segment, precision) {
|
|
13
|
+
var segments = getTimeSegments(precision);
|
|
14
|
+
var index = segments.indexOf(segment);
|
|
15
|
+
if (index < 0) {
|
|
16
|
+
return [0, 1];
|
|
17
|
+
}
|
|
18
|
+
var start = index * 2;
|
|
19
|
+
return [start, start + 1];
|
|
20
|
+
};
|
|
21
|
+
export var getTimeSegmentByCursorPosition = function (position, precision) {
|
|
22
|
+
var segments = getTimeSegments(precision);
|
|
23
|
+
if (position === null || position <= TIME_SEGMENT_LENGTH) {
|
|
24
|
+
return 'hours';
|
|
25
|
+
}
|
|
26
|
+
if (precision === 'minute' || position <= TIME_SEGMENT_LENGTH * 2 + TIME_SEPARATOR.length) {
|
|
27
|
+
return 'minutes';
|
|
28
|
+
}
|
|
29
|
+
return segments.includes('seconds') ? 'seconds' : 'minutes';
|
|
30
|
+
};
|
|
31
|
+
export var getNextTimeSegment = function (segment, precision) {
|
|
32
|
+
switch (segment) {
|
|
33
|
+
case 'hours':
|
|
34
|
+
return 'minutes';
|
|
35
|
+
case 'minutes':
|
|
36
|
+
return precision === 'second' ? 'seconds' : null;
|
|
37
|
+
case 'seconds':
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
export var getPreviousTimeSegment = function (segment) {
|
|
42
|
+
switch (segment) {
|
|
43
|
+
case 'hours':
|
|
44
|
+
return null;
|
|
45
|
+
case 'minutes':
|
|
46
|
+
return 'hours';
|
|
47
|
+
case 'seconds':
|
|
48
|
+
return 'minutes';
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=TimePicker.selection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TimePicker.selection.js","sourceRoot":"","sources":["../../../../components/TimePicker/helpers/TimePicker.selection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChF,OAAO,EAAE,eAAe,EAAwC,MAAM,wBAAwB,CAAC;AAI/F,MAAM,CAAC,IAAM,4BAA4B,GAAG,UAAC,OAAoB,EAAE,SAAwB;IACzF,IAAM,QAAQ,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IAE5C,IAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAExC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,OAAO,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC;IAClC,CAAC;IAED,IAAM,KAAK,GAAG,KAAK,GAAG,CAAC,mBAAmB,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAEpE,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,mBAAmB,CAAC,CAAC;AAC9C,CAAC,CAAC;AAEF,MAAM,CAAC,IAAM,gCAAgC,GAAG,UAC9C,OAAoB,EACpB,SAAwB;IAExB,IAAM,QAAQ,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IAE5C,IAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAExC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAChB,CAAC;IAED,IAAM,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;IAExB,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;AAC5B,CAAC,CAAC;AAEF,MAAM,CAAC,IAAM,8BAA8B,GAAG,UAAC,QAAuB,EAAE,SAAwB;IAC9F,IAAM,QAAQ,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IAE5C,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,IAAI,mBAAmB,EAAE,CAAC;QACzD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,IAAI,SAAS,KAAK,QAAQ,IAAI,QAAQ,IAAI,mBAAmB,GAAG,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC;QAC1F,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9D,CAAC,CAAC;AAEF,MAAM,CAAC,IAAM,kBAAkB,GAAG,UAAC,OAAoB,EAAE,SAAwB;IAC/E,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,OAAO;YACV,OAAO,SAAS,CAAC;QAEnB,KAAK,SAAS;YACZ,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;QAEnD,KAAK,SAAS;YACZ,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,IAAM,sBAAsB,GAAG,UAAC,OAAoB;IACzD,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,OAAO;YACV,OAAO,IAAI,CAAC;QAEd,KAAK,SAAS;YACZ,OAAO,OAAO,CAAC;QAEjB,KAAK,SAAS;YACZ,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC,CAAC","sourcesContent":["import { TIME_SEGMENT_LENGTH, TIME_SEPARATOR } from './TimePicker.constants.js';\nimport { getTimeSegments, type TimePrecision, type TimeSegment } from './TimePicker.shared.js';\n\nexport type TimeSelectionRange = [start: number, end: number];\n\nexport const getTimeSegmentSelectionRange = (segment: TimeSegment, precision: TimePrecision): TimeSelectionRange => {\n const segments = getTimeSegments(precision);\n\n const index = segments.indexOf(segment);\n\n if (index < 0) {\n return [0, TIME_SEGMENT_LENGTH];\n }\n\n const start = index * (TIME_SEGMENT_LENGTH + TIME_SEPARATOR.length);\n\n return [start, start + TIME_SEGMENT_LENGTH];\n};\n\nexport const getTimeSegmentSelectionNodeRange = (\n segment: TimeSegment,\n precision: TimePrecision,\n): TimeSelectionRange => {\n const segments = getTimeSegments(precision);\n\n const index = segments.indexOf(segment);\n\n if (index < 0) {\n return [0, 1];\n }\n\n const start = index * 2;\n\n return [start, start + 1];\n};\n\nexport const getTimeSegmentByCursorPosition = (position: number | null, precision: TimePrecision): TimeSegment => {\n const segments = getTimeSegments(precision);\n\n if (position === null || position <= TIME_SEGMENT_LENGTH) {\n return 'hours';\n }\n\n if (precision === 'minute' || position <= TIME_SEGMENT_LENGTH * 2 + TIME_SEPARATOR.length) {\n return 'minutes';\n }\n\n return segments.includes('seconds') ? 'seconds' : 'minutes';\n};\n\nexport const getNextTimeSegment = (segment: TimeSegment, precision: TimePrecision): TimeSegment | null => {\n switch (segment) {\n case 'hours':\n return 'minutes';\n\n case 'minutes':\n return precision === 'second' ? 'seconds' : null;\n\n case 'seconds':\n return null;\n }\n};\n\nexport const getPreviousTimeSegment = (segment: TimeSegment): TimeSegment | null => {\n switch (segment) {\n case 'hours':\n return null;\n\n case 'minutes':\n return 'hours';\n\n case 'seconds':\n return 'minutes';\n }\n};\n"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
export type TimePrecision = 'minute' | 'second';
|
|
3
|
+
export type TimeSegment = 'hours' | 'minutes' | 'seconds';
|
|
4
|
+
export interface TimeSlot {
|
|
5
|
+
disabled?: boolean;
|
|
6
|
+
time: string;
|
|
7
|
+
info?: ReactNode;
|
|
8
|
+
}
|
|
9
|
+
export interface TimeDigitInputResult {
|
|
10
|
+
isFinalPart: boolean;
|
|
11
|
+
isCompletedPart: boolean;
|
|
12
|
+
nextValue: string;
|
|
13
|
+
selectedSegment: TimeSegment;
|
|
14
|
+
shouldBlink: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare const getTimeSegments: (precision: TimePrecision) => TimeSegment[];
|
|
17
|
+
export declare const getTimeSegmentMax: (segment: TimeSegment) => number;
|
|
18
|
+
export declare const getDigits: (segment: string) => string;
|
|
19
|
+
export declare const sanitizeSegment: (segment: string) => string;
|
|
20
|
+
export declare const normalizeTimeSegment: (segmentValue: string, segment: TimeSegment) => string;
|
|
21
|
+
export declare const normalizeEditableSegment: (segmentValue: string, segment: TimeSegment) => string;
|
|
22
|
+
export declare const hasPendingSingleDigit: (segmentValue: string) => boolean;
|
|
23
|
+
export declare const getDisplaySegments: (value: string, precision: TimePrecision) => string[];
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { DIGIT_REGEXP, EMPTY_SEGMENT, EMPTY_VALUE, HOURS_MAX_VALUE, MINUTES_AND_SECONDS_MAX_VALUE, NON_DIGIT_REGEXP, TIME_PLACEHOLDER_CHAR, TIME_SEGMENT_LENGTH, TIME_SEGMENTS_BY_PRECISION, TIME_SEPARATOR, ZERO_PAD_CHAR, } from './TimePicker.constants.js';
|
|
2
|
+
export var getTimeSegments = function (precision) { return TIME_SEGMENTS_BY_PRECISION[precision]; };
|
|
3
|
+
export var getTimeSegmentMax = function (segment) {
|
|
4
|
+
return segment === 'hours' ? HOURS_MAX_VALUE : MINUTES_AND_SECONDS_MAX_VALUE;
|
|
5
|
+
};
|
|
6
|
+
export var getDigits = function (segment) {
|
|
7
|
+
return segment.replace(NON_DIGIT_REGEXP, EMPTY_VALUE).slice(0, TIME_SEGMENT_LENGTH);
|
|
8
|
+
};
|
|
9
|
+
export var sanitizeSegment = function (segment) {
|
|
10
|
+
return Array.from(segment)
|
|
11
|
+
.filter(function (char) { return DIGIT_REGEXP.test(char) || char === TIME_PLACEHOLDER_CHAR; })
|
|
12
|
+
.slice(0, TIME_SEGMENT_LENGTH)
|
|
13
|
+
.join('')
|
|
14
|
+
.padEnd(TIME_SEGMENT_LENGTH, TIME_PLACEHOLDER_CHAR);
|
|
15
|
+
};
|
|
16
|
+
export var normalizeTimeSegment = function (segmentValue, segment) {
|
|
17
|
+
var digits = getDigits(segmentValue);
|
|
18
|
+
if (!digits) {
|
|
19
|
+
return '00';
|
|
20
|
+
}
|
|
21
|
+
return String(Math.min(Number(digits), getTimeSegmentMax(segment))).padStart(TIME_SEGMENT_LENGTH, ZERO_PAD_CHAR);
|
|
22
|
+
};
|
|
23
|
+
export var normalizeEditableSegment = function (segmentValue, segment) {
|
|
24
|
+
var digits = getDigits(segmentValue);
|
|
25
|
+
if (!digits) {
|
|
26
|
+
return EMPTY_SEGMENT;
|
|
27
|
+
}
|
|
28
|
+
return String(Math.min(Number(digits), getTimeSegmentMax(segment))).padStart(TIME_SEGMENT_LENGTH, ZERO_PAD_CHAR);
|
|
29
|
+
};
|
|
30
|
+
export var hasPendingSingleDigit = function (segmentValue) {
|
|
31
|
+
return new RegExp("^\\d".concat(TIME_PLACEHOLDER_CHAR, "$")).test(segmentValue);
|
|
32
|
+
};
|
|
33
|
+
export var getDisplaySegments = function (value, precision) {
|
|
34
|
+
var segments = getTimeSegments(precision);
|
|
35
|
+
var fallback = segments.map(function () { return EMPTY_SEGMENT; });
|
|
36
|
+
if (value === EMPTY_VALUE) {
|
|
37
|
+
return fallback;
|
|
38
|
+
}
|
|
39
|
+
if (value.includes(TIME_SEPARATOR) || value.includes(TIME_PLACEHOLDER_CHAR)) {
|
|
40
|
+
var sourceParts_1 = value.split(TIME_SEPARATOR);
|
|
41
|
+
return segments.map(function (_, index) { var _a; return sanitizeSegment((_a = sourceParts_1[index]) !== null && _a !== void 0 ? _a : EMPTY_VALUE); });
|
|
42
|
+
}
|
|
43
|
+
var digits = value.replace(NON_DIGIT_REGEXP, EMPTY_VALUE);
|
|
44
|
+
return segments.map(function (_, index) {
|
|
45
|
+
var segmentStart = index * TIME_SEGMENT_LENGTH;
|
|
46
|
+
var segmentEnd = segmentStart + TIME_SEGMENT_LENGTH;
|
|
47
|
+
return sanitizeSegment(digits.slice(segmentStart, segmentEnd));
|
|
48
|
+
});
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=TimePicker.shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TimePicker.shared.js","sourceRoot":"","sources":["../../../../components/TimePicker/helpers/TimePicker.shared.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ReactNode } from 'react';\n\nimport {\n DIGIT_REGEXP,\n EMPTY_SEGMENT,\n EMPTY_VALUE,\n HOURS_MAX_VALUE,\n MINUTES_AND_SECONDS_MAX_VALUE,\n NON_DIGIT_REGEXP,\n TIME_PLACEHOLDER_CHAR,\n TIME_SEGMENT_LENGTH,\n TIME_SEGMENTS_BY_PRECISION,\n TIME_SEPARATOR,\n ZERO_PAD_CHAR,\n} from './TimePicker.constants.js';\n\nexport type TimePrecision = 'minute' | 'second';\nexport type TimeSegment = 'hours' | 'minutes' | 'seconds';\n\nexport interface TimeSlot {\n disabled?: boolean;\n time: string;\n info?: ReactNode;\n}\n\nexport interface TimeDigitInputResult {\n isFinalPart: boolean;\n isCompletedPart: boolean;\n nextValue: string;\n selectedSegment: TimeSegment;\n shouldBlink: boolean;\n}\n\nexport const getTimeSegments = (precision: TimePrecision): TimeSegment[] => TIME_SEGMENTS_BY_PRECISION[precision];\n\nexport const getTimeSegmentMax = (segment: TimeSegment): number =>\n segment === 'hours' ? HOURS_MAX_VALUE : MINUTES_AND_SECONDS_MAX_VALUE;\n\nexport const getDigits = (segment: string): string =>\n segment.replace(NON_DIGIT_REGEXP, EMPTY_VALUE).slice(0, TIME_SEGMENT_LENGTH);\n\nexport const sanitizeSegment = (segment: string): string =>\n Array.from(segment)\n .filter((char) => DIGIT_REGEXP.test(char) || char === TIME_PLACEHOLDER_CHAR)\n .slice(0, TIME_SEGMENT_LENGTH)\n .join('')\n .padEnd(TIME_SEGMENT_LENGTH, TIME_PLACEHOLDER_CHAR);\n\nexport const normalizeTimeSegment = (segmentValue: string, segment: TimeSegment): string => {\n const digits = getDigits(segmentValue);\n\n if (!digits) {\n return '00';\n }\n\n return String(Math.min(Number(digits), getTimeSegmentMax(segment))).padStart(TIME_SEGMENT_LENGTH, ZERO_PAD_CHAR);\n};\n\nexport const normalizeEditableSegment = (segmentValue: string, segment: TimeSegment): string => {\n const digits = getDigits(segmentValue);\n\n if (!digits) {\n return EMPTY_SEGMENT;\n }\n\n return String(Math.min(Number(digits), getTimeSegmentMax(segment))).padStart(TIME_SEGMENT_LENGTH, ZERO_PAD_CHAR);\n};\n\nexport const hasPendingSingleDigit = (segmentValue: string): boolean =>\n new RegExp(`^\\\\d${TIME_PLACEHOLDER_CHAR}$`).test(segmentValue);\n\nexport const getDisplaySegments = (value: string, precision: TimePrecision): string[] => {\n const segments = getTimeSegments(precision);\n const fallback = segments.map(() => EMPTY_SEGMENT);\n\n if (value === EMPTY_VALUE) {\n return fallback;\n }\n\n if (value.includes(TIME_SEPARATOR) || value.includes(TIME_PLACEHOLDER_CHAR)) {\n const sourceParts = value.split(TIME_SEPARATOR);\n return segments.map((_, index) => sanitizeSegment(sourceParts[index] ?? EMPTY_VALUE));\n }\n\n const digits = value.replace(NON_DIGIT_REGEXP, EMPTY_VALUE);\n\n return segments.map((_, index) => {\n const segmentStart = index * TIME_SEGMENT_LENGTH;\n const segmentEnd = segmentStart + TIME_SEGMENT_LENGTH;\n\n return sanitizeSegment(digits.slice(segmentStart, segmentEnd));\n });\n};\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type TimePrecision, type TimeSegment } from './TimePicker.shared.js';
|
|
2
|
+
export declare const getEmptyDisplayValue: (precision: TimePrecision) => string;
|
|
3
|
+
export declare const isTimeDisplayEmpty: (value: string) => boolean;
|
|
4
|
+
export declare const normalizeTimeValue: (value: string, precision: TimePrecision) => string;
|
|
5
|
+
export declare const isTimeValueInRange: (value: string, precision: TimePrecision, minValue?: string, maxValue?: string) => boolean;
|
|
6
|
+
export declare const replaceTimeSegment: (value: string, segment: TimeSegment, nextSegmentValue: string, precision: TimePrecision) => string;
|
|
7
|
+
export declare const parsePastedTimeValue: (value: string, precision: TimePrecision) => string;
|
|
8
|
+
export declare const getTimeSegmentValue: (value: string, segment: TimeSegment, precision: TimePrecision) => string;
|