@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,84 @@
1
+ import { Labels, NavButtonLabel } from "react-day-picker";
2
+
3
+ const labelNext: NavButtonLabel = (date, options) => {
4
+ switch (options?.locale?.code) {
5
+ case "nb":
6
+ return "Gå til neste måned";
7
+ case "nn":
8
+ return "Gå til neste månad";
9
+ case "en":
10
+ return "Go to next month";
11
+ default:
12
+ return "Gå til neste måned";
13
+ }
14
+ };
15
+
16
+ const labelPrevious: NavButtonLabel = (date, options) => {
17
+ switch (options?.locale?.code) {
18
+ case "nb":
19
+ return "Gå til forrige måned";
20
+ case "nn":
21
+ return "Gå til førre månad";
22
+ case "en":
23
+ return "Go to previous month";
24
+ default:
25
+ return "Gå til forrige måned";
26
+ }
27
+ };
28
+
29
+ export const labelYearDropdown = (locale: Locale) => {
30
+ switch (locale?.code) {
31
+ case "nb":
32
+ return "År";
33
+ case "nn":
34
+ return "År";
35
+ case "en":
36
+ return "Year";
37
+ default:
38
+ return "År";
39
+ }
40
+ };
41
+
42
+ export const labelMonthDropdown = (locale: Locale) => {
43
+ switch (locale?.code) {
44
+ case "nb":
45
+ return "Måned";
46
+ case "nn":
47
+ return "Månad";
48
+ case "en":
49
+ return "Month";
50
+ default:
51
+ return "Måned";
52
+ }
53
+ };
54
+
55
+ export const labelNextYear = (localeCode: string | undefined) => {
56
+ switch (localeCode) {
57
+ case "nb":
58
+ return "Gå til neste år";
59
+ case "nn":
60
+ return "Gå til neste år";
61
+ case "en-GB":
62
+ return "Go to next year";
63
+ default:
64
+ return "Gå til neste måned";
65
+ }
66
+ };
67
+
68
+ export const labelPrevYear = (localeCode: string | undefined): string => {
69
+ switch (localeCode) {
70
+ case "nb":
71
+ return "Gå til forrige år";
72
+ case "nn":
73
+ return "Gå til førre år";
74
+ case "en-GB":
75
+ return "Go to next year";
76
+ default:
77
+ return "Gå til neste år";
78
+ }
79
+ };
80
+
81
+ export const labels: Partial<Labels> = {
82
+ labelNext,
83
+ labelPrevious,
84
+ };
@@ -0,0 +1,15 @@
1
+ import enGB from "date-fns/locale/en-GB";
2
+ import nb from "date-fns/locale/nb";
3
+ import nn from "date-fns/locale/nn";
4
+
5
+ /** @private */
6
+ export const getLocaleFromString = (locale: "nb" | "nn" | "en" = "nb") => {
7
+ switch (locale) {
8
+ case "nn":
9
+ return nn;
10
+ case "en":
11
+ return enGB;
12
+ default:
13
+ return nb;
14
+ }
15
+ };
@@ -0,0 +1,292 @@
1
+ import { setYear } from "date-fns";
2
+ import { isMatch, Matcher } from "./is-match";
3
+
4
+ export const nextEnabled = (
5
+ months,
6
+ key: string,
7
+ disabled: Matcher[],
8
+ currentMonth: Date,
9
+ setYearState: Function,
10
+ yearState: Date,
11
+ dropdownCaption: boolean,
12
+ fromDate?: Date,
13
+ toDate?: Date
14
+ ): Date => {
15
+ const currentIndex = currentMonth.getMonth();
16
+
17
+ if (key === "Home") {
18
+ const nextEnabled = nextOnRow(
19
+ currentIndex,
20
+ months,
21
+ yearState,
22
+ disabled,
23
+ "home"
24
+ );
25
+ if (nextEnabled) {
26
+ return nextEnabled;
27
+ }
28
+ }
29
+ if (key === "End") {
30
+ const nextEnabled = nextOnRow(
31
+ currentIndex,
32
+ months,
33
+ yearState,
34
+ disabled,
35
+ "end"
36
+ );
37
+ if (nextEnabled) {
38
+ return nextEnabled;
39
+ }
40
+ }
41
+ if (key === "PageUp") {
42
+ if (
43
+ !dropdownCaption ||
44
+ (fromDate && yearState.getFullYear() - 1 >= fromDate?.getFullYear())
45
+ ) {
46
+ setYearState(setYear(yearState, Number(yearState.getFullYear() - 1)));
47
+ }
48
+ }
49
+ if (key === "PageDown") {
50
+ if (
51
+ !dropdownCaption ||
52
+ (toDate && yearState.getFullYear() + 1 <= toDate?.getFullYear())
53
+ ) {
54
+ setYearState(setYear(yearState, Number(yearState.getFullYear() + 1)));
55
+ }
56
+ }
57
+ if (key === "ArrowRight") {
58
+ const nextMonth = loopForward(
59
+ currentIndex,
60
+ months,
61
+ yearState,
62
+ setYearState,
63
+ disabled,
64
+ false,
65
+ dropdownCaption,
66
+ fromDate,
67
+ toDate
68
+ );
69
+ if (nextMonth) {
70
+ return setYear(months[nextMonth.index], nextMonth.year);
71
+ }
72
+ }
73
+ if (key === "ArrowLeft") {
74
+ const prevMonth = loopBack(
75
+ currentIndex - 1,
76
+ months,
77
+ disabled,
78
+ yearState,
79
+ setYearState,
80
+ false,
81
+ dropdownCaption,
82
+ fromDate,
83
+ toDate
84
+ );
85
+ if (prevMonth) {
86
+ return setYear(months[prevMonth.index], prevMonth.year);
87
+ }
88
+ }
89
+ if (key === "ArrowDown") {
90
+ if (
91
+ months[currentIndex + 4] &&
92
+ !isMatch(
93
+ setYear(months[currentIndex + 4], yearState.getFullYear()),
94
+ disabled
95
+ )
96
+ ) {
97
+ return setYear(months[currentIndex + 4], yearState.getFullYear());
98
+ }
99
+
100
+ const fallbackNext = loopForward(
101
+ currentIndex,
102
+ months,
103
+ yearState,
104
+ setYearState,
105
+ disabled,
106
+ true,
107
+ dropdownCaption,
108
+ fromDate,
109
+ toDate
110
+ );
111
+
112
+ if (
113
+ fallbackNext &&
114
+ getRow(fallbackNext.index) !== getRow(currentIndex + 8)
115
+ ) {
116
+ return setYear(months[fallbackNext.index], fallbackNext.year);
117
+ }
118
+ }
119
+
120
+ if (key === "ArrowUp") {
121
+ if (
122
+ months[currentIndex - 4] &&
123
+ !isMatch(
124
+ setYear(months[currentIndex - 4], Number(yearState.getFullYear())),
125
+ disabled
126
+ )
127
+ )
128
+ return setYear(months[currentIndex - 4], Number(yearState.getFullYear()));
129
+ const fallbackPrev = loopBack(
130
+ currentIndex,
131
+ months,
132
+ disabled,
133
+ yearState,
134
+ setYearState,
135
+ true,
136
+ dropdownCaption,
137
+ fromDate,
138
+ toDate
139
+ );
140
+ if (fallbackPrev)
141
+ return setYear(months[fallbackPrev.index], fallbackPrev.year);
142
+ }
143
+ return currentMonth;
144
+ };
145
+
146
+ const loopBack = (
147
+ currentIndex: number,
148
+ months: Date[],
149
+ disabled: Matcher[],
150
+ yearState: Date,
151
+ setYearState: Function,
152
+ rowCheck: boolean,
153
+ dropdownCaption: boolean,
154
+ fromDate?: Date,
155
+ toDate?: Date
156
+ ): { index: number; year: number } | undefined => {
157
+ let currentYear = setYear(yearState, Number(yearState.getFullYear()));
158
+ for (let i = currentIndex; i >= -1; i--) {
159
+ if (i === -1) {
160
+ if (
161
+ isOutOfRange(
162
+ dropdownCaption,
163
+ setYear(currentYear, Number(currentYear.getFullYear() - 1)),
164
+ fromDate,
165
+ toDate
166
+ )
167
+ )
168
+ return;
169
+ currentYear = setYear(currentYear, Number(currentYear.getFullYear() - 1));
170
+ setYearState(currentYear);
171
+ i = 11;
172
+ }
173
+ const month = months[i];
174
+ const isDisabled = !isMatch(
175
+ setYear(month, Number(currentYear.getFullYear())),
176
+ disabled
177
+ );
178
+ if (rowCheck) {
179
+ if (isDisabled && getRow(i) !== getRow(currentIndex)) {
180
+ return { index: i, year: Number(currentYear.getFullYear()) };
181
+ }
182
+ } else {
183
+ if (isDisabled) {
184
+ return { index: i, year: Number(currentYear.getFullYear()) };
185
+ }
186
+ }
187
+ }
188
+ };
189
+
190
+ const loopForward = (
191
+ currentIndex: number,
192
+ months: Date[],
193
+ yearState: Date,
194
+ setYearState: Function,
195
+ disabled: Matcher[],
196
+ rowCheck: boolean,
197
+ dropdownCaption: boolean,
198
+ fromDate?: Date,
199
+ toDate?: Date
200
+ ): { index: number; year: number } | undefined => {
201
+ let currentYear = setYear(yearState, Number(yearState.getFullYear()));
202
+ for (let i = currentIndex + 1; i < months.length + 1; i++) {
203
+ if (i === 12) {
204
+ if (
205
+ isOutOfRange(
206
+ dropdownCaption,
207
+ setYear(currentYear, Number(currentYear.getFullYear() + 1)),
208
+ fromDate,
209
+ toDate
210
+ )
211
+ )
212
+ return;
213
+ currentYear = setYear(currentYear, Number(currentYear.getFullYear() + 1));
214
+ setYearState(currentYear);
215
+ i = 0;
216
+ }
217
+ const month = months[i];
218
+ const isDisabled = !isMatch(
219
+ setYear(month, Number(currentYear.getFullYear())),
220
+ disabled
221
+ );
222
+ if (rowCheck) {
223
+ if (isDisabled && getRow(i) !== getRow(currentIndex)) {
224
+ return { index: i, year: Number(currentYear.getFullYear()) };
225
+ }
226
+ } else {
227
+ if (isDisabled) {
228
+ return { index: i, year: Number(currentYear.getFullYear()) };
229
+ }
230
+ }
231
+ }
232
+ };
233
+
234
+ const getRow = (index: number): number => {
235
+ if (index >= 0 && index <= 3) return 1;
236
+ if (index >= 4 && index <= 7) return 2;
237
+ return 3;
238
+ };
239
+
240
+ const isOutOfRange = (
241
+ dropdownCaption: boolean,
242
+ year: Date,
243
+ fromDate?: Date,
244
+ toDate?: Date
245
+ ): boolean => {
246
+ if (
247
+ dropdownCaption &&
248
+ fromDate &&
249
+ toDate &&
250
+ (year.getFullYear() < fromDate?.getFullYear() ||
251
+ year.getFullYear() > toDate?.getFullYear())
252
+ ) {
253
+ return true;
254
+ }
255
+
256
+ return false;
257
+ };
258
+
259
+ const nextOnRow = (
260
+ currentIndex: number,
261
+ months,
262
+ yearState: Date,
263
+ disabled: Matcher[],
264
+ mode: "home" | "end"
265
+ ) => {
266
+ const row = getRow(currentIndex);
267
+ let monthsOfRow;
268
+
269
+ switch (row) {
270
+ case 1:
271
+ monthsOfRow = months.slice(0, 4);
272
+ break;
273
+ case 2:
274
+ monthsOfRow = months.slice(4, 8);
275
+ break;
276
+ case 3:
277
+ monthsOfRow = months.slice(8, 12);
278
+ break;
279
+ default:
280
+ break;
281
+ }
282
+
283
+ if (mode === "end") monthsOfRow = monthsOfRow.reverse();
284
+
285
+ for (let i = 0; i < monthsOfRow.length; i++) {
286
+ const month = monthsOfRow[i];
287
+
288
+ if (!isMatch(setYear(month, Number(yearState.getFullYear())), disabled)) {
289
+ return setYear(month, Number(yearState.getFullYear()));
290
+ }
291
+ }
292
+ };
@@ -0,0 +1,46 @@
1
+ import { parse } from "date-fns";
2
+ import { isValidDate } from ".";
3
+
4
+ export const INPUT_DATE_STRING_FORMAT_DATE = "dd.MM.yyyy";
5
+
6
+ export const INPUT_DATE_STRING_FORMAT_MONTH = "MM.yyyy";
7
+
8
+ const ALLOWED_INPUT_FORMATS_DATE = [
9
+ "ddMMyy",
10
+ "d.M.yy",
11
+ "dd.MM.yy",
12
+ "dd/MM/yy",
13
+ "dd-MM-yy",
14
+ INPUT_DATE_STRING_FORMAT_DATE,
15
+ "ddMMyyyy",
16
+ "dd/MM/yyyy",
17
+ "dd-MM-yyyy",
18
+ "d.M.yyyy",
19
+ ];
20
+
21
+ const ALLOWED_INPUT_FORMATS_MONTH = [
22
+ "M/yyyy",
23
+ "MM/yyyy",
24
+ "M-yyyy",
25
+ "MM-yyyy",
26
+ "MM.yyyy",
27
+ INPUT_DATE_STRING_FORMAT_MONTH,
28
+ ];
29
+
30
+ export const parseDate = (
31
+ date: string,
32
+ today: Date,
33
+ locale: Locale,
34
+ type: "date" | "month"
35
+ ) => {
36
+ let parsed;
37
+ const ALLOWED_FORMATS =
38
+ type === "date" ? ALLOWED_INPUT_FORMATS_DATE : ALLOWED_INPUT_FORMATS_MONTH;
39
+ for (const format of ALLOWED_FORMATS) {
40
+ parsed = parse(date, format, today, { locale });
41
+ if (isValidDate(parsed)) {
42
+ return parsed;
43
+ }
44
+ }
45
+ return parsed;
46
+ };
@@ -1,4 +1,4 @@
1
- import React, { forwardRef } from "react";
1
+ import React, { forwardRef, useId } from "react";
2
2
  import cl from "clsx";
