Merge branch 'dev' into staging

This commit is contained in:
Max S 2024-08-26 15:45:48 +02:00
commit 96422bc142
33 changed files with 795 additions and 144 deletions

View File

@ -11,6 +11,36 @@
border: 1px solid var(--alerts-info-border); border: 1px solid var(--alerts-info-border);
background: var(--alerts-info-background); background: var(--alerts-info-background);
@media screen and (max-width: 680px) {
flex-direction: column;
}
.top {
align-self: stretch;
display: flex;
justify-content: space-between;
align-items: center;
}
.close-button {
display: block;
&.desktop {
display: block;
@media screen and (max-width: 680px) {
display: none;
}
}
&.mobile {
display: none;
@media screen and (max-width: 680px) {
display: block;
}
}
}
.content { .content {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@ -25,64 +55,34 @@
.button-container { .button-container {
display: flex; display: flex;
gap: var(--spacing-md, 16px); gap: var(--spacing-md, 16px);
}
}
.icon { @media screen and (max-width: 680px) {
display: flex; flex-direction: column;
padding: var(--spacing-1, 8px); button {
align-items: center; width: 100%;
align-self: flex-start; }
}
border-radius: var(--alerts-badge-radius, 360px);
border: 1px solid var(--alerts-badge-border, rgba(0, 0, 0, 0));
background: var(--alerts-badge-background, #fff);
box-shadow: 0px 4px 16px 0px rgba(0, 0, 0, 0.1);
svg {
width: 24px;
height: 24px;
min-width: 24px;
min-height: 24px;
stroke: var(--alerts-badge-contrast-info);
} }
} }
&.error { &.error {
border-color: var(--alerts-error-border); border-color: var(--alerts-error-border);
background: var(--alerts-error-background); background: var(--alerts-error-background);
.icon svg {
stroke: var(--alerts-badge-contrast-error);
}
} }
&.warning { &.warning {
border-color: var(--alerts-warning-border); border-color: var(--alerts-warning-border);
background: var(--alerts-warning-background); background: var(--alerts-warning-background);
.icon svg {
stroke: var(--alerts-badge-contrast-warning);
}
} }
&.success { &.success {
border-color: var(--alerts-success-border); border-color: var(--alerts-success-border);
background: var(--alerts-success-background); background: var(--alerts-success-background);
.icon svg {
stroke: var(--alerts-badge-contrast-success);
}
} }
&.neutral { &.neutral {
border-color: var(--alerts-neutral-border); border-color: var(--alerts-neutral-border);
background: var(--alerts-neutral-background); background: var(--alerts-neutral-background);
.icon svg {
stroke: var(--alerts-badge-contrast-neutral);
}
} }
&.fullwidth { &.fullwidth {

View File

@ -52,7 +52,13 @@ export default function Alert(props: IProps) {
return ( return (
<div className={classNames(classes["root"], classes[variant], fullWidth && classes["fullwidth"])}> <div className={classNames(classes["root"], classes[variant], fullWidth && classes["fullwidth"])}>
<BadgeIcon icon={icon ?? <InformationCircleIcon />} color={variantColorMap[variant]} /> <div className={classes["top"]}>
<BadgeIcon icon={icon ?? <InformationCircleIcon />} color={variantColorMap[variant]} />
{closeButton && (
<IconButton className={classNames(classes["close-button"], classes["mobile"])} onClick={close} icon={<XMarkIcon />} />
)}
</div>
<div className={classes["content"]}> <div className={classes["content"]}>
<div className={classes["text-container"]}> <div className={classes["text-container"]}>
<Typography typo={ETypo.TEXT_LG_SEMIBOLD} color={ETypoColor.COLOR_NEUTRAL_950}> <Typography typo={ETypo.TEXT_LG_SEMIBOLD} color={ETypoColor.COLOR_NEUTRAL_950}>
@ -84,7 +90,7 @@ export default function Alert(props: IProps) {
)} )}
</div> </div>
</div> </div>
{closeButton && <IconButton onClick={close} icon={<XMarkIcon />} />} {closeButton && <IconButton className={classNames(classes["close-button"], classes["desktop"])} onClick={close} icon={<XMarkIcon />} />}
</div> </div>
); );
} }

View File

