@entur/datepicker 9.1.5 → 9.1.6

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.
@@ -66,21 +66,12 @@ export type DatePickerProps<DateType extends DateValue> = {
66
66
  navigationDescription?: string;
67
67
  /** Tvinger typen på onChange til den gitte typen.
68
68
  * Dette er nyttig når utgangsverdien din er 'null', men du ønsker at
69
- * DatePicker f.eks alltid skal returnere en ZonedDateTime.
69
+ * DatePicker alltid skal returnere f.eks ZonedDateTime.
70
70
  *
71
- * @default undefined (onChange returnerer DateValue bassertvalue, og om tid vises eller ikke)
71
+ * Som standard returnerer onChange DateValue basertselectedDate,
72
+ * eller CalendarDate hvis selectedDate er 'null'.
72
73
  *
73
- * Hvorfor er dette nødvendig?
74
- * I utgangspunktet vil en DatePicker som initieres med 'null' som verdi og ikke viser tid returnere en CalendarDate.
75
- * Dette er problematisk hvis du bruker datovelgeren sammen en TimePicker da
76
- * denne ikke støtter dato uten tidspunkt (CalendarDate). Ved å da tvinge DatePicker til å returnere
77
- * CalendarDateTime eller ZonedDateTime vil du kunne bruke den sammen med TimePicker.
78
- *
79
- * Hvorfor kan ikke dette gjøres automatisk?
80
- * En DatePicker som initieres med 'null' som verdi gir ingen informasjon om hvilken type man ønsker å returnere.
81
- * DatePicker støtter dog at du kan sende med en TypeScript-type, men TypeScript eksisterer ikke i runtime og
82
- * kan derfor ikke brukes til å bestemme hvilken type som skal returneres. Det er derfor nødvendig å enten gi
83
- * en initiell 'selectedDate' eller tvinge typen med denne prop-en.
74
+ * @default undefined
84
75
  */
85
76
  forcedReturnType?: 'CalendarDate' | 'CalendarDateTime' | 'ZonedDateTime';
86
77
  /** Ekstra klassenavn */
@@ -9,8 +9,11 @@ export type TimePickerProps<TimeType extends TimeValue> = {
9
9
  onChange: (value: MappedTimeValue<TimeType> | null) => void;
10
10
  /** Label til TimePicker */
11
11
  label: string;
12
- /** Minutter som legges til eller trekkes fra ved klikk på pilene i TimePicker
13
- * @default 30
12
+ /** Minutter som legges til eller trekkes fra ved klikk på pilene i TimePicker.
13
+ * Rundes av til nærmeste hele 'minuteIncrement' som går opp i 60.
14
+ *
15
+ * OBS: Støtter kun verdier <= 60 og multiplum av 60.
16
+ * @default 30
14
17
  */
15
18
  minuteIncrementForArrowButtons?: number;
16
19
  /** BCP47-språkkoden til locale-en du ønsker å bruke.
@@ -21,6 +24,10 @@ export type TimePickerProps<TimeType extends TimeValue> = {
21
24
  * @default false
22
25
  */
23
26
  showTimeZone?: boolean;
27
+ /** Viser sekunder i tillegg til minutter og timer
28
+ * @default false
29
+ */
30
+ showSeconds?: boolean;
24
31
  /** Aria-label for venstrepil-knappen som trekker fra tid
25
32
  * @default `Trekk fra ${minuteIncrementForArrowButtons} minutter`
26
33
  */
@@ -36,8 +43,19 @@ export type TimePickerProps<TimeType extends TimeValue> = {
36
43
  labelTooltip?: React.ReactNode;
37
44
  disabled?: boolean;
38
45
  inputRef?: React.ForwardedRef<HTMLDivElement>;
46
+ /** Tvinger typen på onChange til den gitte typen.
47
+ * Dette er nyttig når utgangsverdien din er 'null', men du ønsker at
48
+ * TimePicker alltid skal returnere f.eks Time.
49
+ *
50
+ * Som standard returnerer onChange TimeValue basert på selectedTime,
51
+ * eller ZonedDateTime hvis selectedTime er 'null'.
52
+ *
53
+ * @default undefined
54
+ */
55
+ forcedReturnType?: 'Time' | 'CalendarDateTime' | 'ZonedDateTime';
56
+ forcedTimeZone?: string;
39
57
  /** Ekstra klassenavn */
40
58
  className?: string;
41
59
  style?: React.CSSProperties;
42
60
  } & Omit<AriaTimeFieldProps<TimeType>, 'value' | 'onChange' | 'label' | 'hideTimeZone' | 'placeholder' | 'minValue' | 'maxValue'>;
43
- export declare const TimePicker: <TimeType extends TimeValue>({ selectedTime, onChange, disabled, className, style, label, labelTooltip, feedback, variant, locale: customLocale, showTimeZone, minuteIncrementForArrowButtons, leftArrowButtonAriaLabel, rightArrowButtonAriaLabel, inputRef, ...rest }: TimePickerProps<TimeType>) => React.JSX.Element;
61
+ export declare const TimePicker: <TimeType extends TimeValue>({ selectedTime, onChange, disabled, className, style, label, labelTooltip, feedback, granularity, variant, locale: customLocale, showTimeZone, showSeconds, minuteIncrementForArrowButtons, leftArrowButtonAriaLabel, rightArrowButtonAriaLabel, inputRef, forcedReturnType, forcedTimeZone, ...rest }: TimePickerProps<TimeType>) => React.JSX.Element;
@@ -1,6 +1,10 @@
1
1
  import React from 'react';
2
2
  type TimePickerArrowButtonProps = {
3
3
  direction: 'left' | 'right';
4
- } & React.DetailedHTMLProps<React.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>;
5
- export declare const TimePickerArrowButton: React.FC<TimePickerArrowButtonProps>;
4
+ disabled?: boolean;
5
+ 'aria-label': string;
6
+ onClick?: () => void;
7
+ onFocus?: () => void;
8
+ };
9
+ export declare const TimePickerArrowButton: ({ direction, onClick, disabled, "aria-label": ariaLabel, ...rest }: TimePickerArrowButtonProps) => React.JSX.Element;
6
10
  export {};
@@ -48,9 +48,11 @@ function _objectWithoutPropertiesLoose(source, excluded) {
48
48
  return target;
49
49
  }
50
50
 
51
+ var _excluded$b = ["segment", "state"];
51
52
  var FieldSegment = function FieldSegment(_ref) {
52
53
  var segment = _ref.segment,
53
- state = _ref.state;
54
+ state = _ref.state,
55
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$b);
54
56
  var ref = React.useRef(null);
55
57
  var _useDateSegment = datepicker.useDateSegment(segment, state, ref),
56
58
  segmentProps = _useDateSegment.segmentProps;
@@ -61,7 +63,7 @@ var FieldSegment = function FieldSegment(_ref) {
61
63
  'eds-date-and-time-field__segment--dot-separator': segment.text === '.'
62
64
  }),
