Skip to content

Commit 913d8a0

Browse files
committed
fix(site): validate group name before submitting to the backend
Change-Id: I6ffc2d571b2f6c6387ef143e0b0e74cf4196a551 Signed-off-by: Thomas Kosiewski <tk@coder.com>
1 parent 24dd8a1 commit 913d8a0

File tree

5 files changed

+40
-4
lines changed

5 files changed

+40
-4
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ site/stats/
5454

5555
# direnv
5656
.envrc
57+
.direnv
5758
*.test
5859

5960
# Loadtesting

site/src/pages/GroupsPage/CreateGroupPageView.stories.tsx

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import type { Meta, StoryObj } from "@storybook/react";
22
import { mockApiError } from "testHelpers/entities";
33
import { CreateGroupPageView } from "./CreateGroupPageView";
4+
import { userEvent, within } from "@storybook/test";
45

56
const meta: Meta<typeof CreateGroupPageView> = {
67
title: "pages/GroupsPage/CreateGroupPageView",
@@ -21,3 +22,13 @@ export const WithError: Story = {
2122
initialTouched: { name: true },
2223
},
2324
};
25+
26+
export const InvalidName: Story = {
27+
play: async ({ canvasElement }) => {
28+
const user = userEvent.setup();
29+
const body = within(canvasElement.ownerDocument.body);
30+
const input = await body.findByLabelText("Name");
31+
await user.type(input, "$om3 !nv@lid Name");
32+
input.blur();
33+
},
34+
};

site/src/pages/GroupsPage/CreateGroupPageView.tsx

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,15 @@ import { Stack } from "components/Stack/Stack";
1212
import { type FormikTouched, useFormik } from "formik";
1313
import type { FC } from "react";
1414
import { useNavigate } from "react-router-dom";
15-
import { getFormHelpers, onChangeTrimmed } from "utils/formUtils";
15+
import {
16+
getFormHelpers,
17+
nameValidator,
18+
onChangeTrimmed,
19+
} from "utils/formUtils";
1620
import * as Yup from "yup";
1721

1822
const validationSchema = Yup.object({
19-
name: Yup.string().required().label("Name"),
23+
name: nameValidator("Name"),
2024
});
2125

2226
export type CreateGroupPageViewProps = {
@@ -62,13 +66,16 @@ export const CreateGroupPageView: FC<CreateGroupPageViewProps> = ({
6266
autoFocus
6367
fullWidth
6468
label="Name"
69+
onChange={onChangeTrimmed(form)}
70+
autoComplete="name"
6571
/>
6672
<TextField
6773
{...getFieldHelpers("display_name", {
6874
helperText: "Optional: keep empty to default to the name.",
6975
})}
7076
fullWidth
7177
label="Display Name"
78+
autoComplete="display_name"
7279
/>
7380
<IconField
7481
{...getFieldHelpers("avatar_url")}

site/src/pages/ManagementSettingsPage/GroupsPage/CreateGroupPageView.stories.tsx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,3 +30,13 @@ export const WithError: Story = {
3030
});
3131
},
3232
};
33+
34+
export const InvalidName: Story = {
35+
play: async ({ canvasElement }) => {
36+
const user = userEvent.setup();
37+
const body = within(canvasElement.ownerDocument.body);
38+
const input = await body.findByLabelText("Name");
39+
await user.type(input, "$om3 !nv@lid Name");
40+
input.blur();
41+
},
42+
};

site/src/pages/ManagementSettingsPage/GroupsPage/CreateGroupPageView.tsx

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,15 @@ import { Spinner } from "components/Spinner/Spinner";
1515
import { useFormik } from "formik";
1616
import type { FC } from "react";
1717
import { useNavigate } from "react-router-dom";
18-
import { getFormHelpers, onChangeTrimmed } from "utils/formUtils";
18+
import {
19+
getFormHelpers,
20+
nameValidator,
21+
onChangeTrimmed,
22+
} from "utils/formUtils";
1923
import * as Yup from "yup";
2024

2125
const validationSchema = Yup.object({
22-
name: Yup.string().required().label("Name"),
26+
name: nameValidator("Name"),
2327
});
2428

2529
export type CreateGroupPageViewProps = {
@@ -69,13 +73,16 @@ export const CreateGroupPageView: FC<CreateGroupPageViewProps> = ({
6973
autoFocus
7074
fullWidth
7175
label="Name"
76+
onChange={onChangeTrimmed(form)}
77+
autoComplete="name"
7278
/>
7379
<TextField
7480
{...getFieldHelpers("display_name", {
7581
helperText: "Optional: keep empty to default to the name.",
7682
})}
7783
fullWidth
7884
label="Display Name"
85+
autoComplete="display_name"
7986
/>
8087
<IconField
8188
{...getFieldHelpers("avatar_url")}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy