@navikt/ds-react 1.3.8 → 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.
- package/_docs.json +4956 -2568
- package/cjs/date/DateInput.js +79 -0
- package/cjs/date/datepicker/DatePicker.js +113 -0
- package/cjs/date/datepicker/DatePickerStandalone.js +81 -0
- package/cjs/date/datepicker/DayButton.js +43 -0
- package/cjs/date/datepicker/caption/Caption.js +23 -0
- package/cjs/date/datepicker/caption/DropdownCaption.js +38 -0
- package/cjs/date/datepicker/caption/index.js +10 -0
- package/cjs/date/datepicker/caption/package.json +6 -0
- package/cjs/date/hooks/index.js +15 -0
- package/cjs/date/hooks/package.json +6 -0
- package/cjs/date/hooks/useDateInputContext.js +17 -0
- package/cjs/date/hooks/useDatepicker.js +135 -0
- package/cjs/date/hooks/useMonthPicker.js +139 -0
- package/cjs/date/hooks/useRangeDatepicker.js +215 -0
- package/cjs/date/hooks/useSharedMonthContext.js +63 -0
- package/cjs/date/index.js +14 -0
- package/cjs/date/monthpicker/MonthButton.js +80 -0
- package/cjs/date/monthpicker/MonthCaption.js +47 -0
- package/cjs/date/monthpicker/MonthPicker.js +74 -0
- package/cjs/date/monthpicker/MonthPickerStandalone.js +54 -0
- package/cjs/date/monthpicker/MonthSelector.js +79 -0
- package/cjs/date/package.json +6 -0
- package/cjs/date/utils/check-dates.js +17 -0
- package/cjs/date/utils/dates-disabled.js +29 -0
- package/cjs/date/utils/format-date.js +12 -0
- package/cjs/date/utils/get-dates.js +43 -0
- package/cjs/date/utils/get-initial-year.js +21 -0
- package/cjs/date/utils/index.js +33 -0
- package/cjs/date/utils/is-match.js +61 -0
- package/cjs/date/utils/labels.js +85 -0
- package/cjs/date/utils/locale.js +21 -0
- package/cjs/date/utils/navigation.js +155 -0
- package/cjs/date/utils/package.json +6 -0
- package/cjs/date/utils/parse-date.js +39 -0
- package/cjs/form/ConfirmationPanel.js +4 -3
- package/cjs/index.js +1 -0
- package/esm/date/DateInput.d.ts +30 -0
- package/esm/date/DateInput.js +51 -0
- package/esm/date/DateInput.js.map +1 -0
- package/esm/date/datepicker/DatePicker.d.ts +95 -0
- package/esm/date/datepicker/DatePicker.js +85 -0
- package/esm/date/datepicker/DatePicker.js.map +1 -0
- package/esm/date/datepicker/DatePickerStandalone.d.ts +12 -0
- package/esm/date/datepicker/DatePickerStandalone.js +53 -0
- package/esm/date/datepicker/DatePickerStandalone.js.map +1 -0
- package/esm/date/datepicker/DayButton.d.ts +3 -0
- package/esm/date/datepicker/DayButton.js +17 -0
- package/esm/date/datepicker/DayButton.js.map +1 -0
- package/esm/date/datepicker/caption/Caption.d.ts +4 -0
- package/esm/date/datepicker/caption/Caption.js +17 -0
- package/esm/date/datepicker/caption/Caption.js.map +1 -0
- package/esm/date/datepicker/caption/DropdownCaption.d.ts +4 -0
- package/esm/date/datepicker/caption/DropdownCaption.js +32 -0
- package/esm/date/datepicker/caption/DropdownCaption.js.map +1 -0
- package/esm/date/datepicker/caption/index.d.ts +2 -0
- package/esm/date/datepicker/caption/index.js +3 -0
- package/esm/date/datepicker/caption/index.js.map +1 -0
- package/esm/date/hooks/index.d.ts +5 -0
- package/esm/date/hooks/index.js +6 -0
- package/esm/date/hooks/index.js.map +1 -0
- package/esm/date/hooks/useDateInputContext.d.ts +18 -0
- package/esm/date/hooks/useDateInputContext.js +14 -0
- package/esm/date/hooks/useDateInputContext.js.map +1 -0
- package/esm/date/hooks/useDatepicker.d.ts +37 -0
- package/esm/date/hooks/useDatepicker.js +132 -0
- package/esm/date/hooks/useDatepicker.js.map +1 -0
- package/esm/date/hooks/useMonthPicker.d.ts +33 -0
- package/esm/date/hooks/useMonthPicker.js +136 -0
- package/esm/date/hooks/useMonthPicker.js.map +1 -0
- package/esm/date/hooks/useRangeDatepicker.d.ts +39 -0
- package/esm/date/hooks/useRangeDatepicker.js +212 -0
- package/esm/date/hooks/useRangeDatepicker.js.map +1 -0
- package/esm/date/hooks/useSharedMonthContext.d.ts +21 -0
- package/esm/date/hooks/useSharedMonthContext.js +36 -0
- package/esm/date/hooks/useSharedMonthContext.js.map +1 -0
- package/esm/date/index.d.ts +6 -0
- package/esm/date/index.js +4 -0
- package/esm/date/index.js.map +1 -0
- package/esm/date/monthpicker/MonthButton.d.ts +11 -0
- package/esm/date/monthpicker/MonthButton.js +51 -0
- package/esm/date/monthpicker/MonthButton.js.map +1 -0
- package/esm/date/monthpicker/MonthCaption.d.ts +3 -0
- package/esm/date/monthpicker/MonthCaption.js +41 -0
- package/esm/date/monthpicker/MonthCaption.js.map +1 -0
- package/esm/date/monthpicker/MonthPicker.d.ts +90 -0
- package/esm/date/monthpicker/MonthPicker.js +46 -0
- package/esm/date/monthpicker/MonthPicker.js.map +1 -0
- package/esm/date/monthpicker/MonthPickerStandalone.d.ts +11 -0
- package/esm/date/monthpicker/MonthPickerStandalone.js +26 -0
- package/esm/date/monthpicker/MonthPickerStandalone.js.map +1 -0
- package/esm/date/monthpicker/MonthSelector.d.ts +3 -0
- package/esm/date/monthpicker/MonthSelector.js +50 -0
- package/esm/date/monthpicker/MonthSelector.js.map +1 -0
- package/esm/date/utils/check-dates.d.ts +4 -0
- package/esm/date/utils/check-dates.js +12 -0
- package/esm/date/utils/check-dates.js.map +1 -0
- package/esm/date/utils/dates-disabled.d.ts +1 -0
- package/esm/date/utils/dates-disabled.js +26 -0
- package/esm/date/utils/dates-disabled.js.map +1 -0
- package/esm/date/utils/format-date.d.ts +1 -0
- package/esm/date/utils/format-date.js +9 -0
- package/esm/date/utils/format-date.js.map +1 -0
- package/esm/date/utils/get-dates.d.ts +2 -0
- package/esm/date/utils/get-dates.js +39 -0
- package/esm/date/utils/get-dates.js.map +1 -0
- package/esm/date/utils/get-initial-year.d.ts +5 -0
- package/esm/date/utils/get-initial-year.js +18 -0
- package/esm/date/utils/get-initial-year.js.map +1 -0
- package/esm/date/utils/index.d.ts +10 -0
- package/esm/date/utils/index.js +11 -0
- package/esm/date/utils/index.js.map +1 -0
- package/esm/date/utils/is-match.d.ts +4 -0
- package/esm/date/utils/is-match.js +57 -0
- package/esm/date/utils/is-match.js.map +1 -0
- package/esm/date/utils/labels.d.ts +6 -0
- package/esm/date/utils/labels.js +79 -0
- package/esm/date/utils/labels.js.map +1 -0
- package/esm/date/utils/locale.d.ts +2 -0
- package/esm/date/utils/locale.js +15 -0
- package/esm/date/utils/locale.js.map +1 -0
- package/esm/date/utils/navigation.d.ts +2 -0
- package/esm/date/utils/navigation.js +152 -0
- package/esm/date/utils/navigation.js.map +1 -0
- package/esm/date/utils/parse-date.d.ts +3 -0
- package/esm/date/utils/parse-date.js +36 -0
- package/esm/date/utils/parse-date.js.map +1 -0
- package/esm/form/ConfirmationPanel.js +5 -4
- package/esm/form/ConfirmationPanel.js.map +1 -1
- package/esm/index.d.ts +1 -0
- package/esm/index.js +1 -0
- package/esm/index.js.map +1 -1
- package/esm/typography/Detail.d.ts +1 -1
- package/package.json +6 -4
- package/src/chat/chat.stories.tsx +15 -15
- package/src/date/DateInput.tsx +167 -0
- package/src/date/datepicker/DatePicker.tsx +252 -0
- package/src/date/datepicker/DatePickerStandalone.tsx +120 -0
- package/src/date/datepicker/DayButton.tsx +26 -0
- package/src/date/datepicker/caption/Caption.tsx +51 -0
- package/src/date/datepicker/caption/DropdownCaption.tsx +98 -0
- package/src/date/datepicker/caption/index.ts +2 -0
- package/src/date/datepicker/datepicker.stories.tsx +235 -0
- package/src/date/hooks/index.ts +8 -0
- package/src/date/hooks/useDateInputContext.tsx +32 -0
- package/src/date/hooks/useDatepicker.tsx +225 -0
- package/src/date/hooks/useMonthPicker.tsx +223 -0
- package/src/date/hooks/useRangeDatepicker.tsx +348 -0
- package/src/date/hooks/useSharedMonthContext.tsx +68 -0
- package/src/date/index.ts +16 -0
- package/src/date/monthpicker/MonthButton.tsx +109 -0
- package/src/date/monthpicker/MonthCaption.tsx +94 -0
- package/src/date/monthpicker/MonthPicker.tsx +204 -0
- package/src/date/monthpicker/MonthPickerStandalone.tsx +87 -0
- package/src/date/monthpicker/MonthSelector.tsx +85 -0
- package/src/date/monthpicker/monthpicker.stories.tsx +128 -0
- package/src/date/utils/__tests__/check-dates.test.ts +47 -0
- package/src/date/utils/__tests__/dates-disabled.test.ts +48 -0
- package/src/date/utils/__tests__/format-dates.test.ts +22 -0
- package/src/date/utils/__tests__/get-dates.test.ts +79 -0
- package/src/date/utils/__tests__/get-initial-year.test.ts +94 -0
- package/src/date/utils/__tests__/is-match.test.ts +42 -0
- package/src/date/utils/__tests__/parse-dates.test.ts +81 -0
- package/src/date/utils/check-dates.ts +17 -0
- package/src/date/utils/dates-disabled.ts +26 -0
- package/src/date/utils/format-date.ts +17 -0
- package/src/date/utils/get-dates.ts +44 -0
- package/src/date/utils/get-initial-year.ts +25 -0
- package/src/date/utils/index.ts +21 -0
- package/src/date/utils/is-match.ts +88 -0
- package/src/date/utils/labels.ts +84 -0
- package/src/date/utils/locale.ts +15 -0
- package/src/date/utils/navigation.ts +292 -0
- package/src/date/utils/parse-date.ts +46 -0
- package/src/form/ConfirmationPanel.tsx +9 -2
- package/src/form/checkbox/Checkbox.test.tsx +2 -2
- package/src/form/radio/radio.stories.tsx +4 -4
- package/src/form/stories/textarea.stories.tsx +1 -3
- package/src/help-text/help-text.stories.tsx +3 -0
- package/src/index.ts +1 -0
- package/src/typography/Detail.tsx +1 -1
|
@@ -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
|
-
"
|
|
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=
|
|
40
|
-
<Checkbox value=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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
|
);
|
package/src/index.ts
CHANGED