63
65
  tabIndex: state.isDisabled ? -1 : segmentProps.tabIndex
64
- }), segment.text);
66
+ }, rest), segment.text);
65
67
  };
66
68
 
67
69
  var nativeDateToDateTime = function nativeDateToDateTime(date$1, timeZone, offset) {
@@ -157,21 +159,46 @@ var lastMillisecondOfDay = function lastMillisecondOfDay(dateValue) {
157
159
  };
158
160
  var convertValueToType = function convertValueToType(_ref) {
159
161
  var value = _ref.value,
160
- type = _ref.type;
162
+ type = _ref.type,
163
+ _ref$timezone = _ref.timezone,
164
+ timezone = _ref$timezone === void 0 ? 'Europe/Oslo' : _ref$timezone;
161
165
  if (value === null) return null;
162
166
  switch (type) {
163
167
  case 'CalendarDate':
168
+ if (!('day' in value)) return date.today(timezone);
164
169
  return date.toCalendarDate(value);
165
170
  case 'CalendarDateTime':
171
+ if (!('day' in value)) return date.toCalendarDateTime(date.today(timezone), value);
166
172
  return date.toCalendarDateTime(value);
167
173
  case 'ZonedDateTime':
168
- return date.toZoned(value, 'Europe/Oslo');
174
+ if (!('day' in value)) return date.toZoned(date.toCalendarDateTime(date.today(timezone), value), timezone);
175
+ return date.toZoned(value, timezone);
176
+ case 'Time':
177
+ if (!('hour' in value)) return date.toTime(date.now(timezone));
178
+ if (!('day' in value)) return value;
179
+ return date.toTime(value);
169
180
  default:
170
181
  return value;
171
182
  }
172
183
  };
184
+ var modulo = function modulo(a, b) {
185
+ return (a % b + b) % b;
186
+ };
187
+ var focusSegment = function focusSegment(ref, segment) {
188
+ if (ref.current) {
189
+ var segments = ref.current.querySelectorAll('.eds-date-and-time-field__segment');
190
+ var firstSegment = segments[0];
191
+ var lastSegment = segments[segments.length - 1];
192
+ switch (segment) {
193
+ case 'first':
194
+ return firstSegment.focus();
195
+ case 'last':
196
+ return lastSegment.focus();
197
+ }
198
+ }
199
+ };
173
200
 
174
- var _excluded$9 = ["selectedDate", "onChange", "label", "locale", "showTimeZone", "showTime", "granularity", "disabled", "isDisabled", "variant", "feedback", "validationVariant", "validationFeedback", "labelTooltip", "minDate", "maxDate", "style", "className", "labelProps", "append"];
201
+ var _excluded$a = ["selectedDate", "onChange", "label", "locale", "showTimeZone", "showTime", "granularity", "disabled", "isDisabled", "variant", "feedback", "validationVariant", "validationFeedback", "labelTooltip", "minDate", "maxDate", "style", "className", "labelProps", "append"];
175
202
  var DateField = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
176
203
  var selectedDate = _ref.selectedDate,
177
204
  onChange = _ref.onChange,
@@ -196,7 +223,7 @@ var DateField = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
196
223
  className = _ref.className,
197
224
  parentLabelProps = _ref.labelProps,
198
225
  append = _ref.append,
199
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$9);
226
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$a);
200
227
  var _useLocale = i18n.useLocale(),
