@entur/datepicker 3.0.7 → 4.0.0-RC.1

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.
@@ -1,19 +1,21 @@
1
- import { mergeRefs, useRandomId, useOnMount, warnAboutMissingStyles } from '@entur/utils';
2
- import React, { useRef, useState } from 'react';
3
- import ReactDatepicker, { registerLocale } from 'react-datepicker';
4
- import { parse, isSameDay } from 'date-fns';
5
- import { nb } from 'date-fns/locale';
1
+ import { useRandomId, ConditionalWrapper, mergeRefs, useWindowDimensions, useOnClickOutside, useOnEscape, useOnMount, warnAboutMissingStyles } from '@entur/utils';
2
+ import React, { useRef } from 'react';
3
+ import { useDateFieldState, useDatePickerState, useTimeFieldState } from '@react-stately/datepicker';
4
+ import { useDateSegment, useDateField, useDatePicker, useTimeField } from '@react-aria/datepicker';
5
+ import { useLocale, I18nProvider } from '@react-aria/i18n';
6
6
  import classNames from 'classnames';
7
+ import { BaseFormControl, useVariant, useInputGroupContext, isFilled } from '@entur/form';
8
+ import { ZonedDateTime, parseAbsolute, Time, CalendarDate, CalendarDateTime, getLocalTimeZone, GregorianCalendar, isEqualDay, now, getWeeksInMonth } from '@internationalized/date';
9
+ import { useCalendarCell, useCalendarGrid, useCalendar } from '@react-aria/calendar';
10
+ import { useCalendarState } from '@react-stately/calendar';
7
11
  import { LeftArrowIcon, RightArrowIcon, CalendarIcon, DateIcon } from '@entur/icons';
8
- import { Heading3 } from '@entur/typography';
12
+ import { useButton } from '@react-aria/button';
9
13
  import { IconButton } from '@entur/button';
10
- import { TextField, BaseFormControl, useVariant, useInputGroupContext, isFilled } from '@entur/form';
11
- import { Tooltip } from '@entur/tooltip';
12
- import 'react-datepicker/dist/react-datepicker.css';
13
- import { useDateSegment, useTimeField } from '@react-aria/datepicker';
14
- import { useLocale, I18nProvider } from '@react-aria/i18n';
15
- import { useTimeFieldState } from '@react-stately/datepicker';
16
- import { now, getLocalTimeZone, ZonedDateTime, parseAbsolute, Time, CalendarDateTime } from '@internationalized/date';
14
+ import { VisuallyHidden } from '@entur/a11y';
15
+ import { useFloating, autoUpdate, offset, flip, shift } from '@floating-ui/react-dom';
16
+ import FocusLock from 'react-focus-lock';
17
+ import { space, zIndexes } from '@entur/tokens';
18
+ import { Modal } from '@entur/modal';
17
19
 
