Can set member email and phone number
This commit is contained in:
		
							
								
								
									
										9
									
								
								geneit_app/package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										9
									
								
								geneit_app/package-lock.json
									
									
									
										generated
									
									
									
								
							@@ -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",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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 */}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
    />
 | 
					    />
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user