201
228
  locale = _useLocale.locale;
202
229
  var state = datepicker$1.useDateFieldState(_extends({}, rest, {
@@ -237,8 +264,8 @@ var DateField = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
237
264
  labelTooltip: labelTooltip,
238
265
  labelProps: parentLabelProps != null ? parentLabelProps : labelProps
239
266
  }, fieldProps, {
240
- variant: (variant != null ? variant : state.validationState === 'invalid') ? validationVariant : undefined,
241
- feedback: (feedback != null ? feedback : state.validationState === 'invalid') ? validationFeedback : undefined,
267
+ variant: variant != null ? variant : state.validationState === 'invalid' ? validationVariant : undefined,
268
+ feedback: feedback != null ? feedback : state.validationState === 'invalid' ? validationFeedback : undefined,
242
269
  append: append,
243
270
  ariaAlertOnFeedback: true
244
271
  }), state.segments.map(function (segment, i) {
@@ -250,12 +277,12 @@ var DateField = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
250
277
  })));
251
278
  });
252
279
 
253
- var _excluded$8 = ["children", "className", "style"];
280
+ var _excluded$9 = ["children", "className", "style"];
254
281
  var CalendarButton = function CalendarButton(_ref) {
255
282
  var children = _ref.children,
256
283
  className = _ref.className,
257
284
  style = _ref.style,
258
- props = _objectWithoutPropertiesLoose(_ref, _excluded$8);
285
+ props = _objectWithoutPropertiesLoose(_ref, _excluded$9);
259
286
  var ref = React.useRef(null);
260
287
  var _useButton = button.useButton(props, ref),
261
288
  buttonProps = _useButton.buttonProps;
@@ -266,7 +293,7 @@ var CalendarButton = function CalendarButton(_ref) {
266
293
  }), children);
267
294
  };
268
295
 
269
- var _excluded$7 = ["state", "date", "onSelectedCellClick"];
296
+ var _excluded$8 = ["state", "date", "onSelectedCellClick"];
270
297
  var CalendarCell = function CalendarCell(_ref) {
271
298
  var _state$timeZone;
272
299
  var state = _ref.state,
@@ -275,7 +302,7 @@ var CalendarCell = function CalendarCell(_ref) {
275
302
  onSelectedCellClick = _ref$onSelectedCellCl === void 0 ? function () {
276
303
  return;
277
304
  } : _ref$onSelectedCellCl,
278
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$7);
305
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$8);
279
306
  var cellRef = React.useRef(null);
