@navikt/ds-react 1.3.7 → 1.3.9

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.
Files changed (185) hide show
  1. package/_docs.json +4956 -2568
  2. package/cjs/date/DateInput.js +79 -0
  3. package/cjs/date/datepicker/DatePicker.js +113 -0
  4. package/cjs/date/datepicker/DatePickerStandalone.js +81 -0
  5. package/cjs/date/datepicker/DayButton.js +43 -0
  6. package/cjs/date/datepicker/caption/Caption.js +23 -0
  7. package/cjs/date/datepicker/caption/DropdownCaption.js +38 -0
  8. package/cjs/date/datepicker/caption/index.js +10 -0
  9. package/cjs/date/datepicker/caption/package.json +6 -0
  10. package/cjs/date/hooks/index.js +15 -0
  11. package/cjs/date/hooks/package.json +6 -0
  12. package/cjs/date/hooks/useDateInputContext.js +17 -0
  13. package/cjs/date/hooks/useDatepicker.js +135 -0
  14. package/cjs/date/hooks/useMonthPicker.js +139 -0
  15. package/cjs/date/hooks/useRangeDatepicker.js +215 -0
  16. package/cjs/date/hooks/useSharedMonthContext.js +63 -0
  17. package/cjs/date/index.js +14 -0
  18. package/cjs/date/monthpicker/MonthButton.js +80 -0
  19. package/cjs/date/monthpicker/MonthCaption.js +47 -0
  20. package/cjs/date/monthpicker/MonthPicker.js +74 -0
  21. package/cjs/date/monthpicker/MonthPickerStandalone.js +54 -0
  22. package/cjs/date/monthpicker/MonthSelector.js +79 -0
  23. package/cjs/date/package.json +6 -0
  24. package/cjs/date/utils/check-dates.js +17 -0
  25. package/cjs/date/utils/dates-disabled.js +29 -0
  26. package/cjs/date/utils/format-date.js +12 -0
  27. package/cjs/date/utils/get-dates.js +43 -0
  28. package/cjs/date/utils/get-initial-year.js +21 -0
  29. package/cjs/date/utils/index.js +33 -0
  30. package/cjs/date/utils/is-match.js +61 -0
  31. package/cjs/date/utils/labels.js +85 -0
  32. package/cjs/date/utils/locale.js +21 -0
  33. package/cjs/date/utils/navigation.js +155 -0
  34. package/cjs/date/utils/package.json +6 -0
  35. package/cjs/date/utils/parse-date.js +39 -0
  36. package/cjs/form/ConfirmationPanel.js +4 -3
  37. package/cjs/index.js +1 -0
  38. package/cjs/util/AnimateHeight.js +2 -2
  39. package/esm/date/DateInput.d.ts +30 -0
  40. package/esm/date/DateInput.js +51 -0
  41. package/esm/date/DateInput.js.map +1 -0
  42. package/esm/date/datepicker/DatePicker.d.ts +95 -0
  43. package/esm/date/datepicker/DatePicker.js +85 -0
  44. package/esm/date/datepicker/DatePicker.js.map +1 -0
  45. package/esm/date/datepicker/DatePickerStandalone.d.ts +12 -0
  46. package/esm/date/datepicker/DatePickerStandalone.js +53 -0
  47. package/esm/date/datepicker/DatePickerStandalone.js.map +1 -0
  48. package/esm/date/datepicker/DayButton.d.ts +3 -0
  49. package/esm/date/datepicker/DayButton.js +17 -0
  50. package/esm/date/datepicker/DayButton.js.map +1 -0
  51. package/esm/date/datepicker/caption/Caption.d.ts +4 -0
  52. package/esm/date/datepicker/caption/Caption.js +17 -0
  53. package/esm/date/datepicker/caption/Caption.js.map +1 -0
  54. package/esm/date/datepicker/caption/DropdownCaption.d.ts +4 -0
  55. package/esm/date/datepicker/caption/DropdownCaption.js +32 -0
  56. package/esm/date/datepicker/caption/DropdownCaption.js.map +1 -0
  57. package/esm/date/datepicker/caption/index.d.ts +2 -0
  58. package/esm/date/datepicker/caption/index.js +3 -0
  59. package/esm/date/datepicker/caption/index.js.map +1 -0
  60. package/esm/date/hooks/index.d.ts +5 -0
  61. package/esm/date/hooks/index.js +6 -0
  62. package/esm/date/hooks/index.js.map +1 -0
  63. package/esm/date/hooks/useDateInputContext.d.ts +18 -0
  64. package/esm/date/hooks/useDateInputContext.js +14 -0
  65. package/esm/date/hooks/useDateInputContext.js.map +1 -0
  66. package/esm/date/hooks/useDatepicker.d.ts +37 -0
  67. package/esm/date/hooks/useDatepicker.js +132 -0
  68. package/esm/date/hooks/useDatepicker.js.map +1 -0
  69. package/esm/date/hooks/useMonthPicker.d.ts +33 -0
  70. package/esm/date/hooks/useMonthPicker.js +136 -0
  71. package/esm/date/hooks/useMonthPicker.js.map +1 -0
  72. package/esm/date/hooks/useRangeDatepicker.d.ts +39 -0
  73. package/esm/date/hooks/useRangeDatepicker.js +212 -0
  74. package/esm/date/hooks/useRangeDatepicker.js.map +1 -0
  75. package/esm/date/hooks/useSharedMonthContext.d.ts +21 -0
  76. package/esm/date/hooks/useSharedMonthContext.js +36 -0
  77. package/esm/date/hooks/useSharedMonthContext.js.map +1 -0
  78. package/esm/date/index.d.ts +6 -0
  79. package/esm/date/index.js +4 -0
  80. package/esm/date/index.js.map +1 -0
  81. package/esm/date/monthpicker/MonthButton.d.ts +11 -0
  82. package/esm/date/monthpicker/MonthButton.js +51 -0
  83. package/esm/date/monthpicker/MonthButton.js.map +1 -0
  84. package/esm/date/monthpicker/MonthCaption.d.ts +3 -0
  85. package/esm/date/monthpicker/MonthCaption.js +41 -0
  86. package/esm/date/monthpicker/MonthCaption.js.map +1 -0
  87. package/esm/date/monthpicker/MonthPicker.d.ts +90 -0
  88. package/esm/date/monthpicker/MonthPicker.js +46 -0
  89. package/esm/date/monthpicker/MonthPicker.js.map +1 -0
  90. package/esm/date/monthpicker/MonthPickerStandalone.d.ts +11 -0
  91. package/esm/date/monthpicker/MonthPickerStandalone.js +26 -0
  92. package/esm/date/monthpicker/MonthPickerStandalone.js.map +1 -0
  93. package/esm/date/monthpicker/MonthSelector.d.ts +3 -0
  94. package/esm/date/monthpicker/MonthSelector.js +50 -0
  95. package/esm/date/monthpicker/MonthSelector.js.map +1 -0
  96. package/esm/date/utils/check-dates.d.ts +4 -0
  97. package/esm/date/utils/check-dates.js +12 -0
  98. package/esm/date/utils/check-dates.js.map +1 -0
  99. package/esm/date/utils/dates-disabled.d.ts +1 -0
  100. package/esm/date/utils/dates-disabled.js +26 -0
  101. package/esm/date/utils/dates-disabled.js.map +1 -0
  102. package/esm/date/utils/format-date.d.ts +1 -0
  103. package/esm/date/utils/format-date.js +9 -0
  104. package/esm/date/utils/format-date.js.map +1 -0
  105. package/esm/date/utils/get-dates.d.ts +2 -0
  106. package/esm/date/utils/get-dates.js +39 -0
  107. package/esm/date/utils/get-dates.js.map +1 -0
  108. package/esm/date/utils/get-initial-year.d.ts +5 -0
  109. package/esm/date/utils/get-initial-year.js +18 -0
  110. package/esm/date/utils/get-initial-year.js.map +1 -0
  111. package/esm/date/utils/index.d.ts +10 -0
  112. package/esm/date/utils/index.js +11 -0
  113. package/esm/date/utils/index.js.map +1 -0
  114. package/esm/date/utils/is-match.d.ts +4 -0
  115. package/esm/date/utils/is-match.js +57 -0
  116. package/esm/date/utils/is-match.js.map +1 -0
  117. package/esm/date/utils/labels.d.ts +6 -0
  118. package/esm/date/utils/labels.js +79 -0
  119. package/esm/date/utils/labels.js.map +1 -0
  120. package/esm/date/utils/locale.d.ts +2 -0
  121. package/esm/date/utils/locale.js +15 -0
  122. package/esm/date/utils/locale.js.map +1 -0
  123. package/esm/date/utils/navigation.d.ts +2 -0
  124. package/esm/date/utils/navigation.js +152 -0
  125. package/esm/date/utils/navigation.js.map +1 -0
  126. package/esm/date/utils/parse-date.d.ts +3 -0
  127. package/esm/date/utils/parse-date.js +36 -0
  128. package/esm/date/utils/parse-date.js.map +1 -0
  129. package/esm/form/ConfirmationPanel.js +5 -4
  130. package/esm/form/ConfirmationPanel.js.map +1 -1
  131. package/esm/index.d.ts +1 -0
  132. package/esm/index.js +1 -0
  133. package/esm/index.js.map +1 -1
  134. package/esm/typography/Detail.d.ts +1 -1
  135. package/esm/util/AnimateHeight.js +2 -2
  136. package/esm/util/AnimateHeight.js.map +1 -1
  137. package/package.json +6 -4
  138. package/src/chat/chat.stories.tsx +15 -15
  139. package/src/date/DateInput.tsx +167 -0
  140. package/src/date/datepicker/DatePicker.tsx +252 -0
  141. package/src/date/datepicker/DatePickerStandalone.tsx +120 -0
  142. package/src/date/datepicker/DayButton.tsx +26 -0
  143. package/src/date/datepicker/caption/Caption.tsx +51 -0
  144. package/src/date/datepicker/caption/DropdownCaption.tsx +98 -0
  145. package/src/date/datepicker/caption/index.ts +2 -0
  146. package/src/date/datepicker/datepicker.stories.tsx +235 -0
  147. package/src/date/hooks/index.ts +8 -0
  148. package/src/date/hooks/useDateInputContext.tsx +32 -0
  149. package/src/date/hooks/useDatepicker.tsx +225 -0
  150. package/src/date/hooks/useMonthPicker.tsx +223 -0
  151. package/src/date/hooks/useRangeDatepicker.tsx +348 -0
  152. package/src/date/hooks/useSharedMonthContext.tsx +68 -0
  153. package/src/date/index.ts +16 -0
  154. package/src/date/monthpicker/MonthButton.tsx +109 -0
  155. package/src/date/monthpicker/MonthCaption.tsx +94 -0
  156. package/src/date/monthpicker/MonthPicker.tsx +204 -0
  157. package/src/date/monthpicker/MonthPickerStandalone.tsx +87 -0
  158. package/src/date/monthpicker/MonthSelector.tsx +85 -0
  159. package/src/date/monthpicker/monthpicker.stories.tsx +128 -0
  160. package/src/date/utils/__tests__/check-dates.test.ts +47 -0
  161. package/src/date/utils/__tests__/dates-disabled.test.ts +48 -0
  162. package/src/date/utils/__tests__/format-dates.test.ts +22 -0
  163. package/src/date/utils/__tests__/get-dates.test.ts +79 -0
  164. package/src/date/utils/__tests__/get-initial-year.test.ts +94 -0
  165. package/src/date/utils/__tests__/is-match.test.ts +42 -0
  166. package/src/date/utils/__tests__/parse-dates.test.ts +81 -0
  167. package/src/date/utils/check-dates.ts +17 -0
  168. package/src/date/utils/dates-disabled.ts +26 -0
  169. package/src/date/utils/format-date.ts +17 -0
  170. package/src/date/utils/get-dates.ts +44 -0
  171. package/src/date/utils/get-initial-year.ts +25 -0
  172. package/src/date/utils/index.ts +21 -0
  173. package/src/date/utils/is-match.ts +88 -0
  174. package/src/date/utils/labels.ts +84 -0
  175. package/src/date/utils/locale.ts +15 -0
  176. package/src/date/utils/navigation.ts +292 -0
  177. package/src/date/utils/parse-date.ts +46 -0
  178. package/src/form/ConfirmationPanel.tsx +9 -2
  179. package/src/form/checkbox/Checkbox.test.tsx +2 -2
  180. package/src/form/radio/radio.stories.tsx +4 -4
  181. package/src/form/stories/textarea.stories.tsx +1 -3
  182. package/src/help-text/help-text.stories.tsx +3 -0
  183. package/src/index.ts +1 -0
  184. package/src/typography/Detail.tsx +1 -1
  185. package/src/util/AnimateHeight.tsx +6 -7
