Can set member email and phone number

This commit is contained in:
Pierre HUBERT 2023-08-11 10:49:40 +02:00
parent 335ff0f178
commit 39190de454
5 changed files with 50 additions and 10 deletions

View File

@ -25,6 +25,7 @@
"@types/react": "^18.2.8", "@types/react": "^18.2.8",
"@types/react-dom": "^18.2.4", "@types/react-dom": "^18.2.4",
"date-and-time": "^3.0.1", "date-and-time": "^3.0.1",
"email-validator": "^2.0.4",
"filesize": "^10.0.9", "filesize": "^10.0.9",
"react": "^18.2.0", "react": "^18.2.0",
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
@ -6767,6 +6768,14 @@
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.454.tgz", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.454.tgz",
"integrity": "sha512-pmf1rbAStw8UEQ0sr2cdJtWl48ZMuPD9Sto8HVQOq9vx9j2WgDEN6lYoaqFvqEHYOmGA9oRGn7LqWI9ta0YugQ==" "integrity": "sha512-pmf1rbAStw8UEQ0sr2cdJtWl48ZMuPD9Sto8HVQOq9vx9j2WgDEN6lYoaqFvqEHYOmGA9oRGn7LqWI9ta0YugQ=="
}, },
"node_modules/email-validator": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/email-validator/-/email-validator-2.0.4.tgz",
"integrity": "sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ==",
"engines": {
"node": ">4.0"
}
},
"node_modules/emittery": { "node_modules/emittery": {
"version": "0.8.1", "version": "0.8.1",
"resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz",

View File

@ -20,6 +20,7 @@
"@types/react": "^18.2.8", "@types/react": "^18.2.8",
"@types/react-dom": "^18.2.4", "@types/react-dom": "^18.2.4",
"date-and-time": "^3.0.1", "date-and-time": "^3.0.1",
"email-validator": "^2.0.4",
"filesize": "^10.0.9", "filesize": "^10.0.9",
"react": "^18.2.0", "react": "^18.2.0",
"react-dom": "^18.2.0", "react-dom": "^18.2.0",

View File

@ -3,6 +3,7 @@ import DeleteIcon from "@mui/icons-material/Delete";
import EditIcon from "@mui/icons-material/Edit"; import EditIcon from "@mui/icons-material/Edit";
import SaveIcon from "@mui/icons-material/Save"; import SaveIcon from "@mui/icons-material/Save";
import { Button, Grid, Stack } from "@mui/material"; import { Button, Grid, Stack } from "@mui/material";
import * as EmailValidator from "email-validator";
import React from "react"; import React from "react";
import FileDownloadIcon from "@mui/icons-material/FileDownload"; import FileDownloadIcon from "@mui/icons-material/FileDownload";
import { useNavigate, useParams } from "react-router-dom"; import { useNavigate, useParams } from "react-router-dom";
@ -494,7 +495,32 @@ export function MemberPage(p: {
{/* Contact */} {/* Contact */}
<Grid item sm={12} md={6}> <Grid item sm={12} md={6}>
<PropertiesBox title="Contact">TODO</PropertiesBox> <PropertiesBox title="Contact">
{/* Email */}
<PropEdit
label="Adresse mail"
editable={p.editing}
value={member.email}
onValueChange={(v) => {
member.email = v;
updatedMember();
}}
size={ServerApi.Config.constraints.member_email}
checkValue={(e) => EmailValidator.validate(e)}
/>
{/* Phone number */}
<PropEdit
label="Téléphone"
editable={p.editing}
value={member.phone}
onValueChange={(v) => {
member.phone = v;
updatedMember();
}}
size={ServerApi.Config.constraints.member_phone}
/>
</PropertiesBox>
</Grid> </Grid>
{/* Bio */} {/* Bio */}

View File

@ -1,25 +1,21 @@
import { mdiCross } from "@mdi/js";
import Icon from "@mdi/react";
import ClearIcon from "@mui/icons-material/Clear";
import { import {
Autocomplete, Autocomplete,
Avatar,
Box,
IconButton, IconButton,
ListItem,
ListItemAvatar, ListItemAvatar,
ListItemButton, ListItemButton,
ListItemSecondaryAction, ListItemSecondaryAction,
ListItemText, ListItemText,
TextField, TextField,
Typography, Typography,
autocompleteClasses,
} from "@mui/material"; } from "@mui/material";
import ClearIcon from "@mui/icons-material/Clear"; import React from "react";
import { useNavigate } from "react-router-dom";
import { Member, fmtDate } from "../../api/MemberApi"; import { Member, fmtDate } from "../../api/MemberApi";
import { useFamily } from "../BaseFamilyRoute"; import { useFamily } from "../BaseFamilyRoute";
import React from "react";
import { MemberPhoto } from "../MemberPhoto"; import { MemberPhoto } from "../MemberPhoto";
import Icon from "@mdi/react";
import { mdiCross } from "@mdi/js";
import { useNavigate } from "react-router-dom";
export function MemberInput(p: { export function MemberInput(p: {
editable: boolean; editable: boolean;

View File

@ -10,6 +10,7 @@ export function PropEdit(p: {
value?: string; value?: string;
onValueChange: (newVal: string | undefined) => void; onValueChange: (newVal: string | undefined) => void;
size: LenConstraint; size: LenConstraint;
checkValue?: (s: string) => boolean;
}): React.ReactElement { }): React.ReactElement {
if (((!p.editable && p.value) ?? "") === "") return <></>; if (((!p.editable && p.value) ?? "") === "") return <></>;
@ -30,6 +31,13 @@ export function PropEdit(p: {
}} }}
variant={p.editable ? "filled" : "standard"} variant={p.editable ? "filled" : "standard"}
style={{ width: "100%", marginBottom: "15px" }} style={{ width: "100%", marginBottom: "15px" }}
error={
(p.checkValue &&
p.value &&
p.value.length > 0 &&
!p.checkValue(p.value)) ||
false
}
/> />
); );
} }