280
307
  var _useCalendarCell = calendar.useCalendarCell({
281
308
  date: date$1
@@ -310,7 +337,7 @@ var CalendarCell = function CalendarCell(_ref) {
310
337
  }), formattedDate));
311
338
  };
312
339
 
313
- var _excluded$6 = ["state", "navigationDescription", "onSelectedCellClick"];
340
+ var _excluded$7 = ["state", "navigationDescription", "onSelectedCellClick"];
314
341
  var CalendarGrid = function CalendarGrid(_ref) {
315
342
  var state = _ref.state,
316
343
  navigationDescription = _ref.navigationDescription,
@@ -318,7 +345,7 @@ var CalendarGrid = function CalendarGrid(_ref) {
318
345
  onSelectedCellClick = _ref$onSelectedCellCl === void 0 ? function () {
319
346
  return;
320
347
  } : _ref$onSelectedCellCl,
321
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$6);
348
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$7);
322
349
  var calendarGridId = utils.useRandomId('eds-calendar');
323
350
  var _useLocale = i18n.useLocale(),
324
351
  locale = _useLocale.locale;
@@ -369,7 +396,7 @@ var CalendarGrid = function CalendarGrid(_ref) {
369
396
  }, getNavigationDescription()));
370
397
  };
371
398
 
372
- var _excluded$5 = ["selectedDate", "onChange", "locale", "minDate", "maxDate", "style", "children", "navigationDescription", "onSelectedCellClick"];
399
+ var _excluded$6 = ["selectedDate", "onChange", "locale", "minDate", "maxDate", "style", "children", "navigationDescription", "onSelectedCellClick"];
373
400
  var Calendar = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
374
401
  var selectedDate = _ref.selectedDate,
375
402
  onChange = _ref.onChange,
@@ -382,7 +409,7 @@ var Calendar = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
382
409
  onSelectedCellClick = _ref$onSelectedCellCl === void 0 ? function () {
383
410
  return;
384
411
  } : _ref$onSelectedCellCl,
385
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$5);
412
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$6);
386
413
  var _useLocale = i18n.useLocale(),
387
414
  locale = _useLocale.locale;
388
415
  var allProps = _extends({}, rest, {
@@ -427,7 +454,7 @@ var Calendar = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
427
454
  })));
428
455
  });
429
456
 
430
- var _excluded$4 = ["selectedDate", "onChange", "locale", "disabled", "showTime", "showTimeZone", "className", "style", "variant", "feedback", "validationVariant", "validationFeedback", "disableModal", "labelTooltip", "navigationDescription", "minDate", "maxDate", "modalTreshold", "forcedReturnType"];
457
+ var _excluded$5 = ["selectedDate", "onChange", "locale", "disabled", "showTime", "showTimeZone", "className", "style", "variant", "feedback", "validationVariant", "validationFeedback", "disableModal", "labelTooltip", "navigationDescription", "minDate", "maxDate", "modalTreshold", "forcedReturnType"];
431
458
  var DatePicker = function DatePicker(_ref) {
432
459
  var selectedDate = _ref.selectedDate,
433
460
  onChange = _ref.onChange,
@@ -450,7 +477,7 @@ var DatePicker = function DatePicker(_ref) {
450
477
  _ref$modalTreshold = _ref.modalTreshold,
451
478
  modalTreshold = _ref$modalTreshold === void 0 ? 1000 : _ref$modalTreshold,
452
479
  forcedReturnType = _ref.forcedReturnType,
453
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$4);
480
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$5);
454
481
  var CALENDAR_MODAL_MAX_SCREEN_WIDTH = modalTreshold;
455
482
  var datePickerRef = React.useRef(null);
456
483
  var calendarRef = React.useRef(null);
@@ -461,7 +488,8 @@ var DatePicker = function DatePicker(_ref) {
461
488
  if (forcedReturnType !== undefined) {
462
489
  return onChange(convertValueToType({
463
490
  value: value,
464
- type: forcedReturnType
491
+ type: forcedReturnType,
492
+ timezone: value !== null && 'timezone' in value ? value.timezone : undefined
465
493
  }));
466
494
  }
467
495
  onChange(value);
@@ -581,7 +609,7 @@ var DatePicker = function DatePicker(_ref) {
581
609
  }), React.createElement(icons.CalendarIcon, null)), useModal ? modalCalendar : popoverCalendar)));
