@navikt/ds-react 6.5.0 → 6.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. package/cjs/form/combobox/FilteredOptions/filteredOptionsContext.js +2 -4
  2. package/cjs/form/combobox/FilteredOptions/filteredOptionsContext.js.map +1 -1
  3. package/cjs/form/combobox/Input/Input.js +6 -1
  4. package/cjs/form/combobox/Input/Input.js.map +1 -1
  5. package/cjs/form/form-summary/FormSummary.d.ts +82 -0
  6. package/cjs/form/form-summary/FormSummary.js +81 -0
  7. package/cjs/form/form-summary/FormSummary.js.map +1 -0
  8. package/cjs/form/form-summary/FormSummaryAnswer.d.ts +11 -0
  9. package/cjs/form/form-summary/FormSummaryAnswer.js +25 -0
  10. package/cjs/form/form-summary/FormSummaryAnswer.js.map +1 -0
  11. package/cjs/form/form-summary/FormSummaryAnswers.d.ts +9 -0
  12. package/cjs/form/form-summary/FormSummaryAnswers.js +48 -0
  13. package/cjs/form/form-summary/FormSummaryAnswers.js.map +1 -0
  14. package/cjs/form/form-summary/FormSummaryEditLink.d.ts +17 -0
  15. package/cjs/form/form-summary/FormSummaryEditLink.js +49 -0
  16. package/cjs/form/form-summary/FormSummaryEditLink.js.map +1 -0
  17. package/cjs/form/form-summary/FormSummaryHeader.d.ts +9 -0
  18. package/cjs/form/form-summary/FormSummaryHeader.js +48 -0
  19. package/cjs/form/form-summary/FormSummaryHeader.js.map +1 -0
  20. package/cjs/form/form-summary/FormSummaryHeading.d.ts +14 -0
  21. package/cjs/form/form-summary/FormSummaryHeading.js +31 -0
  22. package/cjs/form/form-summary/FormSummaryHeading.js.map +1 -0
  23. package/cjs/form/form-summary/FormSummaryLabel.d.ts +6 -0
  24. package/cjs/form/form-summary/FormSummaryLabel.js +45 -0
  25. package/cjs/form/form-summary/FormSummaryLabel.js.map +1 -0
  26. package/cjs/form/form-summary/FormSummaryValue.d.ts +6 -0
  27. package/cjs/form/form-summary/FormSummaryValue.js +49 -0
  28. package/cjs/form/form-summary/FormSummaryValue.js.map +1 -0
  29. package/cjs/form/form-summary/index.d.ts +8 -0
  30. package/cjs/form/form-summary/index.js +24 -0
  31. package/cjs/form/form-summary/index.js.map +1 -0
  32. package/cjs/index.d.ts +3 -2
  33. package/cjs/index.js +5 -3
  34. package/cjs/index.js.map +1 -1
  35. package/cjs/util/hooks/descendants/descendant.js +10 -1
  36. package/cjs/util/hooks/descendants/descendant.js.map +1 -1
  37. package/cjs/util/hooks/descendants/useDescendant.js +0 -5
  38. package/cjs/util/hooks/descendants/useDescendant.js.map +1 -1
  39. package/esm/form/combobox/FilteredOptions/filteredOptionsContext.js +2 -4
  40. package/esm/form/combobox/FilteredOptions/filteredOptionsContext.js.map +1 -1
  41. package/esm/form/combobox/Input/Input.js +6 -1
  42. package/esm/form/combobox/Input/Input.js.map +1 -1
  43. package/esm/form/form-summary/FormSummary.d.ts +82 -0
  44. package/esm/form/form-summary/FormSummary.js +52 -0
  45. package/esm/form/form-summary/FormSummary.js.map +1 -0
  46. package/esm/form/form-summary/FormSummaryAnswer.d.ts +11 -0
  47. package/esm/form/form-summary/FormSummaryAnswer.js +19 -0
  48. package/esm/form/form-summary/FormSummaryAnswer.js.map +1 -0
  49. package/esm/form/form-summary/FormSummaryAnswers.d.ts +9 -0
  50. package/esm/form/form-summary/FormSummaryAnswers.js +19 -0
  51. package/esm/form/form-summary/FormSummaryAnswers.js.map +1 -0
  52. package/esm/form/form-summary/FormSummaryEditLink.d.ts +17 -0
  53. package/esm/form/form-summary/FormSummaryEditLink.js +20 -0
  54. package/esm/form/form-summary/FormSummaryEditLink.js.map +1 -0
  55. package/esm/form/form-summary/FormSummaryHeader.d.ts +9 -0
  56. package/esm/form/form-summary/FormSummaryHeader.js +19 -0
  57. package/esm/form/form-summary/FormSummaryHeader.js.map +1 -0
  58. package/esm/form/form-summary/FormSummaryHeading.d.ts +14 -0
  59. package/esm/form/form-summary/FormSummaryHeading.js +5 -0
  60. package/esm/form/form-summary/FormSummaryHeading.js.map +1 -0
  61. package/esm/form/form-summary/FormSummaryLabel.d.ts +6 -0
  62. package/esm/form/form-summary/FormSummaryLabel.js +19 -0
  63. package/esm/form/form-summary/FormSummaryLabel.js.map +1 -0
  64. package/esm/form/form-summary/FormSummaryValue.d.ts +6 -0
  65. package/esm/form/form-summary/FormSummaryValue.js +20 -0
  66. package/esm/form/form-summary/FormSummaryValue.js.map +1 -0
  67. package/esm/form/form-summary/index.d.ts +8 -0
  68. package/esm/form/form-summary/index.js +10 -0
  69. package/esm/form/form-summary/index.js.map +1 -0
  70. package/esm/index.d.ts +3 -2
  71. package/esm/index.js +2 -1
  72. package/esm/index.js.map +1 -1
  73. package/esm/util/hooks/descendants/descendant.js +10 -1
  74. package/esm/util/hooks/descendants/descendant.js.map +1 -1
  75. package/esm/util/hooks/descendants/useDescendant.js +0 -5
  76. package/esm/util/hooks/descendants/useDescendant.js.map +1 -1
  77. package/package.json +15 -4
  78. package/src/form/combobox/FilteredOptions/filteredOptionsContext.tsx +9 -1
  79. package/src/form/combobox/Input/Input.tsx +5 -0
  80. package/src/form/form-summary/FormSummary.tsx +106 -0
  81. package/src/form/form-summary/FormSummaryAnswer.tsx +27 -0
  82. package/src/form/form-summary/FormSummaryAnswers.tsx +25 -0
  83. package/src/form/form-summary/FormSummaryEditLink.tsx +35 -0
  84. package/src/form/form-summary/FormSummaryHeader.tsx +25 -0
  85. package/src/form/form-summary/FormSummaryHeading.tsx +23 -0
  86. package/src/form/form-summary/FormSummaryLabel.tsx +17 -0
  87. package/src/form/form-summary/FormSummaryValue.tsx +24 -0
  88. package/src/form/form-summary/index.ts +30 -0
  89. package/src/index.ts +16 -15
  90. package/src/util/hooks/descendants/descendant.ts +15 -1
  91. package/src/util/hooks/descendants/useDescendant.tsx +0 -5
  92. package/src/accordion/accordion.stories.tsx +0 -286
  93. package/src/alert/alert.stories.tsx +0 -306
  94. package/src/button/button.stories.tsx +0 -185
  95. package/src/chat/chat.stories.tsx +0 -341
  96. package/src/chips/chips.stories.tsx +0 -260
  97. package/src/copybutton/copy-button.stories.tsx +0 -261
  98. package/src/date/datepicker/datepicker.stories.tsx +0 -614
  99. package/src/date/monthpicker/monthpicker.stories.tsx +0 -221
  100. package/src/dropdown/dropdown.stories.tsx +0 -124
  101. package/src/expansion-card/expansion-card.stories.tsx +0 -282
  102. package/src/form/checkbox/checkbox.stories.tsx +0 -281
  103. package/src/form/combobox/combobox.stories.tsx +0 -626
  104. package/src/form/confirmation-panel/confirmation-panel.stories.tsx +0 -128
  105. package/src/form/error-summary/error-summary.stories.tsx +0 -81
  106. package/src/form/fieldset/fieldset.stories.tsx +0 -157
  107. package/src/form/file-upload/file-upload-dropzone.stories.tsx +0 -123
  108. package/src/form/file-upload/file-upload-item.stories.tsx +0 -148
  109. package/src/form/file-upload/file-upload.stories.tsx +0 -248
  110. package/src/form/radio/radio.stories.tsx +0 -230
  111. package/src/form/search/search.stories.tsx +0 -238
  112. package/src/form/select/select.stories.tsx +0 -172
  113. package/src/form/switch/switch.stories.tsx +0 -171
  114. package/src/form/textarea/textarea.stories.tsx +0 -254
  115. package/src/form/textfield/text-field.stories.tsx +0 -143
  116. package/src/guide-panel/guidepanel.stories.tsx +0 -90
  117. package/src/help-text/help-text.stories.tsx +0 -91
  118. package/src/internal-header/header.stories.tsx +0 -229
  119. package/src/layout/bleed/Bleed.stories.tsx +0 -395
  120. package/src/layout/box/Box.stories.tsx +0 -380
  121. package/src/layout/grid/h-grid.stories.tsx +0 -122
  122. package/src/layout/page/Page.stories.tsx +0 -271
  123. package/src/layout/responsive/hide.stories.tsx +0 -80
  124. package/src/layout/responsive/show.stories.tsx +0 -80
  125. package/src/layout/sidemal-test/navno-sidemal.stories.tsx +0 -69
  126. package/src/layout/stack/stack.stories.tsx +0 -183
  127. package/src/link/stories/link.stories.tsx +0 -304
  128. package/src/link-panel/link-panel.stories.tsx +0 -59
  129. package/src/list/list.stories.tsx +0 -280
  130. package/src/loader/loader.stories.tsx +0 -82
  131. package/src/modal/modal.stories.tsx +0 -391
  132. package/src/pagination/pagination.stories.tsx +0 -110
  133. package/src/popover/popover.stories.tsx +0 -113
  134. package/src/portal/Portal.stories.tsx +0 -102
  135. package/src/read-more/readmore.stories.tsx +0 -91
  136. package/src/skeleton/skeleton.stories.tsx +0 -130
  137. package/src/stepper/stepper.stories.tsx +0 -200
  138. package/src/table/stories/table-1.stories.tsx +0 -292
  139. package/src/table/stories/table-2-expandable.stories.tsx +0 -298
  140. package/src/table/stories/table-3-async.stories.tsx +0 -179
  141. package/src/table/stories/tests/table.stories.tsx +0 -102
  142. package/src/tabs/Tabs.stories.tsx +0 -311
  143. package/src/tag/tag.stories.tsx +0 -126
  144. package/src/timeline/timeline.stories.tsx +0 -445
  145. package/src/toggle-group/ToggleGroup.stories.tsx +0 -198
  146. package/src/tooltip/tooltip.stories.tsx +0 -101
  147. package/src/typography/stories/bodylong.stories.tsx +0 -209
  148. package/src/typography/stories/bodyshort.stories.tsx +0 -208
  149. package/src/typography/stories/detail.stories.tsx +0 -115
  150. package/src/typography/stories/error-message.stories.tsx +0 -122
  151. package/src/typography/stories/heading.stories.tsx +0 -169
  152. package/src/typography/stories/label.stories.tsx +0 -131
  153. package/src/util/hooks/descendants/descendant.stories.tsx +0 -147
