GeneIT/geneit_app/src/dialogs/accommodations/UpdateAccommodationDialog.tsx
Pierre HUBERT 3cdfc4d3c7
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
Add color to accommodations
2024-06-20 21:46:45 +02:00

156 lines
4.2 KiB
TypeScript

import {
Button,
Dialog,
DialogActions,
DialogContent,
DialogTitle,
Tooltip,
} from "@mui/material";
import React from "react";
import { ServerApi } from "../../api/ServerApi";
import { UpdateAccommodation } from "../../api/accommodations/AccommodationListApi";
import { checkConstraint } from "../../utils/from_utils";
import { PropCheckbox } from "../../widgets/forms/PropCheckbox";
import { PropEdit } from "../../widgets/forms/PropEdit";
import { PropColorPicker } from "../../widgets/forms/PropColorPicker";
export function UpdateAccommodationDialog(p: {
open: boolean;
create: boolean;
onClose: () => void;
onSubmitted: (c: UpdateAccommodation) => void;
accommodation: UpdateAccommodation | undefined;
}): React.ReactElement {
const [accommodation, setAccommodation] = React.useState<
UpdateAccommodation | undefined
>();
const nameErr = checkConstraint(
ServerApi.Config.constraints.accommodation_name_len,
accommodation?.name
);
const descriptionErr = checkConstraint(
ServerApi.Config.constraints.accommodation_description_len,
accommodation?.description
);
const clearForm = () => {
setAccommodation(undefined);
};
const cancel = () => {
clearForm();
p.onClose();
};
const submit = async () => {
clearForm();
p.onSubmitted(accommodation!);
};
React.useEffect(() => {
if (!accommodation) setAccommodation(p.accommodation);
}, [p.open, p.accommodation]);
return (
<Dialog open={p.open} onClose={cancel}>
<DialogTitle>
{p.create ? "Création" : "Mise à jour"} d'un logement
</DialogTitle>
<DialogContent style={{ display: "flex", flexDirection: "column" }}>
<PropEdit
editable
label="Nom"
value={accommodation?.name}
onValueChange={(s) =>
setAccommodation((a) => {
return {
...a!,
name: s!,
};
})
}
size={ServerApi.Config.constraints.accommodation_name_len}
helperText={nameErr}
/>
<PropEdit
editable
label="Description"
value={accommodation?.description}
onValueChange={(s) =>
setAccommodation((a) => {
return {
...a!,
description: s!,
};
})
}
size={ServerApi.Config.constraints.accommodation_description_len}
helperText={descriptionErr}
/>
<PropColorPicker
editable
label="Couleur"
value={accommodation?.color}
onChange={(s) =>
setAccommodation((a) => {
return {
...a!,
color: s!,
};
})
}
/>
<PropCheckbox
editable
label="Ouvert aux réservations"
checked={accommodation?.open_to_reservations === true}
onValueChange={(c) =>
setAccommodation((a) => {
return {
...a!,
open_to_reservations: c,
};
})
}
/>
<Tooltip
title={
"Permet de spécifier si un administrateur de la famille doit valider manuellement les demandes de réservation pour qu'elles soient validées"
}
>
<PropCheckbox
checkboxAlwaysVisible
editable={accommodation?.open_to_reservations === true}
label="Validation des réservations par un administrateur requise"
checked={accommodation?.need_validation === true}
onValueChange={(c) =>
setAccommodation((a) => {
return {
...a!,
need_validation: c,
};
})
}
/>
</Tooltip>
</DialogContent>
<DialogActions>
<Button onClick={cancel}>Annuler</Button>
<Button
onClick={submit}
disabled={
!!nameErr || (!!accommodation?.description && !!descriptionErr)
}
>
{p.create ? "Créer" : "Mettre à jour"}
</Button>
</DialogActions>
</Dialog>
);
}