Can update family settings
This commit is contained in:
		@@ -16,6 +16,7 @@ import { BaseAuthenticatedPage } from "./widgets/BaseAuthenticatedPage";
 | 
				
			|||||||
import { BaseFamilyRoute } from "./widgets/BaseFamilyRoute";
 | 
					import { BaseFamilyRoute } from "./widgets/BaseFamilyRoute";
 | 
				
			||||||
import { BaseLoginPage } from "./widgets/BaseLoginpage";
 | 
					import { BaseLoginPage } from "./widgets/BaseLoginpage";
 | 
				
			||||||
import { FamilyUsersListRoute } from "./routes/family/FamilyUsersListRoute";
 | 
					import { FamilyUsersListRoute } from "./routes/family/FamilyUsersListRoute";
 | 
				
			||||||
 | 
					import { FamilySettingsRoute } from "./routes/family/FamilySettingsRoute";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
interface AuthContext {
 | 
					interface AuthContext {
 | 
				
			||||||
  signedIn: boolean;
 | 
					  signedIn: boolean;
 | 
				
			||||||
@@ -46,6 +47,7 @@ export function App(): React.ReactElement {
 | 
				
			|||||||
            <Route path="profile" element={<ProfileRoute />} />
 | 
					            <Route path="profile" element={<ProfileRoute />} />
 | 
				
			||||||
            <Route path="family/:familyId/*" element={<BaseFamilyRoute />}>
 | 
					            <Route path="family/:familyId/*" element={<BaseFamilyRoute />}>
 | 
				
			||||||
              <Route path="" element={<FamilyHomeRoute />} />
 | 
					              <Route path="" element={<FamilyHomeRoute />} />
 | 
				
			||||||
 | 
					              <Route path="settings" element={<FamilySettingsRoute />} />
 | 
				
			||||||
              <Route path="users" element={<FamilyUsersListRoute />} />
 | 
					              <Route path="users" element={<FamilyUsersListRoute />} />
 | 
				
			||||||
              <Route path="*" element={<NotFoundRoute />} />
 | 
					              <Route path="*" element={<NotFoundRoute />} />
 | 
				
			||||||
            </Route>
 | 
					            </Route>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -186,4 +186,20 @@ export class FamilyApi {
 | 
				
			|||||||
      uri: `/family/${user.family_id}/user/${user.user_id}`,
 | 
					      uri: `/family/${user.family_id}/user/${user.user_id}`,
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Update a family settings
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  static async UpdateFamily(settings: {
 | 
				
			||||||
 | 
					    id: number;
 | 
				
			||||||
 | 
					    name: string;
 | 
				
			||||||
 | 
					  }): Promise<void> {
 | 
				
			||||||
 | 
					    await APIClient.exec({
 | 
				
			||||||
 | 
					      method: "PATCH",
 | 
				
			||||||
 | 
					      uri: `/family/${settings.id}`,
 | 
				
			||||||
 | 
					      jsonData: {
 | 
				
			||||||
 | 
					        name: settings.name,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										105
									
								
								geneit_app/src/routes/family/FamilySettingsRoute.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								geneit_app/src/routes/family/FamilySettingsRoute.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,105 @@
 | 
				
			|||||||
 | 
					import {
 | 
				
			||||||
 | 
					  Alert,
 | 
				
			||||||
 | 
					  Box,
 | 
				
			||||||
 | 
					  Button,
 | 
				
			||||||
 | 
					  Card,
 | 
				
			||||||
 | 
					  CardActions,
 | 
				
			||||||
 | 
					  CardContent,
 | 
				
			||||||
 | 
					  TextField,
 | 
				
			||||||
 | 
					  Typography,
 | 
				
			||||||
 | 
					} from "@mui/material";
 | 
				
			||||||
 | 
					import React from "react";
 | 
				
			||||||
 | 
					import { FamilyApi } from "../../api/FamilyApi";
 | 
				
			||||||
 | 
					import { ServerApi } from "../../api/ServerApi";
 | 
				
			||||||
 | 
					import { useAlert } from "../../context_providers/AlertDialogProvider";
 | 
				
			||||||
 | 
					import { useFamily } from "../../widgets/BaseFamilyRoute";
 | 
				
			||||||
 | 
					import { formatDate } from "../../widgets/TimeWidget";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export function FamilySettingsRoute(): React.ReactElement {
 | 
				
			||||||
 | 
					  const family = useFamily();
 | 
				
			||||||
 | 
					  const alert = useAlert();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const [newName, setNewName] = React.useState(family.family.name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const canEdit = family.family.is_admin;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const [error, setError] = React.useState<string | null>(null);
 | 
				
			||||||
 | 
					  const [success, setSuccess] = React.useState<string | null>(null);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const updateFamily = async () => {
 | 
				
			||||||
 | 
					    try {
 | 
				
			||||||
 | 
					      setError(null);
 | 
				
			||||||
 | 
					      setSuccess(null);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      await FamilyApi.UpdateFamily({
 | 
				
			||||||
 | 
					        id: family.family.family_id,
 | 
				
			||||||
 | 
					        name: newName,
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      family.reloadFamilyInfo();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      alert("Les paramètres de la famille ont été mis à jour avec succès !");
 | 
				
			||||||
 | 
					    } catch (e) {
 | 
				
			||||||
 | 
					      console.error(e);
 | 
				
			||||||
 | 
					      setError("Echec de la mise à jour des paramètres de la famille !");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return (
 | 
				
			||||||
 | 
					    <>
 | 
				
			||||||
 | 
					      <Card style={{ margin: "10px auto", maxWidth: "450px" }}>
 | 
				
			||||||
 | 
					        {error && <Alert severity="error">{error}</Alert>}
 | 
				
			||||||
 | 
					        {success && <Alert severity="success">{success}</Alert>}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <CardContent>
 | 
				
			||||||
 | 
					          <Typography gutterBottom variant="h5" component="div">
 | 
				
			||||||
 | 
					            Paramètres de la famille
 | 
				
			||||||
 | 
					          </Typography>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          <Box
 | 
				
			||||||
 | 
					            component="form"
 | 
				
			||||||
 | 
					            sx={{
 | 
				
			||||||
 | 
					              "& .MuiTextField-root": { my: 1 },
 | 
				
			||||||
 | 
					            }}
 | 
				
			||||||
 | 
					            noValidate
 | 
				
			||||||
 | 
					            autoComplete="off"
 | 
				
			||||||
 | 
					          >
 | 
				
			||||||
 | 
					            <TextField
 | 
				
			||||||
 | 
					              disabled
 | 
				
			||||||
 | 
					              fullWidth
 | 
				
			||||||
 | 
					              label="Identifiant"
 | 
				
			||||||
 | 
					              value={family.family.family_id}
 | 
				
			||||||
 | 
					            />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            <TextField
 | 
				
			||||||
 | 
					              disabled
 | 
				
			||||||
 | 
					              fullWidth
 | 
				
			||||||
 | 
					              label="Création de la famille"
 | 
				
			||||||
 | 
					              value={formatDate(family.family.time_create)}
 | 
				
			||||||
 | 
					            />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            <TextField
 | 
				
			||||||
 | 
					              fullWidth
 | 
				
			||||||
 | 
					              label="Nom de la famille"
 | 
				
			||||||
 | 
					              value={newName}
 | 
				
			||||||
 | 
					              disabled={!canEdit}
 | 
				
			||||||
 | 
					              onChange={(e) => setNewName(e.target.value)}
 | 
				
			||||||
 | 
					              inputProps={{
 | 
				
			||||||
 | 
					                maxLength: ServerApi.Config.constraints.family_name_len.max,
 | 
				
			||||||
 | 
					              }}
 | 
				
			||||||
 | 
					            />
 | 
				
			||||||
 | 
					          </Box>
 | 
				
			||||||
 | 
					        </CardContent>
 | 
				
			||||||
 | 
					        <CardActions>
 | 
				
			||||||
 | 
					          <Button
 | 
				
			||||||
 | 
					            onClick={updateFamily}
 | 
				
			||||||
 | 
					            disabled={!canEdit}
 | 
				
			||||||
 | 
					            style={{ marginLeft: "auto" }}
 | 
				
			||||||
 | 
					          >
 | 
				
			||||||
 | 
					            Enregistrer
 | 
				
			||||||
 | 
					          </Button>
 | 
				
			||||||
 | 
					        </CardActions>
 | 
				
			||||||
 | 
					      </Card>
 | 
				
			||||||
 | 
					    </>
 | 
				
			||||||
 | 
					  );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -98,6 +98,13 @@ pub async fn update(
 | 
				
			|||||||
    f: FamilyInPathWithAdminMembership,
 | 
					    f: FamilyInPathWithAdminMembership,
 | 
				
			||||||
    req: web::Json<UpdateFamilyBody>,
 | 
					    req: web::Json<UpdateFamilyBody>,
 | 
				
			||||||
) -> HttpResult {
 | 
					) -> HttpResult {
 | 
				
			||||||
 | 
					    if !StaticConstraints::default()
 | 
				
			||||||
 | 
					        .family_name_len
 | 
				
			||||||
 | 
					        .validate(&req.name)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return Ok(HttpResponse::BadRequest().body("Invalid family name!"));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let mut family = families_service::get_by_id(f.family_id()).await?;
 | 
					    let mut family = families_service::get_by_id(f.family_id()).await?;
 | 
				
			||||||
    family.name = req.0.name;
 | 
					    family.name = req.0.name;
 | 
				
			||||||
    families_service::update_family(&family).await?;
 | 
					    families_service::update_family(&family).await?;
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user