Add set permission option on admin panel

This commit is contained in:
Zoe Roux 2024-02-14 15:19:52 +01:00
parent 1e4081a03f
commit 13c0430c93
4 changed files with 46 additions and 6 deletions

View File

@ -32,19 +32,28 @@ import UserI from "@material-symbols/svg-400/rounded/account_circle.svg";
import Admin from "@material-symbols/svg-400/rounded/shield_person.svg"; import Admin from "@material-symbols/svg-400/rounded/shield_person.svg";
import MoreVert from "@material-symbols/svg-400/rounded/more_vert.svg"; import MoreVert from "@material-symbols/svg-400/rounded/more_vert.svg";
import Delete from "@material-symbols/svg-400/rounded/delete.svg"; import Delete from "@material-symbols/svg-400/rounded/delete.svg";
import { useQueryClient } from "@tanstack/react-query"; import { useMutation, useQueryClient } from "@tanstack/react-query";
const UserGrid = ({ const UserGrid = ({
isLoading, isLoading,
slug, id,
username, username,
avatar, avatar,
isAdmin, isAdmin,
...props ...props
}: WithLoading<{ slug: string; username: string; avatar: string; isAdmin: boolean }>) => { }: WithLoading<{ id: string; username: string; avatar: string; isAdmin: boolean }>) => {
const { css } = useYoshiki(); const { css } = useYoshiki();
const { t } = useTranslation(); const { t } = useTranslation();
const queryClient = useQueryClient(); const queryClient = useQueryClient();
const { mutateAsync } = useMutation({
mutationFn: async (update: Partial<User>) =>
await queryFn({
path: ["users", id],
method: "PATCH",
body: update,
}),
onSettled: async () => await queryClient.invalidateQueries({ queryKey: ["users"] }),
});
return ( return (
<View {...css({ alignItems: "center" }, props)}> <View {...css({ alignItems: "center" }, props)}>
@ -62,6 +71,35 @@ const UserGrid = ({
<P>{username}</P> <P>{username}</P>
</Skeleton> </Skeleton>
<Menu Trigger={IconButton} icon={MoreVert} {...tooltip(t("misc.more"))}> <Menu Trigger={IconButton} icon={MoreVert} {...tooltip(t("misc.more"))}>
<Menu.Sub label={t("admin.users.set-permissions")} icon={Admin}>
<Menu.Item
selected={!isAdmin}
label={t("admin.users.regularUser")}
onSelect={() =>
mutateAsync({
permissions: ["overall.read"],
})
}
/>
<Menu.Item
selected={isAdmin}
label={t("admin.users.adminUser")}
onSelect={() =>
mutateAsync({
permissions: [
"overall.read",
"overall.write",
"overall.create",
"overall.delete",
"admin.read",
"admin.write",
"admin.create",
"admin.delete",
],
})
}
/>
</Menu.Sub>
<Menu.Item <Menu.Item
label={t("admin.users.delete")} label={t("admin.users.delete")}
icon={Delete} icon={Delete}
@ -74,7 +112,7 @@ const UserGrid = ({
{ {
text: t("misc.delete"), text: t("misc.delete"),
onPress: async () => { onPress: async () => {
await queryFn({ path: ["users", slug], method: "DELETE" }); await queryFn({ path: ["users", id], method: "DELETE" });
await queryClient.invalidateQueries({ queryKey: ["users"] }); await queryClient.invalidateQueries({ queryKey: ["users"] });
}, },
style: "destructive", style: "destructive",
@ -109,7 +147,7 @@ const UserList = () => {
{(user) => ( {(user) => (
<UserGrid <UserGrid
isLoading={user.isLoading as any} isLoading={user.isLoading as any}
slug={user.slug} id={user.id}
username={user.username} username={user.username}
avatar={user.logo} avatar={user.logo}
isAdmin={user.permissions?.includes("admin.write")} isAdmin={user.permissions?.includes("admin.write")}

View File

@ -36,7 +36,7 @@ export const Unauthorized = ({ missing }: { missing: string[] }) => {
alignItems: "center", alignItems: "center",
})} })}
> >
<P>{t("errors.unauthorized", { permission: missing.join(", ") })}</P> <P>{t("errors.unauthorized", { permission: missing?.join(", ") })}</P>
</View> </View>
); );
}; };

View File

@ -214,6 +214,7 @@
"label": "Users", "label": "Users",
"adminUser": "Admin", "adminUser": "Admin",
"regularUser": "User", "regularUser": "User",
"set-permissions": "Set permissions",
"delete": "Delete user" "delete": "Delete user"
} }
} }

View File

@ -214,6 +214,7 @@
"label": "Comptes", "label": "Comptes",
"adminUser": "Admin", "adminUser": "Admin",
"regularUser": "Utilisateur", "regularUser": "Utilisateur",
"set-permissions": "Definir les permissions",
"delete": "Supprimer l'utilisateur" "delete": "Supprimer l'utilisateur"
} }
} }