3
3
  import { BodyLong, Checkbox, CheckboxProps, ErrorMessage } from "..";
4
4
  import { useFormField } from "./useFormField";
@@ -32,9 +32,11 @@ export const ConfirmationPanel = forwardRef<
32
32
  >(({ className, children, label, ...props }, ref) => {
33
33
  const { errorId, showErrorMsg, hasError, size, inputProps } = useFormField(
34
34
  props,
35
- "confirmationPanel"
35
+ "confirmation-panel"
36
36
  );
37
37
 
38
+ const id = useId();
39
+
38
40
  return (
39
41
  <div
40
42
  className={cl("navds-confirmation-panel", "navds-form-field", className, {
@@ -48,6 +50,7 @@ export const ConfirmationPanel = forwardRef<
48
50
  <BodyLong
49
51
  size={props.size}
50
52
  className="navds-confirmation-panel__content"
53
+ id={`confirmation-panel-${id}`}
51
54
  >
52
55
  {children}
53
56
  </BodyLong>
@@ -56,6 +59,10 @@ export const ConfirmationPanel = forwardRef<
56
59
  ref={ref}
57
60
  {...props}
58
61
  {...inputProps}
62
+ aria-describedby={cl(
63
+ inputProps["aria-describedby"],
64
+ children && `confirmation-panel-${id}`
65
+ )}
59
66
  error={hasError}
60
67
  size={size}
61
68
  >
@@ -36,8 +36,8 @@ test("checkbox group chains onChange calls", async () => {
36
36
  describe("Checkbox handles controlled-state correctly", () => {
37
37
  const CheckboxComponent = ({ onChange = () => null, value }) => (
38
38
  <CheckboxGroup legend="legend" onChange={onChange} value={value}>
39
- <Checkbox value={"value1"}>label1</Checkbox>
40
- <Checkbox value={"value2"}>label2</Checkbox>
39
+ <Checkbox value="value1">label1</Checkbox>
40
+ <Checkbox value="value2">label2</Checkbox>
41
41
  </CheckboxGroup>
42
42
  );
43
43
 
@@ -50,7 +50,7 @@ Default.args = {
50
50
  };
51
51
 
52
52
  export const Group = () => (
53
- <RadioGroup legend="Group legend" defaultValue={"tekst2"}>
53
+ <RadioGroup legend="Group legend" defaultValue="tekst2">
54
54
  <Radio value="tekst">Radiotekst</Radio>
55
55
  <Radio value="tekst2">Radiotekst</Radio>
56
56
  </RadioGroup>
@@ -59,7 +59,7 @@ export const Group = () => (
59
59
  export const GroupError = () => (
60
60
  <RadioGroup
61
61
  legend="Group legend"
62
- defaultValue={"tekst2"}
62
+ defaultValue="tekst2"
63
63
  error="Group errormelding"
64
64
  >
65
65
  <Radio value="tekst">Radiotekst</Radio>
@@ -68,7 +68,7 @@ export const GroupError = () => (
68
68
  );
69
69
 
70
70
  export const GroupSmall = () => (
71
- <RadioGroup legend="Group legend" defaultValue={"tekst2"} size="small">
71
+ <RadioGroup legend="Group legend" defaultValue="tekst2" size="small">
72
72
  <Radio value="tekst">Radiotekst</Radio>
73
73
  <Radio value="tekst2">Radiotekst</Radio>
74
74
  </RadioGroup>
@@ -77,7 +77,7 @@ export const GroupSmall = () => (
77
77
  export const GroupDescription = () => (
78
78
  <RadioGroup
79
79
  legend="Group legend"
80
- defaultValue={"tekst2"}
80
+ defaultValue="tekst2"
81
81
  description="Group description"
82
82
  >
83
83
  <Radio value="tekst">Radiotekst</Radio>
@@ -109,9 +109,7 @@ export const MaxRows = () => {
109
109
  return (
110
110
  <Textarea
111
111
  maxRows={3}
112
- value={
113
- "Aute fugiat ut culpa enim ad culpa proident adipisicing anim proident ipsum elit. Cillum Lorem magna nisi cupidatat consequat culpa. Veniam ex quis elit dolore ea cupidatat fugiat in. Sint proident magna duis consequat velit ea velit pariatur in dolore ad. Aliqua officia nostrud veniam pariatur eu sint elit qui amet."
114
- }
112
+ value="Aute fugiat ut culpa enim ad culpa proident adipisicing anim proident ipsum elit. Cillum Lorem magna nisi cupidatat consequat culpa. Veniam ex quis elit dolore ea cupidatat fugiat in. Sint proident magna duis consequat velit ea velit pariatur in dolore ad. Aliqua officia nostrud veniam pariatur eu sint elit qui amet."
115
113
  label="Ipsum enim quis culpa"
116
114
  />
117
115
  );
@@ -4,6 +4,9 @@ import { HelpText } from "..";
4
4
  export default {
5
5
  title: "ds-react/HelpText",
6
6
  component: HelpText,
7
+ parameters: {
8
+ chromatic: { delay: 300 },
9
+ },
7
10
  argTypes: {
8
11
  placement: {
9
12
  control: {
package/src/index.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  export * from "./accordion";
2
2
  export * from "./alert";
3
3
  export * from "./button";
4
+ export * from "./date";
4
5
  export * from "./form";
5
6
  export * from "./grid";
6
7
  export * from "./help-text";
@@ -5,7 +5,7 @@ import { OverridableComponent } from "..";
5
5
  export interface DetailProps
6
6
  extends React.HTMLAttributes<HTMLParagraphElement> {
7
7
  /**
8
- * medium: 14px bold, small: 14px
8
+ * medium: 14px, small: 14px
9
9
  * @default "medium"
10
10
  */
11
11
  size?: "medium" | "small";
@@ -224,13 +224,12 @@ const AnimateHeight: React.FC<AnimateHeightProps> = ({
224
224
  const ariaHidden = hasAriaHiddenProp ? props["aria-hidden"] : height === 0;
225
225
 
226
226
  return (
227
- <div
228
- {...props}
229
- aria-hidden={ariaHidden}
230
- className={className}
231
- style={componentStyle}
232
- >
233
- <div className={innerClassName} ref={contentElement}>
227
+ <div {...props} className={className} style={componentStyle}>
228
+ <div
229
+ aria-hidden={ariaHidden}
230
+ className={innerClassName}
231
+ ref={contentElement}
232
+ >
234
233
  {children}
235
234
  </div>
236
235
  </div>