@navikt/ds-react 1.3.21 → 1.3.23

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.
@@ -13,11 +13,15 @@ import {
13
13
  import { UseDatepickerOptions } from "./useDatepicker";
14
14
 
15
15
  interface UseRangeDatepickerOptions
16
- extends Omit<UseDatepickerOptions, "defaultSelected"> {
16
+ extends Omit<UseDatepickerOptions, "defaultSelected" | "onDateChange"> {
17
17
  /**
18
18
  * The initially selected DateRange
19
19
  */
20
20
  defaultSelected?: DateRange;
21
+ /**
22
+ * Callback for changed state
23
+ */
24
+ onRangeChange?: (val?: DateRange) => void;
21
25
  }
22
26
 
23
27
  interface UseRangeDatepickerValue {
@@ -66,12 +70,13 @@ export const useRangeDatepicker = (
66
70
  ): UseRangeDatepickerValue => {
67
71
  const {
68
72
  locale: _locale = "nb",
69
- defaultSelected,
73
+ defaultSelected: _defaultSelected,
70
74
  today = new Date(),
71
75
  fromDate,
72
76
  toDate,
73
77
  disabled,
74
78
  disableWeekends,
79
+ onRangeChange,
75
80
  } = opt;
76
81
 
77
82
  const locale = getLocaleFromString(_locale);
@@ -80,11 +85,15 @@ export const useRangeDatepicker = (
80
85
  const inputRefFrom = useRef<HTMLDivElement>(null);
81
86
  const datePickerRef = useRef<HTMLDivElement | null>(null);
82
87
 
88
+ const [defaultSelected, setDefaultSelected] = useState(_defaultSelected);
89
+
83
90
  // Initialize states
84
91
  const [month, setMonth] = useState(
85
- defaultSelected ? defaultSelected.from : today
92
+ defaultSelected ? defaultSelected?.from : today
93
+ );
94
+ const [selectedRange, setSelectedRange] = useState<DateRange | undefined>(
95
+ defaultSelected ?? { from: undefined, to: undefined }
86
96
  );
87
- const [selectedRange, setSelectedRange] = useState(defaultSelected);
88
97
 
89
98
  const [fromInputValue, setFromInputValue] = useState(
90
99
  defaultSelected?.from
@@ -99,6 +108,11 @@ export const useRangeDatepicker = (
99
108
  );
100
109
  const [open, setOpen] = useState(false);
101
110
 
111
+ const getSelectedRange = (range?: DateRange) => {
112
+ onRangeChange?.(range);
113
+ return range;
114
+ };
115
+
102
116
  const handleFocusIn = useCallback(
103
117
  (e) =>
104
118
  ![
@@ -123,8 +137,10 @@ export const useRangeDatepicker = (
123
137
  }, [handleFocusIn]);
124
138
 
125
139
  const reset = () => {
126
- setSelectedRange(defaultSelected);
127
- setMonth(defaultSelected ? defaultSelected.from : today);
140
+ setSelectedRange(
141
+ getSelectedRange(defaultSelected ?? { from: undefined, to: undefined })
142
+ );
143
+ setMonth(defaultSelected ? defaultSelected?.from : today);
128
144
  setFromInputValue(
129
145
  defaultSelected?.from
130
146
  ? formatDateForInput(defaultSelected.from, locale, "date")
@@ -135,10 +151,11 @@ export const useRangeDatepicker = (
135
151
  ? formatDateForInput(defaultSelected.to, locale, "date")
136
152
  : ""
137
153
  );
154
+ setDefaultSelected(_defaultSelected);
138
155
  };
139
156
 
140
157
  const setSelected = (range?: DateRange) => {
141
- setSelectedRange(range);
158
+ setSelectedRange(getSelectedRange(range));
142
159
  setFromInputValue(
143
160
  range?.from ? formatDateForInput(range.from, locale, "date") : ""
144
161
  );
@@ -212,7 +229,7 @@ export const useRangeDatepicker = (
212
229
  };
213
230
 
214
231
  const handleSelect = (range) => {
215
- if (range.from && range.to) {
232
+ if (range?.from && range?.to) {
216
233
  setOpen(false);
217
234
  }
218
235
  const prevToRange =
@@ -224,7 +241,7 @@ export const useRangeDatepicker = (
224
241
  prevToRange
225
242
  ? setToInputValue(formatDateForInput(prevToRange, locale, "date"))
226
243
  : setToInputValue("");
227
- setSelectedRange({ from: range?.from, to: prevToRange });
244
+ setSelectedRange(getSelectedRange({ from: range?.from, to: prevToRange }));
228
245
  };
229
246
 
230
247
  /* live-update datepicker based on changes in inputfields */
@@ -240,9 +257,11 @@ export const useRangeDatepicker = (
240
257
  ((disableWeekends && isWeekend(day)) || isMatch(day, disabled)))
241
258
  ) {
242
259
  setSelectedRange((x) =>
243
- src === RANGE.FROM
244
- ? { ...x, from: undefined }
245
- : { from: x?.from, to: undefined }
260
+ getSelectedRange(
261
+ src === RANGE.FROM
262
+ ? { ...x, from: undefined }
263
+ : { from: x?.from, to: undefined }
264
+ )
246
265
  );
247
266
  return;
248
267
  }
@@ -251,8 +270,10 @@ export const useRangeDatepicker = (
251
270
  const isAfter = toDate && differenceInCalendarDays(day, toDate) > 0;
252
271
  if (isBefore || isAfter) {
253
272
  src === RANGE.FROM
254
- ? setSelectedRange((x) => ({ ...x, from: undefined }))
255
- : setSelectedRange((x) => ({ from: x?.from, to: undefined }));
273
+ ? setSelectedRange((x) => getSelectedRange({ ...x, from: undefined }))
274
+ : setSelectedRange((x) =>
275
+ getSelectedRange({ from: x?.from, to: undefined })
276
+ );
256
277
  return;
257
278
  }
258
279
 
@@ -262,7 +283,9 @@ export const useRangeDatepicker = (
262
283
  selectedRange?.from &&
263
284
  differenceInCalendarDays(selectedRange?.from, day) >= 0
264
285
  ) {
265
- setSelectedRange({ from: day, to: selectedRange?.from });
286
+ setSelectedRange(
287
+ getSelectedRange({ from: day, to: selectedRange?.from })
288
+ );
266
289
  setMonth(day);
267
290
  return;
268
291
  }
@@ -273,13 +296,15 @@ export const useRangeDatepicker = (
273
296
  selectedRange?.to &&
274
297
  differenceInCalendarDays(day, selectedRange?.to) >= 0
275
298
  ) {
276
- setSelectedRange({ to: day, from: selectedRange?.to });
299
+ setSelectedRange(getSelectedRange({ to: day, from: selectedRange?.to }));
277
300
  setMonth(day);
278
301
  return;
279
302
  }
280
303
 
281
- src === RANGE.FROM && setSelectedRange((x) => ({ ...x, from: day }));
282
- src === RANGE.TO && setSelectedRange((x) => ({ from: x?.from, to: day }));
304
+ src === RANGE.FROM &&
305
+ setSelectedRange((x) => getSelectedRange({ ...x, from: day }));
306
+ src === RANGE.TO &&
307
+ setSelectedRange((x) => getSelectedRange({ from: x?.from, to: day }));
283
308
  setMonth(day);
284
309
  };
285
310
 
@@ -73,9 +73,8 @@ export const Standalone = () => {
73
73
 
74
74
  export const UseMonthpicker = () => {
75
75
  const { inputProps, monthpickerProps } = UNSAFE_useMonthpicker({
76
- locale: "nb",
77
- defaultSelected: new Date(),
78
76
  disabled: [new Date("Apr 1 2022")],
77
+ onMonthChange: console.log,
79
78
  });
80
79
 
81
80
  return (