Merge branch 'dev' into staging

This commit is contained in:
Maxime Lalo 2024-04-18 15:12:38 +02:00
commit ac1c1577ed
4 changed files with 94 additions and 45 deletions

16
package-lock.json generated
View File

@ -23,7 +23,7 @@
"eslint-config-next": "13.2.4", "eslint-config-next": "13.2.4",
"form-data": "^4.0.0", "form-data": "^4.0.0",
"jwt-decode": "^3.1.2", "jwt-decode": "^3.1.2",
"le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.130", "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.132",
"next": "13.2.4", "next": "13.2.4",
"prettier": "^2.8.7", "prettier": "^2.8.7",
"react": "18.2.0", "react": "18.2.0",
@ -1526,9 +1526,9 @@
} }
}, },
"node_modules/caniuse-lite": { "node_modules/caniuse-lite": {
"version": "1.0.30001610", "version": "1.0.30001611",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001610.tgz", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001611.tgz",
"integrity": "sha512-QFutAY4NgaelojVMjY63o6XlZyORPaLfyMnsl3HgnWdJUcX6K0oaJymHjH8PT5Gk7sTm8rvC/c5COUQKXqmOMA==", "integrity": "sha512-19NuN1/3PjA3QI8Eki55N8my4LzfkMCRLgCVfrl/slbSAchQfV0+GwjPrK3rq37As4UCLlM/DHajbKkAqbv92Q==",
"funding": [ "funding": [
{ {
"type": "opencollective", "type": "opencollective",
@ -3504,7 +3504,7 @@
} }
}, },
"node_modules/le-coffre-resources": { "node_modules/le-coffre-resources": {
"resolved": "git+ssh://git@github.com/smart-chain-fr/leCoffre-resources.git#1ecb4711cfdf1c6efc59e06642ba4dbbeb746e74", "resolved": "git+ssh://git@github.com/smart-chain-fr/leCoffre-resources.git#888194736ec642c64a7f6e878f5ded4fc480d4a0",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"class-transformer": "^0.5.1", "class-transformer": "^0.5.1",
@ -3742,9 +3742,9 @@
} }
}, },
"node_modules/node-abi": { "node_modules/node-abi": {
"version": "3.58.0", "version": "3.59.0",
"resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.58.0.tgz", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.59.0.tgz",
"integrity": "sha512-pXY1jnGf5T7b8UNzWzIqf0EkX4bx/w8N2AvwlGnk2SYYA/kzDVPaH0Dh0UG4EwxBB5eKOIZKPr8VAHSHL1DPGg==", "integrity": "sha512-HyyfzvTLCE8b1SX2nWimlra8cibEsypcSu/Az4SXMhWhtuctkwAX7qsEYNjUOIoYtPV884oN3wtYTN+iZKBtvw==",
"dependencies": { "dependencies": {
"semver": "^7.3.5" "semver": "^7.3.5"
}, },

View File

@ -25,7 +25,7 @@
"eslint-config-next": "13.2.4", "eslint-config-next": "13.2.4",
"form-data": "^4.0.0", "form-data": "^4.0.0",
"jwt-decode": "^3.1.2", "jwt-decode": "^3.1.2",
"le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.130", "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.132",
"next": "13.2.4", "next": "13.2.4",
"prettier": "^2.8.7", "prettier": "^2.8.7",
"react": "18.2.0", "react": "18.2.0",

View File

@ -0,0 +1,49 @@
import { RulesGroup } from "le-coffre-resources/dist/Admin";
import BaseAdmin from "../BaseAdmin";
export type IGetRulesGroupsParams = {
where?: {};
include?: {};
select?: {};
};
export default class RulesGroups extends BaseAdmin {
private static instance: RulesGroups;
private readonly baseURl = this.namespaceUrl.concat("/rules-groups");
private constructor() {
super();
}
public static getInstance() {
if (!this.instance) {
return new RulesGroups();
} else {
return this.instance;
}
}
public async get(q: IGetRulesGroupsParams): Promise<RulesGroup[]> {
const url = new URL(this.baseURl);
const query = { q };
Object.entries(query).forEach(([key, value]) => url.searchParams.set(key, JSON.stringify(value)));
try {
return await this.getRequest<RulesGroup[]>(url);
} catch (err) {
this.onError(err);
return Promise.reject(err);
}
}
public async getByUid(uid: string, q?: any): Promise<RulesGroup> {
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<RulesGroup>(url);
} catch (err) {
this.onError(err);
return Promise.reject(err);
}
}
}

View File

@ -1,28 +1,28 @@
import OfficeRoles from "@Front/Api/LeCoffreApi/Admin/OfficeRoles/OfficeRoles"; import OfficeRoles from "@Front/Api/LeCoffreApi/Admin/OfficeRoles/OfficeRoles";
import Rules from "@Front/Api/LeCoffreApi/Admin/Rules/Rules";
import Button from "@Front/Components/DesignSystem/Button"; import Button from "@Front/Components/DesignSystem/Button";
import CheckBox from "@Front/Components/DesignSystem/CheckBox"; import CheckBox from "@Front/Components/DesignSystem/CheckBox";
import Form from "@Front/Components/DesignSystem/Form"; import Form from "@Front/Components/DesignSystem/Form";
import Confirm from "@Front/Components/DesignSystem/Modal/Confirm"; import Confirm from "@Front/Components/DesignSystem/Modal/Confirm";
import Typography, { ITypo } from "@Front/Components/DesignSystem/Typography"; import Typography, { ITypo } from "@Front/Components/DesignSystem/Typography";
import DefaultRoleDashboard from "@Front/Components/LayoutTemplates/DefaultRoleDashboard"; import DefaultRoleDashboard from "@Front/Components/LayoutTemplates/DefaultRoleDashboard";
import { OfficeRole, Rule } from "le-coffre-resources/dist/Admin"; import { OfficeRole, Rule, RulesGroup } from "le-coffre-resources/dist/Admin";
import { useRouter } from "next/router"; import { useRouter } from "next/router";
import { useCallback, useEffect, useState } from "react"; import { useCallback, useEffect, useState } from "react";
import React from "react"; import React from "react";
import classes from "./classes.module.scss"; import classes from "./classes.module.scss";
import RulesGroups from "@Front/Api/LeCoffreApi/Admin/RulesGroups/RulesGroups";
type IProps = {}; type RuleGroupsCheckbox = RulesGroup & {
type RuleCheckbox = Rule & {
checked: boolean; checked: boolean;
}; };
export default function RolesInformations(props: IProps) {
export default function RolesInformations() {
const router = useRouter(); const router = useRouter();
let { roleUid } = router.query; let { roleUid } = router.query;
const [roleSelected, setRoleSelected] = useState<OfficeRole | null>(null); const [roleSelected, setRoleSelected] = useState<OfficeRole | null>(null);
const [rulesCheckboxes, setRulesCheckboxes] = useState<RuleCheckbox[]>([]); const [rulesGroupsCheckboxes, setRulesGroupsCheckboxes] = useState<RuleGroupsCheckbox[]>([]);
const [selectAll, setSelectAll] = useState<boolean>(false); const [selectAll, setSelectAll] = useState<boolean>(false);
const [isConfirmModalOpened, setIsConfirmModalOpened] = useState<boolean>(false); const [isConfirmModalOpened, setIsConfirmModalOpened] = useState<boolean>(false);
@ -45,35 +45,28 @@ export default function RolesInformations(props: IProps) {
}, },
}); });
const rules = await Rules.getInstance().get({ const rulesGroups = await RulesGroups.getInstance().get({
where: { include: {
OR: [ rules: true,
{
namespace: "notary",
},
{
namespace: "collaborator",
},
],
}, },
}); });
if (!role) return; if (!role) return;
setRoleSelected(role); setRoleSelected(role);
if (!role.rules) return; if (!role.rules) return;
const rulesCheckboxes = rules const rulesCheckboxes = rulesGroups
.map((rule) => { .map((ruleGroup) => {
if (role.rules?.find((r) => r.uid === rule.uid)) { if (ruleGroup.rules?.every((rule) => role.rules?.find((r) => r.uid === rule.uid))) {
return { ...rule, checked: true }; return { ...ruleGroup, checked: true };
} }
return { ...rule, checked: false }; return { ...ruleGroup, checked: false };
}) })
.sort((ruleA, ruleB) => (ruleA.label < ruleB.label ? 1 : -1)) .sort((ruleA, ruleB) => (ruleA.name! < ruleB.name! ? 1 : -1))
.sort((rule) => (rule.checked ? -1 : 1)); .sort((rule) => (rule.checked ? -1 : 1));
const selectAll = rulesCheckboxes.every((rule) => rule.checked); const selectAll = rulesCheckboxes.every((rule) => rule.checked);
setSelectAll(selectAll); setSelectAll(selectAll);
setRulesCheckboxes(rulesCheckboxes); setRulesGroupsCheckboxes(rulesCheckboxes);
} }
getUser(); getUser();
@ -83,18 +76,25 @@ export default function RolesInformations(props: IProps) {
(e: React.ChangeEvent<HTMLInputElement>) => { (e: React.ChangeEvent<HTMLInputElement>) => {
setSelectAll(e.target.checked); setSelectAll(e.target.checked);
const checked = e.target.checked; const checked = e.target.checked;
rulesCheckboxes.forEach((rule) => (rule.checked = checked)); rulesGroupsCheckboxes.forEach((rule) => (rule.checked = checked));
setRulesCheckboxes([...rulesCheckboxes]); setRulesGroupsCheckboxes([...rulesGroupsCheckboxes]);
}, },
[rulesCheckboxes], [rulesGroupsCheckboxes],
); );
const modifyRules = useCallback(async () => { const modifyRules = useCallback(async () => {
if (!roleSelected || !roleSelected.uid) return; if (!roleSelected || !roleSelected.uid) return;
const rules = rulesCheckboxes.filter((rule) => rule.checked)?.map((rule) => Rule.hydrate<Rule>(rule)); const rulesGroupsChecked = rulesGroupsCheckboxes.filter((rule) => rule.checked);
let newRules: Rule[] = [];
for (let ruleGroup of rulesGroupsChecked) {
if (!ruleGroup.rules) continue;
newRules = [...newRules, ...ruleGroup.rules];
}
await OfficeRoles.getInstance().put(roleSelected.uid, { await OfficeRoles.getInstance().put(roleSelected.uid, {
uid: roleSelected.uid, uid: roleSelected.uid,
rules, rules: newRules,
}); });
const roleUpdated = await OfficeRoles.getInstance().getByUid(roleSelected.uid, { const roleUpdated = await OfficeRoles.getInstance().getByUid(roleSelected.uid, {
@ -104,17 +104,17 @@ export default function RolesInformations(props: IProps) {
}); });
setRoleSelected(roleUpdated); setRoleSelected(roleUpdated);
closeConfirmModal(); closeConfirmModal();
}, [closeConfirmModal, roleSelected, rulesCheckboxes]); }, [closeConfirmModal, roleSelected, rulesGroupsCheckboxes]);
const handleRuleChange = useCallback( const handleRuleChange = useCallback(
(e: React.ChangeEvent<HTMLInputElement>) => { (e: React.ChangeEvent<HTMLInputElement>) => {
const ruleUid = e.target.value; const ruleUid = e.target.value;
const rule = rulesCheckboxes.find((rule) => rule.uid === ruleUid); const rule = rulesGroupsCheckboxes.find((rule) => rule.uid === ruleUid);
if (!rule) return; if (!rule) return;
rule.checked = e.target.checked; rule.checked = e.target.checked;
setRulesCheckboxes([...rulesCheckboxes]); setRulesGroupsCheckboxes([...rulesGroupsCheckboxes]);
}, },
[rulesCheckboxes], [rulesGroupsCheckboxes],
); );
return ( return (
@ -142,11 +142,11 @@ export default function RolesInformations(props: IProps) {
</div> </div>
<Form> <Form>
<div className={classes["rights"]}> <div className={classes["rights"]}>
{rulesCheckboxes.map((rule) => ( {rulesGroupsCheckboxes.map((ruleGroup) => (
<div className={classes["right"]} key={rule.uid}> <div className={classes["right"]} key={ruleGroup.uid}>
<CheckBox <CheckBox
option={{ label: rule.label, value: rule.uid }} option={{ label: ruleGroup.name!, value: ruleGroup.uid }}
checked={rule.checked} checked={ruleGroup.checked}
onChange={handleRuleChange} onChange={handleRuleChange}
/> />
</div> </div>