@ -1,13 +1,15 @@
import React, { useCallback, useEffect, useRef, useState } from "react"; import React, { useCallback, useEffect, useRef, useState } from "react";
import Typography, { ETypo, ETypoColor } from "../Typography"; import Typography, { ETypo, ETypoColor } from "../Typography";
import classes from "./classes.module.scss"; import classes from "./classes.module.scss";
import classNames from "classnames";
type IProps = { type IProps = {
percentage: number; percentage: number;
className?: string;
}; };
export default function CircleProgress(props: IProps) { export default function CircleProgress(props: IProps) {
const { percentage } = props; const { percentage, className } = props;
const [animatedProgress, setAnimatedProgress] = useState(0); const [animatedProgress, setAnimatedProgress] = useState(0);
const requestRef = useRef<number>(); const requestRef = useRef<number>();
@ -41,7 +43,7 @@ export default function CircleProgress(props: IProps) {
const offset = circumference - (animatedProgress / 100) * circumference; const offset = circumference - (animatedProgress / 100) * circumference;
return ( return (
<div className={classes["root"]}> <div className={classNames(classes["root"], className)}>
<svg xmlns="http://www.w3.org/2000/svg" width="27" height="27" viewBox="0 0 27 27" fill="none"> <svg xmlns="http://www.w3.org/2000/svg" width="27" height="27" viewBox="0 0 27 27" fill="none">
<circle className={classes["circleBackground"]} cx="13.5" cy="13.5" r={radius} strokeWidth="3" /> <circle className={classes["circleBackground"]} cx="13.5" cy="13.5" r={radius} strokeWidth="3" />
<circle <circle
@ -59,4 +61,4 @@ export default function CircleProgress(props: IProps) {
</Typography> </Typography>
</div> </div>
); );
} }

View File

@ -20,14 +20,15 @@ type IProps = {
direction?: ESeperatorDirection; direction?: ESeperatorDirection;
size?: number; size?: number;
thickness?: number; thickness?: number;
className?: string;
}; };
export default function Separator(props: IProps) { export default function Separator(props: IProps) {
const { color = ESeperatorColor.DEFAULT, direction = ESeperatorDirection.HORIZONTAL, size, thickness = 1 } = props; const { color = ESeperatorColor.DEFAULT, direction = ESeperatorDirection.HORIZONTAL, size, thickness = 1, className } = props;
return ( return (
<div <div
className={classNames(classes["root"], classes[color], classes[direction])} className={classNames(classes["root"], classes[color], classes[direction], className)}
style={direction === ESeperatorDirection.HORIZONTAL ? { width: size, height: thickness } : { height: size, width: thickness }} style={direction === ESeperatorDirection.HORIZONTAL ? { width: size, height: thickness } : { height: size, width: thickness }}
/> />
); );

View File

@ -5,6 +5,7 @@ import React from "react";
type IProps = { type IProps = {
url?: string; url?: string;
text?: string;
}; };
type IPropsClass = IProps & { type IPropsClass = IProps & {
@ -26,7 +27,7 @@ class BackArrowClass extends React.Component<IPropsClass, IState> {
styletype={EButtonstyletype.TEXT} styletype={EButtonstyletype.TEXT}
size={EButtonSize.SM} size={EButtonSize.SM}
onClick={this.handleClick}> onClick={this.handleClick}>
Retour {this.props.text ?? "Retour"}
</Button> </Button>
); );
} }

View File

@ -0,0 +1,5 @@
.root {
display: flex;
flex-direction: column;
gap: var(--spacing-sm, 8px);
}

View File

@ -0,0 +1,39 @@
import Button, { EButtonSize, EButtonstyletype, EButtonVariant } from "@Front/Components/DesignSystem/Button";
import classes from "./classes.module.scss";
import Typography, { ETypo, ETypoColor } from "@Front/Components/DesignSystem/Typography";
import Link from "next/link";
export type IProps = {
title: string;
description: string;
button: { text: string; link?: string; onClick?: () => void };
};
export default function HelpBox(props: IProps) {
const { title, description, button } = props;
return (
<div className={classes["root"]}>
<Typography typo={ETypo.TEXT_MD_SEMIBOLD} color={ETypoColor.TEXT_SECONDARY}>
{title}
</Typography>
<Typography typo={ETypo.TEXT_MD_REGULAR} color={ETypoColor.TEXT_SECONDARY}>
{description}
</Typography>
{button.link ? (
<Link href={button.link}>
<Button
variant={EButtonVariant.SECONDARY}
styletype={EButtonstyletype.TEXT}
size={EButtonSize.MD}
onClick={button.onClick}>
Contactez le support
</Button>
</Link>
) : (
<Button variant={EButtonVariant.SECONDARY} styletype={EButtonstyletype.TEXT} size={EButtonSize.MD} onClick={button.onClick}>
Contactez le support
</Button>
)}
</div>
);
}

View File

@ -32,6 +32,10 @@
.right-side { .right-side {
min-width: 100%; min-width: 100%;
.right-side-content {
overflow-y: hidden;
}
} }
} }
} }

View File

@ -0,0 +1,23 @@
@import "@Themes/constants.scss";
.root {
padding: var(--spacing-3) var(--spacing-15);
max-width: 1156px;
display: flex;
flex-direction: column;
align-items: flex-start;
gap: var(--spacing-xl, 32px);
.table{
width: 100%;
}
@media screen and (max-width: $screen-m) {
padding: var(--spacing-3);
}
@media screen and (max-width: $screen-s) {
padding: var(--spacing-2);
}
}

View File

@ -0,0 +1,59 @@
import React from "react";
import classes from "./classes.module.scss";
import { useRouter } from "next/router";
import Typography, { ETypo, ETypoColor } from "@Front/Components/DesignSystem/Typography";
import DefaultTemplate from "@Front/Components/LayoutTemplates/DefaultTemplate";
import Module from "@Front/Config/Module";
import BackArrow from "@Front/Components/Elements/BackArrow";
import { ArrowDownTrayIcon } from "@heroicons/react/24/outline";
import Button, { EButtonSize, EButtonstyletype, EButtonVariant } from "@Front/Components/DesignSystem/Button";
import { IHead } from "@Front/Components/DesignSystem/Table/MuiTable";
import Table from "@Front/Components/DesignSystem/Table";
type IProps = {};
const header: readonly IHead[] = [
{
key: "name",
title: "Nom",
},
{
key: "sentAt",
title: "Envoyé le",
},
{
key: "actions",
title: "Action",
},
];
export default function ReceivedDocuments(props: IProps) {
const router = useRouter();
let { folderUid } = router.query;
return (
<DefaultTemplate title={"Documents reçus"} isPadding={false}>
<div className={classes["root"]}>
<BackArrow
text="Retour aux dossiers"
url={Module.getInstance()
.get()
.modules.pages.ClientDashboard.props.path.replace("[folderUid]", folderUid as string)}
/>
<Typography typo={ETypo.TITLE_H1} color={ETypoColor.TEXT_PRIMARY}>
Un document vous a é envoyé
</Typography>
<Table className={classes["table"]} header={header} rows={[{ key: "1", name: "todo", sentAt: "todo", actions: "todo" }]} />
<Button
variant={EButtonVariant.PRIMARY}
size={EButtonSize.LG}
styletype={EButtonstyletype.CONTAINED}
leftIcon={<ArrowDownTrayIcon />}>
Tout télécharger
</Button>
</div>
</DefaultTemplate>
);
}

View File

@ -19,6 +19,8 @@ import ContactBox from "@Front/Components/Elements/ContactBox";
import Button, { EButtonSize, EButtonstyletype, EButtonVariant } from "@Front/Components/DesignSystem/Button"; import Button, { EButtonSize, EButtonstyletype, EButtonVariant } from "@Front/Components/DesignSystem/Button";
import { ArrowDownTrayIcon } from "@heroicons/react/24/outline"; import { ArrowDownTrayIcon } from "@heroicons/react/24/outline";
import DepositDocumentComponent from "./DepositDocumentComponent"; import DepositDocumentComponent from "./DepositDocumentComponent";
import Link from "next/link";
import Module from "@Front/Config/Module";
type IProps = {}; type IProps = {};
@ -169,9 +171,17 @@ export default function ClientDashboard(props: IProps) {
Télécharger le RIB Télécharger le RIB
</Button> </Button>
)} )}
<Button fullwidth variant={EButtonVariant.PRIMARY} size={EButtonSize.LG} styletype={EButtonstyletype.OUTLINED}> <Link
Voir les documents reçus href={Module.getInstance()
</Button> .get()
.modules.pages.ClientDashboard.pages.ReceiveDocuments.props.path.replace(
"[folderUid]",
folderUid as string,
)}>
<Button fullwidth variant={EButtonVariant.PRIMARY} size={EButtonSize.LG} styletype={EButtonstyletype.OUTLINED}>
Voir les documents reçus
</Button>
</Link>
</div> </div>
<div className={classes["documents"]}> <div className={classes["documents"]}>
<Typography typo={ETypo.TEXT_LG_BOLD} color={ETypoColor.TABLE_COLUMN_CONTRAST}> <Typography typo={ETypo.TEXT_LG_BOLD} color={ETypoColor.TABLE_COLUMN_CONTRAST}>

