From 5b2126460fe4d18510bcb7b1fe40f70a863a818b Mon Sep 17 00:00:00 2001 From: Maxime Lalo Date: Tue, 25 Jul 2023 16:20:39 +0200 Subject: [PATCH] :sparkles: Editing rules in roles working --- .../Api/LeCoffreApi/Admin/Roles/Roles.ts | 83 +++++++++++++++++++ .../DefaultRoleDashboard/index.tsx | 1 - .../CollaboratorInformations/index.tsx | 41 +++++---- .../Layouts/Roles/RolesInformations/index.tsx | 35 ++++++-- 4 files changed, 136 insertions(+), 24 deletions(-) create mode 100644 src/front/Api/LeCoffreApi/Admin/Roles/Roles.ts diff --git a/src/front/Api/LeCoffreApi/Admin/Roles/Roles.ts b/src/front/Api/LeCoffreApi/Admin/Roles/Roles.ts new file mode 100644 index 00000000..b0e51a69 --- /dev/null +++ b/src/front/Api/LeCoffreApi/Admin/Roles/Roles.ts @@ -0,0 +1,83 @@ +import { Role } from "le-coffre-resources/dist/Admin"; + +import BaseAdmin from "../BaseAdmin"; + +export type IGetRolesParams = { + where?: {}; + include?: {}; + select?: {}; +}; + +export type IPutRoleParams = { + uid: Role["uid"]; + rules: Role["rules"]; +}; + +export default class Roles extends BaseAdmin { + private static instance: Roles; + private readonly baseURl = this.namespaceUrl.concat("/roles"); + + private constructor() { + super(); + } + + public static getInstance() { + if (!this.instance) { + return new Roles(); + } else { + return this.instance; + } + } + + public async get(q?: IGetRolesParams): Promise { + const url = new URL(this.baseURl); + if (q) { + const query = { q }; + Object.entries(query).forEach(([key, value]) => url.searchParams.set(key, JSON.stringify(value))); + } + try { + return await this.getRequest(url); + } catch (err) { + this.onError(err); + return Promise.reject(err); + } + } + + public async getOne(q?: IGetRolesParams): Promise { + const url = new URL(this.baseURl); + if (q) { + const query = { q }; + Object.entries(query).forEach(([key, value]) => url.searchParams.set(key, JSON.stringify(value))); + } + try { + const res = await this.getRequest(url); + if (!res) return null; + if (res.length > 1) throw new Error("More than one role found"); + return res[0] ? res[0] : null; + } catch (err) { + this.onError(err); + return Promise.reject(err); + } + } + + public async getByUid(uid: string, q?: any): Promise { + const url = new URL(this.baseURl.concat(`/${uid}`)); + if (q) Object.entries(q).forEach(([key, value]) => url.searchParams.set(key, JSON.stringify(value))); + try { + return await this.getRequest(url); + } catch (err) { + this.onError(err); + return Promise.reject(err); + } + } + + public async put(uid: string, body: IPutRoleParams): Promise { + const url = new URL(this.baseURl.concat(`/${uid}`)); + try { + return await this.putRequest(url, body); + } catch (err) { + this.onError(err); + return Promise.reject(err); + } + } +} diff --git a/src/front/Components/LayoutTemplates/DefaultRoleDashboard/index.tsx b/src/front/Components/LayoutTemplates/DefaultRoleDashboard/index.tsx index 3ee9f0ff..a50ac12e 100644 --- a/src/front/Components/LayoutTemplates/DefaultRoleDashboard/index.tsx +++ b/src/front/Components/LayoutTemplates/DefaultRoleDashboard/index.tsx @@ -90,7 +90,6 @@ export default class DefaultRoleDashboard extends React.Component { + const adminRole = await Roles.getInstance().getOne({ + where: { + name: "admin", + }, + }); + + if (!adminRole) return; await Users.getInstance().put( userSelected?.uid as string, User.hydrate({ - office_role: OfficeRole.hydrate({ - uid: selectedOption?.value as string, - }), + uid: userSelected?.uid as string, + office_role: undefined, + role: adminRole, }), ); setRoleModalOpened(false); - }, [selectedOption, userSelected]); + }, [userSelected]); const openAdminModal = useCallback(() => { setAdminModalOpened(true); @@ -154,19 +162,22 @@ export default function CollaboratorInformations(props: IProps) { options={availableRoles} selectedOption={selectedOption!} onChange={handleRoleChange} + disabled={userSelected?.role?.name === "super-admin"} /> -
- -
+ {userSelected?.role?.name !== "super-admin" && ( +
+ +
+ )} { if (!roleSelected || !roleSelected.uid) return; const rules = rulesCheckboxes.filter((rule) => rule.checked)?.map((rule) => Rule.hydrate(rule)); - const role = await OfficeRoles.getInstance().put(roleSelected.uid, { + await OfficeRoles.getInstance().put(roleSelected.uid, { uid: roleSelected.uid, rules, }); - if (!role) return; - setRoleSelected(role); - if (!role.rules) return; - setRulesCheckboxes(role.rules.map((rule) => ({ ...rule, checked: false }))); - }, [roleSelected, rulesCheckboxes]); + + const roleUpdated = await OfficeRoles.getInstance().getByUid(roleSelected.uid, { + q: { + rules: true, + }, + }); + setRoleSelected(roleUpdated); + closeConfirmModal(); + }, [closeConfirmModal, roleSelected, rulesCheckboxes]); + + const handleRuleChange = useCallback( + (e: React.ChangeEvent) => { + const ruleUid = e.target.value; + const rule = rulesCheckboxes.find((rule) => rule.uid === ruleUid); + if (!rule) return; + rule.checked = e.target.checked; + setRulesCheckboxes([...rulesCheckboxes]); + }, + [rulesCheckboxes], + ); return ( @@ -118,7 +133,11 @@ export default function RolesInformations(props: IProps) {
{rulesCheckboxes.map((rule) => (
- +
))}
@@ -137,7 +156,7 @@ export default function RolesInformations(props: IProps) { cancelText={"Annuler"}>
- En enregistrant vous modifier les droits des rôles. + En enregistrant vous modifiez les droits des rôles.