✨ client dashboard
This commit is contained in:
parent
247b0ba108
commit
227e5ee4d9
@ -2,11 +2,13 @@
|
|||||||
|
|
||||||
.root {
|
.root {
|
||||||
margin: var(--root-margin);
|
margin: var(--root-margin);
|
||||||
padding: var(--root-padding);
|
|
||||||
max-width: var(--root-max-width);
|
max-width: var(--root-max-width);
|
||||||
min-width: 100%;
|
min-width: 100%;
|
||||||
min-height: calc(100vh - 83px);
|
min-height: calc(100vh - 83px);
|
||||||
|
|
||||||
|
&.padding {
|
||||||
|
padding: var(--root-padding);
|
||||||
|
|
||||||
@media screen and (max-width: $screen-m) {
|
@media screen and (max-width: $screen-m) {
|
||||||
padding: 0 24px;
|
padding: 0 24px;
|
||||||
}
|
}
|
||||||
@ -15,3 +17,4 @@
|
|||||||
padding: 0 16px;
|
padding: 0 16px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
@ -4,6 +4,7 @@ import React, { ReactNode } from "react";
|
|||||||
import classes from "./classes.module.scss";
|
import classes from "./classes.module.scss";
|
||||||
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 classNames from "classnames";
|
||||||
|
|
||||||
type IProps = {
|
type IProps = {
|
||||||
title: string;
|
title: string;
|
||||||
@ -12,19 +13,21 @@ type IProps = {
|
|||||||
* @description scroll top with number or disabled with null
|
* @description scroll top with number or disabled with null
|
||||||
*/
|
*/
|
||||||
scrollTop: number | null;
|
scrollTop: number | null;
|
||||||
|
isPadding?: boolean;
|
||||||
};
|
};
|
||||||
type IState = {};
|
type IState = {};
|
||||||
|
|
||||||
export default class DefaultTemplate extends React.Component<IProps, IState> {
|
export default class DefaultTemplate extends React.Component<IProps, IState> {
|
||||||
public static defaultProps = {
|
public static defaultProps = {
|
||||||
scrollTop: 0,
|
scrollTop: 0,
|
||||||
|
isPadding: true,
|
||||||
};
|
};
|
||||||
|
|
||||||
public override render(): JSX.Element {
|
public override render(): JSX.Element {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Header isUserConnected={true} />
|
<Header isUserConnected={true} />
|
||||||
<div className={classes["root"]}>{this.props.children}</div>
|
<div className={classNames(classes["root"], this.props.isPadding && classes["padding"])}>{this.props.children}</div>
|
||||||
<Version />
|
<Version />
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
@ -0,0 +1,86 @@
|
|||||||
|
@import "@Themes/constants.scss";
|
||||||
|
|
||||||
|
.root {
|
||||||
|
.header {
|
||||||
|
display: flex;
|
||||||
|
padding: 64px;
|
||||||
|
|
||||||
|
@media (max-width: $screen-m) {
|
||||||
|
flex-wrap: wrap;
|
||||||
|
|
||||||
|
.text {
|
||||||
|
margin: 32px 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: $screen-s) {
|
||||||
|
flex-wrap: wrap;
|
||||||
|
|
||||||
|
.text {
|
||||||
|
margin: 32px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button {
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.subtitle {
|
||||||
|
margin: 32px 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.sub-container {
|
||||||
|
background-color: var(--grey-soft);
|
||||||
|
padding: 64px;
|
||||||
|
|
||||||
|
.content {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 1fr 1fr;
|
||||||
|
gap: 32px;
|
||||||
|
margin-bottom: 64px;
|
||||||
|
|
||||||
|
@media (max-width: $screen-s) {
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.component-to-replace {
|
||||||
|
min-width: 124px;
|
||||||
|
height: 98px;
|
||||||
|
background-color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.text {
|
||||||
|
margin: 32px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button {
|
||||||
|
width: fit-content;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: $screen-s) {
|
||||||
|
.button {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-content {
|
||||||
|
.text {
|
||||||
|
margin: 24px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.component-to-replace {
|
||||||
|
background-color: var(--grey-soft);
|
||||||
|
height: 98px;
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
105
src/front/Components/Layouts/ClientDashboard/index.tsx
Normal file
105
src/front/Components/Layouts/ClientDashboard/index.tsx
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
import Typography, { ITypo } from "@Front/Components/DesignSystem/Typography";
|
||||||
|
import Base from "@Front/Components/Layouts/Base";
|
||||||
|
import DefaultTemplate from "@Front/Components/LayoutTemplates/DefaultTemplate";
|
||||||
|
import React from "react";
|
||||||
|
|
||||||
|
import classes from "./classes.module.scss";
|
||||||
|
import Button, { EButtonVariant } from "@Front/Components/DesignSystem/Button";
|
||||||
|
import Confirm from "@Front/Components/DesignSystem/Modal/Confirm";
|
||||||
|
import InputField from "@Front/Components/DesignSystem/Form/Elements/InputField";
|
||||||
|
|
||||||
|
type IProps = {};
|
||||||
|
type IState = {
|
||||||
|
isAddDocumentModalVisible: boolean;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default class ClientDashboard extends Base<IProps, IState> {
|
||||||
|
public constructor(props: IProps) {
|
||||||
|
super(props);
|
||||||
|
this.state = {
|
||||||
|
isAddDocumentModalVisible: false,
|
||||||
|
};
|
||||||
|
this.onCloseModalAddDocument = this.onCloseModalAddDocument.bind(this);
|
||||||
|
this.onOpenModalAddDocument = this.onOpenModalAddDocument.bind(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override render(): JSX.Element {
|
||||||
|
return (
|
||||||
|
<DefaultTemplate title={"Mon compte"} isPadding={false}>
|
||||||
|
<div className={classes["root"]}>
|
||||||
|
{this.renderHeader()}
|
||||||
|
<div className={classes["sub-container"]}>
|
||||||
|
<div className={classes["content"]}>
|
||||||
|
<div className={classes["component-to-replace"]}></div>
|
||||||
|
<div className={classes["component-to-replace"]}></div>
|
||||||
|
<div className={classes["component-to-replace"]}></div>
|
||||||
|
<div className={classes["component-to-replace"]}></div>
|
||||||
|
<div className={classes["component-to-replace"]}></div>
|
||||||
|
<div className={classes["component-to-replace"]}></div>
|
||||||
|
</div>
|
||||||
|
<Typography typo={ITypo.H2}>Documents supplémentaires (facultatif)</Typography>
|
||||||
|
<Typography typo={ITypo.P_16} className={classes["text"]}>
|
||||||
|
Vous souhaitez envoyer d’autres documents à votre notaire ?
|
||||||
|
</Typography>
|
||||||
|
<Button variant={EButtonVariant.GHOST} className={classes["button"]} onClick={this.onOpenModalAddDocument}>
|
||||||
|
Ajouter d’autres documents
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
<Confirm
|
||||||
|
isOpen={this.state.isAddDocumentModalVisible}
|
||||||
|
onClose={this.onCloseModalAddDocument}
|
||||||
|
onAccept={this.onOpenModalAddDocument}
|
||||||
|
closeBtn
|
||||||
|
header={"Ajouter un document"}
|
||||||
|
cancelText={"Annuler"}
|
||||||
|
confirmText={"Déposer le document"}>
|
||||||
|
<div className={classes["modal-content"]}>
|
||||||
|
<Typography typo={ITypo.P_16} className={classes["text"]}>
|
||||||
|
Vous souhaitez envoyer un autre document à votre notaire ?
|
||||||
|
</Typography>
|
||||||
|
<InputField fakeplaceholder={"Nom du document"} />
|
||||||
|
<Typography typo={ITypo.P_16} className={classes["text"]}>
|
||||||
|
Glissez / Déposez votre document dans la zone prévue à cet effet ou cliquez sur la zone puis sélectionnez le
|
||||||
|
document correspondant.
|
||||||
|
</Typography>
|
||||||
|
<div className={classes["component-to-replace"]}></div>
|
||||||
|
</div>
|
||||||
|
</Confirm>
|
||||||
|
</div>
|
||||||
|
</DefaultTemplate>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private renderHeader(): JSX.Element {
|
||||||
|
return (
|
||||||
|
<div className={classes["header"]}>
|
||||||
|
<div className={classes["text-container"]}>
|
||||||
|
{/* TODO Get name from userStore */}
|
||||||
|
<Typography typo={ITypo.H1} className={classes["title"]}>
|
||||||
|
Bonjour John Doe
|
||||||
|
</Typography>
|
||||||
|
|
||||||
|
<Typography typo={ITypo.H2} className={classes["subtitle"]}>
|
||||||
|
Documents à envoyer
|
||||||
|
</Typography>
|
||||||
|
|
||||||
|
<Typography typo={ITypo.P_16} className={classes["text"]}>
|
||||||
|
Votre notaire est dans l'attente de documents pour valider votre dossier. Voici la liste des documents.
Veuillez
|
||||||
|
glisser / déposez chaque document dans la zone prévue à cet effet ou cliquez sur la zone puis sélectionnez le
|
||||||
|
document correspondant. Si un des documents demandés ne vous concernent pas, veuillez contacter votre notaire à
|
||||||
|
l’aide du bouton ci-dessus.
|
||||||
|
</Typography>
|
||||||
|
</div>
|
||||||
|
<Button className={classes["button"]}>Contacter mon notaire</Button>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private onCloseModalAddDocument() {
|
||||||
|
this.setState({ isAddDocumentModalVisible: false });
|
||||||
|
}
|
||||||
|
|
||||||
|
private onOpenModalAddDocument() {
|
||||||
|
this.setState({ isAddDocumentModalVisible: true });
|
||||||
|
}
|
||||||
|
}
|
5
src/pages/client-dashboard.tsx
Normal file
5
src/pages/client-dashboard.tsx
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
import ClientDashboard from "@Front/Components/Layouts/ClientDashboard";
|
||||||
|
|
||||||
|
export default function Route() {
|
||||||
|
return <ClientDashboard />;
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user