Get, getbyUid, restore folder and archive folder

This commit is contained in:
Hugo Lextrait 2023-04-27 11:41:55 +02:00
parent 18808169bd
commit a90c52167a
6 changed files with 213 additions and 39 deletions

View File

@ -0,0 +1,127 @@
import { Service } from "typedi";
import { OfficeFolder } from "le-coffre-resources/dist/Notary";
import BaseSuperAdmin from "../BaseSuperAdmin";
import { EFolderStatus } from "le-coffre-resources/dist/Customer/OfficeFolder";
// TODO Type get query params -> Where + inclue + orderby
export interface IGetFoldersParams {
q?: {};
}
// TODO Type getbyuid query params
export type IPutFoldersParams = {
uid?: OfficeFolder["uid"];
folder_number?: OfficeFolder["folder_number"];
name?: OfficeFolder["name"];
description?: OfficeFolder["description"];
archived_description?: OfficeFolder["archived_description"];
status?: OfficeFolder["status"];
};
@Service()
export default class Folders extends BaseSuperAdmin {
private static instance: Folders;
private readonly baseURl = this.namespaceUrl.concat("/folders");
private constructor() {
super();
}
public static getInstance() {
if (!this.instance) {
return new this();
} else {
return this.instance;
}
}
/**
* @description : Get all folders
*/
public async get(q: IGetFoldersParams): Promise<OfficeFolder[]> {
const url = new URL(this.baseURl);
Object.entries(q).forEach(([key, value]) => url.searchParams.set(key, JSON.stringify(value)));
try {
return await this.getRequest<OfficeFolder[]>(url);
} catch (err) {
this.onError(err);
return Promise.reject(err);
}
}
/**
* @description : Get a folder by uid
*/
public async getByUid(uid: string, q?: any): Promise<OfficeFolder> {
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<OfficeFolder>(url);
} catch (err) {
this.onError(err);
return Promise.reject(err);
}
}
/**
* @description : Create a folder
*/
// public async post(body: IPostFoldersParams): Promise<OfficeFolder> {
// const url = new URL(this.baseURl);
// try {
// return await this.postRequest<OfficeFolder>(url, body);
// } catch (err) {
// this.onError(err);
// return Promise.reject(err);
// }
// }
/**
* @description : Update the folder description
*/
public async put(uid: string, body: IPutFoldersParams): Promise<OfficeFolder> {
const url = new URL(this.baseURl.concat(`/${uid}`));
try {
return await this.putRequest<OfficeFolder>(url, body);
} catch (err) {
this.onError(err);
return Promise.reject(err);
}
}
/**
* @description : Delete a folder only if the folder don't contains customers
*/
public async delete(uid: string): Promise<OfficeFolder> {
const url = new URL(this.baseURl.concat(`/${uid}`));
const targetedFolder = await this.getByUid(uid);
if (targetedFolder.office_folder_has_customers) return Promise.reject(`The folder ${uid} contains customers`);
try {
return await this.deleteRequest<OfficeFolder>(url);
} catch (err) {
this.onError(err);
return Promise.reject(err);
}
}
public async archive(uid: string, body: IPutFoldersParams): Promise<OfficeFolder> {
body.status = EFolderStatus.ARCHIVED;
try {
return await this.put(uid, body);
} catch (err) {
this.onError(err);
return Promise.reject(err);
}
}
public async restore(uid: string, body: IPutFoldersParams): Promise<OfficeFolder> {
body.status = EFolderStatus.LIVE;
try {
return await this.put(uid, body);
} catch (err) {
this.onError(err);
return Promise.reject(err);
}
}
}

View File

