@entur/datepicker 3.0.3 → 4.0.0-alpha.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.
- package/CHANGELOG.md +14 -2
- package/dist/DatePicker/beta/Calendar.d.ts +10 -0
- package/dist/DatePicker/beta/CalendarCell.d.ts +9 -0
- package/dist/DatePicker/beta/CalendarGrid.d.ts +7 -0
- package/dist/DatePicker/beta/DateField.d.ts +32 -0
- package/dist/DatePicker/beta/DatePicker.d.ts +33 -0
- package/dist/DatePicker/beta/index.d.ts +3 -0
- package/dist/DatePicker/index.d.ts +1 -0
- package/dist/TimePicker/index.d.ts +1 -1
- package/dist/datepicker.cjs.development.js +461 -92
- package/dist/datepicker.cjs.development.js.map +1 -1
- package/dist/datepicker.cjs.production.min.js +1 -1
- package/dist/datepicker.cjs.production.min.js.map +1 -1
- package/dist/datepicker.esm.js +460 -97
- package/dist/datepicker.esm.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/shared/CalendarButton.d.ts +9 -0
- package/dist/{TimePicker/TimeSegment.d.ts → shared/FieldSegment.d.ts} +2 -1
- package/dist/shared/index.d.ts +1 -0
- package/dist/{TimePicker → shared}/utils.d.ts +3 -0
- package/dist/styles.css +223 -68
- package/package.json +13 -7
package/dist/datepicker.esm.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { mergeRefs, useRandomId, useOnMount, warnAboutMissingStyles } from '@entur/utils';
|
|
2
|
-
import React, { useRef, useState } from 'react';
|
|
1
|
+
import { mergeRefs, useRandomId, useOnClickOutside, useOnMount, warnAboutMissingStyles } from '@entur/utils';
|
|
2
|
+
import React, { useRef, useState, useEffect } from 'react';
|
|
3
3
|
import ReactDatepicker, { registerLocale } from 'react-datepicker';
|
|
4
4
|
import { parse, isSameDay } from 'date-fns';
|
|
5
5
|
import { nb } from 'date-fns/locale';
|
|
@@ -10,10 +10,16 @@ import { IconButton } from '@entur/button';
|
|
|
10
10
|
import { TextField, BaseFormControl, useVariant, useInputGroupContext, isFilled } from '@entur/form';
|
|
11
11
|
import { Tooltip } from '@entur/tooltip';
|
|
12
12
|
import 'react-datepicker/dist/react-datepicker.css';
|
|
13
|
-
import {
|
|
13
|
+
import { useDateFieldState, useDatePickerState, useTimeFieldState } from '@react-stately/datepicker';
|
|
14
|
+
import { useDateSegment, useDateField, useDatePicker, useTimeField } from '@react-aria/datepicker';
|
|
14
15
|
import { useLocale, I18nProvider } from '@react-aria/i18n';
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
16
|
+
import { ZonedDateTime, parseAbsolute, Time, CalendarDateTime, GregorianCalendar, isEqualDay, now, getLocalTimeZone, getWeeksInMonth } from '@internationalized/date';
|
|
17
|
+
import { useCalendarCell, useCalendarGrid, useCalendar } from '@react-aria/calendar';
|
|
18
|
+
import { useCalendarState } from '@react-stately/calendar';
|
|
19
|
+
import { useButton } from '@react-aria/button';
|
|
20
|
+
import { useFloating, offset, flip, shift } from '@floating-ui/react-dom';
|
|
21
|
+
import FocusLock from 'react-focus-lock';
|
|
22
|
+
import { space } from '@entur/tokens';
|
|
17
23
|
|
|
18
24
|
function _extends() {
|
|
19
25
|
_extends = Object.assign || function (target) {
|
|
@@ -89,7 +95,7 @@ function getMonthName(monthIndex, locale) {
|
|
|
89
95
|
return formatter.format(new Date(year, monthIndex));
|
|
90
96
|
}
|
|
91
97
|
|
|
92
|
-
var _excluded$
|
|
98
|
+
var _excluded$9 = ["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
99
|
var DatePickerInput = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
|
|
94
100
|
var style = _ref.style,
|
|
95
101
|
label = _ref.label,
|
|
@@ -113,7 +119,7 @@ var DatePickerInput = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
|
|
|
113
119
|
setShouldFocusOnCalendarButtonAfterSelect = _ref.setShouldFocusOnCalendarButtonAfterSelect,
|
|
114
120
|
calendarGUIIsOpen = _ref.calendarGUIIsOpen,
|
|
115
121
|
onClick = _ref.onClick,
|
|
116
|
-
rest = _objectWithoutPropertiesLoose(_ref, _excluded$
|
|
122
|
+
rest = _objectWithoutPropertiesLoose(_ref, _excluded$9);
|
|
117
123
|
|
|
118
124
|
React.useEffect(function () {
|
|
119
125
|
var _inputRef$current, _inputRef$current2, _inputRef$current3;
|
|
@@ -191,7 +197,7 @@ var DatePickerInput = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
|
|
|
191
197
|
}, rest));
|
|
192
198
|
});
|
|
193
199
|
|
|
194
|
-
var _excluded$
|
|
200
|
+
var _excluded$8 = ["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
201
|
registerLocale('nb', nb);
|
|
196
202
|
var DatePicker = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
|
|
197
203
|
var style = _ref.style,
|
|
@@ -243,7 +249,7 @@ var DatePicker = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
|
|
|
243
249
|
_ref$locale = _ref.locale,
|
|
244
250
|
locale = _ref$locale === void 0 ? nb : _ref$locale,
|
|
245
251
|
open = _ref.open,
|
|
246
|
-
rest = _objectWithoutPropertiesLoose(_ref, _excluded$
|
|
252
|
+
rest = _objectWithoutPropertiesLoose(_ref, _excluded$8);
|
|
247
253
|
|
|
248
254
|
var datepickerId = useRandomId('eds-datepicker');
|
|
249
255
|
var datepickerRef = useRef(null);
|
|
@@ -475,6 +481,449 @@ var DatePicker = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
|
|
|
475
481
|
}, rest)));
|
|
476
482
|
});
|
|
477
483
|
|
|
484
|
+
var FieldSegment = function FieldSegment(_ref) {
|
|
485
|
+
var segment = _ref.segment,
|
|
486
|
+
state = _ref.state;
|
|
487
|
+
var ref = useRef(null);
|
|
488
|
+
|
|
489
|
+
var _useDateSegment = useDateSegment(segment, state, ref),
|
|
490
|
+
segmentProps = _useDateSegment.segmentProps;
|
|
491
|
+
|
|
492
|
+
var is12HourFormatted = state.segments.some(function (segment) {
|
|
493
|
+
return segment.text === 'AM' || segment.text === 'PM';
|
|
494
|
+
});
|
|
495
|
+
|
|
496
|
+
var segmentDisplayText = function segmentDisplayText() {
|
|
497
|
+
if (is12HourFormatted) return segment.text; // if number add '0' padding to start when one digit
|
|
498
|
+
|
|
499
|
+
if (segment.text.match(/\d+/)) return segment.text.padStart(2, '0');
|
|
500
|
+
return segment.text;
|
|
501
|
+
};
|
|
502
|
+
|
|
503
|
+
return React.createElement("div", _extends({}, segmentProps, {
|
|
504
|
+
ref: ref,
|
|
505
|
+
className: classNames('eds-date-and-time-field__segment', {
|
|
506
|
+
'eds-date-and-time-field__segment--placeholder': segment.isPlaceholder,
|
|
507
|
+
'eds-date-and-time-field__segment--dot-separator': segment.text === '.'
|
|
508
|
+
}),
|
|
509
|
+
tabIndex: state.isDisabled ? -1 : segmentProps.tabIndex
|
|
510
|
+
}), segmentDisplayText());
|
|
511
|
+
};
|
|
512
|
+
|
|
513
|
+
/**
|
|
514
|
+
* Tar inn et JS Date-objekt og returnerer et av TimeValue-objektene fra @internationalized/date-pakken
|
|
515
|
+
* @param {Date} date JS Date-objekt som ønskes konvertert til et TimeValue-objekt
|
|
516
|
+
* @param {boolean} noDateOnlyTime Hvis datoen er irrelevant kan denne settes til true, da får man et Time-objekt uten dato tilbake
|
|
517
|
+
* @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
|
|
518
|
+
* @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.
|
|
519
|
+
* @returns {Time | CalendarDateTime | ZonedDateTime} et av TimeValue-objektene med verdier fra date
|
|
520
|
+
*/
|
|
521
|
+
|
|
522
|
+
var nativeDateToTimeValue = function nativeDateToTimeValue(date, noDateOnlyTime, timeZone, offset) {
|
|
523
|
+
if (noDateOnlyTime === void 0) {
|
|
524
|
+
noDateOnlyTime = false;
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
if (timeZone) {
|
|
528
|
+
if (offset) {
|
|
529
|
+
return new ZonedDateTime(date.getFullYear(), date.getMonth() + 1, date.getDate(), timeZone, offset, date.getHours(), date.getMinutes(), date.getSeconds());
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
return parseAbsolute(date.toISOString(), timeZone);
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
if (noDateOnlyTime) return new Time(date.getHours(), date.getMinutes(), date.getSeconds(), 0);
|
|
536
|
+
return new CalendarDateTime(date.getFullYear(), date.getMonth() + 1, date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds());
|
|
537
|
+
};
|
|
538
|
+
/**
|
|
539
|
+
* Tar inn et av TimeValue-objektene fra @internationalized/date-pakken og returnerer et JS Date-objekt
|
|
540
|
+
* @param {TimeValue} time Et tidspunkt på TimeValue-formatet som ønsket konvertert til et JS Date-objekt
|
|
541
|
+
* @param {string} timeZoneForCalendarDateTime Tidssonen time er i. Fungerer kun med typen er CalendarDateTime
|
|
542
|
+
* @returns {Date} et Date-objekt med verdier fra time
|
|
543
|
+
*/
|
|
544
|
+
// This function uses a lot of @ts-expect-error to make it work with all TimeValue types. Sorry ...
|
|
545
|
+
|
|
546
|
+
var timeValueToNativeDate = function timeValueToNativeDate(time, timeZoneForCalendarDateTime) {
|
|
547
|
+
// @ts-expect-error .day does not exist on Time-object
|
|
548
|
+
if (!time.day) {
|
|
549
|
+
// type is Time
|
|
550
|
+
var date = new Date();
|
|
551
|
+
date.setHours(time.hour);
|
|
552
|
+
date.setMinutes(time.minute);
|
|
553
|
+
date.setSeconds(time.second);
|
|
554
|
+
return date;
|
|
555
|
+
} // @ts-expect-error .timeZone does not exist in type Time and CalendarDateTime
|
|
556
|
+
|
|
557
|
+
|
|
558
|
+
if (!time.timeZone) {
|
|
559
|
+
// type is CalendarDateTime
|
|
560
|
+
if (timeZoneForCalendarDateTime) // @ts-expect-error .toDate(timeZone) does not exist in type Time
|
|
561
|
+
return time.toDate(timeZoneForCalendarDateTime);
|
|
562
|
+
return new Date( // @ts-expect-error not in type Time
|
|
563
|
+
time.year, // @ts-expect-error not in type Time
|
|
564
|
+
time.month - 1, // @ts-expect-error not in type Time
|
|
565
|
+
time.day, time.hour, time.minute, time.second);
|
|
566
|
+
} // @ts-expect-error .toDate() does not exist in type Time or CalendarDateTime
|
|
567
|
+
|
|
568
|
+
|
|
569
|
+
return time.toDate();
|
|
570
|
+
};
|
|
571
|
+
var createCalendar = function createCalendar(identifier) {
|
|
572
|
+
if (identifier === void 0) {
|
|
573
|
+
identifier = 'gregory';
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
switch (identifier) {
|
|
577
|
+
case 'gregory':
|
|
578
|
+
return new GregorianCalendar();
|
|
579
|
+
|
|
580
|
+
default:
|
|
581
|
+
throw new Error("Unsupported calendar " + identifier);
|
|
582
|
+
}
|
|
583
|
+
};
|
|
584
|
+
var ariaLabelIfNorwegian = function ariaLabelIfNorwegian(norwegianAriaLabel, locale, propsCollection) {
|
|
585
|
+
if (locale !== 'no-NO') return propsCollection['aria-label'];
|
|
586
|
+
return norwegianAriaLabel;
|
|
587
|
+
};
|
|
588
|
+
|
|
589
|
+
var _excluded$7 = ["selectedDate", "label", "showTimeZone", "showTime", "granularity", "disabled", "variant", "feedback", "labelTooltip", "style", "className", "labelProps", "append"];
|
|
590
|
+
var DateField = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
|
|
591
|
+
var value = _ref.selectedDate,
|
|
592
|
+
label = _ref.label,
|
|
593
|
+
showTimeZone = _ref.showTimeZone,
|
|
594
|
+
showTime = _ref.showTime,
|
|
595
|
+
_ref$granularity = _ref.granularity,
|
|
596
|
+
granularity = _ref$granularity === void 0 ? 'day' : _ref$granularity,
|
|
597
|
+
disabled = _ref.disabled,
|
|
598
|
+
variant = _ref.variant,
|
|
599
|
+
feedback = _ref.feedback,
|
|
600
|
+
labelTooltip = _ref.labelTooltip,
|
|
601
|
+
style = _ref.style,
|
|
602
|
+
className = _ref.className,
|
|
603
|
+
parentLabelProps = _ref.labelProps,
|
|
604
|
+
append = _ref.append,
|
|
605
|
+
rest = _objectWithoutPropertiesLoose(_ref, _excluded$7);
|
|
606
|
+
|
|
607
|
+
var _useLocale = useLocale(),
|
|
608
|
+
locale = _useLocale.locale;
|
|
609
|
+
|
|
610
|
+
var state = useDateFieldState(_extends({}, rest, {
|
|
611
|
+
locale: locale,
|
|
612
|
+
createCalendar: createCalendar,
|
|
613
|
+
value: value === null ? undefined : value,
|
|
614
|
+
hideTimeZone: !showTimeZone,
|
|
615
|
+
granularity: showTime ? 'minute' : granularity
|
|
616
|
+
}));
|
|
617
|
+
var dateFieldRef = useRef(null);
|
|
618
|
+
|
|
619
|
+
var _useDateField = useDateField(_extends({}, rest, {
|
|
620
|
+
label: label,
|
|
621
|
+
isDisabled: disabled || rest.isDisabled
|
|
622
|
+
}), state, dateFieldRef),
|
|
623
|
+
labelProps = _useDateField.labelProps,
|
|
624
|
+
fieldProps = _useDateField.fieldProps;
|
|
625
|
+
|
|
626
|
+
var id = useRandomId('datefield');
|
|
627
|
+
return React.createElement(BaseFormControl, _extends({
|
|
628
|
+
style: style,
|
|
629
|
+
className: classNames('eds-datefield', className),
|
|
630
|
+
labelId: id,
|
|
631
|
+
ref: mergeRefs(dateFieldRef, ref),
|
|
632
|
+
disabled: state.isDisabled,
|
|
633
|
+
disableLabelAnimation: true,
|
|
634
|
+
label: label,
|
|
635
|
+
labelTooltip: labelTooltip,
|
|
636
|
+
labelProps: parentLabelProps != null ? parentLabelProps : labelProps
|
|
637
|
+
}, fieldProps, {
|
|
638
|
+
variant: variant,
|
|
639
|
+
feedback: feedback,
|
|
640
|
+
append: append
|
|
641
|
+
}), state.segments.map(function (segment, i) {
|
|
642
|
+
return React.createElement(FieldSegment, {
|
|
643
|
+
segment: segment,
|
|
644
|
+
state: state,
|
|
645
|
+
key: i
|
|
646
|
+
});
|
|
647
|
+
}));
|
|
648
|
+
});
|
|
649
|
+
|
|
650
|
+
var _excluded$6 = ["children", "className", "style"];
|
|
651
|
+
var CalendarButton = function CalendarButton(_ref) {
|
|
652
|
+
var children = _ref.children,
|
|
653
|
+
className = _ref.className,
|
|
654
|
+
style = _ref.style,
|
|
655
|
+
props = _objectWithoutPropertiesLoose(_ref, _excluded$6);
|
|
656
|
+
|
|
657
|
+
var ref = useRef(null);
|
|
658
|
+
|
|
659
|
+
var _useButton = useButton(props, ref),
|
|
660
|
+
buttonProps = _useButton.buttonProps;
|
|
661
|
+
|
|
662
|
+
return React.createElement(IconButton, _extends({}, buttonProps, {
|
|
663
|
+
ref: ref,
|
|
664
|
+
className: className,
|
|
665
|
+
style: style
|
|
666
|
+
}), children);
|
|
667
|
+
};
|
|
668
|
+
|
|
669
|
+
var CalendarCell = function CalendarCell(_ref) {
|
|
670
|
+
var _state$timeZone;
|
|
671
|
+
|
|
672
|
+
var state = _ref.state,
|
|
673
|
+
date = _ref.date;
|
|
674
|
+
var cellRef = useRef(null);
|
|
675
|
+
|
|
676
|
+
var _useCalendarCell = useCalendarCell({
|
|
677
|
+
date: date
|
|
678
|
+
}, state, cellRef),
|
|
679
|
+
cellProps = _useCalendarCell.cellProps,
|
|
680
|
+
buttonProps = _useCalendarCell.buttonProps,
|
|
681
|
+
isSelected = _useCalendarCell.isSelected,
|
|
682
|
+
isOutsideVisibleRange = _useCalendarCell.isOutsideVisibleRange,
|
|
683
|
+
isDisabled = _useCalendarCell.isDisabled,
|
|
684
|
+
isUnavailable = _useCalendarCell.isUnavailable,
|
|
685
|
+
formattedDate = _useCalendarCell.formattedDate;
|
|
686
|
+
|
|
687
|
+
return React.createElement("td", _extends({}, cellProps, {
|
|
688
|
+
className: "eds-datepicker__calendar__grid__cell__td"
|
|
689
|
+
}), React.createElement("div", _extends({}, buttonProps, {
|
|
690
|
+
ref: cellRef,
|
|
691
|
+
hidden: isOutsideVisibleRange,
|
|
692
|
+
className: classNames('eds-datepicker__calendar__grid__cell', {
|
|
693
|
+
'eds-datepicker__calendar__grid__cell--selected': isSelected,
|
|
694
|
+
'eds-datepicker__calendar__grid__cell--disabled': isDisabled,
|
|
695
|
+
'eds-datepicker__calendar__grid__cell--unavailable': isUnavailable,
|
|
696
|
+
'eds-datepicker__calendar__grid__cell--today': isEqualDay(date, now((_state$timeZone = state.timeZone) != null ? _state$timeZone : getLocalTimeZone()))
|
|
697
|
+
})
|
|
698
|
+
}), formattedDate));
|
|
699
|
+
};
|
|
700
|
+
|
|
701
|
+
var _excluded$5 = ["state"];
|
|
702
|
+
var CalendarGrid = function CalendarGrid(_ref) {
|
|
703
|
+
var state = _ref.state,
|
|
704
|
+
rest = _objectWithoutPropertiesLoose(_ref, _excluded$5);
|
|
705
|
+
|
|
706
|
+
var _useLocale = useLocale(),
|
|
707
|
+
locale = _useLocale.locale;
|
|
708
|
+
|
|
709
|
+
var _useCalendarGrid = useCalendarGrid(rest, state),
|
|
710
|
+
gridProps = _useCalendarGrid.gridProps,
|
|
711
|
+
headerProps = _useCalendarGrid.headerProps,
|
|
712
|
+
weekDays = _useCalendarGrid.weekDays;
|
|
713
|
+
|
|
714
|
+
var weeksInMonth = getWeeksInMonth(state.visibleRange.start, locale);
|
|
715
|
+
var weeksArray = Array.from(Array(weeksInMonth).keys());
|
|
716
|
+
|
|
717
|
+
var weekDaysMapped = function weekDaysMapped() {
|
|
718
|
+
if (locale.toLowerCase() === 'no-no' || locale.toLowerCase() === 'no') return ['ma', 'ti', 'on', 'to', 'fr', 'lø', 'sø'];
|
|
719
|
+
if (weekDays.toString() === 'M,T,W,T,F,S,S') return ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'];
|
|
720
|
+
return weekDays.map(function (day) {
|
|
721
|
+
return day.toLowerCase();
|
|
722
|
+
});
|
|
723
|
+
};
|
|
724
|
+
|
|
725
|
+
return React.createElement("table", _extends({}, gridProps, {
|
|
726
|
+
cellSpacing: "0",
|
|
727
|
+
className: "eds-datepicker__calendar__grid"
|
|
728
|
+
}), React.createElement("thead", _extends({}, headerProps), React.createElement("tr", null, weekDaysMapped().map(function (day, index) {
|
|
729
|
+
return React.createElement("th", {
|
|
730
|
+
key: index
|
|
731
|
+
}, day);
|
|
732
|
+
}))), React.createElement("tbody", null, weeksArray.map(function (weekIndex) {
|
|
733
|
+
return React.createElement("tr", {
|
|
734
|
+
key: weekIndex
|
|
735
|
+
}, state.getDatesInWeek(weekIndex).map(function (date, i) {
|
|
736
|
+
return date ? React.createElement(CalendarCell, {
|
|
737
|
+
key: i,
|
|
738
|
+
state: state,
|
|
739
|
+
date: date
|
|
740
|
+
}) : React.createElement("td", {
|
|
741
|
+
key: i
|
|
742
|
+
});
|
|
743
|
+
}));
|
|
744
|
+
})));
|
|
745
|
+
};
|
|
746
|
+
|
|
747
|
+
var _excluded$4 = ["selectedDate", "style", "children"];
|
|
748
|
+
var Calendar = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
|
|
749
|
+
var style = _ref.style,
|
|
750
|
+
rest = _objectWithoutPropertiesLoose(_ref, _excluded$4);
|
|
751
|
+
|
|
752
|
+
var _useLocale = useLocale(),
|
|
753
|
+
locale = _useLocale.locale;
|
|
754
|
+
|
|
755
|
+
var state = useCalendarState(_extends({}, rest, {
|
|
756
|
+
locale: locale,
|
|
757
|
+
createCalendar: createCalendar
|
|
758
|
+
}));
|
|
759
|
+
|
|
760
|
+
var _useCalendar = useCalendar(rest, state),
|
|
761
|
+
calendarProps = _useCalendar.calendarProps,
|
|
762
|
+
prevButtonProps = _useCalendar.prevButtonProps,
|
|
763
|
+
nextButtonProps = _useCalendar.nextButtonProps,
|
|
764
|
+
title = _useCalendar.title; // const monthAndYear = title.split(' ');
|
|
765
|
+
|
|
766
|
+
|
|
767
|
+
return React.createElement("div", _extends({}, calendarProps, {
|
|
768
|
+
ref: ref,
|
|
769
|
+
className: "eds-datepicker__calendar",
|
|
770
|
+
style: style
|
|
771
|
+
}), React.createElement("div", {
|
|
772
|
+
className: "eds-datepicker__calendar__header"
|
|
773
|
+
}, React.createElement(CalendarButton, _extends({}, prevButtonProps, {
|
|
774
|
+
"aria-label": ariaLabelIfNorwegian('Forrige måned', locale, prevButtonProps)
|
|
775
|
+
}), React.createElement(LeftArrowIcon, {
|
|
776
|
+
size: 20
|
|
777
|
+
})), React.createElement("h2", null, title), React.createElement(CalendarButton, _extends({}, nextButtonProps, {
|
|
778
|
+
"aria-label": ariaLabelIfNorwegian('Neste måned', locale, nextButtonProps)
|
|
779
|
+
}), React.createElement(RightArrowIcon, {
|
|
780
|
+
size: 20
|
|
781
|
+
}))), React.createElement(CalendarGrid, {
|
|
782
|
+
state: state
|
|
783
|
+
}));
|
|
784
|
+
}); // const getTitle = (monthYearList: string[], locale: string) => {
|
|
785
|
+
// const month = monthYearList[0];
|
|
786
|
+
// const year = monthYearList[1];
|
|
787
|
+
// if (locale.toLowerCase() !== 'no-no' && locale.toLowerCase() !== 'no')
|
|
788
|
+
// return month + ' ' + year;
|
|
789
|
+
// switch (month.toLowerCase()) {
|
|
790
|
+
// case 'january':
|
|
791
|
+
// return 'januar ' + year;
|
|
792
|
+
// case 'february':
|
|
793
|
+
// return 'februar ' + year;
|
|
794
|
+
// case 'march':
|
|
795
|
+
// return 'mars ' + year;
|
|
796
|
+
// case 'may':
|
|
797
|
+
// return 'mai ' + year;
|
|
798
|
+
// case 'june':
|
|
799
|
+
// return 'juni ' + year;
|
|
800
|
+
// case 'july':
|
|
801
|
+
// return 'juli ' + year;
|
|
802
|
+
// case 'october':
|
|
803
|
+
// return 'oktober ' + year;
|
|
804
|
+
// case 'december':
|
|
805
|
+
// return 'desember ' + year;
|
|
806
|
+
// default:
|
|
807
|
+
// return month.toLowerCase() + ' ' + year.toLowerCase();
|
|
808
|
+
// }
|
|
809
|
+
// };
|
|
810
|
+
|
|
811
|
+
var _excluded$3 = ["selectedDate", "onChange", "disabled", "className", "style", "variant", "feedback"];
|
|
812
|
+
var DatePickerBeta = function DatePickerBeta(_ref) {
|
|
813
|
+
var value = _ref.selectedDate,
|
|
814
|
+
_onChange = _ref.onChange,
|
|
815
|
+
isDisabled = _ref.disabled,
|
|
816
|
+
className = _ref.className,
|
|
817
|
+
variant = _ref.variant,
|
|
818
|
+
feedback = _ref.feedback,
|
|
819
|
+
rest = _objectWithoutPropertiesLoose(_ref, _excluded$3);
|
|
820
|
+
|
|
821
|
+
var datePickerRef = useRef(null);
|
|
822
|
+
var calendarRef = useRef(null);
|
|
823
|
+
var dateFieldRef = useRef(null); // TODO SE PÅ OM VERDIER I USE...STATE BURDE VÆRE I USE... I STEDET
|
|
824
|
+
|
|
825
|
+
var state = useDatePickerState(_extends({}, rest, {
|
|
826
|
+
value: value,
|
|
827
|
+
onChange: _onChange
|
|
828
|
+
}));
|
|
829
|
+
|
|
830
|
+
var _useDatePicker = useDatePicker(_extends({
|
|
831
|
+
isDisabled: isDisabled
|
|
832
|
+
}, rest), state, datePickerRef),
|
|
833
|
+
groupProps = _useDatePicker.groupProps,
|
|
834
|
+
labelProps = _useDatePicker.labelProps,
|
|
835
|
+
fieldProps = _useDatePicker.fieldProps,
|
|
836
|
+
buttonProps = _useDatePicker.buttonProps,
|
|
837
|
+
dialogProps = _useDatePicker.dialogProps,
|
|
838
|
+
calendarProps = _useDatePicker.calendarProps; // calculations for floating-UI popover position
|
|
839
|
+
|
|
840
|
+
|
|
841
|
+
var _useFloating = useFloating({
|
|
842
|
+
placement: 'bottom-start',
|
|
843
|
+
middleware: [offset(space.extraSmall), flip(), shift({
|
|
844
|
+
padding: space.extraSmall
|
|
845
|
+
})]
|
|
846
|
+
}),
|
|
847
|
+
x = _useFloating.x,
|
|
848
|
+
y = _useFloating.y,
|
|
849
|
+
reference = _useFloating.reference,
|
|
850
|
+
floating = _useFloating.floating,
|
|
851
|
+
strategy = _useFloating.strategy; // set focus to selected date or today if available on open calendar
|
|
852
|
+
|
|
853
|
+
|
|
854
|
+
useEffect(function () {
|
|
855
|
+
var _calendarRef$current, _calendarRef$current2;
|
|
856
|
+
|
|
857
|
+
var gridCellPrefix = 'eds-datepicker__calendar__grid__cell';
|
|
858
|
+
var selectedCell = (_calendarRef$current = calendarRef.current) == null ? void 0 : _calendarRef$current.getElementsByClassName(gridCellPrefix + '--selected')[0];
|
|
859
|
+
var todayCell = (_calendarRef$current2 = calendarRef.current) == null ? void 0 : _calendarRef$current2.getElementsByClassName(gridCellPrefix + '--today')[0];
|
|
860
|
+
if (selectedCell) selectedCell.focus();else if (todayCell) todayCell.focus();
|
|
861
|
+
}, [state.isOpen]);
|
|
862
|
+
useOnClickOutside([calendarRef], function () {
|
|
863
|
+
state.setOpen(false);
|
|
864
|
+
});
|
|
865
|
+
useEffect(function () {
|
|
866
|
+
var _calendarRef$current3;
|
|
867
|
+
|
|
868
|
+
var keyDownHandler = function keyDownHandler(event) {
|
|
869
|
+
if (event.key === 'Escape') state.setOpen(false);
|
|
870
|
+
};
|
|
871
|
+
|
|
872
|
+
(_calendarRef$current3 = calendarRef.current) == null ? void 0 : _calendarRef$current3.addEventListener('keydown', keyDownHandler);
|
|
873
|
+
return function () {
|
|
874
|
+
var _calendarRef$current4;
|
|
875
|
+
|
|
876
|
+
return (_calendarRef$current4 = calendarRef.current) == null ? void 0 : _calendarRef$current4.removeEventListener('keydown', keyDownHandler);
|
|
877
|
+
}; // eslint-disable-next-line react-hooks/exhaustive-deps
|
|
878
|
+
}, []);
|
|
879
|
+
return React.createElement("div", {
|
|
880
|
+
className: classNames('eds-datepicker', className)
|
|
881
|
+
}, React.createElement("div", _extends({}, groupProps, {
|
|
882
|
+
ref: function ref(node) {
|
|
883
|
+
datePickerRef.current = node;
|
|
884
|
+
reference(node);
|
|
885
|
+
},
|
|
886
|
+
className: "eds-datepicker__datefield__wrapper"
|
|
887
|
+
}), React.createElement(DateField, _extends({}, fieldProps, {
|
|
888
|
+
selectedDate: state.value,
|
|
889
|
+
label: rest.label,
|
|
890
|
+
labelProps: labelProps,
|
|
891
|
+
ref: dateFieldRef,
|
|
892
|
+
className: classNames('eds-datepicker__datefield', {
|
|
893
|
+
'eds-datepicker__datefield--disabled': fieldProps.isDisabled
|
|
894
|
+
}),
|
|
895
|
+
variant: variant,
|
|
896
|
+
feedback: feedback
|
|
897
|
+
})), !fieldProps.isDisabled && React.createElement(CalendarButton, _extends({}, buttonProps, {
|
|
898
|
+
onPress: function onPress() {
|
|
899
|
+
return state.setOpen(!state.isOpen);
|
|
900
|
+
},
|
|
901
|
+
className: "eds-datepicker__open-calendar-button"
|
|
902
|
+
}), React.createElement(CalendarIcon, null))), React.createElement(FocusLock, {
|
|
903
|
+
disabled: !state.isOpen,
|
|
904
|
+
returnFocus: true
|
|
905
|
+
}, React.createElement(Calendar, _extends({}, dialogProps, calendarProps, {
|
|
906
|
+
onChange: function onChange(dateValue) {
|
|
907
|
+
_onChange(dateValue);
|
|
908
|
+
|
|
909
|
+
state.setOpen(false);
|
|
910
|
+
},
|
|
911
|
+
disabled: calendarProps.isDisabled,
|
|
912
|
+
ref: function ref(node) {
|
|
913
|
+
calendarRef.current = node;
|
|
914
|
+
floating(node);
|
|
915
|
+
},
|
|
916
|
+
// styling for floating-UI popover
|
|
917
|
+
style: {
|
|
918
|
+
display: state.isOpen ? 'block' : 'none',
|
|
919
|
+
position: strategy,
|
|
920
|
+
top: y != null ? y : 0,
|
|
921
|
+
left: x != null ? x : 0,
|
|
922
|
+
zIndex: 10
|
|
923
|
+
}
|
|
924
|
+
}))));
|
|
925
|
+
};
|
|
926
|
+
|
|
478
927
|
var _excluded$2 = ["className", "style", "label", "onChange", "feedback", "variant", "disableLabelAnimation", "prepend"],
|
|
479
928
|
_excluded2$1 = ["onChange", "variant", "value"];
|
|
480
929
|
var NativeDatePicker = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
|
|
@@ -555,33 +1004,6 @@ var NativeDatePickerBase = /*#__PURE__*/React.forwardRef(function (_ref2, ref) {
|
|
|
555
1004
|
}, rest));
|
|
556
1005
|
});
|
|
557
1006
|
|
|
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
1007
|
var TimePickerArrowButton = function TimePickerArrowButton(_ref) {
|
|
586
1008
|
var direction = _ref.direction,
|
|
587
1009
|
onClick = _ref.onClick,
|
|
@@ -696,7 +1118,7 @@ var TimePicker = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
|
|
|
696
1118
|
variant: variant,
|
|
697
1119
|
feedback: feedback
|
|
698
1120
|
}), state.segments.map(function (segment, i) {
|
|
699
|
-
return React.createElement(
|
|
1121
|
+
return React.createElement(FieldSegment, {
|
|
700
1122
|
segment: segment,
|
|
701
1123
|
state: state,
|
|
702
1124
|
key: i
|
|
@@ -784,66 +1206,7 @@ var NativeTimePickerBase = /*#__PURE__*/React.forwardRef(function (_ref2, ref) {
|
|
|
784
1206
|
}, rest));
|
|
785
1207
|
});
|
|
786
1208
|
|
|
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
1209
|
warnAboutMissingStyles('datepicker', 'form', 'icons');
|
|
847
1210
|
|
|
848
|
-
export { DatePicker, NativeDatePicker, NativeTimePicker, TimePicker, nativeDateToTimeValue, timeValueToNativeDate };
|
|
1211
|
+
export { Calendar, DateField, DatePicker, DatePickerBeta, NativeDatePicker, NativeTimePicker, TimePicker, ariaLabelIfNorwegian, createCalendar, nativeDateToTimeValue, timeValueToNativeDate };
|
|
849
1212
|
//# sourceMappingURL=datepicker.esm.js.map
|