582
610
  };
583
611
 
584
- var _excluded$3 = ["className", "style", "label", "onChange", "feedback", "variant", "disableLabelAnimation", "prepend"],
612
+ var _excluded$4 = ["className", "style", "label", "onChange", "feedback", "variant", "disableLabelAnimation", "prepend"],
585
613
  _excluded2$2 = ["onChange", "variant", "value"];
586
614
  var NativeDatePicker = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
587
615
  var className = _ref.className,
@@ -595,7 +623,7 @@ var NativeDatePicker = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
595
623
  prepend = _ref$prepend === void 0 ? React.createElement(icons.DateIcon, {
596
624
  inline: true
597
625
  }) : _ref$prepend,
598
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$3);
626
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$4);
599
627
  var nativedatepickerId = utils.useRandomId('eds-nativetimepicker');
600
628
  return React.createElement(form.BaseFormControl, {
601
629
  style: style,
@@ -654,12 +682,14 @@ var NativeDatePickerBase = /*#__PURE__*/React.forwardRef(function (_ref2, ref) {
654
682
  }, rest));
655
683
  });
656
684
 
685
+ var _excluded$3 = ["direction", "onClick", "disabled", "aria-label"];
657
686
  var TimePickerArrowButton = function TimePickerArrowButton(_ref) {
658
687
  var direction = _ref.direction,
659
688
  onClick = _ref.onClick,
660
689
  disabled = _ref.disabled,
661
- ariaLabel = _ref['aria-label'];
662
- return React.createElement(button$1.IconButton, {
690
+ ariaLabel = _ref['aria-label'],
691
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$3);
692
+ return React.createElement(button$1.IconButton, _extends({
663
693
  className: classNames('eds-timepicker__arrowbutton', "eds-timepicker__arrowbutton--" + direction, {
664
694
  'eds-timepicker__arrowbutton--disabled': disabled
665
695
  }),
@@ -668,10 +698,10 @@ var TimePickerArrowButton = function TimePickerArrowButton(_ref) {
668
698
  onClick: onClick,
669
699
  "aria-label": ariaLabel,
670
700
  disabled: disabled
671
- }, direction === 'left' ? React.createElement(icons.LeftArrowIcon, null) : React.createElement(icons.RightArrowIcon, null));
701
+ }, rest), direction === 'left' ? React.createElement(icons.LeftArrowIcon, null) : React.createElement(icons.RightArrowIcon, null));
672
702
  };
673
703
 
