From 2737e53de5af4a66388207f557bd96ffae73f193 Mon Sep 17 00:00:00 2001 From: Thibaut Valentin Date: Tue, 16 Jul 2024 13:41:03 +0200 Subject: [PATCH] feat: affiliation request list --- .../domain/service/AffiliationService.java | 4 + .../ffsaf/rest/AffiliationEndpoints.java | 33 ++++-- .../rest/data/SimpleReqAffiliationResume.java | 30 +++++ src/main/webapp/src/pages/admin/AdminRoot.jsx | 5 + .../admin/affiliation/AffiliationReqList.jsx | 107 ++++++++++++++++++ .../admin/affiliation/AffiliationReqPage.jsx | 6 +- 6 files changed, 170 insertions(+), 15 deletions(-) create mode 100644 src/main/java/fr/titionfire/ffsaf/rest/data/SimpleReqAffiliationResume.java create mode 100644 src/main/webapp/src/pages/admin/affiliation/AffiliationReqList.jsx diff --git a/src/main/java/fr/titionfire/ffsaf/domain/service/AffiliationService.java b/src/main/java/fr/titionfire/ffsaf/domain/service/AffiliationService.java index feb2adc..b5ef5f8 100644 --- a/src/main/java/fr/titionfire/ffsaf/domain/service/AffiliationService.java +++ b/src/main/java/fr/titionfire/ffsaf/domain/service/AffiliationService.java @@ -48,6 +48,10 @@ public class AffiliationService { @ConfigProperty(name = "upload_dir") String media; + public Uni> getAllReq() { + return repositoryRequest.listAll(); + } + public Uni save(AffiliationRequestForm form) { AffiliationRequestModel affModel = form.toModel(); affModel.setSaison(Utils.getSaison()); diff --git a/src/main/java/fr/titionfire/ffsaf/rest/AffiliationEndpoints.java b/src/main/java/fr/titionfire/ffsaf/rest/AffiliationEndpoints.java index 5e9b41c..af85d10 100644 --- a/src/main/java/fr/titionfire/ffsaf/rest/AffiliationEndpoints.java +++ b/src/main/java/fr/titionfire/ffsaf/rest/AffiliationEndpoints.java @@ -3,6 +3,7 @@ package fr.titionfire.ffsaf.rest; import fr.titionfire.ffsaf.domain.service.AffiliationService; import fr.titionfire.ffsaf.rest.data.SimpleAffiliation; import fr.titionfire.ffsaf.rest.data.SimpleReqAffiliation; +import fr.titionfire.ffsaf.rest.data.SimpleReqAffiliationResume; import fr.titionfire.ffsaf.rest.from.AffiliationRequestForm; import fr.titionfire.ffsaf.rest.from.AffiliationRequestSaveForm; import fr.titionfire.ffsaf.utils.GroupeUtils; @@ -44,6 +45,22 @@ public class AffiliationEndpoints { throw new ForbiddenException(); }); + @GET + @Path("/request") + @RolesAllowed({"federation_admin"}) + @Produces(MediaType.APPLICATION_JSON) + public Uni> getAllAffRequest() { + return service.getAllReq().map(o -> o.stream().map(SimpleReqAffiliationResume::fromModel).toList()); + } + + @POST + @Path("/request") + @Produces(MediaType.TEXT_PLAIN) + @Consumes(MediaType.MULTIPART_FORM_DATA) + public Uni saveAffRequest(AffiliationRequestForm form) { + return service.save(form); + } + @GET @Path("/request/{id}") @RolesAllowed({"federation_admin"}) @@ -78,20 +95,12 @@ public class AffiliationEndpoints { return service.accept(form); } - @POST - @Path("/request") - @Produces(MediaType.TEXT_PLAIN) - @Consumes(MediaType.MULTIPART_FORM_DATA) - public Uni saveAffRequest(AffiliationRequestForm form) { - return service.save(form); - } - @GET @Path("/current") @RolesAllowed({"federation_admin"}) @Produces(MediaType.APPLICATION_JSON) - public Uni> getCurrentSaisonLicenceAdmin() { + public Uni> getCurrentSaisonAffiliationAdmin() { return service.getCurrentSaisonAffiliation(); } @@ -99,7 +108,7 @@ public class AffiliationEndpoints { @Path("{id}") @RolesAllowed({"federation_admin", "club_president", "club_secretaire", "club_respo_intra"}) @Produces(MediaType.APPLICATION_JSON) - public Uni> getLicence(@PathParam("id") long id) { + public Uni> getAffiliation(@PathParam("id") long id) { return Uni.createFrom().item(id).invoke(checkPerm).chain(__ -> service.getAffiliation(id)); } @@ -107,7 +116,7 @@ public class AffiliationEndpoints { @Path("{id}") @RolesAllowed("federation_admin") @Produces(MediaType.APPLICATION_JSON) - public Uni setLicence(@PathParam("id") long id, @QueryParam("saison") int saison) { + public Uni setAffiliation(@PathParam("id") long id, @QueryParam("saison") int saison) { return service.setAffiliation(id, saison); } @@ -115,7 +124,7 @@ public class AffiliationEndpoints { @Path("{id}") @RolesAllowed("federation_admin") @Produces(MediaType.TEXT_PLAIN) - public Uni deleteLicence(@PathParam("id") long id) { + public Uni deleteAffiliation(@PathParam("id") long id) { return service.deleteAffiliation(id); } diff --git a/src/main/java/fr/titionfire/ffsaf/rest/data/SimpleReqAffiliationResume.java b/src/main/java/fr/titionfire/ffsaf/rest/data/SimpleReqAffiliationResume.java new file mode 100644 index 0000000..f3eb4ee --- /dev/null +++ b/src/main/java/fr/titionfire/ffsaf/rest/data/SimpleReqAffiliationResume.java @@ -0,0 +1,30 @@ +package fr.titionfire.ffsaf.rest.data; + +import fr.titionfire.ffsaf.data.model.AffiliationRequestModel; +import io.quarkus.runtime.annotations.RegisterForReflection; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +@AllArgsConstructor +@RegisterForReflection +public class SimpleReqAffiliationResume { + Long id; + String name; + long siret; + int saison; + + public static SimpleReqAffiliationResume fromModel(AffiliationRequestModel model) { + if (model == null) + return null; + + return new SimpleReqAffiliationResume.SimpleReqAffiliationResumeBuilder() + .id(model.getId()) + .name(model.getName()) + .siret(model.getSiret()) + .saison(model.getSaison()) + .build(); + } +} diff --git a/src/main/webapp/src/pages/admin/AdminRoot.jsx b/src/main/webapp/src/pages/admin/AdminRoot.jsx index 83af37d..3a4ddfa 100644 --- a/src/main/webapp/src/pages/admin/AdminRoot.jsx +++ b/src/main/webapp/src/pages/admin/AdminRoot.jsx @@ -8,6 +8,7 @@ import {ClubList} from "./club/ClubList.jsx"; import {AffiliationReqPage} from "./affiliation/AffiliationReqPage.jsx"; import {NewClubPage} from "./club/NewClubPage.jsx"; import {ClubPage} from "./club/ClubPage.jsx"; +import {AffiliationReqList} from "./affiliation/AffiliationReqList.jsx"; export function AdminRoot() { return <> @@ -44,6 +45,10 @@ export function getAdminChildren() { path: 'affiliation/request/:id', element: }, + { + path: 'affiliation/request', + element: + }, { path: 'club/new', element: diff --git a/src/main/webapp/src/pages/admin/affiliation/AffiliationReqList.jsx b/src/main/webapp/src/pages/admin/affiliation/AffiliationReqList.jsx new file mode 100644 index 0000000..54e9d65 --- /dev/null +++ b/src/main/webapp/src/pages/admin/affiliation/AffiliationReqList.jsx @@ -0,0 +1,107 @@ +import {AxiosError} from "../../../components/AxiosError.jsx"; +import {useNavigate} from "react-router-dom"; +import {useLoadingSwitcher} from "../../../hooks/useLoading.jsx"; +import {useFetch} from "../../../hooks/useFetch.js"; +import {ThreeDots} from "react-loader-spinner"; +import {useEffect, useState} from "react"; +import {Checkbox} from "../../../components/MemberCustomFiels.jsx"; + +export function AffiliationReqList() { + const navigate = useNavigate(); + + const setLoading = useLoadingSwitcher() + const {data, refresh, error} = useFetch(`/affiliation/request`, setLoading, 1) + + const [saisonFilter, setSaisonFilter] = useState(null) + const visibleRequest = (data == null) ? [] : data.filter(e => !(saisonFilter && e.saison !== saisonFilter)).sort((a, b) => { + if (a.saison > b.saison) return 1 + if (a.saison < b.saison) return -1 + if (a.name.toLowerCase() > b.name.toLowerCase()) return 1 + if (a.name.toLowerCase() < b.name.toLowerCase()) return -1 + return 0 + }); + + return <> +

Demande d'affiliation

+ + +
+
+
+ {data + ? + : error + ? + : + } +
+
+
+
Filtre
+
+ +
+
+
+
+
+ +} + +function MakeCentralPanel({data, visibleRequest, navigate}) { + + return <> +
+ {visibleRequest.length} ligne(s) affichée(s) sur {data.length} +
+ {visibleRequest.map(req => ())} +
+
+ +} + +function MakeRow({request, navigate}) { + return
navigate("" + request.id)}> +
+
{request.name}
+
+ {request.saison}-{request.saison + 1}
{request.siret}
+
+} + +let allSaison = [] + +function FiltreBar({data, saisonFilter, setSaisonFilter}) { + useEffect(() => { + if (!data) + return; + allSaison.push(...data.map((e) => e.saison)) + allSaison = allSaison.filter((value, index, self) => self.indexOf(value) === index).filter(value => value != null).sort() + }, [data]); + + return
+
+ +
+
+} + + +function Def() { + return
+
  • +
  • +
  • +
  • +
  • +
    +} \ No newline at end of file diff --git a/src/main/webapp/src/pages/admin/affiliation/AffiliationReqPage.jsx b/src/main/webapp/src/pages/admin/affiliation/AffiliationReqPage.jsx index fd52ae2..2c8b4d5 100644 --- a/src/main/webapp/src/pages/admin/affiliation/AffiliationReqPage.jsx +++ b/src/main/webapp/src/pages/admin/affiliation/AffiliationReqPage.jsx @@ -21,7 +21,7 @@ export function AffiliationReqPage() { return <>

    Demande d'affiliation

    -
    @@ -47,7 +47,7 @@ function Content({data, refresh}) { error: "Échec de la suppression de la demande d'affiliation 😕" } ).then(_ => { - navigate("/admin/affiliation") + navigate("/admin/affiliation/request") }) } @@ -142,7 +142,7 @@ function Content({data, refresh}) { error: "Échec de l'acceptation de l'affiliation 😕" } ).then(_ => { - navigate("/admin/affiliation") + navigate("/admin/affiliation/request") }) } }