@entur/datepicker 3.0.6 → 4.0.0-RC.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -14,16 +14,25 @@ var button = require('@entur/button');
14
14
  var form = require('@entur/form');
15
15
  var tooltip = require('@entur/tooltip');
16
16
  require('react-datepicker/dist/react-datepicker.css');
17
+ var datepicker$1 = require('@react-stately/datepicker');
17
18
  var datepicker = require('@react-aria/datepicker');
18
19
  var i18n = require('@react-aria/i18n');
19
- var datepicker$1 = require('@react-stately/datepicker');
20
20
  var date = require('@internationalized/date');
21
+ var calendar = require('@react-aria/calendar');
22
+ var calendar$1 = require('@react-stately/calendar');
23
+ var button$1 = require('@react-aria/button');
24
+ var a11y = require('@entur/a11y');
25
+ var reactDom = require('@floating-ui/react-dom');
26
+ var FocusLock = require('react-focus-lock');
27
+ var tokens = require('@entur/tokens');
28
+ var modal = require('@entur/modal');
21
29
 
22
30
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
23
31
 
24
32
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
25
33
  var ReactDatepicker__default = /*#__PURE__*/_interopDefaultLegacy(ReactDatepicker);
26
34
  var classNames__default = /*#__PURE__*/_interopDefaultLegacy(classNames);
35
+ var FocusLock__default = /*#__PURE__*/_interopDefaultLegacy(FocusLock);
27
36
 
28
37
  function _extends() {
29
38
  _extends = Object.assign || function (target) {
@@ -99,7 +108,7 @@ function getMonthName(monthIndex, locale) {
99
108
  return formatter.format(new Date(year, monthIndex));
100
109
  }
101
110
 
102
- var _excluded$4 = ["style", "label", "inputPlaceholder", "prepend", "feedback", "variant", "disabled", "calendarButtonTooltipOpen", "calendarButtonTooltipClose", "hideCalendarButton", "disableLabelAnimation", "inputRef", "calendarButtonId", "forwardRef", "toggleCalendarGUI", "onKeyDownInput", "onBlurInput", "selectedDate", "setFocusToCalendarGUI", "setShouldFocusOnCalendarButtonAfterSelect", "calendarGUIIsOpen", "placeholder", "onClick", "aria-labelledby"];
111
+ var _excluded$a = ["style", "label", "inputPlaceholder", "prepend", "feedback", "variant", "disabled", "calendarButtonTooltipOpen", "calendarButtonTooltipClose", "hideCalendarButton", "disableLabelAnimation", "inputRef", "calendarButtonId", "forwardRef", "toggleCalendarGUI", "onKeyDownInput", "onBlurInput", "selectedDate", "setFocusToCalendarGUI", "setShouldFocusOnCalendarButtonAfterSelect", "calendarGUIIsOpen", "placeholder", "onClick", "aria-labelledby"];
103
112
  var DatePickerInput = /*#__PURE__*/React__default["default"].forwardRef(function (_ref, ref) {
104
113
  var style = _ref.style,
105
114
  label = _ref.label,
@@ -123,7 +132,7 @@ var DatePickerInput = /*#__PURE__*/React__default["default"].forwardRef(function
123
132
  setShouldFocusOnCalendarButtonAfterSelect = _ref.setShouldFocusOnCalendarButtonAfterSelect,
124
133
  calendarGUIIsOpen = _ref.calendarGUIIsOpen,
125
134
  onClick = _ref.onClick,
126
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$4);
135
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$a);
127
136
 
128
137
  React__default["default"].useEffect(function () {
129
138
  var _inputRef$current, _inputRef$current2, _inputRef$current3;
@@ -201,7 +210,7 @@ var DatePickerInput = /*#__PURE__*/React__default["default"].forwardRef(function
201
210
  }, rest));
202
211
  });
203
212
 
204
- var _excluded$3 = ["style", "className", "selectedDate", "label", "placeholder", "onChange", "onKeyDown", "dateFormats", "minDate", "maxDate", "inline", "disabled", "prepend", "feedback", "variant", "validationFeedback", "validationVariant", "disableLabelAnimation", "calendarButtonTooltipOpen", "calendarButtonTooltipClose", "hideCalendarButton", "hideCalendar", "hideValidation", "weekLabel", "chooseDayAriaLabelPrefix", "previousMonthAriaLabel", "nextMonthAriaLabel", "locale", "open"];
213
+ var _excluded$9 = ["style", "className", "selectedDate", "label", "placeholder", "onChange", "onKeyDown", "dateFormats", "minDate", "maxDate", "inline", "disabled", "prepend", "feedback", "variant", "validationFeedback", "validationVariant", "disableLabelAnimation", "calendarButtonTooltipOpen", "calendarButtonTooltipClose", "hideCalendarButton", "hideCalendar", "hideValidation", "weekLabel", "chooseDayAriaLabelPrefix", "previousMonthAriaLabel", "nextMonthAriaLabel", "locale", "open"];
205
214
  ReactDatepicker.registerLocale('nb', locale.nb);
206
215
  var DatePicker = /*#__PURE__*/React__default["default"].forwardRef(function (_ref, ref) {
207
216
  var style = _ref.style,
@@ -253,7 +262,7 @@ var DatePicker = /*#__PURE__*/React__default["default"].forwardRef(function (_re
253
262
  _ref$locale = _ref.locale,
254
263
  locale$1 = _ref$locale === void 0 ? locale.nb : _ref$locale,
255
264
  open = _ref.open,
256
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$3);
265
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$9);
257
266
 
258
267
  var datepickerId = utils.useRandomId('eds-datepicker');
259
268
  var datepickerRef = React.useRef(null);
@@ -485,6 +494,541 @@ var DatePicker = /*#__PURE__*/React__default["default"].forwardRef(function (_re
485
494
  }, rest)));
486
495
  });
