Merge branch 'dev' into staging

This commit is contained in:
Vins 2023-07-25 16:34:59 +02:00
commit 0d58e6b5ae
34 changed files with 709 additions and 184 deletions

View File

@ -2,6 +2,21 @@ import { DeedType } from "le-coffre-resources/dist/Admin";
import BaseAdmin from "../BaseAdmin";
export type IPutDeedTypesParams = {
uid?: DeedType["uid"];
name?: DeedType["name"];
description?: DeedType["description"];
deed?: DeedType["deed"];
office?: DeedType["office"];
archived_at?: DeedType["archived_at"];
document_types?: DeedType["document_types"];
};
export type IPostDeedTypesParams = {
name?: DeedType["name"];
description?: DeedType["description"];
};
export type IGetDeedTypesParams = {
where?: {};
include?: {};
@ -46,4 +61,34 @@ export default class DeedTypes extends BaseAdmin {
return Promise.reject(err);
}
}
public async put(uid: string, body: IPutDeedTypesParams) {
const url = new URL(this.baseURl.concat(`/${uid}`));
try {
return await this.putRequest<DeedType>(url, body);
} catch (err) {
this.onError(err);
return Promise.reject(err);
}
}
public async post(body: IPostDeedTypesParams) {
const url = new URL(this.baseURl);
try {
return await this.postRequest<DeedType>(url, body);
} catch (err) {
this.onError(err);
return Promise.reject(err);
}
}
public async delete(uid: string) {
const url = new URL(this.baseURl);
try {
return await this.deleteRequest<DeedType>(url);
} catch (err) {
this.onError(err);
return Promise.reject(err);
}
}
}

View File

@ -9,6 +9,7 @@ export type IGetRolesParams = {
};
export type IPutRoleParams = {
uid: OfficeRole["uid"];
rules: OfficeRole["rules"];
};

View File

@ -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<Role[]> {
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<Role[]>(url);
} catch (err) {
this.onError(err);
return Promise.reject(err);
}
}
public async getOne(q?: IGetRolesParams): Promise<Role | null> {
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<Role[]>(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<Role> {
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<Role>(url);
} catch (err) {
this.onError(err);
return Promise.reject(err);
}
}
public async put(uid: string, body: IPutRoleParams): Promise<Role> {
const url = new URL(this.baseURl.concat(`/${uid}`));
try {
return await this.putRequest<Role>(url, body);
} catch (err) {
this.onError(err);
return Promise.reject(err);
}
}
}

View File