18
20
  function _extends() {
19
21
  _extends = Object.assign || function (target) {
@@ -48,432 +50,540 @@ function _objectWithoutPropertiesLoose(source, excluded) {
48
50
  return target;
49
51
  }
50
52
 
51
- var DatePickerHeader = function DatePickerHeader(_ref) {
52
- var _date$getMonth;
53
-
54
- var date = _ref.date,
55
- decreaseMonth = _ref.decreaseMonth,
56
- increaseMonth = _ref.increaseMonth,
57
- prevMonthButtonDisabled = _ref.prevMonthButtonDisabled,
58
- nextMonthButtonDisabled = _ref.nextMonthButtonDisabled,
59
- nextMonthAriaLabel = _ref.nextMonthAriaLabel,
60
- previousMonthAriaLabel = _ref.previousMonthAriaLabel,
61
- locale = _ref.locale;
62
- var currentMonthIndex = (_date$getMonth = date == null ? void 0 : date.getMonth()) != null ? _date$getMonth : 0;
63
- return React.createElement("div", {
64
- className: "eds-datepicker__calender__header"
65
- }, React.createElement(IconButton, {
66
- type: "button",
67
- className: "eds-datepicker__calender__header__month-button--left",
68
- onClick: decreaseMonth,
69
- disabled: prevMonthButtonDisabled,
70
- "aria-label": previousMonthAriaLabel + " (" + getMonthName(currentMonthIndex - 1, locale) + ")"
71
- }, React.createElement(LeftArrowIcon, null)), React.createElement(Heading3, {
72
- className: "eds-datepicker__calender__header__month-text"
73
- }, getMonthName(currentMonthIndex, locale)), React.createElement(Heading3, {
74
- className: "eds-datepicker__calender__header__month-text"
75
- }, date == null ? void 0 : date.getFullYear()), React.createElement(IconButton, {
76
- type: "button",
77
- className: "eds-datepicker__calender__header__month-button--right",
78
- onClick: increaseMonth,
79
- disabled: nextMonthButtonDisabled,
80
- "aria-label": nextMonthAriaLabel + " (" + getMonthName(currentMonthIndex + 1, locale) + ")"
81
- }, React.createElement(RightArrowIcon, null)));
82
- };
53
+ var FieldSegment = function FieldSegment(_ref) {
54
+ var segment = _ref.segment,
55
+ state = _ref.state;
56
+ var ref = useRef(null);
83
57
 
84
- function getMonthName(monthIndex, locale) {
85
- var year = new Date().getFullYear();
86
- var formatter = new Intl.DateTimeFormat(locale.code, {
87
- month: 'long'
58
+ var _useDateSegment = useDateSegment(segment, state, ref),
59
+ segmentProps = _useDateSegment.segmentProps;
60
+
61
+ var is12HourFormatted = state.segments.some(function (segment) {
62
+ return segment.text === 'AM' || segment.text === 'PM';
88
63
  });
89
- return formatter.format(new Date(year, monthIndex));
90
- }
91
64
 
92
- 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"];
93
- var DatePickerInput = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
94
- var style = _ref.style,
95
- label = _ref.label,
96
- inputPlaceholder = _ref.inputPlaceholder,
97
- prepend = _ref.prepend,
98
- feedback = _ref.feedback,
99
- variant = _ref.variant,
100
- disabled = _ref.disabled,
101
- calendarButtonTooltipOpen = _ref.calendarButtonTooltipOpen,
102
- calendarButtonTooltipClose = _ref.calendarButtonTooltipClose,
103
- hideCalendarButton = _ref.hideCalendarButton,
104
- disableLabelAnimation = _ref.disableLabelAnimation,
105
- inputRef = _ref.inputRef,
106
- calendarButtonId = _ref.calendarButtonId,
107
- forwardRef = _ref.forwardRef,
108
- toggleCalendarGUI = _ref.toggleCalendarGUI,
109
- onKeyDownInput = _ref.onKeyDownInput,
110
- onBlurInput = _ref.onBlurInput,
111
- selectedDate = _ref.selectedDate,
112
- setFocusToCalendarGUI = _ref.setFocusToCalendarGUI,
113
- setShouldFocusOnCalendarButtonAfterSelect = _ref.setShouldFocusOnCalendarButtonAfterSelect,
114
- calendarGUIIsOpen = _ref.calendarGUIIsOpen,
115
- onClick = _ref.onClick,
116
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$4);
65
+ var segmentDisplayText = function segmentDisplayText() {
66
+ if (is12HourFormatted) return segment.text; // if number add '0' padding to start when one digit
117
67
 
118
- React.useEffect(function () {
119
- var _inputRef$current, _inputRef$current2, _inputRef$current3;
120
-
121
- (_inputRef$current = inputRef.current) == null ? void 0 : _inputRef$current.addEventListener('keydown', handleOnKeyDown);
122
- (_inputRef$current2 = inputRef.current) == null ? void 0 : _inputRef$current2.addEventListener('blur', handleOnBlur);
123
- (_inputRef$current3 = inputRef.current) == null ? void 0 : _inputRef$current3.addEventListener('focus', handleOnFocus);
124
- return function () {
125
- var _inputRef$current4, _inputRef$current5, _inputRef$current6;
126
-
127
- (_inputRef$current4 = inputRef.current) == null ? void 0 : _inputRef$current4.removeEventListener('keydown', handleOnKeyDown);
128
- (_inputRef$current5 = inputRef.current) == null ? void 0 : _inputRef$current5.removeEventListener('blur', handleOnBlur);
129
- (_inputRef$current6 = inputRef.current) == null ? void 0 : _inputRef$current6.removeEventListener('focus', handleOnFocus);
130
- }; // eslint-disable-next-line react-hooks/exhaustive-deps
131
- }, [inputRef, selectedDate]);
132
-
133
- function handleOnKeyDown(event) {
134
- onKeyDownInput(event);
68
+ if (segment.text.match(/\d+/)) return segment.text.padStart(2, '0');
69
+ return segment.text;
70
+ };
71
+
72
+ return React.createElement("div", _extends({}, segmentProps, {
73
+ ref: ref,
74
+ className: classNames('eds-date-and-time-field__segment', {
75
+ 'eds-date-and-time-field__segment--placeholder': segment.isPlaceholder,
76
+ 'eds-date-and-time-field__segment--dot-separator': segment.text === '.'
77
+ }),
78
+ tabIndex: state.isDisabled ? -1 : segmentProps.tabIndex
79
+ }), segmentDisplayText());
80
+ };
81
+
82
+ /**
83
+ * Tar inn et JS Date-objekt og returnerer et av Date- eller TimeValue-objektene fra @internationalized/date-pakken
84
+ * @param {Date} date JS Date-objekt som ønskes konvertert til et Date- eller TimeValue-objekt
85
+ * @param {boolean} noDateOnlyTime Hvis datoen er irrelevant kan denne settes til true, da får man et Time-objekt uten dato tilbake
86
+ * @param {boolean} noTimeOnlyDate Hvis tidspunktet er irrelevant kan denne settes til true, da får man et CalendarDate-objekt uten tidspunkt tilbake
87
+ * @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
88
+ * @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.
89
+ * @returns {Time | CalendarDateTime | ZonedDateTime | CalendarDate} et av Time- eller DateValue-objektene med verdier fra date
90
+ */
91
+
92
+ var nativeDateToTimeOrDateValue = function nativeDateToTimeOrDateValue(date, noDateOnlyTime, noTimeOnlyDate, timeZone, offset) {
93
+ if (noDateOnlyTime === void 0) {
94
+ noDateOnlyTime = false;
135
95
  }
136
96
 
137
- function handleOnBlur(event) {
138
- onBlurInput(event);
97
+ if (noTimeOnlyDate === void 0) {
98
+ noTimeOnlyDate = false;
139
99
  }
140
100
 
141
- var handleOnFocus = function handleOnFocus() {
142
- return requestAnimationFrame(function () {
143
- var _inputRef$current7;
101
+ if (timeZone) {
102
+ if (offset) {
103
+ return new ZonedDateTime(date.getFullYear(), date.getMonth() + 1, date.getDate(), timeZone, offset, date.getHours(), date.getMinutes(), date.getSeconds());
104
+ }
144
105
 
145
- return (_inputRef$current7 = inputRef.current) == null ? void 0 : _inputRef$current7.select();
146
- });
147
- };
106
+ return parseAbsolute(date.toISOString(), timeZone);
107
+ }
148
108
 
149
- var handleOnClickInputField = function handleOnClickInputField(event) {
150
- setShouldFocusOnCalendarButtonAfterSelect(false);
151
- onClick && onClick(event);
152
- };
109
+ if (noDateOnlyTime) return new Time(date.getHours(), date.getMinutes(), date.getSeconds(), 0);
110
+ if (noTimeOnlyDate) return new CalendarDate(date.getFullYear(), date.getMonth() + 1, date.getDate());
111
+ return new CalendarDateTime(date.getFullYear(), date.getMonth() + 1, date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds());
112
+ };
113
+ /**
114
+ * Tar inn et av Date- eller TimeValue-objektene fra @internationalized/date-pakken og returnerer et JS Date-objekt
115
+ * @param {DateValue | TimeValue} value En dato eller et tidspunkt på Date- eller TimeValue-formatet som ønskes konvertert til et JS Date-objekt
116
+ * @param {string} timeZoneForCalendarDateTime Tidssonen value er i. Fungerer kun med typen er CalendarDateTime
117
+ * @returns {Date} et Date-objekt med verdier fra time
118
+ */
119
+ // This function uses a lot of @ts-expect-error to make it work with all Date- and TimeValue types. Sorry ...
153
120
 
154
- var handleOnClickCalendarButton = function handleOnClickCalendarButton() {
155
- toggleCalendarGUI();
156
- setFocusToCalendarGUI();
157
- setShouldFocusOnCalendarButtonAfterSelect(true);
158
- };
121
+ var timeOrDateValueToNativeDate = function timeOrDateValueToNativeDate(value, timeZoneForCalendarDateTime) {
122
+ // @ts-expect-error .day does not exist on Time-object
123
+ if (!value.day) {
124
+ // type is Time
125
+ var date = new Date(); // @ts-expect-error hour does not exist on CalendarDate
159
126
 
160
- var calendarButtonAriaLabel = function calendarButtonAriaLabel() {
161
- var _inputRef$current8;
127
+ date.setHours(value.hour); // @ts-expect-error minute does not exist on CalendarDate
162
128
 
163
- var buttonStateText = calendarGUIIsOpen() ? calendarButtonTooltipClose : calendarButtonTooltipOpen;
164
- var currentSelectionText = selectedDate ? ((_inputRef$current8 = inputRef.current) == null ? void 0 : _inputRef$current8.value) + " valgt" : 'Ingen dato valgt';
165
- return buttonStateText + ", " + currentSelectionText;
166
- };
129
+ date.setMinutes(value.minute); // @ts-expect-error second does not exist on CalendarDate
167
130
 
168
- return React.createElement(TextField, _extends({
169
- style: style,
170
- label: label,
171
- placeholder: inputPlaceholder,
172
- prepend: prepend,
173
- feedback: feedback,
174
- variant: variant,
175
- disableLabelAnimation: disableLabelAnimation,
176
- ref: mergeRefs(ref, inputRef, forwardRef),
177
- onClick: handleOnClickInputField,
178
- ariaAlertOnFeedback: true,
179
- append: !hideCalendarButton && React.createElement(Tooltip, {
180
- placement: "top",
181
- content: calendarGUIIsOpen() ? calendarButtonTooltipClose : calendarButtonTooltipOpen,
182
- disableHoverListener: disabled,
183
- disableFocusListener: disabled
184
- }, React.createElement(IconButton, {
185
- id: calendarButtonId,
186
- type: "button",
187
- onClick: handleOnClickCalendarButton,
188
- tabIndex: calendarGUIIsOpen() ? -1 : 0,
189
- "aria-label": calendarButtonAriaLabel()
190
- }, React.createElement(CalendarIcon, null)))
191
- }, rest));
192
- });
131
+ date.setSeconds(value.second);
132
+ return date;
133
+ } // @ts-expect-error .day does not exist on Time-object
193
134
 
194
- 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"];
195
- registerLocale('nb', nb);
196
- var DatePicker = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
197
- var style = _ref.style,
198
- className = _ref.className,
199
- selectedDate = _ref.selectedDate,
200
- label = _ref.label,
201
- _ref$placeholder = _ref.placeholder,
202
- placeholder = _ref$placeholder === void 0 ? 'dd.mm.yyyy' : _ref$placeholder,
203
- onChange = _ref.onChange,
204
- _ref$onKeyDown = _ref.onKeyDown,
205
- onKeyDown = _ref$onKeyDown === void 0 ? function () {
206
- return null;
207
- } : _ref$onKeyDown,
208
- _ref$dateFormats = _ref.dateFormats,
209
- dateFormats = _ref$dateFormats === void 0 ? ['dd.MM.yyyy', 'ddMMyyyy', 'dd/MM/yyyy', 'ddMMyy'] : _ref$dateFormats,
210
- minDate = _ref.minDate,
211
- maxDate = _ref.maxDate,
212
- _ref$inline = _ref.inline,
213
- inline = _ref$inline === void 0 ? false : _ref$inline,
214
- disabled = _ref.disabled,
215
- prepend = _ref.prepend,
216
- _ref$feedback = _ref.feedback,
217
- feedback = _ref$feedback === void 0 ? '' : _ref$feedback,
218
- variant = _ref.variant,
219
- _ref$validationFeedba = _ref.validationFeedback,
220
- validationFeedback = _ref$validationFeedba === void 0 ? 'Ugyldig dato' : _ref$validationFeedba,
221
- _ref$validationVarian = _ref.validationVariant,
222
- validationVariant = _ref$validationVarian === void 0 ? 'error' : _ref$validationVarian,
223
- _ref$disableLabelAnim = _ref.disableLabelAnimation,
224
- disableLabelAnimation = _ref$disableLabelAnim === void 0 ? false : _ref$disableLabelAnim,
225
- _ref$calendarButtonTo = _ref.calendarButtonTooltipOpen,
226
- calendarButtonTooltipOpen = _ref$calendarButtonTo === void 0 ? 'Åpne\xa0kalender' : _ref$calendarButtonTo,
227
- _ref$calendarButtonTo2 = _ref.calendarButtonTooltipClose,
228
- calendarButtonTooltipClose = _ref$calendarButtonTo2 === void 0 ? 'Lukk\xa0kalender' : _ref$calendarButtonTo2,
229
- _ref$hideCalendarButt = _ref.hideCalendarButton,
230
- hideCalendarButton = _ref$hideCalendarButt === void 0 ? false : _ref$hideCalendarButt,
231
- _ref$hideCalendar = _ref.hideCalendar,
232
- hideCalendar = _ref$hideCalendar === void 0 ? false : _ref$hideCalendar,
233
- _ref$hideValidation = _ref.hideValidation,
234
- hideValidation = _ref$hideValidation === void 0 ? false : _ref$hideValidation,
235
- _ref$weekLabel = _ref.weekLabel,
236
- weekLabel = _ref$weekLabel === void 0 ? 'uke' : _ref$weekLabel,
237
- _ref$chooseDayAriaLab = _ref.chooseDayAriaLabelPrefix,
238
- chooseDayAriaLabelPrefix = _ref$chooseDayAriaLab === void 0 ? 'Velg' : _ref$chooseDayAriaLab,
239
- _ref$previousMonthAri = _ref.previousMonthAriaLabel,
240
- previousMonthAriaLabel = _ref$previousMonthAri === void 0 ? 'Forrige måned' : _ref$previousMonthAri,
241
- _ref$nextMonthAriaLab = _ref.nextMonthAriaLabel,
242
- nextMonthAriaLabel = _ref$nextMonthAriaLab === void 0 ? 'Neste måned' : _ref$nextMonthAriaLab,
243
- _ref$locale = _ref.locale,
244
- locale = _ref$locale === void 0 ? nb : _ref$locale,
245
- open = _ref.open,
246
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$3);
247
135
 
248
- var datepickerId = useRandomId('eds-datepicker');
249
- var datepickerRef = useRef(null);
250
- var inputRef = React.useRef(null);
251
- var calendarButton = document.getElementById(datepickerId + '-button');
136
+ if (!value.hour) {
137
+ // type is CalendarDate
138
+ // @ts-expect-error .toDate(timeZone) does not exist in type Time
139
+ return value.toDate(timeZoneForCalendarDateTime != null ? timeZoneForCalendarDateTime : getLocalTimeZone());
140
+ } // @ts-expect-error .timeZone does not exist in type Time and CalendarDateTime
252
141
 
253
- var _useState = useState(false),
254
- showValidation = _useState[0],
255
- setShowValidation = _useState[1];
256
142
 
257
- var _useState2 = useState(false),
258
- shouldFocusOnCalendarButtonAfterSelect = _useState2[0],
259
- setShouldFocusOnCalendarButtonAfterSelect = _useState2[1]; // eslint-disable-next-line react-hooks/exhaustive-deps
143
+ if (!value.timeZone) {
144
+ // type is CalendarDateTime
145
+ if (timeZoneForCalendarDateTime) // @ts-expect-error .toDate(timeZone) does not exist in type Time
146
+ return value.toDate(timeZoneForCalendarDateTime);
147
+ return new Date( // @ts-expect-error not in type Time
148
+ value.year, // @ts-expect-error not in type Time
149
+ value.month - 1, // @ts-expect-error not in type Time
150
+ value.day, // @ts-expect-error not in type CalendarDate
151
+ value.hour, // @ts-expect-error not in type CalendarDate
152
+ value.minute, // @ts-expect-error not in type CalendarDate
153
+ value.second);
154
+ } // @ts-expect-error .toDate() does not exist in type Time or CalendarDateTime
260
155
 
261
156
 
262
- React.useEffect(function () {
263
- return validateInput();
264
- }, [selectedDate]);
157
+ return value.toDate();
158
+ };
159
+ var createCalendar = function createCalendar(identifier) {
160
+ if (identifier === void 0) {
161
+ identifier = 'gregory';
162
+ }
265
163
 
266
- var handleOnChange = function handleOnChange(date, event) {
267
- var _inputRef$current;
164
+ switch (identifier) {
165
+ case 'gregory':
166
+ return new GregorianCalendar();
268
167
 
269
- if (shouldFocusOnCalendarButtonAfterSelect && !hideCalendarButton) {
270
- calendarButton == null ? void 0 : calendarButton.focus();
271
- setShouldFocusOnCalendarButtonAfterSelect(false);
272
- } else (_inputRef$current = inputRef.current) == null ? void 0 : _inputRef$current.focus();
168
+ default:
169
+ throw new Error("Unsupported calendar " + identifier);
170
+ }
171
+ };
172
+ var ariaLabelIfNorwegian = function ariaLabelIfNorwegian(norwegianAriaLabel, locale, propsCollection) {
173
+ if (locale.toLowerCase() !== 'no-no') return propsCollection['aria-label'];
174
+ return norwegianAriaLabel;
175
+ };
273
176
 
274
- onChange(date, event);
275
- };
177
+ var _excluded$8 = ["selectedDate", "label", "locale", "showTimeZone", "showTime", "granularity", "disabled", "variant", "feedback", "validationVariant", "validationFeedback", "labelTooltip", "style", "className", "labelProps", "append"];
178
+ var DateField = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
179
+ var value = _ref.selectedDate,
180
+ label = _ref.label,
181
+ customLocale = _ref.locale,
182
+ showTimeZone = _ref.showTimeZone,
183
+ showTime = _ref.showTime,
184
+ _ref$granularity = _ref.granularity,
185
+ granularity = _ref$granularity === void 0 ? 'day' : _ref$granularity,
186
+ disabled = _ref.disabled,
187
+ variant = _ref.variant,
188
+ feedback = _ref.feedback,
189
+ _ref$validationVarian = _ref.validationVariant,
190
+ validationVariant = _ref$validationVarian === void 0 ? 'error' : _ref$validationVarian,
191
+ _ref$validationFeedba = _ref.validationFeedback,
192
+ validationFeedback = _ref$validationFeedba === void 0 ? 'Ugyldig dato' : _ref$validationFeedba,
193
+ labelTooltip = _ref.labelTooltip,
194
+ style = _ref.style,
195
+ className = _ref.className,
196
+ parentLabelProps = _ref.labelProps,
197
+ append = _ref.append,
198
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$8);
276
199
 
277
- var handleOnKeyDown = function handleOnKeyDown(event) {
278
- setShowValidation(false);
200
+ var _useLocale = useLocale(),
201
+ locale = _useLocale.locale;
279
202
 
280
- if (event.key === 'Enter') {
281
- if (!datePickerGUIIsOpen()) {
282
- // onBlurInput will validate if calendar is open
283
- validateInput();
284
- forceUpdateInputFormat();
285
- }
203
+ var state = useDateFieldState(_extends({}, rest, {
204
+ locale: customLocale != null ? customLocale : locale,
205
+ createCalendar: createCalendar,
206
+ value: value === null ? undefined : value,
207
+ hideTimeZone: !showTimeZone,
208
+ granularity: showTime ? 'minute' : granularity
209
+ }));
210
+ var dateFieldRef = useRef(null);
286
211
 
287
- focusAndSelectInputField();
288
- } else if (event.key === 'Tab' && datePickerGUIIsOpen()) {
289
- forceUpdateInputFormat();
290
- } else if (event.key === 'Escape') {
291
- forceUpdateInputFormat();
292
- focusAndSelectInputField();
293
- if (datePickerGUIIsOpen()) toggleCalendarGUI();
212
+ var _useDateField = useDateField(_extends({}, rest, {
213
+ label: label,
214
+ isDisabled: disabled || rest.isDisabled
215
+ }), state, dateFieldRef),
216
+ labelProps = _useDateField.labelProps,
217
+ fieldProps = _useDateField.fieldProps;
218
+
219
+ var id = useRandomId('datefield');
220
+ return React.createElement(ConditionalWrapper, {
221
+ condition: customLocale !== undefined,
222
+ wrapper: function wrapper(child) {
223
+ return React.createElement(I18nProvider, {
224
+ locale: customLocale
225
+ }, child);
294
226
  }
227
+ }, React.createElement(BaseFormControl, _extends({
228
+ style: style,
229
+ className: classNames('eds-datefield', className),
230
+ labelId: id,
231
+ ref: mergeRefs(dateFieldRef, ref),
232
+ disabled: state.isDisabled,
233
+ disableLabelAnimation: true,
234
+ label: label,
235
+ labelTooltip: labelTooltip,
236
+ labelProps: parentLabelProps != null ? parentLabelProps : labelProps
237
+ }, fieldProps, {
238
+ variant: (variant != null ? variant : state.validationState === 'invalid') ? validationVariant : undefined,
239
+ feedback: (feedback != null ? feedback : state.validationState === 'invalid') ? validationFeedback : undefined,
240
+ append: append,
241
+ ariaAlertOnFeedback: true
242
+ }), state.segments.map(function (segment, i) {
243
+ return React.createElement(FieldSegment, {
244
+ segment: segment,
245
+ state: state,
246
+ key: i
247
+ });
248
+ })));
249
+ });
295
250
 
296
- onKeyDown(event);
297
- };
298
-
299
- var handleOnClickOutside = function handleOnClickOutside() {
300
- return setShouldFocusOnCalendarButtonAfterSelect(false);
301
- };
251
+ var _excluded$7 = ["children", "className", "style"];
252
+ var CalendarButton = function CalendarButton(_ref) {
253
+ var children = _ref.children,
254
+ className = _ref.className,
255
+ style = _ref.style,
256
+ props = _objectWithoutPropertiesLoose(_ref, _excluded$7);
302
257
 
303
- var handleOnBlurInput = function handleOnBlurInput() {
304
- if (datePickerGUIIsOpen()) return;
305
- validateInput();
306
- forceUpdateInputFormat();
307
- };
258
+ var ref = useRef(null);
308
259
 
309
- var validateInput = function validateInput() {
310
- var _inputRef$current2;
260
+ var _useButton = useButton(props, ref),
261
+ buttonProps = _useButton.buttonProps;
311
262
 
312
- setShowValidation(false);
313
- var inputValue = (_inputRef$current2 = inputRef.current) == null ? void 0 : _inputRef$current2.value;
314
- if (!inputValue) return;
315
- var inputValueParsedWithAllDateFormats = dateFormats.map(function (format) {
316
- return parse(inputValue, format, new Date(), {
317
- locale: locale
318
- });
319
- });
320
- var parsedDateFromInputIsTheSameAsSelectedDate = selectedDate && inputValueParsedWithAllDateFormats.some(function (dateFormat) {
321
- return isSameDay(dateFormat, selectedDate);
322
- });
263
+ return React.createElement(IconButton, _extends({}, buttonProps, {
264
+ ref: ref,
265
+ className: className,
266
+ style: style
267
+ }), children);
268
+ };
323
269
 
324
- if (parsedDateFromInputIsTheSameAsSelectedDate) {
325
- // valid date inputted
326
- setShowValidation(false);
327
- } else {
328
- // invalid date inputted
329
- setShowValidation(true);
270
+ var _excluded$6 = ["state", "date", "onSelectedCellClick"];
271
+ var CalendarCell = function CalendarCell(_ref) {
272
+ var _state$timeZone;
273
+
274
+ var state = _ref.state,
275
+ date = _ref.date,
276
+ _ref$onSelectedCellCl = _ref.onSelectedCellClick,
277
+ onSelectedCellClick = _ref$onSelectedCellCl === void 0 ? function () {
278
+ return;
279
+ } : _ref$onSelectedCellCl,
280
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$6);
281
+
282
+ var cellRef = useRef(null);
283
+
284
+ var _useCalendarCell = useCalendarCell({
285
+ date: date
286
+ }, state, cellRef),
287
+ cellProps = _useCalendarCell.cellProps,
288
+ buttonProps = _useCalendarCell.buttonProps,
289
+ isSelected = _useCalendarCell.isSelected,
290
+ isOutsideVisibleRange = _useCalendarCell.isOutsideVisibleRange,
291
+ isDisabled = _useCalendarCell.isDisabled,
292
+ isUnavailable = _useCalendarCell.isUnavailable,
293
+ formattedDate = _useCalendarCell.formattedDate;
294
+
295
+ return React.createElement("td", _extends({}, cellProps, {
296
+ className: "eds-datepicker__calendar__grid__cell__td"
297
+ }), React.createElement("div", _extends({}, buttonProps, {
298
+ ref: cellRef,
299
+ hidden: isOutsideVisibleRange,
300
+ className: classNames('eds-datepicker__calendar__grid__cell', {
301
+ 'eds-datepicker__calendar__grid__cell--selected': isSelected,
302
+ 'eds-datepicker__calendar__grid__cell--disabled': isDisabled || isUnavailable,
303
+ 'eds-datepicker__calendar__grid__cell--outside-month': isOutsideVisibleRange,
304
+ 'eds-datepicker__calendar__grid__cell--today': isEqualDay(date, now((_state$timeZone = state.timeZone) != null ? _state$timeZone : getLocalTimeZone()))
305
+ })
306
+ }, rest, {
307
+ onClick: function onClick(e) {
308
+ buttonProps.onClick && buttonProps.onClick(e);
309
+ isSelected && onSelectedCellClick();
330
310
  }
331
- };
311
+ }), formattedDate));
312
+ };
332
313
 