@ -85,6 +85,7 @@ export default function FolderBoxInformation(props: IProps) {
function formatDate(date: Date | null): string { function formatDate(date: Date | null): string {
if (!date) return "..."; if (!date) return "...";
if (!(date instanceof Date)) date = new Date(date);
return date.toLocaleDateString("fr-FR", { return date.toLocaleDateString("fr-FR", {
year: "numeric", year: "numeric",
month: "long", month: "long",

View File

@ -6,8 +6,6 @@ import FolderListContainer from "@Front/Components/DesignSystem/FolderListContai
import Header from "@Front/Components/DesignSystem/Header"; import Header from "@Front/Components/DesignSystem/Header";
import Version from "@Front/Components/DesignSystem/Version"; import Version from "@Front/Components/DesignSystem/Version";
import BackArrow from "@Front/Components/Elements/BackArrow"; import BackArrow from "@Front/Components/Elements/BackArrow";
import { folders } from "@Front/Components/Layouts/DesignSystem/dummyData";
import { foldersArchived } from "@Front/Components/Layouts/DesignSystem/dummyData";
import WindowStore from "@Front/Stores/WindowStore"; import WindowStore from "@Front/Stores/WindowStore";
import classNames from "classnames"; import classNames from "classnames";
import { OfficeFolder } from "le-coffre-resources/dist/Customer"; import { OfficeFolder } from "le-coffre-resources/dist/Customer";
@ -15,7 +13,8 @@ import Image from "next/image";
import React, { ReactNode } from "react"; import React, { ReactNode } from "react";
import classes from "./classes.module.scss"; import classes from "./classes.module.scss";
import Folders, { IGetFoldersParams } from "@Front/Api/LeCoffreApi/SuperAdmin/Folders/Folders";
import { EFolderStatus } from "le-coffre-resources/dist/Customer/OfficeFolder";
type IProps = { type IProps = {
title: string; title: string;
@ -42,6 +41,7 @@ export type IDashBoardFolder = {
created_at: OfficeFolder["created_at"]; created_at: OfficeFolder["created_at"];
office_folder_has_customers?: OfficeFolder["office_folder_has_customers"]; office_folder_has_customers?: OfficeFolder["office_folder_has_customers"];
archived_description: OfficeFolder["archived_description"]; archived_description: OfficeFolder["archived_description"];
status: OfficeFolder["status"];
}; };
export default class DefaultNotaryDashboard extends React.Component<IProps, IState> { export default class DefaultNotaryDashboard extends React.Component<IProps, IState> {
@ -108,17 +108,23 @@ export default class DefaultNotaryDashboard extends React.Component<IProps, ISta
); );
} }
public override componentDidMount(): void { public override async componentDidMount() {
this.onWindowResize = WindowStore.getInstance().onResize((window) => this.onResize(window)); this.onWindowResize = WindowStore.getInstance().onResize((window) => this.onResize(window));
/** let targetedStatus: EFolderStatus = EFolderStatus["LIVE" as keyof typeof EFolderStatus];
* We set folders state according to the isArchived props if (this.props.isArchived) targetedStatus = EFolderStatus.ARCHIVED;
* TODO: Front connexion we need to get from bdd const query: IGetFoldersParams = {
*/ q: {
if (this.props.isArchived) { where: { status: targetedStatus },
this.setState({ folders: foldersArchived }); include: {
} else { deed: { include: { deed_type: true } },
this.setState({ folders: folders }); office: true,
} office_folder_has_customers: { include: { customer: { include: { contact: true } } } },
},
},
};
const folders = await Folders.getInstance().get(query);
this.setState({ folders: folders });
} }
public override componentWillUnmount() { public override componentWillUnmount() {
this.onWindowResize(); this.onWindowResize();

View File

@ -57,6 +57,7 @@ export default class ClientSection extends React.Component<IProps, IState> {
} }
private doesFolderHaveCustomer(): boolean { private doesFolderHaveCustomer(): boolean {
return this.props.folder.office_folder_has_customers !== undefined; if (!this.props.folder?.office_folder_has_customers) return false;
return this.props.folder?.office_folder_has_customers!.length > 0;
} }
} }

View File

@ -7,17 +7,20 @@ import InputField from "@Front/Components/DesignSystem/Form/Elements/InputField"
import Confirm from "@Front/Components/DesignSystem/Modal/Confirm"; import Confirm from "@Front/Components/DesignSystem/Modal/Confirm";
import QuantityProgressBar from "@Front/Components/DesignSystem/QuantityProgressBar"; import QuantityProgressBar from "@Front/Components/DesignSystem/QuantityProgressBar";
import Typography, { ITypo, ITypoColor } from "@Front/Components/DesignSystem/Typography"; import Typography, { ITypo, ITypoColor } from "@Front/Components/DesignSystem/Typography";
import { folders } from "@Front/Components/Layouts/DesignSystem/dummyData";
import DefaultNotaryDashboard, { IDashBoardFolder } from "@Front/Components/LayoutTemplates/DefaultNotaryDashboard"; import DefaultNotaryDashboard, { IDashBoardFolder } from "@Front/Components/LayoutTemplates/DefaultNotaryDashboard";
import Module from "@Front/Config/Module"; import Module from "@Front/Config/Module";
import Link from "next/link"; import Link from "next/link";
import { useRouter } from "next/router"; import { NextRouter, useRouter } from "next/router";
import BasePage from "../../Base"; import BasePage from "../../Base";
import classes from "./classes.module.scss"; import classes from "./classes.module.scss";
import ClientSection from "./ClientSection"; import ClientSection from "./ClientSection";
import Folders from "@Front/Api/LeCoffreApi/SuperAdmin/Folders/Folders";
import { OfficeFolder } from "le-coffre-resources/dist/Customer";
import { EFolderStatus } from "le-coffre-resources/dist/Customer/OfficeFolder";
type IProps = {
type IProps = {}; router: NextRouter;
};
type IPropsClass = IProps & { type IPropsClass = IProps & {
selectedFolderUid: string; selectedFolderUid: string;
@ -37,6 +40,7 @@ class FolderInformationClass extends BasePage<IPropsClass, IState> {
this.onSelectedFolder = this.onSelectedFolder.bind(this); this.onSelectedFolder = this.onSelectedFolder.bind(this);
this.openArchivedModal = this.openArchivedModal.bind(this); this.openArchivedModal = this.openArchivedModal.bind(this);
this.closeArchivedModal = this.closeArchivedModal.bind(this); this.closeArchivedModal = this.closeArchivedModal.bind(this);
this.onArchivedModalAccepted = this.onArchivedModalAccepted.bind(this);
} }
// TODO: Message if the user has not created any folder yet // TODO: Message if the user has not created any folder yet
@ -85,6 +89,7 @@ class FolderInformationClass extends BasePage<IPropsClass, IState> {
</div> </div>
<Confirm <Confirm
isOpen={this.state.isArchivedModalOpen} isOpen={this.state.isArchivedModalOpen}
onAccept={this.onArchivedModalAccepted}
onClose={this.closeArchivedModal} onClose={this.closeArchivedModal}
closeBtn closeBtn
header={"Archiver le dossier ?"} header={"Archiver le dossier ?"}
@ -111,16 +116,14 @@ class FolderInformationClass extends BasePage<IPropsClass, IState> {
); );
} }
public override async componentDidMount() { public override async componentDidMount() {
for (const folder of folders) { this.setState({
if (folder.uid === this.props.selectedFolderUid) { selectedFolder: await this.getFolder(),
this.setState({ selectedFolder: folder }); });
break;
}
}
} }
private doesFolderHaveCustomer(): boolean { private doesFolderHaveCustomer(): boolean {
return this.state.selectedFolder?.office_folder_has_customers !== undefined; if (!this.state.selectedFolder?.office_folder_has_customers) return false;
return this.state.selectedFolder?.office_folder_has_customers!.length > 0;
} }
private onSelectedFolder(folder: IDashBoardFolder): void { private onSelectedFolder(folder: IDashBoardFolder): void {
@ -134,11 +137,30 @@ class FolderInformationClass extends BasePage<IPropsClass, IState> {
private closeArchivedModal(): void { private closeArchivedModal(): void {
this.setState({ isArchivedModalOpen: false }); this.setState({ isArchivedModalOpen: false });
} }
private async onArchivedModalAccepted() {
if (!this.state.selectedFolder) return;
await Folders.getInstance().archive(this.state.selectedFolder.uid, this.state.selectedFolder);
this.closeArchivedModal();
this.props.router.push(Module.getInstance().get().modules.pages.Folder.props.path);
}
private async getFolder(): Promise<OfficeFolder> {
const query = {
q: {
deed: { include: { deed_type: "true" } },
office: "true",
office_folder_has_customers: { include: { customer: { include: { contact: true } } } },
},
};
const folder = await Folders.getInstance().getByUid(this.props.selectedFolderUid, query);
return folder;
}
} }
export default function FolderInformation(props: IProps) { export default function FolderInformation(props: IProps) {
const router = useRouter(); const router = useRouter();
let { folderUid } = router.query; let { folderUid } = router.query;
folderUid = folderUid as string; folderUid = folderUid as string;
return <FolderInformationClass {...props} selectedFolderUid={folderUid} />; return <FolderInformationClass {...props} selectedFolderUid={folderUid} router={router} />;
} }

View File

@ -5,15 +5,20 @@ import Button, { EButtonVariant } from "@Front/Components/DesignSystem/Button";
import FolderBoxInformation, { EFolderBoxInformationType } from "@Front/Components/DesignSystem/FolderBoxInformation"; import FolderBoxInformation, { EFolderBoxInformationType } from "@Front/Components/DesignSystem/FolderBoxInformation";
import QuantityProgressBar from "@Front/Components/DesignSystem/QuantityProgressBar"; import QuantityProgressBar from "@Front/Components/DesignSystem/QuantityProgressBar";
import Typography, { ITypo, ITypoColor } from "@Front/Components/DesignSystem/Typography"; import Typography, { ITypo, ITypoColor } from "@Front/Components/DesignSystem/Typography";
import { folders } from "@Front/Components/Layouts/DesignSystem/dummyData";
import DefaultNotaryDashboard, { IDashBoardFolder } from "@Front/Components/LayoutTemplates/DefaultNotaryDashboard"; import DefaultNotaryDashboard, { IDashBoardFolder } from "@Front/Components/LayoutTemplates/DefaultNotaryDashboard";
import { useRouter } from "next/router"; import { NextRouter, useRouter } from "next/router";
import BasePage from "../../Base"; import BasePage from "../../Base";
import classes from "./classes.module.scss"; import classes from "./classes.module.scss";
import ClientSection from "./ClientSection"; import ClientSection from "./ClientSection";
import { OfficeFolder } from "le-coffre-resources/dist/Customer";
import Folders from "@Front/Api/LeCoffreApi/SuperAdmin/Folders/Folders";
import { EFolderStatus } from "le-coffre-resources/dist/Customer/OfficeFolder";
import Module from "@Front/Config/Module";
type IProps = {}; type IProps = {
router: NextRouter;
};
type IPropsClass = IProps & { type IPropsClass = IProps & {
selectedFolderUid: string; selectedFolderUid: string;
@ -33,6 +38,7 @@ class FolderInformationClass extends BasePage<IPropsClass, IState> {
this.onSelectedFolder = this.onSelectedFolder.bind(this); this.onSelectedFolder = this.onSelectedFolder.bind(this);
this.openArchivedModal = this.openArchivedModal.bind(this); this.openArchivedModal = this.openArchivedModal.bind(this);
this.closeArchivedModal = this.closeArchivedModal.bind(this); this.closeArchivedModal = this.closeArchivedModal.bind(this);
this.restoreFolder = this.restoreFolder.bind(this);
} }
// TODO: Message if the user has not created any folder yet // TODO: Message if the user has not created any folder yet
@ -101,13 +107,8 @@ class FolderInformationClass extends BasePage<IPropsClass, IState> {
); );
} }
public override async componentDidMount() { public override async componentDidMount() {
// TODO : GET Current folder from the api const folder = await this.getFolder();
for (const folder of folders) { this.setState({ selectedFolder: folder });
if (folder.uid === this.props.selectedFolderUid) {
this.setState({ selectedFolder: folder });
break;
}
}
} }
private doesFolderHaveCustomer(): boolean { private doesFolderHaveCustomer(): boolean {
@ -118,8 +119,12 @@ class FolderInformationClass extends BasePage<IPropsClass, IState> {
this.setState({ selectedFolder: folder }); this.setState({ selectedFolder: folder });
} }
private restoreFolder() {} private async restoreFolder() {
// should call the api to restore the folder if (!this.state.selectedFolder) return;
await Folders.getInstance().restore(this.state.selectedFolder.uid, this.state.selectedFolder);
this.props.router.push(Module.getInstance().get().modules.pages.Folder.pages.FolderArchived.props.path);
}
private openArchivedModal(): void { private openArchivedModal(): void {
this.setState({ isArchivedModalOpen: true }); this.setState({ isArchivedModalOpen: true });
} }
@ -127,11 +132,23 @@ class FolderInformationClass extends BasePage<IPropsClass, IState> {
private closeArchivedModal(): void { private closeArchivedModal(): void {
this.setState({ isArchivedModalOpen: false }); this.setState({ isArchivedModalOpen: false });
} }
private async getFolder(): Promise<OfficeFolder> {
const query = {
q: {
deed: { include: { deed_type: "true" } },
office: "true",
office_folder_has_customers: { include: { customer: { include: { contact: true } } } },
},
};
const folder = await Folders.getInstance().getByUid(this.props.selectedFolderUid, query);
return folder;
}
} }
export default function FolderInformation(props: IProps) { export default function FolderInformation(props: IProps) {
const router = useRouter(); const router = useRouter();
let { folderUid } = router.query; let { folderUid } = router.query;
folderUid = folderUid as string; folderUid = folderUid as string;
return <FolderInformationClass {...props} selectedFolderUid={folderUid} />; return <FolderInformationClass {...props} selectedFolderUid={folderUid} router={router} />;
} }