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",
"form-data": "^4.0.0",
"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",
"prettier": "^2.8.7",
"react": "18.2.0",
@ -1526,9 +1526,9 @@
}
},
"node_modules/caniuse-lite": {
"version": "1.0.30001610",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001610.tgz",
"integrity": "sha512-QFutAY4NgaelojVMjY63o6XlZyORPaLfyMnsl3HgnWdJUcX6K0oaJymHjH8PT5Gk7sTm8rvC/c5COUQKXqmOMA==",
"version": "1.0.30001611",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001611.tgz",
"integrity": "sha512-19NuN1/3PjA3QI8Eki55N8my4LzfkMCRLgCVfrl/slbSAchQfV0+GwjPrK3rq37As4UCLlM/DHajbKkAqbv92Q==",
"funding": [
{
"type": "opencollective",
@ -3504,7 +3504,7 @@
}
},
"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",
"dependencies": {
"class-transformer": "^0.5.1",
@ -3742,9 +3742,9 @@
}
},
"node_modules/node-abi": {
"version": "3.58.0",
"resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.58.0.tgz",
"integrity": "sha512-pXY1jnGf5T7b8UNzWzIqf0EkX4bx/w8N2AvwlGnk2SYYA/kzDVPaH0Dh0UG4EwxBB5eKOIZKPr8VAHSHL1DPGg==",
"version": "3.59.0",
"resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.59.0.tgz",
"integrity": "sha512-HyyfzvTLCE8b1SX2nWimlra8cibEsypcSu/Az4SXMhWhtuctkwAX7qsEYNjUOIoYtPV884oN3wtYTN+iZKBtvw==",
"dependencies": {
"semver": "^7.3.5"
},

View File

@ -25,7 +25,7 @@
"eslint-config-next": "13.2.4",
"form-data": "^4.0.0",
"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",
"prettier": "^2.8.7",
"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 Rules from "@Front/Api/LeCoffreApi/Admin/Rules/Rules";
import Button from "@Front/Components/DesignSystem/Button";
import CheckBox from "@Front/Components/DesignSystem/CheckBox";
import Form from "@Front/Components/DesignSystem/Form";
import Confirm from "@Front/Components/DesignSystem/Modal/Confirm";
import Typography, { ITypo } from "@Front/Components/DesignSystem/Typography";
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 { useCallback, useEffect, useState } from "react";
import React from "react";
import classes from "./classes.module.scss";
import RulesGroups from "@Front/Api/LeCoffreApi/Admin/RulesGroups/RulesGroups";
type IProps = {};
type RuleCheckbox = Rule & {
type RuleGroupsCheckbox = RulesGroup & {
checked: boolean;
};
export default function RolesInformations(props: IProps) {
export default function RolesInformations() {
const router = useRouter();
let { roleUid } = router.query;
const [roleSelected, setRoleSelected] = useState<OfficeRole | null>(null);
const [rulesCheckboxes, setRulesCheckboxes] = useState<RuleCheckbox[]>([]);
const [rulesGroupsCheckboxes, setRulesGroupsCheckboxes] = useState<RuleGroupsCheckbox[]>([]);
const [selectAll, setSelectAll] = 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({
where: {
OR: [
{
namespace: "notary",
},
{
namespace: "collaborator",
},
],
const rulesGroups = await RulesGroups.getInstance().get({
include: {
rules: true,
},
});
if (!role) return;
setRoleSelected(role);
if (!role.rules) return;
const rulesCheckboxes = rules
.map((rule) => {
if (role.rules?.find((r) => r.uid === rule.uid)) {
return { ...rule, checked: true };
const rulesCheckboxes = rulesGroups
.map((ruleGroup) => {
if (ruleGroup.rules?.every((rule) => role.rules?.find((r) => r.uid === rule.uid))) {
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));
const selectAll = rulesCheckboxes.every((rule) => rule.checked);
setSelectAll(selectAll);
setRulesCheckboxes(rulesCheckboxes);
setRulesGroupsCheckboxes(rulesCheckboxes);
}
getUser();
@ -83,18 +76,25 @@ export default function RolesInformations(props: IProps) {
(e: React.ChangeEvent<HTMLInputElement>) => {
setSelectAll(e.target.checked);
const checked = e.target.checked;
rulesCheckboxes.forEach((rule) => (rule.checked = checked));
setRulesCheckboxes([...rulesCheckboxes]);
rulesGroupsCheckboxes.forEach((rule) => (rule.checked = checked));
setRulesGroupsCheckboxes([...rulesGroupsCheckboxes]);
},
[rulesCheckboxes],
[rulesGroupsCheckboxes],
);
const modifyRules = useCallback(async () => {
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, {
uid: roleSelected.uid,
rules,
rules: newRules,
});
const roleUpdated = await OfficeRoles.getInstance().getByUid(roleSelected.uid, {
@ -104,17 +104,17 @@ export default function RolesInformations(props: IProps) {
});
setRoleSelected(roleUpdated);
closeConfirmModal();
}, [closeConfirmModal, roleSelected, rulesCheckboxes]);
}, [closeConfirmModal, roleSelected, rulesGroupsCheckboxes]);
const handleRuleChange = useCallback(
(e: React.ChangeEvent<HTMLInputElement>) => {
const ruleUid = e.target.value;
const rule = rulesCheckboxes.find((rule) => rule.uid === ruleUid);
const rule = rulesGroupsCheckboxes.find((rule) => rule.uid === ruleUid);
if (!rule) return;
rule.checked = e.target.checked;
setRulesCheckboxes([...rulesCheckboxes]);
setRulesGroupsCheckboxes([...rulesGroupsCheckboxes]);
},
[rulesCheckboxes],
[rulesGroupsCheckboxes],
);
return (
@ -142,11 +142,11 @@ export default function RolesInformations(props: IProps) {
</div>
<Form>
<div className={classes["rights"]}>
{rulesCheckboxes.map((rule) => (
<div className={classes["right"]} key={rule.uid}>
{rulesGroupsCheckboxes.map((ruleGroup) => (
<div className={classes["right"]} key={ruleGroup.uid}>
<CheckBox
option={{ label: rule.label, value: rule.uid }}
checked={rule.checked}
option={{ label: ruleGroup.name!, value: ruleGroup.uid }}
checked={ruleGroup.checked}
onChange={handleRuleChange}
/>
</div>