@neo4j-ndl/react 4.15.1 → 4.15.3
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/lib/cjs/_generated/style-rules/color-utils.js +50 -0
- package/lib/cjs/_generated/style-rules/color-utils.js.map +1 -0
- package/lib/cjs/_generated/style-rules/date-utils.js +145 -0
- package/lib/cjs/_generated/style-rules/date-utils.js.map +1 -0
- package/lib/cjs/_generated/style-rules/index.js +38 -0
- package/lib/cjs/_generated/style-rules/index.js.map +1 -0
- package/lib/cjs/_generated/style-rules/literal-schemas.js +64 -0
- package/lib/cjs/_generated/style-rules/literal-schemas.js.map +1 -0
- package/lib/cjs/data-grid/DataGrid.js +2 -1
- package/lib/cjs/data-grid/DataGrid.js.map +1 -1
- package/lib/cjs/data-grid/data-grid-context.js.map +1 -1
- package/lib/cjs/data-grid/index.js +2 -14
- package/lib/cjs/data-grid/index.js.map +1 -1
- package/lib/cjs/data-grid/stories/datagrid-rule-based-styling-datetime.story.js +286 -0
- package/lib/cjs/data-grid/stories/datagrid-rule-based-styling-datetime.story.js.map +1 -0
- package/lib/cjs/data-grid/stories/index.js +5 -1
- package/lib/cjs/data-grid/stories/index.js.map +1 -1
- package/lib/cjs/data-grid/style-rules/evaluate.js +78 -49
- package/lib/cjs/data-grid/style-rules/evaluate.js.map +1 -1
- package/lib/cjs/data-grid/style-rules/hooks.js +3 -3
- package/lib/cjs/data-grid/style-rules/hooks.js.map +1 -1
- package/lib/cjs/data-grid/style-rules/index.js +4 -1
- package/lib/cjs/data-grid/style-rules/index.js.map +1 -1
- package/lib/cjs/data-grid/style-rules/types.js +26 -2
- package/lib/cjs/data-grid/style-rules/types.js.map +1 -1
- package/lib/cjs/time-picker/TimePicker.js +36 -20
- package/lib/cjs/time-picker/TimePicker.js.map +1 -1
- package/lib/cjs/time-picker/generate-time-options.js +6 -3
- package/lib/cjs/time-picker/generate-time-options.js.map +1 -1
- package/lib/cjs/time-picker/needle-time.js +23 -9
- package/lib/cjs/time-picker/needle-time.js.map +1 -1
- package/lib/cjs/time-picker/stories/index.js +5 -1
- package/lib/cjs/time-picker/stories/index.js.map +1 -1
- package/lib/cjs/time-picker/stories/time-picker-with-seconds.story.js +32 -0
- package/lib/cjs/time-picker/stories/time-picker-with-seconds.story.js.map +1 -0
- package/lib/cjs/tooltip/Tooltip.js.map +1 -1
- package/lib/cjs/tooltip/use-tooltip.js +1 -1
- package/lib/cjs/tooltip/use-tooltip.js.map +1 -1
- package/lib/esm/_generated/style-rules/color-utils.js +46 -0
- package/lib/esm/_generated/style-rules/color-utils.js.map +1 -0
- package/lib/esm/_generated/style-rules/date-utils.js +141 -0
- package/lib/esm/_generated/style-rules/date-utils.js.map +1 -0
- package/lib/esm/_generated/style-rules/index.js +29 -0
- package/lib/esm/_generated/style-rules/index.js.map +1 -0
- package/lib/esm/_generated/style-rules/literal-schemas.js +61 -0
- package/lib/esm/_generated/style-rules/literal-schemas.js.map +1 -0
- package/lib/esm/data-grid/DataGrid.js +2 -1
- package/lib/esm/data-grid/DataGrid.js.map +1 -1
- package/lib/esm/data-grid/data-grid-context.js.map +1 -1
- package/lib/esm/data-grid/index.js +1 -3
- package/lib/esm/data-grid/index.js.map +1 -1
- package/lib/esm/data-grid/stories/datagrid-rule-based-styling-datetime.story.js +284 -0
- package/lib/esm/data-grid/stories/datagrid-rule-based-styling-datetime.story.js.map +1 -0
- package/lib/esm/data-grid/stories/index.js +3 -0
- package/lib/esm/data-grid/stories/index.js.map +1 -1
- package/lib/esm/data-grid/style-rules/evaluate.js +72 -43
- package/lib/esm/data-grid/style-rules/evaluate.js.map +1 -1
- package/lib/esm/data-grid/style-rules/hooks.js +3 -3
- package/lib/esm/data-grid/style-rules/hooks.js.map +1 -1
- package/lib/esm/data-grid/style-rules/index.js +2 -1
- package/lib/esm/data-grid/style-rules/index.js.map +1 -1
- package/lib/esm/data-grid/style-rules/types.js +25 -1
- package/lib/esm/data-grid/style-rules/types.js.map +1 -1
- package/lib/esm/time-picker/TimePicker.js +36 -20
- package/lib/esm/time-picker/TimePicker.js.map +1 -1
- package/lib/esm/time-picker/generate-time-options.js +6 -3
- package/lib/esm/time-picker/generate-time-options.js.map +1 -1
- package/lib/esm/time-picker/needle-time.js +23 -9
- package/lib/esm/time-picker/needle-time.js.map +1 -1
- package/lib/esm/time-picker/stories/index.js +3 -0
- package/lib/esm/time-picker/stories/index.js.map +1 -1
- package/lib/esm/time-picker/stories/time-picker-with-seconds.story.js +30 -0
- package/lib/esm/time-picker/stories/time-picker-with-seconds.story.js.map +1 -0
- package/lib/esm/tooltip/Tooltip.js.map +1 -1
- package/lib/esm/tooltip/use-tooltip.js +1 -1
- package/lib/esm/tooltip/use-tooltip.js.map +1 -1
- package/lib/types/_generated/style-rules/color-utils.d.ts +33 -0
- package/lib/types/_generated/style-rules/color-utils.d.ts.map +1 -0
- package/lib/types/_generated/style-rules/date-utils.d.ts +54 -0
- package/lib/types/_generated/style-rules/date-utils.d.ts.map +1 -0
- package/lib/types/_generated/style-rules/index.d.ts +25 -0
- package/lib/types/_generated/style-rules/index.d.ts.map +1 -0
- package/lib/types/_generated/style-rules/literal-schemas.d.ts +53 -0
- package/lib/types/_generated/style-rules/literal-schemas.d.ts.map +1 -0
- package/lib/types/data-grid/DataGrid.d.ts +4 -2
- package/lib/types/data-grid/DataGrid.d.ts.map +1 -1
- package/lib/types/data-grid/data-grid-context.d.ts +2 -1
- package/lib/types/data-grid/data-grid-context.d.ts.map +1 -1
- package/lib/types/data-grid/index.d.ts +1 -4
- package/lib/types/data-grid/index.d.ts.map +1 -1
- package/lib/types/data-grid/stories/datagrid-pinned-columns.stories.d.ts +1 -1
- package/lib/types/data-grid/stories/datagrid-rule-based-styling-datetime.story.d.ts +24 -0
- package/lib/types/data-grid/stories/datagrid-rule-based-styling-datetime.story.d.ts.map +1 -0
- package/lib/types/data-grid/stories/datagrid-search-and-filters.stories.d.ts +1 -1
- package/lib/types/data-grid/stories/index.d.ts +2 -0
- package/lib/types/data-grid/stories/index.d.ts.map +1 -1
- package/lib/types/data-grid/style-rules/evaluate.d.ts +4 -3
- package/lib/types/data-grid/style-rules/evaluate.d.ts.map +1 -1
- package/lib/types/data-grid/style-rules/hooks.d.ts.map +1 -1
- package/lib/types/data-grid/style-rules/index.d.ts +2 -2
- package/lib/types/data-grid/style-rules/index.d.ts.map +1 -1
- package/lib/types/data-grid/style-rules/types.d.ts +62 -2
- package/lib/types/data-grid/style-rules/types.d.ts.map +1 -1
- package/lib/types/time-picker/TimePicker.d.ts +1 -1
- package/lib/types/time-picker/TimePicker.d.ts.map +1 -1
- package/lib/types/time-picker/generate-time-options.d.ts +1 -1
- package/lib/types/time-picker/generate-time-options.d.ts.map +1 -1
- package/lib/types/time-picker/needle-time.d.ts +4 -2
- package/lib/types/time-picker/needle-time.d.ts.map +1 -1
- package/lib/types/time-picker/stories/index.d.ts +2 -0
- package/lib/types/time-picker/stories/index.d.ts.map +1 -1
- package/lib/types/time-picker/stories/time-picker-with-seconds.story.d.ts +24 -0
- package/lib/types/time-picker/stories/time-picker-with-seconds.story.d.ts.map +1 -0
- package/lib/types/tooltip/Tooltip.d.ts +4 -1
- package/lib/types/tooltip/Tooltip.d.ts.map +1 -1
- package/lib/types/tooltip/use-tooltip.d.ts.map +1 -1
- package/package.json +6 -4
|
@@ -48,12 +48,20 @@ const typography_1 = require("../typography");
|
|
|
48
48
|
const generate_time_options_1 = require("./generate-time-options");
|
|
49
49
|
const needle_time_1 = require("./needle-time");
|
|
50
50
|
const time_picker_hooks_1 = require("./time-picker-hooks");
|
|
51
|
+
/** Fixed input width per format (only used when the picker is not fluid). */
|
|
52
|
+
const INPUT_WIDTH_BY_FORMAT = {
|
|
53
|
+
'hh:mm': '6rem',
|
|
54
|
+
'hh:mm aa': '9rem',
|
|
55
|
+
'hh:mm:ss': '7.5rem',
|
|
56
|
+
'hh:mm:ss aa': '11rem',
|
|
57
|
+
};
|
|
51
58
|
const TimePicker = (_a) => {
|
|
52
59
|
var _b, _c, _d;
|
|
53
60
|
var { format = 'hh:mm', isDisabled, isFluid, isReadOnly, isRequired, value, timeInterval = 15, label, onChange, className, onError, style, size = 'medium', errorText, htmlAttributes, floatingStrategy, isPortaled: isPortaledProp, ref } = _a, restProps = __rest(_a, ["format", "isDisabled", "isFluid", "isReadOnly", "isRequired", "value", "timeInterval", "label", "onChange", "className", "onError", "style", "size", "errorText", "htmlAttributes", "floatingStrategy", "isPortaled", "ref"]);
|
|
54
61
|
const [editedInput, setEditedInput] = (0, react_2.useState)(value);
|
|
55
|
-
const is24Hour = format
|
|
56
|
-
const
|
|
62
|
+
const is24Hour = !format.includes('aa');
|
|
63
|
+
const hasSeconds = format.includes('ss');
|
|
64
|
+
const [inputValue, setInputValue] = (0, react_2.useState)((_b = value === null || value === void 0 ? void 0 : value.toString(is24Hour, hasSeconds)) !== null && _b !== void 0 ? _b : '');
|
|
57
65
|
const listRef = (0, react_2.useRef)(null);
|
|
58
66
|
const inputRef = (0, react_2.useRef)(null);
|
|
59
67
|
(0, react_2.useImperativeHandle)(ref, () => inputRef.current, []);
|
|
@@ -61,7 +69,7 @@ const TimePicker = (_a) => {
|
|
|
61
69
|
const [error, setError] = (0, react_2.useState)(undefined);
|
|
62
70
|
const errorTextId = (0, react_2.useId)();
|
|
63
71
|
const listboxId = (0, react_2.useId)();
|
|
64
|
-
const timeOptions = (0, react_2.useMemo)(() => (0, generate_time_options_1.generateTimeOptions)(is24Hour, timeInterval), [is24Hour, timeInterval]);
|
|
72
|
+
const timeOptions = (0, react_2.useMemo)(() => (0, generate_time_options_1.generateTimeOptions)(is24Hour, timeInterval, hasSeconds), [is24Hour, timeInterval, hasSeconds]);
|
|
65
73
|
const { themeClassName } = (0, theme_1.useNeedleTheme)();
|
|
66
74
|
const { isPopoverOpen, setIsPopoverOpen } = (0, time_picker_hooks_1.useTimePickerPopover)(false);
|
|
67
75
|
const { focusedIndex, setFocusedIndex, handleArrowNavigation } = (0, time_picker_hooks_1.useKeyboardNavigation)(listRef, timeOptions.length);
|
|
@@ -75,14 +83,17 @@ const TimePicker = (_a) => {
|
|
|
75
83
|
'ndl-read-only': isReadOnly,
|
|
76
84
|
'ndl-small': size === 'small',
|
|
77
85
|
};
|
|
78
|
-
const inputWidth = isFluid === true ? '100%' :
|
|
79
|
-
const isValidTime = (0, react_2.useCallback)((hours, minutes) => {
|
|
86
|
+
const inputWidth = isFluid === true ? '100%' : INPUT_WIDTH_BY_FORMAT[format];
|
|
87
|
+
const isValidTime = (0, react_2.useCallback)((hours, minutes, seconds) => {
|
|
80
88
|
if (hours > 23 || hours < 0) {
|
|
81
89
|
return false;
|
|
82
90
|
}
|
|
83
91
|
if (minutes > 59 || minutes < 0) {
|
|
84
92
|
return false;
|
|
85
93
|
}
|
|
94
|
+
if (seconds > 59 || seconds < 0) {
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
86
97
|
return true;
|
|
87
98
|
}, []);
|
|
88
99
|
(0, react_2.useEffect)(() => {
|
|
@@ -93,8 +104,8 @@ const TimePicker = (_a) => {
|
|
|
93
104
|
(0, react_2.useEffect)(() => {
|
|
94
105
|
var _a;
|
|
95
106
|
setEditedInput(value);
|
|
96
|
-
setInputValue((_a = value === null || value === void 0 ? void 0 : value.toString(is24Hour)) !== null && _a !== void 0 ? _a : '');
|
|
97
|
-
}, [is24Hour, value]);
|
|
107
|
+
setInputValue((_a = value === null || value === void 0 ? void 0 : value.toString(is24Hour, hasSeconds)) !== null && _a !== void 0 ? _a : '');
|
|
108
|
+
}, [is24Hour, hasSeconds, value]);
|
|
98
109
|
(0, react_2.useEffect)(() => {
|
|
99
110
|
if (isPopoverOpen) {
|
|
100
111
|
setTimeout(() => {
|
|
@@ -109,13 +120,14 @@ const TimePicker = (_a) => {
|
|
|
109
120
|
setTimeout(() => {
|
|
110
121
|
var _a, _b, _c;
|
|
111
122
|
(_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.blur();
|
|
112
|
-
const selectedIndex = (_c = timeOptions.indexOf((_b = value === null || value === void 0 ? void 0 : value.toString(is24Hour)) !== null && _b !== void 0 ? _b : '')) !== null && _c !== void 0 ? _c : 0;
|
|
123
|
+
const selectedIndex = (_c = timeOptions.indexOf((_b = value === null || value === void 0 ? void 0 : value.toString(is24Hour, hasSeconds)) !== null && _b !== void 0 ? _b : '')) !== null && _c !== void 0 ? _c : 0;
|
|
113
124
|
setFocusedIndex(selectedIndex);
|
|
114
125
|
}, 0);
|
|
115
126
|
}
|
|
116
127
|
}, [
|
|
117
128
|
focusedIndex,
|
|
118
129
|
is24Hour,
|
|
130
|
+
hasSeconds,
|
|
119
131
|
isPopoverOpen,
|
|
120
132
|
value,
|
|
121
133
|
setFocusedIndex,
|
|
@@ -135,7 +147,7 @@ const TimePicker = (_a) => {
|
|
|
135
147
|
setInputValue(e.target.value);
|
|
136
148
|
setLastAction('type');
|
|
137
149
|
const time = needle_time_1.NeedleTime.fromString(e.target.value);
|
|
138
|
-
if (!isValidTime(time.hour, time.minute)) {
|
|
150
|
+
if (!isValidTime(time.hour, time.minute, time.second)) {
|
|
139
151
|
setError('Invalid time');
|
|
140
152
|
}
|
|
141
153
|
else {
|
|
@@ -152,14 +164,15 @@ const TimePicker = (_a) => {
|
|
|
152
164
|
}
|
|
153
165
|
setIsPopoverOpen(true);
|
|
154
166
|
if (e.key === 'Enter') {
|
|
155
|
-
|
|
167
|
+
const minTypedLength = (is24Hour ? 5 : 6) + (hasSeconds ? 3 : 0);
|
|
168
|
+
if (lastAction === 'type' && inputValue.length >= minTypedLength) {
|
|
156
169
|
const time = needle_time_1.NeedleTime.fromString(inputValue);
|
|
157
|
-
handleOnClick(time.toString(is24Hour));
|
|
170
|
+
handleOnClick(time.toString(is24Hour, hasSeconds));
|
|
158
171
|
}
|
|
159
172
|
else if (lastAction === 'type' && !inputValue.includes(':')) {
|
|
160
173
|
const time = needle_time_1.NeedleTime.fromString(inputValue);
|
|
161
|
-
if (isValidTime(time.hour, time.minute)) {
|
|
162
|
-
handleOnClick(time.toString(is24Hour));
|
|
174
|
+
if (isValidTime(time.hour, time.minute, time.second)) {
|
|
175
|
+
handleOnClick(time.toString(is24Hour, hasSeconds));
|
|
163
176
|
}
|
|
164
177
|
setIsPopoverOpen(false);
|
|
165
178
|
}
|
|
@@ -183,9 +196,10 @@ const TimePicker = (_a) => {
|
|
|
183
196
|
if (timeDigits.length === 1) {
|
|
184
197
|
// Single digit - assume it's an hour
|
|
185
198
|
const hour = `0${timeDigits}`;
|
|
199
|
+
const minutes = hasSeconds ? '00:00' : '00';
|
|
186
200
|
const searchTime = is24Hour
|
|
187
|
-
? `${hour}
|
|
188
|
-
: `${hour}
|
|
201
|
+
? `${hour}:${minutes}`
|
|
202
|
+
: `${hour}:${minutes} ${isPM ? 'PM' : 'AM'}`;
|
|
189
203
|
index = timeOptions.indexOf(searchTime);
|
|
190
204
|
}
|
|
191
205
|
else {
|
|
@@ -268,17 +282,19 @@ const TimePicker = (_a) => {
|
|
|
268
282
|
setError('Invalid time');
|
|
269
283
|
return;
|
|
270
284
|
}
|
|
271
|
-
if (!isValidTime(time.hour, time.minute)) {
|
|
285
|
+
if (!isValidTime(time.hour, time.minute, time.second)) {
|
|
272
286
|
setError('Invalid time');
|
|
273
287
|
}
|
|
274
288
|
else {
|
|
275
289
|
setError(undefined);
|
|
276
|
-
setInputValue(time.toString(is24Hour));
|
|
290
|
+
setInputValue(time.toString(is24Hour, hasSeconds));
|
|
277
291
|
}
|
|
278
|
-
}, placeholder: format,
|
|
292
|
+
}, placeholder: format,
|
|
293
|
+
// The typed value can never be longer than the format pattern.
|
|
294
|
+
maxLength: format.length }, restProps, htmlAttributes)), (0, jsx_runtime_1.jsx)(icons_1.ClockIconOutline, { className: "ndl-icon-svg ndl-time-picker-icon" })] })] }), errorToShow !== undefined && ((0, jsx_runtime_1.jsxs)("div", { className: "ndl-time-picker-error-wrapper", role: "status", children: [(0, jsx_runtime_1.jsx)(icons_1.ExclamationCircleIconSolid, { className: "ndl-time-picker-error-icon" }), (0, jsx_runtime_1.jsx)(typography_1.Typography, { variant: size === 'large' ? 'body-medium' : 'body-small', className: "ndl-time-picker-error-text", htmlAttributes: { id: errorTextId }, children: errorToShow })] }))] })), context.open && ((0, jsx_runtime_1.jsx)(conditional_wrap_1.ConditionalWrap, { shouldWrap: isPortaled, wrap: (wrapChildren) => ((0, jsx_runtime_1.jsx)(react_1.FloatingPortal, { children: wrapChildren })), children: (0, jsx_runtime_1.jsx)(react_1.FloatingFocusManager, { context: context, modal: false, initialFocus: -1, children: (0, jsx_runtime_1.jsx)("div", Object.assign({ ref: refs.setFloating, className: (0, classnames_1.default)(themeClassName, 'ndl-time-picker-popover', Object.assign({}, classes)), style: Object.assign(Object.assign(Object.assign({}, transitionStyles), floatingStyles), { width: isFluid === true
|
|
279
295
|
? (_d = containerRef.current) === null || _d === void 0 ? void 0 : _d.clientWidth
|
|
280
|
-
: undefined }) }, getFloatingProps(), { children: (0, jsx_runtime_1.jsx)("ul", { ref: listRef, role: "listbox", id: listboxId, tabIndex: -1, children: timeOptions.map((time, i) => ((0, jsx_runtime_1.jsx)("li", { id: `${listboxId}-option-${i}`, role: "option", "aria-selected": (value === null || value === void 0 ? void 0 : value.toString(is24Hour)) === time ||
|
|
281
|
-
(editedInput === null || editedInput === void 0 ? void 0 : editedInput.toString(is24Hour)) === time, value: time, onClick: (e) => {
|
|
296
|
+
: undefined }) }, getFloatingProps(), { children: (0, jsx_runtime_1.jsx)("ul", { ref: listRef, role: "listbox", id: listboxId, tabIndex: -1, children: timeOptions.map((time, i) => ((0, jsx_runtime_1.jsx)("li", { id: `${listboxId}-option-${i}`, role: "option", "aria-selected": (value === null || value === void 0 ? void 0 : value.toString(is24Hour, hasSeconds)) === time ||
|
|
297
|
+
(editedInput === null || editedInput === void 0 ? void 0 : editedInput.toString(is24Hour, hasSeconds)) === time, value: time, onClick: (e) => {
|
|
282
298
|
e.stopPropagation();
|
|
283
299
|
e.preventDefault();
|
|
284
300
|
handleOnClick(time);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimePicker.js","sourceRoot":"","sources":["../../../src/time-picker/TimePicker.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\nimport {\n autoUpdate,\n flip,\n FloatingFocusManager,\n FloatingPortal,\n offset,\n shift,\n useDismiss,\n useFloating,\n useInteractions,\n useMergeRefs,\n useTransitionStyles,\n} from '@floating-ui/react';\nimport { tokens } from '@neo4j-ndl/base';\nimport classNames from 'classnames';\nimport type React from 'react';\nimport {\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { type PolymorphicCommonProps } from '../_common/types';\nimport { ConditionalWrap } from '../conditional-wrap';\nimport { useIsInsideDialog } from '../dialog/dialog-context';\nimport { ClockIconOutline, ExclamationCircleIconSolid } from '../icons';\nimport { useNeedleTheme } from '../theme';\nimport { Typography } from '../typography';\nimport { generateTimeOptions } from './generate-time-options';\nimport { NeedleTime } from './needle-time';\nimport {\n useKeyboardNavigation,\n useTimePickerPopover,\n} from './time-picker-hooks';\n\nexport type TimeFormat = 'hh:mm' | 'hh:mm aa';\n\nexport type TimePickerProps = {\n /** The value of the time picker */\n value?: NeedleTime;\n /** The format of the time picker */\n format?: TimeFormat;\n /** Whether the time picker is fluid */\n isFluid?: boolean;\n /** Whether the time picker is read only */\n isReadOnly?: boolean;\n /** Whether the time picker is required */\n isRequired?: boolean;\n /** Whether the time picker is disabled */\n isDisabled?: boolean;\n /** The time interval of the time picker, in minutes */\n timeInterval?: number;\n /** The label of the time picker */\n label?: string;\n /** The size of the time picker */\n size?: 'small' | 'medium' | 'large';\n /** Manually set the error text */\n errorText?: string;\n /** Callback function triggered when the time picker value changes */\n onChange?: (time: NeedleTime) => void;\n /** Callback function triggered when the time picker encounters an error */\n onError?: (error: string, time: NeedleTime) => void;\n /**\n * Strategy for the dropdown floating element.\n * By default it is absolute, but if the component is inside of a needle Dialog, it is set to fixed.\n * If this prop is set, no auto-detection of Dialog is done.\n */\n floatingStrategy?: 'absolute' | 'fixed';\n /** Whether the dropdown element is rendered in a portal. */\n isPortaled?: boolean;\n};\n\nexport const TimePicker = <T extends React.ElementType = 'div'>({\n format = 'hh:mm',\n isDisabled,\n isFluid,\n isReadOnly,\n isRequired,\n value,\n timeInterval = 15,\n label,\n onChange,\n className,\n onError,\n style,\n size = 'medium',\n errorText,\n htmlAttributes,\n floatingStrategy,\n isPortaled: isPortaledProp,\n ref,\n ...restProps\n}: PolymorphicCommonProps<T, TimePickerProps>) => {\n const [editedInput, setEditedInput] = useState<NeedleTime | undefined>(value);\n\n const is24Hour = format === 'hh:mm';\n const [inputValue, setInputValue] = useState<string>(\n value?.toString(is24Hour) ?? '',\n );\n const listRef = useRef<HTMLUListElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n useImperativeHandle(ref, () => inputRef.current as HTMLInputElement, []);\n const [lastAction, setLastAction] = useState<'type' | 'arrow'>('type');\n const [error, setError] = useState<string | undefined>(undefined);\n const errorTextId = useId();\n const listboxId = useId();\n\n const timeOptions = useMemo(\n () => generateTimeOptions(is24Hour, timeInterval),\n [is24Hour, timeInterval],\n );\n\n const { themeClassName } = useNeedleTheme();\n const { isPopoverOpen, setIsPopoverOpen } = useTimePickerPopover(false);\n const { focusedIndex, setFocusedIndex, handleArrowNavigation } =\n useKeyboardNavigation(listRef, timeOptions.length);\n\n const errorToShow =\n errorText !== undefined && errorText !== '' ? errorText : error;\n\n const classes = {\n 'ndl-disabled': isDisabled,\n 'ndl-error': errorToShow !== undefined,\n 'ndl-fluid': isFluid,\n 'ndl-large': size === 'large',\n 'ndl-medium': size === 'medium',\n 'ndl-read-only': isReadOnly,\n 'ndl-small': size === 'small',\n };\n\n const inputWidth =\n isFluid === true ? '100%' : is24Hour === true ? '6rem' : '9rem';\n\n const isValidTime = useCallback((hours: number, minutes: number) => {\n if (hours > 23 || hours < 0) {\n return false;\n }\n\n if (minutes > 59 || minutes < 0) {\n return false;\n }\n\n return true;\n }, []);\n\n useEffect(() => {\n if (error !== undefined) {\n onError?.(error, NeedleTime.fromString(inputValue));\n }\n }, [error, inputValue, onError]);\n\n useEffect(() => {\n setEditedInput(value);\n setInputValue(value?.toString(is24Hour) ?? '');\n }, [is24Hour, value]);\n\n useEffect(() => {\n if (isPopoverOpen) {\n setTimeout(() => {\n listRef.current?.children[focusedIndex]?.scrollIntoView({\n block: 'center',\n inline: 'nearest',\n });\n }, 0);\n } else {\n setTimeout(() => {\n inputRef.current?.blur();\n const selectedIndex =\n timeOptions.indexOf(value?.toString(is24Hour) ?? '') ?? 0;\n setFocusedIndex(selectedIndex);\n }, 0);\n }\n }, [\n focusedIndex,\n is24Hour,\n isPopoverOpen,\n value,\n setFocusedIndex,\n timeOptions,\n ]);\n\n const handleOnClick = (timeText: string) => {\n if (onChange) {\n onChange(NeedleTime.fromString(timeText));\n }\n setError(undefined);\n setInputValue(timeText);\n setEditedInput(NeedleTime.fromString(timeText));\n setIsPopoverOpen(false);\n };\n const newHandleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n scrollToTime(e.target.value);\n setInputValue(e.target.value);\n setLastAction('type');\n\n const time = NeedleTime.fromString(e.target.value);\n if (!isValidTime(time.hour, time.minute)) {\n setError('Invalid time');\n } else {\n setError(undefined);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (isReadOnly === true || isDisabled === true) {\n e.preventDefault();\n return;\n }\n\n if (e.key === 'Escape') {\n setIsPopoverOpen(false);\n }\n\n setIsPopoverOpen(true);\n\n if (e.key === 'Enter') {\n if (lastAction === 'type' && inputValue.length >= (is24Hour ? 5 : 6)) {\n const time = NeedleTime.fromString(inputValue);\n handleOnClick(time.toString(is24Hour));\n } else if (lastAction === 'type' && !inputValue.includes(':')) {\n const time = NeedleTime.fromString(inputValue);\n if (isValidTime(time.hour, time.minute)) {\n handleOnClick(time.toString(is24Hour));\n }\n setIsPopoverOpen(false);\n } else {\n handleOnClick(timeOptions[focusedIndex]);\n }\n } else if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n e.preventDefault();\n setLastAction('arrow');\n handleArrowNavigation(e.key);\n }\n };\n\n const scrollToTime = (startOfTime: string) => {\n const parsedTime = startOfTime.toLowerCase().replace(/[^0-9amp]/g, '');\n let index = -1;\n\n // Handle AM/PM input\n const isPM = parsedTime.includes('p');\n const isAM = parsedTime.includes('a');\n const timeDigits = parsedTime.replace(/[amp]/g, '');\n\n if (timeDigits.length === 1) {\n // Single digit - assume it's an hour\n const hour = `0${timeDigits}`;\n const searchTime = is24Hour\n ? `${hour}:00`\n : `${hour}:00 ${isPM ? 'PM' : 'AM'}`;\n index = timeOptions.indexOf(searchTime);\n } else {\n // Find closest matching time\n const closestTime = timeOptions.find((time) => {\n const timeWithoutSpecialChars = time\n .toLowerCase()\n .replace(/[^0-9amp]/g, '');\n if (isPM || isAM) {\n // If AM/PM specified, match that specifically\n return timeWithoutSpecialChars.startsWith(parsedTime);\n } else {\n // Otherwise just match the numbers\n return timeWithoutSpecialChars\n .replace(/[amp]/g, '')\n .startsWith(timeDigits);\n }\n });\n index = closestTime !== undefined ? timeOptions.indexOf(closestTime) : -1;\n }\n\n if (index !== -1) {\n setFocusedIndex(index);\n }\n\n return index;\n };\n\n /** Custom floating ui solution */\n const isInsideDialog = useIsInsideDialog();\n const isPortaled = isPortaledProp ?? !isInsideDialog;\n const containerRef = useRef<HTMLDivElement>(null);\n const { refs, floatingStyles, context } = useFloating({\n elements: {\n reference: containerRef.current,\n },\n middleware: [\n offset(10),\n flip({\n fallbackPlacements: ['top'],\n fallbackStrategy: 'bestFit',\n }),\n shift({ padding: 5 }),\n ],\n onOpenChange: (open) => {\n setIsPopoverOpen(open);\n },\n open: isDisabled !== true && isReadOnly !== true && isPopoverOpen,\n placement: 'bottom',\n strategy: floatingStrategy ?? (isInsideDialog ? 'fixed' : 'absolute'),\n whileElementsMounted: autoUpdate,\n });\n const dismiss = useDismiss(context);\n const { getReferenceProps, getFloatingProps } = useInteractions([dismiss]);\n const { styles: transitionStyles } = useTransitionStyles(context, {\n duration: Number.parseInt(tokens.motion.duration.quick) ?? 0,\n });\n\n const mergedRef = useMergeRefs([refs.setReference, containerRef]);\n\n return (\n <>\n <div\n className={classNames('ndl-time-picker', className, {\n ...classes,\n })}\n ref={mergedRef}\n {...getReferenceProps()}\n style={{\n width: isFluid === true ? '100%' : 'fit-content',\n }}\n >\n <label className=\"ndl-time-picker-label\">\n {label !== undefined && (\n <Typography\n variant={size === 'large' ? 'body-large' : 'body-medium'}\n >\n {label}\n </Typography>\n )}\n <div\n className=\"ndl-time-picker-input-wrapper\"\n style={{\n width: inputWidth,\n ...style,\n }}\n >\n <input\n role=\"combobox\"\n aria-expanded={isPopoverOpen}\n aria-controls={listboxId}\n aria-activedescendant={\n isPopoverOpen && focusedIndex >= 0\n ? `${listboxId}-option-${focusedIndex}`\n : undefined\n }\n aria-label={label} // TODO: handle label natively\n aria-invalid={Boolean(errorToShow)}\n aria-describedby={errorToShow ? errorTextId : undefined}\n className=\"ndl-time-picker-input\"\n type=\"text\"\n ref={inputRef}\n value={inputValue}\n disabled={isDisabled}\n readOnly={isReadOnly}\n required={isRequired}\n onChange={newHandleInputChange}\n onKeyDown={handleKeyDown}\n onClick={() => {\n if (isReadOnly === true || isDisabled === true) {\n return;\n }\n setIsPopoverOpen(true);\n }}\n onBlur={(e) => {\n if (isReadOnly === true || isDisabled === true) {\n return;\n }\n\n if (\n e.relatedTarget?.classList.contains(\n 'ndl-time-picker-popover-item',\n ) === true\n ) {\n return;\n }\n\n if (inputValue.length < 4) {\n setError('Invalid time');\n return;\n }\n\n const time = NeedleTime.fromString(inputValue);\n\n if (time === undefined || time === null) {\n setError('Invalid time');\n return;\n }\n\n if (!isValidTime(time.hour, time.minute)) {\n setError('Invalid time');\n } else {\n setError(undefined);\n setInputValue(time.toString(is24Hour));\n }\n }}\n placeholder={format}\n maxLength={is24Hour ? 5 : 8}\n {...restProps}\n {...htmlAttributes}\n />\n <ClockIconOutline className=\"ndl-icon-svg ndl-time-picker-icon\" />\n </div>\n </label>\n {errorToShow !== undefined && (\n <div className=\"ndl-time-picker-error-wrapper\" role=\"status\">\n <ExclamationCircleIconSolid className=\"ndl-time-picker-error-icon\" />\n <Typography\n variant={size === 'large' ? 'body-medium' : 'body-small'}\n className=\"ndl-time-picker-error-text\"\n htmlAttributes={{ id: errorTextId }}\n >\n {errorToShow}\n </Typography>\n </div>\n )}\n </div>\n\n {context.open && (\n <ConditionalWrap\n shouldWrap={isPortaled}\n wrap={(wrapChildren) => (\n <FloatingPortal>{wrapChildren}</FloatingPortal>\n )}\n >\n <FloatingFocusManager\n context={context}\n modal={false}\n initialFocus={-1}\n >\n <div\n ref={refs.setFloating}\n className={classNames(themeClassName, 'ndl-time-picker-popover', {\n ...classes,\n })}\n style={{\n ...transitionStyles,\n ...floatingStyles,\n width:\n isFluid === true\n ? containerRef.current?.clientWidth\n : undefined,\n }}\n {...getFloatingProps()}\n >\n <ul ref={listRef} role=\"listbox\" id={listboxId} tabIndex={-1}>\n {timeOptions.map((time, i) => (\n <li\n id={`${listboxId}-option-${i}`}\n key={i}\n role=\"option\"\n aria-selected={\n value?.toString(is24Hour) === time ||\n editedInput?.toString(is24Hour) === time\n }\n value={time}\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n handleOnClick(time);\n setIsPopoverOpen(false);\n }}\n onMouseDown={(e) => {\n e.stopPropagation();\n e.preventDefault();\n }}\n tabIndex={-1}\n className={classNames(\n focusedIndex === i ? 'focused' : '',\n 'ndl-time-picker-popover-item',\n )}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.stopPropagation();\n handleOnClick(time);\n }\n }}\n >\n {time}\n </li>\n ))}\n </ul>\n </div>\n </FloatingFocusManager>\n </ConditionalWrap>\n )}\n </>\n );\n};\n"]}
|
|
1
|
+
{"version":3,"file":"TimePicker.js","sourceRoot":"","sources":["../../../src/time-picker/TimePicker.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,8CAY4B;AAC5B,0CAAyC;AACzC,4DAAoC;AAEpC,iCAQe;AAGf,0DAAsD;AACtD,6DAA6D;AAC7D,oCAAwE;AACxE,oCAA0C;AAC1C,8CAA2C;AAC3C,mEAA8D;AAC9D,+CAA2C;AAC3C,2DAG6B;AAI7B,6EAA6E;AAC7E,MAAM,qBAAqB,GAA+B;IACxD,OAAO,EAAE,MAAM;IACf,UAAU,EAAE,MAAM;IAClB,UAAU,EAAE,QAAQ;IACpB,aAAa,EAAE,OAAO;CACvB,CAAC;AAqCK,MAAM,UAAU,GAAG,CAAsC,EAoBnB,EAAE,EAAE;;QApBe,EAC9D,MAAM,GAAG,OAAO,EAChB,UAAU,EACV,OAAO,EACP,UAAU,EACV,UAAU,EACV,KAAK,EACL,YAAY,GAAG,EAAE,EACjB,KAAK,EACL,QAAQ,EACR,SAAS,EACT,OAAO,EACP,KAAK,EACL,IAAI,GAAG,QAAQ,EACf,SAAS,EACT,cAAc,EACd,gBAAgB,EAChB,UAAU,EAAE,cAAc,EAC1B,GAAG,OAEwC,EADxC,SAAS,cAnBkD,8NAoB/D,CADa;IAEZ,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,IAAA,gBAAQ,EAAyB,KAAK,CAAC,CAAC;IAE9E,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,IAAA,gBAAQ,EAC1C,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,mCAAI,EAAE,CAC5C,CAAC;IACF,MAAM,OAAO,GAAG,IAAA,cAAM,EAAmB,IAAI,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,IAAA,cAAM,EAAmB,IAAI,CAAC,CAAC;IAChD,IAAA,2BAAmB,EAAC,GAAG,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,OAA2B,EAAE,EAAE,CAAC,CAAC;IACzE,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,IAAA,gBAAQ,EAAmB,MAAM,CAAC,CAAC;IACvE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,IAAA,gBAAQ,EAAqB,SAAS,CAAC,CAAC;IAClE,MAAM,WAAW,GAAG,IAAA,aAAK,GAAE,CAAC;IAC5B,MAAM,SAAS,GAAG,IAAA,aAAK,GAAE,CAAC;IAE1B,MAAM,WAAW,GAAG,IAAA,eAAO,EACzB,GAAG,EAAE,CAAC,IAAA,2CAAmB,EAAC,QAAQ,EAAE,YAAY,EAAE,UAAU,CAAC,EAC7D,CAAC,QAAQ,EAAE,YAAY,EAAE,UAAU,CAAC,CACrC,CAAC;IAEF,MAAM,EAAE,cAAc,EAAE,GAAG,IAAA,sBAAc,GAAE,CAAC;IAC5C,MAAM,EAAE,aAAa,EAAE,gBAAgB,EAAE,GAAG,IAAA,wCAAoB,EAAC,KAAK,CAAC,CAAC;IACxE,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,qBAAqB,EAAE,GAC5D,IAAA,yCAAqB,EAAC,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAErD,MAAM,WAAW,GACf,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;IAElE,MAAM,OAAO,GAAG;QACd,cAAc,EAAE,UAAU;QAC1B,WAAW,EAAE,WAAW,KAAK,SAAS;QACtC,WAAW,EAAE,OAAO;QACpB,WAAW,EAAE,IAAI,KAAK,OAAO;QAC7B,YAAY,EAAE,IAAI,KAAK,QAAQ;QAC/B,eAAe,EAAE,UAAU;QAC3B,WAAW,EAAE,IAAI,KAAK,OAAO;KAC9B,CAAC;IAEF,MAAM,UAAU,GAAG,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAE7E,MAAM,WAAW,GAAG,IAAA,mBAAW,EAC7B,CAAC,KAAa,EAAE,OAAe,EAAE,OAAe,EAAE,EAAE;QAClD,IAAI,KAAK,GAAG,EAAE,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YAC5B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,OAAO,GAAG,EAAE,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YAChC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,OAAO,GAAG,EAAE,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YAChC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC,EACD,EAAE,CACH,CAAC;IAEF,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAG,KAAK,EAAE,wBAAU,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;QACtD,CAAC;IACH,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IAEjC,IAAA,iBAAS,EAAC,GAAG,EAAE;;QACb,cAAc,CAAC,KAAK,CAAC,CAAC;QACtB,aAAa,CAAC,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,mCAAI,EAAE,CAAC,CAAC;IAC7D,CAAC,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;IAElC,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,aAAa,EAAE,CAAC;YAClB,UAAU,CAAC,GAAG,EAAE;;gBACd,MAAA,MAAA,OAAO,CAAC,OAAO,0CAAE,QAAQ,CAAC,YAAY,CAAC,0CAAE,cAAc,CAAC;oBACtD,KAAK,EAAE,QAAQ;oBACf,MAAM,EAAE,SAAS;iBAClB,CAAC,CAAC;YACL,CAAC,EAAE,CAAC,CAAC,CAAC;QACR,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,GAAG,EAAE;;gBACd,MAAA,QAAQ,CAAC,OAAO,0CAAE,IAAI,EAAE,CAAC;gBACzB,MAAM,aAAa,GACjB,MAAA,WAAW,CAAC,OAAO,CAAC,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,mCAAI,EAAE,CAAC,mCAAI,CAAC,CAAC;gBACxE,eAAe,CAAC,aAAa,CAAC,CAAC;YACjC,CAAC,EAAE,CAAC,CAAC,CAAC;QACR,CAAC;IACH,CAAC,EAAE;QACD,YAAY;QACZ,QAAQ;QACR,UAAU;QACV,aAAa;QACb,KAAK;QACL,eAAe;QACf,WAAW;KACZ,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,CAAC,QAAgB,EAAE,EAAE;QACzC,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,wBAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC5C,CAAC;QACD,QAAQ,CAAC,SAAS,CAAC,CAAC;QACpB,aAAa,CAAC,QAAQ,CAAC,CAAC;QACxB,cAAc,CAAC,wBAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;QAChD,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC,CAAC;IACF,MAAM,oBAAoB,GAAG,CAAC,CAAsC,EAAE,EAAE;QACtE,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7B,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9B,aAAa,CAAC,MAAM,CAAC,CAAC;QAEtB,MAAM,IAAI,GAAG,wBAAU,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACtD,QAAQ,CAAC,cAAc,CAAC,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,SAAS,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,CAAC,CAAwC,EAAE,EAAE;QACjE,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YAC/C,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;YACvB,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;QAED,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAEvB,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;YACtB,MAAM,cAAc,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACjE,IAAI,UAAU,KAAK,MAAM,IAAI,UAAU,CAAC,MAAM,IAAI,cAAc,EAAE,CAAC;gBACjE,MAAM,IAAI,GAAG,wBAAU,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;gBAC/C,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;YACrD,CAAC;iBAAM,IAAI,UAAU,KAAK,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC9D,MAAM,IAAI,GAAG,wBAAU,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;gBAC/C,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;oBACrD,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;gBACrD,CAAC;gBACD,gBAAgB,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;iBAAM,CAAC;gBACN,aAAa,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;aAAM,IAAI,CAAC,CAAC,GAAG,KAAK,SAAS,IAAI,CAAC,CAAC,GAAG,KAAK,WAAW,EAAE,CAAC;YACxD,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,aAAa,CAAC,OAAO,CAAC,CAAC;YACvB,qBAAqB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,CAAC,WAAmB,EAAE,EAAE;QAC3C,MAAM,UAAU,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QACvE,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;QAEf,qBAAqB;QACrB,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAEpD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,qCAAqC;YACrC,MAAM,IAAI,GAAG,IAAI,UAAU,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;YAC5C,MAAM,UAAU,GAAG,QAAQ;gBACzB,CAAC,CAAC,GAAG,IAAI,IAAI,OAAO,EAAE;gBACtB,CAAC,CAAC,GAAG,IAAI,IAAI,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC/C,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,6BAA6B;YAC7B,MAAM,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;gBAC5C,MAAM,uBAAuB,GAAG,IAAI;qBACjC,WAAW,EAAE;qBACb,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;gBAC7B,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;oBACjB,8CAA8C;oBAC9C,OAAO,uBAAuB,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;gBACxD,CAAC;qBAAM,CAAC;oBACN,mCAAmC;oBACnC,OAAO,uBAAuB;yBAC3B,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;yBACrB,UAAU,CAAC,UAAU,CAAC,CAAC;gBAC5B,CAAC;YACH,CAAC,CAAC,CAAC;YACH,KAAK,GAAG,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5E,CAAC;QAED,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACjB,eAAe,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,kCAAkC;IAClC,MAAM,cAAc,GAAG,IAAA,kCAAiB,GAAE,CAAC;IAC3C,MAAM,UAAU,GAAG,cAAc,aAAd,cAAc,cAAd,cAAc,GAAI,CAAC,cAAc,CAAC;IACrD,MAAM,YAAY,GAAG,IAAA,cAAM,EAAiB,IAAI,CAAC,CAAC;IAClD,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,GAAG,IAAA,mBAAW,EAAC;QACpD,QAAQ,EAAE;YACR,SAAS,EAAE,YAAY,CAAC,OAAO;SAChC;QACD,UAAU,EAAE;YACV,IAAA,cAAM,EAAC,EAAE,CAAC;YACV,IAAA,YAAI,EAAC;gBACH,kBAAkB,EAAE,CAAC,KAAK,CAAC;gBAC3B,gBAAgB,EAAE,SAAS;aAC5B,CAAC;YACF,IAAA,aAAK,EAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;SACtB;QACD,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE;YACrB,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QACD,IAAI,EAAE,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,IAAI,IAAI,aAAa;QACjE,SAAS,EAAE,QAAQ;QACnB,QAAQ,EAAE,gBAAgB,aAAhB,gBAAgB,cAAhB,gBAAgB,GAAI,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC;QACrE,oBAAoB,EAAE,kBAAU;KACjC,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,IAAA,kBAAU,EAAC,OAAO,CAAC,CAAC;IACpC,MAAM,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,GAAG,IAAA,uBAAe,EAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3E,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,IAAA,2BAAmB,EAAC,OAAO,EAAE;QAChE,QAAQ,EAAE,MAAA,MAAM,CAAC,QAAQ,CAAC,aAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,mCAAI,CAAC;KAC7D,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,IAAA,oBAAY,EAAC,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC;IAElE,OAAO,CACL,6DACE,+CACE,SAAS,EAAE,IAAA,oBAAU,EAAC,iBAAiB,EAAE,SAAS,oBAC7C,OAAO,EACV,EACF,GAAG,EAAE,SAAS,IACV,iBAAiB,EAAE,IACvB,KAAK,EAAE;oBACL,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa;iBACjD,aAED,mCAAO,SAAS,EAAC,uBAAuB,aACrC,KAAK,KAAK,SAAS,IAAI,CACtB,uBAAC,uBAAU,IACT,OAAO,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,YAEvD,KAAK,GACK,CACd,EACD,iCACE,SAAS,EAAC,+BAA+B,EACzC,KAAK,kBACH,KAAK,EAAE,UAAU,IACd,KAAK,cAGV,gDACE,IAAI,EAAC,UAAU,mBACA,aAAa,mBACb,SAAS,2BAEtB,aAAa,IAAI,YAAY,IAAI,CAAC;4CAChC,CAAC,CAAC,GAAG,SAAS,WAAW,YAAY,EAAE;4CACvC,CAAC,CAAC,SAAS,gBAEH,KAAK,kBACH,OAAO,CAAC,WAAW,CAAC,sBAChB,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,EACvD,SAAS,EAAC,uBAAuB,EACjC,IAAI,EAAC,MAAM,EACX,GAAG,EAAE,QAAQ,EACb,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,UAAU,EACpB,QAAQ,EAAE,UAAU,EACpB,QAAQ,EAAE,UAAU,EACpB,QAAQ,EAAE,oBAAoB,EAC9B,SAAS,EAAE,aAAa,EACxB,OAAO,EAAE,GAAG,EAAE;4CACZ,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;gDAC/C,OAAO;4CACT,CAAC;4CACD,gBAAgB,CAAC,IAAI,CAAC,CAAC;wCACzB,CAAC,EACD,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE;;4CACZ,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;gDAC/C,OAAO;4CACT,CAAC;4CAED,IACE,CAAA,MAAA,CAAC,CAAC,aAAa,0CAAE,SAAS,CAAC,QAAQ,CACjC,8BAA8B,CAC/B,MAAK,IAAI,EACV,CAAC;gDACD,OAAO;4CACT,CAAC;4CAED,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gDAC1B,QAAQ,CAAC,cAAc,CAAC,CAAC;gDACzB,OAAO;4CACT,CAAC;4CAED,MAAM,IAAI,GAAG,wBAAU,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;4CAE/C,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gDACxC,QAAQ,CAAC,cAAc,CAAC,CAAC;gDACzB,OAAO;4CACT,CAAC;4CAED,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gDACtD,QAAQ,CAAC,cAAc,CAAC,CAAC;4CAC3B,CAAC;iDAAM,CAAC;gDACN,QAAQ,CAAC,SAAS,CAAC,CAAC;gDACpB,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;4CACrD,CAAC;wCACH,CAAC,EACD,WAAW,EAAE,MAAM;wCACnB,+DAA+D;wCAC/D,SAAS,EAAE,MAAM,CAAC,MAAM,IACpB,SAAS,EACT,cAAc,EAClB,EACF,uBAAC,wBAAgB,IAAC,SAAS,EAAC,mCAAmC,GAAG,IAC9D,IACA,EACP,WAAW,KAAK,SAAS,IAAI,CAC5B,iCAAK,SAAS,EAAC,+BAA+B,EAAC,IAAI,EAAC,QAAQ,aAC1D,uBAAC,kCAA0B,IAAC,SAAS,EAAC,4BAA4B,GAAG,EACrE,uBAAC,uBAAU,IACT,OAAO,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,EACxD,SAAS,EAAC,4BAA4B,EACtC,cAAc,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,YAElC,WAAW,GACD,IACT,CACP,KACG,EAEL,OAAO,CAAC,IAAI,IAAI,CACf,uBAAC,kCAAe,IACd,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,CACtB,uBAAC,sBAAc,cAAE,YAAY,GAAkB,CAChD,YAED,uBAAC,4BAAoB,IACnB,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,KAAK,EACZ,YAAY,EAAE,CAAC,CAAC,YAEhB,8CACE,GAAG,EAAE,IAAI,CAAC,WAAW,EACrB,SAAS,EAAE,IAAA,oBAAU,EAAC,cAAc,EAAE,yBAAyB,oBAC1D,OAAO,EACV,EACF,KAAK,gDACA,gBAAgB,GAChB,cAAc,KACjB,KAAK,EACH,OAAO,KAAK,IAAI;gCACd,CAAC,CAAC,MAAA,YAAY,CAAC,OAAO,0CAAE,WAAW;gCACnC,CAAC,CAAC,SAAS,OAEb,gBAAgB,EAAE,cAEtB,+BAAI,GAAG,EAAE,OAAO,EAAE,IAAI,EAAC,SAAS,EAAC,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,YACzD,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAC5B,+BACE,EAAE,EAAE,GAAG,SAAS,WAAW,CAAC,EAAE,EAE9B,IAAI,EAAC,QAAQ,mBAEX,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,MAAK,IAAI;oCAC9C,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,MAAK,IAAI,EAEtD,KAAK,EAAE,IAAI,EACX,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;oCACb,CAAC,CAAC,eAAe,EAAE,CAAC;oCACpB,CAAC,CAAC,cAAc,EAAE,CAAC;oCACnB,aAAa,CAAC,IAAI,CAAC,CAAC;oCACpB,gBAAgB,CAAC,KAAK,CAAC,CAAC;gCAC1B,CAAC,EACD,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE;oCACjB,CAAC,CAAC,eAAe,EAAE,CAAC;oCACpB,CAAC,CAAC,cAAc,EAAE,CAAC;gCACrB,CAAC,EACD,QAAQ,EAAE,CAAC,CAAC,EACZ,SAAS,EAAE,IAAA,oBAAU,EACnB,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EACnC,8BAA8B,CAC/B,EACD,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;oCACf,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;wCACtB,CAAC,CAAC,eAAe,EAAE,CAAC;wCACpB,aAAa,CAAC,IAAI,CAAC,CAAC;oCACtB,CAAC;gCACH,CAAC,YAEA,IAAI,IA7BA,CAAC,CA8BH,CACN,CAAC,GACC,IACD,GACe,GACP,CACnB,IACA,CACJ,CAAC;AACJ,CAAC,CAAC;AA1aW,QAAA,UAAU,cA0arB","sourcesContent":["/**\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\nimport {\n autoUpdate,\n flip,\n FloatingFocusManager,\n FloatingPortal,\n offset,\n shift,\n useDismiss,\n useFloating,\n useInteractions,\n useMergeRefs,\n useTransitionStyles,\n} from '@floating-ui/react';\nimport { tokens } from '@neo4j-ndl/base';\nimport classNames from 'classnames';\nimport type React from 'react';\nimport {\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { type PolymorphicCommonProps } from '../_common/types';\nimport { ConditionalWrap } from '../conditional-wrap';\nimport { useIsInsideDialog } from '../dialog/dialog-context';\nimport { ClockIconOutline, ExclamationCircleIconSolid } from '../icons';\nimport { useNeedleTheme } from '../theme';\nimport { Typography } from '../typography';\nimport { generateTimeOptions } from './generate-time-options';\nimport { NeedleTime } from './needle-time';\nimport {\n useKeyboardNavigation,\n useTimePickerPopover,\n} from './time-picker-hooks';\n\nexport type TimeFormat = 'hh:mm' | 'hh:mm aa' | 'hh:mm:ss' | 'hh:mm:ss aa';\n\n/** Fixed input width per format (only used when the picker is not fluid). */\nconst INPUT_WIDTH_BY_FORMAT: Record<TimeFormat, string> = {\n 'hh:mm': '6rem',\n 'hh:mm aa': '9rem',\n 'hh:mm:ss': '7.5rem',\n 'hh:mm:ss aa': '11rem',\n};\n\nexport type TimePickerProps = {\n /** The value of the time picker */\n value?: NeedleTime;\n /** The format of the time picker */\n format?: TimeFormat;\n /** Whether the time picker is fluid */\n isFluid?: boolean;\n /** Whether the time picker is read only */\n isReadOnly?: boolean;\n /** Whether the time picker is required */\n isRequired?: boolean;\n /** Whether the time picker is disabled */\n isDisabled?: boolean;\n /** The time interval of the time picker, in minutes */\n timeInterval?: number;\n /** The label of the time picker */\n label?: string;\n /** The size of the time picker */\n size?: 'small' | 'medium' | 'large';\n /** Manually set the error text */\n errorText?: string;\n /** Callback function triggered when the time picker value changes */\n onChange?: (time: NeedleTime) => void;\n /** Callback function triggered when the time picker encounters an error */\n onError?: (error: string, time: NeedleTime) => void;\n /**\n * Strategy for the dropdown floating element.\n * By default it is absolute, but if the component is inside of a needle Dialog, it is set to fixed.\n * If this prop is set, no auto-detection of Dialog is done.\n */\n floatingStrategy?: 'absolute' | 'fixed';\n /** Whether the dropdown element is rendered in a portal. */\n isPortaled?: boolean;\n};\n\nexport const TimePicker = <T extends React.ElementType = 'div'>({\n format = 'hh:mm',\n isDisabled,\n isFluid,\n isReadOnly,\n isRequired,\n value,\n timeInterval = 15,\n label,\n onChange,\n className,\n onError,\n style,\n size = 'medium',\n errorText,\n htmlAttributes,\n floatingStrategy,\n isPortaled: isPortaledProp,\n ref,\n ...restProps\n}: PolymorphicCommonProps<T, TimePickerProps>) => {\n const [editedInput, setEditedInput] = useState<NeedleTime | undefined>(value);\n\n const is24Hour = !format.includes('aa');\n const hasSeconds = format.includes('ss');\n const [inputValue, setInputValue] = useState<string>(\n value?.toString(is24Hour, hasSeconds) ?? '',\n );\n const listRef = useRef<HTMLUListElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n useImperativeHandle(ref, () => inputRef.current as HTMLInputElement, []);\n const [lastAction, setLastAction] = useState<'type' | 'arrow'>('type');\n const [error, setError] = useState<string | undefined>(undefined);\n const errorTextId = useId();\n const listboxId = useId();\n\n const timeOptions = useMemo(\n () => generateTimeOptions(is24Hour, timeInterval, hasSeconds),\n [is24Hour, timeInterval, hasSeconds],\n );\n\n const { themeClassName } = useNeedleTheme();\n const { isPopoverOpen, setIsPopoverOpen } = useTimePickerPopover(false);\n const { focusedIndex, setFocusedIndex, handleArrowNavigation } =\n useKeyboardNavigation(listRef, timeOptions.length);\n\n const errorToShow =\n errorText !== undefined && errorText !== '' ? errorText : error;\n\n const classes = {\n 'ndl-disabled': isDisabled,\n 'ndl-error': errorToShow !== undefined,\n 'ndl-fluid': isFluid,\n 'ndl-large': size === 'large',\n 'ndl-medium': size === 'medium',\n 'ndl-read-only': isReadOnly,\n 'ndl-small': size === 'small',\n };\n\n const inputWidth = isFluid === true ? '100%' : INPUT_WIDTH_BY_FORMAT[format];\n\n const isValidTime = useCallback(\n (hours: number, minutes: number, seconds: number) => {\n if (hours > 23 || hours < 0) {\n return false;\n }\n\n if (minutes > 59 || minutes < 0) {\n return false;\n }\n\n if (seconds > 59 || seconds < 0) {\n return false;\n }\n\n return true;\n },\n [],\n );\n\n useEffect(() => {\n if (error !== undefined) {\n onError?.(error, NeedleTime.fromString(inputValue));\n }\n }, [error, inputValue, onError]);\n\n useEffect(() => {\n setEditedInput(value);\n setInputValue(value?.toString(is24Hour, hasSeconds) ?? '');\n }, [is24Hour, hasSeconds, value]);\n\n useEffect(() => {\n if (isPopoverOpen) {\n setTimeout(() => {\n listRef.current?.children[focusedIndex]?.scrollIntoView({\n block: 'center',\n inline: 'nearest',\n });\n }, 0);\n } else {\n setTimeout(() => {\n inputRef.current?.blur();\n const selectedIndex =\n timeOptions.indexOf(value?.toString(is24Hour, hasSeconds) ?? '') ?? 0;\n setFocusedIndex(selectedIndex);\n }, 0);\n }\n }, [\n focusedIndex,\n is24Hour,\n hasSeconds,\n isPopoverOpen,\n value,\n setFocusedIndex,\n timeOptions,\n ]);\n\n const handleOnClick = (timeText: string) => {\n if (onChange) {\n onChange(NeedleTime.fromString(timeText));\n }\n setError(undefined);\n setInputValue(timeText);\n setEditedInput(NeedleTime.fromString(timeText));\n setIsPopoverOpen(false);\n };\n const newHandleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n scrollToTime(e.target.value);\n setInputValue(e.target.value);\n setLastAction('type');\n\n const time = NeedleTime.fromString(e.target.value);\n if (!isValidTime(time.hour, time.minute, time.second)) {\n setError('Invalid time');\n } else {\n setError(undefined);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (isReadOnly === true || isDisabled === true) {\n e.preventDefault();\n return;\n }\n\n if (e.key === 'Escape') {\n setIsPopoverOpen(false);\n }\n\n setIsPopoverOpen(true);\n\n if (e.key === 'Enter') {\n const minTypedLength = (is24Hour ? 5 : 6) + (hasSeconds ? 3 : 0);\n if (lastAction === 'type' && inputValue.length >= minTypedLength) {\n const time = NeedleTime.fromString(inputValue);\n handleOnClick(time.toString(is24Hour, hasSeconds));\n } else if (lastAction === 'type' && !inputValue.includes(':')) {\n const time = NeedleTime.fromString(inputValue);\n if (isValidTime(time.hour, time.minute, time.second)) {\n handleOnClick(time.toString(is24Hour, hasSeconds));\n }\n setIsPopoverOpen(false);\n } else {\n handleOnClick(timeOptions[focusedIndex]);\n }\n } else if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n e.preventDefault();\n setLastAction('arrow');\n handleArrowNavigation(e.key);\n }\n };\n\n const scrollToTime = (startOfTime: string) => {\n const parsedTime = startOfTime.toLowerCase().replace(/[^0-9amp]/g, '');\n let index = -1;\n\n // Handle AM/PM input\n const isPM = parsedTime.includes('p');\n const isAM = parsedTime.includes('a');\n const timeDigits = parsedTime.replace(/[amp]/g, '');\n\n if (timeDigits.length === 1) {\n // Single digit - assume it's an hour\n const hour = `0${timeDigits}`;\n const minutes = hasSeconds ? '00:00' : '00';\n const searchTime = is24Hour\n ? `${hour}:${minutes}`\n : `${hour}:${minutes} ${isPM ? 'PM' : 'AM'}`;\n index = timeOptions.indexOf(searchTime);\n } else {\n // Find closest matching time\n const closestTime = timeOptions.find((time) => {\n const timeWithoutSpecialChars = time\n .toLowerCase()\n .replace(/[^0-9amp]/g, '');\n if (isPM || isAM) {\n // If AM/PM specified, match that specifically\n return timeWithoutSpecialChars.startsWith(parsedTime);\n } else {\n // Otherwise just match the numbers\n return timeWithoutSpecialChars\n .replace(/[amp]/g, '')\n .startsWith(timeDigits);\n }\n });\n index = closestTime !== undefined ? timeOptions.indexOf(closestTime) : -1;\n }\n\n if (index !== -1) {\n setFocusedIndex(index);\n }\n\n return index;\n };\n\n /** Custom floating ui solution */\n const isInsideDialog = useIsInsideDialog();\n const isPortaled = isPortaledProp ?? !isInsideDialog;\n const containerRef = useRef<HTMLDivElement>(null);\n const { refs, floatingStyles, context } = useFloating({\n elements: {\n reference: containerRef.current,\n },\n middleware: [\n offset(10),\n flip({\n fallbackPlacements: ['top'],\n fallbackStrategy: 'bestFit',\n }),\n shift({ padding: 5 }),\n ],\n onOpenChange: (open) => {\n setIsPopoverOpen(open);\n },\n open: isDisabled !== true && isReadOnly !== true && isPopoverOpen,\n placement: 'bottom',\n strategy: floatingStrategy ?? (isInsideDialog ? 'fixed' : 'absolute'),\n whileElementsMounted: autoUpdate,\n });\n const dismiss = useDismiss(context);\n const { getReferenceProps, getFloatingProps } = useInteractions([dismiss]);\n const { styles: transitionStyles } = useTransitionStyles(context, {\n duration: Number.parseInt(tokens.motion.duration.quick) ?? 0,\n });\n\n const mergedRef = useMergeRefs([refs.setReference, containerRef]);\n\n return (\n <>\n <div\n className={classNames('ndl-time-picker', className, {\n ...classes,\n })}\n ref={mergedRef}\n {...getReferenceProps()}\n style={{\n width: isFluid === true ? '100%' : 'fit-content',\n }}\n >\n <label className=\"ndl-time-picker-label\">\n {label !== undefined && (\n <Typography\n variant={size === 'large' ? 'body-large' : 'body-medium'}\n >\n {label}\n </Typography>\n )}\n <div\n className=\"ndl-time-picker-input-wrapper\"\n style={{\n width: inputWidth,\n ...style,\n }}\n >\n <input\n role=\"combobox\"\n aria-expanded={isPopoverOpen}\n aria-controls={listboxId}\n aria-activedescendant={\n isPopoverOpen && focusedIndex >= 0\n ? `${listboxId}-option-${focusedIndex}`\n : undefined\n }\n aria-label={label} // TODO: handle label natively\n aria-invalid={Boolean(errorToShow)}\n aria-describedby={errorToShow ? errorTextId : undefined}\n className=\"ndl-time-picker-input\"\n type=\"text\"\n ref={inputRef}\n value={inputValue}\n disabled={isDisabled}\n readOnly={isReadOnly}\n required={isRequired}\n onChange={newHandleInputChange}\n onKeyDown={handleKeyDown}\n onClick={() => {\n if (isReadOnly === true || isDisabled === true) {\n return;\n }\n setIsPopoverOpen(true);\n }}\n onBlur={(e) => {\n if (isReadOnly === true || isDisabled === true) {\n return;\n }\n\n if (\n e.relatedTarget?.classList.contains(\n 'ndl-time-picker-popover-item',\n ) === true\n ) {\n return;\n }\n\n if (inputValue.length < 4) {\n setError('Invalid time');\n return;\n }\n\n const time = NeedleTime.fromString(inputValue);\n\n if (time === undefined || time === null) {\n setError('Invalid time');\n return;\n }\n\n if (!isValidTime(time.hour, time.minute, time.second)) {\n setError('Invalid time');\n } else {\n setError(undefined);\n setInputValue(time.toString(is24Hour, hasSeconds));\n }\n }}\n placeholder={format}\n // The typed value can never be longer than the format pattern.\n maxLength={format.length}\n {...restProps}\n {...htmlAttributes}\n />\n <ClockIconOutline className=\"ndl-icon-svg ndl-time-picker-icon\" />\n </div>\n </label>\n {errorToShow !== undefined && (\n <div className=\"ndl-time-picker-error-wrapper\" role=\"status\">\n <ExclamationCircleIconSolid className=\"ndl-time-picker-error-icon\" />\n <Typography\n variant={size === 'large' ? 'body-medium' : 'body-small'}\n className=\"ndl-time-picker-error-text\"\n htmlAttributes={{ id: errorTextId }}\n >\n {errorToShow}\n </Typography>\n </div>\n )}\n </div>\n\n {context.open && (\n <ConditionalWrap\n shouldWrap={isPortaled}\n wrap={(wrapChildren) => (\n <FloatingPortal>{wrapChildren}</FloatingPortal>\n )}\n >\n <FloatingFocusManager\n context={context}\n modal={false}\n initialFocus={-1}\n >\n <div\n ref={refs.setFloating}\n className={classNames(themeClassName, 'ndl-time-picker-popover', {\n ...classes,\n })}\n style={{\n ...transitionStyles,\n ...floatingStyles,\n width:\n isFluid === true\n ? containerRef.current?.clientWidth\n : undefined,\n }}\n {...getFloatingProps()}\n >\n <ul ref={listRef} role=\"listbox\" id={listboxId} tabIndex={-1}>\n {timeOptions.map((time, i) => (\n <li\n id={`${listboxId}-option-${i}`}\n key={i}\n role=\"option\"\n aria-selected={\n value?.toString(is24Hour, hasSeconds) === time ||\n editedInput?.toString(is24Hour, hasSeconds) === time\n }\n value={time}\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n handleOnClick(time);\n setIsPopoverOpen(false);\n }}\n onMouseDown={(e) => {\n e.stopPropagation();\n e.preventDefault();\n }}\n tabIndex={-1}\n className={classNames(\n focusedIndex === i ? 'focused' : '',\n 'ndl-time-picker-popover-item',\n )}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.stopPropagation();\n handleOnClick(time);\n }\n }}\n >\n {time}\n </li>\n ))}\n </ul>\n </div>\n </FloatingFocusManager>\n </ConditionalWrap>\n )}\n </>\n );\n};\n"]}
|
|
@@ -21,19 +21,22 @@ exports.generateTimeOptions = void 0;
|
|
|
21
21
|
* You should have received a copy of the GNU General Public License
|
|
22
22
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
23
23
|
*/
|
|
24
|
-
const generateTimeOptions = (is24Hour, interval) => {
|
|
24
|
+
const generateTimeOptions = (is24Hour, interval, showSeconds) => {
|
|
25
25
|
const times = [];
|
|
26
26
|
const safeInterval = interval || 30;
|
|
27
|
+
// The dropdown lists times at the minute interval; when seconds are shown the
|
|
28
|
+
// options are anchored at `:00` and the user can type a more precise value.
|
|
29
|
+
const secondsSuffix = showSeconds === true ? ':00' : '';
|
|
27
30
|
for (let i = 0; i < 1440; i += safeInterval) {
|
|
28
31
|
const hours = Math.floor(i / 60);
|
|
29
32
|
const minutes = i % 60;
|
|
30
33
|
if (is24Hour) {
|
|
31
|
-
times.push(`${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}`);
|
|
34
|
+
times.push(`${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}${secondsSuffix}`);
|
|
32
35
|
}
|
|
33
36
|
else {
|
|
34
37
|
const period = hours < 12 ? 'AM' : 'PM';
|
|
35
38
|
const adjustedHours = hours % 12 || 12;
|
|
36
|
-
times.push(`${String(adjustedHours).padStart(2, '0')}:${String(minutes).padStart(2, '0')} ${period}`);
|
|
39
|
+
times.push(`${String(adjustedHours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}${secondsSuffix} ${period}`);
|
|
37
40
|
}
|
|
38
41
|
}
|
|
39
42
|
return times;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-time-options.js","sourceRoot":"","sources":["../../../src/time-picker/generate-time-options.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACI,MAAM,mBAAmB,GAAG,
|
|
1
|
+
{"version":3,"file":"generate-time-options.js","sourceRoot":"","sources":["../../../src/time-picker/generate-time-options.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACI,MAAM,mBAAmB,GAAG,CACjC,QAAiB,EACjB,QAAgB,EAChB,WAAqB,EACrB,EAAE;IACF,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,YAAY,GAAG,QAAQ,IAAI,EAAE,CAAC;IACpC,8EAA8E;IAC9E,4EAA4E;IAC5E,MAAM,aAAa,GAAG,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IACxD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,IAAI,YAAY,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,QAAQ,EAAE,CAAC;YACb,KAAK,CAAC,IAAI,CACR,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,aAAa,EAAE,CACxF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAG,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YACxC,MAAM,aAAa,GAAG,KAAK,GAAG,EAAE,IAAI,EAAE,CAAC;YACvC,KAAK,CAAC,IAAI,CACR,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,aAAa,IAAI,MAAM,EAAE,CAC1G,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AA1BW,QAAA,mBAAmB,uBA0B9B","sourcesContent":["/**\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\nexport const generateTimeOptions = (\n is24Hour: boolean,\n interval: number,\n showSeconds?: boolean,\n) => {\n const times: string[] = [];\n const safeInterval = interval || 30;\n // The dropdown lists times at the minute interval; when seconds are shown the\n // options are anchored at `:00` and the user can type a more precise value.\n const secondsSuffix = showSeconds === true ? ':00' : '';\n for (let i = 0; i < 1440; i += safeInterval) {\n const hours = Math.floor(i / 60);\n const minutes = i % 60;\n if (is24Hour) {\n times.push(\n `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}${secondsSuffix}`,\n );\n } else {\n const period = hours < 12 ? 'AM' : 'PM';\n const adjustedHours = hours % 12 || 12;\n times.push(\n `${String(adjustedHours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}${secondsSuffix} ${period}`,\n );\n }\n }\n return times;\n};\n"]}
|
|
@@ -22,18 +22,22 @@ exports.NeedleTime = void 0;
|
|
|
22
22
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
23
23
|
*/
|
|
24
24
|
class NeedleTime {
|
|
25
|
-
constructor(hour, minute) {
|
|
25
|
+
constructor(hour, minute, second) {
|
|
26
26
|
this.hour = hour || 0;
|
|
27
27
|
this.minute = minute || 0;
|
|
28
|
+
this.second = second || 0;
|
|
28
29
|
}
|
|
29
|
-
toString(is24Hour) {
|
|
30
|
+
toString(is24Hour, showSeconds) {
|
|
31
|
+
const seconds = showSeconds
|
|
32
|
+
? `:${String(this.second).padStart(2, '0')}`
|
|
33
|
+
: '';
|
|
30
34
|
if (is24Hour) {
|
|
31
|
-
return `${String(this.hour).padStart(2, '0')}:${String(this.minute).padStart(2, '0')}`;
|
|
35
|
+
return `${String(this.hour).padStart(2, '0')}:${String(this.minute).padStart(2, '0')}${seconds}`;
|
|
32
36
|
}
|
|
33
37
|
else {
|
|
34
38
|
const period = this.hour < 12 ? 'AM' : 'PM';
|
|
35
39
|
const adjustedHours = this.hour % 12 || 12;
|
|
36
|
-
return `${String(adjustedHours).padStart(2, '0')}:${String(this.minute).padStart(2, '0')} ${period}`;
|
|
40
|
+
return `${String(adjustedHours).padStart(2, '0')}:${String(this.minute).padStart(2, '0')}${seconds} ${period}`;
|
|
37
41
|
}
|
|
38
42
|
}
|
|
39
43
|
static fromString(timeString) {
|
|
@@ -43,21 +47,28 @@ class NeedleTime {
|
|
|
43
47
|
const isPM = cleanTime.includes('pm');
|
|
44
48
|
const hasAMPM = cleanTime.includes('am') || isPM;
|
|
45
49
|
const timeWithoutAmPm = cleanTime.replace(/[ap]m/g, '');
|
|
46
|
-
// Extract hours and
|
|
50
|
+
// Extract hours, minutes and (optionally) seconds
|
|
47
51
|
let hours;
|
|
48
52
|
let minutes;
|
|
53
|
+
let seconds;
|
|
49
54
|
if (timeWithoutAmPm.includes(':')) {
|
|
50
|
-
// Format: hh:mm
|
|
51
|
-
const [hoursStr, minutesStr] = timeWithoutAmPm.split(':');
|
|
55
|
+
// Format: hh:mm or hh:mm:ss
|
|
56
|
+
const [hoursStr, minutesStr, secondsStr] = timeWithoutAmPm.split(':');
|
|
52
57
|
hours = parseInt(hoursStr, 10);
|
|
53
58
|
minutes = parseInt(minutesStr, 10);
|
|
59
|
+
seconds =
|
|
60
|
+
secondsStr !== undefined && secondsStr !== ''
|
|
61
|
+
? parseInt(secondsStr, 10)
|
|
62
|
+
: 0;
|
|
54
63
|
}
|
|
55
64
|
else {
|
|
56
|
-
// Format: hhmm
|
|
65
|
+
// Format: hhmm or hhmmss
|
|
57
66
|
const hoursStr = timeWithoutAmPm.slice(0, 2);
|
|
58
67
|
const minutesStr = timeWithoutAmPm.slice(2, 4);
|
|
68
|
+
const secondsStr = timeWithoutAmPm.slice(4, 6);
|
|
59
69
|
hours = parseInt(hoursStr, 10);
|
|
60
70
|
minutes = parseInt(minutesStr, 10);
|
|
71
|
+
seconds = secondsStr !== '' ? parseInt(secondsStr, 10) : 0;
|
|
61
72
|
}
|
|
62
73
|
// Adjust hours for PM
|
|
63
74
|
if (isPM && hours < 12) {
|
|
@@ -67,7 +78,7 @@ class NeedleTime {
|
|
|
67
78
|
if (hasAMPM && !isPM && hours === 12) {
|
|
68
79
|
hours = 0;
|
|
69
80
|
}
|
|
70
|
-
return new NeedleTime(hours, minutes);
|
|
81
|
+
return new NeedleTime(hours, minutes, seconds);
|
|
71
82
|
}
|
|
72
83
|
hourString(is24Hour) {
|
|
73
84
|
if (is24Hour) {
|
|
@@ -80,6 +91,9 @@ class NeedleTime {
|
|
|
80
91
|
minuteString() {
|
|
81
92
|
return String(this.minute).padStart(2, '0');
|
|
82
93
|
}
|
|
94
|
+
secondString() {
|
|
95
|
+
return String(this.second).padStart(2, '0');
|
|
96
|
+
}
|
|
83
97
|
periodString() {
|
|
84
98
|
return this.hour < 12 ? 'AM' : 'PM';
|
|
85
99
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"needle-time.js","sourceRoot":"","sources":["../../../src/time-picker/needle-time.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAa,UAAU;
|
|
1
|
+
{"version":3,"file":"needle-time.js","sourceRoot":"","sources":["../../../src/time-picker/needle-time.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\nexport class NeedleTime {\n hour: number;\n minute: number;\n second: number;\n\n constructor(hour?: number, minute?: number, second?: number) {\n this.hour = hour || 0;\n this.minute = minute || 0;\n this.second = second || 0;\n }\n\n toString(is24Hour?: boolean, showSeconds?: boolean): string {\n const seconds = showSeconds\n ? `:${String(this.second).padStart(2, '0')}`\n : '';\n if (is24Hour) {\n return `${String(this.hour).padStart(2, '0')}:${String(this.minute).padStart(2, '0')}${seconds}`;\n } else {\n const period = this.hour < 12 ? 'AM' : 'PM';\n const adjustedHours = this.hour % 12 || 12;\n return `${String(adjustedHours).padStart(2, '0')}:${String(this.minute).padStart(2, '0')}${seconds} ${period}`;\n }\n }\n\n static fromString(timeString: string): NeedleTime {\n // Remove any whitespace and convert to lowercase\n const cleanTime = timeString.toLowerCase().replace(/\\s/g, '');\n\n // Extract AM/PM if present\n const isPM = cleanTime.includes('pm');\n const hasAMPM = cleanTime.includes('am') || isPM;\n const timeWithoutAmPm = cleanTime.replace(/[ap]m/g, '');\n\n // Extract hours, minutes and (optionally) seconds\n let hours: number;\n let minutes: number;\n let seconds: number;\n\n if (timeWithoutAmPm.includes(':')) {\n // Format: hh:mm or hh:mm:ss\n const [hoursStr, minutesStr, secondsStr] = timeWithoutAmPm.split(':');\n hours = parseInt(hoursStr, 10);\n minutes = parseInt(minutesStr, 10);\n seconds =\n secondsStr !== undefined && secondsStr !== ''\n ? parseInt(secondsStr, 10)\n : 0;\n } else {\n // Format: hhmm or hhmmss\n const hoursStr = timeWithoutAmPm.slice(0, 2);\n const minutesStr = timeWithoutAmPm.slice(2, 4);\n const secondsStr = timeWithoutAmPm.slice(4, 6);\n hours = parseInt(hoursStr, 10);\n minutes = parseInt(minutesStr, 10);\n seconds = secondsStr !== '' ? parseInt(secondsStr, 10) : 0;\n }\n\n // Adjust hours for PM\n if (isPM && hours < 12) {\n hours += 12;\n }\n // Adjust hours for AM 12 only if we're dealing with AM/PM format\n if (hasAMPM && !isPM && hours === 12) {\n hours = 0;\n }\n\n return new NeedleTime(hours, minutes, seconds);\n }\n\n hourString(is24Hour?: boolean): string {\n if (is24Hour) {\n return String(this.hour).padStart(2, '0');\n } else {\n return String(this.hour % 12 || 12).padStart(2, '0');\n }\n }\n\n minuteString(): string {\n return String(this.minute).padStart(2, '0');\n }\n\n secondString(): string {\n return String(this.second).padStart(2, '0');\n }\n\n periodString(): string {\n return this.hour < 12 ? 'AM' : 'PM';\n }\n}\n"]}
|
|
@@ -23,18 +23,22 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
23
23
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
24
24
|
};
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.TimePickerInDialogSrc = exports.TimePickerErrorSrc = exports.TimePickerDefaultSrc = exports.TimePickerInDialog = exports.TimePickerError = exports.TimePickerDefault = void 0;
|
|
26
|
+
exports.TimePickerWithSecondsSrc = exports.TimePickerInDialogSrc = exports.TimePickerErrorSrc = exports.TimePickerDefaultSrc = exports.TimePickerWithSeconds = exports.TimePickerInDialog = exports.TimePickerError = exports.TimePickerDefault = void 0;
|
|
27
27
|
var time_picker_default_story_1 = require("./time-picker-default.story");
|
|
28
28
|
Object.defineProperty(exports, "TimePickerDefault", { enumerable: true, get: function () { return __importDefault(time_picker_default_story_1).default; } });
|
|
29
29
|
var time_picker_error_story_1 = require("./time-picker-error.story");
|
|
30
30
|
Object.defineProperty(exports, "TimePickerError", { enumerable: true, get: function () { return __importDefault(time_picker_error_story_1).default; } });
|
|
31
31
|
var time_picker_in_dialog_story_1 = require("./time-picker-in-dialog.story");
|
|
32
32
|
Object.defineProperty(exports, "TimePickerInDialog", { enumerable: true, get: function () { return __importDefault(time_picker_in_dialog_story_1).default; } });
|
|
33
|
+
var time_picker_with_seconds_story_1 = require("./time-picker-with-seconds.story");
|
|
34
|
+
Object.defineProperty(exports, "TimePickerWithSeconds", { enumerable: true, get: function () { return __importDefault(time_picker_with_seconds_story_1).default; } });
|
|
33
35
|
const export_stories_utils_1 = require("../../_common/export-stories-utils");
|
|
34
36
|
const time_picker_default_story_tsx_raw_1 = __importDefault(require("./time-picker-default.story.tsx?raw"));
|
|
35
37
|
const time_picker_error_story_tsx_raw_1 = __importDefault(require("./time-picker-error.story.tsx?raw"));
|
|
36
38
|
const time_picker_in_dialog_story_tsx_raw_1 = __importDefault(require("./time-picker-in-dialog.story.tsx?raw"));
|
|
39
|
+
const time_picker_with_seconds_story_tsx_raw_1 = __importDefault(require("./time-picker-with-seconds.story.tsx?raw"));
|
|
37
40
|
exports.TimePickerDefaultSrc = (0, export_stories_utils_1.removeLicenseHeader)(time_picker_default_story_tsx_raw_1.default);
|
|
38
41
|
exports.TimePickerErrorSrc = (0, export_stories_utils_1.removeLicenseHeader)(time_picker_error_story_tsx_raw_1.default);
|
|
39
42
|
exports.TimePickerInDialogSrc = (0, export_stories_utils_1.removeLicenseHeader)(time_picker_in_dialog_story_tsx_raw_1.default);
|
|
43
|
+
exports.TimePickerWithSecondsSrc = (0, export_stories_utils_1.removeLicenseHeader)(time_picker_with_seconds_story_tsx_raw_1.default);
|
|
40
44
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/time-picker/stories/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG;;;;;;AAEH,yEAA2E;AAAlE,+IAAA,OAAO,OAAqB;AACrC,qEAAuE;AAA9D,2IAAA,OAAO,OAAmB;AACnC,6EAA8E;AAArE,kJAAA,OAAO,OAAsB;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/time-picker/stories/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG;;;;;;AAEH,yEAA2E;AAAlE,+IAAA,OAAO,OAAqB;AACrC,qEAAuE;AAA9D,2IAAA,OAAO,OAAmB;AACnC,6EAA8E;AAArE,kJAAA,OAAO,OAAsB;AACtC,mFAAoF;AAA3E,wJAAA,OAAO,OAAyB;AAEzC,6EAAyE;AACzE,4GAA0E;AAC1E,wGAAsE;AACtE,gHAA6E;AAC7E,sHAAmF;AAEtE,QAAA,oBAAoB,GAAG,IAAA,0CAAmB,EACrD,2CAAuB,CACxB,CAAC;AACW,QAAA,kBAAkB,GAAG,IAAA,0CAAmB,EAAC,yCAAqB,CAAC,CAAC;AAChE,QAAA,qBAAqB,GAAG,IAAA,0CAAmB,EACtD,6CAAwB,CACzB,CAAC;AACW,QAAA,wBAAwB,GAAG,IAAA,0CAAmB,EACzD,gDAA2B,CAC5B,CAAC","sourcesContent":["/**\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nexport { default as TimePickerDefault } from './time-picker-default.story';\nexport { default as TimePickerError } from './time-picker-error.story';\nexport { default as TimePickerInDialog } from './time-picker-in-dialog.story';\nexport { default as TimePickerWithSeconds } from './time-picker-with-seconds.story';\n\nimport { removeLicenseHeader } from '../../_common/export-stories-utils';\nimport TimePickerDefaultSrcRaw from './time-picker-default.story.tsx?raw';\nimport TimePickerErrorSrcRaw from './time-picker-error.story.tsx?raw';\nimport TimePickerInDialogSrcRaw from './time-picker-in-dialog.story.tsx?raw';\nimport TimePickerWithSecondsSrcRaw from './time-picker-with-seconds.story.tsx?raw';\n\nexport const TimePickerDefaultSrc = removeLicenseHeader(\n TimePickerDefaultSrcRaw,\n);\nexport const TimePickerErrorSrc = removeLicenseHeader(TimePickerErrorSrcRaw);\nexport const TimePickerInDialogSrc = removeLicenseHeader(\n TimePickerInDialogSrcRaw,\n);\nexport const TimePickerWithSecondsSrc = removeLicenseHeader(\n TimePickerWithSecondsSrcRaw,\n);\n"]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
4
|
+
/**
|
|
5
|
+
*
|
|
6
|
+
* Copyright (c) "Neo4j"
|
|
7
|
+
* Neo4j Sweden AB [http://neo4j.com]
|
|
8
|
+
*
|
|
9
|
+
* This file is part of Neo4j.
|
|
10
|
+
*
|
|
11
|
+
* Neo4j is free software: you can redistribute it and/or modify
|
|
12
|
+
* it under the terms of the GNU General Public License as published by
|
|
13
|
+
* the Free Software Foundation, either version 3 of the License, or
|
|
14
|
+
* (at your option) any later version.
|
|
15
|
+
*
|
|
16
|
+
* This program is distributed in the hope that it will be useful,
|
|
17
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
18
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
19
|
+
* GNU General Public License for more details.
|
|
20
|
+
*
|
|
21
|
+
* You should have received a copy of the GNU General Public License
|
|
22
|
+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
23
|
+
*/
|
|
24
|
+
require("@neo4j-ndl/base/lib/neo4j-ds-styles.css");
|
|
25
|
+
const react_1 = require("@neo4j-ndl/react");
|
|
26
|
+
const react_2 = require("react");
|
|
27
|
+
const Component = () => {
|
|
28
|
+
const [selectedTime, setSelectedTime] = (0, react_2.useState)();
|
|
29
|
+
return ((0, jsx_runtime_1.jsx)("div", { style: { height: '600px', padding: '20px' }, children: (0, jsx_runtime_1.jsx)(react_1.TimePicker, { label: "Select Time (with seconds)", format: "hh:mm:ss", value: selectedTime, onChange: (time) => setSelectedTime(time), htmlAttributes: { id: 'time-picker-input' } }) }));
|
|
30
|
+
};
|
|
31
|
+
exports.default = Component;
|
|
32
|
+
//# sourceMappingURL=time-picker-with-seconds.story.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time-picker-with-seconds.story.js","sourceRoot":"","sources":["../../../../src/time-picker/stories/time-picker-with-seconds.story.tsx"],"names":[],"mappings":";;;AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,mDAAiD;AAEjD,4CAA+D;AAC/D,iCAAiC;AAEjC,MAAM,SAAS,GAAG,GAAG,EAAE;IACrB,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,IAAA,gBAAQ,GAAc,CAAC;IAE/D,OAAO,CACL,gCAAK,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,YAC9C,uBAAC,kBAAU,IACT,KAAK,EAAC,4BAA4B,EAClC,MAAM,EAAC,UAAU,EACjB,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,EACzC,cAAc,EAAE,EAAE,EAAE,EAAE,mBAAmB,EAAE,GAC3C,GACE,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,kBAAe,SAAS,CAAC","sourcesContent":["/**\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport '@neo4j-ndl/base/lib/neo4j-ds-styles.css';\n\nimport { type NeedleTime, TimePicker } from '@neo4j-ndl/react';\nimport { useState } from 'react';\n\nconst Component = () => {\n const [selectedTime, setSelectedTime] = useState<NeedleTime>();\n\n return (\n <div style={{ height: '600px', padding: '20px' }}>\n <TimePicker\n label=\"Select Time (with seconds)\"\n format=\"hh:mm:ss\"\n value={selectedTime}\n onChange={(time) => setSelectedTime(time)}\n htmlAttributes={{ id: 'time-picker-input' }}\n />\n </div>\n );\n};\n\nexport default Component;\n"]}
|