@entur/datepicker 11.3.0 → 11.4.0-beta.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.
@@ -34,6 +34,10 @@ type BaseCalendarProps<DateType extends DateValue> = {
34
34
  /** Overskrift som vises for ukenummer-kolonnen. Vises kun hvis 'showWeekNumbers' er true.
35
35
  * @default 'uke' */
36
36
  weekNumberHeader?: string;
37
+ /** Vis datoer som ligger utenfor den viste måneden.
38
+ * @example Hvis uken starter på onsdag vises de to siste datoene i forrige måned i ruten til mandagen og tirsdagen før.
39
+ * @default false */
40
+ showOutsideMonth?: boolean;
37
41
  /** Brukes for å legge til klassenavn på spesifikke datoer i kalenderen.
38
42
  * Tar inn en dato og skal returnere klassenavnet som skal legges til den datoen.
39
43
  * @default undefined
@@ -5,10 +5,11 @@ type CalendarCellProps = {
5
5
  state: CalendarState;
6
6
  date: CalendarDate;
7
7
  weekNumberString: string;
8
+ showOutsideMonth?: boolean;
8
9
  onSelectedCellClick?: () => void;
9
10
  onCellClick?: () => void;
10
11
  classNameForDate?: (date: CalendarDate) => string;
11
12
  ariaLabelForDate?: (date: CalendarDate) => string;
12
13
  };
13
- export declare const CalendarCell: ({ state, date, onSelectedCellClick, onCellClick, weekNumberString, classNameForDate, ariaLabelForDate, ...rest }: CalendarCellProps) => React.JSX.Element;
14
+ export declare const CalendarCell: ({ state, date, showOutsideMonth, onSelectedCellClick, onCellClick, weekNumberString, classNameForDate, ariaLabelForDate, ...rest }: CalendarCellProps) => React.JSX.Element;
14
15
  export {};
@@ -6,10 +6,11 @@ type CalendarGridProps = {
6
6
  navigationDescription?: string;
7
7
  showWeekNumbers: boolean;
8
8
  weekNumberHeader: string;
9
+ showOutsideMonth?: boolean;
9
10
  onSelectedCellClick?: () => void;
10
11
  onCellClick?: () => void;
11
12
  classNameForDate?: (date: CalendarDate) => string;
12
13
  ariaLabelForDate?: (date: CalendarDate) => string;
13
14
  };
14
- export declare const CalendarGrid: ({ state, navigationDescription, onSelectedCellClick, onCellClick, showWeekNumbers, weekNumberHeader, classNameForDate, ariaLabelForDate, ...rest }: CalendarGridProps) => React.JSX.Element;
15
+ export declare const CalendarGrid: ({ state, navigationDescription, onSelectedCellClick, onCellClick, showWeekNumbers, weekNumberHeader, showOutsideMonth, classNameForDate, ariaLabelForDate, ...rest }: CalendarGridProps) => React.JSX.Element;
15
16
  export {};
@@ -9,6 +9,10 @@ type BaseDatePickerProps = {
9
9
  /** Overskrift som vises for ukenummer-kolonnen. Vises kun hvis 'showWeekNumbers' er true.
10
10
  * @default '#' */
11
11
  weekNumberHeader?: string;
12
+ /** Vis datoer som ligger utenfor den viste måneden.
13
+ * @example Hvis uken starter på onsdag vises de to siste datoene i forrige måned i ruten til mandagen og tirsdagen før.
14
+ * @default false */
15
+ showOutsideMonth?: boolean;
12
16
  /** Hvis true vil kalenderen alltid vises i en popover når den åpnes
13
17
  * @default false
14
18
  */
@@ -39,5 +43,5 @@ type BaseDatePickerProps = {
39
43
  ariaLabelForDate?: (date: CalendarDate) => string;
40
44
  };
41
45
  export type DatePickerProps<DateType extends DateValue> = Omit<BaseDateFieldProps<DateType>, keyof BaseDatePickerProps | 'labelProps' | 'fieldProps' | 'groupProps' | 'dateFieldRef'> & BaseDatePickerProps & ExtendedDateFieldProps<DateType>;
42
- export declare const DatePicker: <DateType extends DateValue>({ selectedDate, locale, disabled, readOnly, showTime, showTimeZone, classNameForDate, className, variant, feedback, validationVariant, validationFeedback, showWeekNumbers, weekNumberHeader, disableModal, labelTooltip, navigationDescription, minDate, maxDate, modalTreshold, ariaLabelForDate, append, prepend, granularity, ...rest }: DatePickerProps<DateType>) => React.JSX.Element;
46
+ export declare const DatePicker: <DateType extends DateValue>({ selectedDate, locale, disabled, readOnly, showTime, showTimeZone, classNameForDate, className, variant, feedback, validationVariant, validationFeedback, showWeekNumbers, weekNumberHeader, showOutsideMonth, disableModal, labelTooltip, navigationDescription, minDate, maxDate, modalTreshold, ariaLabelForDate, append, prepend, granularity, ...rest }: DatePickerProps<DateType>) => React.JSX.Element;
43
47
  export {};
@@ -192,6 +192,11 @@ function handleOnChange({
192
192
  }
193
193
  onChange?.(value);
194
194
  }
195
+ function getAdjustedMaxDate(maxDate) {
196
+ if ("hour" in (maxDate ?? {})) return maxDate;
197
+ if (maxDate !== void 0) return lastMillisecondOfDay(maxDate);
198
+ return void 0;
199
+ }
195
200
  const DateField = ({
196
201
  selectedDate,
197
202
  onChange,
@@ -236,8 +241,7 @@ const DateField = ({
236
241
  hideTimeZone: !showTimeZone,
237
242
  granularity,
238
243
  minValue: minDate,
239
- // this weird logic makes sure the entire day is included if no time is provided in maxDate
240
- maxValue: "hour" in (maxDate ?? {}) ? maxDate : maxDate !== void 0 ? lastMillisecondOfDay(maxDate) : void 0,
244
+ maxValue: getAdjustedMaxDate(maxDate),
241
245
  isDisabled: isDisabled || disabled || readOnly,
242
246
  shouldForceLeadingZeros: true
243
247
  };
@@ -291,6 +295,7 @@ const CalendarButton = ({
291
295
  const CalendarCell = ({
292
296
  state,
293
297
  date: date$1,
298
+ showOutsideMonth = false,
294
299
  onSelectedCellClick = () => {
295
300
  return;
296
301
  },
@@ -313,20 +318,37 @@ const CalendarCell = ({
313
318
  formattedDate
314
319
  } = calendar.useCalendarCell({ date: date$1 }, state, cellRef);
315
320
  const ariaLabel = `${buttonProps["aria-label"]}${weekNumberString} ${ariaLabelForDate?.(date$1) ?? ""}`;
316
- const cellCanBeSelected = !(isOutsideVisibleRange || isDisabled || isUnavailable);
321
+ const cellCanBeSelected = showOutsideMonth ? !(isDisabled || isUnavailable) : !(isOutsideVisibleRange || isDisabled || isUnavailable);
322
+ const shouldHideDate = !showOutsideMonth && isOutsideVisibleRange;
323
+ const extendedButtonProps = {
324
+ ...buttonProps,
325
+ ...showOutsideMonth && isOutsideVisibleRange && {
326
+ onClick: () => {
327
+ state.selectDate(date$1);
328
+ onCellClick();
329
+ },
330
+ onKeyUp: (e) => {
331
+ if (e.key === "Enter") {
332
+ state.selectDate(date$1);
333
+ onCellClick();
334
+ }
335
+ }
336
+ }
337
+ };
317
338
  return /* @__PURE__ */ jsxRuntime.jsx("td", { ...cellProps, className: "eds-datepicker__calendar__grid__cell__td", children: /* @__PURE__ */ jsxRuntime.jsx(
318
339
  "div",
319
340
  {
320
- ...buttonProps,
341
+ ...extendedButtonProps,
321
342
  "aria-label": ariaLabel,
322
- "aria-hidden": isOutsideVisibleRange,
343
+ "aria-hidden": shouldHideDate,
323
344
  ref: cellRef,
324
- hidden: isOutsideVisibleRange,
345
+ hidden: shouldHideDate,
325
346
  className: classNames("eds-datepicker__calendar__grid__cell", {
326
- [classNameForDate?.(date$1) ?? ""]: !isOutsideVisibleRange,
347
+ [classNameForDate?.(date$1) ?? ""]: !shouldHideDate,
327
348
  "eds-datepicker__calendar__grid__cell--selected": isSelected,
328
349
  "eds-datepicker__calendar__grid__cell--disabled": isDisabled || isUnavailable,
329
- "eds-datepicker__calendar__grid__cell--outside-month": isOutsideVisibleRange,
350
+ "eds-datepicker__calendar__grid__cell--outside-month": isOutsideVisibleRange && !showOutsideMonth,
351
+ "eds-datepicker__calendar__grid__cell--outside-month--visible": isOutsideVisibleRange && showOutsideMonth,
330
352
  "eds-datepicker__calendar__grid__cell--today": date.isEqualDay(
331
353
  date$1,
332
354
  date.now(state.timeZone ?? date.getLocalTimeZone())
@@ -334,12 +356,12 @@ const CalendarCell = ({
334
356
  }),
335
357
  ...rest,
336
358
  onClick: (e) => {
337
- buttonProps.onClick && buttonProps.onClick(e);
359
+ extendedButtonProps?.onClick?.(e);
338
360
  isSelected && onSelectedCellClick();
339
361
  cellCanBeSelected && onCellClick();
340
362
  },
341
363
  onKeyUp: (e) => {
342
- buttonProps.onKeyUp && buttonProps.onKeyUp(e);
364
+ extendedButtonProps?.onKeyUp?.(e);
343
365
  if (e.key === "Enter") {
344
366
  isSelected && onSelectedCellClick();
345
367
  cellCanBeSelected && onCellClick();
@@ -360,6 +382,7 @@ const CalendarGrid = ({
360
382
  },
361
383
  showWeekNumbers,
362
384
  weekNumberHeader,
385
+ showOutsideMonth = false,
363
386
  classNameForDate,
364
387
  ariaLabelForDate,
365
388
  ...rest
@@ -406,7 +429,7 @@ const CalendarGrid = ({
406
429
  showWeekNumbers && /* @__PURE__ */ jsxRuntime.jsx(
407
430
  "th",
408
431
  {
409
- "aria-hidden": true,
432
+ "aria-label": `${weekNumberHeader} ${weekNumber}`,
410
433
  className: "eds-datepicker__calendar__grid__weeknumber",
411
434
  children: weekNumber
412
435
  }
@@ -422,7 +445,8 @@ const CalendarGrid = ({
422
445
  onSelectedCellClick,
423
446
  onCellClick,
424
447
  classNameForDate,
425
- ariaLabelForDate
448
+ ariaLabelForDate,
449
+ showOutsideMonth
426
450
  },
427
451
  `${date2.month}.${date2.day}`
428
452
  ) : /* @__PURE__ */ jsxRuntime.jsx("td", {}, i)
@@ -450,6 +474,7 @@ const CalendarBase = ({
450
474
  maxDate,
451
475
  showWeekNumbers = false,
452
476
  weekNumberHeader = "uke",
477
+ showOutsideMonth = false,
453
478
  forcedReturnType,
454
479
  style,
455
480
  className,
@@ -478,7 +503,7 @@ const CalendarBase = ({
478
503
  locale,
479
504
  createCalendar,
480
505
  minValue: minDate,
481
- maxValue: maxDate
506
+ maxValue: getAdjustedMaxDate(maxDate)
482
507
  };
483
508
  const state = calendar$1.useCalendarState(_props);
484
509
  const { calendarProps, prevButtonProps, nextButtonProps, title } = calendar.useCalendar(_props, state);
@@ -532,7 +557,8 @@ const CalendarBase = ({
532
557
  classNameForDate,
533
558
  ariaLabelForDate,
534
559
  showWeekNumbers,
535
- weekNumberHeader
560
+ weekNumberHeader,
561
+ showOutsideMonth
536
562
  }
537
563
  )
538
564
  ]
@@ -554,6 +580,7 @@ const DatePicker = ({
554
580
  validationFeedback,
555
581
  showWeekNumbers,
556
582
  weekNumberHeader,
583
+ showOutsideMonth = false,
557
584
  disableModal = false,
558
585
  labelTooltip,
559
586
  navigationDescription,
@@ -580,7 +607,7 @@ const DatePicker = ({
580
607
  }),
581
608
  minValue: minDate,
582
609
  // this weird logic makes sure the entire day is included if no time is provided in maxDate
583
- maxValue: "hour" in (maxDate ?? {}) ? maxDate : maxDate !== void 0 ? lastMillisecondOfDay(maxDate) : void 0,
610
+ maxValue: getAdjustedMaxDate(maxDate),
584
611
  value: selectedDate,
585
612
  granularity,
586
613
  isDisabled: disabled || readOnly
@@ -624,7 +651,8 @@ const DatePicker = ({
624
651
  classNameForDate,
625
652
  ariaLabelForDate,
626
653
  showWeekNumbers,
627
- weekNumberHeader
654
+ weekNumberHeader,
655
+ showOutsideMonth
628
656
  };
629
657
  const isModal = typeof width !== "undefined" && width <= CALENDAR_MODAL_MAX_SCREEN_WIDTH && !disableModal;
630
658
  const popoverCalendar = /* @__PURE__ */ jsxRuntime.jsx(
@@ -1233,6 +1261,7 @@ exports.ariaLabelIfNorwegian = ariaLabelIfNorwegian;
1233
1261
  exports.convertValueToType = convertValueToType;
1234
1262
  exports.createCalendar = createCalendar;
1235
1263
  exports.focusSegment = focusSegment;
1264
+ exports.getAdjustedMaxDate = getAdjustedMaxDate;
1236
1265
  exports.getWeekNumberForDate = getWeekNumberForDate;
1237
1266
  exports.handleOnChange = handleOnChange;
1238
1267
  exports.lastMillisecondOfDay = lastMillisecondOfDay;