@@ -1,614 +0,0 @@
1
- import { Meta, StoryObj } from "@storybook/react";
2
- import { expect, userEvent, within } from "@storybook/test";
3
- import { isSameDay } from "date-fns";
4
- import React, { useId, useState } from "react";
5
- import { act } from "react-dom/test-utils";
6
- import { Button } from "../../button";
7
- import { HGrid } from "../../layout/grid";
8
- import { VStack } from "../../layout/stack";
9
- import Modal from "../../modal/Modal";
10
- import { BodyLong } from "../../typography";
11
- import { useDatepicker, useRangeDatepicker } from "../hooks";
12
- import DatePicker, { DatePickerProps } from "./DatePicker";
13
-
14
- const disabledDays = [
15
- new Date("Oct 10 2022"),
16
- { from: new Date("Aug 31 2022"), to: new Date("Sep 8 2022") },
17
- ];
18
-
19
- export default {
20
- title: "ds-react/Datepicker",
21
- component: DatePicker,
22
- parameters: {
23
- chromatic: { disable: true },
24
- },
25
- } satisfies Meta<typeof DatePicker>;
26
-
27
- type Story = StoryObj<typeof DatePicker>;
28
-
29
- type DefaultStoryProps = DatePickerProps & {
30
- size: "medium" | "small";
31
- inputfield: boolean;
32
- standalone: boolean;
33
- };
34
-
35
- export const Default: StoryObj<DefaultStoryProps> = {
36
- render: (props) => {
37
- const [open, setOpen] = useState(false);
38
-
39
- const rangeCtx = useRangeDatepicker({
40
- fromDate: new Date("Aug 23 2023"),
41
- toDate: new Date("Aug 23 2029"),
42
- });
43
-
44
- const singleCtx = useDatepicker({
45
- fromDate: new Date("Aug 23 2020"),
46
- toDate: new Date("Aug 23 2029"),
47
- });
48
-
49
- const newProps = {
50
- ...(!props.inputfield || props.mode === "multiple"
51
- ? {
52
- open,
53
- onClose: () => setOpen(false),
54
- fromDate: new Date("Aug 23 2020"),
55
- toDate: new Date("Aug 23 2029"),
56
- }
57
- : {}),
58
- };
59
-
60
- const Comp = !props.standalone ? DatePicker : DatePicker.Standalone;
61
-
62
- return (
63
- <div>
64
- <Comp
65
- dropdownCaption={props.dropdownCaption}
66
- showWeekNumber={props.showWeekNumber}
67
- mode={props.mode}
68
- {...(props.mode === "single"
69
- ? singleCtx.datepickerProps
70
- : props.mode === "range"
71
- ? rangeCtx.datepickerProps
72
- : {})}
73
- {...newProps}
74
- locale={props.locale}
75
- disableWeekends={props.disableWeekends}
76
- >
77
- {!props.standalone && (
78
- <>
79
- {props.inputfield && props.mode !== "multiple" ? (
80
- <>
81
- {props.mode === "range" ? (
82
- <div style={{ display: "flex", gap: "1rem" }}>
83
- <DatePicker.Input
84
- label="Fra"
85
- size={props?.size}
86
- {...rangeCtx.fromInputProps}
87
- />
88
- <DatePicker.Input
89
- label="Til"
90
- size={props?.size}
91
- {...rangeCtx.toInputProps}
92
- />
93
- </div>
94
- ) : (
95
- <>
96
- <DatePicker.Input
97
- label="Velg dato"
98
- size={props?.size}
99
- {...singleCtx.inputProps}
100
- />
101
- </>
102
- )}
103
- </>
104
- ) : (
105
- <Button onClick={() => setOpen((x) => !x)}>
106
- Åpne datovelger
107
- </Button>
108
- )}
109
- </>
110
- )}
111
- </Comp>
112
- </div>
113
- );
114
- },
115
-
116
- args: {
117
- dropdownCaption: false,
118
- disableWeekends: false,
119
- showWeekNumber: false,
120
- mode: "single",
121
- inputfield: true,
122
- standalone: false,
123
- },
124
- argTypes: {
125
- size: {
126
- options: ["medium", "small"],
127
- control: { type: "radio" },
128
- },
129
- locale: {
130
- options: ["nb", "nn", "en"],
131
- control: { type: "radio" },
132
- },
133
- mode: {
134
- options: ["single", "multiple", "range"],
135
- control: { type: "radio" },
136
- },
137
- },
138
- };
139
-
140
- export const DropdownCaption = () => (
141
- <DatePicker.Standalone
142
- dropdownCaption
143
- fromDate={new Date("Aug 23 2018")}
144
- toDate={new Date("Aug 23 2022")}
145
- />
146
- );
147
-
148
- export const DisabledDays = () => (
149
- <DatePicker.Standalone
150
- disabled={disabledDays}
151
- disableWeekends
152
- today={new Date("2006-07-01")}
153
- />
154
- );
155
-
156
- export const ShowWeekNumber = () => (
157
- <DatePicker.Standalone showWeekNumber today={new Date("2006-07-01")} />
158
- );
159
-
160
- export const UseDatepicker = () => {
161
- const { datepickerProps, inputProps } = useDatepicker({
162
- fromDate: new Date("Aug 23 2019"),
163
- toDate: new Date("Feb 23 2024"),
164
- onDateChange: console.log,
165
- onValidate: console.log,
166
- });
167
-
168
- return (
169
- <div style={{ display: "flex", gap: "1rem" }}>
170
- <DatePicker {...datepickerProps} dropdownCaption>
171
- <DatePicker.Input {...inputProps} label="Velg dato" />
172
- </DatePicker>
173
- </div>
174
- );
175
- };
176
-
177
- export const UseRangedDatepicker = () => {
178
- const { datepickerProps, fromInputProps, toInputProps } = useRangeDatepicker({
179
- fromDate: new Date("Aug 23 2019"),
180
- onRangeChange: console.log,
181
- onValidate: console.log,
182
- });
183
-
184
- return (
185
- <div style={{ display: "flex", gap: "1rem" }}>
186
- <DatePicker {...datepickerProps}>
187
- <div style={{ display: "flex", gap: "1rem" }}>
188
- <DatePicker.Input {...fromInputProps} label="Fra" />
189
- <DatePicker.Input {...toInputProps} label="Til" />
190
- </div>
191
- </DatePicker>
192
- </div>
193
- );
194
- };
195
-
196
- export const NB = () => (
197
- <DatePicker.Standalone locale="nb" today={new Date("2006-07-01")} />
198
- );
199
-
200
- export const NN = () => (
201
- <DatePicker.Standalone locale="nn" today={new Date("2006-07-01")} />
202
- );
203
-
204
- export const EN = () => (
205
- <DatePicker.Standalone locale="en" today={new Date("2006-07-01")} />
206
- );
207
-
208
- export const Standalone = () => (
209
- <DatePicker.Standalone today={new Date("2006-07-01")} />
210
- );
211
-
212
- export const StandaloneRange = () => (
213
- <DatePicker.Standalone mode="range" today={new Date("2006-07-01")} />
214
- );
215
-
216
- export const StandaloneMultiple = () => (
217
- <DatePicker.Standalone mode="multiple" today={new Date("2006-07-01")} />
218
- );
219
-
220
- export const UserControlled = () => {
221
- const [open, setOpen] = useState(false);
222
- const id = useId();
223
-
224
- return (
225
- <div>
226
- <DatePicker
227
- mode="multiple"
228
- open={open}
229
- onClose={() => setOpen(false)}
230
- id={id}
231
- >
232
- <Button aria-controls={id} onClick={() => setOpen((x) => !x)}>
233
- Legg til dager
234
- </Button>
235
- </DatePicker>
236
- </div>
237
- );
238
- };
239
-
240
- export const Validering = () => {
241
- const [error, setError] = useState(false);
242
- const { datepickerProps, inputProps } = useDatepicker({
243
- fromDate: new Date("Aug 2 2019"),
244
- onValidate: (val) => setError(val.isWeekend),
245
- defaultSelected: new Date("Nov 26 2022"),
246
- disableWeekends: true,
247
- onDateChange: console.log,
248
- });
249
-
250
- return (
251
- <div style={{ display: "flex", gap: "1rem" }}>
252
- <DatePicker {...datepickerProps}>
253
- <DatePicker.Input
254
- error={
255
- error
256
- ? "NAV-kontoret er ikke åpent i helger. Velg en annen dag."
257
- : undefined
258
- }
259
- {...inputProps}
260
- label="Velg dato"
261
- />
262
- </DatePicker>
263
- </div>
264
- );
265
- };
266
-
267
- export const DisabledInput = () => {
268
- return (
269
- <div style={{ display: "flex", gap: "1rem" }}>
270
- <DatePicker>
271
- <DatePicker.Input disabled label="Velg dato" />
272
- </DatePicker>
273
- </div>
274
- );
275
- };
276
-
277
- export const ErrorInput = () => {
278
- return (
279
- <div style={{ display: "flex", gap: "1rem" }}>
280
- <DatePicker>
281
- <DatePicker.Input error="feilmelding" label="Velg dato" />
282
- </DatePicker>
283
- </div>
284
- );
285
- };
286
-
287
- export const UseRangedDatepickerValidation = () => {
288
- const { datepickerProps, fromInputProps, toInputProps } = useRangeDatepicker({
289
- fromDate: new Date("Aug 23 2019"),
290
- disableWeekends: true,
291
- disabled: [new Date("Oct 10 2022")],
292
- onValidate: console.table,
293
- });
294
-
295
- return (
296
- <div style={{ display: "flex", gap: "1rem" }}>
297
- <DatePicker {...datepickerProps}>
298
- <div style={{ display: "flex", gap: "1rem" }}>
299
- <DatePicker.Input {...fromInputProps} label="Fra" />
300
- <DatePicker.Input {...toInputProps} label="Til" />
301
- </div>
302
- </DatePicker>
303
- </div>
304
- );
305
- };
306
-
307
- export const DefaultShownMonth = () => {
308
- const { datepickerProps, inputProps } = useDatepicker({
309
- fromDate: new Date("Aug 23 2019"),
310
- onDateChange: console.log,
311
- defaultMonth: new Date("Oct 23 2022"),
312
- });
313
-
314
- return (
315
- <div style={{ display: "flex", gap: "1rem" }}>
316
- <DatePicker {...datepickerProps}>
317
- <DatePicker.Input {...inputProps} label="Velg dato" />
318
- </DatePicker>
319
- </div>
320
- );
321
- };
322
-
323
- export const Size = () => {
324
- const { datepickerProps, inputProps } = useDatepicker({
325
- fromDate: new Date("Aug 23 2019"),
326
- toDate: new Date("Feb 23 2024"),
327
- onDateChange: console.log,
328
- defaultSelected: new Date("Feb 23 2023"),
329
- });
330
- const { datepickerProps: d2, inputProps: i2 } = useDatepicker({
331
- fromDate: new Date("Aug 23 2019"),
332
- toDate: new Date("Feb 23 2024"),
333
- onDateChange: console.log,
334
- defaultSelected: new Date("Feb 23 2023"),
335
- });
336
-
337
- return (
338
- <div style={{ display: "flex", gap: "1rem" }}>
339
- <DatePicker {...datepickerProps} dropdownCaption>
340
- <DatePicker.Input
341
- placeholder="10/10/2023"
342
- size="medium"
343
- {...inputProps}
344
- label="Velg dato"
345
- />
346
- </DatePicker>
347
- <DatePicker {...d2} dropdownCaption>
348
- <DatePicker.Input
349
- placeholder="10/10/2023"
350
- size="small"
351
- {...i2}
352
- label="Velg dato"
353
- />
354
- </DatePicker>
355
- </div>
356
- );
357
- };
358
-
359
- export const Readonly = () => {
360
- const { datepickerProps, inputProps } = useDatepicker({
361
- fromDate: new Date("Aug 23 2019"),
362
- toDate: new Date("Feb 23 2024"),
363
- onDateChange: console.log,
364
- });
365
-
366
- return (
367
- <div style={{ display: "flex", gap: "1rem" }}>
368
- <DatePicker {...datepickerProps} dropdownCaption>
369
- <DatePicker.Input
370
- size="medium"
371
- {...inputProps}
372
- value="01.02.2021"
373
- label="Velg dato"
374
- readOnly
375
- />
376
- </DatePicker>
377
- </div>
378
- );
379
- };
380
-
381
- export const StandaloneOptions = () => {
382
- return (
383
- <HGrid columns={{ xs: 1, md: 2 }} gap="8">
384
- <DatePicker.Standalone today={new Date("Nov 23 2022")} />
385
- <DatePicker.Standalone
386
- dropdownCaption
387
- fromDate={new Date("Aug 23 2019")}
388
- toDate={new Date("Feb 23 2024")}
389
- today={new Date("Nov 23 2022")}
390
- />
391
- <DatePicker.Standalone showWeekNumber today={new Date("Nov 23 2022")} />
392
- <DatePicker.Standalone
393
- showWeekNumber
394
- mode="multiple"
395
- onWeekNumberClick={console.log}
396
- today={new Date("Nov 23 2022")}
397
- disableWeekends
398
- />
399
- <DatePicker.Standalone
400
- mode="range"
401
- today={new Date("Nov 23 2022")}
402
- disableWeekends
403
- />
404
- </HGrid>
405
- );
406
- };
407
-
408
- export const WeekDayClick = () => {
409
- const [days, setDays] = useState<Date[]>([]);
410
-
411
- const handleWeekClick = (dates: Date[]) => {
412
- const hasDayInWeek = !!days.find((x) => dates.find((y) => isSameDay(x, y)));
413
-
414
- const cleanup = days.filter((y) => !dates.find((z) => isSameDay(y, z)));
415
- if (hasDayInWeek) {
416
- setDays(cleanup);
417
- } else {
418
- setDays([...dates, ...cleanup]);
419
- }
420
- };
421
-
422
- return (
423
- <VStack gap="8">
424
- <DatePicker.Standalone
425
- showWeekNumber
426
- mode="multiple"
427
- onWeekNumberClick={(_, dates) => handleWeekClick(dates)}
428
- onSelect={(dates) => dates && setDays(dates)}
429
- selected={days}
430
- today={new Date("Nov 23 2022")}
431
- />
432
- <DatePicker.Standalone
433
- showWeekNumber
434
- mode="multiple"
435
- onWeekNumberClick={(_, dates) => handleWeekClick(dates)}
436
- onSelect={(dates) => dates && setDays(dates)}
437
- selected={days}
438
- today={new Date("Nov 23 2022")}
439
- disableWeekends
440
- />
441
- </VStack>
442
- );
443
- };
444
-
445
- export const Required = {
446
- render: () => {
447
- const { datepickerProps } = useDatepicker({
448
- defaultSelected: new Date("Apr 10 2024"),
449
- required: true,
450
- });
451
-
452
- return (
453
- <div style={{ height: "20rem" }}>
454
- <DatePicker.Standalone {...datepickerProps} />
455
- </div>
456
- );
457
- },
458
- play: async ({ canvasElement }) => {
459
- const canvas = within(canvasElement);
460
-
461
- const button10 = canvas.getByRole("button", { pressed: true });
462
-
463
- await act(async () => {
464
- await userEvent.click(button10);
465
- });
466
-
467
- expect(button10.ariaPressed).toBe("true");
468
-
469
- const button17 = canvas.getByText("17").closest("button");
470
-
471
- expect(button17?.ariaPressed).toBe("false");
472
-
473
- await act(async () => {
474
- button17 && (await userEvent.click(button17));
475
- });
476
-
477
- expect(button17?.ariaPressed).toBe("true");
478
- expect(button10.ariaPressed).toBe("false");
479
- },
480
- };
481
-
482
- export const ModalDemo = () => {
483
- const { datepickerProps, inputProps } = useDatepicker({
484
- fromDate: new Date("Aug 23 2019"),
485
- toDate: new Date("Feb 23 2024"),
486
- onDateChange: console.log,
487
- });
488
- const [open, setOpen] = useState(true);
489
-
490
- return (
491
- <>
492
- <Button onClick={() => setOpen(!open)}>Open modal</Button>
493
- <Modal
494
- open={open}
495
- onClose={() => setOpen(false)}
496
- header={{ heading: "Modal-demo" }}
497
- >
498
- <Modal.Body style={{ position: "relative" }}>
499
- <BodyLong spacing>
500
- Lorem ipsum dolor sit, amet consectetur adipisicing elit.
501
- </BodyLong>
502
-
503
- <DatePicker {...datepickerProps} dropdownCaption>
504
- <DatePicker.Input
505
- {...inputProps}
506
- label="Velg dato"
507
- description="Format: dd.mm.yyyy"
508
- />
509
- </DatePicker>
510
- </Modal.Body>
511
- <Modal.Footer>
512
- <Button>Neste</Button>
513
- <Button variant="secondary">Tilbake</Button>
514
- <Button variant="tertiary">Avbryt</Button>
515
- </Modal.Footer>
516
- </Modal>
517
- </>
518
- );
519
- };
520
- ModalDemo.parameters = { chromatic: { pauseAnimationAtEnd: true } };
521
-
522
- export const Chromatic: Story = {
523
- render: () => (
524
- <div>
525
- <div>
526
- <h2>DropdownCaption</h2>
527
- <DropdownCaption />
528
- </div>
529
- <div>
530
- <h2>DisabledDays</h2>
531
- <DisabledDays />
532
- </div>
533
- <div>
534
- <h2>ShowWeekNumber</h2>
535
- <ShowWeekNumber />
536
- </div>
537
- <div>
538
- <h2>UseDatepicker</h2>
539
- <UseDatepicker />
540
- </div>
541
- <div>
542
- <h2>UseRangedDatepicker</h2>
543
- <UseRangedDatepicker />
544
- </div>
545
- <div>
546
- <h2>NB</h2>
547
- <NB />
548
- </div>
549
- <div>
550
- <h2>NN</h2>
551
- <NN />
552
- </div>
553
- <div>
554
- <h2>EN</h2>
555
- <EN />
556
- </div>
557
- <div>
558
- <h2>Standalone</h2>
559
- <Standalone />
560
- </div>
561
- <div>
562
- <h2>StandaloneRange</h2>
563
- <StandaloneRange />
564
- </div>
565
- <div>
566
- <h2>StandaloneMultiple</h2>
567
- <StandaloneMultiple />
568
- </div>
569
- <div>
570
- <h2>UserControlled</h2>
571
- <UserControlled />
572
- </div>
573
- <div>
574
- <h2>Validering</h2>
575
- <Validering />
576
- </div>
577
- <div>
578
- <h2>DisabledInput</h2>
579
- <DisabledInput />
580
- </div>
581
- <div>
582
- <h2>ErrorInput</h2>
583
- <ErrorInput />
584
- </div>
585
- <div>
586
- <h2>UseRangedDatepickerValidation</h2>
587
- <UseRangedDatepickerValidation />
588
- </div>
589
- <div>
590
- <h2>DefaultShownMonth</h2>
591
- <DefaultShownMonth />
592
- </div>
593
- <div>
594
- <h2>Size</h2>
595
- <Size />
596
- </div>
597
- <div>
598
- <h2>Readonly</h2>
599
- <Readonly />
600
- </div>
601
- <div>
602
- <h2>StandaloneOptions</h2>
603
- <StandaloneOptions />
604
- </div>
605
- <div>
606
- <h2>WeekDayClick</h2>
607
- <WeekDayClick />
608
- </div>
609
- </div>
610
- ),
611
- parameters: {
612
- chromatic: { disable: false },
613
- },
614
- };