@fluentui/react-timepicker-compat 0.2.16 → 0.2.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,21 +1,34 @@
1
1
  # Change Log - @fluentui/react-timepicker-compat
2
2
 
3
- This log was last generated on Thu, 23 May 2024 07:58:03 GMT and should not be manually modified.
3
+ This log was last generated on Thu, 06 Jun 2024 15:26:41 GMT and should not be manually modified.
4
4
 
5
5
  <!-- Start content -->
6
6
 
7
+ ## [0.2.17](https://github.com/microsoft/fluentui/tree/@fluentui/react-timepicker-compat_v0.2.17)
8
+
9
+ Thu, 06 Jun 2024 15:26:41 GMT
10
+ [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-timepicker-compat_v0.2.16..@fluentui/react-timepicker-compat_v0.2.17)
11
+
12
+ ### Patches
13
+
14
+ - fix: clear icon not working with freeform ([PR #31324](https://github.com/microsoft/fluentui/pull/31324) by yuanboxue@microsoft.com)
15
+ - Bump @fluentui/react-combobox to v9.11.7 ([PR #31586](https://github.com/microsoft/fluentui/pull/31586) by beachball)
16
+ - Bump @fluentui/react-field to v9.1.67 ([PR #31586](https://github.com/microsoft/fluentui/pull/31586) by beachball)
17
+ - Bump @fluentui/react-jsx-runtime to v9.0.39 ([PR #31586](https://github.com/microsoft/fluentui/pull/31586) by beachball)
18
+ - Bump @fluentui/react-utilities to v9.18.10 ([PR #31586](https://github.com/microsoft/fluentui/pull/31586) by beachball)
19
+
7
20
  ## [0.2.16](https://github.com/microsoft/fluentui/tree/@fluentui/react-timepicker-compat_v0.2.16)
8
21
 
9
- Thu, 23 May 2024 07:58:03 GMT
22
+ Thu, 23 May 2024 08:02:52 GMT
10
23
  [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-timepicker-compat_v0.2.15..@fluentui/react-timepicker-compat_v0.2.16)
11
24
 
12
25
  ### Patches
13
26
 
14
- - Bump @fluentui/react-combobox to v9.11.6 ([commit](https://github.com/microsoft/fluentui/commit/10e6758b203de79c53ce31ba264e137f83f50ff4) by beachball)
27
+ - Bump @fluentui/react-combobox to v9.11.6 ([commit](https://github.com/microsoft/fluentui/commit/03599d609e8310b08c57d1f871cffbf717d79207) by beachball)
15
28
 
16
29
  ## [0.2.15](https://github.com/microsoft/fluentui/tree/@fluentui/react-timepicker-compat_v0.2.15)
17
30
 
18
- Mon, 20 May 2024 12:45:07 GMT
31
+ Mon, 20 May 2024 12:45:07 GMT
19
32
  [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-timepicker-compat_v0.2.14..@fluentui/react-timepicker-compat_v0.2.15)
20
33
 
21
34
  ### Patches
@@ -29,7 +42,7 @@ Mon, 20 May 2024 12:45:07 GMT
29
42
 
30
43
  ## [0.2.14](https://github.com/microsoft/fluentui/tree/@fluentui/react-timepicker-compat_v0.2.14)
31
44
 
32
- Thu, 16 May 2024 09:25:20 GMT
45
+ Thu, 16 May 2024 09:25:20 GMT
33
46
  [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-timepicker-compat_v0.2.13..@fluentui/react-timepicker-compat_v0.2.14)
34
47
 
35
48
  ### Patches
@@ -39,7 +52,7 @@ Thu, 16 May 2024 09:25:20 GMT
39
52
 
40
53
  ## [0.2.13](https://github.com/microsoft/fluentui/tree/@fluentui/react-timepicker-compat_v0.2.13)
41
54
 
42
- Mon, 13 May 2024 12:34:20 GMT
55
+ Mon, 13 May 2024 12:34:20 GMT
43
56
  [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-timepicker-compat_v0.2.12..@fluentui/react-timepicker-compat_v0.2.13)
44
57
 
45
58
  ### Patches
@@ -48,7 +61,7 @@ Mon, 13 May 2024 12:34:20 GMT
48
61
 
49
62
  ## [0.2.12](https://github.com/microsoft/fluentui/tree/@fluentui/react-timepicker-compat_v0.2.12)
50
63
 
51
- Thu, 09 May 2024 19:35:12 GMT
64
+ Thu, 09 May 2024 19:35:12 GMT
52
65
  [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-timepicker-compat_v0.2.11..@fluentui/react-timepicker-compat_v0.2.12)
53
66
 
54
67
  ### Patches
@@ -57,7 +70,7 @@ Thu, 09 May 2024 19:35:12 GMT
57
70
 
58
71
  ## [0.2.11](https://github.com/microsoft/fluentui/tree/@fluentui/react-timepicker-compat_v0.2.11)
59
72
 
60
- Mon, 06 May 2024 12:55:02 GMT
73
+ Mon, 06 May 2024 12:55:02 GMT
61
74
  [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-timepicker-compat_v0.2.10..@fluentui/react-timepicker-compat_v0.2.11)
62
75
 
63
76
  ### Patches
@@ -70,7 +83,7 @@ Mon, 06 May 2024 12:55:02 GMT
70
83
 
71
84
  ## [0.2.10](https://github.com/microsoft/fluentui/tree/@fluentui/react-timepicker-compat_v0.2.10)
72
85
 
73
- Thu, 02 May 2024 11:36:44 GMT
86
+ Thu, 02 May 2024 11:36:44 GMT
74
87
  [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-timepicker-compat_v0.2.9..@fluentui/react-timepicker-compat_v0.2.10)
75
88
 
76
89
  ### Patches
@@ -80,7 +93,7 @@ Thu, 02 May 2024 11:36:44 GMT
80
93
 
81
94
  ## [0.2.9](https://github.com/microsoft/fluentui/tree/@fluentui/react-timepicker-compat_v0.2.9)
82
95
 
83
- Tue, 23 Apr 2024 08:17:49 GMT
96
+ Tue, 23 Apr 2024 08:17:49 GMT
84
97
  [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-timepicker-compat_v0.2.8..@fluentui/react-timepicker-compat_v0.2.9)
85
98
 
86
99
  ### Patches
@@ -93,7 +106,7 @@ Tue, 23 Apr 2024 08:17:49 GMT
93
106
 
94
107
  ## [0.2.8](https://github.com/microsoft/fluentui/tree/@fluentui/react-timepicker-compat_v0.2.8)
95
108
 
96
- Wed, 17 Apr 2024 21:54:06 GMT
109
+ Wed, 17 Apr 2024 21:54:06 GMT
97
110
  [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-timepicker-compat_v0.2.7..@fluentui/react-timepicker-compat_v0.2.8)
98
111
 
99
112
  ### Patches
@@ -103,7 +116,7 @@ Wed, 17 Apr 2024 21:54:06 GMT
103
116
 
104
117
  ## [0.2.7](https://github.com/microsoft/fluentui/tree/@fluentui/react-timepicker-compat_v0.2.7)
105
118
 
106
- Thu, 04 Apr 2024 12:08:09 GMT
119
+ Thu, 04 Apr 2024 12:08:09 GMT
107
120
  [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-timepicker-compat_v0.2.6..@fluentui/react-timepicker-compat_v0.2.7)
108
121
 
109
122
  ### Patches
@@ -112,7 +125,7 @@ Thu, 04 Apr 2024 12:08:09 GMT
112
125
 
113
126
  ## [0.2.6](https://github.com/microsoft/fluentui/tree/@fluentui/react-timepicker-compat_v0.2.6)
114
127
 
115
- Tue, 02 Apr 2024 09:48:01 GMT
128
+ Tue, 02 Apr 2024 09:48:01 GMT
116
129
  [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-timepicker-compat_v0.2.5..@fluentui/react-timepicker-compat_v0.2.6)
117
130
 
118
131
  ### Patches
@@ -125,7 +138,7 @@ Tue, 02 Apr 2024 09:48:01 GMT
125
138
 
126
139
  ## [0.2.5](https://github.com/microsoft/fluentui/tree/@fluentui/react-timepicker-compat_v0.2.5)
127
140
 
128
- Mon, 25 Mar 2024 11:12:15 GMT
141
+ Mon, 25 Mar 2024 11:12:15 GMT
129
142
  [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-timepicker-compat_v0.2.4..@fluentui/react-timepicker-compat_v0.2.5)
130
143
 
131
144
  ### Patches
@@ -136,7 +149,7 @@ Mon, 25 Mar 2024 11:12:15 GMT
136
149
 
137
150
  ## [0.2.4](https://github.com/microsoft/fluentui/tree/@fluentui/react-timepicker-compat_v0.2.4)
138
151
 
139
- Mon, 18 Mar 2024 19:50:46 GMT
152
+ Mon, 18 Mar 2024 19:50:46 GMT
140
153
  [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-timepicker-compat_v0.2.3..@fluentui/react-timepicker-compat_v0.2.4)
141
154
 
142
155
  ### Patches
@@ -150,7 +163,7 @@ Mon, 18 Mar 2024 19:50:46 GMT
150
163
 
151
164
  ## [0.2.3](https://github.com/microsoft/fluentui/tree/@fluentui/react-timepicker-compat_v0.2.3)
152
165
 
153
- Fri, 15 Mar 2024 21:43:49 GMT
166
+ Fri, 15 Mar 2024 21:43:49 GMT
154
167
  [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-timepicker-compat_v0.2.2..@fluentui/react-timepicker-compat_v0.2.3)
155
168
 
156
169
  ### Patches
@@ -164,7 +177,7 @@ Fri, 15 Mar 2024 21:43:49 GMT
164
177
 
165
178
  ## [0.2.2](https://github.com/microsoft/fluentui/tree/@fluentui/react-timepicker-compat_v0.2.2)
166
179
 
167
- Thu, 07 Mar 2024 19:33:27 GMT
180
+ Thu, 07 Mar 2024 19:33:27 GMT
168
181
  [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-timepicker-compat_v0.2.1..@fluentui/react-timepicker-compat_v0.2.2)
169
182
 
170
183
  ### Patches
@@ -178,7 +191,7 @@ Thu, 07 Mar 2024 19:33:27 GMT
178
191
 
179
192
  ## [0.2.1](https://github.com/microsoft/fluentui/tree/@fluentui/react-timepicker-compat_v0.2.1)
180
193
 
181
- Wed, 28 Feb 2024 02:34:19 GMT
194
+ Wed, 28 Feb 2024 02:34:19 GMT
182
195
  [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-timepicker-compat_v0.2.0..@fluentui/react-timepicker-compat_v0.2.1)
183
196
 
184
197
  ### Patches
@@ -191,7 +204,7 @@ Wed, 28 Feb 2024 02:34:19 GMT
191
204
 
192
205
  ## [0.2.0](https://github.com/microsoft/fluentui/tree/@fluentui/react-timepicker-compat_v0.2.0)
193
206
 
194
- Tue, 20 Feb 2024 14:22:27 GMT
207
+ Tue, 20 Feb 2024 14:22:27 GMT
195
208
  [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-timepicker-compat_v0.1.9..@fluentui/react-timepicker-compat_v0.2.0)
196
209
 
197
210
  ### Minor changes
@@ -208,7 +221,7 @@ Tue, 20 Feb 2024 14:22:27 GMT
208
221
 
209
222
  ## [0.1.9](https://github.com/microsoft/fluentui/tree/@fluentui/react-timepicker-compat_v0.1.9)
210
223
 
211
- Tue, 06 Feb 2024 17:55:21 GMT
224
+ Tue, 06 Feb 2024 17:55:21 GMT
212
225
  [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-timepicker-compat_v0.1.8..@fluentui/react-timepicker-compat_v0.1.9)
213
226
 
214
227
  ### Patches
@@ -217,7 +230,7 @@ Tue, 06 Feb 2024 17:55:21 GMT
217
230
 
218
231
  ## [0.1.8](https://github.com/microsoft/fluentui/tree/@fluentui/react-timepicker-compat_v0.1.8)
219
232
 
220
- Tue, 30 Jan 2024 23:16:54 GMT
233
+ Tue, 30 Jan 2024 23:16:54 GMT
221
234
  [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-timepicker-compat_v0.1.7..@fluentui/react-timepicker-compat_v0.1.8)
222
235
 
223
236
  ### Patches
@@ -229,7 +242,7 @@ Tue, 30 Jan 2024 23:16:54 GMT
229
242
 
230
243
  ## [0.1.7](https://github.com/microsoft/fluentui/tree/@fluentui/react-timepicker-compat_v0.1.7)
231
244
 
232
- Mon, 29 Jan 2024 13:56:06 GMT
245
+ Mon, 29 Jan 2024 13:56:06 GMT
233
246
  [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-timepicker-compat_v0.1.6..@fluentui/react-timepicker-compat_v0.1.7)
234
247
 
235
248
  ### Patches
@@ -239,7 +252,7 @@ Mon, 29 Jan 2024 13:56:06 GMT
239
252
 
240
253
  ## [0.1.6](https://github.com/microsoft/fluentui/tree/@fluentui/react-timepicker-compat_v0.1.6)
241
254
 
242
- Fri, 26 Jan 2024 10:40:22 GMT
255
+ Fri, 26 Jan 2024 10:40:22 GMT
243
256
  [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-timepicker-compat_v0.1.5..@fluentui/react-timepicker-compat_v0.1.6)
244
257
 
245
258
  ### Patches
@@ -248,7 +261,7 @@ Fri, 26 Jan 2024 10:40:22 GMT
248
261
 
249
262
  ## [0.1.5](https://github.com/microsoft/fluentui/tree/@fluentui/react-timepicker-compat_v0.1.5)
250
263
 
251
- Tue, 23 Jan 2024 15:11:00 GMT
264
+ Tue, 23 Jan 2024 15:11:00 GMT
252
265
  [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-timepicker-compat_v0.1.4..@fluentui/react-timepicker-compat_v0.1.5)
253
266
 
254
267
  ### Patches
@@ -260,7 +273,7 @@ Tue, 23 Jan 2024 15:11:00 GMT
260
273
 
261
274
  ## [0.1.4](https://github.com/microsoft/fluentui/tree/@fluentui/react-timepicker-compat_v0.1.4)
262
275
 
263
- Thu, 18 Jan 2024 14:25:03 GMT
276
+ Thu, 18 Jan 2024 14:25:03 GMT
264
277
  [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-timepicker-compat_v0.1.3..@fluentui/react-timepicker-compat_v0.1.4)
265
278
 
266
279
  ### Patches
@@ -273,7 +286,7 @@ Thu, 18 Jan 2024 14:25:03 GMT
273
286
 
274
287
  ## [0.1.3](https://github.com/microsoft/fluentui/tree/@fluentui/react-timepicker-compat_v0.1.3)
275
288
 
276
- Wed, 17 Jan 2024 16:18:50 GMT
289
+ Wed, 17 Jan 2024 16:18:50 GMT
277
290
  [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-timepicker-compat_v0.1.2..@fluentui/react-timepicker-compat_v0.1.3)
278
291
 
279
292
  ### Patches
@@ -285,7 +298,7 @@ Wed, 17 Jan 2024 16:18:50 GMT
285
298
 
286
299
  ## [0.1.2](https://github.com/microsoft/fluentui/tree/@fluentui/react-timepicker-compat_v0.1.2)
287
300
 
288
- Tue, 16 Jan 2024 13:14:11 GMT
301
+ Tue, 16 Jan 2024 13:14:11 GMT
289
302
  [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-timepicker-compat_v0.1.1..@fluentui/react-timepicker-compat_v0.1.2)
290
303
 
291
304
  ### Patches
@@ -297,7 +310,7 @@ Tue, 16 Jan 2024 13:14:11 GMT
297
310
 
298
311
  ## [0.1.1](https://github.com/microsoft/fluentui/tree/@fluentui/react-timepicker-compat_v0.1.1)
299
312
 
300
- Thu, 11 Jan 2024 09:04:29 GMT
313
+ Thu, 11 Jan 2024 09:04:29 GMT
301
314
  [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-timepicker-compat_v0.1.0..@fluentui/react-timepicker-compat_v0.1.1)
302
315
 
303
316
  ### Patches
@@ -306,7 +319,7 @@ Thu, 11 Jan 2024 09:04:29 GMT
306
319
 
307
320
  ## [0.1.0](https://github.com/microsoft/fluentui/tree/@fluentui/react-timepicker-compat_v0.1.0)
308
321
 
309
- Tue, 09 Jan 2024 10:21:33 GMT
322
+ Tue, 09 Jan 2024 10:21:33 GMT
310
323
  [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-timepicker-compat_v0.0.2..@fluentui/react-timepicker-compat_v0.1.0)
311
324
 
312
325
  ### Minor changes
@@ -316,7 +329,7 @@ Tue, 09 Jan 2024 10:21:33 GMT
316
329
 
317
330
  ## [0.0.2](https://github.com/microsoft/fluentui/tree/@fluentui/react-timepicker-compat_v0.0.2)
318
331
 
319
- Mon, 08 Jan 2024 16:24:28 GMT
332
+ Mon, 08 Jan 2024 16:24:28 GMT
320
333
  [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-timepicker-compat_v0.0.1..@fluentui/react-timepicker-compat_v0.0.2)
321
334
 
322
335
  ### Patches
@@ -13,6 +13,7 @@ import { dateToKey, keyToDate, formatDateToTimeString as defaultFormatDateToTime
13
13
  * @param props - props from this instance of TimePicker
14
14
  * @param ref - reference to root HTMLElement of TimePicker
15
15
  */ export const useTimePicker_unstable = (props, ref)=>{
16
+ var _baseState_clearIcon;
16
17
  const { dateAnchor: dateAnchorInProps, defaultSelectedTime: defaultSelectedTimeInProps, endHour = 24, formatDateToTimeString = defaultFormatDateToTimeString, hourCycle, increment = 30, onTimeChange, selectedTime: selectedTimeInProps, showSeconds = false, startHour = 0, parseTimeStringToDate: parseTimeStringToDateInProps, ...rest } = props;
17
18
  const { freeform = false } = rest;
18
19
  var _ref;
@@ -53,8 +54,9 @@ import { dateToKey, keyToDate, formatDateToTimeString as defaultFormatDateToTime
53
54
  options,
54
55
  selectedTime
55
56
  ]);
57
+ const clearIconRef = React.useRef(null);
56
58
  const handleOptionSelect = useEventCallback((e, data)=>{
57
- if (freeform && data.optionValue === undefined) {
59
+ if (freeform && data.optionValue === undefined && !(rest.clearable && e.type === 'click' && e.currentTarget === clearIconRef.current)) {
58
60
  // Combobox clears selection when input value not matching any option; but we allow this case in freeform TimePicker.
59
61
  return;
60
62
  }
@@ -85,8 +87,13 @@ import { dateToKey, keyToDate, formatDateToTimeString as defaultFormatDateToTime
85
87
  hourCycle,
86
88
  showSeconds
87
89
  ]);
90
+ const mergedClearIconRef = useMergedRefs((_baseState_clearIcon = baseState.clearIcon) === null || _baseState_clearIcon === void 0 ? void 0 : _baseState_clearIcon.ref, clearIconRef);
88
91
  const state = {
89
92
  ...baseState,
93
+ clearIcon: baseState.clearIcon ? {
94
+ ...baseState.clearIcon,
95
+ ref: mergedClearIconRef
96
+ } : undefined,
90
97
  freeform,
91
98
  parseTimeStringToDate: parseTimeStringToDateInProps !== null && parseTimeStringToDateInProps !== void 0 ? parseTimeStringToDateInProps : defaultParseTimeStringToDate,
92
99
  submittedText
@@ -1 +1 @@
1
- {"version":3,"sources":["useTimePicker.tsx"],"sourcesContent":["import * as React from 'react';\nimport {\n elementContains,\n mergeCallbacks,\n useControllableState,\n useEventCallback,\n useId,\n useMergedRefs,\n} from '@fluentui/react-utilities';\nimport { Enter } from '@fluentui/keyboard-keys';\nimport type { Hour, TimePickerOption, TimePickerProps, TimePickerState, TimeSelectionData } from './TimePicker.types';\nimport { ComboboxProps, useCombobox_unstable, Option } from '@fluentui/react-combobox';\nimport { useFieldContext_unstable as useFieldContext } from '@fluentui/react-field';\nimport {\n dateToKey,\n keyToDate,\n formatDateToTimeString as defaultFormatDateToTimeString,\n getDateStartAnchor,\n getDateEndAnchor,\n getTimesBetween,\n getDateFromTimeString,\n} from './timeMath';\n\n/**\n * Create the state required to render TimePicker.\n *\n * The returned state can be modified with hooks such as useTimePickerStyles_unstable,\n * before being passed to renderTimePicker_unstable.\n *\n * @param props - props from this instance of TimePicker\n * @param ref - reference to root HTMLElement of TimePicker\n */\nexport const useTimePicker_unstable = (props: TimePickerProps, ref: React.Ref<HTMLInputElement>): TimePickerState => {\n const {\n dateAnchor: dateAnchorInProps,\n defaultSelectedTime: defaultSelectedTimeInProps,\n endHour = 24,\n formatDateToTimeString = defaultFormatDateToTimeString,\n hourCycle,\n increment = 30,\n onTimeChange,\n selectedTime: selectedTimeInProps,\n showSeconds = false,\n startHour = 0,\n parseTimeStringToDate: parseTimeStringToDateInProps,\n ...rest\n } = props;\n const { freeform = false } = rest;\n\n const { dateStartAnchor, dateEndAnchor } = useStableDateAnchor(\n dateAnchorInProps ?? selectedTimeInProps ?? defaultSelectedTimeInProps,\n startHour,\n endHour,\n );\n\n const options: TimePickerOption[] = React.useMemo(\n () =>\n getTimesBetween(dateStartAnchor, dateEndAnchor, increment).map(time => ({\n date: time,\n key: dateToKey(time),\n text: formatDateToTimeString(time, { showSeconds, hourCycle }),\n })),\n [dateEndAnchor, dateStartAnchor, formatDateToTimeString, hourCycle, increment, showSeconds],\n );\n\n const [selectedTime, setSelectedTime] = useControllableState<Date | null>({\n state: selectedTimeInProps,\n defaultState: defaultSelectedTimeInProps,\n initialState: null,\n });\n\n const [submittedText, setSubmittedText] = React.useState<string | undefined>(undefined);\n\n const selectTime: TimePickerProps['onTimeChange'] = useEventCallback((e, data) => {\n setSelectedTime(data.selectedTime);\n setSubmittedText(data.selectedTimeText);\n onTimeChange?.(e, data);\n });\n\n const selectedOptions = React.useMemo(() => {\n const selectedTimeKey = dateToKey(selectedTime);\n const selectedOption = options.find(date => date.key === selectedTimeKey);\n return selectedOption ? [selectedOption.key] : [];\n }, [options, selectedTime]);\n\n const handleOptionSelect: ComboboxProps['onOptionSelect'] = useEventCallback((e, data) => {\n if (freeform && data.optionValue === undefined) {\n // Combobox clears selection when input value not matching any option; but we allow this case in freeform TimePicker.\n return;\n }\n const timeSelectionData: TimeSelectionData = {\n selectedTime: keyToDate(data.optionValue ?? ''),\n selectedTimeText: data.optionText,\n errorType: undefined,\n };\n selectTime(e, timeSelectionData);\n });\n\n const baseState = useCombobox_unstable(\n {\n autoComplete: 'off',\n ...rest,\n selectedOptions,\n onOptionSelect: handleOptionSelect,\n children: options.map(date => (\n <Option key={date.key} value={date.key}>\n {date.text}\n </Option>\n )),\n },\n ref,\n );\n\n const defaultParseTimeStringToDate = React.useCallback(\n (time: string | undefined) =>\n getDateFromTimeString(time, dateStartAnchor, dateEndAnchor, { hourCycle, showSeconds }),\n [dateEndAnchor, dateStartAnchor, hourCycle, showSeconds],\n );\n\n const state: TimePickerState = {\n ...baseState,\n freeform,\n parseTimeStringToDate: parseTimeStringToDateInProps ?? defaultParseTimeStringToDate,\n submittedText,\n };\n\n useDefaultChevronIconLabel(state);\n useSelectTimeFromValue(state, selectTime);\n\n return state;\n};\n\n/**\n * Provides stable start and end date anchors based on the provided date and time parameters.\n * The hook ensures that the memoization remains consistent even if new Date objects representing the same date are provided.\n */\nconst useStableDateAnchor = (providedDate: Date | undefined, startHour: Hour, endHour: Hour) => {\n const [fallbackDateAnchor] = React.useState(() => new Date());\n\n const providedDateKey = dateToKey(providedDate ?? null);\n\n return React.useMemo(() => {\n const dateAnchor = providedDate ?? fallbackDateAnchor;\n\n const dateStartAnchor = getDateStartAnchor(dateAnchor, startHour);\n const dateEndAnchor = getDateEndAnchor(dateAnchor, startHour, endHour);\n\n return { dateStartAnchor, dateEndAnchor };\n // `providedDate`'s stable key representation is used as dependency instead of the Date object. This ensures that the memoization remains stable when a new Date object representing the same date is passed in.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [endHour, fallbackDateAnchor, providedDateKey, startHour]);\n};\n\n/**\n * Mimics the behavior of the browser's change event for a freeform TimePicker.\n * The provided callback is called when input changed and:\n * - Enter/Tab key is pressed on the input.\n * - TimePicker loses focus, signifying a possible change.\n */\nconst useSelectTimeFromValue = (state: TimePickerState, callback: TimePickerProps['onTimeChange']) => {\n const { getOptionById, freeform, parseTimeStringToDate, submittedText, value, activeDescendantController } = state;\n const getActiveOption = React.useCallback(() => {\n const activeOptionId = activeDescendantController.active();\n return activeOptionId ? getOptionById(activeOptionId) : null;\n }, [activeDescendantController, getOptionById]);\n\n // Base Combobox has activeOption default to first option in dropdown even if it doesn't match input value, and Enter key will select it.\n // This effect ensures that the activeOption is cleared when the input doesn't match any option.\n // This behavior is specific to a freeform TimePicker where the input value is treated as a valid time even if it's not in the dropdown.\n React.useEffect(() => {\n if (freeform && value) {\n const activeOption = getActiveOption();\n if (!activeOption) {\n return;\n }\n\n const valueMatchesActiveOption = activeOption.text.toLowerCase().indexOf(value.toLowerCase()) === 0;\n if (!valueMatchesActiveOption) {\n activeDescendantController.blur();\n }\n }\n }, [freeform, value, activeDescendantController, getActiveOption]);\n\n const selectTimeFromValue = useEventCallback(\n (e: React.KeyboardEvent<HTMLInputElement> | React.FocusEvent<HTMLInputElement>) => {\n if (!freeform) {\n return;\n }\n\n const { date: selectedTime, errorType } = parseTimeStringToDate(value);\n\n // Only triggers callback when the text in input has changed.\n if (submittedText !== value) {\n callback?.(e, { selectedTime, selectedTimeText: value, errorType });\n }\n },\n );\n\n const handleKeyDown: ComboboxProps['onKeyDown'] = useEventCallback(e => {\n const activeOption = getActiveOption();\n if (!activeOption && e.key === Enter) {\n selectTimeFromValue(e);\n }\n });\n state.root.onKeyDown = mergeCallbacks(handleKeyDown, state.root.onKeyDown);\n\n const rootRef = React.useRef<HTMLDivElement>(null);\n state.root.ref = useMergedRefs(state.root.ref, rootRef);\n\n if (state.listbox) {\n state.listbox.tabIndex = -1; // allows it to be the relatedTarget of a blur event.\n }\n\n if (state.expandIcon) {\n state.expandIcon.tabIndex = -1; // allows it to be the relatedTarget of a blur event.\n }\n\n const handleInputBlur = useEventCallback((e: React.FocusEvent<HTMLInputElement>) => {\n const isOutside = e.relatedTarget ? !elementContains(rootRef.current, e.relatedTarget) : true;\n if (isOutside) {\n selectTimeFromValue(e);\n }\n });\n state.input.onBlur = mergeCallbacks(handleInputBlur, state.input.onBlur);\n};\n\n/**\n * Provides a default aria-labelledby for the chevron icon if the TimePicker is wrapped in a Field.\n */\nconst useDefaultChevronIconLabel = (state: TimePickerState) => {\n const fieldContext = useFieldContext();\n const chevronDefaultId = useId('timepicker-chevron-');\n const defaultLabelFromCombobox = 'Open';\n\n if (fieldContext?.labelId && state.expandIcon?.['aria-label'] === defaultLabelFromCombobox) {\n const chevronId = state.expandIcon.id ?? chevronDefaultId;\n state.expandIcon['aria-labelledby'] = `${chevronId} ${fieldContext.labelId}`;\n }\n};\n"],"names":["React","elementContains","mergeCallbacks","useControllableState","useEventCallback","useId","useMergedRefs","Enter","useCombobox_unstable","Option","useFieldContext_unstable","useFieldContext","dateToKey","keyToDate","formatDateToTimeString","defaultFormatDateToTimeString","getDateStartAnchor","getDateEndAnchor","getTimesBetween","getDateFromTimeString","useTimePicker_unstable","props","ref","dateAnchor","dateAnchorInProps","defaultSelectedTime","defaultSelectedTimeInProps","endHour","hourCycle","increment","onTimeChange","selectedTime","selectedTimeInProps","showSeconds","startHour","parseTimeStringToDate","parseTimeStringToDateInProps","rest","freeform","dateStartAnchor","dateEndAnchor","useStableDateAnchor","options","useMemo","map","time","date","key","text","setSelectedTime","state","defaultState","initialState","submittedText","setSubmittedText","useState","undefined","selectTime","e","data","selectedTimeText","selectedOptions","selectedTimeKey","selectedOption","find","handleOptionSelect","optionValue","timeSelectionData","optionText","errorType","baseState","autoComplete","onOptionSelect","children","value","defaultParseTimeStringToDate","useCallback","useDefaultChevronIconLabel","useSelectTimeFromValue","providedDate","fallbackDateAnchor","Date","providedDateKey","callback","getOptionById","activeDescendantController","getActiveOption","activeOptionId","active","useEffect","activeOption","valueMatchesActiveOption","toLowerCase","indexOf","blur","selectTimeFromValue","handleKeyDown","root","onKeyDown","rootRef","useRef","listbox","tabIndex","expandIcon","handleInputBlur","isOutside","relatedTarget","current","input","onBlur","fieldContext","chevronDefaultId","defaultLabelFromCombobox","labelId","chevronId","id"],"mappings":"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"}
1
+ {"version":3,"sources":["useTimePicker.tsx"],"sourcesContent":["import * as React from 'react';\nimport {\n elementContains,\n mergeCallbacks,\n useControllableState,\n useEventCallback,\n useId,\n useMergedRefs,\n} from '@fluentui/react-utilities';\nimport { Enter } from '@fluentui/keyboard-keys';\nimport type { Hour, TimePickerOption, TimePickerProps, TimePickerState, TimeSelectionData } from './TimePicker.types';\nimport { ComboboxProps, useCombobox_unstable, Option } from '@fluentui/react-combobox';\nimport { useFieldContext_unstable as useFieldContext } from '@fluentui/react-field';\nimport {\n dateToKey,\n keyToDate,\n formatDateToTimeString as defaultFormatDateToTimeString,\n getDateStartAnchor,\n getDateEndAnchor,\n getTimesBetween,\n getDateFromTimeString,\n} from './timeMath';\n\n/**\n * Create the state required to render TimePicker.\n *\n * The returned state can be modified with hooks such as useTimePickerStyles_unstable,\n * before being passed to renderTimePicker_unstable.\n *\n * @param props - props from this instance of TimePicker\n * @param ref - reference to root HTMLElement of TimePicker\n */\nexport const useTimePicker_unstable = (props: TimePickerProps, ref: React.Ref<HTMLInputElement>): TimePickerState => {\n const {\n dateAnchor: dateAnchorInProps,\n defaultSelectedTime: defaultSelectedTimeInProps,\n endHour = 24,\n formatDateToTimeString = defaultFormatDateToTimeString,\n hourCycle,\n increment = 30,\n onTimeChange,\n selectedTime: selectedTimeInProps,\n showSeconds = false,\n startHour = 0,\n parseTimeStringToDate: parseTimeStringToDateInProps,\n ...rest\n } = props;\n const { freeform = false } = rest;\n\n const { dateStartAnchor, dateEndAnchor } = useStableDateAnchor(\n dateAnchorInProps ?? selectedTimeInProps ?? defaultSelectedTimeInProps,\n startHour,\n endHour,\n );\n\n const options: TimePickerOption[] = React.useMemo(\n () =>\n getTimesBetween(dateStartAnchor, dateEndAnchor, increment).map(time => ({\n date: time,\n key: dateToKey(time),\n text: formatDateToTimeString(time, { showSeconds, hourCycle }),\n })),\n [dateEndAnchor, dateStartAnchor, formatDateToTimeString, hourCycle, increment, showSeconds],\n );\n\n const [selectedTime, setSelectedTime] = useControllableState<Date | null>({\n state: selectedTimeInProps,\n defaultState: defaultSelectedTimeInProps,\n initialState: null,\n });\n\n const [submittedText, setSubmittedText] = React.useState<string | undefined>(undefined);\n\n const selectTime: TimePickerProps['onTimeChange'] = useEventCallback((e, data) => {\n setSelectedTime(data.selectedTime);\n setSubmittedText(data.selectedTimeText);\n onTimeChange?.(e, data);\n });\n\n const selectedOptions = React.useMemo(() => {\n const selectedTimeKey = dateToKey(selectedTime);\n const selectedOption = options.find(date => date.key === selectedTimeKey);\n return selectedOption ? [selectedOption.key] : [];\n }, [options, selectedTime]);\n\n const clearIconRef = React.useRef<HTMLSpanElement>(null);\n const handleOptionSelect: ComboboxProps['onOptionSelect'] = useEventCallback((e, data) => {\n if (\n freeform &&\n data.optionValue === undefined &&\n !(rest.clearable && e.type === 'click' && e.currentTarget === clearIconRef.current)\n ) {\n // Combobox clears selection when input value not matching any option; but we allow this case in freeform TimePicker.\n return;\n }\n const timeSelectionData: TimeSelectionData = {\n selectedTime: keyToDate(data.optionValue ?? ''),\n selectedTimeText: data.optionText,\n errorType: undefined,\n };\n selectTime(e, timeSelectionData);\n });\n\n const baseState = useCombobox_unstable(\n {\n autoComplete: 'off',\n ...rest,\n selectedOptions,\n onOptionSelect: handleOptionSelect,\n children: options.map(date => (\n <Option key={date.key} value={date.key}>\n {date.text}\n </Option>\n )),\n },\n ref,\n );\n\n const defaultParseTimeStringToDate = React.useCallback(\n (time: string | undefined) =>\n getDateFromTimeString(time, dateStartAnchor, dateEndAnchor, { hourCycle, showSeconds }),\n [dateEndAnchor, dateStartAnchor, hourCycle, showSeconds],\n );\n\n const mergedClearIconRef = useMergedRefs(baseState.clearIcon?.ref, clearIconRef);\n const state: TimePickerState = {\n ...baseState,\n clearIcon: baseState.clearIcon\n ? {\n ...baseState.clearIcon,\n ref: mergedClearIconRef,\n }\n : undefined,\n freeform,\n parseTimeStringToDate: parseTimeStringToDateInProps ?? defaultParseTimeStringToDate,\n submittedText,\n };\n\n useDefaultChevronIconLabel(state);\n useSelectTimeFromValue(state, selectTime);\n\n return state;\n};\n\n/**\n * Provides stable start and end date anchors based on the provided date and time parameters.\n * The hook ensures that the memoization remains consistent even if new Date objects representing the same date are provided.\n */\nconst useStableDateAnchor = (providedDate: Date | undefined, startHour: Hour, endHour: Hour) => {\n const [fallbackDateAnchor] = React.useState(() => new Date());\n\n const providedDateKey = dateToKey(providedDate ?? null);\n\n return React.useMemo(() => {\n const dateAnchor = providedDate ?? fallbackDateAnchor;\n\n const dateStartAnchor = getDateStartAnchor(dateAnchor, startHour);\n const dateEndAnchor = getDateEndAnchor(dateAnchor, startHour, endHour);\n\n return { dateStartAnchor, dateEndAnchor };\n // `providedDate`'s stable key representation is used as dependency instead of the Date object. This ensures that the memoization remains stable when a new Date object representing the same date is passed in.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [endHour, fallbackDateAnchor, providedDateKey, startHour]);\n};\n\n/**\n * Mimics the behavior of the browser's change event for a freeform TimePicker.\n * The provided callback is called when input changed and:\n * - Enter/Tab key is pressed on the input.\n * - TimePicker loses focus, signifying a possible change.\n */\nconst useSelectTimeFromValue = (state: TimePickerState, callback: TimePickerProps['onTimeChange']) => {\n const { getOptionById, freeform, parseTimeStringToDate, submittedText, value, activeDescendantController } = state;\n const getActiveOption = React.useCallback(() => {\n const activeOptionId = activeDescendantController.active();\n return activeOptionId ? getOptionById(activeOptionId) : null;\n }, [activeDescendantController, getOptionById]);\n\n // Base Combobox has activeOption default to first option in dropdown even if it doesn't match input value, and Enter key will select it.\n // This effect ensures that the activeOption is cleared when the input doesn't match any option.\n // This behavior is specific to a freeform TimePicker where the input value is treated as a valid time even if it's not in the dropdown.\n React.useEffect(() => {\n if (freeform && value) {\n const activeOption = getActiveOption();\n if (!activeOption) {\n return;\n }\n\n const valueMatchesActiveOption = activeOption.text.toLowerCase().indexOf(value.toLowerCase()) === 0;\n if (!valueMatchesActiveOption) {\n activeDescendantController.blur();\n }\n }\n }, [freeform, value, activeDescendantController, getActiveOption]);\n\n const selectTimeFromValue = useEventCallback(\n (e: React.KeyboardEvent<HTMLInputElement> | React.FocusEvent<HTMLInputElement>) => {\n if (!freeform) {\n return;\n }\n\n const { date: selectedTime, errorType } = parseTimeStringToDate(value);\n\n // Only triggers callback when the text in input has changed.\n if (submittedText !== value) {\n callback?.(e, { selectedTime, selectedTimeText: value, errorType });\n }\n },\n );\n\n const handleKeyDown: ComboboxProps['onKeyDown'] = useEventCallback(e => {\n const activeOption = getActiveOption();\n if (!activeOption && e.key === Enter) {\n selectTimeFromValue(e);\n }\n });\n state.root.onKeyDown = mergeCallbacks(handleKeyDown, state.root.onKeyDown);\n\n const rootRef = React.useRef<HTMLDivElement>(null);\n state.root.ref = useMergedRefs(state.root.ref, rootRef);\n\n if (state.listbox) {\n state.listbox.tabIndex = -1; // allows it to be the relatedTarget of a blur event.\n }\n\n if (state.expandIcon) {\n state.expandIcon.tabIndex = -1; // allows it to be the relatedTarget of a blur event.\n }\n\n const handleInputBlur = useEventCallback((e: React.FocusEvent<HTMLInputElement>) => {\n const isOutside = e.relatedTarget ? !elementContains(rootRef.current, e.relatedTarget) : true;\n if (isOutside) {\n selectTimeFromValue(e);\n }\n });\n state.input.onBlur = mergeCallbacks(handleInputBlur, state.input.onBlur);\n};\n\n/**\n * Provides a default aria-labelledby for the chevron icon if the TimePicker is wrapped in a Field.\n */\nconst useDefaultChevronIconLabel = (state: TimePickerState) => {\n const fieldContext = useFieldContext();\n const chevronDefaultId = useId('timepicker-chevron-');\n const defaultLabelFromCombobox = 'Open';\n\n if (fieldContext?.labelId && state.expandIcon?.['aria-label'] === defaultLabelFromCombobox) {\n const chevronId = state.expandIcon.id ?? chevronDefaultId;\n state.expandIcon['aria-labelledby'] = `${chevronId} ${fieldContext.labelId}`;\n }\n};\n"],"names":["React","elementContains","mergeCallbacks","useControllableState","useEventCallback","useId","useMergedRefs","Enter","useCombobox_unstable","Option","useFieldContext_unstable","useFieldContext","dateToKey","keyToDate","formatDateToTimeString","defaultFormatDateToTimeString","getDateStartAnchor","getDateEndAnchor","getTimesBetween","getDateFromTimeString","useTimePicker_unstable","props","ref","baseState","dateAnchor","dateAnchorInProps","defaultSelectedTime","defaultSelectedTimeInProps","endHour","hourCycle","increment","onTimeChange","selectedTime","selectedTimeInProps","showSeconds","startHour","parseTimeStringToDate","parseTimeStringToDateInProps","rest","freeform","dateStartAnchor","dateEndAnchor","useStableDateAnchor","options","useMemo","map","time","date","key","text","setSelectedTime","state","defaultState","initialState","submittedText","setSubmittedText","useState","undefined","selectTime","e","data","selectedTimeText","selectedOptions","selectedTimeKey","selectedOption","find","clearIconRef","useRef","handleOptionSelect","optionValue","clearable","type","currentTarget","current","timeSelectionData","optionText","errorType","autoComplete","onOptionSelect","children","value","defaultParseTimeStringToDate","useCallback","mergedClearIconRef","clearIcon","useDefaultChevronIconLabel","useSelectTimeFromValue","providedDate","fallbackDateAnchor","Date","providedDateKey","callback","getOptionById","activeDescendantController","getActiveOption","activeOptionId","active","useEffect","activeOption","valueMatchesActiveOption","toLowerCase","indexOf","blur","selectTimeFromValue","handleKeyDown","root","onKeyDown","rootRef","listbox","tabIndex","expandIcon","handleInputBlur","isOutside","relatedTarget","input","onBlur","fieldContext","chevronDefaultId","defaultLabelFromCombobox","labelId","chevronId","id"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SACEC,eAAe,EACfC,cAAc,EACdC,oBAAoB,EACpBC,gBAAgB,EAChBC,KAAK,EACLC,aAAa,QACR,4BAA4B;AACnC,SAASC,KAAK,QAAQ,0BAA0B;AAEhD,SAAwBC,oBAAoB,EAAEC,MAAM,QAAQ,2BAA2B;AACvF,SAASC,4BAA4BC,eAAe,QAAQ,wBAAwB;AACpF,SACEC,SAAS,EACTC,SAAS,EACTC,0BAA0BC,6BAA6B,EACvDC,kBAAkB,EAClBC,gBAAgB,EAChBC,eAAe,EACfC,qBAAqB,QAChB,aAAa;AAEpB;;;;;;;;CAQC,GACD,OAAO,MAAMC,yBAAyB,CAACC,OAAwBC;QA4FpBC;IA3FzC,MAAM,EACJC,YAAYC,iBAAiB,EAC7BC,qBAAqBC,0BAA0B,EAC/CC,UAAU,EAAE,EACZd,yBAAyBC,6BAA6B,EACtDc,SAAS,EACTC,YAAY,EAAE,EACdC,YAAY,EACZC,cAAcC,mBAAmB,EACjCC,cAAc,KAAK,EACnBC,YAAY,CAAC,EACbC,uBAAuBC,4BAA4B,EACnD,GAAGC,MACJ,GAAGjB;IACJ,MAAM,EAAEkB,WAAW,KAAK,EAAE,GAAGD;QAG3Bb;IADF,MAAM,EAAEe,eAAe,EAAEC,aAAa,EAAE,GAAGC,oBACzCjB,CAAAA,OAAAA,8BAAAA,+BAAAA,oBAAqBQ,iCAArBR,kBAAAA,OAA4CE,4BAC5CQ,WACAP;IAGF,MAAMe,UAA8B3C,MAAM4C,OAAO,CAC/C,IACE1B,gBAAgBsB,iBAAiBC,eAAeX,WAAWe,GAAG,CAACC,CAAAA,OAAS,CAAA;gBACtEC,MAAMD;gBACNE,KAAKpC,UAAUkC;gBACfG,MAAMnC,uBAAuBgC,MAAM;oBAAEZ;oBAAaL;gBAAU;YAC9D,CAAA,IACF;QAACY;QAAeD;QAAiB1B;QAAwBe;QAAWC;QAAWI;KAAY;IAG7F,MAAM,CAACF,cAAckB,gBAAgB,GAAG/C,qBAAkC;QACxEgD,OAAOlB;QACPmB,cAAczB;QACd0B,cAAc;IAChB;IAEA,MAAM,CAACC,eAAeC,iBAAiB,GAAGvD,MAAMwD,QAAQ,CAAqBC;IAE7E,MAAMC,aAA8CtD,iBAAiB,CAACuD,GAAGC;QACvEV,gBAAgBU,KAAK5B,YAAY;QACjCuB,iBAAiBK,KAAKC,gBAAgB;QACtC9B,yBAAAA,mCAAAA,aAAe4B,GAAGC;IACpB;IAEA,MAAME,kBAAkB9D,MAAM4C,OAAO,CAAC;QACpC,MAAMmB,kBAAkBnD,UAAUoB;QAClC,MAAMgC,iBAAiBrB,QAAQsB,IAAI,CAAClB,CAAAA,OAAQA,KAAKC,GAAG,KAAKe;QACzD,OAAOC,iBAAiB;YAACA,eAAehB,GAAG;SAAC,GAAG,EAAE;IACnD,GAAG;QAACL;QAASX;KAAa;IAE1B,MAAMkC,eAAelE,MAAMmE,MAAM,CAAkB;IACnD,MAAMC,qBAAsDhE,iBAAiB,CAACuD,GAAGC;QAC/E,IACErB,YACAqB,KAAKS,WAAW,KAAKZ,aACrB,CAAEnB,CAAAA,KAAKgC,SAAS,IAAIX,EAAEY,IAAI,KAAK,WAAWZ,EAAEa,aAAa,KAAKN,aAAaO,OAAO,AAAD,GACjF;YACA,qHAAqH;YACrH;QACF;YAE0Bb;QAD1B,MAAMc,oBAAuC;YAC3C1C,cAAcnB,UAAU+C,CAAAA,oBAAAA,KAAKS,WAAW,cAAhBT,+BAAAA,oBAAoB;YAC5CC,kBAAkBD,KAAKe,UAAU;YACjCC,WAAWnB;QACb;QACAC,WAAWC,GAAGe;IAChB;IAEA,MAAMnD,YAAYf,qBAChB;QACEqE,cAAc;QACd,GAAGvC,IAAI;QACPwB;QACAgB,gBAAgBV;QAChBW,UAAUpC,QAAQE,GAAG,CAACE,CAAAA,qBACpB,oBAACtC;gBAAOuC,KAAKD,KAAKC,GAAG;gBAAEgC,OAAOjC,KAAKC,GAAG;eACnCD,KAAKE,IAAI;IAGhB,GACA3B;IAGF,MAAM2D,+BAA+BjF,MAAMkF,WAAW,CACpD,CAACpC,OACC3B,sBAAsB2B,MAAMN,iBAAiBC,eAAe;YAAEZ;YAAWK;QAAY,IACvF;QAACO;QAAeD;QAAiBX;QAAWK;KAAY;IAG1D,MAAMiD,qBAAqB7E,eAAciB,uBAAAA,UAAU6D,SAAS,cAAnB7D,2CAAAA,qBAAqBD,GAAG,EAAE4C;IACnE,MAAMf,QAAyB;QAC7B,GAAG5B,SAAS;QACZ6D,WAAW7D,UAAU6D,SAAS,GAC1B;YACE,GAAG7D,UAAU6D,SAAS;YACtB9D,KAAK6D;QACP,IACA1B;QACJlB;QACAH,uBAAuBC,yCAAAA,0CAAAA,+BAAgC4C;QACvD3B;IACF;IAEA+B,2BAA2BlC;IAC3BmC,uBAAuBnC,OAAOO;IAE9B,OAAOP;AACT,EAAE;AAEF;;;CAGC,GACD,MAAMT,sBAAsB,CAAC6C,cAAgCpD,WAAiBP;IAC5E,MAAM,CAAC4D,mBAAmB,GAAGxF,MAAMwD,QAAQ,CAAC,IAAM,IAAIiC;IAEtD,MAAMC,kBAAkB9E,UAAU2E,yBAAAA,0BAAAA,eAAgB;IAElD,OAAOvF,MAAM4C,OAAO,CAAC;QACnB,MAAMpB,aAAa+D,yBAAAA,0BAAAA,eAAgBC;QAEnC,MAAMhD,kBAAkBxB,mBAAmBQ,YAAYW;QACvD,MAAMM,gBAAgBxB,iBAAiBO,YAAYW,WAAWP;QAE9D,OAAO;YAAEY;YAAiBC;QAAc;IACxC,gNAAgN;IAChN,uDAAuD;IACzD,GAAG;QAACb;QAAS4D;QAAoBE;QAAiBvD;KAAU;AAC9D;AAEA;;;;;CAKC,GACD,MAAMmD,yBAAyB,CAACnC,OAAwBwC;IACtD,MAAM,EAAEC,aAAa,EAAErD,QAAQ,EAAEH,qBAAqB,EAAEkB,aAAa,EAAE0B,KAAK,EAAEa,0BAA0B,EAAE,GAAG1C;IAC7G,MAAM2C,kBAAkB9F,MAAMkF,WAAW,CAAC;QACxC,MAAMa,iBAAiBF,2BAA2BG,MAAM;QACxD,OAAOD,iBAAiBH,cAAcG,kBAAkB;IAC1D,GAAG;QAACF;QAA4BD;KAAc;IAE9C,yIAAyI;IACzI,gGAAgG;IAChG,wIAAwI;IACxI5F,MAAMiG,SAAS,CAAC;QACd,IAAI1D,YAAYyC,OAAO;YACrB,MAAMkB,eAAeJ;YACrB,IAAI,CAACI,cAAc;gBACjB;YACF;YAEA,MAAMC,2BAA2BD,aAAajD,IAAI,CAACmD,WAAW,GAAGC,OAAO,CAACrB,MAAMoB,WAAW,QAAQ;YAClG,IAAI,CAACD,0BAA0B;gBAC7BN,2BAA2BS,IAAI;YACjC;QACF;IACF,GAAG;QAAC/D;QAAUyC;QAAOa;QAA4BC;KAAgB;IAEjE,MAAMS,sBAAsBnG,iBAC1B,CAACuD;QACC,IAAI,CAACpB,UAAU;YACb;QACF;QAEA,MAAM,EAAEQ,MAAMf,YAAY,EAAE4C,SAAS,EAAE,GAAGxC,sBAAsB4C;QAEhE,6DAA6D;QAC7D,IAAI1B,kBAAkB0B,OAAO;YAC3BW,qBAAAA,+BAAAA,SAAWhC,GAAG;gBAAE3B;gBAAc6B,kBAAkBmB;gBAAOJ;YAAU;QACnE;IACF;IAGF,MAAM4B,gBAA4CpG,iBAAiBuD,CAAAA;QACjE,MAAMuC,eAAeJ;QACrB,IAAI,CAACI,gBAAgBvC,EAAEX,GAAG,KAAKzC,OAAO;YACpCgG,oBAAoB5C;QACtB;IACF;IACAR,MAAMsD,IAAI,CAACC,SAAS,GAAGxG,eAAesG,eAAerD,MAAMsD,IAAI,CAACC,SAAS;IAEzE,MAAMC,UAAU3G,MAAMmE,MAAM,CAAiB;IAC7ChB,MAAMsD,IAAI,CAACnF,GAAG,GAAGhB,cAAc6C,MAAMsD,IAAI,CAACnF,GAAG,EAAEqF;IAE/C,IAAIxD,MAAMyD,OAAO,EAAE;QACjBzD,MAAMyD,OAAO,CAACC,QAAQ,GAAG,CAAC,GAAG,qDAAqD;IACpF;IAEA,IAAI1D,MAAM2D,UAAU,EAAE;QACpB3D,MAAM2D,UAAU,CAACD,QAAQ,GAAG,CAAC,GAAG,qDAAqD;IACvF;IAEA,MAAME,kBAAkB3G,iBAAiB,CAACuD;QACxC,MAAMqD,YAAYrD,EAAEsD,aAAa,GAAG,CAAChH,gBAAgB0G,QAAQlC,OAAO,EAAEd,EAAEsD,aAAa,IAAI;QACzF,IAAID,WAAW;YACbT,oBAAoB5C;QACtB;IACF;IACAR,MAAM+D,KAAK,CAACC,MAAM,GAAGjH,eAAe6G,iBAAiB5D,MAAM+D,KAAK,CAACC,MAAM;AACzE;AAEA;;CAEC,GACD,MAAM9B,6BAA6B,CAAClC;QAKLA;IAJ7B,MAAMiE,eAAezG;IACrB,MAAM0G,mBAAmBhH,MAAM;IAC/B,MAAMiH,2BAA2B;IAEjC,IAAIF,CAAAA,yBAAAA,mCAAAA,aAAcG,OAAO,KAAIpE,EAAAA,oBAAAA,MAAM2D,UAAU,cAAhB3D,wCAAAA,iBAAkB,CAAC,aAAa,MAAKmE,0BAA0B;YACxEnE;QAAlB,MAAMqE,YAAYrE,CAAAA,uBAAAA,MAAM2D,UAAU,CAACW,EAAE,cAAnBtE,kCAAAA,uBAAuBkE;QACzClE,MAAM2D,UAAU,CAAC,kBAAkB,GAAG,CAAC,EAAEU,UAAU,CAAC,EAAEJ,aAAaG,OAAO,CAAC,CAAC;IAC9E;AACF"}
@@ -16,6 +16,7 @@ const _reactcombobox = require("@fluentui/react-combobox");
16
16
  const _reactfield = require("@fluentui/react-field");
17
17
  const _timeMath = require("./timeMath");
18
18
  const useTimePicker_unstable = (props, ref)=>{
19
+ var _baseState_clearIcon;
19
20
  const { dateAnchor: dateAnchorInProps, defaultSelectedTime: defaultSelectedTimeInProps, endHour = 24, formatDateToTimeString = _timeMath.formatDateToTimeString, hourCycle, increment = 30, onTimeChange, selectedTime: selectedTimeInProps, showSeconds = false, startHour = 0, parseTimeStringToDate: parseTimeStringToDateInProps, ...rest } = props;
20
21
  const { freeform = false } = rest;
21
22
  var _ref;
@@ -56,8 +57,9 @@ const useTimePicker_unstable = (props, ref)=>{
56
57
  options,
57
58
  selectedTime
58
59
  ]);
60
+ const clearIconRef = _react.useRef(null);
59
61
  const handleOptionSelect = (0, _reactutilities.useEventCallback)((e, data)=>{
60
- if (freeform && data.optionValue === undefined) {
62
+ if (freeform && data.optionValue === undefined && !(rest.clearable && e.type === 'click' && e.currentTarget === clearIconRef.current)) {
61
63
  // Combobox clears selection when input value not matching any option; but we allow this case in freeform TimePicker.
62
64
  return;
63
65
  }
@@ -88,8 +90,13 @@ const useTimePicker_unstable = (props, ref)=>{
88
90
  hourCycle,
89
91
  showSeconds
90
92
  ]);
93
+ const mergedClearIconRef = (0, _reactutilities.useMergedRefs)((_baseState_clearIcon = baseState.clearIcon) === null || _baseState_clearIcon === void 0 ? void 0 : _baseState_clearIcon.ref, clearIconRef);
91
94
  const state = {
92
95
  ...baseState,
96
+ clearIcon: baseState.clearIcon ? {
97
+ ...baseState.clearIcon,
98
+ ref: mergedClearIconRef
99
+ } : undefined,
93
100
  freeform,
94
101
  parseTimeStringToDate: parseTimeStringToDateInProps !== null && parseTimeStringToDateInProps !== void 0 ? parseTimeStringToDateInProps : defaultParseTimeStringToDate,
95
102
  submittedText
@@ -1 +1 @@
1
- {"version":3,"sources":["useTimePicker.js"],"sourcesContent":["import * as React from 'react';\nimport { elementContains, mergeCallbacks, useControllableState, useEventCallback, useId, useMergedRefs } from '@fluentui/react-utilities';\nimport { Enter } from '@fluentui/keyboard-keys';\nimport { useCombobox_unstable, Option } from '@fluentui/react-combobox';\nimport { useFieldContext_unstable as useFieldContext } from '@fluentui/react-field';\nimport { dateToKey, keyToDate, formatDateToTimeString as defaultFormatDateToTimeString, getDateStartAnchor, getDateEndAnchor, getTimesBetween, getDateFromTimeString } from './timeMath';\n/**\n * Create the state required to render TimePicker.\n *\n * The returned state can be modified with hooks such as useTimePickerStyles_unstable,\n * before being passed to renderTimePicker_unstable.\n *\n * @param props - props from this instance of TimePicker\n * @param ref - reference to root HTMLElement of TimePicker\n */ export const useTimePicker_unstable = (props, ref)=>{\n const { dateAnchor: dateAnchorInProps, defaultSelectedTime: defaultSelectedTimeInProps, endHour = 24, formatDateToTimeString = defaultFormatDateToTimeString, hourCycle, increment = 30, onTimeChange, selectedTime: selectedTimeInProps, showSeconds = false, startHour = 0, parseTimeStringToDate: parseTimeStringToDateInProps, ...rest } = props;\n const { freeform = false } = rest;\n var _ref;\n const { dateStartAnchor, dateEndAnchor } = useStableDateAnchor((_ref = dateAnchorInProps !== null && dateAnchorInProps !== void 0 ? dateAnchorInProps : selectedTimeInProps) !== null && _ref !== void 0 ? _ref : defaultSelectedTimeInProps, startHour, endHour);\n const options = React.useMemo(()=>getTimesBetween(dateStartAnchor, dateEndAnchor, increment).map((time)=>({\n date: time,\n key: dateToKey(time),\n text: formatDateToTimeString(time, {\n showSeconds,\n hourCycle\n })\n })), [\n dateEndAnchor,\n dateStartAnchor,\n formatDateToTimeString,\n hourCycle,\n increment,\n showSeconds\n ]);\n const [selectedTime, setSelectedTime] = useControllableState({\n state: selectedTimeInProps,\n defaultState: defaultSelectedTimeInProps,\n initialState: null\n });\n const [submittedText, setSubmittedText] = React.useState(undefined);\n const selectTime = useEventCallback((e, data)=>{\n setSelectedTime(data.selectedTime);\n setSubmittedText(data.selectedTimeText);\n onTimeChange === null || onTimeChange === void 0 ? void 0 : onTimeChange(e, data);\n });\n const selectedOptions = React.useMemo(()=>{\n const selectedTimeKey = dateToKey(selectedTime);\n const selectedOption = options.find((date)=>date.key === selectedTimeKey);\n return selectedOption ? [\n selectedOption.key\n ] : [];\n }, [\n options,\n selectedTime\n ]);\n const handleOptionSelect = useEventCallback((e, data)=>{\n if (freeform && data.optionValue === undefined) {\n // Combobox clears selection when input value not matching any option; but we allow this case in freeform TimePicker.\n return;\n }\n var _data_optionValue;\n const timeSelectionData = {\n selectedTime: keyToDate((_data_optionValue = data.optionValue) !== null && _data_optionValue !== void 0 ? _data_optionValue : ''),\n selectedTimeText: data.optionText,\n errorType: undefined\n };\n selectTime(e, timeSelectionData);\n });\n const baseState = useCombobox_unstable({\n autoComplete: 'off',\n ...rest,\n selectedOptions,\n onOptionSelect: handleOptionSelect,\n children: options.map((date)=>/*#__PURE__*/ React.createElement(Option, {\n key: date.key,\n value: date.key\n }, date.text))\n }, ref);\n const defaultParseTimeStringToDate = React.useCallback((time)=>getDateFromTimeString(time, dateStartAnchor, dateEndAnchor, {\n hourCycle,\n showSeconds\n }), [\n dateEndAnchor,\n dateStartAnchor,\n hourCycle,\n showSeconds\n ]);\n const state = {\n ...baseState,\n freeform,\n parseTimeStringToDate: parseTimeStringToDateInProps !== null && parseTimeStringToDateInProps !== void 0 ? parseTimeStringToDateInProps : defaultParseTimeStringToDate,\n submittedText\n };\n useDefaultChevronIconLabel(state);\n useSelectTimeFromValue(state, selectTime);\n return state;\n};\n/**\n * Provides stable start and end date anchors based on the provided date and time parameters.\n * The hook ensures that the memoization remains consistent even if new Date objects representing the same date are provided.\n */ const useStableDateAnchor = (providedDate, startHour, endHour)=>{\n const [fallbackDateAnchor] = React.useState(()=>new Date());\n const providedDateKey = dateToKey(providedDate !== null && providedDate !== void 0 ? providedDate : null);\n return React.useMemo(()=>{\n const dateAnchor = providedDate !== null && providedDate !== void 0 ? providedDate : fallbackDateAnchor;\n const dateStartAnchor = getDateStartAnchor(dateAnchor, startHour);\n const dateEndAnchor = getDateEndAnchor(dateAnchor, startHour, endHour);\n return {\n dateStartAnchor,\n dateEndAnchor\n };\n // `providedDate`'s stable key representation is used as dependency instead of the Date object. This ensures that the memoization remains stable when a new Date object representing the same date is passed in.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n endHour,\n fallbackDateAnchor,\n providedDateKey,\n startHour\n ]);\n};\n/**\n * Mimics the behavior of the browser's change event for a freeform TimePicker.\n * The provided callback is called when input changed and:\n * - Enter/Tab key is pressed on the input.\n * - TimePicker loses focus, signifying a possible change.\n */ const useSelectTimeFromValue = (state, callback)=>{\n const { getOptionById, freeform, parseTimeStringToDate, submittedText, value, activeDescendantController } = state;\n const getActiveOption = React.useCallback(()=>{\n const activeOptionId = activeDescendantController.active();\n return activeOptionId ? getOptionById(activeOptionId) : null;\n }, [\n activeDescendantController,\n getOptionById\n ]);\n // Base Combobox has activeOption default to first option in dropdown even if it doesn't match input value, and Enter key will select it.\n // This effect ensures that the activeOption is cleared when the input doesn't match any option.\n // This behavior is specific to a freeform TimePicker where the input value is treated as a valid time even if it's not in the dropdown.\n React.useEffect(()=>{\n if (freeform && value) {\n const activeOption = getActiveOption();\n if (!activeOption) {\n return;\n }\n const valueMatchesActiveOption = activeOption.text.toLowerCase().indexOf(value.toLowerCase()) === 0;\n if (!valueMatchesActiveOption) {\n activeDescendantController.blur();\n }\n }\n }, [\n freeform,\n value,\n activeDescendantController,\n getActiveOption\n ]);\n const selectTimeFromValue = useEventCallback((e)=>{\n if (!freeform) {\n return;\n }\n const { date: selectedTime, errorType } = parseTimeStringToDate(value);\n // Only triggers callback when the text in input has changed.\n if (submittedText !== value) {\n callback === null || callback === void 0 ? void 0 : callback(e, {\n selectedTime,\n selectedTimeText: value,\n errorType\n });\n }\n });\n const handleKeyDown = useEventCallback((e)=>{\n const activeOption = getActiveOption();\n if (!activeOption && e.key === Enter) {\n selectTimeFromValue(e);\n }\n });\n state.root.onKeyDown = mergeCallbacks(handleKeyDown, state.root.onKeyDown);\n const rootRef = React.useRef(null);\n state.root.ref = useMergedRefs(state.root.ref, rootRef);\n if (state.listbox) {\n state.listbox.tabIndex = -1; // allows it to be the relatedTarget of a blur event.\n }\n if (state.expandIcon) {\n state.expandIcon.tabIndex = -1; // allows it to be the relatedTarget of a blur event.\n }\n const handleInputBlur = useEventCallback((e)=>{\n const isOutside = e.relatedTarget ? !elementContains(rootRef.current, e.relatedTarget) : true;\n if (isOutside) {\n selectTimeFromValue(e);\n }\n });\n state.input.onBlur = mergeCallbacks(handleInputBlur, state.input.onBlur);\n};\n/**\n * Provides a default aria-labelledby for the chevron icon if the TimePicker is wrapped in a Field.\n */ const useDefaultChevronIconLabel = (state)=>{\n var _state_expandIcon;\n const fieldContext = useFieldContext();\n const chevronDefaultId = useId('timepicker-chevron-');\n const defaultLabelFromCombobox = 'Open';\n if ((fieldContext === null || fieldContext === void 0 ? void 0 : fieldContext.labelId) && ((_state_expandIcon = state.expandIcon) === null || _state_expandIcon === void 0 ? void 0 : _state_expandIcon['aria-label']) === defaultLabelFromCombobox) {\n var _state_expandIcon_id;\n const chevronId = (_state_expandIcon_id = state.expandIcon.id) !== null && _state_expandIcon_id !== void 0 ? _state_expandIcon_id : chevronDefaultId;\n state.expandIcon['aria-labelledby'] = `${chevronId} ${fieldContext.labelId}`;\n }\n};\n"],"names":["useTimePicker_unstable","props","ref","dateAnchor","dateAnchorInProps","defaultSelectedTime","defaultSelectedTimeInProps","endHour","formatDateToTimeString","defaultFormatDateToTimeString","hourCycle","increment","onTimeChange","selectedTime","selectedTimeInProps","showSeconds","startHour","parseTimeStringToDate","parseTimeStringToDateInProps","rest","freeform","_ref","dateStartAnchor","dateEndAnchor","useStableDateAnchor","options","React","useMemo","getTimesBetween","map","time","date","key","dateToKey","text","setSelectedTime","useControllableState","state","defaultState","initialState","submittedText","setSubmittedText","useState","undefined","selectTime","useEventCallback","e","data","selectedTimeText","selectedOptions","selectedTimeKey","selectedOption","find","handleOptionSelect","optionValue","_data_optionValue","timeSelectionData","keyToDate","optionText","errorType","baseState","useCombobox_unstable","autoComplete","onOptionSelect","children","createElement","Option","value","defaultParseTimeStringToDate","useCallback","getDateFromTimeString","useDefaultChevronIconLabel","useSelectTimeFromValue","providedDate","fallbackDateAnchor","Date","providedDateKey","getDateStartAnchor","getDateEndAnchor","callback","getOptionById","activeDescendantController","getActiveOption","activeOptionId","active","useEffect","activeOption","valueMatchesActiveOption","toLowerCase","indexOf","blur","selectTimeFromValue","handleKeyDown","Enter","root","onKeyDown","mergeCallbacks","rootRef","useRef","useMergedRefs","listbox","tabIndex","expandIcon","handleInputBlur","isOutside","relatedTarget","elementContains","current","input","onBlur","_state_expandIcon","fieldContext","useFieldContext","chevronDefaultId","useId","defaultLabelFromCombobox","labelId","_state_expandIcon_id","chevronId","id"],"mappings":";;;;+BAciBA;;;eAAAA;;;;iEAdM;gCACuF;8BACxF;+BACuB;4BACe;0BACgH;AASjK,MAAMA,yBAAyB,CAACC,OAAOC;IAC9C,MAAM,EAAEC,YAAYC,iBAAiB,EAAEC,qBAAqBC,0BAA0B,EAAEC,UAAU,EAAE,EAAEC,yBAAyBC,gCAA6B,EAAEC,SAAS,EAAEC,YAAY,EAAE,EAAEC,YAAY,EAAEC,cAAcC,mBAAmB,EAAEC,cAAc,KAAK,EAAEC,YAAY,CAAC,EAAEC,uBAAuBC,4BAA4B,EAAE,GAAGC,MAAM,GAAGlB;IAC/U,MAAM,EAAEmB,WAAW,KAAK,EAAE,GAAGD;IAC7B,IAAIE;IACJ,MAAM,EAAEC,eAAe,EAAEC,aAAa,EAAE,GAAGC,oBAAoB,AAACH,CAAAA,OAAOjB,sBAAsB,QAAQA,sBAAsB,KAAK,IAAIA,oBAAoBU,mBAAkB,MAAO,QAAQO,SAAS,KAAK,IAAIA,OAAOf,4BAA4BU,WAAWT;IACzP,MAAMkB,UAAUC,OAAMC,OAAO,CAAC,IAAIC,IAAAA,yBAAe,EAACN,iBAAiBC,eAAeZ,WAAWkB,GAAG,CAAC,CAACC,OAAQ,CAAA;gBAC9FC,MAAMD;gBACNE,KAAKC,IAAAA,mBAAS,EAACH;gBACfI,MAAM1B,uBAAuBsB,MAAM;oBAC/Bf;oBACAL;gBACJ;YACJ,CAAA,IAAK;QACTa;QACAD;QACAd;QACAE;QACAC;QACAI;KACH;IACD,MAAM,CAACF,cAAcsB,gBAAgB,GAAGC,IAAAA,oCAAoB,EAAC;QACzDC,OAAOvB;QACPwB,cAAchC;QACdiC,cAAc;IAClB;IACA,MAAM,CAACC,eAAeC,iBAAiB,GAAGf,OAAMgB,QAAQ,CAACC;IACzD,MAAMC,aAAaC,IAAAA,gCAAgB,EAAC,CAACC,GAAGC;QACpCZ,gBAAgBY,KAAKlC,YAAY;QACjC4B,iBAAiBM,KAAKC,gBAAgB;QACtCpC,iBAAiB,QAAQA,iBAAiB,KAAK,IAAI,KAAK,IAAIA,aAAakC,GAAGC;IAChF;IACA,MAAME,kBAAkBvB,OAAMC,OAAO,CAAC;QAClC,MAAMuB,kBAAkBjB,IAAAA,mBAAS,EAACpB;QAClC,MAAMsC,iBAAiB1B,QAAQ2B,IAAI,CAAC,CAACrB,OAAOA,KAAKC,GAAG,KAAKkB;QACzD,OAAOC,iBAAiB;YACpBA,eAAenB,GAAG;SACrB,GAAG,EAAE;IACV,GAAG;QACCP;QACAZ;KACH;IACD,MAAMwC,qBAAqBR,IAAAA,gCAAgB,EAAC,CAACC,GAAGC;QAC5C,IAAI3B,YAAY2B,KAAKO,WAAW,KAAKX,WAAW;YAC5C,qHAAqH;YACrH;QACJ;QACA,IAAIY;QACJ,MAAMC,oBAAoB;YACtB3C,cAAc4C,IAAAA,mBAAS,EAAC,AAACF,CAAAA,oBAAoBR,KAAKO,WAAW,AAAD,MAAO,QAAQC,sBAAsB,KAAK,IAAIA,oBAAoB;YAC9HP,kBAAkBD,KAAKW,UAAU;YACjCC,WAAWhB;QACf;QACAC,WAAWE,GAAGU;IAClB;IACA,MAAMI,YAAYC,IAAAA,mCAAoB,EAAC;QACnCC,cAAc;QACd,GAAG3C,IAAI;QACP8B;QACAc,gBAAgBV;QAChBW,UAAUvC,QAAQI,GAAG,CAAC,CAACE,OAAO,WAAW,GAAGL,OAAMuC,aAAa,CAACC,qBAAM,EAAE;gBAChElC,KAAKD,KAAKC,GAAG;gBACbmC,OAAOpC,KAAKC,GAAG;YACnB,GAAGD,KAAKG,IAAI;IACpB,GAAGhC;IACH,MAAMkE,+BAA+B1C,OAAM2C,WAAW,CAAC,CAACvC,OAAOwC,IAAAA,+BAAqB,EAACxC,MAAMR,iBAAiBC,eAAe;YACnHb;YACAK;QACJ,IAAI;QACJQ;QACAD;QACAZ;QACAK;KACH;IACD,MAAMsB,QAAQ;QACV,GAAGuB,SAAS;QACZxC;QACAH,uBAAuBC,iCAAiC,QAAQA,iCAAiC,KAAK,IAAIA,+BAA+BkD;QACzI5B;IACJ;IACA+B,2BAA2BlC;IAC3BmC,uBAAuBnC,OAAOO;IAC9B,OAAOP;AACX;AACA;;;CAGC,GAAG,MAAMb,sBAAsB,CAACiD,cAAczD,WAAWT;IACtD,MAAM,CAACmE,mBAAmB,GAAGhD,OAAMgB,QAAQ,CAAC,IAAI,IAAIiC;IACpD,MAAMC,kBAAkB3C,IAAAA,mBAAS,EAACwC,iBAAiB,QAAQA,iBAAiB,KAAK,IAAIA,eAAe;IACpG,OAAO/C,OAAMC,OAAO,CAAC;QACjB,MAAMxB,aAAasE,iBAAiB,QAAQA,iBAAiB,KAAK,IAAIA,eAAeC;QACrF,MAAMpD,kBAAkBuD,IAAAA,4BAAkB,EAAC1E,YAAYa;QACvD,MAAMO,gBAAgBuD,IAAAA,0BAAgB,EAAC3E,YAAYa,WAAWT;QAC9D,OAAO;YACHe;YACAC;QACJ;IACJ,gNAAgN;IAChN,uDAAuD;IACvD,GAAG;QACChB;QACAmE;QACAE;QACA5D;KACH;AACL;AACA;;;;;CAKC,GAAG,MAAMwD,yBAAyB,CAACnC,OAAO0C;IACvC,MAAM,EAAEC,aAAa,EAAE5D,QAAQ,EAAEH,qBAAqB,EAAEuB,aAAa,EAAE2B,KAAK,EAAEc,0BAA0B,EAAE,GAAG5C;IAC7G,MAAM6C,kBAAkBxD,OAAM2C,WAAW,CAAC;QACtC,MAAMc,iBAAiBF,2BAA2BG,MAAM;QACxD,OAAOD,iBAAiBH,cAAcG,kBAAkB;IAC5D,GAAG;QACCF;QACAD;KACH;IACD,yIAAyI;IACzI,gGAAgG;IAChG,wIAAwI;IACxItD,OAAM2D,SAAS,CAAC;QACZ,IAAIjE,YAAY+C,OAAO;YACnB,MAAMmB,eAAeJ;YACrB,IAAI,CAACI,cAAc;gBACf;YACJ;YACA,MAAMC,2BAA2BD,aAAapD,IAAI,CAACsD,WAAW,GAAGC,OAAO,CAACtB,MAAMqB,WAAW,QAAQ;YAClG,IAAI,CAACD,0BAA0B;gBAC3BN,2BAA2BS,IAAI;YACnC;QACJ;IACJ,GAAG;QACCtE;QACA+C;QACAc;QACAC;KACH;IACD,MAAMS,sBAAsB9C,IAAAA,gCAAgB,EAAC,CAACC;QAC1C,IAAI,CAAC1B,UAAU;YACX;QACJ;QACA,MAAM,EAAEW,MAAMlB,YAAY,EAAE8C,SAAS,EAAE,GAAG1C,sBAAsBkD;QAChE,6DAA6D;QAC7D,IAAI3B,kBAAkB2B,OAAO;YACzBY,aAAa,QAAQA,aAAa,KAAK,IAAI,KAAK,IAAIA,SAASjC,GAAG;gBAC5DjC;gBACAmC,kBAAkBmB;gBAClBR;YACJ;QACJ;IACJ;IACA,MAAMiC,gBAAgB/C,IAAAA,gCAAgB,EAAC,CAACC;QACpC,MAAMwC,eAAeJ;QACrB,IAAI,CAACI,gBAAgBxC,EAAEd,GAAG,KAAK6D,mBAAK,EAAE;YAClCF,oBAAoB7C;QACxB;IACJ;IACAT,MAAMyD,IAAI,CAACC,SAAS,GAAGC,IAAAA,8BAAc,EAACJ,eAAevD,MAAMyD,IAAI,CAACC,SAAS;IACzE,MAAME,UAAUvE,OAAMwE,MAAM,CAAC;IAC7B7D,MAAMyD,IAAI,CAAC5F,GAAG,GAAGiG,IAAAA,6BAAa,EAAC9D,MAAMyD,IAAI,CAAC5F,GAAG,EAAE+F;IAC/C,IAAI5D,MAAM+D,OAAO,EAAE;QACf/D,MAAM+D,OAAO,CAACC,QAAQ,GAAG,CAAC,GAAG,qDAAqD;IACtF;IACA,IAAIhE,MAAMiE,UAAU,EAAE;QAClBjE,MAAMiE,UAAU,CAACD,QAAQ,GAAG,CAAC,GAAG,qDAAqD;IACzF;IACA,MAAME,kBAAkB1D,IAAAA,gCAAgB,EAAC,CAACC;QACtC,MAAM0D,YAAY1D,EAAE2D,aAAa,GAAG,CAACC,IAAAA,+BAAe,EAACT,QAAQU,OAAO,EAAE7D,EAAE2D,aAAa,IAAI;QACzF,IAAID,WAAW;YACXb,oBAAoB7C;QACxB;IACJ;IACAT,MAAMuE,KAAK,CAACC,MAAM,GAAGb,IAAAA,8BAAc,EAACO,iBAAiBlE,MAAMuE,KAAK,CAACC,MAAM;AAC3E;AACA;;CAEC,GAAG,MAAMtC,6BAA6B,CAAClC;IACpC,IAAIyE;IACJ,MAAMC,eAAeC,IAAAA,oCAAe;IACpC,MAAMC,mBAAmBC,IAAAA,qBAAK,EAAC;IAC/B,MAAMC,2BAA2B;IACjC,IAAI,AAACJ,CAAAA,iBAAiB,QAAQA,iBAAiB,KAAK,IAAI,KAAK,IAAIA,aAAaK,OAAO,AAAD,KAAM,AAAC,CAAA,AAACN,CAAAA,oBAAoBzE,MAAMiE,UAAU,AAAD,MAAO,QAAQQ,sBAAsB,KAAK,IAAI,KAAK,IAAIA,iBAAiB,CAAC,aAAa,AAAD,MAAOK,0BAA0B;QACjP,IAAIE;QACJ,MAAMC,YAAY,AAACD,CAAAA,uBAAuBhF,MAAMiE,UAAU,CAACiB,EAAE,AAAD,MAAO,QAAQF,yBAAyB,KAAK,IAAIA,uBAAuBJ;QACpI5E,MAAMiE,UAAU,CAAC,kBAAkB,GAAG,CAAC,EAAEgB,UAAU,CAAC,EAAEP,aAAaK,OAAO,CAAC,CAAC;IAChF;AACJ"}
1
+ {"version":3,"sources":["useTimePicker.js"],"sourcesContent":["import * as React from 'react';\nimport { elementContains, mergeCallbacks, useControllableState, useEventCallback, useId, useMergedRefs } from '@fluentui/react-utilities';\nimport { Enter } from '@fluentui/keyboard-keys';\nimport { useCombobox_unstable, Option } from '@fluentui/react-combobox';\nimport { useFieldContext_unstable as useFieldContext } from '@fluentui/react-field';\nimport { dateToKey, keyToDate, formatDateToTimeString as defaultFormatDateToTimeString, getDateStartAnchor, getDateEndAnchor, getTimesBetween, getDateFromTimeString } from './timeMath';\n/**\n * Create the state required to render TimePicker.\n *\n * The returned state can be modified with hooks such as useTimePickerStyles_unstable,\n * before being passed to renderTimePicker_unstable.\n *\n * @param props - props from this instance of TimePicker\n * @param ref - reference to root HTMLElement of TimePicker\n */ export const useTimePicker_unstable = (props, ref)=>{\n var _baseState_clearIcon;\n const { dateAnchor: dateAnchorInProps, defaultSelectedTime: defaultSelectedTimeInProps, endHour = 24, formatDateToTimeString = defaultFormatDateToTimeString, hourCycle, increment = 30, onTimeChange, selectedTime: selectedTimeInProps, showSeconds = false, startHour = 0, parseTimeStringToDate: parseTimeStringToDateInProps, ...rest } = props;\n const { freeform = false } = rest;\n var _ref;\n const { dateStartAnchor, dateEndAnchor } = useStableDateAnchor((_ref = dateAnchorInProps !== null && dateAnchorInProps !== void 0 ? dateAnchorInProps : selectedTimeInProps) !== null && _ref !== void 0 ? _ref : defaultSelectedTimeInProps, startHour, endHour);\n const options = React.useMemo(()=>getTimesBetween(dateStartAnchor, dateEndAnchor, increment).map((time)=>({\n date: time,\n key: dateToKey(time),\n text: formatDateToTimeString(time, {\n showSeconds,\n hourCycle\n })\n })), [\n dateEndAnchor,\n dateStartAnchor,\n formatDateToTimeString,\n hourCycle,\n increment,\n showSeconds\n ]);\n const [selectedTime, setSelectedTime] = useControllableState({\n state: selectedTimeInProps,\n defaultState: defaultSelectedTimeInProps,\n initialState: null\n });\n const [submittedText, setSubmittedText] = React.useState(undefined);\n const selectTime = useEventCallback((e, data)=>{\n setSelectedTime(data.selectedTime);\n setSubmittedText(data.selectedTimeText);\n onTimeChange === null || onTimeChange === void 0 ? void 0 : onTimeChange(e, data);\n });\n const selectedOptions = React.useMemo(()=>{\n const selectedTimeKey = dateToKey(selectedTime);\n const selectedOption = options.find((date)=>date.key === selectedTimeKey);\n return selectedOption ? [\n selectedOption.key\n ] : [];\n }, [\n options,\n selectedTime\n ]);\n const clearIconRef = React.useRef(null);\n const handleOptionSelect = useEventCallback((e, data)=>{\n if (freeform && data.optionValue === undefined && !(rest.clearable && e.type === 'click' && e.currentTarget === clearIconRef.current)) {\n // Combobox clears selection when input value not matching any option; but we allow this case in freeform TimePicker.\n return;\n }\n var _data_optionValue;\n const timeSelectionData = {\n selectedTime: keyToDate((_data_optionValue = data.optionValue) !== null && _data_optionValue !== void 0 ? _data_optionValue : ''),\n selectedTimeText: data.optionText,\n errorType: undefined\n };\n selectTime(e, timeSelectionData);\n });\n const baseState = useCombobox_unstable({\n autoComplete: 'off',\n ...rest,\n selectedOptions,\n onOptionSelect: handleOptionSelect,\n children: options.map((date)=>/*#__PURE__*/ React.createElement(Option, {\n key: date.key,\n value: date.key\n }, date.text))\n }, ref);\n const defaultParseTimeStringToDate = React.useCallback((time)=>getDateFromTimeString(time, dateStartAnchor, dateEndAnchor, {\n hourCycle,\n showSeconds\n }), [\n dateEndAnchor,\n dateStartAnchor,\n hourCycle,\n showSeconds\n ]);\n const mergedClearIconRef = useMergedRefs((_baseState_clearIcon = baseState.clearIcon) === null || _baseState_clearIcon === void 0 ? void 0 : _baseState_clearIcon.ref, clearIconRef);\n const state = {\n ...baseState,\n clearIcon: baseState.clearIcon ? {\n ...baseState.clearIcon,\n ref: mergedClearIconRef\n } : undefined,\n freeform,\n parseTimeStringToDate: parseTimeStringToDateInProps !== null && parseTimeStringToDateInProps !== void 0 ? parseTimeStringToDateInProps : defaultParseTimeStringToDate,\n submittedText\n };\n useDefaultChevronIconLabel(state);\n useSelectTimeFromValue(state, selectTime);\n return state;\n};\n/**\n * Provides stable start and end date anchors based on the provided date and time parameters.\n * The hook ensures that the memoization remains consistent even if new Date objects representing the same date are provided.\n */ const useStableDateAnchor = (providedDate, startHour, endHour)=>{\n const [fallbackDateAnchor] = React.useState(()=>new Date());\n const providedDateKey = dateToKey(providedDate !== null && providedDate !== void 0 ? providedDate : null);\n return React.useMemo(()=>{\n const dateAnchor = providedDate !== null && providedDate !== void 0 ? providedDate : fallbackDateAnchor;\n const dateStartAnchor = getDateStartAnchor(dateAnchor, startHour);\n const dateEndAnchor = getDateEndAnchor(dateAnchor, startHour, endHour);\n return {\n dateStartAnchor,\n dateEndAnchor\n };\n // `providedDate`'s stable key representation is used as dependency instead of the Date object. This ensures that the memoization remains stable when a new Date object representing the same date is passed in.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n endHour,\n fallbackDateAnchor,\n providedDateKey,\n startHour\n ]);\n};\n/**\n * Mimics the behavior of the browser's change event for a freeform TimePicker.\n * The provided callback is called when input changed and:\n * - Enter/Tab key is pressed on the input.\n * - TimePicker loses focus, signifying a possible change.\n */ const useSelectTimeFromValue = (state, callback)=>{\n const { getOptionById, freeform, parseTimeStringToDate, submittedText, value, activeDescendantController } = state;\n const getActiveOption = React.useCallback(()=>{\n const activeOptionId = activeDescendantController.active();\n return activeOptionId ? getOptionById(activeOptionId) : null;\n }, [\n activeDescendantController,\n getOptionById\n ]);\n // Base Combobox has activeOption default to first option in dropdown even if it doesn't match input value, and Enter key will select it.\n // This effect ensures that the activeOption is cleared when the input doesn't match any option.\n // This behavior is specific to a freeform TimePicker where the input value is treated as a valid time even if it's not in the dropdown.\n React.useEffect(()=>{\n if (freeform && value) {\n const activeOption = getActiveOption();\n if (!activeOption) {\n return;\n }\n const valueMatchesActiveOption = activeOption.text.toLowerCase().indexOf(value.toLowerCase()) === 0;\n if (!valueMatchesActiveOption) {\n activeDescendantController.blur();\n }\n }\n }, [\n freeform,\n value,\n activeDescendantController,\n getActiveOption\n ]);\n const selectTimeFromValue = useEventCallback((e)=>{\n if (!freeform) {\n return;\n }\n const { date: selectedTime, errorType } = parseTimeStringToDate(value);\n // Only triggers callback when the text in input has changed.\n if (submittedText !== value) {\n callback === null || callback === void 0 ? void 0 : callback(e, {\n selectedTime,\n selectedTimeText: value,\n errorType\n });\n }\n });\n const handleKeyDown = useEventCallback((e)=>{\n const activeOption = getActiveOption();\n if (!activeOption && e.key === Enter) {\n selectTimeFromValue(e);\n }\n });\n state.root.onKeyDown = mergeCallbacks(handleKeyDown, state.root.onKeyDown);\n const rootRef = React.useRef(null);\n state.root.ref = useMergedRefs(state.root.ref, rootRef);\n if (state.listbox) {\n state.listbox.tabIndex = -1; // allows it to be the relatedTarget of a blur event.\n }\n if (state.expandIcon) {\n state.expandIcon.tabIndex = -1; // allows it to be the relatedTarget of a blur event.\n }\n const handleInputBlur = useEventCallback((e)=>{\n const isOutside = e.relatedTarget ? !elementContains(rootRef.current, e.relatedTarget) : true;\n if (isOutside) {\n selectTimeFromValue(e);\n }\n });\n state.input.onBlur = mergeCallbacks(handleInputBlur, state.input.onBlur);\n};\n/**\n * Provides a default aria-labelledby for the chevron icon if the TimePicker is wrapped in a Field.\n */ const useDefaultChevronIconLabel = (state)=>{\n var _state_expandIcon;\n const fieldContext = useFieldContext();\n const chevronDefaultId = useId('timepicker-chevron-');\n const defaultLabelFromCombobox = 'Open';\n if ((fieldContext === null || fieldContext === void 0 ? void 0 : fieldContext.labelId) && ((_state_expandIcon = state.expandIcon) === null || _state_expandIcon === void 0 ? void 0 : _state_expandIcon['aria-label']) === defaultLabelFromCombobox) {\n var _state_expandIcon_id;\n const chevronId = (_state_expandIcon_id = state.expandIcon.id) !== null && _state_expandIcon_id !== void 0 ? _state_expandIcon_id : chevronDefaultId;\n state.expandIcon['aria-labelledby'] = `${chevronId} ${fieldContext.labelId}`;\n }\n};\n"],"names":["useTimePicker_unstable","props","ref","_baseState_clearIcon","dateAnchor","dateAnchorInProps","defaultSelectedTime","defaultSelectedTimeInProps","endHour","formatDateToTimeString","defaultFormatDateToTimeString","hourCycle","increment","onTimeChange","selectedTime","selectedTimeInProps","showSeconds","startHour","parseTimeStringToDate","parseTimeStringToDateInProps","rest","freeform","_ref","dateStartAnchor","dateEndAnchor","useStableDateAnchor","options","React","useMemo","getTimesBetween","map","time","date","key","dateToKey","text","setSelectedTime","useControllableState","state","defaultState","initialState","submittedText","setSubmittedText","useState","undefined","selectTime","useEventCallback","e","data","selectedTimeText","selectedOptions","selectedTimeKey","selectedOption","find","clearIconRef","useRef","handleOptionSelect","optionValue","clearable","type","currentTarget","current","_data_optionValue","timeSelectionData","keyToDate","optionText","errorType","baseState","useCombobox_unstable","autoComplete","onOptionSelect","children","createElement","Option","value","defaultParseTimeStringToDate","useCallback","getDateFromTimeString","mergedClearIconRef","useMergedRefs","clearIcon","useDefaultChevronIconLabel","useSelectTimeFromValue","providedDate","fallbackDateAnchor","Date","providedDateKey","getDateStartAnchor","getDateEndAnchor","callback","getOptionById","activeDescendantController","getActiveOption","activeOptionId","active","useEffect","activeOption","valueMatchesActiveOption","toLowerCase","indexOf","blur","selectTimeFromValue","handleKeyDown","Enter","root","onKeyDown","mergeCallbacks","rootRef","listbox","tabIndex","expandIcon","handleInputBlur","isOutside","relatedTarget","elementContains","input","onBlur","_state_expandIcon","fieldContext","useFieldContext","chevronDefaultId","useId","defaultLabelFromCombobox","labelId","_state_expandIcon_id","chevronId","id"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluentui/react-timepicker-compat",
3
- "version": "0.2.16",
3
+ "version": "0.2.18",
4
4
  "description": "Fluent UI TimePicker Compat Component",
5
5
  "main": "lib-commonjs/index.js",
6
6
  "module": "lib/index.js",
@@ -26,12 +26,13 @@
26
26
  "generate-api": "just-scripts generate-api",
27
27
  "lint": "just-scripts lint",
28
28
  "start": "yarn storybook",
29
- "storybook": "start-storybook",
29
+ "storybook": "yarn --cwd ../stories storybook",
30
30
  "test": "jest --passWithNoTests",
31
- "test-ssr": "test-ssr \"./stories/**/*.stories.tsx\"",
32
- "type-check": "tsc -b tsconfig.json"
31
+ "type-check": "just-scripts type-check"
33
32
  },
34
33
  "devDependencies": {
34
+ "@fluentui/react-provider": "*",
35
+ "@fluentui/react-components": "*",
35
36
  "@fluentui/eslint-plugin": "*",
36
37
  "@fluentui/react-conformance": "*",
37
38
  "@fluentui/react-conformance-griffel": "*",
@@ -40,12 +41,12 @@
40
41
  },
41
42
  "dependencies": {
42
43
  "@fluentui/keyboard-keys": "^9.0.7",
43
- "@fluentui/react-combobox": "^9.11.6",
44
- "@fluentui/react-field": "^9.1.66",
45
- "@fluentui/react-jsx-runtime": "^9.0.38",
44
+ "@fluentui/react-combobox": "^9.11.7",
45
+ "@fluentui/react-field": "^9.1.67",
46
+ "@fluentui/react-jsx-runtime": "^9.0.39",
46
47
  "@fluentui/react-shared-contexts": "^9.19.0",
47
48
  "@fluentui/react-theme": "^9.1.19",
48
- "@fluentui/react-utilities": "^9.18.9",
49
+ "@fluentui/react-utilities": "^9.18.10",
49
50
  "@griffel/react": "^1.5.22",
50
51
  "@swc/helpers": "^0.5.1"
51
52
  },