@@ -0,0 +1,37 @@
1
+ import { DateInputProps } from "../DateInput";
2
+ import { DatePickerProps } from "../datepicker/DatePicker";
3
+ export interface UseDatepickerOptions extends Pick<DatePickerProps, "locale" | "fromDate" | "toDate" | "today" | "toDate" | "fromDate" | "toDate" | "disabled" | "disableWeekends"> {
4
+ /**
5
+ * The initially selected Date
6
+ */
7
+ defaultSelected?: Date;
8
+ /**
9
+ * Make selection of Date required
10
+ */
11
+ required?: boolean;
12
+ }
13
+ interface UseDatepickerValue {
14
+ /**
15
+ * Use: <DatePicker {...datepickerProps}/>
16
+ */
17
+ datepickerProps: DatePickerProps;
18
+ /**
19
+ * Use: <DatePicker.Input {...inputProps}/>
20
+ */
21
+ inputProps: Pick<DateInputProps, "onChange" | "onFocus" | "onBlur" | "value">;
22
+ /**
23
+ * Resets all states (callback)
24
+ */
25
+ reset: () => void;
26
+ /**
27
+ * Currently selected date
28
+ * Up to user to validate date
29
+ */
30
+ selectedDay?: Date;
31
+ /**
32
+ * Manually override currently selected day
33
+ */
34
+ setSelected: (date?: Date) => void;
35
+ }
36
+ export declare const useDatepicker: (opt?: UseDatepickerOptions) => UseDatepickerValue;
37
+ export {};
@@ -0,0 +1,132 @@
1
+ import { differenceInCalendarDays, isWeekend } from "date-fns";
2
+ import { useCallback, useEffect, useRef, useState } from "react";
3
+ import { isMatch } from "react-day-picker";
4
+ import { formatDateForInput, getLocaleFromString, isValidDate, parseDate, } from "../utils";
5
+ export const useDatepicker = (opt = {}) => {
6
+ const { locale: _locale = "nb", required, defaultSelected, today = new Date(), fromDate, toDate, disabled, disableWeekends, } = opt;
7
+ const locale = getLocaleFromString(_locale);
8
+ const inputRef = useRef(null);
9
+ const daypickerRef = useRef(null);
10
+ // Initialize states
11
+ const [month, setMonth] = useState(defaultSelected !== null && defaultSelected !== void 0 ? defaultSelected : today);
12
+ const [selectedDay, setSelectedDay] = useState(defaultSelected);
13
+ const [open, setOpen] = useState(false);
14
+ const defaultInputValue = defaultSelected
15
+ ? formatDateForInput(defaultSelected, locale, "date")
16
+ : "";
17
+ const [inputValue, setInputValue] = useState(defaultInputValue);
18
+ const handleFocusIn = useCallback((e) => {
19
+ var _a;
20
+ ![
21
+ daypickerRef.current,
22
+ inputRef.current,
23
+ (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.nextSibling,
24
+ ].some((element) => element === null || element === void 0 ? void 0 : element.contains(e.target)) &&
25
+ open &&
26
+ setOpen(false);
27
+ }, [open]);
28
+ useEffect(() => {
29
+ window.addEventListener("focusin", handleFocusIn);
30
+ window.addEventListener("click", handleFocusIn);
31
+ return () => {
32
+ var _a, _b;
33
+ (_a = window === null || window === void 0 ? void 0 : window.removeEventListener) === null || _a === void 0 ? void 0 : _a.call(window, "focusin", handleFocusIn);
34
+ (_b = window === null || window === void 0 ? void 0 : window.removeEventListener) === null || _b === void 0 ? void 0 : _b.call(window, "click", handleFocusIn);
35
+ };
36
+ }, [handleFocusIn]);
37
+ const reset = () => {
38
+ setSelectedDay(defaultSelected);
39
+ setMonth(defaultSelected !== null && defaultSelected !== void 0 ? defaultSelected : today);
40
+ setInputValue(defaultInputValue !== null && defaultInputValue !== void 0 ? defaultInputValue : "");
41
+ };
42
+ const setSelected = (date) => {
43
+ setSelectedDay(date);
44
+ setMonth(date !== null && date !== void 0 ? date : today);
45
+ setInputValue(date ? formatDateForInput(date, locale, "date") : "");
46
+ };
47
+ const handleFocus = (e) => {
48
+ !open && setOpen(true);
49
+ if (!e.target.value) {
50
+ reset();
51
+ return;
52
+ }
53
+ let day = parseDate(e.target.value, today, locale, "date");
54
+ if (isValidDate(day)) {
55
+ setMonth(day);
56
+ setInputValue(formatDateForInput(day, locale, "date"));
57
+ }
58
+ };
59
+ const handleBlur = (e) => {
60
+ let day = parseDate(e.target.value, today, locale, "date");
61
+ isValidDate(day) && setInputValue(formatDateForInput(day, locale, "date"));
62
+ };
63
+ /* Only allow de-selecting if not required */
64
+ const handleDayClick = (day, { selected }) => {
65
+ if (day && !selected) {
66
+ setOpen(false);
67
+ inputRef.current && inputRef.current.focus();
68
+ }
69
+ if (!required && selected) {
70
+ setSelectedDay(undefined);
71
+ setInputValue("");
72
+ return;
73
+ }
74
+ setSelectedDay(day);
75
+ setMonth(day);
76
+ setInputValue(day ? formatDateForInput(day, locale, "date") : "");
77
+ };
78
+ // When changing the input field, save its value in state and check if the
79
+ // string is a valid date. If it is a valid day, set it as selected and update
80
+ // the calendar’s month.
81
+ const handleChange = (e) => {
82
+ setInputValue(e.target.value);
83
+ const day = parseDate(e.target.value, today, locale, "date");
84
+ if (!isValidDate(day) ||
85
+ (disabled &&
86
+ ((disableWeekends && isWeekend(day)) || isMatch(day, disabled)))) {
87
+ setSelectedDay(undefined);
88
+ return;
89
+ }
90
+ const isBefore = fromDate && differenceInCalendarDays(fromDate, day) > 0;
91
+ const isAfter = toDate && differenceInCalendarDays(day, toDate) > 0;
92
+ if (isBefore || isAfter) {
93
+ setSelectedDay(undefined);
94
+ return;
95
+ }
96
+ setSelectedDay(day);
97
+ setMonth(day);
98
+ };
99
+ const handleClose = useCallback(() => {
100
+ setOpen(false);
101
+ inputRef.current && inputRef.current.focus();
102
+ }, []);
103
+ const escape = useCallback((e) => open && e.key === "Escape" && handleClose(), [handleClose, open]);
104
+ useEffect(() => {
105
+ window.addEventListener("keydown", escape, false);
106
+ return () => {
107
+ window.removeEventListener("keydown", escape, false);
108
+ };
109
+ }, [escape]);
110
+ const datepickerProps = {
111
+ month,
112
+ onMonthChange: (month) => setMonth(month),
113
+ onDayClick: handleDayClick,
114
+ selected: selectedDay,
115
+ locale: _locale,
116
+ fromDate,
117
+ toDate,
118
+ today,
119
+ open,
120
+ onOpenToggle: () => setOpen((x) => !x),
121
+ ref: daypickerRef,
122
+ };
123
+ const inputProps = {
124
+ onChange: handleChange,
125
+ onFocus: handleFocus,
126
+ onBlur: handleBlur,
127
+ value: inputValue,
128
+ ref: inputRef,
129
+ };
130
+ return { datepickerProps, inputProps, reset, selectedDay, setSelected };
131
+ };
132
+ //# sourceMappingURL=useDatepicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDatepicker.js","sourceRoot":"","sources":["../../../src/date/hooks/useDatepicker.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { DateInputProps } from "../DateInput";
2
+ import { MonthPickerProps } from "../monthpicker/MonthPicker";
3
+ export interface UseMonthPickerOptions extends Pick<MonthPickerProps, "locale" | "fromDate" | "toDate" | "disabled" | "defaultSelected"> {
4
+ /**
5
+ * Make Date-selection required
6
+ */
7
+ required?: boolean;
8
+ }
9
+ interface UseMonthPickerValue {
10
+ /**
11
+ * Use: <MonthPicker {...monthpickerProps} />
12
+ */
13
+ monthpickerProps: MonthPickerProps;
14
+ /**
15
+ * Use: <MonthPicker.Input {...inputProps} />
16
+ */
17
+ inputProps: Pick<DateInputProps, "onChange" | "onFocus" | "value" | "wrapperRef">;
18
+ /**
19
+ * Currently selected Date
20
+ * Up to user to validate value and extract month
21
+ */
22
+ selectedMonth?: Date;
23
+ /**
24
+ * Manually set selected month if needed
25
+ */
26
+ setSelected: (date?: Date) => void;
27
+ /**
28
+ * Resets all states
29
+ */
30
+ reset: () => void;
31
+ }
32
+ export declare const useMonthPicker: (opt?: UseMonthPickerOptions) => UseMonthPickerValue;
33
+ export {};
@@ -0,0 +1,136 @@
1
+ import { useCallback, useEffect, useRef, useState } from "react";
2
+ import { formatDateForInput, getLocaleFromString, isMatch, isValidDate, parseDate, } from "../utils";
3
+ export const useMonthPicker = (opt = {}) => {
4
+ const { locale: _locale = "nb", defaultSelected, fromDate, toDate, disabled, required, } = opt;
5
+ const today = new Date();
6
+ const locale = getLocaleFromString(_locale);
7
+ const inputRef = useRef(null);
8
+ const monthpickerRef = useRef(null);
9
+ // Initialize states
10
+ const [year, setYear] = useState(defaultSelected !== null && defaultSelected !== void 0 ? defaultSelected : today);
11
+ const [selectedMonth, setSelectedMonth] = useState(defaultSelected);
12
+ const [open, setOpen] = useState(false);
13
+ const defaultInputValue = defaultSelected
14
+ ? formatDateForInput(defaultSelected, locale, "month")
15
+ : "";
16
+ const [inputValue, setInputValue] = useState(defaultInputValue);
17
+ const handleFocusIn = useCallback((e) => {
18
+ var _a;
19
+ return ![
20
+ monthpickerRef.current,
21
+ inputRef.current,
22
+ (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.nextSibling,
23
+ ].some((element) => element === null || element === void 0 ? void 0 : element.contains(e.target)) &&
24
+ open &&
25
+ setOpen(false);
26
+ }, [open]);
27
+ useEffect(() => {
28
+ window.addEventListener("focusin", handleFocusIn);
29
+ window.addEventListener("click", handleFocusIn);
30
+ return () => {
31
+ var _a, _b;
32
+ (_a = window === null || window === void 0 ? void 0 : window.removeEventListener) === null || _a === void 0 ? void 0 : _a.call(window, "focusin", handleFocusIn);
33
+ (_b = window === null || window === void 0 ? void 0 : window.removeEventListener) === null || _b === void 0 ? void 0 : _b.call(window, "click", handleFocusIn);
34
+ };
35
+ }, [handleFocusIn]);
36
+ const reset = () => {
37
+ setSelectedMonth(defaultSelected);
38
+ setYear(defaultSelected !== null && defaultSelected !== void 0 ? defaultSelected : today);
39
+ setInputValue(defaultInputValue !== null && defaultInputValue !== void 0 ? defaultInputValue : "");
40
+ };
41
+ const setSelected = (date) => {
42
+ setSelectedMonth(date);
43
+ setYear(date !== null && date !== void 0 ? date : today);
44
+ setInputValue(date ? formatDateForInput(date, locale, "month") : "");
45
+ };
46
+ const handleFocus = (e) => {
47
+ !open && setOpen(true);
48
+ if (!e.target.value) {
49
+ reset();
50
+ return;
51
+ }
52
+ let day = parseDate(e.target.value, today, locale, "month");
53
+ if (isValidDate(day)) {
54
+ setYear(day);
55
+ setInputValue(formatDateForInput(day, locale, "month"));
56
+ }
57
+ };
58
+ const handleBlur = (e) => {
59
+ let day = parseDate(e.target.value, today, locale, "month");
60
+ isValidDate(day) && setInputValue(formatDateForInput(day, locale, "month"));
61
+ };
62
+ /* Only allow de-selecting if not required */
63
+ const handleMonthClick = (month) => {
64
+ if (month) {
65
+ setOpen(false);
66
+ inputRef.current && inputRef.current.focus();
67
+ }
68
+ if (!required && !month) {
69
+ setSelectedMonth(undefined);
70
+ setInputValue("");
71
+ return;
72
+ }
73
+ setSelectedMonth(month);
74
+ setInputValue(month ? formatDateForInput(month, locale, "month") : "");
75
+ };
76
+ // When changing the input field, save its value in state and check if the
77
+ // string is a valid date. If it is a valid day, set it as selected and update
78
+ // the calendar’s month.
79
+ const handleChange = (e) => {
80
+ setInputValue(e.target.value);
81
+ const month = parseDate(e.target.value, today, locale, "month");
82
+ if (!isValidDate(month) || (disabled && isMatch(month, disabled))) {
83
+ setSelectedMonth(undefined);
84
+ return;
85
+ }
86
+ const isBefore = fromDate &&
87
+ (fromDate.getFullYear() > month.getFullYear() ||
88
+ (fromDate.getFullYear() === month.getFullYear() &&
89
+ fromDate.getMonth() > month.getMonth()));
90
+ const isAfter = toDate &&
91
+ (toDate.getFullYear() < month.getFullYear() ||
92
+ (toDate.getFullYear() === month.getFullYear() &&
93
+ toDate.getMonth() < month.getMonth()));
94
+ if (isAfter ||
95
+ isBefore ||
96
+ (fromDate && toDate && !isMatch(month, [{ from: fromDate, to: toDate }]))) {
97
+ setSelectedMonth(undefined);
98
+ return;
99
+ }
100
+ setSelectedMonth(month);
101
+ setYear(month);
102
+ };
103
+ const handleClose = useCallback(() => {
104
+ setOpen(false);
105
+ inputRef.current && inputRef.current.focus();
106
+ }, []);
107
+ const escape = useCallback((e) => open && e.key === "Escape" && handleClose(), [handleClose, open]);
108
+ useEffect(() => {
109
+ window.addEventListener("keydown", escape, false);
110
+ return () => {
111
+ window.removeEventListener("keydown", escape, false);
112
+ };
113
+ }, [escape]);
114
+ const monthpickerProps = {
115
+ year,
116
+ onYearChange: (y) => setYear(y !== null && y !== void 0 ? y : today),
117
+ onMonthSelect: handleMonthClick,
118
+ selected: selectedMonth,
119
+ locale: _locale,
120
+ fromDate,
121
+ toDate,
122
+ open,
123
+ onOpenToggle: () => setOpen((x) => !x),
124
+ disabled,
125
+ ref: monthpickerRef,
126
+ };
127
+ const inputProps = {
128
+ onChange: handleChange,
129
+ onFocus: handleFocus,
130
+ onBlur: handleBlur,
131
+ value: inputValue,
132
+ ref: inputRef,
133
+ };
134
+ return { monthpickerProps, inputProps, reset, selectedMonth, setSelected };
135
+ };
136
+ //# sourceMappingURL=useMonthPicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMonthPicker.js","sourceRoot":"","sources":["../../../src/date/hooks/useMonthPicker.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import { DateRange } from "react-day-picker";
2
+ import { DateInputProps } from "../DateInput";
3
+ import { DatePickerProps } from "../datepicker/DatePicker";
4
+ import { UseDatepickerOptions } from "./useDatepicker";
5
+ interface UseRangeDatepickerOptions extends Omit<UseDatepickerOptions, "defaultSelected"> {
6
+ /**
7
+ * The initially selected DateRange
8
+ */
9
+ defaultSelected?: DateRange;
10
+ }
11
+ interface UseRangeDatepickerValue {
12
+ /**
13
+ * Use: <DatePicker {...datepickerProps}/>
14
+ */
15
+ datepickerProps: DatePickerProps;
16
+ /**
17
+ * Use: <DatePicker.Input label="from" {...fromInputProps}/>
18
+ */
19
+ fromInputProps: Pick<DateInputProps, "onChange" | "onFocus" | "onBlur" | "value">;
20
+ /**
21
+ * Use: <DatePicker.Input label="to" {...toInputProps}/>
22
+ */
23
+ toInputProps: Pick<DateInputProps, "onChange" | "onFocus" | "onBlur" | "value">;
24
+ /**
25
+ * Resets all states (callback)
26
+ */
27
+ reset: () => void;
28
+ /**
29
+ * Currently selected DateRange
30
+ * Up to user to validate values
31
+ */
32
+ selectedRange?: DateRange;
33
+ /**
34
+ * Manually override currently selected day
35
+ */
36
+ setSelected: (date?: DateRange) => void;
37
+ }
38
+ export declare const useRangeDatepicker: (opt?: UseRangeDatepickerOptions) => UseRangeDatepickerValue;
39
+ export {};
@@ -0,0 +1,212 @@
1
+ import { differenceInCalendarDays, isWeekend } from "date-fns";
2
+ import { useCallback, useEffect, useRef, useState } from "react";
3
+ import { isMatch } from "react-day-picker";
4
+ import { formatDateForInput, getLocaleFromString, isValidDate, parseDate, } from "../utils";
5
+ const RANGE = {
6
+ FROM: "FROM",
7
+ TO: "TO",
8
+ };
9
+ export const useRangeDatepicker = (opt = {}) => {
10
+ const { locale: _locale = "nb", defaultSelected, today = new Date(), fromDate, toDate, disabled, disableWeekends, } = opt;
11
+ const locale = getLocaleFromString(_locale);
12
+ const inputRefTo = useRef(null);
13
+ const inputRefFrom = useRef(null);
14
+ const datePickerRef = useRef(null);
15
+ // Initialize states
16
+ const [month, setMonth] = useState(defaultSelected ? defaultSelected.from : today);
17
+ const [selectedRange, setSelectedRange] = useState(defaultSelected);
18
+ const [fromInputValue, setFromInputValue] = useState((defaultSelected === null || defaultSelected === void 0 ? void 0 : defaultSelected.from)
19
+ ? formatDateForInput(defaultSelected.from, locale, "date")
20
+ : "");
21
+ const [toInputValue, setToInputValue] = useState((defaultSelected === null || defaultSelected === void 0 ? void 0 : defaultSelected.to)
22
+ ? formatDateForInput(defaultSelected.to, locale, "date")
23
+ : "");
24
+ const [open, setOpen] = useState(false);
25
+ const handleFocusIn = useCallback((e) => {
26
+ var _a, _b;
27
+ return ![
28
+ datePickerRef.current,
29
+ inputRefTo.current,
30
+ inputRefFrom.current,
31
+ (_a = inputRefTo.current) === null || _a === void 0 ? void 0 : _a.nextSibling,
32
+ (_b = inputRefFrom.current) === null || _b === void 0 ? void 0 : _b.nextSibling,
33
+ ].some((element) => element === null || element === void 0 ? void 0 : element.contains(e.target)) &&
34
+ open &&
35
+ setOpen(false);
36
+ }, [open]);
37
+ useEffect(() => {
38
+ window.addEventListener("focusin", handleFocusIn);
39
+ window.addEventListener("click", handleFocusIn);
40
+ return () => {
41
+ var _a, _b;
42
+ (_a = window === null || window === void 0 ? void 0 : window.removeEventListener) === null || _a === void 0 ? void 0 : _a.call(window, "focusin", handleFocusIn);
43
+ (_b = window === null || window === void 0 ? void 0 : window.removeEventListener) === null || _b === void 0 ? void 0 : _b.call(window, "click", handleFocusIn);
44
+ };
45
+ }, [handleFocusIn]);
46
+ const reset = () => {
47
+ setSelectedRange(defaultSelected);
48
+ setMonth(defaultSelected ? defaultSelected.from : today);
49
+ setFromInputValue((defaultSelected === null || defaultSelected === void 0 ? void 0 : defaultSelected.from)
50
+ ? formatDateForInput(defaultSelected.from, locale, "date")
51
+ : "");
52
+ setToInputValue((defaultSelected === null || defaultSelected === void 0 ? void 0 : defaultSelected.to)
53
+ ? formatDateForInput(defaultSelected.to, locale, "date")
54
+ : "");
55
+ };
56
+ const setSelected = (range) => {
57
+ setSelectedRange(range);
58
+ setFromInputValue((range === null || range === void 0 ? void 0 : range.from) ? formatDateForInput(range.from, locale, "date") : "");
59
+ setToInputValue((range === null || range === void 0 ? void 0 : range.to) ? formatDateForInput(range === null || range === void 0 ? void 0 : range.to, locale, "date") : "");
60
+ };
61
+ const handleFocus = (e, src) => {
62
+ !open && setOpen(true);
63
+ let day = parseDate(e.target.value, today, locale, "date");
64
+ if (isValidDate(day)) {
65
+ setMonth(day);
66
+ src === RANGE.FROM
67
+ ? setFromInputValue(formatDateForInput(day, locale, "date"))
68
+ : setToInputValue(formatDateForInput(day, locale, "date"));
69
+ }
70
+ };
71
+ const handleInputs = (day, src) => {
72
+ if (src === RANGE.FROM) {
73
+ const isAfter = toInputValue &&
74
+ differenceInCalendarDays(day, parseDate(toInputValue, today, locale, "date")) > 0;
75
+ if (isAfter) {
76
+ setFromInputValue(formatDateForInput(parseDate(toInputValue, today, locale, "date"), locale, "date"));
77
+ setToInputValue(formatDateForInput(day, locale, "date"));
78
+ }
79
+ else {
80
+ setFromInputValue(formatDateForInput(day, locale, "date"));
81
+ }
82
+ }
83
+ else if (src === RANGE.TO) {
84
+ const isBefore = fromInputValue &&
85
+ differenceInCalendarDays(parseDate(fromInputValue, today, locale, "date"), day) > 0;
86
+ if (isBefore) {
87
+ setToInputValue(formatDateForInput(parseDate(fromInputValue, today, locale, "date"), locale, "date"));
88
+ setFromInputValue(formatDateForInput(day, locale, "date"));
89
+ }
90
+ else {
91
+ setToInputValue(formatDateForInput(day, locale, "date"));
92
+ }
93
+ }
94
+ };
95
+ const handleBlur = (e, src) => {
96
+ let day = parseDate(e.target.value, today, locale, "date");
97
+ if (!isValidDate(day)) {
98
+ return;
99
+ }
100
+ handleInputs(day, src);
101
+ };
102
+ const handleSelect = (range) => {
103
+ if (range.from && range.to) {
104
+ setOpen(false);
105
+ // TODO: fokus på en av input-feltene?
106
+ }
107
+ const prevToRange = !(selectedRange === null || selectedRange === void 0 ? void 0 : selectedRange.from) && (selectedRange === null || selectedRange === void 0 ? void 0 : selectedRange.to) ? selectedRange === null || selectedRange === void 0 ? void 0 : selectedRange.to : range === null || range === void 0 ? void 0 : range.to;
108
+ (range === null || range === void 0 ? void 0 : range.from)
109
+ ? setFromInputValue(formatDateForInput(range === null || range === void 0 ? void 0 : range.from, locale, "date"))
110
+ : setFromInputValue("");
111
+ prevToRange
112
+ ? setToInputValue(formatDateForInput(prevToRange, locale, "date"))
113
+ : setToInputValue("");
114
+ setSelectedRange({ from: range === null || range === void 0 ? void 0 : range.from, to: prevToRange });
115
+ };
116
+ /* live-update datepicker based on changes in inputfields */
117
+ const handleChange = (e, src) => {
118
+ src === RANGE.FROM
119
+ ? setFromInputValue(e.target.value)
120
+ : setToInputValue(e.target.value);
121
+ const day = parseDate(e.target.value, today, locale, "date");
122
+ if (!isValidDate(day) ||
123
+ (disabled &&
124
+ ((disableWeekends && isWeekend(day)) || isMatch(day, disabled)))) {
125
+ setSelectedRange((x) => src === RANGE.FROM
126
+ ? Object.assign(Object.assign({}, x), { from: undefined }) : { from: x === null || x === void 0 ? void 0 : x.from, to: undefined });
127
+ return;
128
+ }
129
+ const isBefore = fromDate && differenceInCalendarDays(fromDate, day) > 0;
130
+ const isAfter = toDate && differenceInCalendarDays(day, toDate) > 0;
131
+ if (isBefore || isAfter) {
132
+ src === RANGE.FROM
133
+ ? setSelectedRange((x) => (Object.assign(Object.assign({}, x), { from: undefined })))
134
+ : setSelectedRange((x) => ({ from: x === null || x === void 0 ? void 0 : x.from, to: undefined }));
135
+ return;
136
+ }
137
+ /* If to-value < from-value, switch places in state */
138
+ if (src === RANGE.TO &&
139
+ (selectedRange === null || selectedRange === void 0 ? void 0 : selectedRange.from) &&
140
+ differenceInCalendarDays(selectedRange === null || selectedRange === void 0 ? void 0 : selectedRange.from, day) >= 0) {
141
+ setSelectedRange({ from: day, to: selectedRange === null || selectedRange === void 0 ? void 0 : selectedRange.from });
142
+ setMonth(day);
143
+ return;
144
+ }
145
+ /* If from-value > to-value , switch places in state */
146
+ if (src === RANGE.FROM &&
147
+ (selectedRange === null || selectedRange === void 0 ? void 0 : selectedRange.to) &&
148
+ differenceInCalendarDays(day, selectedRange === null || selectedRange === void 0 ? void 0 : selectedRange.to) >= 0) {
149
+ setSelectedRange({ to: day, from: selectedRange === null || selectedRange === void 0 ? void 0 : selectedRange.to });
150
+ setMonth(day);
151
+ return;
152
+ }
153
+ src === RANGE.FROM && setSelectedRange((x) => (Object.assign(Object.assign({}, x), { from: day })));
154
+ src === RANGE.TO && setSelectedRange((x) => ({ from: x === null || x === void 0 ? void 0 : x.from, to: day }));
155
+ setMonth(day);
156
+ };
157
+ const handleClose = useCallback(() => {
158
+ var _a, _b;
159
+ setOpen(false);
160
+ if ((selectedRange === null || selectedRange === void 0 ? void 0 : selectedRange.from) && !(selectedRange === null || selectedRange === void 0 ? void 0 : selectedRange.to)) {
161
+ (_a = inputRefTo === null || inputRefTo === void 0 ? void 0 : inputRefTo.current) === null || _a === void 0 ? void 0 : _a.focus();
162
+ }
163
+ else {
164
+ console.log(inputRefFrom);
165
+ (_b = inputRefFrom === null || inputRefFrom === void 0 ? void 0 : inputRefFrom.current) === null || _b === void 0 ? void 0 : _b.focus();
166
+ }
167
+ }, [selectedRange]);
168
+ const escape = useCallback((e) => open && e.key === "Escape" && handleClose(), [handleClose, open]);
169
+ useEffect(() => {
170
+ window.addEventListener("keydown", escape, false);
171
+ return () => {
172
+ window.removeEventListener("keydown", escape, false);
173
+ };
174
+ }, [escape]);
175
+ const datepickerProps = {
176
+ month: month,
177
+ onMonthChange: (month) => setMonth(month),
178
+ onSelect: handleSelect,
179
+ selected: selectedRange,
180
+ locale: _locale,
181
+ fromDate,
182
+ toDate,
183
+ today,
184
+ mode: "range",
185
+ open,
186
+ onOpenToggle: () => setOpen((x) => !x),
187
+ ref: datePickerRef,
188
+ };
189
+ const fromInputProps = {
190
+ onChange: (e) => handleChange(e, RANGE.FROM),
191
+ onFocus: (e) => handleFocus(e, RANGE.FROM),
192
+ onBlur: (e) => handleBlur(e, RANGE.FROM),
193
+ value: fromInputValue,
194
+ ref: inputRefFrom,
195
+ };
196
+ const toInputProps = {
197
+ onChange: (e) => handleChange(e, RANGE.TO),
198
+ onFocus: (e) => handleFocus(e, RANGE.TO),
199
+ onBlur: (e) => handleBlur(e, RANGE.TO),
200
+ value: toInputValue,
201
+ ref: inputRefTo,
202
+ };
203
+ return {
204
+ datepickerProps,
205
+ fromInputProps,
206
+ toInputProps,
207
+ reset,
208
+ selectedRange,
209
+ setSelected,
210
+ };
211
+ };
212
+ //# sourceMappingURL=useRangeDatepicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRangeDatepicker.js","sourceRoot":"","sources":["../../../src/date/hooks/useRangeDatepicker.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import React from "react";
2
+ import { Matcher } from "../utils";
3
+ export declare type SharedMonthContextType = {
4
+ hasDropdown: boolean;
5
+ year: Date;
6
+ toYear: (date: Date) => void;
7
+ disabled: Matcher[];
8
+ selected?: Date;
9
+ onSelect: (v?: Date) => void;
10
+ };
11
+ export declare const SharedMonthContext: React.Context<SharedMonthContextType>;
12
+ export declare const useSharedMonthContext: () => SharedMonthContextType;
13
+ export declare const SharedMonthProvider: ({ children, dropdownCaption, disabled, selected, onSelect, year: _year, onYearChange, }: {
14
+ children: any;
15
+ dropdownCaption: any;
16
+ disabled: any;
17
+ selected: any;
18
+ onSelect: any;
19
+ year: any;
20
+ onYearChange: any;
21
+ }) => JSX.Element;