This commit is contained in:
OxSaitama 2023-05-12 09:48:17 +02:00
commit 81e49541fa
35 changed files with 400 additions and 227 deletions

1
.ssh/id_rsa.pub Normal file
View File

@ -0,0 +1 @@
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDOfOFPvQNw5XguFuX1YNvED8ulP+tIA/5xw7LHcA0gRj3hwILCAEAjuDs+d13zCsnEb0yd+laT3PU9iRIKa28Tynu+sTjGDyfx8MX/HjJtbEzyd6jLn87uTvw/6lzg2y5ZDEa6PEqrPIv0KEhuq6HuU8qAA0nBpsTIAUTK3XR8qm3I6J9Rs1JyBjvIP5UeICApvoLmgHuz6mKdvoQ8qKDWamsL4pSc4Hr7HlQ8ITNhnyS8XMgQInU/I2TzT/I4Dxx5IeFUQ5KOfJJNgK1d+PByLSWUrn+eRXki8m1hjMiwGIehVAriFW1C309SEHxLHjQKUPXHSv4kH7zqjO+p3kY5gwp/lvsBRSnihj8s1lADsJlMqjnSLeIQ+sY2CNkmXXI8ABkzhuJKTGTl+8pzGGhIHzeU7e7lpSn3gLn4p217kIppHNAr6dZH9UaYbgnwVonwr5cLbatRPFyI1NfXKDyZtSYlGQxLQUt9KDrNvVTZzaTt3YwM/YCsRIADAagKosM= gisele-smartchain@MacBook-Pro-6.local

44
Dockerfile.front Normal file
View File

@ -0,0 +1,44 @@
# Install dependencies only when needed
FROM node:19-alpine AS deps
WORKDIR leCoffre-front
COPY package.json ./
RUN apk update && apk add openssh-client git
COPY id_rsa /root/.ssh/id_rsa
RUN chmod 600 ~/.ssh/id_rsa
RUN eval "$(ssh-agent -s)" && ssh-add /root/.ssh/id_rsa
RUN ssh-keyscan github.com smart-chain-fr/leCoffre-resources.git >> /root/.ssh/known_hosts
RUN npm install --frozen-lockfile
# Rebuild the source code only when needed
FROM node:19-alpine AS builder
WORKDIR leCoffre-front
COPY --from=deps leCoffre-front/node_modules ./node_modules
COPY --from=deps leCoffre-front/package.json package.json
COPY tsconfig.json tsconfig.json
COPY src src
RUN npm run build
# Production image, copy all the files and run next
FROM node:19-alpine AS production
WORKDIR leCoffre-front
RUN adduser -D lecoffreuser --uid 10000 && chown -R lecoffreuser .
COPY public ./public
COPY --from=builder --chown=lecoffreuser leCoffre-front/node_modules ./node_modules
COPY --from=builder --chown=lecoffreuser leCoffre-front/.next ./.next
COPY --from=builder --chown=lecoffreuser leCoffre-front/package.json ./package.json
USER lecoffreuser
CMD ["npm", "run", "start"]
EXPOSE 3000

View File

