From dc5ab9c3c4bccdc2293640a0c3a13b14c111e25a Mon Sep 17 00:00:00 2001 From: Thibaut Valentin Date: Sat, 20 Dec 2025 18:22:24 +0100 Subject: [PATCH 1/4] feat: add inactif member filter --- .../ffsaf/domain/service/MembreService.java | 105 ++++++++---------- .../ffsaf/rest/MembreAdminEndpoints.java | 4 +- .../ffsaf/rest/MembreClubEndpoints.java | 3 +- .../src/components/MemberCustomFiels.jsx | 6 +- src/main/webapp/src/pages/MemberList.jsx | 12 +- .../competition/CompetitionRegisterAdmin.jsx | 4 +- 6 files changed, 63 insertions(+), 71 deletions(-) diff --git a/src/main/java/fr/titionfire/ffsaf/domain/service/MembreService.java b/src/main/java/fr/titionfire/ffsaf/domain/service/MembreService.java index adead5e..e0a9217 100644 --- a/src/main/java/fr/titionfire/ffsaf/domain/service/MembreService.java +++ b/src/main/java/fr/titionfire/ffsaf/domain/service/MembreService.java @@ -125,8 +125,21 @@ public class MembreService { return sort; } - public Uni> searchAdmin(int limit, int page, String search, String club, - int licenceRequest, int payState, String order, String categorie) { + public Uni> search(int limit, int page, String search, int licenceRequest, int payState, + String order, String categorie, Boolean archive, String subject) { + return repository.find("userId = ?1", subject).firstResult() + .invoke(Unchecked.consumer(membreModel -> { + if (membreModel == null || membreModel.getClub() == null) + throw new DForbiddenException(); + })) + .chain(membreModel -> + searchAdmin(limit, page, search, membreModel.getClub(), licenceRequest, payState, order, + categorie, archive)); + } + + public Uni> searchAdmin(int limit, int page, String search, Object club, + int licenceRequest, int payState, String order, String categorie, + Boolean archive) { if (search == null) search = ""; search = "%" + search.replaceAll(" ", "% %") + "%"; @@ -137,77 +150,47 @@ public class MembreService { else categorieFilter = "categorie = " + Categorie.valueOf(categorie).ordinal(); - String finalSearch = search; - Uni> baseUni = getLicenceListe(licenceRequest, payState); + String archiveFilter; + if (archive == null || archive) + archiveFilter = "True"; + else + archiveFilter = String.format( + "EXISTS (SELECT 1 FROM LicenceModel l WHERE l.membre.id = m.id AND l.saison >= %s)", + Utils.getSaison() - 1); + + String clubFilter = "?3 = ?3"; + if (club != null) { + if (club instanceof String club_) { + if (!club_.isBlank()) { + if (club_.equals("null")) + clubFilter = "club IS NULL AND ?3 = ?3"; + else + clubFilter = "LOWER(club.name) LIKE LOWER(?3)"; + } + } else if (club instanceof ClubModel) + clubFilter = "club = ?3"; + } + + String queryStr = String.format( + "SELECT m FROM MembreModel m WHERE id %s ?2 AND %s AND (%s) AND %s AND %s", + (licenceRequest == 0 || licenceRequest == 4) ? "NOT IN" : "IN", clubFilter, FIND_NAME_REQUEST, + categorieFilter, + archiveFilter); Sort sort = getSort(order); if (sort == null) return Uni.createFrom().failure(new DInternalError("Erreur lors calcul du trie")); - return baseUni + String finalSearch = search; + return getLicenceListe(licenceRequest, payState) .map(l -> l.stream().map(l2 -> l2.getMembre().getId()).toList()) .chain(ids -> { PanacheQuery query; - - String idf = ((licenceRequest == 0 || licenceRequest == 4) ? "NOT IN" : "IN"); - - if (club == null || club.isBlank()) { - query = repository.find( - "id " + idf + " ?2 AND (" + FIND_NAME_REQUEST + ") AND " + categorieFilter, - sort, finalSearch, ids) - .page(Page.ofSize(limit)); - } else { - if (club.equals("null")) { - query = repository.find( - "id " + idf + " ?2 AND club IS NULL AND (" + FIND_NAME_REQUEST + ") AND " + categorieFilter, - sort, finalSearch, ids).page(Page.ofSize(limit)); - } else { - query = repository.find( - "id " + idf + " ?3 AND LOWER(club.name) LIKE LOWER(?2) AND (" + FIND_NAME_REQUEST + ") AND " + categorieFilter, - sort, finalSearch, club, ids) - .page(Page.ofSize(limit)); - } - } + query = repository.find(queryStr, sort, finalSearch, ids, club).page(Page.ofSize(limit)); return getPageResult(query, limit, page); }); } - public Uni> search(int limit, int page, String search, int licenceRequest, int payState, - String order, String categorie, String subject) { - if (search == null) - search = ""; - search = "%" + search.replaceAll(" ", "% %") + "%"; - - String finalSearch = search; - - Uni> baseUni = getLicenceListe(licenceRequest, payState); - - String categorieFilter; - if (categorie == null || categorie.isBlank()) - categorieFilter = " True"; - else - categorieFilter = "categorie = " + Categorie.valueOf(categorie).ordinal(); - - Sort sort = getSort(order); - if (sort == null) - return Uni.createFrom().failure(new DInternalError("Erreur lors calcul du trie")); - - return baseUni - .map(l -> l.stream().map(l2 -> l2.getMembre().getId()).toList()) - .chain(ids -> { - String idf = ((licenceRequest == 0 || licenceRequest == 4) ? "NOT IN" : "IN"); - - return repository.find("userId = ?1", subject).firstResult() - .chain(membreModel -> { - PanacheQuery query = repository.find( - "id " + idf + " ?3 AND club = ?2 AND (" + FIND_NAME_REQUEST + ") AND " + categorieFilter, - sort, finalSearch, membreModel.getClub(), ids) - .page(Page.ofSize(limit)); - return getPageResult(query, limit, page); - }); - }); - } - private Uni> getPageResult(PanacheQuery query, int limit, int page) { return Uni.createFrom().item(new PageResult()) .invoke(result -> result.setPage(page)) diff --git a/src/main/java/fr/titionfire/ffsaf/rest/MembreAdminEndpoints.java b/src/main/java/fr/titionfire/ffsaf/rest/MembreAdminEndpoints.java index 543dcd7..aa9a62b 100644 --- a/src/main/java/fr/titionfire/ffsaf/rest/MembreAdminEndpoints.java +++ b/src/main/java/fr/titionfire/ffsaf/rest/MembreAdminEndpoints.java @@ -59,6 +59,7 @@ public class MembreAdminEndpoints { @Parameter(description = "Text à rechercher") @QueryParam("search") String search, @Parameter(description = "Club à filter") @QueryParam("club") String club, @Parameter(description = "Catégorie à filter") @QueryParam("categorie") String categorie, + @Parameter(description = "Inclure les archive") @QueryParam("archive") Boolean archive, @Parameter(description = "État de la demande de licence: 0 -> sans demande, 1 -> avec demande ou validée, 2 -> toute les demande non validée, 3 -> validée, 4 -> tout, 5 -> demande complete, 6 -> demande incomplete") @QueryParam("licenceRequest") int licenceRequest, @Parameter(description = "État du payment: 0 -> non payer, 1 -> payer, 2 -> tout") @QueryParam("payment") int payment, @Parameter(description = "Ordre") @QueryParam("order") String order) { @@ -66,7 +67,8 @@ public class MembreAdminEndpoints { limit = 50; if (page == null || page < 1) page = 1; - return membreService.searchAdmin(limit, page - 1, search, club, licenceRequest, payment, order, categorie); + return membreService.searchAdmin(limit, page - 1, search, club, licenceRequest, payment, order, + categorie, archive); } @GET diff --git a/src/main/java/fr/titionfire/ffsaf/rest/MembreClubEndpoints.java b/src/main/java/fr/titionfire/ffsaf/rest/MembreClubEndpoints.java index 6ddca01..eefa6f6 100644 --- a/src/main/java/fr/titionfire/ffsaf/rest/MembreClubEndpoints.java +++ b/src/main/java/fr/titionfire/ffsaf/rest/MembreClubEndpoints.java @@ -51,6 +51,7 @@ public class MembreClubEndpoints { @Parameter(description = "Page à consulter") @QueryParam("page") Integer page, @Parameter(description = "Text à rechercher") @QueryParam("search") String search, @Parameter(description = "Catégorie à filter") @QueryParam("categorie") String categorie, + @Parameter(description = "Inclure les archive") @QueryParam("archive") Boolean archive, @Parameter(description = "Etat de la demande de licence: 0 -> sans demande, 1 -> avec demande ou validée, 2 -> toute les demande non validée, 3 -> validée, 4 -> tout, 5 -> demande complete, 6 -> demande incomplete") @QueryParam("licenceRequest") int licenceRequest, @Parameter(description = "Etat du payment: 0 -> non payer, 1 -> payer, 2 -> tout") @QueryParam("payment") int payment, @Parameter(description = "Ordre") @QueryParam("order") String order) { @@ -58,7 +59,7 @@ public class MembreClubEndpoints { limit = 50; if (page == null || page < 1) page = 1; - return membreService.search(limit, page - 1, search, licenceRequest, payment, order, categorie, securityCtx.getSubject()); + return membreService.search(limit, page - 1, search, licenceRequest, payment, order, categorie, archive, securityCtx.getSubject()); } @GET diff --git a/src/main/webapp/src/components/MemberCustomFiels.jsx b/src/main/webapp/src/components/MemberCustomFiels.jsx index abe62ab..8a65639 100644 --- a/src/main/webapp/src/components/MemberCustomFiels.jsx +++ b/src/main/webapp/src/components/MemberCustomFiels.jsx @@ -119,13 +119,13 @@ export function CheckField({name, text, value, row = false}) { } -export const Checkbox = ({label, value, onChange}) => { +export const Checkbox = ({label, value, onChange, name = "checkbox1"}) => { const handleChange = () => { onChange(!value); }; return
- - + +
}; diff --git a/src/main/webapp/src/pages/MemberList.jsx b/src/main/webapp/src/pages/MemberList.jsx index f454860..e8da44e 100644 --- a/src/main/webapp/src/pages/MemberList.jsx +++ b/src/main/webapp/src/pages/MemberList.jsx @@ -35,6 +35,7 @@ export function MemberList({source}) { payment: 2, order: "", categorie: "", + archived: false, ...JSON.parse(decodeURI(hash.substring(1)) || "{}"), } @@ -43,10 +44,10 @@ export function MemberList({source}) { data, error, refresh - } = useFetch(`/member/find/${source}?page=${filter.page}&search=${filter.search}&club=${filter.club}&licenceRequest=${filter.licenceRequest}&payment=${filter.payment}&order=${filter.order}&categorie=${filter.categorie}`, setLoading, 1) + } = useFetch(`/member/find/${source}?page=${filter.page}&search=${filter.search}&club=${filter.club}&licenceRequest=${filter.licenceRequest}&payment=${filter.payment}&order=${filter.order}&categorie=${filter.categorie}&archive=${filter.archived}`, setLoading, 1) useEffect(() => { - const tmp = `/member/find/${source}?page=${filter.page}&search=${filter.search}&club=${filter.club}&licenceRequest=${filter.licenceRequest}&payment=${filter.payment}&order=${filter.order}&categorie=${filter.categorie}`; + const tmp = `/member/find/${source}?page=${filter.page}&search=${filter.search}&club=${filter.club}&licenceRequest=${filter.licenceRequest}&payment=${filter.payment}&order=${filter.order}&categorie=${filter.categorie}&archive=${filter.archived}`; if (tmp === lastRefresh) return; lastRefresh = tmp @@ -137,6 +138,8 @@ export function MemberList({source}) {
setFilter({...filter, archived: e})} clubFilter={filter.club} setClubFilter={e => setFilter({...filter, club: e})} source={source} @@ -523,6 +526,8 @@ function OrderBar({onOrderChange, defaultValues = "", source}) { function FiltreBar({ showLicenceState, setShowLicenceState, + showArchived, + setShowArchived, clubFilter, setClubFilter, source, @@ -538,6 +543,9 @@ function FiltreBar({
+
+ +
{!needFile &&
Laissez vide pour ne rien changer. (Si un statu a déjà été envoyé lors de cette @@ -313,7 +313,7 @@ function MembreInfo({role, initData}) { return <>
- +