View File

@ -0,0 +1,23 @@
@import "@Themes/constants.scss";
.root {
padding: var(--spacing-3) var(--spacing-15);
max-width: 1156px;
display: flex;
flex-direction: column;
align-items: flex-start;
gap: var(--spacing-xl, 32px);
.table{
width: 100%;
}
@media screen and (max-width: $screen-m) {
padding: var(--spacing-3);
}
@media screen and (max-width: $screen-s) {
padding: var(--spacing-2);
}
}

View File

@ -0,0 +1,53 @@
import Table from "@Front/Components/DesignSystem/Table";
import { IHead } from "@Front/Components/DesignSystem/Table/MuiTable";
import Typography, { ETypo, ETypoColor } from "@Front/Components/DesignSystem/Typography";
import BackArrow from "@Front/Components/Elements/BackArrow";
import DefaultTemplate from "@Front/Components/LayoutTemplates/DefaultTemplate";
import Module from "@Front/Config/Module";
import { useRouter } from "next/router";
import React from "react";
import classes from "./classes.module.scss";
type IProps = {};
const header: readonly IHead[] = [
{
key: "remindedAt",
title: "Date de relance",
},
{
key: "customer",
title: "Client",
},
{
key: "document_type",
title: "Type de document",
},
{
key: "statut",
title: "Satut",
},
];
export default function DocumentsReminderHistory(props: IProps) {
const router = useRouter();
let { folderUid } = router.query;
return (
<DefaultTemplate title={"Historique des relances de documents"} isPadding={false}>
<div className={classes["root"]}>
<BackArrow
text="Retour"
url={Module.getInstance()
.get()
.modules.pages.Folder.pages.FolderInformation.props.path.replace("[folderUid]", folderUid as string)}
/>
<Typography typo={ETypo.TITLE_H1} color={ETypoColor.TEXT_PRIMARY}>
Historique des relances de documents
</Typography>
<Table className={classes["table"]} header={header} rows={[{ key: "1", name: "todo", sentAt: "todo", actions: "todo" }]} />
</div>
</DefaultTemplate>
);
}

View File

