dev #124

Merged
Thibaut merged 5 commits from dev into master 2026-08-06 14:17:49 +00:00
4 changed files with 26 additions and 40 deletions
Showing only changes of commit a328e71035 - Show all commits

View File

@@ -107,7 +107,7 @@ public class LicenceService {
return Panache.withTransaction(() -> repository.persist(model)); return Panache.withTransaction(() -> repository.persist(model));
} }
public Uni<LicenceModel> setLicence(long id, LicenceForm form) { public Uni<LicenceModel> setLicence(long id, LicenceForm form) { // TODO add log
if (form.getId() == -1) { if (form.getId() == -1) {
return combRepository.findById(id).chain(membreModel -> { return combRepository.findById(id).chain(membreModel -> {
LicenceModel model = new LicenceModel(); LicenceModel model = new LicenceModel();

View File

@@ -184,11 +184,17 @@ public class MembreService {
String finalSearch = search; String finalSearch = search;
return getLicenceListe(licenceRequest, payState) return getLicenceListe(licenceRequest, payState)
.map(l -> l.stream().map(l2 -> l2.getMembre().getId()).toList()) .chain(l -> {
.chain(ids -> {
PanacheQuery<MembreModel> query; PanacheQuery<MembreModel> query;
query = repository.find(queryStr, sort, finalSearch, ids, club).page(Page.ofSize(limit)); query = repository.find(queryStr, sort, finalSearch,
return getPageResult(query, limit, page); l.stream().map(l2 -> l2.getMembre().getId()).toList(), club).page(Page.ofSize(limit));
return getPageResult(query, limit, page)
.call(r -> (r.getResult().isEmpty() || !l.isEmpty() ?
Uni.createFrom().item(l) :
licenceRepository.list("saison = ?1 AND membre.id IN ?2", Utils.getSaison(),
r.getResult().stream().map(SimpleMembre::getId).toList()))
.invoke(l2 -> r.setAdditionalData(l2.stream().map(SimpleLicence::fromModel)))
);
}); });
} }

View File

@@ -10,13 +10,14 @@ import java.util.List;
@Data @Data
@RegisterForReflection @RegisterForReflection
public class PageResult<T> { public class PageResult<T> {
@Schema(description = "Le numéro de la page courante.", example = "1") @Schema(description = "Le numéro de la page courante.", examples = "1")
private int page; private int page;
@Schema(description = "Le nombre d'éléments par page.", example = "10") @Schema(description = "Le nombre d'éléments par page.", examples = "10")
private int page_size; private int page_size;
@Schema(description = "Le nombre total de pages.", example = "5") @Schema(description = "Le nombre total de pages.", examples = "5")
private int page_count; private int page_count;
@Schema(description = "Le nombre total d'éléments.", example = "47") @Schema(description = "Le nombre total d'éléments.", examples = "47")
private long result_count; private long result_count;
private List<T> result = new ArrayList<>(); private List<T> result = new ArrayList<>();
private Object additionalData;
} }

View File

@@ -23,8 +23,6 @@ export function MemberList({source}) {
const {t} = useTranslation(); const {t} = useTranslation();
const [memberData, setMemberData] = useState([]); const [memberData, setMemberData] = useState([]);
const [licenceData, setLicenceData] = useState([]);
const [showLicenceState, setShowLicenceState] = useState((sessionStorage.getItem("showLicenceState") || "false") === "true");
const setFilter = (filter) => { const setFilter = (filter) => {
navigate("#" + encodeURI(JSON.stringify(filter))) navigate("#" + encodeURI(JSON.stringify(filter)))
@@ -72,23 +70,11 @@ export function MemberList({source}) {
club: e.club, club: e.club,
categorie: e.categorie, categorie: e.categorie,
licence_number: e.licence, licence_number: e.licence,
licence: showLicenceState ? licenceData.find(licence => licence.membre === e.id) : null licence: data.additionalData?.find(licence => licence.membre === e.id)
}) })
} }
setMemberData(data2); setMemberData(data2);
}, [data, licenceData]); }, [data]);
useEffect(() => {
sessionStorage.setItem("showLicenceState", showLicenceState);
if (!showLicenceState)
return;
toast.promise(
apiAxios.get(`/licence/current/${source}`), getToastMessage("membre.toast.licences.load"))
.then(data => {
setLicenceData(data.data);
});
}, [showLicenceState]);
const search = (search) => { const search = (search) => {
if (search === filter.search) if (search === filter.search)
@@ -102,8 +88,8 @@ export function MemberList({source}) {
<div className="col-lg-9"> <div className="col-lg-9">
<SearchBar search={search} defaultValue={filter.search}/> <SearchBar search={search} defaultValue={filter.search}/>
{data {data
? <MakeCentralPanel data={data} visibleMember={memberData} navigate={navigate} showLicenceState={showLicenceState} ? <MakeCentralPanel data={data} visibleMember={memberData} navigate={navigate} page={filter.page}
page={filter.page} setPage={e => setFilter({...filter, page: e})} source={source}/> setPage={e => setFilter({...filter, page: e})} source={source}/>
: error : error
? <AxiosError error={error}/> ? <AxiosError error={error}/>
: <Def/> : <Def/>
@@ -130,9 +116,7 @@ export function MemberList({source}) {
<div className="card mb-4"> <div className="card mb-4">
<div className="card-header">{t('filtre')}</div> <div className="card-header">{t('filtre')}</div>
<div className="card-body"> <div className="card-body">
<FiltreBar showLicenceState={showLicenceState} <FiltreBar showArchived={filter.archived}
setShowLicenceState={setShowLicenceState}
showArchived={filter.archived}
setShowArchived={e => setFilter({...filter, archived: e})} setShowArchived={e => setFilter({...filter, archived: e})}
clubFilter={filter.club} clubFilter={filter.club}
setClubFilter={e => setFilter({...filter, club: e})} setClubFilter={e => setFilter({...filter, club: e})}
@@ -354,7 +338,7 @@ function FileInput() {
); );
} }
function MakeCentralPanel({data, visibleMember, navigate, showLicenceState, page, setPage, source}) { function MakeCentralPanel({data, visibleMember, navigate, page, setPage, source}) {
const {t} = useTranslation(); const {t} = useTranslation();
const pages = [] const pages = []
@@ -374,7 +358,7 @@ function MakeCentralPanel({data, visibleMember, navigate, showLicenceState, page
})}</small> })}</small>
<div className="list-group"> <div className="list-group">
{visibleMember.map(member => ( {visibleMember.map(member => (
<MakeRow key={member.id} member={member} navigate={navigate} showLicenceState={showLicenceState} source={source}/>))} <MakeRow key={member.id} member={member} navigate={navigate} source={source}/>))}
</div> </div>
</div> </div>
<div className="mb-4"> <div className="mb-4">
@@ -391,11 +375,11 @@ function MakeCentralPanel({data, visibleMember, navigate, showLicenceState, page
</> </>
} }
function MakeRow({member, showLicenceState, navigate, source}) { function MakeRow({member, navigate, source}) {
const rowContent = <> const rowContent = <>
<div className="row" style={{padding: "0.6em 0"}}> <div className="row" style={{padding: "0.6em 0"}}>
<span className="col-auto">{(member.licence_number ? String(member.licence_number).padStart(5, '0') : "-------") + " "} <span className="col-auto">{(member.licence_number ? String(member.licence_number).padStart(5, '0') : "-------") + " "}
{(showLicenceState && member.licence != null && member.licence.pay) ? <FontAwesomeIcon icon={faEuroSign}/> : <>&nbsp;&nbsp;</>}</span> {(member.licence != null && member.licence.pay) ? <FontAwesomeIcon icon={faEuroSign}/> : <>&nbsp;&nbsp;</>}</span>
<div className="ms-2 col-auto"> <div className="ms-2 col-auto">
<div className="fw-bold">{member.fname} {member.lname}</div> <div className="fw-bold">{member.fname} {member.lname}</div>
</div> </div>
@@ -411,7 +395,7 @@ function MakeRow({member, showLicenceState, navigate, source}) {
</> </>
if (showLicenceState && member.licence != null) { if (member.licence != null) {
return <a className={"list-group-item d-flex justify-content-between align-items-start list-group-item-action list-group-item-" return <a className={"list-group-item d-flex justify-content-between align-items-start list-group-item-action list-group-item-"
+ (member.licence.validate ? "success" : (member.licence.certificate.length > 1 ? "warning" : "danger"))} + (member.licence.validate ? "success" : (member.licence.certificate.length > 1 ? "warning" : "danger"))}
style={{padding: "0 1em"}} style={{padding: "0 1em"}}
@@ -509,8 +493,6 @@ function OrderBar({onOrderChange, defaultValues = "", source}) {
} }
function FiltreBar({ function FiltreBar({
showLicenceState,
setShowLicenceState,
showArchived, showArchived,
setShowArchived, setShowArchived,
clubFilter, clubFilter,
@@ -526,9 +508,6 @@ function FiltreBar({
const {t} = useTranslation(); const {t} = useTranslation();
return <div> return <div>
<div className="mb-3">
<Checkbox value={showLicenceState} onChange={setShowLicenceState} label={t('membre.filtre.licence')}/>
</div>
<div className="mb-3"> <div className="mb-3">
<Checkbox value={showArchived} onChange={setShowArchived} name="checkbox2" label={t('membre.filtre.inactif')}/> <Checkbox value={showArchived} onChange={setShowArchived} name="checkbox2" label={t('membre.filtre.inactif')}/>
</div> </div>