487
496
 
497
+ var FieldSegment = function FieldSegment(_ref) {
498
+ var segment = _ref.segment,
499
+ state = _ref.state;
500
+ var ref = React.useRef(null);
501
+
502
+ var _useDateSegment = datepicker.useDateSegment(segment, state, ref),
503
+ segmentProps = _useDateSegment.segmentProps;
504
+
505
+ var is12HourFormatted = state.segments.some(function (segment) {
506
+ return segment.text === 'AM' || segment.text === 'PM';
507
+ });
508
+
509
+ var segmentDisplayText = function segmentDisplayText() {
510
+ if (is12HourFormatted) return segment.text; // if number add '0' padding to start when one digit
511
+
512
+ if (segment.text.match(/\d+/)) return segment.text.padStart(2, '0');
513
+ return segment.text;
514
+ };
515
+
516
+ return React__default["default"].createElement("div", _extends({}, segmentProps, {
517
+ ref: ref,
518
+ className: classNames__default["default"]('eds-date-and-time-field__segment', {
519
+ 'eds-date-and-time-field__segment--placeholder': segment.isPlaceholder,
520
+ 'eds-date-and-time-field__segment--dot-separator': segment.text === '.'
521
+ }),
522
+ tabIndex: state.isDisabled ? -1 : segmentProps.tabIndex
523
+ }), segmentDisplayText());
524
+ };
525
+
526
+ /**
527
+ * Tar inn et JS Date-objekt og returnerer et av Date- eller TimeValue-objektene fra @internationalized/date-pakken
528
+ * @param {Date} date JS Date-objekt som ønskes konvertert til et Date- eller TimeValue-objekt
529
+ * @param {boolean} noDateOnlyTime Hvis datoen er irrelevant kan denne settes til true, da får man et Time-objekt uten dato tilbake
530
+ * @param {boolean} noTimeOnlyDate Hvis tidspunktet er irrelevant kan denne settes til true, da får man et CalendarDate-objekt uten tidspunkt tilbake
531
+ * @param {string} timeZone Tidssonen på IANA-formatet som tidpunktet skal konverteres til. Utelates denne får man et tidspunkt uten tidssone. Kan brukes med og uten en UTC-offset Vær obs på annen oppførsel med offset, les mer på beskrivelsen av offset
532
+ * @param {number} offset UTC-offset i millisekunder, må brukes med en tidssone. Ved å legge på en offset lager du en variant av en tidssone. Det betyr at tidspunktet ikke endres (time, minutt, sekund uendret), men tidssonen, med tilhørende offset, tidspunktet er i endres.
533
+ * @returns {Time | CalendarDateTime | ZonedDateTime | CalendarDate} et av Time- eller DateValue-objektene med verdier fra date
534
+ */
535
+
536
+ var nativeDateToTimeOrDateValue = function nativeDateToTimeOrDateValue(date$1, noDateOnlyTime, noTimeOnlyDate, timeZone, offset) {
537
+ if (noDateOnlyTime === void 0) {
538
+ noDateOnlyTime = false;
539
+ }
540
+
541
+ if (noTimeOnlyDate === void 0) {
542
+ noTimeOnlyDate = false;
543
+ }
544
+
545
+ if (timeZone) {
546
+ if (offset) {
547
+ return new date.ZonedDateTime(date$1.getFullYear(), date$1.getMonth() + 1, date$1.getDate(), timeZone, offset, date$1.getHours(), date$1.getMinutes(), date$1.getSeconds());
548
+ }
549
+
550
+ return date.parseAbsolute(date$1.toISOString(), timeZone);
551
+ }
552
+
553
+ if (noDateOnlyTime) return new date.Time(date$1.getHours(), date$1.getMinutes(), date$1.getSeconds(), 0);
554
+ if (noTimeOnlyDate) return new date.CalendarDate(date$1.getFullYear(), date$1.getMonth() + 1, date$1.getDate());
555
+ return new date.CalendarDateTime(date$1.getFullYear(), date$1.getMonth() + 1, date$1.getDate(), date$1.getHours(), date$1.getMinutes(), date$1.getSeconds());
556
+ };
557
+ /**
558
+ * Tar inn et av Date- eller TimeValue-objektene fra @internationalized/date-pakken og returnerer et JS Date-objekt
559
+ * @param {DateValue | TimeValue} value En dato eller et tidspunkt på Date- eller TimeValue-formatet som ønskes konvertert til et JS Date-objekt
560
+ * @param {string} timeZoneForCalendarDateTime Tidssonen value er i. Fungerer kun med typen er CalendarDateTime
561
+ * @returns {Date} et Date-objekt med verdier fra time
562
+ */
563
+ // This function uses a lot of @ts-expect-error to make it work with all Date- and TimeValue types. Sorry ...
564
+
565
+ var timeOrDateValueToNativeDate = function timeOrDateValueToNativeDate(value, timeZoneForCalendarDateTime) {
566
+ // @ts-expect-error .day does not exist on Time-object
567
+ if (!value.day) {
568
+ // type is Time
569
+ var date$1 = new Date(); // @ts-expect-error hour does not exist on CalendarDate
570
+
571
+ date$1.setHours(value.hour); // @ts-expect-error minute does not exist on CalendarDate
572
+
573
+ date$1.setMinutes(value.minute); // @ts-expect-error second does not exist on CalendarDate
574
+
575
+ date$1.setSeconds(value.second);
576
+ return date$1;
577
+ } // @ts-expect-error .day does not exist on Time-object
578
+
579
+
580
+ if (!value.hour) {
581
+ // type is CalendarDate
582
+ // @ts-expect-error .toDate(timeZone) does not exist in type Time
583
+ return value.toDate(timeZoneForCalendarDateTime != null ? timeZoneForCalendarDateTime : date.getLocalTimeZone());
584
+ } // @ts-expect-error .timeZone does not exist in type Time and CalendarDateTime
585
+
586
+
587
+ if (!value.timeZone) {
588
+ // type is CalendarDateTime
589
+ if (timeZoneForCalendarDateTime) // @ts-expect-error .toDate(timeZone) does not exist in type Time
590
+ return value.toDate(timeZoneForCalendarDateTime);
591
+ return new Date( // @ts-expect-error not in type Time
592
+ value.year, // @ts-expect-error not in type Time
593
+ value.month - 1, // @ts-expect-error not in type Time
594
+ value.day, // @ts-expect-error not in type CalendarDate
595
+ value.hour, // @ts-expect-error not in type CalendarDate
596
+ value.minute, // @ts-expect-error not in type CalendarDate
597
+ value.second);
598
+ } // @ts-expect-error .toDate() does not exist in type Time or CalendarDateTime
599
+
600
+
601
+ return value.toDate();
602
+ };
603
+ var createCalendar = function createCalendar(identifier) {
604
+ if (identifier === void 0) {
605
+ identifier = 'gregory';
606
+ }
607
+
608
+ switch (identifier) {
609
+ case 'gregory':
610
+ return new date.GregorianCalendar();
611
+
612
+ default:
613
+ throw new Error("Unsupported calendar " + identifier);
614
+ }
615
+ };
616
+ var ariaLabelIfNorwegian = function ariaLabelIfNorwegian(norwegianAriaLabel, locale, propsCollection) {
617
+ if (locale.toLowerCase() !== 'no-no') return propsCollection['aria-label'];
618
+ return norwegianAriaLabel;
619
+ };
620
+
621
+ var _excluded$8 = ["selectedDate", "label", "locale", "showTimeZone", "showTime", "granularity", "disabled", "variant", "feedback", "validationVariant", "validationFeedback", "labelTooltip", "style", "className", "labelProps", "append"];
622
+ var DateField = /*#__PURE__*/React__default["default"].forwardRef(function (_ref, ref) {
623
+ var value = _ref.selectedDate,
624
+ label = _ref.label,
625
+ customLocale = _ref.locale,
626
+ showTimeZone = _ref.showTimeZone,
627
+ showTime = _ref.showTime,
628
+ _ref$granularity = _ref.granularity,
629
+ granularity = _ref$granularity === void 0 ? 'day' : _ref$granularity,
630
+ disabled = _ref.disabled,
631
+ variant = _ref.variant,
632
+ feedback = _ref.feedback,
633
+ _ref$validationVarian = _ref.validationVariant,
634
+ validationVariant = _ref$validationVarian === void 0 ? 'error' : _ref$validationVarian,
635
+ _ref$validationFeedba = _ref.validationFeedback,
636
+ validationFeedback = _ref$validationFeedba === void 0 ? 'Ugyldig dato' : _ref$validationFeedba,
637
+ labelTooltip = _ref.labelTooltip,
638
+ style = _ref.style,
639
+ className = _ref.className,
640
+ parentLabelProps = _ref.labelProps,
641
+ append = _ref.append,
642
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$8);
643
+
644
+ var _useLocale = i18n.useLocale(),
645
+ locale = _useLocale.locale;
646
+
647
+ var state = datepicker$1.useDateFieldState(_extends({}, rest, {
648
+ locale: customLocale != null ? customLocale : locale,
649
+ createCalendar: createCalendar,
650
+ value: value === null ? undefined : value,
651
+ hideTimeZone: !showTimeZone,
652
+ granularity: showTime ? 'minute' : granularity
653
+ }));
654
+ var dateFieldRef = React.useRef(null);
655
+
656
+ var _useDateField = datepicker.useDateField(_extends({}, rest, {
657
+ label: label,
658
+ isDisabled: disabled || rest.isDisabled
659
+ }), state, dateFieldRef),
660
+ labelProps = _useDateField.labelProps,
661
+ fieldProps = _useDateField.fieldProps;
662
+
663
+ var id = utils.useRandomId('datefield');
664
+ return React__default["default"].createElement(utils.ConditionalWrapper, {
665
+ condition: customLocale !== undefined,
666
+ wrapper: function wrapper(child) {
667
+ return React__default["default"].createElement(i18n.I18nProvider, {
668
+ locale: customLocale
669
+ }, child);
670
+ }
671
+ }, React__default["default"].createElement(form.BaseFormControl, _extends({
672
+ style: style,
673
+ className: classNames__default["default"]('eds-datefield', className),
674
+ labelId: id,
675
+ ref: utils.mergeRefs(dateFieldRef, ref),
676
+ disabled: state.isDisabled,
677
+ disableLabelAnimation: true,
678
+ label: label,
679
+ labelTooltip: labelTooltip,
680
+ labelProps: parentLabelProps != null ? parentLabelProps : labelProps
681
+ }, fieldProps, {
682
+ variant: (variant != null ? variant : state.validationState === 'invalid') ? validationVariant : undefined,
683
+ feedback: (feedback != null ? feedback : state.validationState === 'invalid') ? validationFeedback : undefined,
684
+ append: append,
685
+ ariaAlertOnFeedback: true
686
+ }), state.segments.map(function (segment, i) {
687
+ return React__default["default"].createElement(FieldSegment, {
688
+ segment: segment,
689
+ state: state,
690
+ key: i
691
+ });
692
+ })));
693
+ });
694
+
695
+ var _excluded$7 = ["children", "className", "style"];
696
+ var CalendarButton = function CalendarButton(_ref) {
697
+ var children = _ref.children,
698
+ className = _ref.className,
699
+ style = _ref.style,
700
+ props = _objectWithoutPropertiesLoose(_ref, _excluded$7);
701
+
702
+ var ref = React.useRef(null);
703
+
704
+ var _useButton = button$1.useButton(props, ref),
705
+ buttonProps = _useButton.buttonProps;
706
+
707
+ return React__default["default"].createElement(button.IconButton, _extends({}, buttonProps, {
708
+ ref: ref,
709
+ className: className,
710
+ style: style
711
+ }), children);
712
+ };
713
+
714
+ var _excluded$6 = ["state", "date", "onSelectedCellClick"];
715
+ var CalendarCell = function CalendarCell(_ref) {
716
+ var _state$timeZone;
717
+
718
+ var state = _ref.state,
719
+ date$1 = _ref.date,
720
+ _ref$onSelectedCellCl = _ref.onSelectedCellClick,
721
+ onSelectedCellClick = _ref$onSelectedCellCl === void 0 ? function () {
722
+ return;
723
+ } : _ref$onSelectedCellCl,
724
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$6);
725
+
726
+ var cellRef = React.useRef(null);
727
+
728
+ var _useCalendarCell = calendar.useCalendarCell({
729
+ date: date$1
730
+ }, state, cellRef),
731
+ cellProps = _useCalendarCell.cellProps,
732
+ buttonProps = _useCalendarCell.buttonProps,
733
+ isSelected = _useCalendarCell.isSelected,
734
+ isOutsideVisibleRange = _useCalendarCell.isOutsideVisibleRange,
735
+ isDisabled = _useCalendarCell.isDisabled,
736
+ isUnavailable = _useCalendarCell.isUnavailable,
737
+ formattedDate = _useCalendarCell.formattedDate;
738
+
739
+ return React__default["default"].createElement("td", _extends({}, cellProps, {
740
+ className: "eds-datepicker__calendar__grid__cell__td"
741
+ }), React__default["default"].createElement("div", _extends({}, buttonProps, {
742
+ ref: cellRef,
743
+ hidden: isOutsideVisibleRange,
744
+ className: classNames__default["default"]('eds-datepicker__calendar__grid__cell', {
745
+ 'eds-datepicker__calendar__grid__cell--selected': isSelected,
746
+ 'eds-datepicker__calendar__grid__cell--disabled': isDisabled || isUnavailable,
747
+ 'eds-datepicker__calendar__grid__cell--outside-month': isOutsideVisibleRange,
748
+ 'eds-datepicker__calendar__grid__cell--today': date.isEqualDay(date$1, date.now((_state$timeZone = state.timeZone) != null ? _state$timeZone : date.getLocalTimeZone()))
749
+ })
750
+ }, rest, {
751
+ onClick: function onClick(e) {
752
+ buttonProps.onClick && buttonProps.onClick(e);
753
+ isSelected && onSelectedCellClick();
754
+ }
755
+ }), formattedDate));
756
+ };
757
+
758
+ var _excluded$5 = ["state", "navigationDescription", "onSelectedCellClick"];
759
+ var CalendarGrid = function CalendarGrid(_ref) {
760
+ var state = _ref.state,
761
+ navigationDescription = _ref.navigationDescription,
762
+ _ref$onSelectedCellCl = _ref.onSelectedCellClick,
763
+ onSelectedCellClick = _ref$onSelectedCellCl === void 0 ? function () {
764
+ return;
765
+ } : _ref$onSelectedCellCl,
766
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$5);
767
+
768
+ var calendarGridId = utils.useRandomId('eds-calendar');
769
+
770
+ var _useLocale = i18n.useLocale(),
771
+ locale = _useLocale.locale;
772
+
773
+ var _useCalendarGrid = calendar.useCalendarGrid(rest, state),
774
+ gridProps = _useCalendarGrid.gridProps,
775
+ headerProps = _useCalendarGrid.headerProps,
776
+ weekDays = _useCalendarGrid.weekDays;
777
+
778
+ var weeksInMonth = date.getWeeksInMonth(state.visibleRange.start, locale);
779
+ var weeksArray = Array.from(Array(weeksInMonth).keys());
780
+
781
+ var weekDaysMapped = function weekDaysMapped() {
782
+ if (locale.toLowerCase() === 'no-no' || locale.toLowerCase() === 'no') return ['ma', 'ti', 'on', 'to', 'fr', 'lø', 'sø'];
783
+ if (weekDays.toString() === 'M,T,W,T,F,S,S') return ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'];
784
+ return weekDays.map(function (day) {
785
+ return day.toLowerCase();
786
+ });
787
+ };
788
+
789
+ var getNavigationDescription = function getNavigationDescription() {
790
+ if (navigationDescription) return navigationDescription;
791
+ if (locale.toLowerCase().includes('en')) return 'Use the arrow keys to navigate between dates';
792
+ return 'Bruk piltastene til å navigere mellom datoer';
793
+ };
794
+
795
+ return React__default["default"].createElement(React__default["default"].Fragment, null, React__default["default"].createElement("table", _extends({}, gridProps, {
796
+ cellSpacing: "0",
797
+ className: "eds-datepicker__calendar__grid"
798
+ }), React__default["default"].createElement("thead", _extends({}, headerProps), React__default["default"].createElement("tr", null, weekDaysMapped().map(function (day, index) {
799
+ return React__default["default"].createElement("th", {
800
+ key: index
801
+ }, day);
802
+ }))), React__default["default"].createElement("tbody", null, weeksArray.map(function (weekIndex) {
803
+ return React__default["default"].createElement("tr", {
804
+ key: weekIndex
805
+ }, state.getDatesInWeek(weekIndex).map(function (date, i) {
806
+ return date ? React__default["default"].createElement(CalendarCell, {
807
+ key: i,
808
+ state: state,
809
+ date: date,
810
+ "aria-describedby": calendarGridId + 'description',
811
+ onSelectedCellClick: onSelectedCellClick
812
+ }) : React__default["default"].createElement("td", {
813
+ key: i
814
+ });
815
+ }));
816
+ }))), React__default["default"].createElement(a11y.VisuallyHidden, {
817
+ id: calendarGridId + 'description'
818
+ }, getNavigationDescription()));
819
+ };
820
+
821
+ var _excluded$4 = ["selectedDate", "onChange", "locale", "style", "children", "navigationDescription", "onSelectedCellClick"];
822
+ var Calendar = /*#__PURE__*/React__default["default"].forwardRef(function (_ref, ref) {
823
+ var onChange = _ref.onChange,
824
+ customLocale = _ref.locale,
825
+ style = _ref.style,
826
+ navigationDescription = _ref.navigationDescription,
827
+ _ref$onSelectedCellCl = _ref.onSelectedCellClick,
828
+ onSelectedCellClick = _ref$onSelectedCellCl === void 0 ? function () {
829
+ return;
830
+ } : _ref$onSelectedCellCl,
831
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$4);
832
+
833
+ var _useLocale = i18n.useLocale(),
834
+ locale = _useLocale.locale;
835
+
836
+ var state = calendar$1.useCalendarState(_extends({}, rest, {
837
+ onChange: onChange,
838
+ locale: customLocale != null ? customLocale : locale,
839
+ createCalendar: createCalendar
840
+ }));
841
+
842
+ var _useCalendar = calendar.useCalendar(rest, state),
843
+ calendarProps = _useCalendar.calendarProps,
844
+ prevButtonProps = _useCalendar.prevButtonProps,
845
+ nextButtonProps = _useCalendar.nextButtonProps,
846
+ title = _useCalendar.title;
847
+
848
+ return React__default["default"].createElement(utils.ConditionalWrapper, {
849
+ condition: customLocale,
850
+ wrapper: function wrapper(child) {
851
+ return React__default["default"].createElement(i18n.I18nProvider, {
852
+ locale: customLocale
853
+ }, child);
854
+ }
855
+ }, React__default["default"].createElement("div", _extends({}, calendarProps, {
856
+ ref: ref,
857
+ className: "eds-datepicker__calendar",
858
+ style: style
859
+ }), React__default["default"].createElement("div", {
860
+ className: "eds-datepicker__calendar__header"
861
+ }, React__default["default"].createElement(CalendarButton, _extends({}, prevButtonProps, {
862
+ "aria-label": ariaLabelIfNorwegian('Forrige måned', locale, prevButtonProps)
863
+ }), React__default["default"].createElement(icons.LeftArrowIcon, {
864
+ size: 20
865
+ })), React__default["default"].createElement("h2", null, title), React__default["default"].createElement(CalendarButton, _extends({}, nextButtonProps, {
866
+ "aria-label": ariaLabelIfNorwegian('Neste måned', locale, nextButtonProps)
867
+ }), React__default["default"].createElement(icons.RightArrowIcon, {
868
+ size: 20
869
+ }))), React__default["default"].createElement(CalendarGrid, {
870
+ state: state,
871
+ navigationDescription: navigationDescription,
872
+ onSelectedCellClick: onSelectedCellClick
873
+ })));
874
+ });
875
+
876
+ var _excluded$3 = ["selectedDate", "onChange", "locale", "disabled", "showTime", "showTimeZone", "className", "style", "variant", "feedback", "validationVariant", "validationFeedback", "disableModal", "labelTooltip", "navigationDescription", "minDate", "maxDate", "modalTreshold"];
877
+ var DatePickerBeta = function DatePickerBeta(_ref) {
878
+ var value = _ref.selectedDate,
879
+ onChange = _ref.onChange,
880
+ locale = _ref.locale,
881
+ isDisabled = _ref.disabled,
882
+ showTime = _ref.showTime,
883
+ _ref$showTimeZone = _ref.showTimeZone,
884
+ showTimeZone = _ref$showTimeZone === void 0 ? false : _ref$showTimeZone,
885
+ className = _ref.className,
886
+ variant = _ref.variant,
887
+ feedback = _ref.feedback,
888
+ validationVariant = _ref.validationVariant,
889
+ validationFeedback = _ref.validationFeedback,
890
+ _ref$disableModal = _ref.disableModal,
891
+ disableModal = _ref$disableModal === void 0 ? false : _ref$disableModal,
892
+ labelTooltip = _ref.labelTooltip,
893
+ navigationDescription = _ref.navigationDescription,
894
+ minValue = _ref.minDate,
895
+ maxValue = _ref.maxDate,
896
+ _ref$modalTreshold = _ref.modalTreshold,
897
+ modalTreshold = _ref$modalTreshold === void 0 ? 1000 : _ref$modalTreshold,
898
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$3);
899
+
900
+ var CALENDAR_MODAL_MAX_SCREEN_WIDTH = modalTreshold;
901
+ var datePickerRef = React.useRef(null);
902
+ var calendarRef = React.useRef(null);
903
+ var dateFieldRef = React.useRef(null);
904
+
905
+ var _useWindowDimensions = utils.useWindowDimensions(),
906
+ width = _useWindowDimensions.width;
907
+
908
+ var state = datepicker$1.useDatePickerState(_extends({}, rest, {
909
+ minValue: minValue,
910
+ maxValue: maxValue,
911
+ value: value,
912
+ onChange: onChange
913
+ }));
914
+
915
+ var _useDatePicker = datepicker.useDatePicker(_extends({
916
+ isDisabled: isDisabled,
917
+ minValue: minValue,
918
+ maxValue: maxValue,
919
+ autoFocus: true
920
+ }, rest), state, datePickerRef),
921
+ groupProps = _useDatePicker.groupProps,
922
+ labelProps = _useDatePicker.labelProps,
923
+ fieldProps = _useDatePicker.fieldProps,
924
+ buttonProps = _useDatePicker.buttonProps,
925
+ dialogProps = _useDatePicker.dialogProps,
926
+ calendarProps = _useDatePicker.calendarProps; // calculations for floating-UI popover position
927
+
928
+
929
+ var _useFloating = reactDom.useFloating({
930
+ whileElementsMounted: reactDom.autoUpdate,
931
+ placement: 'bottom-start',
932
+ middleware: [reactDom.offset(tokens.space.extraSmall), reactDom.flip(), reactDom.shift({
933
+ padding: tokens.space.extraSmall
934
+ })]
935
+ }),
936
+ x = _useFloating.x,
937
+ y = _useFloating.y,
938
+ reference = _useFloating.reference,
939
+ floating = _useFloating.floating,
940
+ strategy = _useFloating.strategy;
941
+
942
+ var onChangeCalendar = function onChangeCalendar(newSelectedDate) {
943
+ // Necessary to avoid state update on unmounted component
944
+ requestAnimationFrame(function () {
945
+ calendarProps.onChange && calendarProps.onChange(newSelectedDate);
946
+ });
947
+ };
948
+
949
+ utils.useOnClickOutside([calendarRef], function () {
950
+ state.setOpen(false);
951
+ });
952
+ utils.useOnEscape(calendarRef, function () {
953
+ state.setOpen(false);
954
+ });
955
+
956
+ var calendarSharedProps = _extends({}, dialogProps, calendarProps, {
957
+ disabled: calendarProps.isDisabled,
958
+ navigationDescription: navigationDescription,
959
+ onSelectedCellClick: function onSelectedCellClick() {
960
+ return state.setOpen(false);
961
+ },
962
+ onChange: onChangeCalendar
963
+ });
964
+
965
+ var useModal = width <= CALENDAR_MODAL_MAX_SCREEN_WIDTH && !disableModal;
966
+ var popoverCalendar = React__default["default"].createElement("div", {
967
+ // styling for floating-UI popover
968
+ style: {
969
+ position: strategy,
970
+ top: y != null ? y : 0,
971
+ left: x != null ? x : 0,
972
+ zIndex: tokens.zIndexes.popover
973
+ },
974
+ ref: function ref(node) {
975
+ floating(node);
976
+ }
977
+ }, React__default["default"].createElement(FocusLock__default["default"], {
978
+ disabled: !state.isOpen || useModal,
979
+ returnFocus: true
980
+ }, state.isOpen && React__default["default"].createElement(Calendar, _extends({}, calendarSharedProps, {
981
+ ref: calendarRef
982
+ }))));
983
+ var modalCalendar = React__default["default"].createElement(modal.Modal, {
984
+ size: "small",
985
+ title: "",
986
+ open: state.isOpen,
987
+ onDismiss: function onDismiss() {
988
+ return state.setOpen(false);
989
+ },
990
+ closeOnClickOutside: true,
991
+ className: "eds-datepicker__calendar-modal"
992
+ }, React__default["default"].createElement(Calendar, _extends({}, calendarSharedProps)));
993
+ return React__default["default"].createElement(utils.ConditionalWrapper, {
994
+ condition: locale !== undefined,
995
+ wrapper: function wrapper(child) {
996
+ return React__default["default"].createElement(i18n.I18nProvider, {
997
+ locale: locale
998
+ }, child);
999
+ }
1000
+ }, React__default["default"].createElement("div", {
1001
+ className: classNames__default["default"]('eds-datepicker', className)
1002
+ }, React__default["default"].createElement("div", _extends({}, groupProps, {
1003
+ ref: function ref(node) {
1004
+ datePickerRef.current = node;
1005
+ reference(node);
1006
+ },
1007
+ id: undefined,
1008
+ className: "eds-datepicker__datefield__wrapper"
1009
+ }), React__default["default"].createElement(DateField, _extends({}, fieldProps, {
1010
+ selectedDate: state.value,
1011
+ label: rest.label,
1012
+ labelProps: labelProps,
1013
+ showTime: showTime,
1014
+ showTimeZone: showTimeZone,
1015
+ ref: dateFieldRef,
1016
+ variant: variant,
1017
+ feedback: feedback,
1018
+ validationVariant: validationVariant,
1019
+ validationFeedback: validationFeedback,
1020
+ labelTooltip: labelTooltip,
1021
+ className: classNames__default["default"]('eds-datepicker__datefield', {
1022
+ 'eds-datepicker__datefield--disabled': fieldProps.isDisabled
1023
+ })
1024
+ })), !fieldProps.isDisabled && React__default["default"].createElement(CalendarButton, _extends({}, buttonProps, {
1025
+ onPress: function onPress() {
1026
+ return state.setOpen(!state.isOpen);
1027
+ },
1028
+ className: "eds-datepicker__open-calendar-button"
1029
+ }), React__default["default"].createElement(icons.CalendarIcon, null)), useModal ? modalCalendar : popoverCalendar)));
1030
+ };
1031
+
488
1032
  var _excluded$2 = ["className", "style", "label", "onChange", "feedback", "variant", "disableLabelAnimation", "prepend"],
