import Button, { EButtonSize, EButtonstyletype, EButtonVariant } from "@Front/Components/DesignSystem/Button"; import CheckBox from "@Front/Components/DesignSystem/CheckBox"; import Form from "@Front/Components/DesignSystem/Form"; import Typography, { ETypo, ETypoColor } from "@Front/Components/DesignSystem/Typography"; import BackArrow from "@Front/Components/Elements/BackArrow"; import Module from "@Front/Config/Module"; import { PlusIcon } from "@heroicons/react/24/outline"; import { OfficeFolder } from "le-coffre-resources/dist/Notary"; import { EDocumentStatus } from "le-coffre-resources/dist/Customer/Document"; import { useRouter } from "next/router"; import React, { useCallback, useEffect, useState, useRef } from "react"; import DefaultDoubleSidePage from "@Front/Components/LayoutTemplates/DefaultDoubleSidePage"; import classes from "./classes.module.scss"; import ParameterDocuments from "./ParameterDocuments"; import { IOption } from "@Front/Components/DesignSystem/Form/SelectFieldOld"; import backgroundImage from "@Assets/images/background_refonte.svg"; import FolderService from "src/common/Api/LeCoffreApi/sdk/FolderService"; import DocumentService from "src/common/Api/LeCoffreApi/sdk/DocumentService"; import LoaderService from "src/common/Api/LeCoffreApi/sdk/Loader/LoaderService"; export default function AskDocuments() { const router = useRouter(); let { folderUid, customerUid } = router.query; const [isCreateDocumentModalVisible, setIsCreateDocumentModalVisible] = useState(false); const [documentTypes, setDocumentTypes] = useState([]); const [folder, setFolder] = useState(null); const [selectedDocumentTypes, setSelectedDocumentTypes] = useState([]); const formRef = useRef
(null); const closeModal = () => setIsCreateDocumentModalVisible(false); const openModal = () => { // Store the currently selected document types before opening modal const selectedTypes = getSelectedDocumentTypes(); setSelectedDocumentTypes(selectedTypes); setIsCreateDocumentModalVisible(true); }; const getSelectedDocumentTypes = () => { // Get all checked checkboxes if (!formRef.current) return []; const formElement = formRef.current.formRef.current; if (!formElement) return []; const checkboxes = Array.from(formElement.elements).filter( (elem) => elem.getAttribute("type") === "checkbox" && elem.getAttribute("name") === "document_types", ) as HTMLInputElement[]; return checkboxes.filter((checkbox) => checkbox.checked).map((checkbox) => checkbox.value); }; const onFormSubmit = useCallback( async ( e: React.FormEvent | null, values: { [key: string]: any; }, ) => { try { // TODO: review LoaderService.getInstance().show(); const documentAsked: [] = values["document_types"] as []; for (let i = 0; i < documentAsked.length; i++) { const documentTypeUid = documentAsked[i]; if (!documentTypeUid) continue; const documentData: any = { folder: { uid: folderUid as string, }, depositor: { uid: customerUid as string, }, document_type: { uid: documentTypeUid }, document_status: EDocumentStatus.ASKED, file_uid: null, }; const validatorId: string = '884cb36a346a79af8697559f16940141f068bdf1656f88fa0df0e9ecd7311fb8:0'; await DocumentService.createDocument(documentData, validatorId); } router.push( Module.getInstance() .get() .modules.pages.Folder.pages.FolderInformation.props.path.replace("[folderUid]", folderUid as string), ); } catch (e) { console.error(e); } }, [customerUid, folderUid, router], ); const getAvailableDocuments = useCallback( async (folder: OfficeFolder): Promise => { // Getting already asked documents UIDs in an array const userDocumentTypesUids = folder .documents!.filter((document) => document.depositor!.uid! === customerUid!) .map((document) => { return document.document_type!.uid!; }); // If those UIDs are already asked, filter them to not show them in the list and only // show the documents that are not asked yet const documentTypes = folder.deed?.document_types?.filter((documentType) => { if (userDocumentTypesUids.includes(documentType!.uid!)) return false; return true; }); // If there is none document type available, return an empty array if (!documentTypes) return []; // Else, return an array document types formatted as IOPtions const documentTypesOptions: IOption[] = documentTypes.map((documentType) => { return { label: documentType!.name!, value: documentType!.uid!, description: documentType!.private_description!, }; }); documentTypesOptions.sort((a, b) => (a.label > b.label ? 1 : -1)); return documentTypesOptions; }, [customerUid], ); const loadData = useCallback(async () => { try { LoaderService.getInstance().show(); FolderService.getFolderByUid(folderUid as string).then(async (process: any) => { if (process) { const folder: any = process.processData; setFolder(folder); setDocumentTypes(await getAvailableDocuments(folder)); LoaderService.getInstance().hide(); } }); } catch (e) { console.error(e); } }, [folderUid, getAvailableDocuments]); // Update checkboxes after data has been refreshed const updateCheckedState = useCallback(() => { if (!formRef.current || selectedDocumentTypes.length === 0) return; const formElement = formRef.current.formRef.current; if (!formElement) return; // Check all checkboxes that were previously selected const checkboxes = Array.from(formElement.elements).filter( (elem) => elem.getAttribute("type") === "checkbox" && elem.getAttribute("name") === "document_types", ) as HTMLInputElement[]; checkboxes.forEach((checkbox) => { if (selectedDocumentTypes.includes(checkbox.value)) { checkbox.checked = true; // Trigger change to update the internal state of CheckBox component const event = new Event("change", { bubbles: true }); checkbox.dispatchEvent(event); } }); }, [selectedDocumentTypes]); useEffect(() => { loadData(); }, [loadData]); useEffect(() => { // Set timeout to ensure DOM is updated with checkboxes before trying to check them const timer = setTimeout(() => { updateCheckedState(); }, 0); return () => clearTimeout(timer); }, [documentTypes, updateCheckedState]); const backUrl = Module.getInstance() .get() .modules.pages.Folder.pages.FolderInformation.props.path.replace("[folderUid]", folderUid as string); const handleDocumentsUpdated = async (newDocumentTypes: IOption[]) => { // Store existing selections const existingSelections = getSelectedDocumentTypes(); // Update document types with new ones setDocumentTypes([...documentTypes, ...newDocumentTypes]); // Set these as selected setSelectedDocumentTypes([...existingSelections, ...newDocumentTypes.map((dt) => dt.value as string)]); }; return (
Demander des documents
{documentTypes.map((documentType) => { if (documentType.description && documentType.description.length > 1) { return ( ); } return ( ); })}
{folder && ( )}
); }