333
- var getFeedbackAndVariant = function getFeedbackAndVariant() {
334
- if (feedback) return {
335
- feedback: feedback,
336
- variant: variant
337
- };
338
- if (!hideValidation && showValidation) return {
339
- feedback: validationFeedback,
340
- variant: validationVariant
341
- };
342
- return {
343
- feedback: '',
344
- variant: undefined
345
- };
346
- };
314
+ var _excluded$5 = ["state", "navigationDescription", "onSelectedCellClick"];
315
+ var CalendarGrid = function CalendarGrid(_ref) {
316
+ var state = _ref.state,
317
+ navigationDescription = _ref.navigationDescription,
318
+ _ref$onSelectedCellCl = _ref.onSelectedCellClick,
319
+ onSelectedCellClick = _ref$onSelectedCellCl === void 0 ? function () {
320
+ return;
321
+ } : _ref$onSelectedCellCl,
322
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$5);
347
323
 
348
- var focusAndSelectInputField = function focusAndSelectInputField() {
349
- return requestAnimationFrame(function () {
350
- var _inputRef$current3;
324
+ var calendarGridId = useRandomId('eds-calendar');
351
325
 
352
- return (_inputRef$current3 = inputRef.current) == null ? void 0 : _inputRef$current3.select();
353
- });
354
- };
326
+ var _useLocale = useLocale(),
327
+ locale = _useLocale.locale;
355
328
 
