import AddIcon from "@mui/icons-material/Add"; import DeleteIcon from "@mui/icons-material/DeleteOutlined"; import EditIcon from "@mui/icons-material/Edit"; import FemaleIcon from "@mui/icons-material/Female"; import MaleIcon from "@mui/icons-material/Male"; import VisibilityIcon from "@mui/icons-material/Visibility"; import { Button, TextField, Tooltip, Typography } from "@mui/material"; import { DataGrid, GridActionsCellItem, GridColDef } from "@mui/x-data-grid"; import React from "react"; import { useNavigate } from "react-router-dom"; import { Member, MemberApi, dateTimestamp, fmtDate, } from "../../api/genealogy/MemberApi"; import { useAlert } from "../../hooks/context_providers/AlertDialogProvider"; import { useConfirm } from "../../hooks/context_providers/ConfirmDialogProvider"; import { useSnackbar } from "../../hooks/context_providers/SnackbarProvider"; import { useFamily } from "../../widgets/BaseFamilyRoute"; import { FamilyPageTitle } from "../../widgets/FamilyPageTitle"; import { MemberPhoto } from "../../widgets/MemberPhoto"; import { RouterLink } from "../../widgets/RouterLink"; export function FamilyMembersListRoute(): React.ReactElement { const alert = useAlert(); const confirm = useConfirm(); const snackbar = useSnackbar(); const family = useFamily(); const [filter, setFilter] = React.useState(""); const processDeletion = async (m: Member) => { try { if ( !(await confirm( `Voulez-vous vraiment supprimer la fiche de ${m.fullName} ?` )) ) return; await MemberApi.Delete(m); await family.reloadMembersList(); snackbar("La fiche du membre a été supprimée avec succès !"); } catch (e) { console.error(e); alert("Echec de la suppression de la fiche ! "); } }; return ( <>
{family.members.isEmpty ? (

Votre famille n'a aucun membre pour le moment ! Utilisez le bouton situé en haut à droite pour créer le premier !

) : ( <> setFilter(e.target.value)} style={{ maxWidth: "500px", margin: "10px" }} /> m.fullName.toLowerCase().includes(filter.toLowerCase()) ) } onDelete={processDeletion} /> )} ); } function MembersTable(p: { members: Member[]; onDelete: (m: Member) => void; }): React.ReactElement { const family = useFamily(); const n = useNavigate(); const columns: GridColDef[] = [ { field: "signed_photo_id", headerName: "", disableColumnMenu: true, sortable: false, width: 60, renderCell(params) { return ; }, }, { field: "last_name", headerName: "Nom", flex: 3, }, { field: "first_name", headerName: "Prénom", flex: 3, }, { field: "sex", headerName: "", disableColumnMenu: true, width: 20, renderCell(params) { if (params.row.sex === "F") return ; else return ; }, }, { field: "dateOfBirth", headerName: "Date de naissance", flex: 3, sortComparator(v1, v2) { const d1 = dateTimestamp(v1); const d2 = dateTimestamp(v2); return d1 - d2; }, renderCell(params) { return fmtDate(params.row.dateOfBirth); }, }, { field: "dateOfDeath", headerName: "Date de décès", flex: 3, sortComparator(v1, v2) { const d1 = dateTimestamp(v1); const d2 = dateTimestamp(v2); return d1 - d2; }, renderCell(params) { return fmtDate(params.row.dateOfDeath); }, }, { field: "father", headerName: "Père", flex: 5, renderCell(params) { if (!params.row.father) return Non renseigné; return family.members.get(params.row.father)!.fullName; }, }, { field: "mother", headerName: "Mère", flex: 5, renderCell(params) { if (!params.row.mother) return Non renseignée; return family.members.get(params.row.mother)!.fullName; }, }, { field: "actions", type: "actions", sortable: false, width: 120, disableColumnMenu: true, getActions(params) { return [ } label="Consulter le membre" className="textPrimary" onClick={() => n(family.family.memberURL(params.row))} color="inherit" />, } label="Modifier le membre" className="textPrimary" onClick={() => n(family.family.memberURL(params.row, true))} color="inherit" />, } label="Supprimer le membre" onClick={() => p.onDelete(params.row)} color="inherit" />, ]; }, }, ]; return ( c.id} onRowDoubleClick={(p) => n(family.family.memberURL(p.row))} /> ); }