diff --git a/web/src/lib/components/organization/MemberPicker.stories.svelte b/web/src/lib/components/organization/MemberPicker.stories.svelte new file mode 100644 index 000000000..59c6ab47b --- /dev/null +++ b/web/src/lib/components/organization/MemberPicker.stories.svelte @@ -0,0 +1,109 @@ + + + { + const list = within(canvas.getByRole("list")); + const boxes = list.getAllByRole("checkbox"); + await userEvent.click(list.getByText("oppi.tld")); + await expect(boxes[0]).toBeChecked(); + await userEvent.keyboard("{Shift>}"); + await userEvent.click(list.getByText("akshay.tld")); + await userEvent.keyboard("{/Shift}"); + for (const box of boxes.slice(0, 3)) await expect(box).toBeChecked(); + await expect(boxes[3]).not.toBeChecked(); + await userEvent.keyboard("{Control>}"); + await userEvent.click(list.getByText("icyphox.sh")); + await userEvent.keyboard("{/Control}"); + await expect(boxes[0]).toBeChecked(); + await expect(boxes[1]).not.toBeChecked(); + await expect(boxes[2]).toBeChecked(); + await userEvent.keyboard("{Meta>}"); + await userEvent.click(list.getByText("natalie.tld")); + await userEvent.keyboard("{/Meta}"); + await expect(boxes[0]).toBeChecked(); + await expect(boxes[2]).toBeChecked(); + await expect(boxes[3]).toBeChecked(); + await userEvent.click(list.getByText("akshay.tld")); + await expect(boxes[0]).not.toBeChecked(); + await expect(boxes[1]).not.toBeChecked(); + await expect(boxes[2]).toBeChecked(); + await expect(boxes[3]).not.toBeChecked(); + }} +/> + + { + const boxes = canvas.getAllByRole("checkbox"); + await userEvent.click(boxes[0]); + await userEvent.click(boxes[0]); + await expect(boxes[0]).toBeChecked(); + await userEvent.keyboard("{Shift>}"); + await userEvent.click(boxes[2]); + await userEvent.keyboard("{/Shift}"); + for (const box of boxes.slice(0, 3)) await expect(box).toBeChecked(); + await userEvent.keyboard("{Control>}"); + await userEvent.click(boxes[1]); + await expect(boxes[1]).not.toBeChecked(); + await userEvent.click(boxes[1]); + await expect(boxes[1]).toBeChecked(); + await userEvent.keyboard("{/Control}"); + await userEvent.tab(); + await expect(boxes[2]).toHaveFocus(); + await userEvent.keyboard(" "); + await expect(boxes[0]).not.toBeChecked(); + await expect(boxes[1]).not.toBeChecked(); + await expect(boxes[2]).toBeChecked(); + await userEvent.keyboard("{Control>} {/Control}"); + await expect(boxes[2]).not.toBeChecked(); + await userEvent.keyboard(" "); + await expect(boxes[2]).toBeChecked(); + }} +/> + + { + const list = within(canvas.getByRole("list")); + const search = canvas.getByRole("searchbox"); + await userEvent.click(list.getByText("akshay.tld")); + await userEvent.type(search, ".tld"); + await expect(list.getByRole("checkbox", { name: "akshay.tld" })).toBeChecked(); + await userEvent.keyboard("{Shift>}"); + await userEvent.click(list.getByText("oppi.tld")); + await userEvent.keyboard("{/Shift}"); + await expect(list.getByRole("checkbox", { name: "oppi.tld" })).toBeChecked(); + await expect(list.getByRole("checkbox", { name: "akshay.tld" })).toBeChecked(); + await expect(list.getByRole("checkbox", { name: "natalie.tld" })).not.toBeChecked(); + await userEvent.clear(search); + await expect(list.getByRole("checkbox", { name: "icyphox.sh" })).not.toBeChecked(); + await userEvent.type(search, "icyphox"); + await userEvent.keyboard("{Shift>}"); + await userEvent.click(list.getByText("icyphox.sh")); + await userEvent.keyboard("{/Shift}"); + await expect(list.getByRole("checkbox", { name: "icyphox.sh" })).toBeChecked(); + await expect(canvas.getByRole("button", { name: "Invite (3) members" })).toBeVisible(); + await userEvent.clear(search); + await userEvent.keyboard("{Shift>}"); + await userEvent.click(list.getByText("akshay.tld")); + await userEvent.keyboard("{/Shift}"); + await expect(list.getByRole("checkbox", { name: "oppi.tld" })).not.toBeChecked(); + await expect(list.getByRole("checkbox", { name: "icyphox.sh" })).toBeChecked(); + await expect(list.getByRole("checkbox", { name: "akshay.tld" })).toBeChecked(); + await expect(list.getByRole("checkbox", { name: "natalie.tld" })).not.toBeChecked(); + await userEvent.click(canvas.getByRole("button", { name: "Invite (2) members" })); + await expect(args.onInvite).toHaveBeenCalledExactlyOnceWith(memberCandidates.slice(1, 3)); + }} +/> diff --git a/web/src/lib/components/organization/MemberPicker.svelte b/web/src/lib/components/organization/MemberPicker.svelte index 62a528fff..b64a11e38 100644 --- a/web/src/lib/components/organization/MemberPicker.svelte +++ b/web/src/lib/components/organization/MemberPicker.svelte @@ -1,4 +1,5 @@