@ -1,7 +1,6 @@
import { File } from "le-coffre-resources/dist/SuperAdmin"; import { File } from "le-coffre-resources/dist/SuperAdmin";
import BaseSuperAdmin from "../BaseSuperAdmin"; import BaseSuperAdmin from "../BaseSuperAdmin";
// TODO Type get query params -> Where + inclue + orderby // TODO Type get query params -> Where + inclue + orderby
export interface IGetFilesparams { export interface IGetFilesparams {
where?: {}; where?: {};
@ -53,10 +52,9 @@ export default class Files extends BaseSuperAdmin {
} }
public getUploadLink(uid: string): string { public getUploadLink(uid: string): string {
return this.baseURl.concat(`/upload/${uid}`); return this.baseURl.concat(`/download/${uid}`);
} }
public async getByUid(uid: string, q?: any): Promise<File> { public async getByUid(uid: string, q?: any): Promise<File> {
const url = new URL(this.baseURl.concat(`/${uid}`)); const url = new URL(this.baseURl.concat(`/${uid}`));
const query = { q }; const query = { q };

View File

@ -0,0 +1,3 @@
<svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M18 6L8.375 16L4 11.4545" stroke="#12BF4D" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 221 B

View File

@ -1,3 +1,6 @@
.container {
.root { .root {
padding: 24px; padding: 24px;
background-color: var(--white); background-color: var(--white);
@ -30,6 +33,10 @@
.right { .right {
margin-left: 18px; margin-left: 18px;
.validated {
color: var(--green-flash);
}
.refused-button { .refused-button {
font-size: 14px; font-size: 14px;
color: var(--re-hover); color: var(--re-hover);
@ -59,6 +66,10 @@
display: flex; display: flex;
align-items: center; align-items: center;
gap: 8px; gap: 8px;
.loader {
width: 32px;
height: 32px;
}
} }
.cross { .cross {
@ -89,3 +100,9 @@
flex-direction: column; flex-direction: column;
gap: 16px; gap: 16px;
} }
.error-message {
color: var(--red-flash);
margin-top: 8px;
}
}

View File

@ -15,6 +15,8 @@ import { EDocumentStatus } from "le-coffre-resources/dist/Customer/Document";
import classNames from "classnames"; import classNames from "classnames";
import Confirm from "../Modal/Confirm"; import Confirm from "../Modal/Confirm";
import InputField from "../Form/Elements/InputField"; import InputField from "../Form/Elements/InputField";
import GreenCheckIcon from "@Assets/Icons/green-check.svg";
import Loader from "../Loader";
type IProps = { type IProps = {
defaultFiles?: FileCustomer[]; defaultFiles?: FileCustomer[];
@ -27,6 +29,7 @@ type IFile = {
file: File; file: File;
uid: string; uid: string;
archived: Date | null; archived: Date | null;
fileName: string;
}; };
type IState = { type IState = {
@ -35,6 +38,7 @@ type IState = {
currentFiles?: FileCustomer[]; currentFiles?: FileCustomer[];
refusedReason?: string; refusedReason?: string;
isShowRefusedReasonModalVisible: boolean; isShowRefusedReasonModalVisible: boolean;
loading: boolean;
}; };
export default class DepositDocument extends React.Component<IProps, IState> { export default class DepositDocument extends React.Component<IProps, IState> {
@ -50,6 +54,7 @@ export default class DepositDocument extends React.Component<IProps, IState> {
currentFiles: this.props.defaultFiles, currentFiles: this.props.defaultFiles,
refusedReason: "", refusedReason: "",
isShowRefusedReasonModalVisible: false, isShowRefusedReasonModalVisible: false,
loading: false,
}; };
this.addDocument = this.addDocument.bind(this); this.addDocument = this.addDocument.bind(this);
@ -65,6 +70,7 @@ export default class DepositDocument extends React.Component<IProps, IState> {
public override render(): JSX.Element { public override render(): JSX.Element {
return ( return (
<div className={classes["container"]}>
<div <div
className={classNames( className={classNames(
classes["root"], classes["root"],
@ -82,10 +88,19 @@ export default class DepositDocument extends React.Component<IProps, IState> {
<div className={classes["separator"]} /> <div className={classes["separator"]} />
<div className={classes["right"]}> <div className={classes["right"]}>
<Typography typo={ITypo.P_SB_16} color={ITypoColor.BLACK} className={classes["title"]}> <Typography typo={ITypo.P_SB_16} color={ITypoColor.BLACK} className={classes["title"]}>
{this.props.document.document_type?.name}{" "} <div
{this.props.document.document_type?.public_description !== "" && ( className={
this.props.document.document_status === EDocumentStatus.VALIDATED ? classes["validated"] : ""
}>
{this.props.document.document_type?.name}
</div>
{this.props.document.document_type?.public_description !== "" &&
this.props.document.document_status !== EDocumentStatus.VALIDATED && (
<Tooltip text={this.props.document.document_type?.public_description} /> <Tooltip text={this.props.document.document_type?.public_description} />
)} )}
{this.props.document.document_status === EDocumentStatus.VALIDATED && (
<Image src={GreenCheckIcon} alt="Document check" />
)}
</Typography> </Typography>
{this.props.document.document_status !== EDocumentStatus.VALIDATED && ( {this.props.document.document_status !== EDocumentStatus.VALIDATED && (
<Typography color={ITypoColor.GREY} typo={ITypo.CAPTION_14}> <Typography color={ITypoColor.GREY} typo={ITypo.CAPTION_14}>
@ -107,7 +122,7 @@ export default class DepositDocument extends React.Component<IProps, IState> {
<div className={classes["left-part"]}> <div className={classes["left-part"]}>
<Image src={DocumentCheckIcon} alt="Document check" /> <Image src={DocumentCheckIcon} alt="Document check" />
<Typography typo={ITypo.P_16} color={ITypoColor.GREY}> <Typography typo={ITypo.P_16} color={ITypoColor.GREY}>
{this.shortName(fileObj.name)} {this.shortName(file.fileName || fileObj.name)}
</Typography> </Typography>
</div> </div>
<Image <Image
@ -120,6 +135,19 @@ export default class DepositDocument extends React.Component<IProps, IState> {
</div> </div>
); );
})} })}
{this.state.loading && (
<div className={classes["file-container"]}>
<div className={classes["left-part"]}>
<div className={classes["loader"]}>
<Loader />
</div>
<Typography typo={ITypo.P_16} color={ITypoColor.GREY}>
Chargement...
</Typography>
</div>
<div />
</div>
)}
</div> </div>
)} )}
{this.props.document.document_status !== EDocumentStatus.VALIDATED && ( {this.props.document.document_status !== EDocumentStatus.VALIDATED && (
@ -147,6 +175,12 @@ export default class DepositDocument extends React.Component<IProps, IState> {
</div> </div>
</Confirm> </Confirm>
</div> </div>
{this.props.document.document_status === EDocumentStatus.REFUSED && (
<Typography typo={ITypo.CAPTION_14} className={classes["error-message"]}>
Ce document nest pas conforme. Veuillez le déposer à nouveau.
</Typography>
)}
</div>
); );
} }
@ -157,6 +191,7 @@ export default class DepositDocument extends React.Component<IProps, IState> {
index: this.index++, index: this.index++,
file: new File([""], file.file_path ?? "", {}), file: new File([""], file.file_path ?? "", {}),
uid: file.uid!, uid: file.uid!,
fileName: file.file_name,
archived: file.archived_at ? new Date(file.archived_at) : null, archived: file.archived_at ? new Date(file.archived_at) : null,
})), })),
}); });
@ -259,12 +294,15 @@ export default class DepositDocument extends React.Component<IProps, IState> {
formData.append("file", file, file.name); formData.append("file", file, file.name);
const query = JSON.stringify({ document: { uid: this.props.document.uid } }); const query = JSON.stringify({ document: { uid: this.props.document.uid } });
formData.append("q", query); formData.append("q", query);
this.setState({
loading: true,
});
const newFile = await Files.getInstance().post(formData); const newFile = await Files.getInstance().post(formData);
const files = this.state.currentFiles ? [...this.state.currentFiles, newFile] : [newFile]; const files = this.state.currentFiles ? [...this.state.currentFiles, newFile] : [newFile];
this.setState({ this.setState({
currentFiles: files, currentFiles: files,
loading: false,
files: [ files: [
...this.state.files, ...this.state.files,
{ {
@ -272,6 +310,7 @@ export default class DepositDocument extends React.Component<IProps, IState> {
file: file, file: file,
uid: newFile.uid!, uid: newFile.uid!,
archived: null, archived: null,
fileName: newFile?.file_name ?? "",
}, },
], ],
}); });

View File

@ -58,9 +58,13 @@ class DocumentNotaryClass extends React.Component<IPropsClass, IState> {
return fileName; return fileName;
} }
} else { } else {
const archivedFilesLenght = documentFiles.filter((file) => file.archived_at).length; const archivedFilesLength = documentFiles.filter((file) => file.archived_at).length;
const documentFileLenght = documentFiles.length - archivedFilesLenght; const documentFileLength = documentFiles.length - archivedFilesLength;
return `${documentFileLenght} documents déposés`; if(this.props.document.document_status === EDocumentStatus.ASKED || this.props.document.document_status === EDocumentStatus.REFUSED){
return 'Aucun document déposé';
}
return `${documentFileLength} documents déposés`;
} }
} else { } else {
return "Aucun document déposé"; return "Aucun document déposé";

View File

@ -5,12 +5,14 @@ import classes from "./classes.module.scss";
type IProps = { type IProps = {
href: string; href: string;
fileName?: string;
}; };
type IState = {}; type IState = {};
export default class FilePreview extends React.Component<IProps, IState> { export default class FilePreview extends React.Component<IProps, IState> {
override render() { override render() {
const type = this.props.href.split(".").pop(); let type = this.props.href.split(".").pop();
if(this.props.fileName) type = this.props.fileName.split(".").pop();
return ( return (
<div className={classes["root"]}> <div className={classes["root"]}>
{!type && ( {!type && (
@ -18,14 +20,12 @@ export default class FilePreview extends React.Component<IProps, IState> {
Erreur lors du chargement du fichier Erreur lors du chargement du fichier
</Typography> </Typography>
)} )}
{type && (
<div className={classes["file-container"]}> <div className={classes["file-container"]}>
{type === "pdf" && ( {type?.toLowerCase() === "pdf" && (
<embed src={this.props.href} width="100%" height="100%" type="application/pdf" className={classes["pdf"]} /> <embed src={this.props.href} width="100%" height="100%" type="application/pdf" className={classes["pdf"]} />
)} )}
{type !== "pdf" && <img src={this.props.href} alt="File preview" className={classes["image"]} />} {type?.toLowerCase() !== "pdf" && <img src={this.props.href} alt="File preview" className={classes["image"]} />}
</div> </div>
)}
</div> </div>
); );
} }

View File

@ -2,7 +2,11 @@
.root { .root {
height: calc(100vh - 290px); height: calc(100vh - 290px);
overflow: scroll; overflow-y: scroll;
&.archived{
height: calc(100vh - 220px);
}
.active { .active {
background-color: var(--grey-medium); background-color: var(--grey-medium);

View File

@ -7,6 +7,7 @@ import React from "react";
import FolderContainer from "../FolderContainer"; import FolderContainer from "../FolderContainer";
import classes from "./classes.module.scss"; import classes from "./classes.module.scss";
import classNames from "classnames";
type IProps = { type IProps = {
folders: IDashBoardFolder[]; folders: IDashBoardFolder[];
@ -26,7 +27,7 @@ class FolderListClass extends React.Component<IPropsClass, IState> {
? Module.getInstance().get().modules.pages.Folder.pages.FolderArchived.pages.FolderInformation.props.path ? Module.getInstance().get().modules.pages.Folder.pages.FolderArchived.pages.FolderInformation.props.path
: Module.getInstance().get().modules.pages.Folder.pages.FolderInformation.props.path; : Module.getInstance().get().modules.pages.Folder.pages.FolderInformation.props.path;
public override render(): JSX.Element { public override render(): JSX.Element {
return <div className={classes["root"]}>{this.renderFolders()}</div>; return <div className={classNames(classes["root"], this.props.isArchived ? classes["archived"]:"")}>{this.renderFolders()}</div>;
} }
private renderFolders(): JSX.Element[] { private renderFolders(): JSX.Element[] {

View File

@ -1,4 +1,5 @@
import { IDashBoardFolder } from "@Front/Components/LayoutTemplates/DefaultNotaryDashboard"; import { IDashBoardFolder } from "@Front/Components/LayoutTemplates/DefaultNotaryDashboard";
import Module from "@Front/Config/Module";
import Link from "next/link"; import Link from "next/link";
import React from "react"; import React from "react";
@ -6,7 +7,6 @@ import Button from "../Button";
import FolderList from "../FolderList"; import FolderList from "../FolderList";
import SearchBar from "../SearchBar"; import SearchBar from "../SearchBar";
import classes from "./classes.module.scss"; import classes from "./classes.module.scss";
import Module from "@Front/Config/Module";
type IProps = { type IProps = {
folders: IDashBoardFolder[]; folders: IDashBoardFolder[];
@ -44,13 +44,13 @@ export default class FolderListContainer extends React.Component<IProps, IState>
/> />
</div> </div>
</div> </div>
<div>
{!this.props.isArchived && ( {!this.props.isArchived && (
<div>
<Link href={navigatePath}> <Link href={navigatePath}>
<Button fullwidth={true}>Créer un dossier</Button> <Button fullwidth={true}>Créer un dossier</Button>
</Link> </Link>
)}
</div> </div>
)}
</div> </div>
); );
} }

View File

@ -10,6 +10,9 @@ import BurgerMenu from "./BurgerMenu";
import WindowStore from "@Front/Stores/WindowStore"; import WindowStore from "@Front/Stores/WindowStore";
import Module from "@Front/Config/Module"; import Module from "@Front/Config/Module";
import Head from "next/head"; import Head from "next/head";
import { useRouter } from "next/router";
import LogoCielNatureIcon from "./logo-ciel-notaires.jpeg";
enum EHeaderOpeningState { enum EHeaderOpeningState {
OPEN = "open", OPEN = "open",
CLOSED = "closed", CLOSED = "closed",
@ -19,6 +22,11 @@ enum EHeaderOpeningState {
type IProps = { type IProps = {
isUserConnected: boolean; isUserConnected: boolean;
}; };
type IPropsClass = IProps & {
isOnCustomerLoginPage: boolean;
};
type IState = { type IState = {
open: EHeaderOpeningState; open: EHeaderOpeningState;
isBurgerMenuOpen: boolean; isBurgerMenuOpen: boolean;
@ -26,11 +34,11 @@ type IState = {
isProfileMenuOpen: boolean; isProfileMenuOpen: boolean;
}; };
export default class Header extends React.Component<IProps, IState> { class HeaderClass extends React.Component<IPropsClass, IState> {
private onWindowResize = () => {}; private onWindowResize = () => {};
private headerBreakpoint = 1300; private headerBreakpoint = 1300;
constructor(props: IProps) { constructor(props: IPropsClass) {
super(props); super(props);
this.state = { this.state = {
@ -85,6 +93,7 @@ export default class Header extends React.Component<IProps, IState> {
</div> </div>
</> </>
)} )}
{this.props.isOnCustomerLoginPage && <Image width={70} height={70} alt="ciel-nature" src={LogoCielNatureIcon}></Image>}
</div> </div>
); );
} }
@ -126,3 +135,10 @@ export default class Header extends React.Component<IProps, IState> {
this.setState({ isProfileMenuOpen: false }); this.setState({ isProfileMenuOpen: false });
} }
} }
export default function Header(props: IProps) {
const router = useRouter();
const { pathname } = router;
let isActive = Module.getInstance().get().modules.pages.CustomersLogin.props.path === pathname;
return <HeaderClass {...props} isOnCustomerLoginPage={isActive} />;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

View File

@ -1,16 +1,15 @@
@import "@Themes/constants.scss"; @keyframes s2 {
to {
transform: rotate(1turn);
}
}
.loader { .root {
animation: spin 2s linear infinite;
width: 100%; width: 100%;
height: 100%; height: 100%;
border-radius: 50%;
@keyframes spin { border: 8px solid;
from { border-color: var(--grey-soft);
transform: rotate(0deg); border-right-color: var(--blue-soft);
} animation: s2 1s infinite linear;
to {
transform: rotate(360deg);
}
}
} }

View File

@ -1,14 +1,11 @@
import React from "react"; import React from "react";
import LoaderIcon from "@Assets/Icons/loader.svg";
import classes from "./classes.module.scss"; import classes from "./classes.module.scss";
import Image from "next/image";
interface IProps { interface IProps {
className?: string; className?: string;
} }
export default class Loader extends React.Component<IProps> { export default class Loader extends React.Component<IProps> {
public override render(): JSX.Element { public override render(): JSX.Element {
return <Image src={LoaderIcon} className={[classes["loader"], this.props.className].filter(Boolean).join(" ")} alt={"Loader"} />; return <div className={classes["root"]}></div>;
// <LoaderIcon className={[classes["loader"], this.props.className].filter(Boolean).join(" ")} />;
} }
} }

View File

@ -49,7 +49,10 @@ export default class UserFolder extends React.Component<IProps, IState> {
this.deleteAskedDocument = this.deleteAskedDocument.bind(this); this.deleteAskedDocument = this.deleteAskedDocument.bind(this);
} }
public override render(): JSX.Element { public override render(): JSX.Element {
const documentsAsked: Document[] | null = this.getDocumentsByStatus("ASKED"); const documentsAsked: Document[] | null = [
...(this.getDocumentsByStatus("ASKED") ?? []),
...(this.getDocumentsByStatus("REFUSED") ?? []),
];
const otherDocuments: Document[] | null = this.getValidatedAndPendindDocuments(); const otherDocuments: Document[] | null = this.getValidatedAndPendindDocuments();
const redirectPath = Module.getInstance() const redirectPath = Module.getInstance()
.get() .get()
@ -111,9 +114,7 @@ export default class UserFolder extends React.Component<IProps, IState> {
Demander un autre document{" "} Demander un autre document{" "}
</Button> </Button>
</Link> </Link>
<Button disabled={documentsAsked ? false : true}> <Button disabled={documentsAsked ? false : true}>Envoyer un mail de demande</Button>
Envoyer un mail de demande
</Button>
</div> </div>
)} )}
</div> </div>

View File

@ -82,8 +82,8 @@ export const docType: DocumentType = {
uid: "fezezfazegezrgrezg", uid: "fezezfazegezrgrezg",
created_at: new Date(), created_at: new Date(),
updated_at: new Date(), updated_at: new Date(),
public_description: "Acte de naissance public description", public_description: "",
private_description: "Acte de naissance private description", private_description: "",
archived_at: new Date(), archived_at: new Date(),
office: office, office: office,
}; };

View File

@ -1,4 +1,7 @@
import PlusIcon from "@Assets/Icons/plus.svg"; import PlusIcon from "@Assets/Icons/plus.svg";
import Deeds from "@Front/Api/LeCoffreApi/SuperAdmin/Deeds/Deeds";
import Documents from "@Front/Api/LeCoffreApi/SuperAdmin/Documents/Documents";
import DocumentTypes from "@Front/Api/LeCoffreApi/SuperAdmin/DocumentTypes/DocumentTypes";
import Folders from "@Front/Api/LeCoffreApi/SuperAdmin/Folders/Folders"; import Folders from "@Front/Api/LeCoffreApi/SuperAdmin/Folders/Folders";
import Button, { EButtonVariant } from "@Front/Components/DesignSystem/Button"; import Button, { EButtonVariant } from "@Front/Components/DesignSystem/Button";
import CheckBox from "@Front/Components/DesignSystem/CheckBox"; import CheckBox from "@Front/Components/DesignSystem/CheckBox";
@ -9,16 +12,13 @@ import { IOption } from "@Front/Components/DesignSystem/Select";
import Typography, { ITypo, ITypoColor } from "@Front/Components/DesignSystem/Typography"; import Typography, { ITypo, ITypoColor } from "@Front/Components/DesignSystem/Typography";
import BackArrow from "@Front/Components/Elements/BackArrow"; import BackArrow from "@Front/Components/Elements/BackArrow";
import DefaultNotaryDashboard 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 { NextRouter, useRouter } from "next/router"; import { NextRouter, useRouter } from "next/router";
import React from "react"; import React from "react";
import BasePage from "../../Base"; import BasePage from "../../Base";
import classes from "./classes.module.scss"; import classes from "./classes.module.scss";
import Documents from "@Front/Api/LeCoffreApi/SuperAdmin/Documents/Documents";
import Module from "@Front/Config/Module";
import { OfficeFolder } from "le-coffre-resources/dist/Customer";
import Deeds from "@Front/Api/LeCoffreApi/SuperAdmin/Deeds/Deeds";
import DocumentTypes from "@Front/Api/LeCoffreApi/SuperAdmin/DocumentTypes/DocumentTypes";
type IProps = {}; type IProps = {};
type IPropsClass = IProps & { type IPropsClass = IProps & {
@ -57,10 +57,13 @@ class AskDocumentsClass extends BasePage<IPropsClass, IState> {
} }
public override render(): JSX.Element { public override render(): JSX.Element {
const backUrl = Module.getInstance()
.get()
.modules.pages.Folder.pages.FolderInformation.props.path.replace("[folderUid]", this.props.folderUid);
return ( return (
<DefaultNotaryDashboard title={"Demander des documents"} onSelectedFolder={() => {}}> <DefaultNotaryDashboard title={"Demander des documents"} onSelectedFolder={() => {}}>
<div className={classes["root"]}> <div className={classes["root"]}>
<BackArrow /> <BackArrow url={backUrl} />
<Typography typo={ITypo.H1} color={ITypoColor.BLACK} className={classes["title"]}> <Typography typo={ITypo.H1} color={ITypoColor.BLACK} className={classes["title"]}>
Demander des documents Demander des documents
</Typography> </Typography>
@ -87,9 +90,11 @@ class AskDocumentsClass extends BasePage<IPropsClass, IState> {
</Button> </Button>
</div> </div>
<div className={classes["buttons-container"]}> <div className={classes["buttons-container"]}>
<a href={backUrl}>
<Button variant={EButtonVariant.GHOST} onClick={this.cancel}> <Button variant={EButtonVariant.GHOST} onClick={this.cancel}>
Annuler Annuler
</Button> </Button>
</a>
<Button type="submit">Valider</Button> <Button type="submit">Valider</Button>
</div> </div>
</div> </div>
@ -142,6 +147,12 @@ class AskDocumentsClass extends BasePage<IPropsClass, IState> {
}, },
}, },
office: true, office: true,
documents: {
include: {
depositor: true,
document_type: true,
},
},
}, },
}); });
if (!folder) return; if (!folder) return;
@ -155,19 +166,23 @@ class AskDocumentsClass extends BasePage<IPropsClass, IState> {
} }
private async getAvailableDocuments(folder: OfficeFolder): Promise<IOption[]> { private async getAvailableDocuments(folder: OfficeFolder): Promise<IOption[]> {
const documentTypes = await Deeds.getInstance().getByUid(folder.deed!.uid!, { const userDocumentTypesUids = folder
q: { .documents!.filter((document) => document.depositor!.uid! === this.props.customerUid!)
deed_has_document_types: { .map((document) => {
include: { return document.document_type!.uid!;
document_type: true, });
}, const documentTypes = folder.deed!.deed_has_document_types!.filter((documentType) => {
}, if (userDocumentTypesUids.includes(documentType.document_type!.uid!)) return false;
}, return true;
}); });
if (!documentTypes) return []; if (!documentTypes) return [];
const documentTypesOptions: IOption[] = documentTypes.deed_has_document_types!.map((documentType) => { const documentTypesOptions: IOption[] = documentTypes
.filter((documentType) => {
return true;
})
.map((documentType) => {
return { return {
label: documentType.document_type!.name!, label: documentType.document_type!.name!,
value: documentType.document_type!.uid!, value: documentType.document_type!.uid!,

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 MiB

View File

@ -1,4 +1,3 @@
import RightImage from "@Front/Assets/images/create-folder/right-image.png";
import Button from "@Front/Components/DesignSystem/Button"; import Button from "@Front/Components/DesignSystem/Button";
import Form from "@Front/Components/DesignSystem/Form"; import Form from "@Front/Components/DesignSystem/Form";
import InputField from "@Front/Components/DesignSystem/Form/Elements/InputField"; import InputField from "@Front/Components/DesignSystem/Form/Elements/InputField";
@ -19,6 +18,7 @@ import Users from "@Front/Api/LeCoffreApi/SuperAdmin/Users/Users";
import User from "le-coffre-resources/dist/Notary"; import User from "le-coffre-resources/dist/Notary";
import Folders, { IPostFoldersParams } from "@Front/Api/LeCoffreApi/SuperAdmin/Folders/Folders"; import Folders, { IPostFoldersParams } from "@Front/Api/LeCoffreApi/SuperAdmin/Folders/Folders";
import { NextRouter, useRouter } from "next/router"; import { NextRouter, useRouter } from "next/router";
import BackgroundImage from "./background-image.jpeg";
type IFormValues = { type IFormValues = {
folder_number: string; folder_number: string;
@ -73,7 +73,7 @@ class CreateFolderClass extends BasePage<IPropsClass, IState> {
public override render(): JSX.Element { public override render(): JSX.Element {
return ( return (
<DefaultDoubleSidePage title={"Dossier"} image={RightImage} type="image" showHeader={true}> <DefaultDoubleSidePage title={"Dossier"} image={BackgroundImage} type="background" showHeader={true}>
<div className={classes["root"]}> <div className={classes["root"]}>
<BackArrow /> <BackArrow />
<Typography typo={ITypo.H1} color={ITypoColor.BLACK} className={classes["title"]}> <Typography typo={ITypo.H1} color={ITypoColor.BLACK} className={classes["title"]}>
@ -140,8 +140,10 @@ class CreateFolderClass extends BasePage<IPropsClass, IState> {
const usersMock = await Users.getInstance().get({ include: { office_membership: true } }); const usersMock = await Users.getInstance().get({ include: { office_membership: true } });
const userMock = usersMock[0]; const userMock = usersMock[0];
// ------------------- // -------------------
const collaborators = await Users.getInstance().get( { where: { office_membership: { uid: userMock?.office_membership?.uid } }, include: { contact: true } }, const collaborators = await Users.getInstance().get({
); where: { office_membership: { uid: userMock?.office_membership?.uid } },
include: { contact: true },
});
this.setState({ this.setState({
deedTypes, deedTypes,
deedTypesOptions: this.mapDeedOptions(deedTypes), deedTypesOptions: this.mapDeedOptions(deedTypes),

View File

@ -123,7 +123,7 @@ class FolderInformationClass extends BasePage<IPropsClass, IState> {
<Typography typo={ITypo.H1Bis}>Informations du dossier</Typography> <Typography typo={ITypo.H1Bis}>Informations du dossier</Typography>
<div className={classes["choose-a-folder"]}> <div className={classes["choose-a-folder"]}>
<Typography typo={ITypo.P_18} color={ITypoColor.GREY}> <Typography typo={ITypo.P_18} color={ITypoColor.GREY}>
Vous n'avez aucun dossier archivés Sélectionnez un dossier
</Typography> </Typography>
</div> </div>
</div> </div>

View File

@ -74,7 +74,7 @@ class ViewDocumentsClass extends BasePage<IPropsClass, IState> {
{this.state.document && this.state.document.files && this.state.selectedFile && ( {this.state.document && this.state.document.files && this.state.selectedFile && (
<div className={classes["root"]}> <div className={classes["root"]}>
<Typography typo={ITypo.H1} color={ITypoColor.BLACK} className={classes["title"]}> <Typography typo={ITypo.H1} color={ITypoColor.BLACK} className={classes["title"]}>
{this.state.document.document_type?.name} {this.state.document.folder?.name}
</Typography> </Typography>
<Typography typo={ITypo.H3} color={ITypoColor.BLACK} className={classes["subtitle"]}> <Typography typo={ITypo.H3} color={ITypoColor.BLACK} className={classes["subtitle"]}>
{this.state.document.document_type?.name} {this.state.document.document_type?.name}
@ -91,6 +91,7 @@ class ViewDocumentsClass extends BasePage<IPropsClass, IState> {
<div className={classes["file-container"]}> <div className={classes["file-container"]}>
<FilePreview <FilePreview
href={Files.getInstance().getUploadLink(this.state.selectedFile?.uid as string)} href={Files.getInstance().getUploadLink(this.state.selectedFile?.uid as string)}
fileName={this.state.selectedFile.file_name}
key={this.state.selectedFile.uid} key={this.state.selectedFile.uid}
/> />
</div> </div>
@ -104,7 +105,7 @@ class ViewDocumentsClass extends BasePage<IPropsClass, IState> {
)} )}
</div> </div>
<div className={classes["footer"]}> <div className={classes["footer"]}>
{this.state.document?.document_type?.name === "Carte d'identité" && ( {this.state.document?.document_type?.name === "Document d'identité" && (
<div className={classes["ocr-container"]}> <div className={classes["ocr-container"]}>
<OcrResult percentage={this.state.validatedPercentage} /> <OcrResult percentage={this.state.validatedPercentage} />
</div> </div>
@ -148,7 +149,7 @@ class ViewDocumentsClass extends BasePage<IPropsClass, IState> {
</Typography> </Typography>
<Image src={ValidateAnchoringGif} alt="Anchoring animation" className={classes["validate-gif"]} /> <Image src={ValidateAnchoringGif} alt="Anchoring animation" className={classes["validate-gif"]} />
<div className={classes["dont-show-again"]}> <div className={classes["dont-show-again"]}>
<CheckBox option={{ label: "Ne plus afficher ce message", value: false }} toolTip={"Test"} /> <CheckBox option={{ label: "Ne plus afficher ce message", value: false }} />
</div> </div>
</div> </div>
)} )}
@ -188,6 +189,7 @@ class ViewDocumentsClass extends BasePage<IPropsClass, IState> {
const document = await Documents.getInstance().getByUid(this.props.documentUid, { const document = await Documents.getInstance().getByUid(this.props.documentUid, {
files: true, files: true,
document_type: true, document_type: true,
folder: true,
}); });
this.setState({ this.setState({
document, document,

View File

@ -28,7 +28,7 @@ export default class Folder extends BasePage<IProps, IState> {
<Typography typo={ITypo.H1Bis}>Informations du dossier</Typography> <Typography typo={ITypo.H1Bis}>Informations du dossier</Typography>
<div className={classes["choose-a-folder"]}> <div className={classes["choose-a-folder"]}>
<Typography typo={ITypo.P_18} color={ITypoColor.GREY}> <Typography typo={ITypo.P_18} color={ITypoColor.GREY}>
Vous n'avez aucun dossier archivés Sélectionnez un dossier
</Typography> </Typography>
</div> </div>
</div> </div>

View File

@ -93,7 +93,7 @@ class FolderInformationClass extends BasePage<IPropsClass, IState> {
<Typography typo={ITypo.H1Bis}>Informations du dossier</Typography> <Typography typo={ITypo.H1Bis}>Informations du dossier</Typography>
<div className={classes["choose-a-folder"]}> <div className={classes["choose-a-folder"]}>
<Typography typo={ITypo.P_18} color={ITypoColor.GREY}> <Typography typo={ITypo.P_18} color={ITypoColor.GREY}>
Vous n'avez aucun dossier archivés Vous n'avez aucun dossier archivé
</Typography> </Typography>
</div> </div>
</div> </div>

View File

@ -31,7 +31,7 @@ export default class Folder extends BasePage<IProps, IState> {
<Typography typo={ITypo.H1Bis}>Informations du dossier</Typography> <Typography typo={ITypo.H1Bis}>Informations du dossier</Typography>
<div className={classes["choose-a-folder"]}> <div className={classes["choose-a-folder"]}>
<Typography typo={ITypo.P_18} color={ITypoColor.GREY}> <Typography typo={ITypo.P_18} color={ITypoColor.GREY}>
Vous n'avez aucun dossier archivés Vous n'avez aucun dossier archivé
</Typography> </Typography>
</div> </div>
</div> </div>

View File

@ -3,7 +3,7 @@ import Typography, { ITypo } from "@Front/Components/DesignSystem/Typography";
import BasePage from "../Base"; import BasePage from "../Base";
import classes from "./classes.module.scss"; import classes from "./classes.module.scss";
import CoffreIcon from "@Assets/Icons/coffre.svg"; import CoffreIcon from "@Assets/Icons/coffre.svg";
import LandingImage from "./landing-connect.png"; import LandingImage from "./landing-connect.jpeg";
import Image from "next/image"; import Image from "next/image";
import DefaultDoubleSidePage from "@Front/Components/LayoutTemplates/DefaultDoubleSidePage"; import DefaultDoubleSidePage from "@Front/Components/LayoutTemplates/DefaultDoubleSidePage";
import { FrontendVariables } from "@Front/Config/VariablesFront"; import { FrontendVariables } from "@Front/Config/VariablesFront";

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 734 KiB

View File

@ -1,7 +1,7 @@
import Typography, { ITypo } from "@Front/Components/DesignSystem/Typography"; import Typography, { ITypo } from "@Front/Components/DesignSystem/Typography";
import BasePage from "../Base"; import BasePage from "../Base";
import classes from "./classes.module.scss"; import classes from "./classes.module.scss";
import LandingImage from "./landing-connect.png"; import LandingImage from "../Login/landing-connect.jpeg";
import Image from "next/image"; import Image from "next/image";
import DefaultDoubleSidePage from "@Front/Components/LayoutTemplates/DefaultDoubleSidePage"; import DefaultDoubleSidePage from "@Front/Components/LayoutTemplates/DefaultDoubleSidePage";
import FranceConnectIcon from "./france-connect.svg"; import FranceConnectIcon from "./france-connect.svg";
@ -42,7 +42,9 @@ export default class LoginCustomer extends BasePage {
// variables.BACK_API_PROTOCOL + variables.FRONT_APP_HOST + (variables.FRONT_APP_PORT ? ":" + variables.FRONT_APP_PORT : ""); // variables.BACK_API_PROTOCOL + variables.FRONT_APP_HOST + (variables.FRONT_APP_PORT ? ":" + variables.FRONT_APP_PORT : "");
const authorizeEndPoint = variables.FC_AUTHORIZE_ENDPOINT; const authorizeEndPoint = variables.FC_AUTHORIZE_ENDPOINT;
const clientId = variables.FC_CLIENT_ID; const clientId = variables.FC_CLIENT_ID;
const url = `${authorizeEndPoint}?client_id=${clientId}&redirect_uri=http://localhost:8080/login-callback&scope=openid&response_type=code&state=${cryptoRandomString({length: 64})}&nonce=${cryptoRandomString({length: 64})}&acr_values=eidas1`; const url = `${authorizeEndPoint}?client_id=${clientId}&redirect_uri=http://localhost:8080/login-callback&scope=openid&response_type=code&state=${cryptoRandomString(
{ length: 64 },
)}&nonce=${cryptoRandomString({ length: 64 })}&acr_values=eidas1`;
window.location.assign(url); window.location.assign(url);
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 734 KiB

View File

@ -2,15 +2,15 @@ import Button from "@Front/Components/DesignSystem/Button";
import Typography, { ITypo } from "@Front/Components/DesignSystem/Typography"; import Typography, { ITypo } from "@Front/Components/DesignSystem/Typography";
import Module from "@Front/Config/Module"; import Module from "@Front/Config/Module";
import Link from "next/link"; import Link from "next/link";
import RightImage from "@Assets/images/create-folder/right-image.png";
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 DefaultDoubleSidePage from "@Front/Components/LayoutTemplates/DefaultDoubleSidePage";
import backgroundImage from "../Folder/CreateFolder/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={RightImage} type="image" 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["content"]}>
<Typography typo={ITypo.H1}>Erreur 404</Typography> <Typography typo={ITypo.H1}>Erreur 404</Typography>

View File

@ -24,6 +24,13 @@
"labelKey": "design_system" "labelKey": "design_system"
} }
}, },
"CustomersLogin": {
"enabled": true,
"props": {
"path": "/customers/login",
"labelKey": "customer_login"
}
},
"Folder": { "Folder": {
"enabled": true, "enabled": true,
"props": { "props": {

View File

@ -24,6 +24,13 @@
"labelKey": "design_system" "labelKey": "design_system"
} }
}, },
"CustomersLogin": {
"enabled": true,
"props": {
"path": "/customers/login",
"labelKey": "customer_login"
}
},
"Folder": { "Folder": {
"enabled": true, "enabled": true,
"props": { "props": {

View File

@ -24,6 +24,13 @@
"labelKey": "design_system" "labelKey": "design_system"
} }
}, },
"CustomersLogin": {
"enabled": true,
"props": {
"path": "/customers/login",
"labelKey": "customer_login"
}
},
"Folder": { "Folder": {
"enabled": true, "enabled": true,
"props": { "props": {

View File

@ -24,6 +24,13 @@
"labelKey": "design_system" "labelKey": "design_system"
} }
}, },
"CustomersLogin": {
"enabled": true,
"props": {
"path": "/customers/login",
"labelKey": "customer_login"
}
},
"Folder": { "Folder": {
"enabled": true, "enabled": true,
"props": { "props": {