feat: licence state filter membreList
This commit is contained in:
parent
41a88ea914
commit
1cd4a1ff97
@ -30,7 +30,7 @@ public class LicenceModel {
|
|||||||
@Schema(description = "La saison de la licence.", example = "2025")
|
@Schema(description = "La saison de la licence.", example = "2025")
|
||||||
int saison;
|
int saison;
|
||||||
|
|
||||||
@Schema(description = "Nom du médecin sur certificat médical.", example = "M. Jean")
|
@Schema(description = "Nom du médecin sur certificat médical.", example = "M. Jean") // TODO Update for date
|
||||||
String certificate;
|
String certificate;
|
||||||
|
|
||||||
@Schema(description = "Licence validée", example = "true")
|
@Schema(description = "Licence validée", example = "true")
|
||||||
|
|||||||
@ -78,46 +78,93 @@ public class MembreService {
|
|||||||
final static String FIND_NAME_REQUEST = "unaccent(fname) ILIKE unaccent(?1) OR unaccent(lname) ILIKE unaccent(?1) " +
|
final static String FIND_NAME_REQUEST = "unaccent(fname) ILIKE unaccent(?1) OR unaccent(lname) ILIKE unaccent(?1) " +
|
||||||
"OR unaccent(fname || ' ' || lname) ILIKE unaccent(?1) OR unaccent(lname || ' ' || fname) ILIKE unaccent(?1)";
|
"OR unaccent(fname || ' ' || lname) ILIKE unaccent(?1) OR unaccent(lname || ' ' || fname) ILIKE unaccent(?1)";
|
||||||
|
|
||||||
public Uni<PageResult<SimpleMembre>> searchAdmin(int limit, int page, String search, String club) {
|
public Uni<PageResult<SimpleMembre>> searchAdmin(int limit, int page, String search, String club, int licenceRequest) {
|
||||||
if (search == null)
|
|
||||||
search = "";
|
|
||||||
search = "%" + search.replaceAll(" ", "% %") + "%";
|
|
||||||
|
|
||||||
PanacheQuery<MembreModel> query;
|
|
||||||
|
|
||||||
if (club == null || club.isBlank()) {
|
|
||||||
query = repository.find(FIND_NAME_REQUEST, Sort.ascending("fname", "lname"), search)
|
|
||||||
.page(Page.ofSize(limit));
|
|
||||||
} else {
|
|
||||||
if (club.equals("null")) {
|
|
||||||
query = repository.find(
|
|
||||||
"club IS NULL AND (" + FIND_NAME_REQUEST + ")",
|
|
||||||
Sort.ascending("fname", "lname"), search).page(Page.ofSize(limit));
|
|
||||||
} else {
|
|
||||||
query = repository.find(
|
|
||||||
"LOWER(club.name) LIKE LOWER(?2) AND (" + FIND_NAME_REQUEST + ")",
|
|
||||||
Sort.ascending("fname", "lname"), search, club + "%").page(Page.ofSize(limit));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return getPageResult(query, limit, page);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Uni<PageResult<SimpleMembre>> search(int limit, int page, String search, String subject) {
|
|
||||||
if (search == null)
|
if (search == null)
|
||||||
search = "";
|
search = "";
|
||||||
search = "%" + search.replaceAll(" ", "% %") + "%";
|
search = "%" + search.replaceAll(" ", "% %") + "%";
|
||||||
|
|
||||||
String finalSearch = search;
|
String finalSearch = search;
|
||||||
return repository.find("userId = ?1", subject).firstResult()
|
|
||||||
.chain(membreModel -> {
|
Uni<List<LicenceModel>> baseUni;
|
||||||
PanacheQuery<MembreModel> query = repository.find(
|
if (licenceRequest == 0 || licenceRequest == 1)
|
||||||
"club = ?2 AND (" + FIND_NAME_REQUEST + ")",
|
baseUni = licenceRepository.list("saison = ?1", Utils.getSaison());
|
||||||
Sort.ascending("fname", "lname"), finalSearch, membreModel.getClub())
|
else if (licenceRequest == 2)
|
||||||
.page(Page.ofSize(limit));
|
baseUni = licenceRepository.list("saison = ?1 AND validate = FALSE", Utils.getSaison());
|
||||||
|
else if (licenceRequest == 5)
|
||||||
|
baseUni = licenceRepository.list("saison = ?1 AND validate = FALSE AND LENGTH(certificate) >= 3", Utils.getSaison());
|
||||||
|
else if (licenceRequest == 6)
|
||||||
|
baseUni = licenceRepository.list("saison = ?1 AND validate = FALSE AND LENGTH(certificate) <= 2", Utils.getSaison());
|
||||||
|
else if (licenceRequest == 3)
|
||||||
|
baseUni = licenceRepository.list("saison = ?1 AND validate = TRUE", Utils.getSaison());
|
||||||
|
else
|
||||||
|
baseUni = Uni.createFrom().item(new ArrayList<>());
|
||||||
|
|
||||||
|
return baseUni
|
||||||
|
.map(l -> l.stream().map(l2 -> l2.getMembre().getId()).toList())
|
||||||
|
.chain(ids -> {
|
||||||
|
PanacheQuery<MembreModel> query;
|
||||||
|
|
||||||
|
String idf = ((licenceRequest == 0 || licenceRequest == 4) ? "NOT IN" : "IN");
|
||||||
|
|
||||||
|
if (club == null || club.isBlank()) {
|
||||||
|
LOGGER.info(ids);
|
||||||
|
query = repository.find(
|
||||||
|
"id " + idf + " ?2 AND (" + FIND_NAME_REQUEST + ")",
|
||||||
|
Sort.ascending("fname", "lname"), 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 + ")",
|
||||||
|
Sort.ascending("fname", "lname"), finalSearch, ids).page(Page.ofSize(limit));
|
||||||
|
} else {
|
||||||
|
query = repository.find(
|
||||||
|
"id " + idf + " ?3 AND LOWER(club.name) LIKE LOWER(?2) AND (" + FIND_NAME_REQUEST + ")",
|
||||||
|
Sort.ascending("fname", "lname"), finalSearch, club + "%", ids)
|
||||||
|
.page(Page.ofSize(limit));
|
||||||
|
}
|
||||||
|
}
|
||||||
return getPageResult(query, limit, page);
|
return getPageResult(query, limit, page);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Uni<PageResult<SimpleMembre>> search(int limit, int page, String search, int licenceRequest, String subject) {
|
||||||
|
if (search == null)
|
||||||
|
search = "";
|
||||||
|
search = "%" + search.replaceAll(" ", "% %") + "%";
|
||||||
|
|
||||||
|
String finalSearch = search;
|
||||||
|
|
||||||
|
Uni<List<LicenceModel>> baseUni;
|
||||||
|
if (licenceRequest == 0 || licenceRequest == 1)
|
||||||
|
baseUni = licenceRepository.list("saison = ?1", Utils.getSaison());
|
||||||
|
else if (licenceRequest == 2)
|
||||||
|
baseUni = licenceRepository.list("saison = ?1 AND validate = FALSE", Utils.getSaison());
|
||||||
|
else if (licenceRequest == 5)
|
||||||
|
baseUni = licenceRepository.list("saison = ?1 AND validate = FALSE AND LENGTH(certificate) >= 3", Utils.getSaison());
|
||||||
|
else if (licenceRequest == 6)
|
||||||
|
baseUni = licenceRepository.list("saison = ?1 AND validate = FALSE AND LENGTH(certificate) <= 2", Utils.getSaison());
|
||||||
|
else if (licenceRequest == 3)
|
||||||
|
baseUni = licenceRepository.list("saison = ?1 AND validate = TRUE", Utils.getSaison());
|
||||||
|
else
|
||||||
|
baseUni = Uni.createFrom().item(new ArrayList<>());
|
||||||
|
|
||||||
|
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<MembreModel> query = repository.find(
|
||||||
|
"id " + idf + " ?3 AND club = ?2 AND (" + FIND_NAME_REQUEST + ")",
|
||||||
|
Sort.ascending("fname", "lname"), finalSearch, membreModel.getClub(), ids)
|
||||||
|
.page(Page.ofSize(limit));
|
||||||
|
return getPageResult(query, limit, page);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
private Uni<PageResult<SimpleMembre>> getPageResult(PanacheQuery<MembreModel> query, int limit, int page) {
|
private Uni<PageResult<SimpleMembre>> getPageResult(PanacheQuery<MembreModel> query, int limit, int page) {
|
||||||
return Uni.createFrom().item(new PageResult<SimpleMembre>())
|
return Uni.createFrom().item(new PageResult<SimpleMembre>())
|
||||||
.invoke(result -> result.setPage(page))
|
.invoke(result -> result.setPage(page))
|
||||||
|
|||||||
@ -57,12 +57,13 @@ public class MembreAdminEndpoints {
|
|||||||
@Parameter(description = "Nombre max de résulta (max 50)") @QueryParam("limit") Integer limit,
|
@Parameter(description = "Nombre max de résulta (max 50)") @QueryParam("limit") Integer limit,
|
||||||
@Parameter(description = "Page à consulter") @QueryParam("page") Integer page,
|
@Parameter(description = "Page à consulter") @QueryParam("page") Integer page,
|
||||||
@Parameter(description = "Text à rechercher") @QueryParam("search") String search,
|
@Parameter(description = "Text à rechercher") @QueryParam("search") String search,
|
||||||
@Parameter(description = "Club à filter") @QueryParam("club") String club) {
|
@Parameter(description = "Club à filter") @QueryParam("club") String club,
|
||||||
|
@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) {
|
||||||
if (limit == null)
|
if (limit == null)
|
||||||
limit = 50;
|
limit = 50;
|
||||||
if (page == null || page < 1)
|
if (page == null || page < 1)
|
||||||
page = 1;
|
page = 1;
|
||||||
return membreService.searchAdmin(limit, page - 1, search, club);
|
return membreService.searchAdmin(limit, page - 1, search, club, licenceRequest);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GET
|
@GET
|
||||||
|
|||||||
@ -49,12 +49,13 @@ public class MembreClubEndpoints {
|
|||||||
public Uni<PageResult<SimpleMembre>> getFindClub(
|
public Uni<PageResult<SimpleMembre>> getFindClub(
|
||||||
@Parameter(description = "Nombre max de résulta (max 50)") @QueryParam("limit") Integer limit,
|
@Parameter(description = "Nombre max de résulta (max 50)") @QueryParam("limit") Integer limit,
|
||||||
@Parameter(description = "Page à consulter") @QueryParam("page") Integer page,
|
@Parameter(description = "Page à consulter") @QueryParam("page") Integer page,
|
||||||
@Parameter(description = "Text à rechercher") @QueryParam("search") String search) {
|
@Parameter(description = "Text à rechercher") @QueryParam("search") String search,
|
||||||
|
@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) {
|
||||||
if (limit == null)
|
if (limit == null)
|
||||||
limit = 50;
|
limit = 50;
|
||||||
if (page == null || page < 1)
|
if (page == null || page < 1)
|
||||||
page = 1;
|
page = 1;
|
||||||
return membreService.search(limit, page - 1, search, securityCtx.getSubject());
|
return membreService.search(limit, page - 1, search, licenceRequest, securityCtx.getSubject());
|
||||||
}
|
}
|
||||||
|
|
||||||
@GET
|
@GET
|
||||||
|
|||||||
@ -21,15 +21,16 @@ export function MemberList({source}) {
|
|||||||
const [licenceData, setLicenceData] = useState([]);
|
const [licenceData, setLicenceData] = useState([]);
|
||||||
const [showLicenceState, setShowLicenceState] = useState(false);
|
const [showLicenceState, setShowLicenceState] = useState(false);
|
||||||
const [clubFilter, setClubFilter] = useState("");
|
const [clubFilter, setClubFilter] = useState("");
|
||||||
|
const [stateFilter, setStateFilter] = useState(4)
|
||||||
const [lastSearch, setLastSearch] = useState("");
|
const [lastSearch, setLastSearch] = useState("");
|
||||||
|
|
||||||
const setLoading = useLoadingSwitcher()
|
const setLoading = useLoadingSwitcher()
|
||||||
const {data, error, refresh} = useFetch(`/member/find/${source}?page=${page}`, setLoading, 1)
|
const {data, error, refresh} = useFetch(`/member/find/${source}?page=${page}&licenceRequest=${stateFilter}`, setLoading, 1)
|
||||||
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
refresh(`/member/find/${source}?page=${page}&search=${lastSearch}&club=${clubFilter}`);
|
refresh(`/member/find/${source}?page=${page}&search=${lastSearch}&club=${clubFilter}&licenceRequest=${stateFilter}`);
|
||||||
}, [hash, clubFilter]);
|
}, [hash, clubFilter, stateFilter]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!data)
|
if (!data)
|
||||||
@ -73,7 +74,7 @@ export function MemberList({source}) {
|
|||||||
if (search === lastSearch)
|
if (search === lastSearch)
|
||||||
return;
|
return;
|
||||||
setLastSearch(search);
|
setLastSearch(search);
|
||||||
refresh(`/member/find/${source}?page=${page}&search=${search}&club=${clubFilter}`);
|
refresh(`/member/find/${source}?page=${page}&search=${search}&club=${clubFilter}&licenceRequest=${stateFilter}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
return <>
|
return <>
|
||||||
@ -92,12 +93,16 @@ export function MemberList({source}) {
|
|||||||
<div className="col-lg-3">
|
<div className="col-lg-3">
|
||||||
<div className="mb-4">
|
<div className="mb-4">
|
||||||
<button className="btn btn-primary" onClick={() => navigate("new")}>Ajouter un membre</button>
|
<button className="btn btn-primary" onClick={() => navigate("new")}>Ajouter un membre</button>
|
||||||
|
{source === "admin" &&
|
||||||
|
<button className="btn btn-primary" onClick={() => navigate("validate")} style={{marginTop: "0.5rem"}}>Valider des
|
||||||
|
licences</button>}
|
||||||
</div>
|
</div>
|
||||||
<div className="card mb-4">
|
<div className="card mb-4">
|
||||||
<div className="card-header">Filtre</div>
|
<div className="card-header">Filtre</div>
|
||||||
<div className="card-body">
|
<div className="card-body">
|
||||||
<FiltreBar showLicenceState={showLicenceState} setShowLicenceState={setShowLicenceState} data={data}
|
<FiltreBar showLicenceState={showLicenceState} setShowLicenceState={setShowLicenceState} data={data}
|
||||||
clubFilter={clubFilter} setClubFilter={setClubFilter} source={source}/>
|
clubFilter={clubFilter} setClubFilter={setClubFilter} source={source}
|
||||||
|
stateFilter={stateFilter} setStateFilter={setStateFilter}/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -381,7 +386,7 @@ function MakeRow({member, showLicenceState, navigate, source}) {
|
|||||||
|
|
||||||
let allClub = []
|
let allClub = []
|
||||||
|
|
||||||
function FiltreBar({showLicenceState, setShowLicenceState, data, clubFilter, setClubFilter, source}) {
|
function FiltreBar({showLicenceState, setShowLicenceState, data, clubFilter, setClubFilter, source, stateFilter, setStateFilter}) {
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!data)
|
if (!data)
|
||||||
return;
|
return;
|
||||||
@ -394,6 +399,17 @@ function FiltreBar({showLicenceState, setShowLicenceState, data, clubFilter, set
|
|||||||
<Checkbox value={showLicenceState} onChange={setShowLicenceState} label="Afficher l'état des licences"/>
|
<Checkbox value={showLicenceState} onChange={setShowLicenceState} label="Afficher l'état des licences"/>
|
||||||
</div>
|
</div>
|
||||||
{source !== "club" && <ClubSelectFilter clubFilter={clubFilter} setClubFilter={setClubFilter}/>}
|
{source !== "club" && <ClubSelectFilter clubFilter={clubFilter} setClubFilter={setClubFilter}/>}
|
||||||
|
<div className="mb-3">
|
||||||
|
<select className="form-select" value={stateFilter} onChange={event => setStateFilter(Number(event.target.value))}>
|
||||||
|
<option value={4}>Tout les états de licences</option>
|
||||||
|
<option value={0}>Sans demande ni licence validée</option>
|
||||||
|
<option value={1}>Avec demande ou licence validée</option>
|
||||||
|
<option value={2}>Demande en cours</option>
|
||||||
|
<option value={5}>Demande complet</option>
|
||||||
|
<option value={6}>Demande incomplet</option>
|
||||||
|
<option value={3}>Licence validée</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user