Skip to content

Commit 3f19d99

Browse files
committed
feat: add cancel and save buttons to top of page
1 parent 71ab83c commit 3f19d99

File tree

2 files changed

+70
-32
lines changed

2 files changed

+70
-32
lines changed
Lines changed: 62 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,29 @@
1+
import Button from "@mui/material/Button";
2+
import { useFormik } from "formik";
13
import type { FC } from "react";
24
import { Helmet } from "react-helmet-async";
35
import { useMutation, useQuery, useQueryClient } from "react-query";
46
import { useNavigate, useParams } from "react-router-dom";
7+
import * as Yup from "yup";
58
import { getErrorMessage } from "api/errors";
69
import { patchOrganizationRole, organizationRoles } from "api/queries/roles";
10+
import type { PatchRoleRequest } from "api/typesGenerated";
711
import { displayError } from "components/GlobalSnackbar/utils";
812
import { Loader } from "components/Loader/Loader";
13+
import { PageHeader } from "components/PageHeader/PageHeader";
14+
import { useAuthenticated } from "contexts/auth/RequireAuth";
915
import { pageTitle } from "utils/page";
1016
import CreateEditRolePageView from "./CreateEditRolePageView";
1117

12-
export const CreateGroupPage: FC = () => {
18+
export const CreateEditRolePage: FC = () => {
19+
const { permissions } = useAuthenticated();
1320
const queryClient = useQueryClient();
1421
const navigate = useNavigate();
1522
const { organization, roleName } = useParams() as {
1623
organization: string;
1724
roleName: string;
1825
};
26+
const { assignOrgRole: canAssignOrgRole } = permissions;
1927
const patchOrganizationRoleMutation = useMutation(
2028
patchOrganizationRole(queryClient, organization ?? "default"),
2129
);
@@ -24,6 +32,31 @@ export const CreateGroupPage: FC = () => {
2432
);
2533
const role = roleData?.find((role) => role.name === roleName);
2634

35+
const validationSchema = Yup.object({
36+
name: Yup.string().required().label("Name"),
37+
});
38+
39+
const onSubmit = async (data: PatchRoleRequest) => {
40+
try {
41+
await patchOrganizationRoleMutation.mutateAsync(data);
42+
navigate(`/organizations/${organization}/roles`);
43+
} catch (error) {
44+
displayError(getErrorMessage(error, "Failed to update custom role"));
45+
}
46+
};
47+
48+
const form = useFormik<PatchRoleRequest>({
49+
initialValues: {
50+
name: role?.name || "",
51+
display_name: role?.display_name || "",
52+
site_permissions: role?.site_permissions || [],
53+
organization_permissions: role?.organization_permissions || [],
54+
user_permissions: role?.user_permissions || [],
55+
},
56+
validationSchema,
57+
onSubmit,
58+
});
59+
2760
if (isLoading) {
2861
return <Loader />;
2962
}
@@ -37,23 +70,40 @@ export const CreateGroupPage: FC = () => {
3770
)}
3871
</title>
3972
</Helmet>
73+
74+
<PageHeader
75+
actions={
76+
canAssignOrgRole && (
77+
<>
78+
<Button
79+
onClick={() => {
80+
navigate(`/organizations/${organization}/roles`);
81+
}}
82+
>
83+
Cancel
84+
</Button>
85+
<Button
86+
variant="contained"
87+
color="primary"
88+
onClick={() => {
89+
form.handleSubmit();
90+
}}
91+
>
92+
{role !== undefined ? "Save" : "Create Role"}
93+
</Button>
94+
</>
95+
)
96+
}
97+
></PageHeader>
98+
4099
<CreateEditRolePageView
41100
role={role}
42-
onSubmit={async (data) => {
43-
try {
44-
await patchOrganizationRoleMutation.mutateAsync(data);
45-
navigate(`/organizations/${organization}/roles`);
46-
} catch (error) {
47-
displayError(
48-
getErrorMessage(error, "Failed to update custom role"),
49-
);
50-
}
51-
}}
101+
form={form}
52102
error={patchOrganizationRoleMutation.error}
53103
isLoading={patchOrganizationRoleMutation.isLoading}
54104
/>
55105
</>
56106
);
57107
};
58108

59-
export default CreateGroupPage;
109+
export default CreateEditRolePage;

site/src/pages/ManagementSettingsPage/CustomRolesPage/CreateEditRolePageView.tsx

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,9 @@ import TableCell from "@mui/material/TableCell";
66
import TableContainer from "@mui/material/TableContainer";
77
import TableRow from "@mui/material/TableRow";
88
import TextField from "@mui/material/TextField";
9-
import { useFormik } from "formik";
9+
import type { useFormik } from "formik";
1010
import { type ChangeEvent, useState, type FC } from "react";
1111
import { useNavigate } from "react-router-dom";
12-
import * as Yup from "yup";
1312
import { isApiValidationError } from "api/errors";
1413
import { RBACResourceActions } from "api/rbacresources_gen";
1514
import type {
@@ -30,35 +29,20 @@ import {
3029
import { PageHeader, PageHeaderTitle } from "components/PageHeader/PageHeader";
3130
import { getFormHelpers } from "utils/formUtils";
3231

33-
const validationSchema = Yup.object({
34-
name: Yup.string().required().label("Name"),
35-
});
36-
3732
export type CreateEditRolePageViewProps = {
3833
role: AssignableRoles | undefined;
39-
onSubmit: (data: Role) => void;
34+
form: ReturnType<typeof useFormik<PatchRoleRequest>>;
4035
error?: unknown;
4136
isLoading: boolean;
4237
};
4338

4439
export const CreateEditRolePageView: FC<CreateEditRolePageViewProps> = ({
4540
role,
46-
onSubmit,
41+
form,
4742
error,
4843
isLoading,
4944
}) => {
5045
const navigate = useNavigate();
51-
const form = useFormik<PatchRoleRequest>({
52-
initialValues: {
53-
name: role?.name || "",
54-
display_name: role?.display_name || "",
55-
site_permissions: role?.site_permissions || [],
56-
organization_permissions: role?.organization_permissions || [],
57-
user_permissions: role?.user_permissions || [],
58-
},
59-
validationSchema,
60-
onSubmit,
61-
});
6246
const getFieldHelpers = getFormHelpers<Role>(form, error);
6347
const onCancel = () => navigate(-1);
6448

@@ -102,7 +86,11 @@ export const CreateEditRolePageView: FC<CreateEditRolePageViewProps> = ({
10286
/>
10387
</FormFields>
10488
</FormSection>
105-
<FormFooter onCancel={onCancel} isLoading={isLoading} />
89+
<FormFooter
90+
onCancel={onCancel}
91+
isLoading={isLoading}
92+
submitLabel={role !== undefined ? "Save" : "Create Role"}
93+
/>
10694
</HorizontalForm>
10795
</>
10896
);

0 commit comments

Comments
 (0)