import backgroundImage from "@Assets/images/background_refonte.svg"; import DeedTypes from "@Front/Api/LeCoffreApi/Notary/DeedTypes/DeedTypes"; import Folders from "@Front/Api/LeCoffreApi/Notary/Folders/Folders"; import Users from "@Front/Api/LeCoffreApi/Notary/Users/Users"; import Button from "@Front/Components/DesignSystem/Button"; import { IOption } from "@Front/Components/DesignSystem/Dropdown/DropdownMenu/DropdownOption"; import Form from "@Front/Components/DesignSystem/Form"; import AutocompleteMultiSelectField from "@Front/Components/DesignSystem/Form/AutocompleteMultiSelectField"; import SelectField from "@Front/Components/DesignSystem/Form/SelectField"; import TextAreaField from "@Front/Components/DesignSystem/Form/TextareaField"; import TextField from "@Front/Components/DesignSystem/Form/TextField"; import RadioBox from "@Front/Components/DesignSystem/RadioBox"; import Typography, { ETypo, ETypoColor } from "@Front/Components/DesignSystem/Typography"; import BackArrow from "@Front/Components/Elements/BackArrow"; import DefaultDoubleSidePage from "@Front/Components/LayoutTemplates/DefaultDoubleSidePage"; import JwtService from "@Front/Services/JwtService/JwtService"; import { ValidationError } from "class-validator/types/validation/ValidationError"; import { Deed, Office, OfficeFolder } from "le-coffre-resources/dist/Notary"; import User from "le-coffre-resources/dist/Notary"; import { DeedType } from "le-coffre-resources/dist/Notary"; import { useRouter } from "next/router"; import React, { useCallback, useEffect, useState } from "react"; import classes from "./classes.module.scss"; export default function CreateFolder(): JSX.Element { /** * State */ const [folderAccessType, setFolderAccessType] = useState<"whole_office" | "select_collaborators">("select_collaborators"); const [availableDeedTypes, setAvailableDeedTypes] = useState([]); const [availableCollaborators, setAvailableCollaborators] = useState([]); const [validationError, setValidationError] = useState([]); const [selectedCollaborators, setSelectedCollaborators] = useState([]); /** * Hooks call */ const router = useRouter(); /** * Callbacks */ const onFormSubmit = async ( e: React.FormEvent | null, values: { [key: string]: any; }, ) => { const officeId = JwtService.getInstance().decodeJwt()?.office_Id; const officeFolderForm = OfficeFolder.hydrate({ folder_number: values["folder_number"], name: values["name"], description: values["description"], deed: Deed.hydrate({ deed_type: DeedType.hydrate({ uid: values["deed"], }), }), office: Office.hydrate({ uid: officeId, }), customers: [], stakeholders: folderAccessType === "whole_office" ? availableCollaborators : selectedCollaborators, }); try { await officeFolderForm.validateOrReject?.({ groups: ["createFolder"], forbidUnknownValues: true }); } catch (validationErrors) { setValidationError(validationErrors as ValidationError[]); return; } try { const newOfficeFolder = await Folders.getInstance().post(officeFolderForm); if (!newOfficeFolder) return; router.push(`/folders/${newOfficeFolder.uid}`); } catch (backError) { if (!Array.isArray(backError)) return; setValidationError(backError as ValidationError[]); return; } }; const radioOnChange = (e: React.ChangeEvent) => setFolderAccessType(e.target.value as "whole_office" | "select_collaborators"); const onSelectedCollaboratorsChange = useCallback( (options: IOption[] | null) => { if (!options) return; const collaborators = availableCollaborators.filter((collaborator) => options.find((option) => option.id === collaborator.uid)); setSelectedCollaborators(collaborators); }, [availableCollaborators], ); /** * UseEffect */ useEffect(() => { DeedTypes.getInstance() .get({ where: { archived_at: null } }) .then((deedTypes) => setAvailableDeedTypes(deedTypes)); // no need to pass query 'where' param here, default query for notaries include only users which are in the same office as the caller Users.getInstance() .get({ include: { contact: true }, }) .then((users) => { setAvailableCollaborators(users); // set default selected collaborators to the connected user const currentUser = users.find((user) => user.uid === JwtService.getInstance().decodeJwt()?.userId); if (currentUser) { setSelectedCollaborators([currentUser]); } }); }, []); /** * Renderer */ return (
Créer un dossier Informations du dossier
error.property === "folder_number")} /> error.property === "name")} /> ({ id: deedType.uid, label: deedType.name, })) as IOption[] } validationError={validationError.find((error) => error.property === "deed")} /> error.property === "description")} required={false} />
Donner l'accès au dossier
{folderAccessType === "select_collaborators" && (
({ label: collaborator.contact?.last_name.concat(" ", collaborator.contact.first_name) ?? "", id: collaborator.uid ?? "", }))} selectedOptions={selectedCollaborators.map((collaborator) => ({ label: collaborator.contact?.last_name.concat(" ", collaborator.contact.first_name) ?? "", id: collaborator.uid ?? "", }))} onSelectionChange={onSelectedCollaboratorsChange} validationError={validationError.find((error) => error.property === "stakeholders")} />
)}
); }