@ -6,16 +6,15 @@ import Typography, { ETypo, ETypoColor } from "@Front/Components/DesignSystem/Ty
import Module from "@Front/Config/Module"; import Module from "@Front/Config/Module";
import useOpenable from "@Front/Hooks/useOpenable"; import useOpenable from "@Front/Hooks/useOpenable";
import { PencilSquareIcon, TrashIcon, UsersIcon } from "@heroicons/react/24/outline"; import { PencilSquareIcon, TrashIcon, UsersIcon } from "@heroicons/react/24/outline";
import { Note } from "le-coffre-resources/dist/Customer"; import Customer, { Note } from "le-coffre-resources/dist/Customer";
import { useCallback } from "react"; import { useCallback } from "react";
import { ICustomer } from "..";
import { AnchorStatus } from "../.."; import { AnchorStatus } from "../..";
import classes from "./classes.module.scss"; import classes from "./classes.module.scss";
import DeleteCustomerModal from "./DeleteCustomerModal"; import DeleteCustomerModal from "./DeleteCustomerModal";
type IProps = { type IProps = {
customer: ICustomer; customer: Customer;
anchorStatus: AnchorStatus; anchorStatus: AnchorStatus;
folderUid: string | undefined; folderUid: string | undefined;
customerNote: Note | null; customerNote: Note | null;

View File

@ -16,6 +16,7 @@ import { useCallback, useEffect, useMemo, useState } from "react";
import classes from "./classes.module.scss"; import classes from "./classes.module.scss";
import DeleteAskedDocumentModal from "./DeleteAskedDocumentModal"; import DeleteAskedDocumentModal from "./DeleteAskedDocumentModal";
import DeleteSentDocumentModal from "./DeleteSentDocumentModal"; import DeleteSentDocumentModal from "./DeleteSentDocumentModal";
import { useMediaQuery } from "@mui/material";
type IProps = { type IProps = {
documents: Document[]; documents: Document[];
@ -34,6 +35,8 @@ export default function DocumentTables(props: IProps) {
const [documents, setDocuments] = useState<Document[]>(documentsProps); const [documents, setDocuments] = useState<Document[]>(documentsProps);
const [documentUid, setDocumentUid] = useState<string | null>(null); const [documentUid, setDocumentUid] = useState<string | null>(null);
const isMobile = useMediaQuery("(max-width:524px)");
const deleteAskedDocumentModal = useOpenable(); const deleteAskedDocumentModal = useOpenable();
const deleteSentDocumentModal = useOpenable(); const deleteSentDocumentModal = useOpenable();
@ -232,11 +235,11 @@ export default function DocumentTables(props: IProps) {
</Typography> </Typography>
<CircleProgress percentage={progress} /> <CircleProgress percentage={progress} />
</div> </div>
{askedDocuments.length > 0 && <Table header={getHeader("Demandé le")} rows={askedDocuments} />} {askedDocuments.length > 0 && <Table header={getHeader("Demandé le", isMobile)} rows={askedDocuments} />}
{toValidateDocuments.length > 0 && <Table header={getHeader("Déposé le")} rows={toValidateDocuments} />} {toValidateDocuments.length > 0 && <Table header={getHeader("Déposé le", isMobile)} rows={toValidateDocuments} />}
{validatedDocuments.length > 0 && <Table header={getHeader("Validé le")} rows={validatedDocuments} />} {validatedDocuments.length > 0 && <Table header={getHeader("Validé le", isMobile)} rows={validatedDocuments} />}
{refusedDocuments.length > 0 && <Table header={getHeader("Demandé le")} rows={refusedDocuments} />} {refusedDocuments.length > 0 && <Table header={getHeader("Demandé le", isMobile)} rows={refusedDocuments} />}
{sentDocuments.length > 0 && <Table header={getHeader("Envoyé le")} rows={sentDocuments} />} {sentDocuments.length > 0 && <Table header={getHeader("Envoyé le", isMobile)} rows={sentDocuments} />}
{documentUid && ( {documentUid && (
<> <>
<DeleteAskedDocumentModal <DeleteAskedDocumentModal
@ -257,7 +260,23 @@ export default function DocumentTables(props: IProps) {
); );
} }
function getHeader(dateColumnTitle: string): IHead[] { function getHeader(dateColumnTitle: string, isMobile: boolean): IHead[] {
if (isMobile) {
return [
{
key: "document_type",
title: "Type de document",
},
{
key: "document_status",
title: "Statut",
},
{
key: "actions",
title: "Action",
},
];
}
return [ return [
{ {
key: "document_type", key: "document_type",

View File

@ -0,0 +1,5 @@
@import "@Themes/constants.scss";
.root {
}

View File

@ -0,0 +1,37 @@
import Modal from "@Front/Components/DesignSystem/Modal";
import Typography, { ETypo } from "@Front/Components/DesignSystem/Typography";
import Customer from "le-coffre-resources/dist/Customer";
import React, { useCallback } from "react";
import classes from "./classes.module.scss";
type IProps = {
isOpen: boolean;
onClose?: () => void;
onRemindSuccess: () => void;
customer: Customer;
};
export default function ReminderModal(props: IProps) {
const { isOpen, onClose, onRemindSuccess, customer } = props;
const onRemind = useCallback(() => {
onRemindSuccess();
onClose?.();
}, [onClose, onRemindSuccess]);
return (
<Modal
isOpen={isOpen}
onClose={onClose}
title={`Relancer votre client ${customer.contact?.last_name}`}
firstButton={{ children: "Annuler", onClick: onClose }}
secondButton={{ children: "Relancer", onClick: onRemind }}>
<div className={classes["root"]}>
<Typography typo={ETypo.TEXT_MD_LIGHT}>
Sélectionnez le(s) document(s) pour lequel vous souhaitez relancer le client.
</Typography>
</div>
</Modal>
);
}

View File

@ -0,0 +1,19 @@
@import "@Themes/constants.scss";
.root {
display: flex;
flex-direction: column;
gap: var(--spacing-md, 32px);
.reminder-info {
display: flex;
gap: 8px;
align-items: center;
.info {
display: flex;
flex-direction: column;
gap: 4px;
}
}
}

View File

@ -0,0 +1,55 @@
import Button, { EButtonstyletype, EButtonVariant } from "@Front/Components/DesignSystem/Button";
import IconButton, { EIconButtonVariant } from "@Front/Components/DesignSystem/IconButton";
import Typography, { ETypo, ETypoColor } from "@Front/Components/DesignSystem/Typography";
import useOpenable from "@Front/Hooks/useOpenable";
import { ClockIcon, EnvelopeIcon } from "@heroicons/react/24/outline";
import Customer from "le-coffre-resources/dist/Customer";
import classes from "./classes.module.scss";
import ReminderModal from "./ReminderModal";
import { useRouter } from "next/router";
import Module from "@Front/Config/Module";
import Link from "next/link";
type IProps = {
customer: Customer;
};
export default function EmailReminder(props: IProps) {
const { customer } = props;
const { isOpen, open, close } = useOpenable();
const router = useRouter();
let { folderUid } = router.query;
return (
<div className={classes["root"]}>
<Button
onClick={open}
rightIcon={<EnvelopeIcon />}
variant={EButtonVariant.PRIMARY}
styletype={EButtonstyletype.OUTLINED}
fullwidth>
Relancer par mail
</Button>
<div className={classes["reminder-info"]}>
<Link
title={"Voir l'historique des relances"}
href={Module.getInstance()
.get()
.modules.pages.Folder.pages.DocumentsReminderHistory.props.path.replace("[folderUid]", folderUid as string)}>
<IconButton icon={<ClockIcon />} variant={EIconButtonVariant.NEUTRAL} />
</Link>
<div className={classes["info"]}>
<Typography typo={ETypo.TEXT_XS_REGULAR} color={ETypoColor.TEXT_SECONDARY}>
Dernière relance: todo
</Typography>
<Typography typo={ETypo.TEXT_XS_REGULAR} color={ETypoColor.TEXT_SECONDARY}>
Nombre de relance: todo
</Typography>
</div>
</div>
<ReminderModal isOpen={isOpen} onRemindSuccess={() => {}} onClose={close} customer={customer} />
</div>
);
}

View File

@ -1,5 +1,7 @@
@import "@Themes/constants.scss"; @import "@Themes/constants.scss";
$mobile-breakpoint: 664px;
.root { .root {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@ -20,11 +22,30 @@
display: flex; display: flex;
gap: var(--spacing-lg, 24px); gap: var(--spacing-lg, 24px);
.client-box { @media screen and (max-width: $screen-s) {
flex-direction: column;
}
.client-box-container {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: var(--spacing-lg, 24px); gap: var(--spacing-lg, 24px);
.button-container {
display: flex;
flex-direction: column;
gap: var(--spacing-lg, 24px);
}
@media screen and (max-width: $screen-s) {
flex-direction: row;
}
@media screen and (max-width: $mobile-breakpoint) {
flex-direction: column;
margin: auto;
}
} }
} }
} }

View File

@ -1,20 +1,20 @@
import Folders from "@Front/Api/LeCoffreApi/Notary/Folders/Folders";
import Button, { EButtonSize, EButtonstyletype, EButtonVariant } from "@Front/Components/DesignSystem/Button";
import Tabs from "@Front/Components/Elements/Tabs"; import Tabs from "@Front/Components/Elements/Tabs";
import Module from "@Front/Config/Module";
import { DocumentIcon, UserPlusIcon } from "@heroicons/react/24/outline";
import Customer from "le-coffre-resources/dist/Customer"; import Customer from "le-coffre-resources/dist/Customer";
import { EDocumentStatus } from "le-coffre-resources/dist/Customer/Document";
import { OfficeFolder } from "le-coffre-resources/dist/Notary"; import { OfficeFolder } from "le-coffre-resources/dist/Notary";
import Link from "next/link";
import { useCallback, useMemo, useState } from "react"; import { useCallback, useMemo, useState } from "react";
import { AnchorStatus } from ".."; import { AnchorStatus } from "..";
import classes from "./classes.module.scss"; import classes from "./classes.module.scss";
import ClientBox from "./ClientBox"; import ClientBox from "./ClientBox";
import Button, { EButtonSize, EButtonstyletype, EButtonVariant } from "@Front/Components/DesignSystem/Button";
import { DocumentIcon, UserPlusIcon } from "@heroicons/react/24/outline";
import Module from "@Front/Config/Module";
import Link from "next/link";
import NoDocument from "./NoDocument";
import DocumentTables from "./DocumentTables"; import DocumentTables from "./DocumentTables";
import Folders from "@Front/Api/LeCoffreApi/Notary/Folders/Folders"; import EmailReminder from "./EmailReminder";
import { EDocumentStatus } from "le-coffre-resources/dist/Customer/Document"; import NoDocument from "./NoDocument";
type IProps = { type IProps = {
folder: OfficeFolder; folder: OfficeFolder;
@ -95,7 +95,7 @@ export default function ClientView(props: IProps) {
)} )}
</div> </div>
<div className={classes["content"]}> <div className={classes["content"]}>
<div className={classes["client-box"]}> <div className={classes["client-box-container"]}>
<ClientBox <ClientBox
customer={customer} customer={customer}
anchorStatus={anchorStatus} anchorStatus={anchorStatus}
@ -103,18 +103,22 @@ export default function ClientView(props: IProps) {
onDelete={handleClientDelete} onDelete={handleClientDelete}
customerNote={folder.notes!.find((value) => value.customer?.uid === customer.uid) ?? null} customerNote={folder.notes!.find((value) => value.customer?.uid === customer.uid) ?? null}
/> />
{anchorStatus === AnchorStatus.NOT_ANCHORED && ( <div className={classes["button-container"]}>
<Link {anchorStatus === AnchorStatus.NOT_ANCHORED && (
href={Module.getInstance() <Link
.get() href={Module.getInstance()
.modules.pages.Folder.pages.AskDocument.props.path.replace("[folderUid]", folder.uid ?? "") .get()
.replace("[customerUid]", customer.uid ?? "")}> .modules.pages.Folder.pages.AskDocument.props.path.replace("[folderUid]", folder.uid ?? "")
<Button rightIcon={<DocumentIcon />} variant={EButtonVariant.PRIMARY} fullwidth> .replace("[customerUid]", customer.uid ?? "")}>
Demander un document <Button rightIcon={<DocumentIcon />} variant={EButtonVariant.PRIMARY} fullwidth>
</Button> Demander un document
</Link> </Button>
)} </Link>
)}
<EmailReminder customer={customer} />
</div>
</div> </div>
{doesCustomerHaveDocument ? ( {doesCustomerHaveDocument ? (
<DocumentTables documents={customer.documents ?? []} folderUid={folder?.uid ?? ""} /> <DocumentTables documents={customer.documents ?? []} folderUid={folder?.uid ?? ""} />
) : ( ) : (

View File

@ -1,18 +1,41 @@
@import "@Themes/constants.scss"; @import "@Themes/constants.scss";
$mobile-breakpoint: 600px;
.root { .root {
display: flex; display: flex;
gap: var(--spacing-lg, 40px); gap: var(--spacing-lg, 24px);
@media screen and (max-width: $mobile-breakpoint) {
flex-direction: column;
}
.info-box1 { .info-box1 {
display: flex; display: flex;
width: 100%; width: 100%;
flex-direction: column; flex-direction: column;
gap: var(--spacing-sm, 8px); gap: var(--spacing-sm, 8px);
.folder-number-container {
display: flex;
justify-content: space-between;
align-items: center;
gap: var(--spacing-lg, 24px);
}
.open-date { .open-date {
display: flex; display: flex;
gap: var(--spacing-sm, 8px); gap: var(--spacing-sm, 8px);
} }
@media screen and (max-width: $screen-s) {
width: 54vw;
}
@media screen and (max-width: $mobile-breakpoint) {
width: 100%;
}
} }
.info-box2 { .info-box2 {
@ -22,22 +45,74 @@
width: 100%; width: 100%;
max-width: 400px; max-width: 400px;
@media screen and (max-width: $mobile-breakpoint) {
max-width: 100%;
}
.progress-container { .progress-container {
width: 100%;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
.icon-container { @media screen and (max-width: $screen-s) {
display: flex; flex-direction: column-reverse;
gap: var(--spacing-md, 8px); gap: var(--spacing-lg, 24px);
}
@media screen and (max-width: $mobile-breakpoint) {
align-items: flex-start;
}
}
}
.icon-container {
display: flex;
gap: var(--spacing-md, 8px);
&.desktop {
display: flex;
@media screen and (max-width: $mobile-breakpoint) {
display: none;
} }
} }
.description-container { &.mobile {
.text { display: none;
max-height: 60px; @media screen and (max-width: $mobile-breakpoint) {
overflow-y: auto; display: flex;
}
}
}
.description-container {
.text {
max-height: 60px;
overflow-y: auto;
white-space: normal;
word-wrap: break-word;
}
&.desktop {
@media screen and (max-width: $screen-s) {
display: none;
}
}
&.ipad {
display: none;
@media screen and (max-width: $screen-s) {
display: block;
}
@media screen and (max-width: $mobile-breakpoint) {
display: none;
}
}
&.mobile {
display: none;
@media screen and (max-width: $mobile-breakpoint) {
display: block;
} }
} }
} }
@ -46,5 +121,10 @@
background-color: var(--separator-stroke-light); background-color: var(--separator-stroke-light);
width: 1px; width: 1px;
align-self: stretch; align-self: stretch;
@media screen and (max-width: $mobile-breakpoint) {
height: 1px;
width: 100%;
}
} }
} }

View File

@ -6,12 +6,13 @@ import Tag, { ETagColor } from "@Front/Components/DesignSystem/Tag";
import Typography, { ETypo, ETypoColor } from "@Front/Components/DesignSystem/Typography"; import Typography, { ETypo, ETypoColor } from "@Front/Components/DesignSystem/Typography";
import Module from "@Front/Config/Module"; import Module from "@Front/Config/Module";
import { ArchiveBoxIcon, EllipsisHorizontalIcon, PaperAirplaneIcon, PencilSquareIcon, UsersIcon } from "@heroicons/react/24/outline"; import { ArchiveBoxIcon, EllipsisHorizontalIcon, PaperAirplaneIcon, PencilSquareIcon, UsersIcon } from "@heroicons/react/24/outline";
import classNames from "classnames";
import { OfficeFolder } from "le-coffre-resources/dist/Notary"; import { OfficeFolder } from "le-coffre-resources/dist/Notary";
import Link from "next/link";
import { useMemo } from "react"; import { useMemo } from "react";
import { AnchorStatus } from ".."; import { AnchorStatus } from "..";
import classes from "./classes.module.scss"; import classes from "./classes.module.scss";
import Link from "next/link";
type IProps = { type IProps = {
folder: OfficeFolder | null; folder: OfficeFolder | null;
@ -24,7 +25,7 @@ type IProps = {
export default function InformationSection(props: IProps) { export default function InformationSection(props: IProps) {
const { folder, progress, onArchive, anchorStatus, isArchived } = props; const { folder, progress, onArchive, anchorStatus, isArchived } = props;
const menuItems = useMemo(() => { const menuItemsDekstop = useMemo(() => {
let elements: IItem[] = []; let elements: IItem[] = [];
// Creating the three elements and adding them conditionnally // Creating the three elements and adding them conditionnally
@ -48,17 +49,71 @@ export default function InformationSection(props: IProps) {
// If the folder is not anchored, we can modify the collaborators and the informations // If the folder is not anchored, we can modify the collaborators and the informations
if (anchorStatus === AnchorStatus.NOT_ANCHORED) { if (anchorStatus === AnchorStatus.NOT_ANCHORED) {
elements.push(modifyCollaboratorsElement); elements.push(modifyCollaboratorsElement);
elements.push(modifyInformationsElement); elements.push(modifyInformationsElement);
} }
return elements; return elements;
}, [anchorStatus, folder?.uid]); }, [anchorStatus, folder?.uid]);
const menuItemsMobile = useMemo(() => {
let elements: IItem[] = [];
// Creating the three elements and adding them conditionnally
const modifyCollaboratorsElement = {
icon: <UsersIcon />,
text: "Modifier les collaborateurs",
link: Module.getInstance()
.get()
.modules.pages.Folder.pages.EditCollaborators.props.path.replace("[folderUid]", folder?.uid ?? ""),
hasSeparator: true,
};
const modifyInformationsElement = {
icon: <PencilSquareIcon />,
text: "Modifier les informations du dossier",
link: Module.getInstance()
.get()
.modules.pages.Folder.pages.EditInformations.props.path.replace("[folderUid]", folder?.uid ?? ""),
hasSeparator: true,
};
// If the folder is not anchored, we can modify the collaborators and the informations
if (anchorStatus === AnchorStatus.NOT_ANCHORED) {
elements.push(modifyCollaboratorsElement);
elements.push(modifyInformationsElement);
}
elements.push({
icon: <PaperAirplaneIcon />,
text: "Envoyer des documents",
link: Module.getInstance()
.get()
.modules.pages.Folder.pages.SendDocuments.props.path.replace("[folderUid]", folder?.uid ?? ""),
hasSeparator: !isArchived,
});
if (!isArchived) {
elements.push({
icon: <ArchiveBoxIcon />,
text: "Archiver le dossier",
onClick: onArchive,
hasSeparator: false,
});
}
return elements;
}, [anchorStatus, folder?.uid, isArchived, onArchive]);
return ( return (
<section className={classes["root"]}> <section className={classes["root"]}>
<div className={classes["info-box1"]}> <div className={classes["info-box1"]}>
<div> <div>
<Typography typo={ETypo.TEXT_MD_REGULAR}>{folder?.folder_number}</Typography> <div className={classes["folder-number-container"]}>
<Typography typo={ETypo.TEXT_MD_REGULAR}>{folder?.folder_number}</Typography>
<div className={classNames(classes["icon-container"], classes["mobile"])}>
<Menu items={menuItemsMobile}>
<IconButton icon={<EllipsisHorizontalIcon />} variant={EIconButtonVariant.NEUTRAL} />
</Menu>
</div>
</div>
<Typography typo={ETypo.TITLE_H4}>{folder?.name}</Typography> <Typography typo={ETypo.TITLE_H4}>{folder?.name}</Typography>
</div> </div>
@ -69,13 +124,22 @@ export default function InformationSection(props: IProps) {
{folder?.created_at ? new Date(folder.created_at).toLocaleDateString() : ""} {folder?.created_at ? new Date(folder.created_at).toLocaleDateString() : ""}
</Typography> </Typography>
</div> </div>
<div className={classNames(classes["description-container"], classes["ipad"])}>
<Typography typo={ETypo.TEXT_MD_REGULAR} color={ETypoColor.COLOR_NEUTRAL_700}>
Note du dossier
</Typography>
<Typography typo={ETypo.TEXT_LG_REGULAR} className={classes["text"]}>
{folder?.description}
</Typography>
</div>
</div> </div>
<div className={classes["separator"]} /> <div className={classes["separator"]} />
<div className={classes["info-box2"]}> <div className={classes["info-box2"]}>
<div className={classes["progress-container"]}> <div className={classes["progress-container"]}>
<CircleProgress percentage={progress} /> <CircleProgress percentage={progress} />
<div className={classes["icon-container"]}> <div className={classNames(classes["icon-container"], classes["desktop"])}>
<Link <Link
href={Module.getInstance() href={Module.getInstance()
.get() .get()
@ -83,13 +147,14 @@ export default function InformationSection(props: IProps) {
title="Envoyer des documents"> title="Envoyer des documents">
<IconButton icon={<PaperAirplaneIcon />} variant={EIconButtonVariant.NEUTRAL} /> <IconButton icon={<PaperAirplaneIcon />} variant={EIconButtonVariant.NEUTRAL} />
</Link> </Link>
<Menu items={menuItems}>
<Menu items={menuItemsDekstop}>
<IconButton icon={<EllipsisHorizontalIcon />} variant={EIconButtonVariant.NEUTRAL} /> <IconButton icon={<EllipsisHorizontalIcon />} variant={EIconButtonVariant.NEUTRAL} />
</Menu> </Menu>
{!isArchived && <IconButton onClick={onArchive} icon={<ArchiveBoxIcon />} variant={EIconButtonVariant.ERROR} />} {!isArchived && <IconButton onClick={onArchive} icon={<ArchiveBoxIcon />} variant={EIconButtonVariant.ERROR} />}
</div> </div>
</div> </div>
<div className={classes["description-container"]}> <div className={classNames(classes["description-container"], classes["desktop"], classes["mobile"])}>
<Typography typo={ETypo.TEXT_MD_REGULAR} color={ETypoColor.COLOR_NEUTRAL_700}> <Typography typo={ETypo.TEXT_MD_REGULAR} color={ETypoColor.COLOR_NEUTRAL_700}>
Note du dossier Note du dossier
</Typography> </Typography>

View File

@ -3,7 +3,7 @@
.root { .root {
.content { .content {
display: flex; display: flex;
width: 648px; max-width: 648px;
flex-direction: column; flex-direction: column;
justify-content: center; justify-content: center;
gap: var(--spacing-2xl, 40px); gap: var(--spacing-2xl, 40px);
@ -14,8 +14,8 @@
gap: var(--spacing-md, 16px); gap: var(--spacing-md, 16px);
align-self: stretch; align-self: stretch;
.logo{ .logo {
fill: "red" fill: "red";
} }
} }
@ -39,17 +39,23 @@
display: flex; display: flex;
gap: var(--spacing-lg, 24px); gap: var(--spacing-lg, 24px);
.box { @media screen and (max-width: 600px) {
display: flex;
flex-direction: column; flex-direction: column;
gap: var(--spacing-sm, 8px);
}
.separator {
background-color: var(--separator-stroke-light);
width: 1px;
align-self: stretch;
} }
} }
} }
.mobile {
display: none;
@media screen and (max-width: 600px) {
display: flex;
}
}
.desktop {
display: flex;
@media screen and (max-width: 600px) {
display: none;
}
}
} }

View File

@ -1,9 +1,12 @@
import LogoIcon from "@Assets/logo_small_blue.svg"; import LogoIcon from "@Assets/logo_small_blue.svg";
import Folders from "@Front/Api/LeCoffreApi/Notary/Folders/Folders"; import Folders from "@Front/Api/LeCoffreApi/Notary/Folders/Folders";
import Button, { EButtonSize, EButtonstyletype, EButtonVariant } from "@Front/Components/DesignSystem/Button"; import Button, { EButtonVariant } from "@Front/Components/DesignSystem/Button";
import Separator, { ESeperatorColor, ESeperatorDirection } from "@Front/Components/DesignSystem/Separator";
import Typography, { ETypo, ETypoColor } from "@Front/Components/DesignSystem/Typography"; import Typography, { ETypo, ETypoColor } from "@Front/Components/DesignSystem/Typography";
import HelpBox from "@Front/Components/Elements/HelpBox";
import DefaultNotaryDashboard from "@Front/Components/LayoutTemplates/DefaultNotaryDashboard"; import DefaultNotaryDashboard from "@Front/Components/LayoutTemplates/DefaultNotaryDashboard";
import Module from "@Front/Config/Module"; import Module from "@Front/Config/Module";
import useUser from "@Front/Hooks/useUser";
import { DocumentIcon } from "@heroicons/react/24/outline"; import { DocumentIcon } from "@heroicons/react/24/outline";
import EFolderStatus from "le-coffre-resources/dist/Customer/EFolderStatus"; import EFolderStatus from "le-coffre-resources/dist/Customer/EFolderStatus";
import Image from "next/image"; import Image from "next/image";
@ -12,7 +15,6 @@ import { useRouter } from "next/router";
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import classes from "./classes.module.scss"; import classes from "./classes.module.scss";
import useUser from "@Front/Hooks/useUser";
export default function Folder() { export default function Folder() {
const [_isArchivedModalOpen, _setIsArchivedModalOpen] = useState(true); const [_isArchivedModalOpen, _setIsArchivedModalOpen] = useState(true);
@ -37,7 +39,6 @@ export default function Folder() {
); );
}); });
}, [router]); }, [router]);
return ( return (
<DefaultNotaryDashboard title={"Dossier"} mobileBackText={"Liste des dossiers"}> <DefaultNotaryDashboard title={"Dossier"} mobileBackText={"Liste des dossiers"}>
<div className={classes["root"]}> <div className={classes["root"]}>
@ -80,22 +81,25 @@ export default function Folder() {
</div> </div>
<div className={classes["help-container"]}> <div className={classes["help-container"]}>
<div className={classes["box"]}> <HelpBox
<Typography typo={ETypo.TEXT_MD_SEMIBOLD}>Besoin d'aide ?</Typography> title="Besoin d'aide ?"
<Typography typo={ETypo.TEXT_MD_REGULAR}>Consultez nos guides pour bien démarrer.</Typography> description="Consultez nos guides pour bien démarrer."
<Button variant={EButtonVariant.SECONDARY} styletype={EButtonstyletype.TEXT} size={EButtonSize.MD}> button={{ text: "Accéder aux guides" }}
Accéder aux guides />
</Button>
</div>
<div className={classes["separator"]} />
<div className={classes["box"]}> <Separator
<Typography typo={ETypo.TEXT_MD_SEMIBOLD}>Vous avez des questions ?</Typography> className={classes["desktop"]}
<Typography typo={ETypo.TEXT_MD_REGULAR}>Notre équipe de support est pour vous aider.</Typography> direction={ESeperatorDirection.VERTICAL}
<Button variant={EButtonVariant.SECONDARY} styletype={EButtonstyletype.TEXT} size={EButtonSize.MD}> size={128}
Contactez le support color={ESeperatorColor.LIGHT}
</Button> />
</div> <Separator className={classes["mobile"]} direction={ESeperatorDirection.HORIZONTAL} color={ESeperatorColor.LIGHT} />
<HelpBox
title="Vous avez des questions ?"
description="Notre équipe de support est là pour vous aider."
button={{ text: "Contactez le support" }}
/>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,21 +1,34 @@
@import "@Themes/constants.scss";
@import "@Themes/animation.scss"; @import "@Themes/animation.scss";
@import "@Themes/constants.scss";
.root { .root {
height: 100%; margin: 80px auto;
width: 100%; width: 474px;
display: flex; display: flex;
flex-direction: column;
gap: var(--spacing-xl, 32px);
.content { @media (max-width: $screen-s) {
width: 100%;
margin: auto; margin: auto;
padding: var(--spacing-md, 16px);
.text {
margin: 32px 0;
}
@media(max-width: $screen-s) {
text-align: center;
}
} }
} .content {
display: flex;
padding: var(--spacing-xl, 32px) var(--spacing-lg, 24px);
flex-direction: column;
gap: var(--spacing-lg, 24px);
border-radius: var(--radius-rounded, 16px);
background: var(--background-primary, #fff);
box-shadow: 0px 4px 16px 0px rgba(0, 0, 0, 0.1);
.text {
display: flex;
flex-direction: column;
gap: var(--spacing-sm);
}
}
}

View File

@ -1,27 +1,51 @@
import backgroundImage from "@Assets/images/background_refonte.svg";
import LogoIcon from "@Assets/logo_small_blue.svg";
import Button from "@Front/Components/DesignSystem/Button"; import Button from "@Front/Components/DesignSystem/Button";
import Typography, { ETypo } from "@Front/Components/DesignSystem/Typography"; import Typography, { ETypo, ETypoColor } from "@Front/Components/DesignSystem/Typography";
import HelpBox from "@Front/Components/Elements/HelpBox";
import DefaultDoubleSidePage from "@Front/Components/LayoutTemplates/DefaultDoubleSidePage";
import Module from "@Front/Config/Module"; import Module from "@Front/Config/Module";
import Image from "next/image";
import Link from "next/link"; import Link from "next/link";
import BasePage from "../Base"; import BasePage from "../Base";
import classes from "./classes.module.scss"; import classes from "./classes.module.scss";
import DefaultDoubleSidePage from "@Front/Components/LayoutTemplates/DefaultDoubleSidePage";
import backgroundImage from "@Assets/images/404-background-image.jpeg";
export default class PageNotFound extends BasePage { export default class PageNotFound extends BasePage {
public override render(): JSX.Element { public override render(): JSX.Element {
return ( return (
<DefaultDoubleSidePage title={"Project Not Found"} image={backgroundImage} type="background" showHeader> <DefaultDoubleSidePage title={"Project Not Found"} image={backgroundImage} type="background" showHeader>
<div className={classes["root"]}> <div className={classes["root"]}>
<div className={classes["content"]}> <div className={classes["title-container"]}>
<Typography typo={ETypo.DISPLAY_LARGE}>Erreur 404</Typography> <Image src={LogoIcon} alt="logo" width={56} />
<Typography typo={ETypo.TEXT_LG_REGULAR} className={classes["text"]}> <Typography typo={ETypo.TITLE_H1} color={ETypoColor.TEXT_ACCENT}>
La page que vous recherchez semble introuvable. Oups ! Page introuvable
</Typography> </Typography>
<Typography typo={ETypo.TITLE_H5} color={ETypoColor.TEXT_PRIMARY}>
Il semble que la page que vous recherchez n'existe pas ou a é déplacée.
</Typography>
</div>
<div className={classes["content"]}>
<div className={classes["text"]}>
<Typography typo={ETypo.TEXT_LG_SEMIBOLD} color={ETypoColor.TEXT_PRIMARY}>
Pas de panique ! Voici ce que vous pouvez faire :
</Typography>
<Typography typo={ETypo.TEXT_MD_REGULAR} color={ETypoColor.TEXT_SECONDARY}>
Retourner à la page d'accueil en cliquant sur le bouton ci-dessous.
</Typography>
<Typography typo={ETypo.TEXT_MD_REGULAR} color={ETypoColor.TEXT_SECONDARY}>
Contactez-nous si vous avez besoin d'aide.
</Typography>
</div>
<Link href={Module.getInstance().get().modules.pages.Home.props.path}> <Link href={Module.getInstance().get().modules.pages.Home.props.path}>
<Button>Retour à l'accueil</Button> <Button>Retour à l'accueil</Button>
</Link> </Link>
</div> </div>
<HelpBox
title="Vous avez des questions ?"
description="Notre équipe de support est là pour vous aider."
button={{ text: "Contactez le support" }}
/>
</div> </div>
</DefaultDoubleSidePage> </DefaultDoubleSidePage>
); );

View File

@ -36,6 +36,15 @@
"props": { "props": {
"path": "/client-dashboard/[folderUid]", "path": "/client-dashboard/[folderUid]",
"labelKey": "client-dashboard" "labelKey": "client-dashboard"
},
"pages": {
"ReceiveDocuments": {
"enabled": true,
"props": {
"path": "/client-dashboard/[folderUid]/received-documents",
"labelKey": "received_documents"
}
}
} }
}, },
"Folder": { "Folder": {
@ -52,6 +61,13 @@
"labelKey": "folder_information" "labelKey": "folder_information"
} }
}, },
"DocumentsReminderHistory": {
"enabled": true,
"props": {
"path": "/folders/[folderUid]/documents-reminder-history",
"labelKey": "documents_reminder_history"
}
},
"CreateFolder": { "CreateFolder": {
"enabled": true, "enabled": true,
"props": { "props": {

View File

@ -36,6 +36,15 @@
"props": { "props": {
"path": "/client-dashboard/[folderUid]", "path": "/client-dashboard/[folderUid]",
"labelKey": "client-dashboard" "labelKey": "client-dashboard"
},
"pages": {
"ReceiveDocuments": {
"enabled": true,
"props": {
"path": "/client-dashboard/[folderUid]/received-documents",
"labelKey": "received_documents"
}
}
} }
}, },
"Folder": { "Folder": {
@ -52,6 +61,13 @@
"labelKey": "folder_information" "labelKey": "folder_information"
} }
}, },
"DocumentsReminderHistory": {
"enabled": true,
"props": {
"path": "/folders/[folderUid]/documents-reminder-history",
"labelKey": "documents_reminder_history"
}
},
"CreateFolder": { "CreateFolder": {
"enabled": true, "enabled": true,
"props": { "props": {

View File

@ -36,6 +36,15 @@
"props": { "props": {
"path": "/client-dashboard/[folderUid]", "path": "/client-dashboard/[folderUid]",
"labelKey": "client-dashboard" "labelKey": "client-dashboard"
},
"pages": {
"ReceiveDocuments": {
"enabled": true,
"props": {
"path": "/client-dashboard/[folderUid]/received-documents",
"labelKey": "received_documents"
}
}
} }
}, },
"Folder": { "Folder": {
@ -52,6 +61,13 @@
"labelKey": "folder_information" "labelKey": "folder_information"
} }
}, },
"DocumentsReminderHistory": {
"enabled": true,
"props": {
"path": "/folders/[folderUid]/documents-reminder-history",
"labelKey": "documents_reminder_history"
}
},
"CreateFolder": { "CreateFolder": {
"enabled": true, "enabled": true,
"props": { "props": {

View File

@ -36,6 +36,15 @@
"props": { "props": {
"path": "/client-dashboard/[folderUid]", "path": "/client-dashboard/[folderUid]",
"labelKey": "client-dashboard" "labelKey": "client-dashboard"
},
"pages": {
"ReceiveDocuments": {
"enabled": true,
"props": {
"path": "/client-dashboard/[folderUid]/received-documents",
"labelKey": "received_documents"
}
}
} }
}, },
"Folder": { "Folder": {
@ -52,6 +61,13 @@
"labelKey": "folder_information" "labelKey": "folder_information"
} }
}, },
"DocumentsReminderHistory": {
"enabled": true,
"props": {
"path": "/folders/[folderUid]/documents-reminder-history",
"labelKey": "documents_reminder_history"
}
},
"CreateFolder": { "CreateFolder": {
"enabled": true, "enabled": true,
"props": { "props": {

View File

@ -0,0 +1,5 @@
import ReceivedDocuments from "@Front/Components/Layouts/ClientDashboard/ReceivedDocuments";
export default function Route() {
return <ReceivedDocuments />;
}

View File

@ -0,0 +1,5 @@
import DocumentsReminderHistory from "@Front/Components/Layouts/Folder/DocumentsReminderHistory";
export default function Route() {
return <DocumentsReminderHistory />;
}