489
1033
  _excluded2$1 = ["onChange", "variant", "value"];
490
1034
  var NativeDatePicker = /*#__PURE__*/React__default["default"].forwardRef(function (_ref, ref) {
@@ -565,33 +1109,6 @@ var NativeDatePickerBase = /*#__PURE__*/React__default["default"].forwardRef(fun
565
1109
  }, rest));
566
1110
  });
567
1111
 
568
- var TimeSegment = function TimeSegment(_ref) {
569
- var segment = _ref.segment,
570
- state = _ref.state;
571
- var ref = React.useRef(null);
572
-
573
- var _useDateSegment = datepicker.useDateSegment(segment, state, ref),
574
- segmentProps = _useDateSegment.segmentProps;
575
-
576
- var is12HourFormatted = state.segments.some(function (segment) {
577
- return segment.text === 'AM' || segment.text === 'PM';
578
- });
579
-
580
- var segmentDisplayText = function segmentDisplayText() {
581
- if (is12HourFormatted) return segment.text; // if number add '0' padding to start when one digit
582
-
583
- if (segment.text.match(/\d+/)) return segment.text.padStart(2, '0');
584
- return segment.text;
585
- };
586
-
587
- return React__default["default"].createElement("div", _extends({}, segmentProps, {
588
- ref: ref,
589
- className: classNames__default["default"]('eds-timepicker__segment', {
590
- 'eds-timepicker__segment--placeholder': segment.isPlaceholder
591
- })
592
- }), segmentDisplayText());
593
- };
594
-
595
1112
  var TimePickerArrowButton = function TimePickerArrowButton(_ref) {
596
1113
  var direction = _ref.direction,
597
1114
  onClick = _ref.onClick,
@@ -706,7 +1223,7 @@ var TimePicker = /*#__PURE__*/React__default["default"].forwardRef(function (_re
706
1223
  variant: variant,
707
1224
  feedback: feedback
708
1225
  }), state.segments.map(function (segment, i) {
709
- return React__default["default"].createElement(TimeSegment, {
1226
+ return React__default["default"].createElement(FieldSegment, {
710
1227
  segment: segment,
711
1228
  state: state,
712
1229
  key: i
@@ -794,71 +1311,17 @@ var NativeTimePickerBase = /*#__PURE__*/React__default["default"].forwardRef(fun
794
1311
  }, rest));
795
1312
  });
796
1313
 
797
- /**
798
- * Tar inn et JS Date-objekt og returnerer et av TimeValue-objektene fra @internationalized/date-pakken
799
- * @param {Date} date JS Date-objekt som ønskes konvertert til et TimeValue-objekt
800
- * @param {boolean} noDateOnlyTime Hvis datoen er irrelevant kan denne settes til true, da får man et Time-objekt uten dato tilbake
801
- * @param {string} timeZone Tidssonen på IANA-formatet som tidpunktet skal konverteres til. Utelates denne får man et tidspunkt uten tidssone. Kan brukes med og uten en UTC-offset Vær obs på annen oppførsel med offset, les mer på beskrivelsen av offset
802
- * @param {number} offset UTC-offset i millisekunder, må brukes med en tidssone. Ved å legge på en offset lager du en variant av en tidssone. Det betyr at tidspunktet ikke endres (time, minutt, sekund uendret), men tidssonen, med tilhørende offset, tidspunktet er i endres.
803
- * @returns {Time | CalendarDateTime | ZonedDateTime} et av TimeValue-objektene med verdier fra date
804
- */
805
-
806
- var nativeDateToTimeValue = function nativeDateToTimeValue(date$1, noDateOnlyTime, timeZone, offset) {
807
- if (noDateOnlyTime === void 0) {
808
- noDateOnlyTime = false;
809
- }
810
-
811
- if (timeZone) {
812
- if (offset) {
813
- return new date.ZonedDateTime(date$1.getFullYear(), date$1.getMonth() + 1, date$1.getDate(), timeZone, offset, date$1.getHours(), date$1.getMinutes(), date$1.getSeconds());
814
- }
815
-
816
- return date.parseAbsolute(date$1.toISOString(), timeZone);
817
- }
818
-
819
- if (noDateOnlyTime) return new date.Time(date$1.getHours(), date$1.getMinutes(), date$1.getSeconds(), 0);
820
- return new date.CalendarDateTime(date$1.getFullYear(), date$1.getMonth() + 1, date$1.getDate(), date$1.getHours(), date$1.getMinutes(), date$1.getSeconds());
821
- };
822
- /**
823
- * Tar inn et av TimeValue-objektene fra @internationalized/date-pakken og returnerer et JS Date-objekt
824
- * @param {TimeValue} time Et tidspunkt på TimeValue-formatet som ønsket konvertert til et JS Date-objekt
825
- * @param {string} timeZoneForCalendarDateTime Tidssonen time er i. Fungerer kun med typen er CalendarDateTime
826
- * @returns {Date} et Date-objekt med verdier fra time
827
- */
828
- // This function uses a lot of @ts-expect-error to make it work with all TimeValue types. Sorry ...
829
-
830
- var timeValueToNativeDate = function timeValueToNativeDate(time, timeZoneForCalendarDateTime) {
831
- // @ts-expect-error .day does not exist on Time-object
832
- if (!time.day) {
833
- // type is Time
834
- var date = new Date();
835
- date.setHours(time.hour);
836
- date.setMinutes(time.minute);
837
- date.setSeconds(time.second);
838
- return date;
839
- } // @ts-expect-error .timeZone does not exist in type Time and CalendarDateTime
840
-
841
-
842
- if (!time.timeZone) {
843
- // type is CalendarDateTime
844
- if (timeZoneForCalendarDateTime) // @ts-expect-error .toDate(timeZone) does not exist in type Time
845
- return time.toDate(timeZoneForCalendarDateTime);
846
- return new Date( // @ts-expect-error not in type Time
847
- time.year, // @ts-expect-error not in type Time
848
- time.month - 1, // @ts-expect-error not in type Time
849
- time.day, time.hour, time.minute, time.second);
850
- } // @ts-expect-error .toDate() does not exist in type Time or CalendarDateTime
851
-
852
-
853
- return time.toDate();
854
- };
855
-
856
1314
  utils.warnAboutMissingStyles('datepicker', 'form', 'icons');
857
1315
 
1316
+ exports.Calendar = Calendar;
1317
+ exports.DateField = DateField;
858
1318
  exports.DatePicker = DatePicker;
1319
+ exports.DatePickerBeta = DatePickerBeta;
859
1320
  exports.NativeDatePicker = NativeDatePicker;
860
1321
  exports.NativeTimePicker = NativeTimePicker;
861
1322
  exports.TimePicker = TimePicker;
862
- exports.nativeDateToTimeValue = nativeDateToTimeValue;
863
- exports.timeValueToNativeDate = timeValueToNativeDate;
1323
+ exports.ariaLabelIfNorwegian = ariaLabelIfNorwegian;
1324
+ exports.createCalendar = createCalendar;
1325
+ exports.nativeDateToTimeOrDateValue = nativeDateToTimeOrDateValue;
1326
+ exports.timeOrDateValueToNativeDate = timeOrDateValueToNativeDate;
864
1327
  //# sourceMappingURL=datepicker.cjs.development.js.map