From 6e79a0d48f3087e92b9bb3ae5e3c173ae198e2aa Mon Sep 17 00:00:00 2001 From: Theo Date: Fri, 16 Aug 2024 13:59:17 +0200 Subject: [PATCH 01/60] feat(organisation): wip service/equipe --- api-server/src/common/model/Team.ts | 28 ++- .../department/DepartmentController.ts | 11 + .../department/DepartmentRepository.ts | 11 + .../resources/department/DepartmentService.ts | 22 ++ .../src/resources/team/TeamController.ts | 8 + .../src/resources/team/TeamRepository.ts | 30 +++ api-server/src/resources/team/TeamService.ts | 44 +++- api-server/src/resources/team/dto/TeamDTO.ts | 4 +- .../organisation/CreateTeamFormData.model.ts | 21 ++ .../src/models/organisation/TeamList.model.ts | 5 +- .../components/agencyDepartment.tsx | 8 +- .../organisation/components/agencyTeam.tsx | 18 +- .../components/service/agencyTeamCreate.tsx | 201 +++++++++++++++++- .../src/modules/organisation/pages/Agency.tsx | 4 +- 14 files changed, 389 insertions(+), 26 deletions(-) create mode 100644 react-app/src/models/organisation/CreateTeamFormData.model.ts diff --git a/api-server/src/common/model/Team.ts b/api-server/src/common/model/Team.ts index 1beea7a..72c3bf5 100644 --- a/api-server/src/common/model/Team.ts +++ b/api-server/src/common/model/Team.ts @@ -4,7 +4,7 @@ export class Team { id: number; label: string; minimum_users: number; - id_user_lead_service: number; + id_user_lead_team: number; id_service: number; service_label: string; @@ -12,15 +12,37 @@ export class Team { id: number, label: string, minimum_users: number, - id_user_lead_service: number, + id_user_lead_team: number, id_service: number, service_label: string, ) { this.id = id; this.label = label; this.minimum_users = minimum_users; - this.id_user_lead_service = id_user_lead_service; + this.id_user_lead_team = id_user_lead_team; this.id_service = id_service; this.service_label = service_label; } } + +export class CreateTeam { + label: string; + minimum_users: number; + id_user_lead_team: number; + id_service: number; + members: number[]; + + constructor( + label: string, + minimum_users: number, + id_user_lead_team: number, + id_service: number, + members: number[], + ) { + this.label = label; + this.minimum_users = minimum_users; + this.id_user_lead_team = id_user_lead_team; + this.id_service = id_service; + this.members = members; + } +} diff --git a/api-server/src/resources/department/DepartmentController.ts b/api-server/src/resources/department/DepartmentController.ts index 7508efc..28a3466 100644 --- a/api-server/src/resources/department/DepartmentController.ts +++ b/api-server/src/resources/department/DepartmentController.ts @@ -15,6 +15,17 @@ router.get("/:id", verifyToken, async (req: Request, res: Response) => { }); }); +router.get("list/:id", verifyToken, async (req: Request, res: Response) => { + const { code, message, data } = + await DepartmentService.getDepartmentByAgencyWithoutPagination( + +req.params.id, + ); + res.status(code).json({ + message, + data, + }); +}); + router.post("/create/:id", verifyToken, async (req: Request, res: Response) => { const { code, message, data } = await DepartmentService.createDepartment( +req.params.id, diff --git a/api-server/src/resources/department/DepartmentRepository.ts b/api-server/src/resources/department/DepartmentRepository.ts index cdd6139..9391514 100644 --- a/api-server/src/resources/department/DepartmentRepository.ts +++ b/api-server/src/resources/department/DepartmentRepository.ts @@ -20,6 +20,17 @@ export class DepartmentRepository { return rows; } + public static async getDepartmentByAgencyIdWithoutCount(agencyId: number) { + const [rows] = await this.pool.query( + `SELECT * + FROM service + WHERE id_agency = ? + ORDER BY label `, + [agencyId], + ); + return rows; + } + public static async getCountByAgencyId(agencyId: number) { const [rows]: any = await this.pool.query( `SELECT COUNT(*) as count diff --git a/api-server/src/resources/department/DepartmentService.ts b/api-server/src/resources/department/DepartmentService.ts index 74a8ed5..1dacbb1 100644 --- a/api-server/src/resources/department/DepartmentService.ts +++ b/api-server/src/resources/department/DepartmentService.ts @@ -7,6 +7,28 @@ import { CreateDepartment, Department } from "../../common/model/Department.js"; import { DepartmentDTO } from "./dto/DepartmentDTO.js"; export class DepartmentService { + public static async getDepartmentByAgencyWithoutPagination(idAgency: number) { + try { + const departments: any = + await DepartmentRepository.getDepartmentByAgencyIdWithoutCount( + idAgency, + ); + + if (!departments) { + return new ControllerResponse(401, "Departments doesn't exist"); + } + const departmentsDto: DepartmentDTO[] = departments.map( + (department: Department) => new DepartmentDTO(department), + ); + return new ControllerResponse(200, "", { + list: departmentsDto, + }); + } catch (error) { + logger.error(`Failed to get the departments. Error: ${error}`); + return new ControllerResponse(500, "Failed to get departments"); + } + } + public static async getDepartmentByAgency(idAgency: number) { try { const departments: any = diff --git a/api-server/src/resources/team/TeamController.ts b/api-server/src/resources/team/TeamController.ts index 30455b1..479d590 100644 --- a/api-server/src/resources/team/TeamController.ts +++ b/api-server/src/resources/team/TeamController.ts @@ -14,4 +14,12 @@ router.get("/:id", verifyToken, async (req: Request, res: Response) => { }); }); +router.post("/create", verifyToken, async (req: Request, res: Response) => { + const { code, message, data } = await TeamService.createTeam(req); + res.status(code).json({ + message, + data, + }); +}); + export default router; diff --git a/api-server/src/resources/team/TeamRepository.ts b/api-server/src/resources/team/TeamRepository.ts index d271e02..7e4a16e 100644 --- a/api-server/src/resources/team/TeamRepository.ts +++ b/api-server/src/resources/team/TeamRepository.ts @@ -1,4 +1,5 @@ import { DatabaseClient } from "../../common/helper/DatabaseClient.js"; +import { CreateTeam } from "../../common/model/Team.js"; export class TeamRepository { private static pool = DatabaseClient.mysqlPool; @@ -30,4 +31,33 @@ export class TeamRepository { ); return rows[0].count; } + + public static async createTeam(team: CreateTeam) { + const [result]: any = await this.pool.query( + ` + INSERT INTO team (label, + minimum_users, + id_user_lead_team, + id_service) + VALUES (?, ?, ?, ?) + `, + [team.label, team.minimum_users, team.id_user_lead_team, team.id_service], + ); + return result; + } + + public static async addMemberToTeam(member: { + id_team: number; + id_user: number; + }) { + const [result]: any = await this.pool.query( + ` + INSERT INTO belong_team (id_team, id_user) + VALUES (?, ?) + `, + [member.id_team, member.id_user], + ); + + return result; + } } diff --git a/api-server/src/resources/team/TeamService.ts b/api-server/src/resources/team/TeamService.ts index 92842d3..eebaf5f 100644 --- a/api-server/src/resources/team/TeamService.ts +++ b/api-server/src/resources/team/TeamService.ts @@ -1,10 +1,48 @@ import { ControllerResponse } from "../../common/helper/ControllerResponse.js"; import { logger } from "../../common/helper/Logger.js"; import { TeamRepository } from "./TeamRepository.js"; -import { Team } from "../../common/model/Team.js"; +import { CreateTeam, Team } from "../../common/model/Team.js"; import { TeamDTO } from "./dto/TeamDTO.js"; +import { Request } from "express"; export class TeamService { + public static async createTeam(req: Request) { + try { + console.log(req); + const { label, minimum_users, id_user_lead_team, id_service, members } = + req.body; + + const newTeamRequest = new CreateTeam( + label, + minimum_users, + id_user_lead_team, + id_service, + members, + ); + + const createdTeam = await TeamRepository.createTeam(newTeamRequest); + + let teamId: number; + + if ("insertId" in createdTeam) { + teamId = createdTeam.insertId; + if (members && members.length > 0) { + for (const userId of members) { + await TeamRepository.addMemberToTeam({ + id_team: teamId, + id_user: userId, + }); + } + } + } + + return new ControllerResponse(200, "Team created"); + } catch (error) { + logger.error(`Failed to create the team. Error: ${error}`); + return new ControllerResponse(500, "Failed to create Team"); + } + } + public static async getTeamByAgency(agencyId: number) { try { const teams: any = await TeamRepository.getTeamByAgencyId(agencyId); @@ -21,8 +59,8 @@ export class TeamService { list: teamsDto, }); } catch (error) { - logger.error(`Failed to get the departments. Error: ${error}`); - return new ControllerResponse(500, "Failed to get departments"); + logger.error(`Failed to get the teams. Error: ${error}`); + return new ControllerResponse(500, "Failed to get teams"); } } } diff --git a/api-server/src/resources/team/dto/TeamDTO.ts b/api-server/src/resources/team/dto/TeamDTO.ts index e4e75d8..6e656db 100644 --- a/api-server/src/resources/team/dto/TeamDTO.ts +++ b/api-server/src/resources/team/dto/TeamDTO.ts @@ -4,7 +4,7 @@ export class TeamDTO { id: number; label: string; minimum_users: number; - id_user_lead_service: number; + id_user_lead_team: number; id_service: number; service_label: string; @@ -12,7 +12,7 @@ export class TeamDTO { this.id = team.id; this.label = team.label; this.minimum_users = team.minimum_users; - this.id_user_lead_service = team.id_user_lead_service; + this.id_user_lead_team = team.id_user_lead_team; this.id_service = team.id_service; this.service_label = team.service_label; } diff --git a/react-app/src/models/organisation/CreateTeamFormData.model.ts b/react-app/src/models/organisation/CreateTeamFormData.model.ts new file mode 100644 index 0000000..2fc11dc --- /dev/null +++ b/react-app/src/models/organisation/CreateTeamFormData.model.ts @@ -0,0 +1,21 @@ +export class CreateTeamFormDataModel { + label: string; + minimum_user: number; + id_user_lead_team: number; + id_service: number; + members: []; + + constructor( + label: string = "", + minimum_user: number = 1, + id_user_lead_team: number = 1, + id_service: number = 1, + members: [] = [], + ) { + this.label = label; + this.minimum_user = minimum_user; + this.id_user_lead_team = id_user_lead_team; + this.id_service = id_service; + this.members = members; + } +} diff --git a/react-app/src/models/organisation/TeamList.model.ts b/react-app/src/models/organisation/TeamList.model.ts index 16dc474..0d5e8ca 100644 --- a/react-app/src/models/organisation/TeamList.model.ts +++ b/react-app/src/models/organisation/TeamList.model.ts @@ -5,12 +5,13 @@ export class TeamList { id_user_lead_team: number; id_service: number; service_label: string; + constructor( id: number = 0, label: string = "", minimum_users: number = 1, - id_user_lead_team: number = 1, - id_service: number = 1, + id_user_lead_team: number = 0, + id_service: number = 0, service_label: string = "", ) { this.id = id; diff --git a/react-app/src/modules/organisation/components/agencyDepartment.tsx b/react-app/src/modules/organisation/components/agencyDepartment.tsx index c76c0ec..f1117e6 100644 --- a/react-app/src/modules/organisation/components/agencyDepartment.tsx +++ b/react-app/src/modules/organisation/components/agencyDepartment.tsx @@ -74,15 +74,14 @@ export const AgencyDepartment: React.FC = (agency) => {
Service - Collaborateur - Status + Chef de service @@ -101,6 +100,7 @@ export const AgencyDepartment: React.FC = (agency) => { > {department.label} + nombre totale d'équipe {department.id_user_lead_service} @@ -116,7 +116,7 @@ export const AgencyDepartment: React.FC = (agency) => {
- + handlePageSize(value)} defaultValue={pageSize.toString()} diff --git a/react-app/src/modules/organisation/components/service/agencyTeamCreate.tsx b/react-app/src/modules/organisation/components/service/agencyTeamCreate.tsx index 5e24961..d486e00 100644 --- a/react-app/src/modules/organisation/components/service/agencyTeamCreate.tsx +++ b/react-app/src/modules/organisation/components/service/agencyTeamCreate.tsx @@ -1,7 +1,206 @@ +import { useEffect, useState } from "react"; +import { + Card, + CardContent, + CardHeader, + CardTitle, +} from "@/components/ui/card.js"; +import { Label } from "@/components/ui/label.js"; +import { Input } from "@/components/ui/input.js"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select.js"; +import { Button } from "@/components/ui/button.js"; +import { useNavigate, useParams } from "react-router-dom"; +import { customFetcher } from "@/common/helper/fetchInstance.js"; +import { CreateTeamFormDataModel } from "@/models/organisation/CreateTeamFormData.model.js"; +import { UserList } from "@/common/type/user/user-list.type.js"; +import { Checkbox } from "@/components/ui/checkbox.js"; +import { DepartmentList } from "@/models/organisation/DepartmentList.model.js"; + export const AgencyTeamCreate = () => { + const navigate = useNavigate(); + const { id } = useParams(); + const [team, setTeam] = useState(new CreateTeamFormDataModel()); + const [selectedUsers, setSelectedUsers] = useState([]); + const [users, setUsers] = useState([]); + const [services, setService] = useState([]); + + useEffect(() => { + const fetchService = async () => { + const response = await customFetcher( + `http://localhost:5000/api/service/${id}`, + ); + if (response.response.status === 200) { + setService(response.data.data.list); + } + }; + fetchService(); + }, []); + + useEffect(() => { + const fetchUsers = async () => { + const response = await customFetcher(`http://localhost:5000/api/user/`); + if (response.response.status === 200) { + setUsers(response.data.data.list); + } + }; + fetchUsers(); + }, []); + + const handleClickSubmitButton = async (event: { + preventDefault: () => void; + }) => { + event.preventDefault(); + const config = { + method: "POST", + body: JSON.stringify({ ...team, members: selectedUsers }), + }; + + const newAgencyFetch = await customFetcher( + `http://localhost:5000/api/team/create`, + config, + ); + + if (newAgencyFetch.response.status === 201) { + navigate("/organisation"); + } + }; + + const handleTeamFormDataChange = (e: { + target: { name: string; value: string }; + }) => { + setTeam({ + ...team, + [e.target.name]: e.target.value, + }); + }; + + const handleSelectChangeUserLead = (value: string | number) => { + setTeam({ + ...team, + id_user_lead_team: +value, + }); + }; + const handleSelectChangeService = (value: string | number) => { + setTeam({ + ...team, + id_service: +value, + }); + }; + + const handleCheckboxChange = (userId: number, checked: boolean) => { + if (checked) { + setSelectedUsers((prevSelected) => [...prevSelected, userId]); + } else { + setSelectedUsers((prevSelected) => + prevSelected.filter((id) => id !== userId), + ); + } + }; + return (
-

Coucou de la création de team

+ + + Création d'un service + + +
+ + + + + + + + + + + + + +
+ {users.map((user) => ( +
+ + handleCheckboxChange(user.id, checked as boolean) + } + /> + +
+ ))} +
+ +
+ + +
+
+
+
); }; diff --git a/react-app/src/modules/organisation/pages/Agency.tsx b/react-app/src/modules/organisation/pages/Agency.tsx index 5b66756..2763b01 100644 --- a/react-app/src/modules/organisation/pages/Agency.tsx +++ b/react-app/src/modules/organisation/pages/Agency.tsx @@ -77,7 +77,7 @@ export const Agency = () => {
- Agence + Général Services Équipes @@ -99,7 +99,7 @@ export const Agency = () => {
{agencyLoaded && agencyMainPage} {agencyNotFound && noAgency} From f4e7a2ffa375c45ccb788a23e05c6c2cdd71f4d0 Mon Sep 17 00:00:00 2001 From: Theo Date: Fri, 16 Aug 2024 17:00:41 +0200 Subject: [PATCH 02/60] feat(organisation): wip department/team --- .../department/DepartmentController.ts | 14 ++ .../department/DepartmentRepository.ts | 10 ++ .../resources/department/DepartmentService.ts | 18 ++ .../src/resources/team/TeamRepository.ts | 10 +- api-server/src/resources/team/TeamService.ts | 6 +- .../src/common/routes/OrganisationRoutes.tsx | 32 +++- react-app/src/components/ui/select.tsx | 2 +- react-app/src/components/ui/table.tsx | 13 +- react-app/src/components/ui/tabs.tsx | 2 +- react-app/src/index.css | 1 + .../modules/demand/components/demandCard.tsx | 2 +- react-app/src/modules/demand/pages/Demand.tsx | 21 ++- .../src/modules/expense/pages/Expense.tsx | 42 +++-- .../components/{ => agency}/agencyAddress.tsx | 4 +- .../components/{ => agency}/agencyChart.tsx | 12 +- .../components/{ => agency}/agencyDetails.tsx | 4 +- .../components/chart/areaChart.tsx | 2 +- .../components/chart/barChart.tsx | 19 +- .../components/chart/radialChart.tsx | 20 +-- .../{ => service}/agencyDepartment.tsx | 77 +++++---- .../service/agencyDepartmentDetails.tsx | 15 ++ .../components/service/departmentInfo.tsx | 162 ++++++++++++++++++ .../components/{ => team}/agencyTeam.tsx | 98 +++++------ .../{service => team}/agencyTeamCreate.tsx | 4 +- .../src/modules/organisation/pages/Agency.tsx | 13 +- .../organisation/pages/AgencyDetails.tsx | 0 .../modules/organisation/pages/AgencyEdit.tsx | 0 .../user/components/demand/userDemands.tsx | 7 +- .../user/components/expense/userExpenses.tsx | 83 ++++----- react-app/src/modules/user/pages/Users.tsx | 17 +- 30 files changed, 482 insertions(+), 228 deletions(-) rename react-app/src/modules/organisation/components/{ => agency}/agencyAddress.tsx (97%) rename react-app/src/modules/organisation/components/{ => agency}/agencyChart.tsx (76%) rename react-app/src/modules/organisation/components/{ => agency}/agencyDetails.tsx (94%) rename react-app/src/modules/organisation/components/{ => service}/agencyDepartment.tsx (69%) create mode 100644 react-app/src/modules/organisation/components/service/agencyDepartmentDetails.tsx create mode 100644 react-app/src/modules/organisation/components/service/departmentInfo.tsx rename react-app/src/modules/organisation/components/{ => team}/agencyTeam.tsx (64%) rename react-app/src/modules/organisation/components/{service => team}/agencyTeamCreate.tsx (98%) delete mode 100644 react-app/src/modules/organisation/pages/AgencyDetails.tsx delete mode 100644 react-app/src/modules/organisation/pages/AgencyEdit.tsx diff --git a/api-server/src/resources/department/DepartmentController.ts b/api-server/src/resources/department/DepartmentController.ts index 28a3466..517ae3c 100644 --- a/api-server/src/resources/department/DepartmentController.ts +++ b/api-server/src/resources/department/DepartmentController.ts @@ -15,6 +15,20 @@ router.get("/:id", verifyToken, async (req: Request, res: Response) => { }); }); +router.get( + "/department/:id", + verifyToken, + async (req: Request, res: Response) => { + const { code, message, data } = await DepartmentService.getDepartmentById( + +req.params.id, + ); + res.status(code).json({ + message, + data, + }); + }, +); + router.get("list/:id", verifyToken, async (req: Request, res: Response) => { const { code, message, data } = await DepartmentService.getDepartmentByAgencyWithoutPagination( diff --git a/api-server/src/resources/department/DepartmentRepository.ts b/api-server/src/resources/department/DepartmentRepository.ts index 9391514..6129522 100644 --- a/api-server/src/resources/department/DepartmentRepository.ts +++ b/api-server/src/resources/department/DepartmentRepository.ts @@ -31,6 +31,16 @@ export class DepartmentRepository { return rows; } + public static async getDepartmentById(id: number) { + const [rows]: any = await this.pool.query( + `SELECT * + FROM service + WHERE id = ?`, + [id], + ); + return rows[0]; + } + public static async getCountByAgencyId(agencyId: number) { const [rows]: any = await this.pool.query( `SELECT COUNT(*) as count diff --git a/api-server/src/resources/department/DepartmentService.ts b/api-server/src/resources/department/DepartmentService.ts index 1dacbb1..2f9df13 100644 --- a/api-server/src/resources/department/DepartmentService.ts +++ b/api-server/src/resources/department/DepartmentService.ts @@ -5,6 +5,7 @@ import { logger } from "../../common/helper/Logger.js"; import { DepartmentRepository } from "./DepartmentRepository.js"; import { CreateDepartment, Department } from "../../common/model/Department.js"; import { DepartmentDTO } from "./dto/DepartmentDTO.js"; +import { DemandDTO } from "../demand/dto/DemandDTO.js"; export class DepartmentService { public static async getDepartmentByAgencyWithoutPagination(idAgency: number) { @@ -52,6 +53,23 @@ export class DepartmentService { } } + public static async getDepartmentById(id: number) { + try { + const department: any = await DepartmentRepository.getDepartmentById(id); + + if (!department) { + return new ControllerResponse(401, "Departments doesn't exist"); + } + + const department_: DepartmentDTO = new DepartmentDTO(department); + console.log(department_); + return new ControllerResponse(200, "", department_); + } catch (error) { + logger.error(`Failed to get the departments. Error: ${error}`); + return new ControllerResponse(500, "Failed to get departments"); + } + } + public static async createDepartment(idAgency: number, req: Request) { const label = req.body.label; const minimal_number = req.body.minimum_user; diff --git a/api-server/src/resources/team/TeamRepository.ts b/api-server/src/resources/team/TeamRepository.ts index 7e4a16e..affa5a2 100644 --- a/api-server/src/resources/team/TeamRepository.ts +++ b/api-server/src/resources/team/TeamRepository.ts @@ -4,8 +4,8 @@ import { CreateTeam } from "../../common/model/Team.js"; export class TeamRepository { private static pool = DatabaseClient.mysqlPool; - public static async getTeamByAgencyId( - agencyId: number, + public static async getTeamByService( + serviceId: number, limit = 10, offset = 0, ) { @@ -13,15 +13,15 @@ export class TeamRepository { `SELECT team.*, service.label as service_label FROM team JOIN service ON team.id_service = service.id - WHERE service.id_agency = ? + WHERE team.id_service = ? ORDER BY team.label LIMIT ? OFFSET ? `, - [agencyId, limit, offset], + [serviceId, limit, offset], ); return rows; } - public static async getCountByAgencyId(agencyId: number) { + public static async getCountByService(agencyId: number) { const [rows]: any = await this.pool.query( `SELECT COUNT(*) as count FROM team diff --git a/api-server/src/resources/team/TeamService.ts b/api-server/src/resources/team/TeamService.ts index eebaf5f..6f1ef38 100644 --- a/api-server/src/resources/team/TeamService.ts +++ b/api-server/src/resources/team/TeamService.ts @@ -43,10 +43,10 @@ export class TeamService { } } - public static async getTeamByAgency(agencyId: number) { + public static async getTeamByAgency(serviceId: number) { try { - const teams: any = await TeamRepository.getTeamByAgencyId(agencyId); - const teamsCount = await TeamRepository.getCountByAgencyId(agencyId); + const teams: any = await TeamRepository.getTeamByService(serviceId); + const teamsCount = await TeamRepository.getCountByService(serviceId); if (!teams) { return new ControllerResponse(401, "Teams doesn't exist"); diff --git a/react-app/src/common/routes/OrganisationRoutes.tsx b/react-app/src/common/routes/OrganisationRoutes.tsx index 1a0155b..a6f97fd 100644 --- a/react-app/src/common/routes/OrganisationRoutes.tsx +++ b/react-app/src/common/routes/OrganisationRoutes.tsx @@ -2,7 +2,8 @@ import { Organisation } from "@/modules/organisation/Organisation.tsx"; import { AgencyCreate } from "@/modules/organisation/pages/AgencyCreate.js"; import { Agency } from "@/modules/organisation/pages/Agency.js"; import { AgencyDepartmentCreate } from "@/modules/organisation/components/service/agencyDepartmentCreate.js"; -import { AgencyTeamCreate } from "@/modules/organisation/components/service/agencyTeamCreate.js"; +import { AgencyTeamCreate } from "@/modules/organisation/components/team/agencyTeamCreate.js"; +import { AgencyDepartmentDetails } from "@/modules/organisation/components/service/agencyDepartmentDetails.js"; export const organisationRoutes = { path: "organisation", @@ -14,24 +15,43 @@ export const organisationRoutes = { path: "", element: , }, + { path: "agency/create", element: , }, { - path: "agency/:id", + path: "agency/:id_agency", children: [ { path: "", element: , }, { - path: "service/create", - element: , + path: "service", + children: [ + { + path: "create", + element: , + }, + { + path: "details/:id_service", + element: , + }, + ], }, { - path: "team/create", - element: , + path: "team", + children: [ + { + path: "create", + element: , + }, + { + path: "details/:id_team", + element:

In progress

, + }, + ], }, ], }, diff --git a/react-app/src/components/ui/select.tsx b/react-app/src/components/ui/select.tsx index 149e6e9..d26a220 100644 --- a/react-app/src/components/ui/select.tsx +++ b/react-app/src/components/ui/select.tsx @@ -22,7 +22,7 @@ const SelectTrigger = React.forwardRef< span]:line-clamp-1", + "flex h-9 w-full items-center justify-between whitespace-nowrap rounded-md border border-gray-200 bg-transparent px-3 py-2 text-sm shadow-sm ring-offset-white placeholder:text-gray-500 focus:outline-none focus:ring-1 focus:ring-gray-950 disabled:cursor-not-allowed disabled:opacity-50 dark:border-gray-800 dark:ring-offset-gray-950 dark:placeholder:text-gray-400 dark:focus:ring-gray-300 [&>span]:line-clamp-1", className, )} {...props} diff --git a/react-app/src/components/ui/table.tsx b/react-app/src/components/ui/table.tsx index fffe201..463c060 100644 --- a/react-app/src/components/ui/table.tsx +++ b/react-app/src/components/ui/table.tsx @@ -6,7 +6,7 @@ const Table = React.forwardRef< HTMLTableElement, React.HTMLAttributes >(({ className, ...props }, ref) => ( -
+
>(({ className, ...props }, ref) => ( - + )); TableHeader.displayName = "TableHeader"; @@ -73,7 +80,7 @@ const TableHead = React.forwardRef<
[role=checkbox]]:translate-y-[2px]", + "h-10 p-2 text-left align-middle text-sm font-semibold text-gray-600 dark:text-gray-400 [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]", className, )} {...props} diff --git a/react-app/src/components/ui/tabs.tsx b/react-app/src/components/ui/tabs.tsx index b62a23a..97d01ca 100644 --- a/react-app/src/components/ui/tabs.tsx +++ b/react-app/src/components/ui/tabs.tsx @@ -12,7 +12,7 @@ const TabsList = React.forwardRef< -
+
diff --git a/react-app/src/modules/demand/pages/Demand.tsx b/react-app/src/modules/demand/pages/Demand.tsx index c80edd5..5a5e6f4 100644 --- a/react-app/src/modules/demand/pages/Demand.tsx +++ b/react-app/src/modules/demand/pages/Demand.tsx @@ -42,6 +42,7 @@ import { useCurrentUser } from "@/common/hooks/useCurrentUser.js"; import { DemandStatus } from "@/common/enum/DemandStatus.enum.js"; import { DemandType } from "@/common/enum/DemandType.enum.js"; import { customFetcher } from "@/common/helper/fetchInstance.js"; +import { Card } from "@/components/ui/card"; export function Demand() { const [demandList, setDemandList] = useState([]); @@ -183,16 +184,14 @@ export function Demand() { const tableDemand = ( <> -
+ - - Demande - Date de début - Date de fin - Jours - Status - + Demande + Date de début + Date de fin + Jours + Status {demandList.length === 0 ? ( @@ -240,7 +239,7 @@ export function Demand() { )}
-
+
@@ -262,7 +261,7 @@ export function Demand() {
- {`${1 + pageSize * (pageNumber - 1)} - ${demandList.length + pageSize * (pageNumber - 1)} sur ${totalData}`} + {`${demandList.length === 0 ? 0 : 1 + pageSize * (pageNumber - 1)} - ${demandList.length + pageSize * (pageNumber - 1)} sur ${totalData}`} ) : ( - )} diff --git a/react-app/src/modules/organisation/components/agencyChart.tsx b/react-app/src/modules/organisation/components/agency/agencyChart.tsx similarity index 76% rename from react-app/src/modules/organisation/components/agencyChart.tsx rename to react-app/src/modules/organisation/components/agency/agencyChart.tsx index bb50b45..bf1c4e9 100644 --- a/react-app/src/modules/organisation/components/agencyChart.tsx +++ b/react-app/src/modules/organisation/components/agency/agencyChart.tsx @@ -31,6 +31,8 @@ export const AgencyChart: React.FC = () => {
{ />
- +
- +
diff --git a/react-app/src/modules/organisation/components/agencyDetails.tsx b/react-app/src/modules/organisation/components/agency/agencyDetails.tsx similarity index 94% rename from react-app/src/modules/organisation/components/agencyDetails.tsx rename to react-app/src/modules/organisation/components/agency/agencyDetails.tsx index e90b40c..2dedba4 100644 --- a/react-app/src/modules/organisation/components/agencyDetails.tsx +++ b/react-app/src/modules/organisation/components/agency/agencyDetails.tsx @@ -1,7 +1,7 @@ import React, { Dispatch, SetStateAction } from "react"; -import { AgencyAddress } from "@/modules/organisation/components/agencyAddress.js"; +import { AgencyAddress } from "@/modules/organisation/components/agency/agencyAddress.js"; import { AgencyModel } from "@/models/organisation/agency/Agency.model.js"; -import { AgencyChart } from "@/modules/organisation/components/agencyChart.js"; +import { AgencyChart } from "@/modules/organisation/components/agency/agencyChart.js"; interface AgencyDetailsProps { agency: AgencyModel; diff --git a/react-app/src/modules/organisation/components/chart/areaChart.tsx b/react-app/src/modules/organisation/components/chart/areaChart.tsx index 8b5aa67..7331b2c 100644 --- a/react-app/src/modules/organisation/components/chart/areaChart.tsx +++ b/react-app/src/modules/organisation/components/chart/areaChart.tsx @@ -23,7 +23,7 @@ export function AreaChartAgency({ }) { return ( - +
{title} {description} diff --git a/react-app/src/modules/organisation/components/chart/barChart.tsx b/react-app/src/modules/organisation/components/chart/barChart.tsx index 84cc31e..1035246 100644 --- a/react-app/src/modules/organisation/components/chart/barChart.tsx +++ b/react-app/src/modules/organisation/components/chart/barChart.tsx @@ -1,6 +1,5 @@ "use client"; -import { TrendingUp } from "lucide-react"; import { Bar, BarChart, @@ -14,7 +13,6 @@ import { Card, CardContent, CardDescription, - CardFooter, CardHeader, CardTitle, } from "@/components/ui/card.js"; @@ -48,12 +46,15 @@ const chartConfig = { }, } satisfies ChartConfig; -export function BarChartAgency() { +export function BarChartAgency({ + title = "Area Chart - Interactive", + description = "Showing total visitors for the last 3 months", +}) { return ( - Bar Chart - Custom Label - January - June 2024 + {title} + {description} @@ -104,14 +105,6 @@ export function BarChartAgency() { - -
- Trending up by 5.2% this month -
-
- Showing total visitors for the last 6 months -
-
); } diff --git a/react-app/src/modules/organisation/components/chart/radialChart.tsx b/react-app/src/modules/organisation/components/chart/radialChart.tsx index d39604a..329550c 100644 --- a/react-app/src/modules/organisation/components/chart/radialChart.tsx +++ b/react-app/src/modules/organisation/components/chart/radialChart.tsx @@ -1,6 +1,5 @@ "use client"; -import { TrendingUp } from "lucide-react"; import { Label, PolarRadiusAxis, RadialBar, RadialBarChart } from "recharts"; import { @@ -17,6 +16,7 @@ import { ChartTooltip, ChartTooltipContent, } from "@/components/ui/chart.js"; + const chartData = [{ month: "january", desktop: 1260, mobile: 570 }]; const chartConfig = { @@ -30,14 +30,17 @@ const chartConfig = { }, } satisfies ChartConfig; -export function RadialChartAgency() { +export function RadialChartAgency({ + title = "Area Chart - Interactive", + description = "Showing total visitors for the last 3 months", +}) { const totalVisitors = chartData[0].desktop + chartData[0].mobile; return ( - Radial Chart - Stacked - January - June 2024 + {title} + {description} - -
- Trending up by 5.2% this month -
-
- Showing total visitors for the last 6 months -
-
+
); } diff --git a/react-app/src/modules/organisation/components/agencyDepartment.tsx b/react-app/src/modules/organisation/components/service/agencyDepartment.tsx similarity index 69% rename from react-app/src/modules/organisation/components/agencyDepartment.tsx rename to react-app/src/modules/organisation/components/service/agencyDepartment.tsx index f1117e6..2a7674f 100644 --- a/react-app/src/modules/organisation/components/agencyDepartment.tsx +++ b/react-app/src/modules/organisation/components/service/agencyDepartment.tsx @@ -22,6 +22,7 @@ import { SelectTrigger, SelectValue, } from "@/components/ui/select.js"; +import { Card } from "@/components/ui/card"; interface AgencyDetailsProps { agency: AgencyModel; @@ -69,51 +70,57 @@ export const AgencyDepartment: React.FC = (agency) => { navigate("service/create"); }; + const handleClick = (id_service: number) => { + navigate(`service/details/${id_service}`); + }; + return (
-
+
- - - - Service - Chef de service - - - - {departmentList.length === 0 ? ( + +
+ - - Aucun département trouvé - + Service + Chef de service - ) : ( - departmentList.map((department: DepartmentList) => ( - handleClick(department.id)} - > - - {department.label} - nombre totale d'équipe - - - {department.id_user_lead_service} - - - {/* {getClassForStatus(department.status)} */} - {department.minimum_users} + + + {departmentList.length === 0 ? ( + + + Aucun département trouvé - )) - )} - -
+ ) : ( + departmentList.map((department: DepartmentList) => ( + handleClick(department.id)} + > + +
+
{department.label}
+
+ nombre totale d'équipe +
+
+
+ + {department.id_user_lead_service} + +
+ )) + )} + +
+
@@ -135,7 +142,7 @@ export const AgencyDepartment: React.FC = (agency) => {
- {`${1 + pageSize * (pageNumber - 1)} - ${departmentList.length + pageSize * (pageNumber - 1)} sur ${totalData}`} + {`${departmentList.length === 0 ? 0 : 1 + pageSize * (pageNumber - 1)} - ${departmentList.length + pageSize * (pageNumber - 1)} sur ${totalData}`} + ) : ( + + )} + + + {departmentCanBeUpdated ? userUpdating : userFields} + {departmentCanBeUpdated && ( + + + + )} + + ); +}; diff --git a/react-app/src/modules/organisation/components/agencyTeam.tsx b/react-app/src/modules/organisation/components/team/agencyTeam.tsx similarity index 64% rename from react-app/src/modules/organisation/components/agencyTeam.tsx rename to react-app/src/modules/organisation/components/team/agencyTeam.tsx index 5352f0e..616a3cf 100644 --- a/react-app/src/modules/organisation/components/agencyTeam.tsx +++ b/react-app/src/modules/organisation/components/team/agencyTeam.tsx @@ -1,10 +1,9 @@ -import { AgencyModel } from "@/models/organisation/agency/Agency.model.js"; -import React, { useEffect, useState } from "react"; +import { useEffect, useState } from "react"; import { Button } from "@/components/ui/button.js"; import { CaretLeftIcon, CaretRightIcon, PlusIcon } from "@radix-ui/react-icons"; import { customFetcher } from "@/common/helper/fetchInstance.js"; import { TeamList } from "@/models/organisation/TeamList.model.js"; -import { useNavigate } from "react-router-dom"; +import { useNavigate, useParams } from "react-router-dom"; import { Table, TableBody, @@ -22,21 +21,24 @@ import { SelectTrigger, SelectValue, } from "@/components/ui/select.js"; +import { + Card, + CardContent, + CardFooter, + CardHeader, +} from "@/components/ui/card.js"; -interface AgencyDetailsProps { - agency: AgencyModel; -} - -export const AgencyTeam: React.FC = (agency) => { +export const AgencyTeam = () => { const [teamList, setTeamList] = useState([]); const [totalData, setTotalData] = useState(0); const [pageSize, setPageSize] = useState(5); const [pageNumber, setPageNumber] = useState(1); const navigate = useNavigate(); + const { id_agency, id_service } = useParams(); const fetchTeam = async (pageSize: number, pageNumber: number) => { const response = await customFetcher( - `http://localhost:5000/api/team/${agency.agency.id}?` + + `http://localhost:5000/api/team/${id_service}?` + new URLSearchParams({ pageSize: pageSize.toString() || "10", pageNumber: pageNumber.toString() || "1", @@ -66,57 +68,57 @@ export const AgencyTeam: React.FC = (agency) => { }; const handleClickCreate = () => { - navigate("team/create"); + navigate(`/organisation/agency/${id_agency}/team/create`); }; return ( -
+ <>
- - - - Equipe + +
+ + Équipe Chef d'équipe Collaborateurs Statut - - - - {teamList.length === 0 ? ( - - - Aucune équipe trouvé - - - ) : ( - teamList.map((team: TeamList) => ( - handleClick(department.id)} - > - - {team.label} - - - {team.id_user_lead_team} - - - {/* {getClassForStatus(department.status)} */}4 présent(s) sur - 7 + + + {teamList.length === 0 ? ( + + + Aucune équipe trouvé - /// - )) - )} - -
-
+ ) : ( + teamList.map((team: TeamList) => ( + handleClick(department.id)} + > + + {team.label} + + + {team.id_user_lead_team} + + + {/* {getClassForStatus(department.status)} */}4 présent(s) + sur 7 + + /// + + )) + )} + + + +
handlePageSize(value)} - defaultValue={pageSize.toString()} - > - - - - - - 5 - 10 - 20 - - - -
-
- - {`${1 + pageSize * (pageNumber - 1)} - ${ - expenseList.length + pageSize * (pageNumber - 1) - } sur ${totalData}`} - - - -
+ +
+
+ + +
+
+ + {`${expenseList.length === 0 ? 0 : 1 + pageSize * (pageNumber - 1)} - ${ + expenseList.length + pageSize * (pageNumber - 1) + } sur ${totalData}`} + + +
diff --git a/react-app/src/modules/user/pages/Users.tsx b/react-app/src/modules/user/pages/Users.tsx index 1826518..f77c67e 100644 --- a/react-app/src/modules/user/pages/Users.tsx +++ b/react-app/src/modules/user/pages/Users.tsx @@ -30,6 +30,7 @@ import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar.js"; import { Badge } from "@/components/ui/badge.tsx"; import { UserList } from "@/common/type/user/user-list.type.ts"; import { customFetcher } from "@/common/helper/fetchInstance.js"; +import { Card } from "@/components/ui/card"; export function Users() { const [users, setUsers] = useState([]); @@ -90,15 +91,13 @@ export function Users() { const usersTable = ( -
+ - - Collaborateur - Ville - Téléphone - Actif - + Collaborateur + Ville + Téléphone + Actif {users?.length ? ( @@ -151,7 +150,7 @@ export function Users() { )}
-
+
@@ -173,7 +172,7 @@ export function Users() {
- {`${1 + pageSize * (pageNumber - 1)} - ${users.length + pageSize * (pageNumber - 1)} sur ${totalData}`} + {`${users.length === 0 ? 0 : 1 + pageSize * (pageNumber - 1)} - ${users.length + pageSize * (pageNumber - 1)} sur ${totalData}`} + + + + Êtes vous vraiment sur? + + Vous êtes sur le point de supprimer de manière definitive l'agence + sélectionnée, cette action est irréversible. + + + + Annuler + + + + + + ); +} From 3c790448107457ea7bfb173a57320a59cf749e24 Mon Sep 17 00:00:00 2001 From: jarod-empirys Date: Mon, 19 Aug 2024 08:46:17 +0200 Subject: [PATCH 04/60] feat(ui): update badge color --- react-app/src/components/ui/badge.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/react-app/src/components/ui/badge.tsx b/react-app/src/components/ui/badge.tsx index e648e1c..e688fac 100644 --- a/react-app/src/components/ui/badge.tsx +++ b/react-app/src/components/ui/badge.tsx @@ -19,8 +19,7 @@ const badgeVariants = cva( "text-emerald-800 bg-emerald-200/80 dark:text-emerald-600 dark:bg-emerald-900/40 border-none", denied: "text-red-800 bg-red-200/80 dark:text-red-600 dark:bg-red-900/40 border-none", - waiting: - "text-yellow-800 bg-amber-300/40 dark:text-yellow-600 dark:bg-yellow-600/20 border-none", + waiting: "bg-amber-500/15 text-amber-500 border-none", draft: "text-blue-800 bg-sky-300/40 dark:text-sky-600 dark:bg-sky-600/20 border-none", }, From 971a21dcbeb4e98801cb9468bb032f722dfda528 Mon Sep 17 00:00:00 2001 From: Theo Date: Mon, 19 Aug 2024 08:49:57 +0200 Subject: [PATCH 05/60] fix(organisation): create department --- api-server/src/resources/department/DepartmentService.ts | 1 - .../components/service/agencyDepartmentCreate.tsx | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/api-server/src/resources/department/DepartmentService.ts b/api-server/src/resources/department/DepartmentService.ts index 2f9df13..6df6864 100644 --- a/api-server/src/resources/department/DepartmentService.ts +++ b/api-server/src/resources/department/DepartmentService.ts @@ -86,7 +86,6 @@ export class DepartmentService { console.log(newDepartment); const createdDepartment = await DepartmentRepository.createDepartment(newDepartment); - return new ControllerResponse( 201, "Service créé avec succès", diff --git a/react-app/src/modules/organisation/components/service/agencyDepartmentCreate.tsx b/react-app/src/modules/organisation/components/service/agencyDepartmentCreate.tsx index b2b190c..4fc28a8 100644 --- a/react-app/src/modules/organisation/components/service/agencyDepartmentCreate.tsx +++ b/react-app/src/modules/organisation/components/service/agencyDepartmentCreate.tsx @@ -21,7 +21,7 @@ import { } from "@/components/ui/select.js"; export const AgencyDepartmentCreate = () => { - const { id } = useParams(); + const { id_agency } = useParams(); const [service, setService] = useState( new CreateDepartmentAgencyFormDataModel(), ); @@ -44,7 +44,7 @@ export const AgencyDepartmentCreate = () => { body: JSON.stringify(service), }; const newAgencyFetch = await customFetcher( - `http://localhost:5000/api/service/create/${id}`, + `http://localhost:5000/api/service/create/${id_agency}`, config, ); From edf83d7a0d07ccbefa3183960f6dafc988efd9b9 Mon Sep 17 00:00:00 2001 From: jarod-empirys Date: Mon, 19 Aug 2024 10:30:20 +0200 Subject: [PATCH 06/60] fix(tables): add table row --- .../src/components/navigation/UserMenu.tsx | 171 +++++++++--------- react-app/src/components/ui/button.tsx | 3 +- react-app/src/modules/demand/pages/Demand.tsx | 12 +- .../src/modules/expense/pages/Expense.tsx | 5 +- .../components/team/agencyTeam.tsx | 10 +- .../modules/user/components/userAvatar.tsx | 5 +- react-app/src/modules/user/pages/Users.tsx | 15 +- 7 files changed, 117 insertions(+), 104 deletions(-) diff --git a/react-app/src/components/navigation/UserMenu.tsx b/react-app/src/components/navigation/UserMenu.tsx index 2357f64..43f18bf 100644 --- a/react-app/src/components/navigation/UserMenu.tsx +++ b/react-app/src/components/navigation/UserMenu.tsx @@ -55,16 +55,19 @@ export function UserMenu() { }; const localTheme = localStorage.theme || "dark"; return ( - - -
+
+ + -
- - - - {currentUser.firstname} {currentUser.lastname} - - - - - - Mon profil - - - - - - - - Notifications - - - - - - - - Nouveau mot de passe - - - - - - - - - - Thème - - -
+ + + + {currentUser.firstname} {currentUser.lastname} + + + + + + Mon profil + + + + + + + + Notifications + + + + + + + + Nouveau mot de passe + + + + + + + + + + Thème + + +
+ + Clair + + + + + + Foncé + + + + +
+ - Clair + Système - + - - Foncé - - - - -
- - - Système - - - - -
-
-
-
- - -
- + + + + + + + + +
); } diff --git a/react-app/src/components/ui/button.tsx b/react-app/src/components/ui/button.tsx index 90235be..c137141 100644 --- a/react-app/src/components/ui/button.tsx +++ b/react-app/src/components/ui/button.tsx @@ -31,7 +31,8 @@ const buttonVariants = cva( "justify-start hover:bg-gray-50 hover:text-gray-900 text-gray-50", callToAction: "justify-center bg-indigo-700 text-indigo-50 hover:bg-indigo-800", - noneLeft: "text-gray-900 justify-start", + noneLeft: + "text-gray-900 justify-start focus-visible:ring-transparent dark:focus-visible:ring-transparent", }, size: { default: "h-9 px-4 py-2", diff --git a/react-app/src/modules/demand/pages/Demand.tsx b/react-app/src/modules/demand/pages/Demand.tsx index 5a5e6f4..f0b6536 100644 --- a/react-app/src/modules/demand/pages/Demand.tsx +++ b/react-app/src/modules/demand/pages/Demand.tsx @@ -187,11 +187,13 @@ export function Demand() { - Demande - Date de début - Date de fin - Jours - Status + + Demande + Date de début + Date de fin + Jours + Status + {demandList.length === 0 ? ( diff --git a/react-app/src/modules/expense/pages/Expense.tsx b/react-app/src/modules/expense/pages/Expense.tsx index 302c95f..600c9e5 100644 --- a/react-app/src/modules/expense/pages/Expense.tsx +++ b/react-app/src/modules/expense/pages/Expense.tsx @@ -181,10 +181,7 @@ export function Expense() { Type de demande Frais - - {" "} - Date de facturation{" "} - + Date de facturation Status diff --git a/react-app/src/modules/organisation/components/team/agencyTeam.tsx b/react-app/src/modules/organisation/components/team/agencyTeam.tsx index 57e5361..b567416 100644 --- a/react-app/src/modules/organisation/components/team/agencyTeam.tsx +++ b/react-app/src/modules/organisation/components/team/agencyTeam.tsx @@ -77,10 +77,12 @@ export const AgencyTeam = () => {
- Équipe - Chef d'équipe - Collaborateurs - Statut + + Équipe + Chef d'équipe + Collaborateurs + Statut + {teamList.length === 0 ? ( diff --git a/react-app/src/modules/user/components/userAvatar.tsx b/react-app/src/modules/user/components/userAvatar.tsx index 93837d0..f09c405 100644 --- a/react-app/src/modules/user/components/userAvatar.tsx +++ b/react-app/src/modules/user/components/userAvatar.tsx @@ -75,7 +75,10 @@ export const UserAvatar: React.FC = ({ - + {user?.firstname?.charAt(0)} {user?.lastname?.charAt(0)} diff --git a/react-app/src/modules/user/pages/Users.tsx b/react-app/src/modules/user/pages/Users.tsx index f77c67e..7585346 100644 --- a/react-app/src/modules/user/pages/Users.tsx +++ b/react-app/src/modules/user/pages/Users.tsx @@ -94,10 +94,12 @@ export function Users() {
- Collaborateur - Ville - Téléphone - Actif + + Collaborateur + Ville + Téléphone + Actif + {users?.length ? ( @@ -109,7 +111,10 @@ export function Users() { > - + {user.firstname?.charAt(0)} {user.lastname?.charAt(0)} From c1dda57dbc8ff00ecea3a3f5a1e4382cc1ada8a6 Mon Sep 17 00:00:00 2001 From: jarod-empirys Date: Mon, 19 Aug 2024 10:35:01 +0200 Subject: [PATCH 07/60] fix(users): fix paginator accessibility --- react-app/src/modules/user/pages/Users.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/react-app/src/modules/user/pages/Users.tsx b/react-app/src/modules/user/pages/Users.tsx index 7585346..3e70be9 100644 --- a/react-app/src/modules/user/pages/Users.tsx +++ b/react-app/src/modules/user/pages/Users.tsx @@ -163,7 +163,7 @@ export function Users() { onValueChange={(value) => handlePageSize(value)} defaultValue={pageSize.toString()} > - + @@ -183,6 +183,7 @@ export function Users() { variant="ghost" onClick={handlePreviousPageNumber} disabled={pageNumber === 1} + aria-label="previous page" > @@ -190,6 +191,7 @@ export function Users() { variant="ghost" onClick={handleNextPageNumber} disabled={pageSize * pageNumber >= totalData} + aria-label="next page" > From b24a598c7d757ce8148ed7ba91f37e5744477a6e Mon Sep 17 00:00:00 2001 From: Theo Date: Mon, 19 Aug 2024 10:36:20 +0200 Subject: [PATCH 08/60] fix(demand): delete toString() --- api-server/src/resources/demand/DemandController.ts | 8 ++++++-- api-server/src/resources/demand/DemandService.ts | 5 ++--- react-app/src/modules/demand/pages/Demand.tsx | 3 +-- .../user/components/expense/userExpenseDetails.tsx | 2 +- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/api-server/src/resources/demand/DemandController.ts b/api-server/src/resources/demand/DemandController.ts index a59a22b..e641bfa 100644 --- a/api-server/src/resources/demand/DemandController.ts +++ b/api-server/src/resources/demand/DemandController.ts @@ -14,9 +14,13 @@ const upload = multer({ limits: { fileSize: 50 * 1024 * 1024 }, // Set the file size limit (50MB in this case) }); -router.get("/", verifyToken, async (req: Request, res: Response) => { +router.get("/:type", verifyToken, async (req: Request, res: Response) => { let userId = (req as CustomRequest).token.userId; - const { code, message, data } = await DemandService.getDemand(userId, req); + const { code, message, data } = await DemandService.getDemand( + userId, + req, + req.params.type, + ); res.status(code).json({ message, data }); }); diff --git a/api-server/src/resources/demand/DemandService.ts b/api-server/src/resources/demand/DemandService.ts index efc5e96..4df9d67 100644 --- a/api-server/src/resources/demand/DemandService.ts +++ b/api-server/src/resources/demand/DemandService.ts @@ -102,11 +102,10 @@ export function updateUserDays( } export class DemandService { - public static async getDemand(userId: number, req: Request) { + public static async getDemand(userId: number, req: Request, type: string) { try { const pageSize = req.query.pageSize || "0"; const pageNumber = req.query.pageNumber || "10"; - const type = req.query.type?.toString() || ""; const limit = +pageSize; const offset = (+pageNumber - 1) * +pageSize; let demandCount = await DemandRepository.getDemandCountWithType(type); @@ -116,7 +115,7 @@ export class DemandService { offset, type, ); - if (!type) { + if (type === "All") { demands = await DemandRepository.getDemandByUser(userId, limit, offset); demandCount = await DemandRepository.geCountByUserId(userId); } diff --git a/react-app/src/modules/demand/pages/Demand.tsx b/react-app/src/modules/demand/pages/Demand.tsx index 5a5e6f4..5eec1d1 100644 --- a/react-app/src/modules/demand/pages/Demand.tsx +++ b/react-app/src/modules/demand/pages/Demand.tsx @@ -88,11 +88,10 @@ export function Demand() { ) => { try { const response = await customFetcher( - "http://localhost:5000/api/demand?" + + `http://localhost:5000/api/demand/${type || "All"}?` + new URLSearchParams({ pageSize: pageSize.toString() || "10", pageNumber: pageNumber.toString() || "1", - type: type || "", }), ); if (response.response.status === 200) { diff --git a/react-app/src/modules/user/components/expense/userExpenseDetails.tsx b/react-app/src/modules/user/components/expense/userExpenseDetails.tsx index 4e26b53..4b363fb 100644 --- a/react-app/src/modules/user/components/expense/userExpenseDetails.tsx +++ b/react-app/src/modules/user/components/expense/userExpenseDetails.tsx @@ -94,7 +94,7 @@ export const UserExpenseDetails = () => { }; const handlePreviewFile = () => { - window.open(expense.fileUrl, "_blank"); + window.open(`${expense.fileUrl}`, "_blank"); }; return ( From 897ee0606d1577552cdafd53ac3ffb88bf1e99d1 Mon Sep 17 00:00:00 2001 From: jarod-empirys Date: Mon, 19 Aug 2024 10:50:56 +0200 Subject: [PATCH 09/60] fix(users): fix accessibility --- .../modules/organisation/components/agency/agencyAddress.tsx | 2 +- .../modules/organisation/components/service/departmentInfo.tsx | 2 +- react-app/src/modules/profile/Profile.tsx | 2 +- react-app/src/modules/user/components/userAddress.tsx | 2 +- react-app/src/modules/user/components/userBankInfos.tsx | 2 +- react-app/src/modules/user/components/userInfos.tsx | 2 +- react-app/src/modules/user/pages/User.tsx | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/react-app/src/modules/organisation/components/agency/agencyAddress.tsx b/react-app/src/modules/organisation/components/agency/agencyAddress.tsx index 1b57db4..a1a5691 100644 --- a/react-app/src/modules/organisation/components/agency/agencyAddress.tsx +++ b/react-app/src/modules/organisation/components/agency/agencyAddress.tsx @@ -143,7 +143,7 @@ export const AgencyAddress: React.FC = ({ ) : ( )} diff --git a/react-app/src/modules/organisation/components/service/departmentInfo.tsx b/react-app/src/modules/organisation/components/service/departmentInfo.tsx index e053900..cd09b3e 100644 --- a/react-app/src/modules/organisation/components/service/departmentInfo.tsx +++ b/react-app/src/modules/organisation/components/service/departmentInfo.tsx @@ -141,7 +141,7 @@ export const DepartmentInfo = () => { ) : ( )} diff --git a/react-app/src/modules/profile/Profile.tsx b/react-app/src/modules/profile/Profile.tsx index 882e3cd..5ff7c5b 100644 --- a/react-app/src/modules/profile/Profile.tsx +++ b/react-app/src/modules/profile/Profile.tsx @@ -25,7 +25,7 @@ export const Profile = () => { {currentUser?.firstname} {currentUser?.lastname} - {currentUser?.email} + {currentUser?.email}
diff --git a/react-app/src/modules/user/components/userAddress.tsx b/react-app/src/modules/user/components/userAddress.tsx index 059b8f9..ec0365e 100644 --- a/react-app/src/modules/user/components/userAddress.tsx +++ b/react-app/src/modules/user/components/userAddress.tsx @@ -154,7 +154,7 @@ export const UserAddress: React.FC = ({ ) : ( )} diff --git a/react-app/src/modules/user/components/userBankInfos.tsx b/react-app/src/modules/user/components/userBankInfos.tsx index 60789ed..a536d3c 100644 --- a/react-app/src/modules/user/components/userBankInfos.tsx +++ b/react-app/src/modules/user/components/userBankInfos.tsx @@ -111,7 +111,7 @@ export const UserBankInfos: React.FC = ({ ) : ( )} diff --git a/react-app/src/modules/user/components/userInfos.tsx b/react-app/src/modules/user/components/userInfos.tsx index 5f02bde..d911566 100644 --- a/react-app/src/modules/user/components/userInfos.tsx +++ b/react-app/src/modules/user/components/userInfos.tsx @@ -169,7 +169,7 @@ export const UserInfos: React.FC = ({ ) : ( )} diff --git a/react-app/src/modules/user/pages/User.tsx b/react-app/src/modules/user/pages/User.tsx index 9df0d66..2371fbb 100644 --- a/react-app/src/modules/user/pages/User.tsx +++ b/react-app/src/modules/user/pages/User.tsx @@ -76,7 +76,7 @@ export function User() { )}
-
{foundUser.email}
+
{foundUser.email}
From 78cfea259689fcb27e040500fef2509600f47e70 Mon Sep 17 00:00:00 2001 From: Hyokkin11 Date: Mon, 19 Aug 2024 11:09:23 +0200 Subject: [PATCH 10/60] fix(expense): fixed front-end --- .../src/modules/expense/pages/Expense.tsx | 242 +++++++++--------- 1 file changed, 119 insertions(+), 123 deletions(-) diff --git a/react-app/src/modules/expense/pages/Expense.tsx b/react-app/src/modules/expense/pages/Expense.tsx index 600c9e5..7fe527e 100644 --- a/react-app/src/modules/expense/pages/Expense.tsx +++ b/react-app/src/modules/expense/pages/Expense.tsx @@ -10,6 +10,7 @@ import { ExpenseListCard } from "@/modules/expense/components/ExpenseListCard.ts import { Table, TableBody, + TableCell, TableHead, TableHeader, TableRow, @@ -29,6 +30,12 @@ import { useNavigate } from "react-router-dom"; import { toast } from "sonner"; import { MainRoot } from "@/components/navigation/MainRoot.tsx"; import { customFetcher } from "@/common/helper/fetchInstance.js"; +import { + Tabs, + TabsContent, + TabsList, + TabsTrigger, +} from "@/components/ui/tabs.tsx"; import { Card } from "@/components/ui/card.js"; export function Expense() { @@ -109,134 +116,123 @@ export function Expense() { ); - return ( - - -
- - - - - - - - - - - - - - - - - - - -
-
- -
- + const tableExpense = ( + <> + +
+ + + + Type de demande + Frais + Date de facturation + Status + + + + + {expenses.length === 0 ? ( - - Type de demande - Frais - Date de facturation - Status - + + Aucune demande de frais n'a été trouvée + - - - {expenses.map((expense) => ( + ) : ( + expenses.map((expense) => ( - ))} - -
-
-
-
- - -
-
- - {`${expenses.length === 0 ? 0 : limit * (pageNumber - 1) + 1} - ${maxValue()} sur ${expensesCount}`} - - - -
+ )) + )} + + + +
+
+ + +
+
+ + {`${expenses.length === 0 ? 0 : limit * (pageNumber - 1) + 1} - ${maxValue()} sur ${expensesCount}`} + + +
+ + ); + + return ( + + + + + setSelectedType(selectedTypeEnum.ALL)} + > + Général + + setSelectedType(selectedTypeEnum.TRAVEL)} + > + Déplacement + + setSelectedType(selectedTypeEnum.FOOD)} + > + Restauration + + setSelectedType(selectedTypeEnum.COMPENSATION)} + > + Indemnités + + setSelectedType(selectedTypeEnum.HOUSING)} + > + Hébergement + + + {tableExpense} + {tableExpense} + {tableExpense} + {tableExpense} + {tableExpense} + ); } From 13b973c717f8f0c1b273f324b0283c7ac157a9db Mon Sep 17 00:00:00 2001 From: jarod-empirys Date: Mon, 19 Aug 2024 14:41:25 +0200 Subject: [PATCH 11/60] fix(project): fix accessibility --- react-app/src/components/ui/badge.tsx | 3 +-- .../modules/organisation/components/agency/agencyAddress.tsx | 4 +++- .../organisation/components/service/departmentInfo.tsx | 4 +++- react-app/src/modules/profile/Profile.tsx | 4 +++- react-app/src/modules/user/components/userAddress.tsx | 4 +++- react-app/src/modules/user/components/userBankInfos.tsx | 4 +++- react-app/src/modules/user/components/userInfos.tsx | 4 +++- react-app/src/modules/user/pages/User.tsx | 4 +++- 8 files changed, 22 insertions(+), 9 deletions(-) diff --git a/react-app/src/components/ui/badge.tsx b/react-app/src/components/ui/badge.tsx index e688fac..8205253 100644 --- a/react-app/src/components/ui/badge.tsx +++ b/react-app/src/components/ui/badge.tsx @@ -17,8 +17,7 @@ const badgeVariants = cva( outline: "text-gray-950 dark:text-gray-50", accepted: "text-emerald-800 bg-emerald-200/80 dark:text-emerald-600 dark:bg-emerald-900/40 border-none", - denied: - "text-red-800 bg-red-200/80 dark:text-red-600 dark:bg-red-900/40 border-none", + denied: "text-red-600 bg-red-600/15 border-none", waiting: "bg-amber-500/15 text-amber-500 border-none", draft: "text-blue-800 bg-sky-300/40 dark:text-sky-600 dark:bg-sky-600/20 border-none", diff --git a/react-app/src/modules/organisation/components/agency/agencyAddress.tsx b/react-app/src/modules/organisation/components/agency/agencyAddress.tsx index a1a5691..3b4e4bd 100644 --- a/react-app/src/modules/organisation/components/agency/agencyAddress.tsx +++ b/react-app/src/modules/organisation/components/agency/agencyAddress.tsx @@ -143,7 +143,9 @@ export const AgencyAddress: React.FC = ({ ) : ( )} diff --git a/react-app/src/modules/organisation/components/service/departmentInfo.tsx b/react-app/src/modules/organisation/components/service/departmentInfo.tsx index cd09b3e..0b2289e 100644 --- a/react-app/src/modules/organisation/components/service/departmentInfo.tsx +++ b/react-app/src/modules/organisation/components/service/departmentInfo.tsx @@ -141,7 +141,9 @@ export const DepartmentInfo = () => { ) : ( )} diff --git a/react-app/src/modules/profile/Profile.tsx b/react-app/src/modules/profile/Profile.tsx index 5ff7c5b..2f4fcf4 100644 --- a/react-app/src/modules/profile/Profile.tsx +++ b/react-app/src/modules/profile/Profile.tsx @@ -25,7 +25,9 @@ export const Profile = () => { {currentUser?.firstname} {currentUser?.lastname} - {currentUser?.email} + + {currentUser?.email} +
diff --git a/react-app/src/modules/user/components/userAddress.tsx b/react-app/src/modules/user/components/userAddress.tsx index ec0365e..d0d261b 100644 --- a/react-app/src/modules/user/components/userAddress.tsx +++ b/react-app/src/modules/user/components/userAddress.tsx @@ -154,7 +154,9 @@ export const UserAddress: React.FC = ({ ) : ( )} diff --git a/react-app/src/modules/user/components/userBankInfos.tsx b/react-app/src/modules/user/components/userBankInfos.tsx index a536d3c..8e5ac52 100644 --- a/react-app/src/modules/user/components/userBankInfos.tsx +++ b/react-app/src/modules/user/components/userBankInfos.tsx @@ -111,7 +111,9 @@ export const UserBankInfos: React.FC = ({ ) : ( )} diff --git a/react-app/src/modules/user/components/userInfos.tsx b/react-app/src/modules/user/components/userInfos.tsx index d911566..2f42a27 100644 --- a/react-app/src/modules/user/components/userInfos.tsx +++ b/react-app/src/modules/user/components/userInfos.tsx @@ -169,7 +169,9 @@ export const UserInfos: React.FC = ({ ) : ( )} diff --git a/react-app/src/modules/user/pages/User.tsx b/react-app/src/modules/user/pages/User.tsx index 2371fbb..461bb4a 100644 --- a/react-app/src/modules/user/pages/User.tsx +++ b/react-app/src/modules/user/pages/User.tsx @@ -76,7 +76,9 @@ export function User() { )}
-
{foundUser.email}
+
+ {foundUser.email} +
From bbc473b47dd6eff923719371a8e6302653a23502 Mon Sep 17 00:00:00 2001 From: Theo Date: Mon, 19 Aug 2024 14:45:23 +0200 Subject: [PATCH 12/60] fix(demand): fix api call --- .../src/resources/demand/DemandController.ts | 17 +++++++++++------ .../src/modules/demand/pages/DemandDetail.tsx | 13 ++++++------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/api-server/src/resources/demand/DemandController.ts b/api-server/src/resources/demand/DemandController.ts index e641bfa..aeab66c 100644 --- a/api-server/src/resources/demand/DemandController.ts +++ b/api-server/src/resources/demand/DemandController.ts @@ -24,12 +24,17 @@ router.get("/:type", verifyToken, async (req: Request, res: Response) => { res.status(code).json({ message, data }); }); -router.get("/:id_demand", verifyToken, async (req: Request, res: Response) => { - const { code, message, data } = await DemandService.getDemandById( - req.params.id_demand, - ); - res.status(code).json({ message, data }); -}); +router.get( + "/list/:id_demand", + verifyToken, + async (req: Request, res: Response) => { + console.log(req.params.id_demand); + const { code, message, data } = await DemandService.getDemandById( + req.params.id_demand, + ); + res.status(code).json({ message, data }); + }, +); router.post( "/", diff --git a/react-app/src/modules/demand/pages/DemandDetail.tsx b/react-app/src/modules/demand/pages/DemandDetail.tsx index ae59de6..afc4afd 100644 --- a/react-app/src/modules/demand/pages/DemandDetail.tsx +++ b/react-app/src/modules/demand/pages/DemandDetail.tsx @@ -40,7 +40,9 @@ export function DemandDetail() { }; const fetchDemand = async () => { - const data = await customFetcher(`http://localhost:5000/api/demand/${id}`); + const data = await customFetcher( + `http://localhost:5000/api/demand/list/${id}`, + ); setDemand(data.data.data); }; @@ -182,22 +184,19 @@ export function Detail({ demand }: DetailProps) { {getClassForStatus(demand.status)} {demand.motivation} - {new Date(demand.created_at.toString()).toLocaleDateString( + {new Date(demand.created_at).toLocaleDateString( "fr-FR", dateTimeOptions, )} - {new Date(demand.start_date.toString()).toLocaleDateString( + {new Date(demand.start_date).toLocaleDateString( "fr-FR", dateOptions, )} - {new Date(demand.end_date.toString()).toLocaleDateString( - "fr-FR", - dateOptions, - )} + {new Date(demand.end_date).toLocaleDateString("fr-FR", dateOptions)} {demand.number_day} From 565eb0b9412c5f94118e53f2ecdf0d934d4c27d1 Mon Sep 17 00:00:00 2001 From: jarod-empirys Date: Mon, 19 Aug 2024 15:02:39 +0200 Subject: [PATCH 13/60] fix(users): fix typo --- api-server/src/resources/user/UserService.ts | 4 ++-- react-app/src/modules/user/pages/User.tsx | 2 +- react-app/src/modules/user/pages/Users.tsx | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/api-server/src/resources/user/UserService.ts b/api-server/src/resources/user/UserService.ts index 219dfff..254515e 100644 --- a/api-server/src/resources/user/UserService.ts +++ b/api-server/src/resources/user/UserService.ts @@ -38,7 +38,7 @@ export class UserService { logger.error(`Failed to get users. Error: ${error}`); return new ControllerResponse( 500, - "Impossible de récupérer la liste des utilisateurs", + "Impossible de récupérer la liste des collaborateurs", ); } } @@ -69,7 +69,7 @@ export class UserService { logger.error(`Failed to get user list. Error: ${error}`); return new ControllerResponse( 500, - "Impossible de récupérer la liste des utilisateurs", + "Impossible de récupérer la liste des collaborateurs", ); } } diff --git a/react-app/src/modules/user/pages/User.tsx b/react-app/src/modules/user/pages/User.tsx index 461bb4a..ade84dd 100644 --- a/react-app/src/modules/user/pages/User.tsx +++ b/react-app/src/modules/user/pages/User.tsx @@ -111,7 +111,7 @@ export function User() {
{userLoaded && userMainPage} {userNotFound && noUser} diff --git a/react-app/src/modules/user/pages/Users.tsx b/react-app/src/modules/user/pages/Users.tsx index 3e70be9..7939ea7 100644 --- a/react-app/src/modules/user/pages/Users.tsx +++ b/react-app/src/modules/user/pages/Users.tsx @@ -90,7 +90,7 @@ export function Users() { }; const usersTable = ( - + @@ -158,7 +158,7 @@ export function Users() {
- + - - - - - {services.map((service) => ( - - {service.label} - - ))} - - -
+ + + Libellé + Date de création + + + + {notifications?.length ? ( + notifications?.map((notification: any) => ( + + + {notification?.description} + + + {new Date(notification?.created_at).toLocaleDateString( + "fr-FR", + dateOptions, + )} + + + )) + ) : ( + + + Aucune Notification + + + )} + +
+
+
+
+ + +
+
+ + {`${notifications.length === 0 ? 0 : 1 + pageSize * (pageNumber - 1)} - ${notifications.length + pageSize * (pageNumber - 1)} sur ${totalData}`} + + + +
+
); }; diff --git a/react-app/src/modules/user/pages/Users.tsx b/react-app/src/modules/user/pages/Users.tsx index 1826518..d9ddf47 100644 --- a/react-app/src/modules/user/pages/Users.tsx +++ b/react-app/src/modules/user/pages/Users.tsx @@ -34,10 +34,10 @@ import { customFetcher } from "@/common/helper/fetchInstance.js"; export function Users() { const [users, setUsers] = useState([]); const [usersLoaded, setUsersLoaded] = useState(false); - const navigate = useNavigate(); const [pageSize, setPageSize] = useState(5); const [pageNumber, setPageNumber] = useState(1); const [totalData, setTotalData] = useState(0); + const navigate = useNavigate(); function handleClick(userId: number) { navigate(`/user/${userId}`); From 1cf7c055229fb0790cfeb75184a6a7bd8069a696 Mon Sep 17 00:00:00 2001 From: jarod-empirys Date: Tue, 20 Aug 2024 08:41:37 +0200 Subject: [PATCH 18/60] feat(project): add gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..723ef36 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea \ No newline at end of file From e192b621511cd0c25da68910a928ee4732eb77d4 Mon Sep 17 00:00:00 2001 From: Theo Date: Wed, 21 Aug 2024 16:52:36 +0200 Subject: [PATCH 19/60] feat(organisation): wip team --- .idea/codeStyles/Project.xml | 2 - .../src/resources/demand/DemandController.ts | 19 ++--- .../src/resources/demand/DemandService.ts | 1 - .../department/DepartmentRepository.ts | 12 +++ .../resources/department/DepartmentService.ts | 13 ++-- .../resources/department/dto/DepartmentDTO.ts | 4 +- .../src/resources/expense/ExpenseService.ts | 1 - .../src/resources/team/TeamController.ts | 16 +++- .../src/resources/team/TeamRepository.ts | 63 ++++++++++++++- api-server/src/resources/team/TeamService.ts | 38 ++++++++- api-server/src/resources/team/dto/TeamDTO.ts | 33 +++++++- react-app/index.html | 2 +- .../src/common/routes/OrganisationRoutes.tsx | 3 +- .../src/components/navigation/Navbar.tsx | 6 +- .../organisation/DepartmentList.model.ts | 6 +- .../src/models/organisation/Team.model.ts | 41 ++++++++++ .../src/models/organisation/TeamList.model.ts | 11 +++ react-app/src/modules/demand/pages/Demand.tsx | 2 +- .../src/modules/demand/pages/DemandDetail.tsx | 4 +- .../src/modules/organisation/Organisation.tsx | 8 +- .../components/service/agencyDepartment.tsx | 9 ++- .../service/agencyDepartmentDetails.tsx | 9 ++- .../components/service/departmentInfo.tsx | 9 ++- .../components/team/agencyTeam.tsx | 78 +++++++++++++------ 24 files changed, 315 insertions(+), 75 deletions(-) create mode 100644 react-app/src/models/organisation/Team.model.ts diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml index e3cd858..7dea630 100644 --- a/.idea/codeStyles/Project.xml +++ b/.idea/codeStyles/Project.xml @@ -8,7 +8,6 @@