Merge branch 'dev' into staging

This commit is contained in:
Max S 2024-09-11 15:48:38 +02:00
commit f3339d9e6b
9 changed files with 160 additions and 198 deletions

View File

@ -3,6 +3,7 @@
.root { .root {
position: relative; position: relative;
&[data-is-disabled="true"] { &[data-is-disabled="true"] {
opacity: var(--opacity-disabled, 0.3); opacity: var(--opacity-disabled, 0.3);
.input-container { .input-container {
@ -27,6 +28,8 @@
} }
.input-container { .input-container {
height: 56px;
display: flex; display: flex;
padding: var(--spacing-2, 16px) var(--spacing-sm, 8px); padding: var(--spacing-2, 16px) var(--spacing-sm, 8px);
align-items: center; align-items: center;

View File

@ -5,6 +5,9 @@ import BaseField, { IProps as IBaseFieldProps } from "../BaseField";
import classes from "./classes.module.scss"; import classes from "./classes.module.scss";
import classnames from "classnames"; import classnames from "classnames";
import { XMarkIcon, Square2StackIcon } from "@heroicons/react/24/outline"; import { XMarkIcon, Square2StackIcon } from "@heroicons/react/24/outline";
import { ToasterService } from "@Front/Components/DesignSystem/Toaster";
export type IProps = IBaseFieldProps & { export type IProps = IBaseFieldProps & {
canCopy?: boolean; canCopy?: boolean;
password?: boolean; password?: boolean;
@ -36,6 +39,7 @@ export default class TextField extends BaseField<IProps> {
onBlur={this.onBlur} onBlur={this.onBlur}
name={this.props.name} name={this.props.name}
disabled={this.props.disabled} disabled={this.props.disabled}
readOnly={this.props.readonly}
type={this.props.password ? "password" : "text"} type={this.props.password ? "password" : "text"}
/> />
{this.props.canCopy && !this.hasError() && ( {this.props.canCopy && !this.hasError() && (
@ -58,6 +62,7 @@ export default class TextField extends BaseField<IProps> {
private onCopyClick = (): void => { private onCopyClick = (): void => {
if (this.props.canCopy) { if (this.props.canCopy) {
navigator.clipboard.writeText(this.state.value ?? ""); navigator.clipboard.writeText(this.state.value ?? "");
ToasterService.getInstance().success({ title: "Copié avec succès !", description: this.state.value });
} }
}; };
} }

View File

@ -5,9 +5,11 @@ import classes from "./classes.module.scss";
interface IProps { interface IProps {
className?: string; className?: string;
width?: string | number;
color?: 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 <ArrowPathIcon className={classes["root"]} />; return <ArrowPathIcon className={classes["root"]} color={this.props.color} width={this.props.width} />;
} }
} }

View File

@ -26,12 +26,12 @@ export default function HelpBox(props: IProps) {
styletype={EButtonstyletype.TEXT} styletype={EButtonstyletype.TEXT}
size={EButtonSize.MD} size={EButtonSize.MD}
onClick={button.onClick}> onClick={button.onClick}>
Contactez le support {button.text}
</Button> </Button>
</Link> </Link>
) : ( ) : (
<Button variant={EButtonVariant.SECONDARY} styletype={EButtonstyletype.TEXT} size={EButtonSize.MD} onClick={button.onClick}> <Button variant={EButtonVariant.SECONDARY} styletype={EButtonstyletype.TEXT} size={EButtonSize.MD} onClick={button.onClick}>
Contactez le support {button.text}
</Button> </Button>
)} )}
</div> </div>

View File

@ -177,7 +177,8 @@ export default function ClientDashboard(props: IProps) {
.modules.pages.ClientDashboard.pages.ReceiveDocuments.props.path.replace( .modules.pages.ClientDashboard.pages.ReceiveDocuments.props.path.replace(
"[folderUid]", "[folderUid]",
folderUid as string, folderUid as string,
)}> )}
style={{ width: "100%" }}>
<Button fullwidth variant={EButtonVariant.PRIMARY} size={EButtonSize.LG} styletype={EButtonstyletype.OUTLINED}> <Button fullwidth variant={EButtonVariant.PRIMARY} size={EButtonSize.LG} styletype={EButtonstyletype.OUTLINED}>
Voir les documents reçus Voir les documents reçus
</Button> </Button>

View File

@ -1,29 +1,22 @@
@import "@Themes/constants.scss"; @import "@Themes/constants.scss";
.root { .root {
margin: 80px auto;
width: 474px;
display: flex; display: flex;
align-items: center;
justify-content: center;
flex-direction: column; flex-direction: column;
height: 100%; gap: var(--spacing-xl, 32px);
max-width: 530px;
margin: auto;
.title { .title-container {
margin: 32px 0; display: flex;
text-align: center; flex-direction: column;
@media (max-width: $screen-s) { gap: var(--spacing-sm);
font-family: 48px;
}
} }
.loader { @media (max-width: $screen-s) {
width: 32px; width: 100%;
height: 32px; margin: auto;
} padding: var(--spacing-md, 16px);
.forget-password {
margin-top: 32px;
margin-bottom: 8px;
} }
} }

View File

@ -1,19 +1,19 @@
import LandingImage from "../Login/landing-connect.jpeg"; import backgroundImage from "@Assets/images/background_refonte.svg";
import Image from "next/image";
import CoffreIcon from "@Assets/logo_small_blue.svg"; import CoffreIcon from "@Assets/logo_small_blue.svg";
import Auth from "@Front/Api/Auth/IdNot";
import Loader from "@Front/Components/DesignSystem/Loader";
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 CookieService from "@Front/Services/CookieService/CookieService";
import JwtService from "@Front/Services/JwtService/JwtService";
import UserStore from "@Front/Stores/UserStore";
import Image from "next/image";
import { useRouter } from "next/router"; import { useRouter } from "next/router";
import React, { useEffect } from "react"; import React, { useEffect } from "react";
import classes from "./classes.module.scss"; import classes from "./classes.module.scss";
import Module from "@Front/Config/Module";
import Auth from "@Front/Api/Auth/IdNot";
import DefaultDoubleSidePage from "@Front/Components/LayoutTemplates/DefaultDoubleSidePage";
import Typography, { ETypo } from "@Front/Components/DesignSystem/Typography";
import Button, { EButtonstyletype, EButtonVariant } from "@Front/Components/DesignSystem/Button";
import Loader from "@Front/Components/DesignSystem/Loader";
import UserStore from "@Front/Stores/UserStore";
import Link from "next/link";
import JwtService from "@Front/Services/JwtService/JwtService";
import CookieService from "@Front/Services/CookieService/CookieService";
export default function LoginCallBack() { export default function LoginCallBack() {
const router = useRouter(); const router = useRouter();
@ -60,23 +60,22 @@ export default function LoginCallBack() {
[router]; [router];
return ( return (
<DefaultDoubleSidePage title={"Login"} image={LandingImage}> <DefaultDoubleSidePage title={"Login"} image={backgroundImage}>
<div className={classes["root"]}> <div className={classes["root"]}>
<Image alt="coffre" src={CoffreIcon} /> <div className={classes["title-container"]}>
<Typography typo={ETypo.DISPLAY_LARGE}> <Image alt="coffre" src={CoffreIcon} width={56} />
<div className={classes["title"]}>Connexion espace professionnel</div> <Typography typo={ETypo.TITLE_H1} color={ETypoColor.TEXT_ACCENT}>
</Typography> Connexion à votre espace professionnel
<div className={classes["loader"]}> </Typography>
<Loader />
</div> </div>
<Typography typo={ETypo.TEXT_LG_REGULAR}>
<div className={classes["forget-password"]}>Vous n'arrivez pas à vous connecter ?</div> <Loader color={"var(--secondary-default-base, #FF4617)"} width={29} />
</Typography> <div />
<Link href="mailto:support@lecoffre.io"> <HelpBox
<Button variant={EButtonVariant.PRIMARY} styletype={EButtonstyletype.TEXT}> title="Vous n'arrivez pas à vous connecter ?"
Contacter l'administrateur description="Notre équipe de support est là pour vous aider."
</Button> button={{ text: "Contacter l'administrateur", link: "mailto:support@lecoffre.io" }}
</Link> />
</div> </div>
</DefaultDoubleSidePage> </DefaultDoubleSidePage>
); );

View File

@ -1,27 +1,32 @@
@import "@Themes/constants.scss"; @import "@Themes/constants.scss";
.root { .root {
.title { margin: 24px auto;
margin-top: 24px; width: 566px;
@media (max-width: $screen-m) {
width: 474px;
} }
.parts-container { @media (max-width: $screen-s) {
width: 100%;
padding: var(--spacing-md, 16px);
}
display: flex;
flex-direction: column;
gap: var(--spacing-xl, 32px);
.title-container {
display: flex; display: flex;
gap: 64px; flex-direction: column;
margin-top: 32px; gap: var(--spacing-sm, 8px);
}
@media (max-width: $screen-m) { .form {
flex-direction: column; display: flex;
} flex-direction: column;
.part { gap: var(--spacing-md, 16px);
flex: 1;
.form-container {
display: flex;
flex-direction: column;
gap: 24px;
margin-top: 32px;
}
}
} }
} }

View File

@ -1,142 +1,96 @@
import backgroundImage from "@Assets/images/background_refonte.svg";
import Users from "@Front/Api/LeCoffreApi/Notary/Users/Users";
import Form from "@Front/Components/DesignSystem/Form"; import Form from "@Front/Components/DesignSystem/Form";
import TextField from "@Front/Components/DesignSystem/Form/TextField"; import TextField from "@Front/Components/DesignSystem/Form/TextField";
import Typography, { ETypo, ETypoColor } from "@Front/Components/DesignSystem/Typography"; import Typography, { ETypo, ETypoColor } from "@Front/Components/DesignSystem/Typography";
import Base from "@Front/Components/Layouts/Base"; import DefaultDoubleSidePage from "@Front/Components/LayoutTemplates/DefaultDoubleSidePage";
import DefaultTemplate from "@Front/Components/LayoutTemplates/DefaultTemplate"; import JwtService from "@Front/Services/JwtService/JwtService";
import React from "react"; import User from "le-coffre-resources/dist/Notary";
import React, { useEffect } from "react";
import classes from "./classes.module.scss"; import classes from "./classes.module.scss";
import User from "le-coffre-resources/dist/Notary";
import Users from "@Front/Api/LeCoffreApi/Notary/Users/Users";
import JwtService from "@Front/Services/JwtService/JwtService";
type IProps = {}; export default function MyAccount() {
type IState = { const [user, setUser] = React.useState<User | null>(null);
user: User | null;
};
export default class MyAccount extends Base<IProps, IState> { useEffect(() => {
constructor(props: IProps) {
super(props);
this.state = {
user: null,
};
}
public override render(): JSX.Element {
return (
<DefaultTemplate title={"Mon compte"}>
<div className={classes["root"]}>
<Typography typo={ETypo.DISPLAY_LARGE} color={ETypoColor.COLOR_GENERIC_BLACK} className={classes["title"]}>
Mon compte
</Typography>
<div className={classes["parts-container"]}>
<div className={classes["part"]}>
<Typography typo={ETypo.TITLE_H3} color={ETypoColor.COLOR_GENERIC_BLACK}>
Mes informations
</Typography>
<Form onSubmit={this.onFormSubmit}>
<div className={classes["form-container"]}>
<TextField
name="name"
placeholder="Nom"
defaultValue={this.state.user?.contact?.last_name}
disabled
canCopy
/>
<TextField
name="surname"
placeholder="Prénom"
defaultValue={this.state.user?.contact?.first_name}
disabled
canCopy
/>
<TextField
name="email"
placeholder="E-mail"
defaultValue={this.state.user?.contact?.email}
disabled
canCopy
/>
<TextField
name="phone"
placeholder="Numéro de téléphone"
defaultValue={this.state.user?.contact?.cell_phone_number as string}
disabled
canCopy
/>
</div>
</Form>
</div>
<div className={classes["part"]}>
<Typography typo={ETypo.TITLE_H3} color={ETypoColor.COLOR_GENERIC_BLACK}>
Mon office
</Typography>
<Form onSubmit={this.onFormSubmit}>
<div className={classes["form-container"]}>
<TextField
name="office_denomination"
placeholder="Dénomination de l'office"
defaultValue={this.state.user?.office_membership?.name}
disabled
canCopy
/>
<TextField
name="crpcen"
placeholder="CRPCEN"
defaultValue={this.state.user?.office_membership?.crpcen}
disabled
canCopy
/>
<TextField
name="cp_address"
placeholder="Adresse"
defaultValue={this.state.user?.office_membership?.address?.address}
disabled
canCopy
/>
<TextField
name="city"
placeholder="Ville"
defaultValue={
this.state.user?.office_membership?.address?.zip_code +
" - " +
this.state.user?.office_membership?.address?.city
}
disabled
canCopy
/>
</div>
</Form>
</div>
</div>
</div>
</DefaultTemplate>
);
}
public override async componentDidMount() {
const jwtDecoded = JwtService.getInstance().decodeJwt(); const jwtDecoded = JwtService.getInstance().decodeJwt();
if (!jwtDecoded) return; if (!jwtDecoded) return;
const user = await Users.getInstance().getByUid(jwtDecoded.userId, { Users.getInstance()
q: { .getByUid(jwtDecoded.userId, {
office_membership: { q: {
include: { office_membership: {
address: true, include: {
address: true,
},
}, },
contact: true,
}, },
contact: true, })
}, .then((user) => {
}); if (!user) return;
if (!user) return; setUser(user);
this.setState({ });
user, }, []);
});
} return (
private onFormSubmit( <DefaultDoubleSidePage title={"Mon Compte"} image={backgroundImage}>
e: React.FormEvent<HTMLFormElement> | null, <div className={classes["root"]}>
values: { <div className={classes["title-container"]}>
[key: string]: string; <Typography typo={ETypo.TITLE_H1} color={ETypoColor.TEXT_PRIMARY}>
}, Mon compte
) {} </Typography>
<Typography typo={ETypo.TITLE_H5} color={ETypoColor.TEXT_ACCENT}>
Mes informations
</Typography>
</div>
<Form className={classes["form"]}>
<TextField name="name" label="Nom" placeholder="Nom" defaultValue={user?.contact?.last_name} readonly canCopy />
<TextField name="surname" label="Prénom" placeholder="Prénom" defaultValue={user?.contact?.first_name} readonly canCopy />
<TextField name="email" label="E-mail" placeholder="E-mail" defaultValue={user?.contact?.email} readonly canCopy />
<TextField
name="phone"
label="Numéro de téléphone"
placeholder="Numéro de téléphone"
defaultValue={user?.contact?.cell_phone_number as string}
readonly
canCopy
/>
</Form>
<Typography typo={ETypo.TITLE_H5} color={ETypoColor.TEXT_ACCENT}>
Mon office
</Typography>
<Form className={classes["form"]}>
<TextField
name="office_denomination"
label="Dénomination de l'office"
placeholder="Dénomination de l'office"
defaultValue={user?.office_membership?.name}
readonly
canCopy
/>
<TextField name="crpcen" label="CRPCEN" placeholder="CRPCEN" defaultValue={user?.office_membership?.crpcen} readonly canCopy />
<TextField
name="cp_address"
label="Adresse"
placeholder="Adresse"
defaultValue={user?.office_membership?.address?.address as string}
readonly
canCopy
/>
<TextField
name="city"
label="Ville"
placeholder="Ville"
defaultValue={user?.office_membership?.address?.zip_code + " - " + user?.office_membership?.address?.city}
readonly
canCopy
/>
</Form>
</div>
</DefaultDoubleSidePage>
);
} }