674
- var _excluded$2 = ["selectedTime", "onChange", "disabled", "className", "style", "label", "labelTooltip", "feedback", "variant", "locale", "showTimeZone", "minuteIncrementForArrowButtons", "leftArrowButtonAriaLabel", "rightArrowButtonAriaLabel", "inputRef"];
704
+ var _excluded$2 = ["selectedTime", "onChange", "disabled", "className", "style", "label", "labelTooltip", "feedback", "granularity", "variant", "locale", "showTimeZone", "showSeconds", "minuteIncrementForArrowButtons", "leftArrowButtonAriaLabel", "rightArrowButtonAriaLabel", "inputRef", "forcedReturnType", "forcedTimeZone"];
675
705
  var TimePicker = function TimePicker(_ref) {
676
706
  var selectedTime = _ref.selectedTime,
677
707
  onChange = _ref.onChange,
@@ -681,9 +711,12 @@ var TimePicker = function TimePicker(_ref) {
681
711
  label = _ref.label,
682
712
  labelTooltip = _ref.labelTooltip,
683
713
  feedback = _ref.feedback,
714
+ granularity = _ref.granularity,
684
715
  variant = _ref.variant,
685
716
  customLocale = _ref.locale,
686
717
  showTimeZone = _ref.showTimeZone,
718
+ _ref$showSeconds = _ref.showSeconds,
719
+ showSeconds = _ref$showSeconds === void 0 ? false : _ref$showSeconds,
687
720
  _ref$minuteIncrementF = _ref.minuteIncrementForArrowButtons,
688
721
  minuteIncrementForArrowButtons = _ref$minuteIncrementF === void 0 ? 30 : _ref$minuteIncrementF,
689
722
  _ref$leftArrowButtonA = _ref.leftArrowButtonAriaLabel,
@@ -691,15 +724,30 @@ var TimePicker = function TimePicker(_ref) {
691
724
  _ref$rightArrowButton = _ref.rightArrowButtonAriaLabel,
692
725
  rightArrowButtonAriaLabel = _ref$rightArrowButton === void 0 ? "Legg til " + minuteIncrementForArrowButtons + " minutter" : _ref$rightArrowButton,
693
726
  inputRef = _ref.inputRef,
727
+ forcedReturnType = _ref.forcedReturnType,
728
+ forcedTimeZone = _ref.forcedTimeZone,
694
729
  rest = _objectWithoutPropertiesLoose(_ref, _excluded$2);
695
730
  var _useLocale = i18n.useLocale(),
696
731
  locale = _useLocale.locale;
697
732
  if (customLocale) locale = customLocale;
733
+ var timePickerId = utils.useRandomId('eds-timepicker');
734
+ var timeZone = forcedTimeZone != null ? forcedTimeZone : selectedTime !== null && 'timezone' in selectedTime ? selectedTime.timezone : 'Europe/Oslo';
735
+ var handleOnChange = function handleOnChange(value) {
736
+ if (forcedReturnType !== undefined) {
737
+ return onChange(convertValueToType({
738
+ value: value,
739
+ type: forcedReturnType,
740
+ timezone: timeZone
741
+ }));
742
+ }
743
+ onChange(value);
744
+ };
698
745
  var state = datepicker$1.useTimeFieldState(_extends({
699
- onChange: onChange,
746
+ onChange: handleOnChange,
700
747
  label: label,
701
748
  locale: locale,
702
749
  value: selectedTime,
750
+ granularity: (granularity != null ? granularity : showSeconds) ? 'second' : 'minute',
703
751
  hideTimeZone: !showTimeZone,
704
752
  isDisabled: disabled,
705
753
  shouldForceLeadingZeros: true
@@ -711,70 +759,81 @@ var TimePicker = function TimePicker(_ref) {
711
759
  labelProps = _useTimeField.labelProps,
712
760
  fieldProps = _useTimeField.fieldProps;
713
761
  var id = utils.useRandomId('timepicker');
714
- var handleOnClickArrowButton = function handleOnClickArrowButton(minutes) {
715
- if (someSegmentIsUndefined) {
716
- setTimeToNearestMinuteIncrement();
717
- } else {
718
- addMinutesToSelectedTime(minutes);
719
- }
720
- };
721
- var someSegmentIsUndefined = state.segments.some(function (segment) {
722
- return segment.text === '––';
723
- });
724
- var setTimeToNearestMinuteIncrement = function setTimeToNearestMinuteIncrement() {
725
- var currentTime = date.now(date.getLocalTimeZone());
726
- var roundedMinute = Math.floor(currentTime.minute / minuteIncrementForArrowButtons) * minuteIncrementForArrowButtons;
727
- var newTime = currentTime.set({
728
- minute: roundedMinute
762
+ var getCurrentTime = function getCurrentTime() {
763
+ var getCurrentTimeWithCorrectType = convertValueToType({
764
+ value: date.now(timeZone),
765
+ type: forcedReturnType != null ? forcedReturnType : 'ZonedDateTime'
729
766
  });
730
- // @ts-expect-error Since this function is used when selectedTime is null,
731
- // we can't guarantee newTime matching the type of selectedTime in the future.
732
- // This might lead to a type issue.
733
- onChange(newTime);
767
+ return getCurrentTimeWithCorrectType;
734
768
  };
735
- var addMinutesToSelectedTime = function addMinutesToSelectedTime(minutes) {
736
- selectedTime !== null && onChange(selectedTime.add({
737
- minutes: minutes
738
- }));
769
+ var handleOnClickArrowButton = function handleOnClickArrowButton(operation) {
770
+ if (selectedTime === null) return handleOnChange(getCurrentTime());
771
+ switch (operation) {
772
+ case 'add':
773
+ return handleOnChange(selectedTime.add({
774
+ minutes: minuteIncrementForArrowButtons - modulo(selectedTime.minute, minuteIncrementForArrowButtons)
775
+ }));
776
+ case 'subtract':
777
+ return handleOnChange(selectedTime.subtract({
778
+ minutes: modulo(selectedTime.minute - 1, minuteIncrementForArrowButtons) + 1
779
+ }));
780
+ }
739
781
  };
740
782
  return React.createElement(i18n.I18nProvider, {
741
783
  locale: locale
742
784
  }, React.createElement("div", {
743
785
  className: classNames(className, 'eds-timepicker__wrapper')
744
- }, React.createElement(TimePickerArrowButton, {
745
- direction: "left",
746
- disabled: disabled,
747
- "aria-label": leftArrowButtonAriaLabel,
748
- onClick: function onClick() {
749
- return handleOnClickArrowButton(minuteIncrementForArrowButtons * -1);
750
- }
751
- }), React.createElement(form.BaseFormControl, _extends({
786
+ }, React.createElement(form.BaseFormControl, _extends({
752
787
  style: style,
753
- className: 'eds-timepicker',
788
+ className: classNames('eds-timepicker', {
789
+ 'eds-timepicker--disabled': disabled
790
+ }),
754
791
  labelId: id,
755
792
  label: label,
756
- labelProps: _extends({}, labelProps),
793
+ labelProps: _extends({}, labelProps, {
794
+ 'aria-describedby': timePickerId + 'description'
795
+ }),
757
796
  ref: utils.mergeRefs(timeFieldRef, inputRef),
758
797
  disabled: disabled,
759
798
  disableLabelAnimation: true,
760
799
  labelTooltip: labelTooltip
761
800
  }, fieldProps, {
762
801
  variant: variant,
763
- feedback: feedback
802
+ feedback: feedback,
803
+ ariaAlertOnFeedback: true,
804
+ "aria-describedby": timePickerId + 'description',
805
+ prepend: React.createElement(TimePickerArrowButton, {
806
+ direction: "left",
807
+ disabled: disabled,
808
+ "aria-label": leftArrowButtonAriaLabel,
809
+ onClick: function onClick() {
810
+ return handleOnClickArrowButton('subtract');
811
+ },
812
+ onFocus: function onFocus() {
813
+ return focusSegment(timeFieldRef, 'first');
814
+ }
815
+ }),
816
+ append: React.createElement(TimePickerArrowButton, {
817
+ direction: "right",
818
+ disabled: disabled,
819
+ "aria-label": rightArrowButtonAriaLabel,
820
+ onClick: function onClick() {
821
+ return handleOnClickArrowButton('add');
822
+ },
823
+ onFocus: function onFocus() {
824
+ return focusSegment(timeFieldRef, 'last');
825
+ }
826
+ })
764
827
  }), state.segments.map(function (segment, i) {
765
828
  return React.createElement(FieldSegment, {
766
829
  segment: segment,
767
830
  state: state,
768
- key: i
831
+ key: i,
832
+ "aria-describedby": timePickerId + 'description'
769
833
  });
770
- })), React.createElement(TimePickerArrowButton, {
771
- direction: "right",
772
- disabled: disabled,
773
- "aria-label": rightArrowButtonAriaLabel,
774
- onClick: function onClick() {
775
- return handleOnClickArrowButton(minuteIncrementForArrowButtons);
776
- }
777
- })));
834
+ })), React.createElement(a11y.VisuallyHidden, {
835
+ id: timePickerId + 'description'
836
+ }, selectedTime !== null ? 'valgt tid: ' + selectedTime.hour.toString().padStart(2, '0') + ':' + selectedTime.minute.toString().padStart(2, '0') + (showSeconds ? ':' + selectedTime.second.toString().padStart(2, '0') : '') : '')));
778
837
  };
779
838
 
780
839
  var _excluded$1 = ["className", "style", "onChange", "label", "feedback", "variant", "prepend"],
@@ -1063,7 +1122,9 @@ exports.TimePicker = TimePicker;
1063
1122
  exports.ariaLabelIfNorwegian = ariaLabelIfNorwegian;
1064
1123
  exports.convertValueToType = convertValueToType;
1065
1124
  exports.createCalendar = createCalendar;
1125
+ exports.focusSegment = focusSegment;
1066
1126
  exports.lastMillisecondOfDay = lastMillisecondOfDay;
1127
+ exports.modulo = modulo;
1067
1128
  exports.nativeDateToDateValue = nativeDateToDateValue;
1068
1129
  exports.nativeDateToTimeValue = nativeDateToTimeValue;
1069
1130
  exports.timeOrDateValueToNativeDate = timeOrDateValueToNativeDate;