@ -1,7 +1,7 @@
import PenICon from "@Assets/Icons/pen.svg";
import { IDashBoardFolder } from "@Front/Components/LayoutTemplates/DefaultNotaryDashboard";
import Module from "@Front/Config/Module";
import classNames from "classnames";
import { OfficeFolder } from "le-coffre-resources/dist/Notary";
import Image from "next/image";
import Link from "next/link";
import React from "react";
@ -10,7 +10,7 @@ import Typography, { ITypo } from "../Typography";
import classes from "./classes.module.scss";
type IProps = {
folder: IDashBoardFolder;
folder: OfficeFolder;
type: EFolderBoxInformationType;
isArchived?: boolean;
};
@ -42,7 +42,7 @@ export default function FolderBoxInformation(props: IProps) {
</div>
);
function renderContentByType(folder: IDashBoardFolder, type: EFolderBoxInformationType) {
function renderContentByType(folder: OfficeFolder, type: EFolderBoxInformationType) {
switch (type) {
case EFolderBoxInformationType.DESCRIPTION:
return (

View File

@ -1,16 +1,16 @@
import ChevronIcon from "@Assets/Icons/chevron.svg";
import { IDashBoardFolder } from "@Front/Components/LayoutTemplates/DefaultNotaryDashboard";
import { OfficeFolder } from "le-coffre-resources/dist/Notary";
import { EDocumentStatus } from "le-coffre-resources/dist/Notary/Document";
import Image from "next/image";
import React from "react";
import Typography, { ITypo } from "../Typography";
import WarningBadge from "../WarningBadge";
import classes from "./classes.module.scss";
import { EDocumentStatus } from "le-coffre-resources/dist/Customer/Document";
type IProps = {
folder: IDashBoardFolder;
onSelectedFolder?: (folder: IDashBoardFolder) => void;
folder: OfficeFolder;
onSelectedFolder?: (folder: OfficeFolder) => void;
};
type IState = {};

View File

@ -1,18 +1,18 @@
import { IDashBoardFolder } from "@Front/Components/LayoutTemplates/DefaultNotaryDashboard";
import Module from "@Front/Config/Module";
import { EDocumentStatus } from "le-coffre-resources/dist/Customer/Document";
import classNames from "classnames";
import { OfficeFolder } from "le-coffre-resources/dist/Notary";
import { EDocumentStatus } from "le-coffre-resources/dist/Notary/Document";
import Link from "next/link";
import { useRouter } from "next/router";
import React from "react";
import FolderContainer from "../FolderContainer";
import classes from "./classes.module.scss";
import classNames from "classnames";
type IProps = {
folders: IDashBoardFolder[];
folders: OfficeFolder[];
isArchived: boolean;
onSelectedFolder?: (folder: IDashBoardFolder) => void;
onSelectedFolder?: (folder: OfficeFolder) => void;
onCloseLeftSide?: () => void;
};

View File

@ -1,19 +1,19 @@
import { IDashBoardFolder } from "@Front/Components/LayoutTemplates/DefaultNotaryDashboard";
import Module from "@Front/Config/Module";
import { OfficeFolder } from "le-coffre-resources/dist/Notary";
import { EDocumentStatus } from "le-coffre-resources/dist/Notary/Document";
import Link from "next/link";
import { NextRouter, useRouter } from "next/router";
import React from "react";
import BlockList, { IBlock } from "../BlockList";
import Button from "../Button";
import SearchBar from "../SearchBar";
import classes from "./classes.module.scss";
import BlockList, { IBlock } from "../BlockList";
import { NextRouter, useRouter } from "next/router";
import { EDocumentStatus } from "le-coffre-resources/dist/SuperAdmin/Document";
type IProps = {
folders: IDashBoardFolder[];
folders: OfficeFolder[];
isArchived: boolean;
onSelectedFolder?: (folder: IDashBoardFolder) => void;
onSelectedFolder?: (folder: OfficeFolder) => void;
onCloseLeftSide?: () => void;
};
@ -22,7 +22,7 @@ type IPropsClass = IProps & {
};
type IState = {
filteredFolders: IDashBoardFolder[];
filteredFolders: OfficeFolder[];
};
class FolderListContainerClass extends React.Component<IPropsClass, IState> {
@ -97,7 +97,7 @@ class FolderListContainerClass extends React.Component<IPropsClass, IState> {
}
private filterFolders(value: string): void {
const filteredFolders: IDashBoardFolder[] = this.props.folders.filter((folder) => {
const filteredFolders: OfficeFolder[] = this.props.folders.filter((folder) => {
const name = folder.name.toLowerCase();
const number = folder.folder_number.toLowerCase();

View File

@ -1,5 +1,5 @@
import PenIcon from "@Assets/Icons/pen.svg";
import { IDashBoardFolder } from "@Front/Components/LayoutTemplates/DefaultNotaryDashboard";
import { OfficeFolder } from "le-coffre-resources/dist/Notary";
import Module from "@Front/Config/Module";
import { Customer } from "le-coffre-resources/dist/Notary";
import Image from "next/image";
@ -13,7 +13,7 @@ import { EDocumentStatus } from "le-coffre-resources/dist/Customer/Document";
type IProps = {
customer: Customer;
folder: IDashBoardFolder;
folder: OfficeFolder;
isArchived?: boolean;
};
type IState = {};

View File

@ -1,11 +1,11 @@
import ChevronIcon from "@Assets/Icons/chevron.svg";
import PlusIcon from "@Assets/Icons/plus.svg";
import Documents from "@Front/Api/LeCoffreApi/SuperAdmin/Documents/Documents";
import { IDashBoardFolder } from "@Front/Components/LayoutTemplates/DefaultNotaryDashboard";
import Module from "@Front/Config/Module";
import classNames from "classnames";
import Customer, { Document } from "le-coffre-resources/dist/Customer";
import { EDocumentStatus } from "le-coffre-resources/dist/Customer/Document";
import { Customer, Document } from "le-coffre-resources/dist/Notary";
import { OfficeFolder } from "le-coffre-resources/dist/Notary";
import Image from "next/image";
import Link from "next/link";
import React from "react";
@ -20,7 +20,7 @@ import UserFolderHeader from "./UserFolderHeader";
type IProps = {
customer: Customer;
animationDelay?: number;
folder: IDashBoardFolder;
folder: OfficeFolder;
isArchived?: boolean;
isOpened: boolean;
onChange: (id: string) => void;

View File

@ -87,7 +87,11 @@ export default class DefaultDeedTypesDashboard extends React.Component<IProps, I
public override async componentDidMount() {
this.onWindowResize = WindowStore.getInstance().onResize((window) => this.onResize(window));
const query: IGetDeedTypesParams = {};
const query: IGetDeedTypesParams = {
where: {
archived_at: null,
},
};
const deedTypes = await DeedTypes.getInstance().get(query);
this.setState({ deedTypes });

View File

@ -7,8 +7,8 @@ import Version from "@Front/Components/DesignSystem/Version";
import BackArrow from "@Front/Components/Elements/BackArrow";
import WindowStore from "@Front/Stores/WindowStore";
import classNames from "classnames";
import { OfficeFolder } from "le-coffre-resources/dist/Customer";
import EFolderStatus from "le-coffre-resources/dist/Customer/EFolderStatus";
import { OfficeFolder } from "le-coffre-resources/dist/Notary";
import Image from "next/image";
import React, { ReactNode } from "react";
@ -18,30 +18,17 @@ type IProps = {
title: string;
children?: ReactNode;
isArchived?: boolean;
onSelectedFolder: (folder: IDashBoardFolder) => void;
onSelectedFolder: (folder: OfficeFolder) => void;
hasBackArrow: boolean;
backArrowUrl?: string;
mobileBackText?: string;
};
type IState = {
folders: IDashBoardFolder[] | null;
folders: OfficeFolder[] | null;
isLeftSideOpen: boolean;
leftSideCanBeClosed: boolean;
};
export type IDashBoardFolder = {
uid?: OfficeFolder["uid"];
name: OfficeFolder["name"];
folder_number: OfficeFolder["folder_number"];
documents?: OfficeFolder["documents"];
description: OfficeFolder["description"];
deed?: OfficeFolder["deed"];
created_at: OfficeFolder["created_at"];
customers?: OfficeFolder["customers"];
archived_description: OfficeFolder["archived_description"];
status: OfficeFolder["status"];
};
export default class DefaultNotaryDashboard extends React.Component<IProps, IState> {
private onWindowResize = () => {};
public static defaultProps: Partial<IProps> = {

View File

@ -90,7 +90,6 @@ export default class DefaultRoleDashboard extends React.Component<IProps, IState
};
const roles = await OfficeRoles.getInstance().get(query);
console.log(roles);
this.setState({ roles });
}

View File

@ -1,16 +1,18 @@
import ChevronIcon from "@Assets/Icons/chevron.svg";
import OfficeRoles from "@Front/Api/LeCoffreApi/Admin/OfficeRoles/OfficeRoles";
import Users from "@Front/Api/LeCoffreApi/SuperAdmin/Users/Users";
import Roles from "@Front/Api/LeCoffreApi/Admin/Roles/Roles";
import Users from "@Front/Api/LeCoffreApi/Admin/Users/Users";
import Button, { EButtonVariant } from "@Front/Components/DesignSystem/Button";
import CheckBox from "@Front/Components/DesignSystem/CheckBox";
import SelectField, { IOption } from "@Front/Components/DesignSystem/Form/SelectField";
import Confirm from "@Front/Components/DesignSystem/Modal/Confirm";
import Typography, { ITypo, ITypoColor } from "@Front/Components/DesignSystem/Typography";
import DefaultCollaboratorDashboard from "@Front/Components/LayoutTemplates/DefaultCollaboratorDashboard";
import Module from "@Front/Config/Module";
import User from "le-coffre-resources/dist/Notary";
import User, { OfficeRole } from "le-coffre-resources/dist/Admin";
import Link from "next/link";
import { useRouter } from "next/router";
import { useEffect, useState } from "react";
import { useCallback, useEffect, useState } from "react";
import classes from "./classes.module.scss";
@ -22,6 +24,64 @@ export default function CollaboratorInformations(props: IProps) {
const [userSelected, setUserSelected] = useState<User | null>(null);
const [availableRoles, setAvailableRoles] = useState<IOption[]>([]);
const [roleModalOpened, setRoleModalOpened] = useState<boolean>(false);
const [adminModalOpened, setAdminModalOpened] = useState<boolean>(false);
const [selectedOption, setSelectedOption] = useState<IOption | null>(null);
const handleRoleChange = useCallback((option: IOption) => {
setSelectedOption(option);
setRoleModalOpened(true);
}, []);
const closeRoleModal = useCallback(() => {
setRoleModalOpened(false);
setSelectedOption({
value: userSelected?.office_role ? userSelected?.office_role?.uid : userSelected?.role?.uid,
label: userSelected?.office_role ? userSelected?.office_role?.name : userSelected?.role?.name!,
});
}, [userSelected?.office_role, userSelected?.role?.name, userSelected?.role?.uid]);
const changeRole = useCallback(async () => {
await Users.getInstance().put(
userSelected?.uid as string,
User.hydrate<User>({
uid: userSelected?.uid as string,
office_role: OfficeRole.hydrate<OfficeRole>({
uid: selectedOption?.value as string,
}),
}),
);
setRoleModalOpened(false);
}, [selectedOption, userSelected]);
const changeAdmin = useCallback(async () => {
const adminRole = await Roles.getInstance().getOne({
where: {
name: "admin",
},
});
if (!adminRole) return;
await Users.getInstance().put(
userSelected?.uid as string,
User.hydrate<User>({
uid: userSelected?.uid as string,
office_role: undefined,
role: adminRole,
}),
);
setRoleModalOpened(false);
}, [userSelected]);
const openAdminModal = useCallback(() => {
setAdminModalOpened(true);
}, []);
const closeAdminModal = useCallback(() => {
setAdminModalOpened(false);
}, []);
useEffect(() => {
async function getUser() {
if (!collaboratorUid) return;
@ -38,6 +98,10 @@ export default function CollaboratorInformations(props: IProps) {
if (!roles) return;
setAvailableRoles(roles.map((role) => ({ value: role.uid, label: role.name })));
setUserSelected(user);
setSelectedOption({
value: user?.office_role ? user?.office_role?.uid : user?.role?.uid,
label: user?.office_role ? user?.office_role?.name : user?.role?.name!,
});
}
getUser();
@ -96,22 +160,54 @@ export default function CollaboratorInformations(props: IProps) {
placeholder="Rôle"
name="role"
options={availableRoles}
selectedOption={{
value: userSelected?.office_role ? userSelected?.office_role?.uid : userSelected?.role?.uid,
label: userSelected?.office_role ? userSelected?.office_role?.name : userSelected?.role?.name!,
}}
selectedOption={selectedOption!}
onChange={handleRoleChange}
disabled={userSelected?.role?.name === "super-admin"}
/>
</div>
{userSelected?.role?.name !== "super-admin" && (
<div className={classes["third-line"]}>
<CheckBox
onChange={openAdminModal}
option={{
value: "1",
label: "Nommer administrateur de l'office",
}}
toolTip="blabla"
checked={userSelected?.role?.name === "admin" && !userSelected.office_role}
/>
</div>
)}
</div>
<Confirm
isOpen={roleModalOpened}
onClose={closeRoleModal}
onAccept={changeRole}
closeBtn
header={"Changement de rôle"}
confirmText={"Valider"}
cancelText={"Annuler"}>
<div className={classes["modal-content"]}>
<Typography typo={ITypo.P_16} className={classes["text"]}>
Attributer le rôle de <span className={classes["role-name"]}>{selectedOption?.label}</span> à{" "}
{userSelected?.contact?.first_name} {userSelected?.contact?.last_name} ?
</Typography>
</div>
</Confirm>
<Confirm
isOpen={adminModalOpened}
onClose={closeAdminModal}
onAccept={changeAdmin}
closeBtn
header={"Changement de rôle"}
confirmText={"Valider"}
cancelText={"Annuler"}>
<div className={classes["modal-content"]}>
<Typography typo={ITypo.P_16} className={classes["text"]}>
Attributer le rôle d'administrateur à {userSelected?.contact?.first_name} {userSelected?.contact?.last_name} ?
</Typography>
</div>
</Confirm>
</div>
</DefaultCollaboratorDashboard>
);

View File

@ -1,16 +1,46 @@
import DeedTypes from "@Front/Api/LeCoffreApi/Admin/DeedTypes/DeedTypes";
import Button, { EButtonVariant } from "@Front/Components/DesignSystem/Button";
import Form from "@Front/Components/DesignSystem/Form";
import TextAreaField from "@Front/Components/DesignSystem/Form/TextareaField";
import TextField from "@Front/Components/DesignSystem/Form/TextField";
import Typography, { ITypo } from "@Front/Components/DesignSystem/Typography";
import DefaultDeedTypesDashboard from "@Front/Components/LayoutTemplates/DefaultDeedTypeDashboard";
import Module from "@Front/Config/Module";
import JwtService from "@Front/Services/JwtService/JwtService";
import { DeedType, Office } from "le-coffre-resources/dist/Admin";
import { useRouter } from "next/router";
import { useCallback } from "react";
import classes from "./classes.module.scss";
import TextField from "@Front/Components/DesignSystem/Form/TextField";
import TextAreaField from "@Front/Components/DesignSystem/Form/TextareaField";
type IProps = {};
export default function DeedTypesCreate(props: IProps) {
const onSubmitHandler = useCallback(async (e: React.FormEvent<HTMLFormElement> | null, values: { [key: string]: string }) => {}, []);
const router = useRouter();
const onSubmitHandler = useCallback(
async (e: React.FormEvent<HTMLFormElement> | null, values: { [key: string]: string }) => {
try {
const jwt = JwtService.getInstance().decodeJwt();
const deedType = await DeedTypes.getInstance().post(
DeedType.hydrate<DeedType>({
name: values["name"],
description: values["description"],
office: Office.hydrate<Office>({
uid: jwt?.office_Id
})
}),
);
router.push(
Module.getInstance()
.get()
.modules.pages.DeedTypes.pages.DeedTypesInformations.props.path.replace("[uid]", deedType.uid!),
);
} catch (e) {
console.error(e);
}
},
[router],
);
return (
<DefaultDeedTypesDashboard mobileBackText={"Liste des types d'actes"} hasBackArrow title="Créer un type d'acte">

View File

@ -1,15 +1,16 @@
import DeedTypes from "@Front/Api/LeCoffreApi/Admin/DeedTypes/DeedTypes";
import Button, { EButtonVariant } from "@Front/Components/DesignSystem/Button";
import Form from "@Front/Components/DesignSystem/Form";
import TextAreaField from "@Front/Components/DesignSystem/Form/TextareaField";
import TextField from "@Front/Components/DesignSystem/Form/TextField";
import Typography, { ITypo } from "@Front/Components/DesignSystem/Typography";
import DefaultDeedTypesDashboard from "@Front/Components/LayoutTemplates/DefaultDeedTypeDashboard";
import Module from "@Front/Config/Module";
import { DeedType } from "le-coffre-resources/dist/Admin";
import { useRouter } from "next/router";
import { useCallback, useEffect, useState } from "react";
import classes from "./classes.module.scss";
import TextField from "@Front/Components/DesignSystem/Form/TextField";
import TextAreaField from "@Front/Components/DesignSystem/Form/TextareaField";
import Button, { EButtonVariant } from "@Front/Components/DesignSystem/Button";
export default function DeedTypesEdit() {
const router = useRouter();
@ -31,7 +32,28 @@ export default function DeedTypesEdit() {
getDeedType();
}, [deedTypeUid]);
const onSubmitHandler = useCallback(async (e: React.FormEvent<HTMLFormElement> | null, values: { [key: string]: string }) => {}, []);
const onSubmitHandler = useCallback(
async (e: React.FormEvent<HTMLFormElement> | null, values: { [key: string]: string }) => {
try {
await DeedTypes.getInstance().put(
deedTypeUid as string,
DeedType.hydrate<DeedType>({
uid: deedTypeUid as string,
name: values["name"],
description: values["description"],
}),
);
router.push(
Module.getInstance()
.get()
.modules.pages.DeedTypes.pages.DeedTypesInformations.props.path.replace("[uid]", deedTypeUid as string),
);
} catch (e) {
console.error(e);
}
},
[deedTypeUid, router],
);
return (
<DefaultDeedTypesDashboard mobileBackText={"Liste des types d'actes"} hasBackArrow title="Modifier les informations d'un acte">

View File

@ -5,6 +5,7 @@ import DocumentTypes from "@Front/Api/LeCoffreApi/Admin/DocumentTypes/DocumentTy
import Button, { EButtonVariant } from "@Front/Components/DesignSystem/Button";
import Form from "@Front/Components/DesignSystem/Form";
import { IOption } from "@Front/Components/DesignSystem/Form/SelectField";
import Confirm from "@Front/Components/DesignSystem/Modal/Confirm";
import MultiSelect from "@Front/Components/DesignSystem/MultiSelect";
import Typography, { ITypo, ITypoColor } from "@Front/Components/DesignSystem/Typography";
import DefaultDeedTypesDashboard from "@Front/Components/LayoutTemplates/DefaultDeedTypeDashboard";
@ -28,6 +29,27 @@ export default function DeedTypesInformations(props: IProps) {
const [availableDocuments, setAvailableDocuments] = useState<DocumentType[]>([]);
const [selectedDocuments, setSelectedDocuments] = useState<IOption[]>([]);
const [isDeleteModalOpened, setIsDeleteModalOpened] = useState<boolean>(false);
const openDeleteModal = useCallback(() => {
setIsDeleteModalOpened(true);
}, []);
const closeDeleteModal = useCallback(() => {
setIsDeleteModalOpened(false);
}, []);
const deleteDeedType = useCallback(async () => {
await DeedTypes.getInstance().put(
deedTypeUid as string,
DeedType.hydrate<DeedType>({
uid: deedTypeUid as string,
archived_at: new Date(),
}),
);
router.push(Module.getInstance().get().modules.pages.DeedTypes.props.path);
}, [deedTypeUid, router]);
useEffect(() => {
async function getDeedType() {
if (!deedTypeUid) return;
@ -37,6 +59,15 @@ export default function DeedTypesInformations(props: IProps) {
},
});
setDeedTypeSelected(deedType);
if (!deedType.document_types) return;
const documentsOptions: IOption[] = deedType.document_types?.map((documentType) => {
return {
label: documentType.name,
value: documentType.uid,
};
});
setSelectedDocuments(documentsOptions);
}
async function getDocuments() {
@ -44,12 +75,19 @@ export default function DeedTypesInformations(props: IProps) {
setAvailableDocuments(documents);
}
setSelectedDocuments([]);
getDocuments();
getDeedType();
}, [deedTypeUid]);
const onSubmitHandler = useCallback(async (e: React.FormEvent<HTMLFormElement> | null, values: { [key: string]: string }) => {}, []);
const onSubmitHandler = useCallback(
async (e: React.FormEvent<HTMLFormElement> | null, values: { [key: string]: string }) => {
await DeedTypes.getInstance().put(deedTypeUid as string, {
uid: deedTypeUid as string,
document_types: selectedDocuments.map((document) => DocumentType.hydrate<DocumentType>({ uid: document.value as string })),
});
},
[deedTypeUid, selectedDocuments],
);
const onDocumentChangeHandler = useCallback((values: MultiValue<IOption>) => {
setSelectedDocuments(values as IOption[]);
@ -121,8 +159,24 @@ export default function DeedTypesInformations(props: IProps) {
</Form>
</div>
<div className={classes["delete-container"]}>
<Button variant={EButtonVariant.GHOST}>Supprimer</Button>
<Button variant={EButtonVariant.GHOST} onClick={openDeleteModal}>
Supprimer
</Button>
</div>
<Confirm
isOpen={isDeleteModalOpened}
onClose={closeDeleteModal}
onAccept={deleteDeedType}
closeBtn
header={"Supprimer le type d'acte ?"}
confirmText={"Valider"}
cancelText={"Annuler"}>
<div className={classes["modal-content"]}>
<Typography typo={ITypo.P_16} className={classes["text"]}>
Êtes-vous sûr de vouloir supprimer ce type d'acte ?
</Typography>
</div>
</Confirm>
</div>
</DefaultDeedTypesDashboard>
);

View File

@ -6,20 +6,20 @@ import Folders from "@Front/Api/LeCoffreApi/SuperAdmin/Folders/Folders";
import Button, { EButtonVariant } from "@Front/Components/DesignSystem/Button";
import CheckBox from "@Front/Components/DesignSystem/CheckBox";
import Form from "@Front/Components/DesignSystem/Form";
import { IOption } from "@Front/Components/DesignSystem/Form/SelectField";
import TextAreaField from "@Front/Components/DesignSystem/Form/TextareaField";
import TextField from "@Front/Components/DesignSystem/Form/TextField";
import Confirm from "@Front/Components/DesignSystem/Modal/Confirm";
import Typography, { ITypo, ITypoColor } from "@Front/Components/DesignSystem/Typography";
import BackArrow from "@Front/Components/Elements/BackArrow";
import DefaultNotaryDashboard from "@Front/Components/LayoutTemplates/DefaultNotaryDashboard";
import Module from "@Front/Config/Module";
import { OfficeFolder } from "le-coffre-resources/dist/Customer";
import { OfficeFolder } from "le-coffre-resources/dist/Notary";
import { NextRouter, useRouter } from "next/router";
import React from "react";
import BasePage from "../../Base";
import classes from "./classes.module.scss";
import { IOption } from "@Front/Components/DesignSystem/Form/SelectField";
import TextField from "@Front/Components/DesignSystem/Form/TextField";
import TextAreaField from "@Front/Components/DesignSystem/Form/TextareaField";
type IProps = {};
type IPropsClass = IProps & {
@ -110,11 +110,7 @@ class AskDocumentsClass extends BasePage<IPropsClass, IState> {
cancelText={"Annuler"}
confirmText={"Ajouter"}>
<div className={classes["add-document-form-container"]}>
<TextField
name="document_name"
placeholder="Nom du document à ajouter"
onChange={this.onDocumentNameChange}
/>
<TextField name="document_name" placeholder="Nom du document à ajouter" onChange={this.onDocumentNameChange} />
<TextAreaField
name="description"
placeholder="Description visible par le client"
@ -211,10 +207,7 @@ class AskDocumentsClass extends BasePage<IPropsClass, IState> {
const oldDocumentsType = this.state.folder?.deed?.document_types!;
await Deeds.getInstance().put(this.state.folder?.deed?.uid!, {
document_types: [
...oldDocumentsType,
documentType,
],
document_types: [...oldDocumentsType, documentType],
});
await this.loadData();

View File

@ -2,7 +2,7 @@ import PlusIcon from "@Assets/Icons/plus.svg";
import Button, { EButtonVariant } from "@Front/Components/DesignSystem/Button";
import Typography, { ITypo, ITypoColor } from "@Front/Components/DesignSystem/Typography";
import UserFolder from "@Front/Components/DesignSystem/UserFolder";
import { IDashBoardFolder } from "@Front/Components/LayoutTemplates/DefaultNotaryDashboard";
import { OfficeFolder } from "le-coffre-resources/dist/Notary";
import Module from "@Front/Config/Module";
import Link from "next/link";
import React from "react";
@ -10,7 +10,7 @@ import React from "react";
import classes from "./classes.module.scss";
type IProps = {
folder: IDashBoardFolder;
folder: OfficeFolder;
};
type IState = {
openedCustomer: string;
@ -75,7 +75,6 @@ export default class ClientSection extends React.Component<IProps, IState> {
return output ?? null;
}
private changeUserFolder(uid: string) {
this.setState({
openedCustomer: uid === this.state.openedCustomer ? "" : uid,

View File

@ -6,9 +6,9 @@ import TextAreaField from "@Front/Components/DesignSystem/Form/TextareaField";
import Confirm from "@Front/Components/DesignSystem/Modal/Confirm";
import QuantityProgressBar from "@Front/Components/DesignSystem/QuantityProgressBar";
import Typography, { ITypo, ITypoColor } from "@Front/Components/DesignSystem/Typography";
import DefaultNotaryDashboard, { IDashBoardFolder } from "@Front/Components/LayoutTemplates/DefaultNotaryDashboard";
import DefaultNotaryDashboard from "@Front/Components/LayoutTemplates/DefaultNotaryDashboard";
import Module from "@Front/Config/Module";
import { OfficeFolder } from "le-coffre-resources/dist/Customer";
import { OfficeFolder } from "le-coffre-resources/dist/Notary";
import { EDocumentStatus } from "le-coffre-resources/dist/Notary/Document";
import Link from "next/link";
import { NextRouter, useRouter } from "next/router";
@ -26,7 +26,7 @@ type IPropsClass = IProps & {
};
type IState = {
selectedFolder: IDashBoardFolder | null;
selectedFolder: OfficeFolder | null;
isArchivedModalOpen: boolean;
inputArchivedDescripton: string;
};
@ -133,7 +133,7 @@ class FolderInformationClass extends BasePage<IPropsClass, IState> {
}
public override async componentDidMount() {
this.setState({
selectedFolder: (await this.getFolder()) as IDashBoardFolder,
selectedFolder: (await this.getFolder()) as OfficeFolder,
});
}
@ -159,7 +159,7 @@ class FolderInformationClass extends BasePage<IPropsClass, IState> {
return this.state.selectedFolder?.customers!.length > 0;
}
private onSelectedFolder(folder: IDashBoardFolder): void {
private onSelectedFolder(folder: OfficeFolder): void {
this.setState({ selectedFolder: folder });
}

View File

@ -1,5 +1,3 @@
import BasePage from "../../Base";
import classes from "./classes.module.scss";
import Customers from "@Front/Api/LeCoffreApi/SuperAdmin/Customers/Customers";
import Button, { EButtonVariant } from "@Front/Components/DesignSystem/Button";
import Form from "@Front/Components/DesignSystem/Form";
@ -7,13 +5,16 @@ import TextField from "@Front/Components/DesignSystem/Form/TextField";
import Confirm from "@Front/Components/DesignSystem/Modal/Confirm";
import Typography, { ITypo } from "@Front/Components/DesignSystem/Typography";
import BackArrow from "@Front/Components/Elements/BackArrow";
import DefaultNotaryDashboard, { IDashBoardFolder } from "@Front/Components/LayoutTemplates/DefaultNotaryDashboard";
import DefaultNotaryDashboard from "@Front/Components/LayoutTemplates/DefaultNotaryDashboard";
import Module from "@Front/Config/Module";
import Customer, { Contact } from "le-coffre-resources/dist/Customer";
import { Contact, Customer, OfficeFolder } from "le-coffre-resources/dist/Notary";
import Link from "next/link";
import { NextRouter, useRouter } from "next/router";
import { ChangeEvent } from "react";
import BasePage from "../../Base";
import classes from "./classes.module.scss";
type IProps = {};
type IPropsClass = IProps & {
@ -22,7 +23,7 @@ type IPropsClass = IProps & {
customerUid: string;
};
type IState = {
selectedFolder: IDashBoardFolder | null;
selectedFolder: OfficeFolder | null;
inputNameValue: string;
inputFirstNameValue: string;
inputEmailValue: string;
@ -31,7 +32,7 @@ type IState = {
doesInputHaveValues: boolean;
inputBirthdate: Date | null;
inputAddress: string;
folder: IDashBoardFolder | null;
folder: OfficeFolder | null;
customer: Customer | null;
};
class UpdateClientClass extends BasePage<IPropsClass, IState> {
@ -222,7 +223,7 @@ class UpdateClientClass extends BasePage<IPropsClass, IState> {
this.setState({ inputPhoneNumberValue: event.target.value });
}
private onSelectedFolder(folder: IDashBoardFolder): void {
private onSelectedFolder(folder: OfficeFolder): void {
this.setState({ selectedFolder: folder });
}

View File

@ -7,9 +7,9 @@ import MultiSelect from "@Front/Components/DesignSystem/MultiSelect";
import RadioBox from "@Front/Components/DesignSystem/RadioBox";
import Typography, { ITypo } from "@Front/Components/DesignSystem/Typography";
import BackArrow from "@Front/Components/Elements/BackArrow";
import DefaultNotaryDashboard, { IDashBoardFolder } from "@Front/Components/LayoutTemplates/DefaultNotaryDashboard";
import DefaultNotaryDashboard from "@Front/Components/LayoutTemplates/DefaultNotaryDashboard";
import Module from "@Front/Config/Module";
import User from "le-coffre-resources/dist/Notary";
import User, { OfficeFolder } from "le-coffre-resources/dist/Notary";
import Link from "next/link";
import { NextRouter, useRouter } from "next/router";
@ -21,7 +21,7 @@ type IPropsClass = {
router: NextRouter;
};
type IState = {
selectedFolder: IDashBoardFolder | null;
selectedFolder: OfficeFolder | null;
selectedOption?: ERadioBoxValue;
availableCollaborators: User[];
selectedCollaborators: readonly IOption[];
@ -163,7 +163,7 @@ class UpdateFolderCollaboratorsClass extends BasePage<IPropsClass, IState> {
});
}
private onSelectedFolder(folder: IDashBoardFolder): void {
private onSelectedFolder(folder: OfficeFolder): void {
this.setState({ selectedFolder: folder });
}

View File

@ -1,16 +1,17 @@
import Folders from "@Front/Api/LeCoffreApi/SuperAdmin/Folders/Folders";
import Button, { EButtonVariant } from "@Front/Components/DesignSystem/Button";
import Form from "@Front/Components/DesignSystem/Form";
import TextAreaField from "@Front/Components/DesignSystem/Form/TextareaField";
import Typography, { ITypo } from "@Front/Components/DesignSystem/Typography";
import BackArrow from "@Front/Components/Elements/BackArrow";
import DefaultNotaryDashboard, { IDashBoardFolder } from "@Front/Components/LayoutTemplates/DefaultNotaryDashboard";
import DefaultNotaryDashboard from "@Front/Components/LayoutTemplates/DefaultNotaryDashboard";
import Module from "@Front/Config/Module";
import { OfficeFolder } from "le-coffre-resources/dist/Notary";
import Link from "next/link";
import { NextRouter, useRouter } from "next/router";
import BasePage from "../../Base";
import classes from "./classes.module.scss";
import Folders from "@Front/Api/LeCoffreApi/SuperAdmin/Folders/Folders";
import TextAreaField from "@Front/Components/DesignSystem/Form/TextareaField";
type IProps = {};
@ -20,7 +21,7 @@ type IPropsClass = IProps & {
};
type IState = {
folder: IDashBoardFolder | null;
folder: OfficeFolder | null;
};
class UpdateFolderDescriptionClass extends BasePage<IPropsClass, IState> {
private backwardPath = Module.getInstance()

View File

@ -5,14 +5,14 @@ import Select, { IOption } from "@Front/Components/DesignSystem/Form/SelectField
import TextField from "@Front/Components/DesignSystem/Form/TextField";
import Typography, { ITypo } from "@Front/Components/DesignSystem/Typography";
import BackArrow from "@Front/Components/Elements/BackArrow";
import DefaultNotaryDashboard, { IDashBoardFolder } from "@Front/Components/LayoutTemplates/DefaultNotaryDashboard";
import DefaultNotaryDashboard from "@Front/Components/LayoutTemplates/DefaultNotaryDashboard";
import Module from "@Front/Config/Module";
import { Deed, OfficeFolder } from "le-coffre-resources/dist/Notary";
import Link from "next/link";
import { NextRouter, useRouter } from "next/router";
import BasePage from "../../Base";
import classes from "./classes.module.scss";
import { Deed, OfficeFolder } from "le-coffre-resources/dist/Notary";
type IProps = {};
@ -22,7 +22,7 @@ type IPropsClass = IProps & {
};
type IState = {
selectedFolder: IDashBoardFolder | null;
selectedFolder: OfficeFolder | null;
};
class UpdateFolderMetadataClass extends BasePage<IPropsClass, IState> {
constructor(props: IPropsClass) {
@ -93,7 +93,7 @@ class UpdateFolderMetadataClass extends BasePage<IPropsClass, IState> {
...values,
deed: Deed.hydrate<Deed>({
uid: values["deed"],
})
}),
});
await Folders.getInstance().put(this.props.folderUid, newValues);
@ -106,7 +106,7 @@ class UpdateFolderMetadataClass extends BasePage<IPropsClass, IState> {
}
}
private async getFolder(): Promise<IDashBoardFolder> {
private async getFolder(): Promise<OfficeFolder> {
const query = {
q: {
deed: { include: { deed_type: true } },
@ -118,7 +118,7 @@ class UpdateFolderMetadataClass extends BasePage<IPropsClass, IState> {
return folder;
}
private onSelectedFolder(folder: IDashBoardFolder): void {
private onSelectedFolder(folder: OfficeFolder): void {
this.setState({ selectedFolder: folder });
}
}

View File

@ -1,12 +1,13 @@
import Typography, { ITypo, ITypoColor } from "@Front/Components/DesignSystem/Typography";
import DefaultNotaryDashboard, { IDashBoardFolder } from "@Front/Components/LayoutTemplates/DefaultNotaryDashboard";
import DefaultNotaryDashboard from "@Front/Components/LayoutTemplates/DefaultNotaryDashboard";
import { OfficeFolder } from "le-coffre-resources/dist/Notary";
import BasePage from "../Base";
import classes from "./classes.module.scss";
type IProps = {};
type IState = {
selectedFolder: IDashBoardFolder | null;
selectedFolder: OfficeFolder | null;
isArchivedModalOpen: boolean;
};
export default class Folder extends BasePage<IProps, IState> {
@ -37,7 +38,7 @@ export default class Folder extends BasePage<IProps, IState> {
);
}
private onSelectedFolder(folder: IDashBoardFolder): void {
private onSelectedFolder(folder: OfficeFolder): void {
this.setState({ selectedFolder: folder });
}
}

View File

@ -1,11 +1,11 @@
import React from "react";
import classes from "./classes.module.scss";
import { IDashBoardFolder } from "@Front/Components/LayoutTemplates/DefaultNotaryDashboard";
import { OfficeFolder } from "le-coffre-resources/dist/Notary";
import Typography, { ITypo, ITypoColor } from "@Front/Components/DesignSystem/Typography";
import UserFolder from "@Front/Components/DesignSystem/UserFolder";
type IProps = {
folder: IDashBoardFolder;
folder: OfficeFolder;
};
type IState = {
openedCustomer: string;

View File

@ -4,9 +4,9 @@ import Button, { EButtonVariant } from "@Front/Components/DesignSystem/Button";
import FolderBoxInformation, { EFolderBoxInformationType } from "@Front/Components/DesignSystem/FolderBoxInformation";
import QuantityProgressBar from "@Front/Components/DesignSystem/QuantityProgressBar";
import Typography, { ITypo, ITypoColor } from "@Front/Components/DesignSystem/Typography";
import DefaultNotaryDashboard, { IDashBoardFolder } from "@Front/Components/LayoutTemplates/DefaultNotaryDashboard";
import DefaultNotaryDashboard from "@Front/Components/LayoutTemplates/DefaultNotaryDashboard";
import Module from "@Front/Config/Module";
import { OfficeFolder } from "le-coffre-resources/dist/Customer";
import { OfficeFolder } from "le-coffre-resources/dist/Notary";
import { NextRouter, useRouter } from "next/router";
import BasePage from "../../Base";
@ -21,7 +21,7 @@ type IPropsClass = IProps & {
};
type IState = {
selectedFolder: IDashBoardFolder | null;
selectedFolder: OfficeFolder | null;
isArchivedModalOpen: boolean;
};
class FolderInformationClass extends BasePage<IPropsClass, IState> {
@ -111,7 +111,7 @@ class FolderInformationClass extends BasePage<IPropsClass, IState> {
return this.state.selectedFolder?.customers !== undefined;
}
private onSelectedFolder(folder: IDashBoardFolder): void {
private onSelectedFolder(folder: OfficeFolder): void {
this.setState({ selectedFolder: folder });
}

View File

@ -1,22 +1,23 @@
import Button, { EButtonVariant } from "@Front/Components/DesignSystem/Button";
import Form from "@Front/Components/DesignSystem/Form";
import TextField from "@Front/Components/DesignSystem/Form/TextField";
import Select, { IOption } from "@Front/Components/DesignSystem/Form/SelectField";
import TextField from "@Front/Components/DesignSystem/Form/TextField";
import Typography, { ITypo } from "@Front/Components/DesignSystem/Typography";
import BackArrow from "@Front/Components/Elements/BackArrow";
import DefaultNotaryDashboard, { IDashBoardFolder } from "@Front/Components/LayoutTemplates/DefaultNotaryDashboard";
import DefaultNotaryDashboard from "@Front/Components/LayoutTemplates/DefaultNotaryDashboard";
import Module from "@Front/Config/Module";
import { OfficeFolder } from "le-coffre-resources/dist/Notary";
import Link from "next/link";
import { useRouter } from "next/router";
import BasePage from "../../Base";
import classes from "./classes.module.scss";
import Link from "next/link";
import Module from "@Front/Config/Module";
type IProps = {
selectedFolderUid: string;
};
type IState = {
selectedFolder: IDashBoardFolder | null;
selectedFolder: OfficeFolder | null;
selectedOption?: IOption;
};
class UpdateFolderMetadataClass extends BasePage<IProps, IState> {
@ -77,7 +78,7 @@ class UpdateFolderMetadataClass extends BasePage<IProps, IState> {
});
}
private onSelectedFolder(folder: IDashBoardFolder): void {
private onSelectedFolder(folder: OfficeFolder): void {
this.setState({ selectedFolder: folder });
}
}

View File

@ -1,11 +1,13 @@
import DefaultNotaryDashboard, { IDashBoardFolder } from "@Front/Components/LayoutTemplates/DefaultNotaryDashboard";
import BasePage from "../Base";
import Typography, { ITypo, ITypoColor } from "@Front/Components/DesignSystem/Typography";
import DefaultNotaryDashboard from "@Front/Components/LayoutTemplates/DefaultNotaryDashboard";
import { OfficeFolder } from "le-coffre-resources/dist/Notary";
import BasePage from "../Base";
import classes from "./classes.module.scss";
type IProps = {};
type IState = {
selectedFolder: IDashBoardFolder | null;
selectedFolder: OfficeFolder | null;
isArchivedModalOpen: boolean;
};
export default class FolderArchived extends BasePage<IProps, IState> {
@ -40,7 +42,7 @@ export default class FolderArchived extends BasePage<IProps, IState> {
);
}
private onSelectedFolder(folder: IDashBoardFolder): void {
private onSelectedFolder(folder: OfficeFolder): void {
this.setState({ selectedFolder: folder });
}
}

View File

@ -1,18 +1,33 @@
import CoffreIcon from "@Assets/Icons/coffre.svg";
// import { FrontendVariables } from "@Front/Config/VariablesFront";
import idNoteLogo from "@Assets/Icons/id-note-logo.svg";
import Button, { EButtonVariant } from "@Front/Components/DesignSystem/Button";
import Typography, { ITypo } from "@Front/Components/DesignSystem/Typography";
import DefaultDoubleSidePage from "@Front/Components/LayoutTemplates/DefaultDoubleSidePage";
import Module from "@Front/Config/Module";
import JwtService from "@Front/Services/JwtService/JwtService";
import UserStore from "@Front/Stores/UserStore";
import Image from "next/image";
import { useRouter } from "next/router";
import { useCallback } from "react";
import BasePage from "../Base";
import classes from "./classes.module.scss";
import LandingImage from "./landing-connect.jpeg";
export default class LoginClass extends BasePage {
public override render(): JSX.Element {
export default function Login() {
const router = useRouter();
const redirectUserOnConnection = useCallback(() => {
async function getUser() {
try {
await UserStore.instance.connect(process.env["NEXT_PUBLIC_ADMIN_ID"] as string);
await JwtService.getInstance().checkJwt();
router.push(Module.getInstance().get().modules.pages.Folder.props.path);
} catch (e) {
console.error(e);
}
}
getUser();
}, [router]);
return (
<DefaultDoubleSidePage title={"Login"} image={LandingImage}>
<div className={classes["root"]}>
@ -20,7 +35,7 @@ export default class LoginClass extends BasePage {
<Typography typo={ITypo.H1}>
<div className={classes["title"]}>Connexion espace professionnel</div>
</Typography>
<Button onClick={this.redirectUserOnConnection} icon={idNoteLogo} iconposition={"left"}>
<Button onClick={redirectUserOnConnection} icon={idNoteLogo} iconposition={"left"}>
S'identifier avec ID.not
</Button>
<Typography typo={ITypo.P_18}>
@ -31,18 +46,3 @@ export default class LoginClass extends BasePage {
</DefaultDoubleSidePage>
);
}
private async redirectUserOnConnection() {
// const variables = FrontendVariables.getInstance();
// const baseFronturl = variables.BACK_API_PROTOCOL + variables.FRONT_APP_HOST;
await UserStore.instance.connect(process.env["NEXT_PUBLIC_ADMIN_ID"] as string);
// await JwtService.getInstance().checkJwt();
// window.location.assign("http://localhost:3000" + "/folders");
// const authorizeEndPoint = variables.IDNOT_AUTHORIZE_ENDPOINT;
// const clientId = variables.IDNOT_CLIENT_ID;
// const url = `${authorizeEndPoint}?client_id=${clientId}&redirect_uri=${baseFronturl}/authorized-client&scope=openid,profile,offline_access&response_type=code`;
// window.location.assign(url);
}
}

View File

@ -1,13 +1,15 @@
import Roles 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 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 { Role, Rule } 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";
@ -22,11 +24,22 @@ export default function RolesInformations(props: IProps) {
const [roleSelected, setRoleSelected] = useState<Role | null>(null);
const [rulesCheckboxes, setRulesCheckboxes] = useState<RuleCheckbox[]>([]);
const [selectAll, setSelectAll] = useState<boolean>(false);
const [isConfirmModalOpened, setIsConfirmModalOpened] = useState<boolean>(false);
const openConfirmModal = useCallback(() => {
setIsConfirmModalOpened(true);
}, []);
const closeConfirmModal = useCallback(() => {
setIsConfirmModalOpened(false);
}, []);
useEffect(() => {
setSelectAll(false);
async function getUser() {
if (!roleUid) return;
const role = await Roles.getInstance().getByUid(roleUid as string, {
const role = await OfficeRoles.getInstance().getByUid(roleUid as string, {
q: {
rules: true,
},
@ -64,19 +77,32 @@ export default function RolesInformations(props: IProps) {
[rulesCheckboxes],
);
const onSubmitHandler = useCallback(
async (e: React.FormEvent<HTMLFormElement> | null, values: { [key: string]: string }) => {
const modifyRules = useCallback(async () => {
if (!roleSelected || !roleSelected.uid) return;
const rules = rulesCheckboxes.filter((rule) => rule.checked)?.map((rule) => Rule.hydrate<Rule>(rule));
const role = await Roles.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 })));
const roleUpdated = await OfficeRoles.getInstance().getByUid(roleSelected.uid, {
q: {
rules: true,
},
[roleSelected, rulesCheckboxes],
});
setRoleSelected(roleUpdated);
closeConfirmModal();
}, [closeConfirmModal, roleSelected, rulesCheckboxes]);
const handleRuleChange = useCallback(
(e: React.ChangeEvent<HTMLInputElement>) => {
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 (
@ -103,19 +129,37 @@ export default function RolesInformations(props: IProps) {
checked={selectAll}
/>
</div>
<Form onSubmit={onSubmitHandler}>
<Form>
<div className={classes["rights"]}>
{rulesCheckboxes.map((rule) => (
<div className={classes["right"]} key={rule.uid}>
<CheckBox option={{ label: rule.name, value: rule.uid }} checked={rule.checked} />
<CheckBox
option={{ label: rule.name, value: rule.uid }}
checked={rule.checked}
onChange={handleRuleChange}
/>
</div>
))}
</div>
<div className={classes["save-container"]}>
<Button type="submit">Enregistrer</Button>
<Button onClick={openConfirmModal}>Enregistrer</Button>
</div>
</Form>
</div>
<Confirm
isOpen={isConfirmModalOpened}
onClose={closeConfirmModal}
onAccept={modifyRules}
closeBtn
header={"Êtes-vous sûr d'enregistrer ?"}
confirmText={"Valider"}
cancelText={"Annuler"}>
<div className={classes["modal-content"]}>
<Typography typo={ITypo.P_16} className={classes["text"]}>
En enregistrant vous modifiez les droits des rôles.
</Typography>
</div>
</Confirm>
</div>
</DefaultRoleDashboard>
);

View File

@ -3,6 +3,7 @@ import OfficeRoles from "@Front/Api/LeCoffreApi/Admin/OfficeRoles/OfficeRoles";
import Users from "@Front/Api/LeCoffreApi/SuperAdmin/Users/Users";
import CheckBox from "@Front/Components/DesignSystem/CheckBox";
import SelectField, { IOption } from "@Front/Components/DesignSystem/Form/SelectField";
import Confirm from "@Front/Components/DesignSystem/Modal/Confirm";
import Typography, { ITypo, ITypoColor } from "@Front/Components/DesignSystem/Typography";
import DefaultUserDashboard from "@Front/Components/LayoutTemplates/DefaultUserDashboard";
import User from "le-coffre-resources/dist/Notary";
@ -20,6 +21,42 @@ export default function UserInformations(props: IProps) {
const [userSelected, setUserSelected] = useState<User | null>(null);
const [availableRoles, setAvailableRoles] = useState<IOption[]>([]);
const [addSuperAdminModalOpened, setAddSuperAdminModalOpened] = useState<boolean>(false);
const [removeSuperAdminModalOpened, setRemoveSuperAdminModalOpened] = useState<boolean>(false);
const openAddSuperAdminModal = () => {
setAddSuperAdminModalOpened(true);
};
const closeAddSuperAdminModal = () => {
setAddSuperAdminModalOpened(false);
};
const openRemoveSuperAdminModal = () => {
setRemoveSuperAdminModalOpened(true);
};
const closeRemoveSuperAdminModal = () => {
setRemoveSuperAdminModalOpened(false);
};
const handleCheckboxAdminChanged = (e: React.ChangeEvent<HTMLInputElement>) => {
const checked = e.target.checked;
if (checked) {
openAddSuperAdminModal();
} else {
openRemoveSuperAdminModal();
}
};
const addSuperAdmin = async () => {
closeAddSuperAdminModal();
};
const removeSuperAdmin = async () => {
closeRemoveSuperAdminModal();
};
useEffect(() => {
async function getUser() {
if (!userUid) return;
@ -109,6 +146,7 @@ export default function UserInformations(props: IProps) {
toolTip="tooltip"
/>
<CheckBox
onChange={handleCheckboxAdminChanged}
option={{
label: "Nommer super admin LEcoffre.io",
value: "title",
@ -135,6 +173,40 @@ export default function UserInformations(props: IProps) {
</div>
</div>
</div>
<Confirm
isOpen={addSuperAdminModalOpened}
onClose={closeAddSuperAdminModal}
onAccept={addSuperAdmin}
closeBtn
header={`Souhaitez-vous attribuer un vote à ${
userSelected?.contact?.first_name + " " + userSelected?.contact?.last_name
} pour devenir Super Administrateur ?`}
confirmText={"Attribuer un vote"}
cancelText={"Annuler"}>
<div className={classes["modal-content"]}>
<Typography typo={ITypo.P_16} className={classes["text"]}>
Nommer une personne Super Administrateur nécessite 3 votes de super administrateurs existants. Souhaitez-vous
attribuer un vote ?
</Typography>
</div>
</Confirm>
<Confirm
isOpen={removeSuperAdminModalOpened}
onClose={closeRemoveSuperAdminModal}
onAccept={removeSuperAdmin}
closeBtn
header={`Souhaitez-vous retirer ${
userSelected?.contact?.first_name + " " + userSelected?.contact?.last_name
} de la liste des Super Administrateurs ?`}
confirmText={"Attribuer un vote"}
cancelText={"Annuler"}>
<div className={classes["modal-content"]}>
<Typography typo={ITypo.P_16} className={classes["text"]}>
Retirer un collaborateur du rôle de Super Administrateur nécessite 3 votes de super administrateurs existants.
Souhaitez-vous attribuer un vote ?
</Typography>
</div>
</Confirm>
</div>
</DefaultUserDashboard>
);

View File

@ -213,6 +213,36 @@
}
}
},
"DocumentTypes": {
"enabled": true,
"props": {
"path": "/document-types",
"labelKey": "documentTypes"
},
"pages": {
"DocumentTypesInformations": {
"enabled": true,
"props": {
"path": "/document-types/[uid]",
"labelKey": "documentInformations"
}
},
"Create": {
"enabled": true,
"props": {
"path": "/document-types/create",
"labelKey": "createDocumentType"
}
},
"Edit": {
"enabled": true,
"props": {
"path": "/document-types/[uid]/edit",
"labelKey": "editDocumentType"
}
}
}
},
"404": {
"enabled": true,
"props": {

View File

@ -213,6 +213,36 @@
}
}
},
"DocumentTypes": {
"enabled": true,
"props": {
"path": "/document-types",
"labelKey": "documentTypes"
},
"pages": {
"DocumentTypesInformations": {
"enabled": true,
"props": {
"path": "/document-types/[uid]",
"labelKey": "documentInformations"
}
},
"Create": {
"enabled": true,
"props": {
"path": "/document-types/create",
"labelKey": "createDocumentType"
}
},
"Edit": {
"enabled": true,
"props": {
"path": "/document-types/[uid]/edit",
"labelKey": "editDocumentType"
}
}
}
},
"404": {
"enabled": true,
"props": {

View File

@ -213,6 +213,36 @@
}
}
},
"DocumentTypes": {
"enabled": true,
"props": {
"path": "/document-types",
"labelKey": "documentTypes"
},
"pages": {
"DocumentTypesInformations": {
"enabled": true,
"props": {
"path": "/document-types/[uid]",
"labelKey": "documentInformations"
}
},
"Create": {
"enabled": true,
"props": {
"path": "/document-types/create",
"labelKey": "createDocumentType"
}
},
"Edit": {
"enabled": true,
"props": {
"path": "/document-types/[uid]/edit",
"labelKey": "editDocumentType"
}
}
}
},
"404": {
"enabled": true,
"props": {