Quitter sans enregistrer

This commit is contained in:
Maxime Lalo 2023-07-31 13:01:59 +02:00
parent 539373b99a
commit ec6424599f
2 changed files with 91 additions and 5 deletions

View File

@ -3,18 +3,22 @@ import Button, { EButtonVariant } from "@Front/Components/DesignSystem/Button";
import Form from "@Front/Components/DesignSystem/Form"; import Form from "@Front/Components/DesignSystem/Form";
import TextAreaField from "@Front/Components/DesignSystem/Form/TextareaField"; import TextAreaField from "@Front/Components/DesignSystem/Form/TextareaField";
import TextField from "@Front/Components/DesignSystem/Form/TextField"; import TextField from "@Front/Components/DesignSystem/Form/TextField";
import Confirm from "@Front/Components/DesignSystem/Modal/Confirm";
import Typography, { ITypo } from "@Front/Components/DesignSystem/Typography"; import Typography, { ITypo } from "@Front/Components/DesignSystem/Typography";
import DefaultDeedTypesDashboard from "@Front/Components/LayoutTemplates/DefaultDeedTypeDashboard"; import DefaultDeedTypesDashboard from "@Front/Components/LayoutTemplates/DefaultDeedTypeDashboard";
import Module from "@Front/Config/Module"; import Module from "@Front/Config/Module";
import JwtService from "@Front/Services/JwtService/JwtService"; import JwtService from "@Front/Services/JwtService/JwtService";
import { DeedType, Office } from "le-coffre-resources/dist/Admin"; import { DeedType, Office } from "le-coffre-resources/dist/Admin";
import { useRouter } from "next/router"; import { useRouter } from "next/router";
import { useCallback } from "react"; import { useCallback, useState } from "react";
import classes from "./classes.module.scss"; import classes from "./classes.module.scss";
type IProps = {}; type IProps = {};
export default function DeedTypesCreate(props: IProps) { export default function DeedTypesCreate(props: IProps) {
const [hasChanged, setHasChanged] = useState<boolean>(false);
const [isConfirmModalVisible, setIsConfirmModalVisible] = useState<boolean>(false);
const router = useRouter(); const router = useRouter();
const onSubmitHandler = useCallback( const onSubmitHandler = useCallback(
async (e: React.FormEvent<HTMLFormElement> | null, values: { [key: string]: string }) => { async (e: React.FormEvent<HTMLFormElement> | null, values: { [key: string]: string }) => {
@ -42,20 +46,58 @@ export default function DeedTypesCreate(props: IProps) {
[router], [router],
); );
const closeConfirmModal = useCallback(() => {
setIsConfirmModalVisible(false);
}, []);
const onFieldChange = useCallback((name: string, field: any) => {
setHasChanged(true);
}, []);
const redirect = useCallback(() => {
router.push(
Module.getInstance()
.get()
.modules.pages.DeedTypes.props.path
);
}, [router]);
const onCancel = useCallback(() => {
if (hasChanged) {
setIsConfirmModalVisible(true);
} else {
redirect();
}
}, [hasChanged, redirect]);
return ( return (
<DefaultDeedTypesDashboard mobileBackText={"Liste des types d'actes"} hasBackArrow title="Créer un type d'acte"> <DefaultDeedTypesDashboard mobileBackText={"Liste des types d'actes"} hasBackArrow title="Créer un type d'acte">
<div className={classes["root"]}> <div className={classes["root"]}>
<div className={classes["header"]}> <div className={classes["header"]}>
<Typography typo={ITypo.H1Bis}>Créer un type d'acte</Typography> <Typography typo={ITypo.H1Bis}>Créer un type d'acte</Typography>
</div> </div>
<Form onSubmit={onSubmitHandler} className={classes["form-container"]}> <Form onSubmit={onSubmitHandler} className={classes["form-container"]} onFieldChange={onFieldChange}>
<TextField name="name" placeholder="Nom de l'acte" /> <TextField name="name" placeholder="Nom de l'acte" />
<TextAreaField name="description" placeholder="Description" /> <TextAreaField name="description" placeholder="Description" />
<div className={classes["buttons-container"]}> <div className={classes["buttons-container"]}>
<Button variant={EButtonVariant.GHOST}>Annuler</Button> <Button variant={EButtonVariant.GHOST} onClick={onCancel}>Annuler</Button>
<Button type="submit">Créer le type d'acte</Button> <Button type="submit">Créer le type d'acte</Button>
</div> </div>
</Form> </Form>
<Confirm
isOpen={isConfirmModalVisible}
onClose={closeConfirmModal}
onAccept={redirect}
closeBtn
header={"Êtes-vous sur de vouloir quitter sans enregistrer ?"}
cancelText={"Annuler"}
confirmText={"Quitter"}>
<div className={classes["modal-content"]}>
<Typography typo={ITypo.P_16} className={classes["text"]}>
Si vous quittez, toutes les modifications que vous avez effectuées ne seront pas enregistrées.
</Typography>
</div>
</Confirm>
</div> </div>
</DefaultDeedTypesDashboard> </DefaultDeedTypesDashboard>
); );

View File

@ -3,6 +3,7 @@ import Button, { EButtonVariant } from "@Front/Components/DesignSystem/Button";
import Form from "@Front/Components/DesignSystem/Form"; import Form from "@Front/Components/DesignSystem/Form";
import TextAreaField from "@Front/Components/DesignSystem/Form/TextareaField"; import TextAreaField from "@Front/Components/DesignSystem/Form/TextareaField";
import TextField from "@Front/Components/DesignSystem/Form/TextField"; import TextField from "@Front/Components/DesignSystem/Form/TextField";
import Confirm from "@Front/Components/DesignSystem/Modal/Confirm";
import Typography, { ITypo } from "@Front/Components/DesignSystem/Typography"; import Typography, { ITypo } from "@Front/Components/DesignSystem/Typography";
import DefaultDeedTypesDashboard from "@Front/Components/LayoutTemplates/DefaultDeedTypeDashboard"; import DefaultDeedTypesDashboard from "@Front/Components/LayoutTemplates/DefaultDeedTypeDashboard";
import Module from "@Front/Config/Module"; import Module from "@Front/Config/Module";
@ -17,8 +18,11 @@ export default function DeedTypesEdit() {
let { deedTypeUid } = router.query; let { deedTypeUid } = router.query;
const [deedTypeSelected, setDeedTypeSelected] = useState<DeedType | null>(null); const [deedTypeSelected, setDeedTypeSelected] = useState<DeedType | null>(null);
const [hasChanged, setHasChanged] = useState<boolean>(false);
const [isConfirmModalVisible, setIsConfirmModalVisible] = useState<boolean>(false);
useEffect(() => { useEffect(() => {
setHasChanged(false);
async function getDeedType() { async function getDeedType() {
if (!deedTypeUid) return; if (!deedTypeUid) return;
const deedType = await DeedTypes.getInstance().getByUid(deedTypeUid as string, { const deedType = await DeedTypes.getInstance().getByUid(deedTypeUid as string, {
@ -32,6 +36,10 @@ export default function DeedTypesEdit() {
getDeedType(); getDeedType();
}, [deedTypeUid]); }, [deedTypeUid]);
const closeConfirmModal = useCallback(() => {
setIsConfirmModalVisible(false);
}, []);
const onSubmitHandler = useCallback( const onSubmitHandler = useCallback(
async (e: React.FormEvent<HTMLFormElement> | null, values: { [key: string]: string }) => { async (e: React.FormEvent<HTMLFormElement> | null, values: { [key: string]: string }) => {
try { try {
@ -55,20 +63,56 @@ export default function DeedTypesEdit() {
[deedTypeUid, router], [deedTypeUid, router],
); );
const onFieldChange = useCallback((name: string, field: any) => {
setHasChanged(true);
}, []);
const redirect = useCallback(() => {
router.push(
Module.getInstance()
.get()
.modules.pages.DeedTypes.pages.DeedTypesInformations.props.path.replace("[uid]", deedTypeUid as string),
);
}, [deedTypeUid, router]);
const onCancel = useCallback(() => {
if (hasChanged) {
setIsConfirmModalVisible(true);
} else {
redirect();
}
}, [hasChanged, redirect]);
return ( return (
<DefaultDeedTypesDashboard mobileBackText={"Liste des types d'actes"} hasBackArrow title="Modifier les informations d'un acte"> <DefaultDeedTypesDashboard mobileBackText={"Liste des types d'actes"} hasBackArrow title="Modifier les informations d'un acte">
<div className={classes["root"]}> <div className={classes["root"]}>
<div className={classes["header"]}> <div className={classes["header"]}>
<Typography typo={ITypo.H1Bis}>Modifier les informations de l'acte</Typography> <Typography typo={ITypo.H1Bis}>Modifier les informations de l'acte</Typography>
</div> </div>
<Form onSubmit={onSubmitHandler} className={classes["form-container"]}> <Form onSubmit={onSubmitHandler} className={classes["form-container"]} onFieldChange={onFieldChange}>
<TextField name="name" placeholder="Nom de l'acte" defaultValue={deedTypeSelected?.name} /> <TextField name="name" placeholder="Nom de l'acte" defaultValue={deedTypeSelected?.name} />
<TextAreaField name="description" placeholder="Description" defaultValue={deedTypeSelected?.description} /> <TextAreaField name="description" placeholder="Description" defaultValue={deedTypeSelected?.description} />
<div className={classes["buttons-container"]}> <div className={classes["buttons-container"]}>
<Button variant={EButtonVariant.GHOST}>Annuler</Button> <Button variant={EButtonVariant.GHOST} onClick={onCancel}>
Annuler
</Button>
<Button type="submit">Enregistrer</Button> <Button type="submit">Enregistrer</Button>
</div> </div>
</Form> </Form>
<Confirm
isOpen={isConfirmModalVisible}
onClose={closeConfirmModal}
onAccept={redirect}
closeBtn
header={"Êtes-vous sur de vouloir quitter sans enregistrer ?"}
cancelText={"Annuler"}
confirmText={"Quitter"}>
<div className={classes["modal-content"]}>
<Typography typo={ITypo.P_16} className={classes["text"]}>
Si vous quittez, toutes les modifications que vous avez effectuées ne seront pas enregistrées.
</Typography>
</div>
</Confirm>
</div> </div>
</DefaultDeedTypesDashboard> </DefaultDeedTypesDashboard>
); );