356
- var forceUpdateInputFormat = function forceUpdateInputFormat() {
357
- var _datepickerRef$curren;
329
+ var _useCalendarGrid = useCalendarGrid(rest, state),
330
+ gridProps = _useCalendarGrid.gridProps,
331
+ headerProps = _useCalendarGrid.headerProps,
332
+ weekDays = _useCalendarGrid.weekDays;
358
333
 
359
- return (_datepickerRef$curren = datepickerRef.current) == null ? void 0 : _datepickerRef$curren.setState({
360
- inputValue: null
334
+ var weeksInMonth = getWeeksInMonth(state.visibleRange.start, locale);
335
+ var weeksArray = Array.from(Array(weeksInMonth).keys());
336
+
337
+ var weekDaysMapped = function weekDaysMapped() {
338
+ if (locale.toLowerCase() === 'no-no' || locale.toLowerCase() === 'no') return ['ma', 'ti', 'on', 'to', 'fr', 'lø', 'sø'];
339
+ if (weekDays.toString() === 'M,T,W,T,F,S,S') return ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'];
340
+ return weekDays.map(function (day) {
341
+ return day.toLowerCase();
361
342
  });
362
343
  };
363
344
 
364
- var toggleCalendarGUI = function toggleCalendarGUI() {
365
- var _datepickerRef$curren2;
366
-
367
- return (_datepickerRef$curren2 = datepickerRef.current) == null ? void 0 : _datepickerRef$curren2.setOpen(!datePickerGUIIsOpen());
345
+ var getNavigationDescription = function getNavigationDescription() {
346
+ if (navigationDescription) return navigationDescription;
347
+ if (locale.toLowerCase().includes('en')) return 'Use the arrow keys to navigate between dates';
348
+ return 'Bruk piltastene til å navigere mellom datoer';
368
349
  };
369
350
 
370
- var setFocusToCalendarGUI = function setFocusToCalendarGUI() {
371
- if (inline || hideCalendar || datePickerGUIIsOpen()) return; // 1 frame delay to allow calendar to spawn
351
+ return React.createElement(React.Fragment, null, React.createElement("table", _extends({}, gridProps, {
352
+ cellSpacing: "0",
353
+ className: "eds-datepicker__calendar__grid"
354
+ }), React.createElement("thead", _extends({}, headerProps), React.createElement("tr", null, weekDaysMapped().map(function (day, index) {
355
+ return React.createElement("th", {
356
+ key: index
357
+ }, day);
358
+ }))), React.createElement("tbody", null, weeksArray.map(function (weekIndex) {
359
+ return React.createElement("tr", {
360
+ key: weekIndex
361
+ }, state.getDatesInWeek(weekIndex).map(function (date, i) {
362
+ return date ? React.createElement(CalendarCell, {
363
+ key: i,
364
+ state: state,
365
+ date: date,
366
+ "aria-describedby": calendarGridId + 'description',
367
+ onSelectedCellClick: onSelectedCellClick
368
+ }) : React.createElement("td", {
369
+ key: i
370
+ });
371
+ }));
372
+ }))), React.createElement(VisuallyHidden, {
373
+ id: calendarGridId + 'description'
374
+ }, getNavigationDescription()));
375
+ };
376
+
377
+ var _excluded$4 = ["selectedDate", "onChange", "locale", "style", "children", "navigationDescription", "onSelectedCellClick"];
378
+ var Calendar = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
379
+ var onChange = _ref.onChange,
380
+ customLocale = _ref.locale,
381
+ style = _ref.style,
382
+ navigationDescription = _ref.navigationDescription,
383
+ _ref$onSelectedCellCl = _ref.onSelectedCellClick,
384
+ onSelectedCellClick = _ref$onSelectedCellCl === void 0 ? function () {
385
+ return;
386
+ } : _ref$onSelectedCellCl,
387
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$4);
372
388
 
373
- requestAnimationFrame(function () {
374
- var _datepickerRef$curren3;
389
+ var _useLocale = useLocale(),
390
+ locale = _useLocale.locale;
375
391
 
376
- var datepickerGUIWrapper = // @ts-expect-error .calendar does actually exist in ReactDatePicker ref
377
- (_datepickerRef$curren3 = datepickerRef.current) == null ? void 0 : _datepickerRef$curren3.calendar.componentNode;
378
- var dateToSetFocusTo = selectedDate ? datepickerGUIWrapper.querySelector('.eds-datepicker__calender__day[tabindex="0"]') : datepickerGUIWrapper.querySelector('.eds-datepicker__calender__day[aria-current="date"]');
392
+ var state = useCalendarState(_extends({}, rest, {
393
+ onChange: onChange,
394
+ locale: customLocale != null ? customLocale : locale,
395
+ createCalendar: createCalendar
396
+ }));
397
+
398
+ var _useCalendar = useCalendar(rest, state),
399
+ calendarProps = _useCalendar.calendarProps,
400
+ prevButtonProps = _useCalendar.prevButtonProps,
401
+ nextButtonProps = _useCalendar.nextButtonProps,
402
+ title = _useCalendar.title;
403
+
404
+ return React.createElement(ConditionalWrapper, {
405
+ condition: customLocale,
406
+ wrapper: function wrapper(child) {
407
+ return React.createElement(I18nProvider, {
408
+ locale: customLocale
409
+ }, child);
410
+ }
411
+ }, React.createElement("div", _extends({}, calendarProps, {
412
+ ref: ref,
413
+ className: "eds-datepicker__calendar",
414
+ style: style
415
+ }), React.createElement("div", {
416
+ className: "eds-datepicker__calendar__header"
417
+ }, React.createElement(CalendarButton, _extends({}, prevButtonProps, {
418
+ "aria-label": ariaLabelIfNorwegian('Forrige måned', locale, prevButtonProps)
419
+ }), React.createElement(LeftArrowIcon, {
420
+ size: 20
421
+ })), React.createElement("h2", null, title), React.createElement(CalendarButton, _extends({}, nextButtonProps, {
422
+ "aria-label": ariaLabelIfNorwegian('Neste måned', locale, nextButtonProps)
423
+ }), React.createElement(RightArrowIcon, {
424
+ size: 20
425
+ }))), React.createElement(CalendarGrid, {
426
+ state: state,
427
+ navigationDescription: navigationDescription,
428
+ onSelectedCellClick: onSelectedCellClick
429
+ })));
430
+ });
379
431
 
380
- if (dateToSetFocusTo !== null) {
381
- var _datepickerRef$curren4;
432
+ var _excluded$3 = ["selectedDate", "onChange", "locale", "disabled", "showTime", "showTimeZone", "className", "style", "variant", "feedback", "validationVariant", "validationFeedback", "disableModal", "labelTooltip", "navigationDescription", "minDate", "maxDate", "modalTreshold"];
433
+ var DatePicker = function DatePicker(_ref) {
434
+ var value = _ref.selectedDate,
435
+ onChange = _ref.onChange,
436
+ locale = _ref.locale,
437
+ isDisabled = _ref.disabled,
438
+ showTime = _ref.showTime,
439
+ _ref$showTimeZone = _ref.showTimeZone,
440
+ showTimeZone = _ref$showTimeZone === void 0 ? false : _ref$showTimeZone,
441
+ className = _ref.className,
442
+ variant = _ref.variant,
443
+ feedback = _ref.feedback,
444
+ validationVariant = _ref.validationVariant,
445
+ validationFeedback = _ref.validationFeedback,
446
+ _ref$disableModal = _ref.disableModal,
447
+ disableModal = _ref$disableModal === void 0 ? false : _ref$disableModal,
448
+ labelTooltip = _ref.labelTooltip,
449
+ navigationDescription = _ref.navigationDescription,
450
+ minValue = _ref.minDate,
451
+ maxValue = _ref.maxDate,
452
+ _ref$modalTreshold = _ref.modalTreshold,
453
+ modalTreshold = _ref$modalTreshold === void 0 ? 1000 : _ref$modalTreshold,
454
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$3);
382
455
 
383
- (_datepickerRef$curren4 = datepickerRef.current) == null ? void 0 : _datepickerRef$curren4.setBlur();
384
- dateToSetFocusTo.focus({
385
- preventScroll: true
386
- });
387
- }
456
+ var CALENDAR_MODAL_MAX_SCREEN_WIDTH = modalTreshold;
457
+ var datePickerRef = useRef(null);
458
+ var calendarRef = useRef(null);
459
+ var dateFieldRef = useRef(null);
460
+
461
+ var _useWindowDimensions = useWindowDimensions(),
462
+ width = _useWindowDimensions.width;
463
+
464
+ var state = useDatePickerState(_extends({}, rest, {
465
+ minValue: minValue,
466
+ maxValue: maxValue,
467
+ value: value,
468
+ onChange: onChange
469
+ }));
470
+
471
+ var _useDatePicker = useDatePicker(_extends({
472
+ isDisabled: isDisabled,
473
+ minValue: minValue,
474
+ maxValue: maxValue,
475
+ autoFocus: true
476
+ }, rest), state, datePickerRef),
477
+ groupProps = _useDatePicker.groupProps,
478
+ labelProps = _useDatePicker.labelProps,
479
+ fieldProps = _useDatePicker.fieldProps,
480
+ buttonProps = _useDatePicker.buttonProps,
481
+ dialogProps = _useDatePicker.dialogProps,
482
+ calendarProps = _useDatePicker.calendarProps; // calculations for floating-UI popover position
483
+
484
+
485
+ var _useFloating = useFloating({
486
+ whileElementsMounted: autoUpdate,
487
+ placement: 'bottom-start',
488
+ middleware: [offset(space.extraSmall), flip(), shift({
489
+ padding: space.extraSmall
490
+ })]
491
+ }),
492
+ x = _useFloating.x,
493
+ y = _useFloating.y,
494
+ reference = _useFloating.reference,
495
+ floating = _useFloating.floating,
496
+ strategy = _useFloating.strategy;
497
+
498
+ var onChangeCalendar = function onChangeCalendar(newSelectedDate) {
499
+ // Necessary to avoid state update on unmounted component
500
+ requestAnimationFrame(function () {
501
+ calendarProps.onChange && calendarProps.onChange(newSelectedDate);
388
502
  });
389
- setShouldFocusOnCalendarButtonAfterSelect(true);
390
- setShowValidation(false);
391
503
  };
392
504
 
393
- var datePickerGUIIsOpen = function datePickerGUIIsOpen() {
394
- var _datepickerRef$curren5;
505
+ useOnClickOutside([calendarRef], function () {
506
+ state.setOpen(false);
507
+ });
508
+ useOnEscape(calendarRef, function () {
509
+ state.setOpen(false);
510
+ });
395
511
 
396
- return (_datepickerRef$curren5 = datepickerRef.current) == null ? void 0 : _datepickerRef$curren5.isCalendarOpen();
397
- };
512
+ var calendarSharedProps = _extends({}, dialogProps, calendarProps, {
513
+ disabled: calendarProps.isDisabled,
514
+ navigationDescription: navigationDescription,
515
+ onSelectedCellClick: function onSelectedCellClick() {
516
+ return state.setOpen(false);
517
+ },
518
+ onChange: onChangeCalendar
519
+ });
398
520
 
399
- return React.createElement(React.Fragment, null, React.createElement(ReactDatepicker, _extends({
400
- selected: selectedDate,
401
- minDate: minDate,
402
- maxDate: maxDate,
403
- dateFormat: dateFormats,
404
- showWeekNumbers: true,
405
- weekLabel: weekLabel,
406
- onChange: handleOnChange,
407
- onClickOutside: handleOnClickOutside,
408
- id: datepickerId,
409
- ariaLabelledBy: datepickerId,
410
- showPopperArrow: false,
411
- locale: locale,
412
- inline: inline,
413
- disabled: disabled,
414
- preventOpenOnFocus: true,
415
- chooseDayAriaLabelPrefix: chooseDayAriaLabelPrefix,
416
- open: hideCalendar ? false : open,
417
- ref: datepickerRef,
418
- calendarClassName: "eds-datepicker__calender",
419
- dayClassName: function dayClassName() {
420
- return 'eds-datepicker__calender__day';
521
+ var useModal = width <= CALENDAR_MODAL_MAX_SCREEN_WIDTH && !disableModal;
522
+ var popoverCalendar = React.createElement("div", {
523
+ // styling for floating-UI popover
524
+ style: {
525
+ position: strategy,
526
+ top: y != null ? y : 0,
527
+ left: x != null ? x : 0,
528
+ zIndex: zIndexes.popover
421
529
  },
422
- weekDayClassName: function weekDayClassName() {
423
- return 'eds-datepicker__calender__day-name';
530
+ ref: function ref(node) {
531
+ floating(node);
532
+ }
533
+ }, React.createElement(FocusLock, {
534
+ disabled: !state.isOpen || useModal,
535
+ returnFocus: true
536
+ }, state.isOpen && React.createElement(Calendar, _extends({}, calendarSharedProps, {
537
+ ref: calendarRef
538
+ }))));
539
+ var modalCalendar = React.createElement(Modal, {
540
+ size: "small",
541
+ title: "",
542
+ open: state.isOpen,
543
+ onDismiss: function onDismiss() {
544
+ return state.setOpen(false);
424
545
  },
425
- className: classNames(className, 'eds-datepicker__input'),
426
- highlightDates: [{
427
- 'eds-datepicker__calender__day--today': [new Date()]
428
- }, {
429
- 'eds-datepicker__calender__day--selected': selectedDate ? [selectedDate] : []
430
- }],
431
- renderCustomHeader: function renderCustomHeader(_ref2) {
432
- var date = _ref2.date,
433
- changeYear = _ref2.changeYear,
434
- changeMonth = _ref2.changeMonth,
435
- decreaseMonth = _ref2.decreaseMonth,
436
- increaseMonth = _ref2.increaseMonth,
437
- prevMonthButtonDisabled = _ref2.prevMonthButtonDisabled,
438
- nextMonthButtonDisabled = _ref2.nextMonthButtonDisabled;
439
- return React.createElement(DatePickerHeader, {
440
- date: date,
441
- changeYear: changeYear,
442
- changeMonth: changeMonth,
443
- increaseMonth: increaseMonth,
444
- decreaseMonth: decreaseMonth,
445
- prevMonthButtonDisabled: prevMonthButtonDisabled,
446
- nextMonthButtonDisabled: nextMonthButtonDisabled,
447
- previousMonthAriaLabel: previousMonthAriaLabel,
448
- nextMonthAriaLabel: nextMonthAriaLabel,
546
+ closeOnClickOutside: true,
547
+ className: "eds-datepicker__calendar-modal"
548
+ }, React.createElement(Calendar, _extends({}, calendarSharedProps)));
549
+ return React.createElement(ConditionalWrapper, {
550
+ condition: locale !== undefined,
551
+ wrapper: function wrapper(child) {
552
+ return React.createElement(I18nProvider, {
449
553
  locale: locale
450
- });
554
+ }, child);
555
+ }
556
+ }, React.createElement("div", {
557
+ className: classNames('eds-datepicker', className)
558
+ }, React.createElement("div", _extends({}, groupProps, {
559
+ ref: function ref(node) {
560
+ datePickerRef.current = node;
561
+ reference(node);
451
562
  },
452
- customInput: React.createElement(DatePickerInput, {
453
- style: style,
454
- label: label,
455
- inputPlaceholder: placeholder,
456
- calendarButtonTooltipOpen: calendarButtonTooltipOpen,
457
- calendarButtonTooltipClose: calendarButtonTooltipClose,
458
- prepend: prepend,
459
- feedback: getFeedbackAndVariant().feedback,
460
- variant: getFeedbackAndVariant().variant,
461
- inputRef: inputRef,
462
- calendarButtonId: datepickerId + '-button',
463
- forwardRef: ref,
464
- onKeyDownInput: handleOnKeyDown,
465
- onBlurInput: handleOnBlurInput,
466
- onFocus: undefined,
467
- toggleCalendarGUI: toggleCalendarGUI,
468
- setFocusToCalendarGUI: setFocusToCalendarGUI,
469
- setShouldFocusOnCalendarButtonAfterSelect: setShouldFocusOnCalendarButtonAfterSelect,
470
- calendarGUIIsOpen: datePickerGUIIsOpen,
471
- disableLabelAnimation: disableLabelAnimation,
472
- hideCalendarButton: hideCalendarButton,
473
- selectedDate: selectedDate
563
+ id: undefined,
564
+ className: "eds-datepicker__datefield__wrapper"
565
+ }), React.createElement(DateField, _extends({}, fieldProps, {
566
+ selectedDate: state.value,
567
+ label: rest.label,
568
+ labelProps: labelProps,
569
+ showTime: showTime,
570
+ showTimeZone: showTimeZone,
571
+ ref: dateFieldRef,
572
+ variant: variant,
573
+ feedback: feedback,
574
+ validationVariant: validationVariant,
575
+ validationFeedback: validationFeedback,
576
+ labelTooltip: labelTooltip,
577
+ className: classNames('eds-datepicker__datefield', {
578
+ 'eds-datepicker__datefield--disabled': fieldProps.isDisabled
474
579
  })
475
- }, rest)));
476
- });
580
+ })), !fieldProps.isDisabled && React.createElement(CalendarButton, _extends({}, buttonProps, {
581
+ onPress: function onPress() {
582
+ return state.setOpen(!state.isOpen);
583
+ },
584
+ className: "eds-datepicker__open-calendar-button"
585
+ }), React.createElement(CalendarIcon, null)), useModal ? modalCalendar : popoverCalendar)));
586
+ };
477
587
 
478
588
  var _excluded$2 = ["className", "style", "label", "onChange", "feedback", "variant", "disableLabelAnimation", "prepend"],
479
589
  _excluded2$1 = ["onChange", "variant", "value"];
@@ -555,33 +665,6 @@ var NativeDatePickerBase = /*#__PURE__*/React.forwardRef(function (_ref2, ref) {
555
665
  }, rest));
556
666
  });
557
667
 
558
- var TimeSegment = function TimeSegment(_ref) {
559
- var segment = _ref.segment,
560
- state = _ref.state;
561
- var ref = useRef(null);
562
-
563
- var _useDateSegment = useDateSegment(segment, state, ref),
564
- segmentProps = _useDateSegment.segmentProps;
565
-
566
- var is12HourFormatted = state.segments.some(function (segment) {
567
- return segment.text === 'AM' || segment.text === 'PM';
568
- });
569
-
570
- var segmentDisplayText = function segmentDisplayText() {
571
- if (is12HourFormatted) return segment.text; // if number add '0' padding to start when one digit
572
-
573
- if (segment.text.match(/\d+/)) return segment.text.padStart(2, '0');
574
- return segment.text;
575
- };
576
-
577
- return React.createElement("div", _extends({}, segmentProps, {
578
- ref: ref,
579
- className: classNames('eds-timepicker__segment', {
580
- 'eds-timepicker__segment--placeholder': segment.isPlaceholder
581
- })
582
- }), segmentDisplayText());
583
- };
584
-
585
668
  var TimePickerArrowButton = function TimePickerArrowButton(_ref) {
586
669
  var direction = _ref.direction,
587
670
  onClick = _ref.onClick,
@@ -696,7 +779,7 @@ var TimePicker = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
696
779
  variant: variant,
697
780
  feedback: feedback
698
781
  }), state.segments.map(function (segment, i) {
699
- return React.createElement(TimeSegment, {
782
+ return React.createElement(FieldSegment, {
700
783
  segment: segment,
701
784
  state: state,
702
785
  key: i
@@ -784,66 +867,7 @@ var NativeTimePickerBase = /*#__PURE__*/React.forwardRef(function (_ref2, ref) {
784
867
  }, rest));
785
868
  });
786
869
 
787
- /**
788
- * Tar inn et JS Date-objekt og returnerer et av TimeValue-objektene fra @internationalized/date-pakken
789
- * @param {Date} date JS Date-objekt som ønskes konvertert til et TimeValue-objekt
790
- * @param {boolean} noDateOnlyTime Hvis datoen er irrelevant kan denne settes til true, da får man et Time-objekt uten dato tilbake
791
- * @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
792
- * @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.
793
- * @returns {Time | CalendarDateTime | ZonedDateTime} et av TimeValue-objektene med verdier fra date
794
- */
795
-
796
- var nativeDateToTimeValue = function nativeDateToTimeValue(date, noDateOnlyTime, timeZone, offset) {
797
- if (noDateOnlyTime === void 0) {
798
- noDateOnlyTime = false;
799
- }
800
-
801
- if (timeZone) {
802
- if (offset) {
803
- return new ZonedDateTime(date.getFullYear(), date.getMonth() + 1, date.getDate(), timeZone, offset, date.getHours(), date.getMinutes(), date.getSeconds());
804
- }
805
-
806
- return parseAbsolute(date.toISOString(), timeZone);
807
- }
808
-
809
- if (noDateOnlyTime) return new Time(date.getHours(), date.getMinutes(), date.getSeconds(), 0);
810
- return new CalendarDateTime(date.getFullYear(), date.getMonth() + 1, date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds());
811
- };
812
- /**
813
- * Tar inn et av TimeValue-objektene fra @internationalized/date-pakken og returnerer et JS Date-objekt
814
- * @param {TimeValue} time Et tidspunkt på TimeValue-formatet som ønsket konvertert til et JS Date-objekt
815
- * @param {string} timeZoneForCalendarDateTime Tidssonen time er i. Fungerer kun med typen er CalendarDateTime
816
- * @returns {Date} et Date-objekt med verdier fra time
817
- */
818
- // This function uses a lot of @ts-expect-error to make it work with all TimeValue types. Sorry ...
819
-
820
- var timeValueToNativeDate = function timeValueToNativeDate(time, timeZoneForCalendarDateTime) {
821
- // @ts-expect-error .day does not exist on Time-object
822
- if (!time.day) {
823
- // type is Time
824
- var date = new Date();
825
- date.setHours(time.hour);
826
- date.setMinutes(time.minute);
827
- date.setSeconds(time.second);
828
- return date;
829
- } // @ts-expect-error .timeZone does not exist in type Time and CalendarDateTime
830
-
831
-
832
- if (!time.timeZone) {
833
- // type is CalendarDateTime
834
- if (timeZoneForCalendarDateTime) // @ts-expect-error .toDate(timeZone) does not exist in type Time
835
- return time.toDate(timeZoneForCalendarDateTime);
836
- return new Date( // @ts-expect-error not in type Time
837
- time.year, // @ts-expect-error not in type Time
838
- time.month - 1, // @ts-expect-error not in type Time
839
- time.day, time.hour, time.minute, time.second);
840
- } // @ts-expect-error .toDate() does not exist in type Time or CalendarDateTime
841
-
842
-
843
- return time.toDate();
844
- };
845
-
846
870
  warnAboutMissingStyles('datepicker', 'form', 'icons');
847
871
 
848
- export { DatePicker, NativeDatePicker, NativeTimePicker, TimePicker, nativeDateToTimeValue, timeValueToNativeDate };
872
+ export { Calendar, DateField, DatePicker, NativeDatePicker, NativeTimePicker, TimePicker, ariaLabelIfNorwegian, createCalendar, nativeDateToTimeOrDateValue, timeOrDateValueToNativeDate };
849
873
  //# sourceMappingURL=datepicker.esm.js.map