Skip to content

Commit

Permalink
Datepicker/MonthPicker required bugs (#2838)
Browse files Browse the repository at this point in the history
* 🐛 Required-prop på monthpicker stoppet ikke de-select av valg

* 🧪 Tester required for datepicker

* 🔥 Fjernet console.logs

* 📝 Changeset

* Update .changeset/fifty-hairs-fix.md

Co-authored-by: Halvor Haugan <[email protected]>

* Update @navikt/core/react/src/date/datepicker/datepicker.stories.tsx

Co-authored-by: Halvor Haugan <[email protected]>

* 🔥 Disabled-attrb er ikke nødvendig i required demo

* 🐛 Satt defaultSelected-dato til statisk dato

* ♻️ Fjernet unødvendig required-sjekk

---------

Co-authored-by: Halvor Haugan <[email protected]>
  • Loading branch information
KenAJoh and HalvorHaugan authored Apr 11, 2024
1 parent cd2adcb commit deae4ec
Show file tree
Hide file tree
Showing 8 changed files with 98 additions and 21 deletions.
5 changes: 5 additions & 0 deletions .changeset/fifty-hairs-fix.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@navikt/ds-react": patch
---

DatePicker/MonthPicker: Valgte datoer får nå `aria-pressed` for å bedre indikere valg for skjermleser.
5 changes: 5 additions & 0 deletions .changeset/five-cherries-boil.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@navikt/ds-react": patch
---

DatePicker/MonthPicker: `required`-prop stoppet ikke de-select av allerede valgt dato.
39 changes: 39 additions & 0 deletions @navikt/core/react/src/date/datepicker/datepicker.stories.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import { Meta, StoryObj } from "@storybook/react";
import { expect, userEvent, within } from "@storybook/test";
import { isSameDay } from "date-fns";
import React, { useId, useState } from "react";
import { act } from "react-dom/test-utils";
import { Button } from "../../button";
import { HGrid } from "../../layout/grid";
import { VStack } from "../../layout/stack";
Expand Down Expand Up @@ -440,6 +442,43 @@ export const WeekDayClick = () => {
);
};

export const Required = {
render: () => {
const { datepickerProps } = useDatepicker({
defaultSelected: new Date("Apr 10 2024"),
required: true,
});

return (
<div style={{ height: "20rem" }}>
<DatePicker.Standalone {...datepickerProps} />
</div>
);
},
play: async ({ canvasElement }) => {
const canvas = within(canvasElement);

const button10 = canvas.getByRole("button", { pressed: true });

await act(async () => {
await userEvent.click(button10);
});

expect(button10.ariaPressed).toBe("true");

const button17 = canvas.getByText("17").closest("button");

expect(button17?.ariaPressed).toBe("false");

await act(async () => {
button17 && (await userEvent.click(button17));
});

expect(button17?.ariaPressed).toBe("true");
expect(button10.ariaPressed).toBe("false");
},
};

export const ModalDemo = () => {
const { datepickerProps, inputProps } = useDatepicker({
fromDate: new Date("Aug 23 2019"),
Expand Down
2 changes: 2 additions & 0 deletions @navikt/core/react/src/date/datepicker/parts/DayButton.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ const DayButton = (props: DayProps) => {
role={undefined}
aria-label={dateTime}
aria-hidden={dayRender.activeModifiers.outside}
aria-selected={undefined}
aria-pressed={!!dayRender.activeModifiers.selected}
/>
);
};
Expand Down
6 changes: 5 additions & 1 deletion @navikt/core/react/src/date/hooks/useDatepicker.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -229,12 +229,16 @@ export const useDatepicker = (

/* Only allow de-selecting if not required */
const handleDayClick: DayClickEventHandler = (day, { selected }) => {
if (selected && required) {
return;
}

if (day && !selected) {
handleOpen(false);
anchorRef?.focus();
}

if (!required && selected) {
if (selected) {
updateDate(undefined);
setInputValue("");
updateValidation({ isValidDate: false, isEmpty: true });
Expand Down
6 changes: 5 additions & 1 deletion @navikt/core/react/src/date/hooks/useMonthPicker.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -225,13 +225,17 @@ export const useMonthpicker = (

/* Only allow de-selecting if not required */
const handleMonthClick = (month?: Date) => {
if (!month && required) {
return;
}

if (month) {
handleOpen(false);
setYear(month);
anchorRef?.focus();
}

if (!required && !month) {
if (!month) {
updateMonth(undefined);
updateValidation({ isValidMonth: false, isEmpty: true });
setInputValue("");
Expand Down
1 change: 1 addition & 0 deletions @navikt/core/react/src/date/monthpicker/MonthButton.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ export const MonthButton = ({
type="button"
onClick={() => onSelect(isSelected ? undefined : month)}
disabled={isDisabled}
aria-pressed={!!isSelected}
className={cl("navds-date__month-button", {
"rdp-day_today": dateIsInCurrentMonth(month, year),
"rdp-day_selected": isSelected,
Expand Down
55 changes: 36 additions & 19 deletions @navikt/core/react/src/date/monthpicker/monthpicker.stories.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import { Meta, StoryFn, StoryObj } from "@storybook/react";
import { expect, userEvent, within } from "@storybook/test";
import { setYear } from "date-fns";
import React, { useId, useState } from "react";
import { act } from "react-dom/test-utils";
import { Button } from "../../button";
import { useMonthpicker } from "../hooks";
import { DateInputProps } from "../parts/DateInput";
Expand Down Expand Up @@ -121,25 +123,41 @@ export const UseMonthpickerFormat = () => {
);
};

export const Required = () => {
const { inputProps, monthpickerProps } = useMonthpicker({
locale: "nb",
defaultSelected: new Date(),
disabled: [new Date("Apr 1 2022")],
required: true,
});
export const Required = {
render: () => {
const { monthpickerProps } = useMonthpicker({
defaultSelected: new Date("Apr 10 2024"),
required: true,
});

return (
<div style={{ height: "20rem" }}>
<MonthPicker {...monthpickerProps}>
<MonthPicker.Input
{...inputProps}
label="Velg måned"
variant="monthpicker"
/>
</MonthPicker>
</div>
);
return (
<div style={{ height: "20rem" }}>
<MonthPicker.Standalone {...monthpickerProps} />
</div>
);
},
play: async ({ canvasElement }) => {
const canvas = within(canvasElement);

const buttonApr = canvas.getByRole("button", { pressed: true });

await act(async () => {
await userEvent.click(buttonApr);
});

expect(buttonApr.ariaPressed).toBe("true");

const buttonSep = canvas.getByText("september").closest("button");

expect(buttonSep?.ariaPressed).toBe("false");

await act(async () => {
buttonSep && (await userEvent.click(buttonSep));
});

expect(buttonSep?.ariaPressed).toBe("true");
expect(buttonApr.ariaPressed).toBe("false");
},
};

export const UserControlled = () => {
Expand Down Expand Up @@ -193,7 +211,6 @@ export const Chromatic: Story = {
<DisabledMonths />
<UseMonthpicker />
<UseMonthpickerFormat />
<Required />
<UserControlled />
<FollowYear />
</div>
Expand Down

0 comments on commit deae4ec

Please sign in to comment.