From 53d59a5b569c098aebd2473d9c28fc7b5505b32b Mon Sep 17 00:00:00 2001 From: Thibaut Valentin Date: Thu, 18 Jul 2024 11:46:54 +0200 Subject: [PATCH] feat: club set role --- .../ffsaf/domain/service/ClubService.java | 17 +++- .../titionfire/ffsaf/rest/ClubEndpoints.java | 15 ++- .../ffsaf/rest/data/DeskMember.java | 29 ++++++ src/main/webapp/src/pages/DemandeAff.jsx | 28 +++--- .../src/pages/admin/club/AffiliationCard.jsx | 2 +- .../webapp/src/pages/admin/club/ClubPage.jsx | 24 +++++ .../src/pages/club/club/AffiliationCard.jsx | 96 ++++++++++++++++--- .../webapp/src/pages/club/club/MyClubPage.jsx | 7 +- 8 files changed, 188 insertions(+), 30 deletions(-) create mode 100644 src/main/java/fr/titionfire/ffsaf/rest/data/DeskMember.java diff --git a/src/main/java/fr/titionfire/ffsaf/domain/service/ClubService.java b/src/main/java/fr/titionfire/ffsaf/domain/service/ClubService.java index 3553079..c624945 100644 --- a/src/main/java/fr/titionfire/ffsaf/domain/service/ClubService.java +++ b/src/main/java/fr/titionfire/ffsaf/domain/service/ClubService.java @@ -10,6 +10,7 @@ import fr.titionfire.ffsaf.data.repository.CombRepository; import fr.titionfire.ffsaf.net2.ServerCustom; import fr.titionfire.ffsaf.net2.data.SimpleClubModel; import fr.titionfire.ffsaf.net2.request.SReqClub; +import fr.titionfire.ffsaf.rest.data.DeskMember; import fr.titionfire.ffsaf.rest.data.RenewAffData; import fr.titionfire.ffsaf.rest.data.SimpleClubList; import fr.titionfire.ffsaf.rest.from.FullClubForm; @@ -36,6 +37,7 @@ import java.util.Collection; import java.util.Comparator; import java.util.HashMap; import java.util.List; +import java.util.function.Consumer; import static fr.titionfire.ffsaf.net2.Client_Thread.MAPPER; @@ -128,6 +130,16 @@ public class ClubService { .call(club -> Mutiny.fetch(club.getContact())); } + public Uni> getClubDesk(Consumer consumer, long id) { + return repository.findById(id).invoke(consumer) + .chain(club -> combRepository.list("club = ?1", club)) + .map(combs -> combs.stream() + .filter(o -> o.getRole() != null && o.getRole().level >= RoleAsso.MEMBREBUREAU.level) + .sorted((o1, o2) -> o2.getRole().level - o1.getRole().level) + .map(DeskMember::fromModel) + .toList()); + } + public Uni updateOfUser(JsonWebToken idToken, PartClubForm form) { TypeReference> typeRef = new TypeReference<>() { }; @@ -245,7 +257,7 @@ public class ClubService { .call(__ -> Utils.deleteMedia(id, media, "clubStatus")); } - public Uni getRenewData(long id) { + public Uni getRenewData(long id, List mIds) { RenewAffData data = new RenewAffData(); return repository.findById(id) @@ -260,11 +272,10 @@ public class ClubService { .map(AffiliationModel::getSaison).map(i -> Math.min(i + 1, Utils.getSaison() + 1)) .orElse(Utils.getSaison())); }) - .chain(club -> combRepository.list("club = ?1", club)) + .chain(club -> combRepository.list("id IN ?1", mIds)) .invoke(combs -> data.setMembers(combs.stream() .filter(o -> o.getRole() != null && o.getRole().level >= RoleAsso.MEMBREBUREAU.level) .sorted((o1, o2) -> o2.getRole().level - o1.getRole().level) - .limit(3) .map(RenewAffData.RenewMember::new) .toList())) .map(o -> data); diff --git a/src/main/java/fr/titionfire/ffsaf/rest/ClubEndpoints.java b/src/main/java/fr/titionfire/ffsaf/rest/ClubEndpoints.java index 0472054..d7e6555 100644 --- a/src/main/java/fr/titionfire/ffsaf/rest/ClubEndpoints.java +++ b/src/main/java/fr/titionfire/ffsaf/rest/ClubEndpoints.java @@ -3,6 +3,7 @@ package fr.titionfire.ffsaf.rest; import fr.titionfire.ffsaf.data.model.ClubModel; import fr.titionfire.ffsaf.domain.service.ClubService; import fr.titionfire.ffsaf.net2.data.SimpleClubModel; +import fr.titionfire.ffsaf.rest.data.DeskMember; import fr.titionfire.ffsaf.rest.data.RenewAffData; import fr.titionfire.ffsaf.rest.data.SimpleClub; import fr.titionfire.ffsaf.rest.data.SimpleClubList; @@ -179,8 +180,18 @@ public class ClubEndpoints { @Path("/renew/{id}") @RolesAllowed({"club_president", "club_secretaire", "club_respo_intra"}) @Produces(MediaType.APPLICATION_JSON) - public Uni getOfUser(@PathParam("id") long id) { - return Uni.createFrom().item(id).invoke(checkPerm2).chain(__ -> clubService.getRenewData(id)); + public Uni getOfUser(@PathParam("id") long id, @QueryParam("m1") long m1_id, + @QueryParam("m2") long m2_id, @QueryParam("m3") long m3_id) { + return Uni.createFrom().item(id).invoke(checkPerm2) + .chain(__ -> clubService.getRenewData(id, List.of(m1_id, m2_id, m3_id))); + } + + @GET + @Path("/desk/{id}") + @RolesAllowed({"federation_admin", "club_president", "club_secretaire", "club_respo_intra"}) + @Produces(MediaType.APPLICATION_JSON) + public Uni> getClubDesk(@PathParam("id") long id) { + return clubService.getClubDesk(checkPerm, id); } @GET diff --git a/src/main/java/fr/titionfire/ffsaf/rest/data/DeskMember.java b/src/main/java/fr/titionfire/ffsaf/rest/data/DeskMember.java new file mode 100644 index 0000000..c653916 --- /dev/null +++ b/src/main/java/fr/titionfire/ffsaf/rest/data/DeskMember.java @@ -0,0 +1,29 @@ +package fr.titionfire.ffsaf.rest.data; + +import fr.titionfire.ffsaf.data.model.MembreModel; +import io.quarkus.runtime.annotations.RegisterForReflection; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@RegisterForReflection +public class DeskMember { + private Long id; + private String lname; + private String fname; + private String role; + + public static DeskMember fromModel(MembreModel membreModel) { + if (membreModel == null) + return null; + + DeskMember deskMember = new DeskMember(); + deskMember.setId(membreModel.getId()); + deskMember.setLname(membreModel.getLname()); + deskMember.setFname(membreModel.getFname()); + deskMember.setRole(membreModel.getRole().toString()); + + return deskMember; + } +} diff --git a/src/main/webapp/src/pages/DemandeAff.jsx b/src/main/webapp/src/pages/DemandeAff.jsx index 66a4e9e..a8ec7e8 100644 --- a/src/main/webapp/src/pages/DemandeAff.jsx +++ b/src/main/webapp/src/pages/DemandeAff.jsx @@ -2,8 +2,6 @@ import {useEffect, useState} from "react"; import {apiAxios, getSaison} from "../utils/Tools.js"; import {toast} from "react-toastify"; import {useLocation, useNavigate} from "react-router-dom"; -import {RoleList} from "../components/MemberCustomFiels.jsx"; -import {useAuth} from "../hooks/useAuth.jsx"; const notUpperCase = ["de", "la", "le", "les", "des", "du", "d'", "l'", "sur"]; @@ -96,7 +94,7 @@ export function DemandeAff() { ).then(_ => { navigate("/club/me") }) - }else if (event.nativeEvent.submitter.value === "edit") { + } else if (event.nativeEvent.submitter.value === "edit") { formData.append("id", initData.id) toast.promise( @@ -109,7 +107,7 @@ export function DemandeAff() { ).then(_ => { navigate("/club/me") }) - }else { + } else { formData.append("id", -1) toast.promise( @@ -284,15 +282,23 @@ function AssoInfo({initData, needFile}) { -
- - +
+
+ + +
+ {!needFile &&
Laissez vide pour ne rien changer. (Si un blason a déjà été envoyé lors de cette + demande, il sera utilisé, sinon nous utiliserons celui de la précédant affiliation)
}
-
- - +
+
+ + +
+ {!needFile &&
Laissez vide pour ne rien changer. (Si un statu a déjà été envoyé lors de cette + demande, il sera utilisé, sinon nous utiliserons celui de la précédant affiliation)
}
; } diff --git a/src/main/webapp/src/pages/admin/club/AffiliationCard.jsx b/src/main/webapp/src/pages/admin/club/AffiliationCard.jsx index ef4cfd8..d6d2186 100644 --- a/src/main/webapp/src/pages/admin/club/AffiliationCard.jsx +++ b/src/main/webapp/src/pages/admin/club/AffiliationCard.jsx @@ -24,7 +24,7 @@ export function AffiliationCard({clubData}) { dispatch({type: 'SORT', payload: (a, b) => b.saison - a.saison}) }, [data]); - return
+ return
Affiliation
diff --git a/src/main/webapp/src/pages/admin/club/ClubPage.jsx b/src/main/webapp/src/pages/admin/club/ClubPage.jsx index 0257dec..f92021e 100644 --- a/src/main/webapp/src/pages/admin/club/ClubPage.jsx +++ b/src/main/webapp/src/pages/admin/club/ClubPage.jsx @@ -52,6 +52,7 @@ export function ClubPage() {
+
@@ -157,3 +159,25 @@ function InformationForm({data}) { } + + +export function BureauCard({clubData}) { + const setLoading = useLoadingSwitcher() + const {data, error} = useFetch(`/club/desk/${clubData.id}`, setLoading, 1) + + return <> +
+
Bureau
+
+
    + {data && data.map((d, index) => { + return
    +
    {d.role}
    {d.lname} {d.fname}
    +
    + })} +
+
+
+ {error && } + +} \ No newline at end of file diff --git a/src/main/webapp/src/pages/club/club/AffiliationCard.jsx b/src/main/webapp/src/pages/club/club/AffiliationCard.jsx index a91526a..aa483fb 100644 --- a/src/main/webapp/src/pages/club/club/AffiliationCard.jsx +++ b/src/main/webapp/src/pages/club/club/AffiliationCard.jsx @@ -10,25 +10,16 @@ import {SimpleReducer} from "../../../utils/SimpleReducer.jsx"; import {useNavigate} from "react-router-dom"; export function AffiliationCard({clubData}) { - const navigate = useNavigate(); const setLoading = useLoadingSwitcher() const {data, error} = useFetch(`/affiliation/${clubData.id}`, setLoading, 1) const [modalAffiliation, setModal] = useState({id: 0, club: clubData.id}) - const sendAffiliationRequest = () => { - let createData = {} - apiAxios.get(`/club/renew/${clubData.id}`).then(data => { - navigate('/affiliation#d' + encodeURI(JSON.stringify(data.data))) - }) - } - - return
+ return
Affiliation
- +
@@ -92,4 +83,87 @@ function ModalContent({affiliation}) {
} +} + +export function BureauCard({clubData}) { + const setLoading = useLoadingSwitcher() + const {data, error} = useFetch(`/club/desk/${clubData.id}`, setLoading, 1) + + return <> +
+
Bureau
+
+
    + {data && data.map((d, index) => { + return
    +
    {d.role}
    {d.lname} {d.fname}
    +
    + })} +
+
+
+ + + + {error && } + +} + +function ModalContent2({clubData, data}) { + const navigate = useNavigate(); + + const sendAffiliationRequest = (event) => { + event.preventDefault() + + let list = [] + for (let i = 0; i < event.target.length; i++) { + if (event.target[i].type === "checkbox") { + if (event.target[i].checked) { + list.push(event.target[i].name) + } + } + } + + if (list.length !== 3) { + toast.error("Il faut sélectionner 3 membres pour renouveler l'affiliation") + return + } + apiAxios.get(`/club/renew/${clubData.id}?m1=${list[0]}&m2=${list[1]}&m3=${list[2]}`).then(data => { + navigate('/affiliation#d' + encodeURI(JSON.stringify(data.data))) + }) + } + + return
+
+

Renouvellement de l'affiliation

+ +
+
+

Veuillez sélectionner 3 membres du bureau pour remplir la pré-demande. (Si un membre non-bureau va le devenir l'an prochain, + vous pourrez toujours remplacer un des membres sélectionné à la prochaine étape)

+ {data && data.map((d, index) => { + return
+
+ +
+ {d.role} + {d.lname} {d.fname} +
+ } + )} +
+
+ + +
+
} \ No newline at end of file diff --git a/src/main/webapp/src/pages/club/club/MyClubPage.jsx b/src/main/webapp/src/pages/club/club/MyClubPage.jsx index 2842adb..462f4ee 100644 --- a/src/main/webapp/src/pages/club/club/MyClubPage.jsx +++ b/src/main/webapp/src/pages/club/club/MyClubPage.jsx @@ -5,7 +5,7 @@ import {toast} from "react-toastify"; import {apiAxios} from "../../../utils/Tools.js"; import {ConfirmDialog} from "../../../components/ConfirmDialog.jsx"; import {AxiosError} from "../../../components/AxiosError.jsx"; -import {AffiliationCard} from "./AffiliationCard.jsx"; +import {AffiliationCard, BureauCard} from "./AffiliationCard.jsx"; import {CountryList, TextField} from "../../../components/MemberCustomFiels.jsx"; import {useRef, useState} from "react"; @@ -32,7 +32,10 @@ export function MyClubPage() {
- + + + +