Compare commits
3 Commits
d3805ea0e7
...
81f6169d41
| Author | SHA1 | Date | |
|---|---|---|---|
| 81f6169d41 | |||
| 931c5076b7 | |||
| a328e71035 |
@@ -122,7 +122,9 @@ public class LicenceService {
|
|||||||
.call(genLicenceNumberAndAccountIfNeed())
|
.call(genLicenceNumberAndAccountIfNeed())
|
||||||
: Uni.createFrom().nullItem()
|
: Uni.createFrom().nullItem()
|
||||||
))
|
))
|
||||||
.call(licenceModel -> ls.logA(LogModel.ActionType.ADD, membreModel.getObjectName(),
|
.call(licenceModel -> ls.logA(LogModel.ActionType.ADD,
|
||||||
|
"%s (valid=%b, pay=%b, %s)" .formatted(membreModel.getObjectName(), model.isValidate(),
|
||||||
|
model.isPay(), model.getCertificate()),
|
||||||
licenceModel));
|
licenceModel));
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -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)))
|
||||||
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
1886
src/main/webapp/package-lock.json
generated
1886
src/main/webapp/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -13,42 +13,42 @@
|
|||||||
"@dnd-kit/core": "^6.3.1",
|
"@dnd-kit/core": "^6.3.1",
|
||||||
"@dnd-kit/sortable": "^10.0.0",
|
"@dnd-kit/sortable": "^10.0.0",
|
||||||
"@dnd-kit/utilities": "^3.2.2",
|
"@dnd-kit/utilities": "^3.2.2",
|
||||||
"@fortawesome/fontawesome-svg-core": "^7.2.0",
|
"@fortawesome/fontawesome-svg-core": "^7.3.1",
|
||||||
"@fortawesome/free-brands-svg-icons": "^7.2.0",
|
"@fortawesome/free-brands-svg-icons": "^7.3.1",
|
||||||
"@fortawesome/free-regular-svg-icons": "^7.2.0",
|
"@fortawesome/free-regular-svg-icons": "^7.3.1",
|
||||||
"@fortawesome/free-solid-svg-icons": "^7.2.0",
|
"@fortawesome/free-solid-svg-icons": "^7.3.1",
|
||||||
"@fortawesome/react-fontawesome": "^3.2.0",
|
"@fortawesome/react-fontawesome": "^3.5.0",
|
||||||
"axios": "^1.13.6",
|
"axios": "1.18.0",
|
||||||
"browser-image-compression": "^2.0.2",
|
"browser-image-compression": "^2.0.2",
|
||||||
"i18next": "^25.8.15",
|
"i18next": "^26.3.6",
|
||||||
"i18next-browser-languagedetector": "^8.2.1",
|
"i18next-browser-languagedetector": "^8.2.1",
|
||||||
"i18next-http-backend": "^3.0.2",
|
"i18next-http-backend": "^4.0.1",
|
||||||
"jspdf": "^4.2.0",
|
"jspdf": "4.2.1",
|
||||||
"jspdf-autotable": "^5.0.7",
|
"jspdf-autotable": "^5.0.8",
|
||||||
"jszip": "^3.10.1",
|
"jszip": "^3.10.1",
|
||||||
"leaflet": "^1.9.4",
|
"leaflet": "^1.9.4",
|
||||||
"obs-websocket-js": "^5.0.7",
|
"obs-websocket-js": "^5.0.8",
|
||||||
"proj4": "^2.20.4",
|
"proj4": "^2.21.0",
|
||||||
"react": "^19.2.4",
|
"react": "^19.2.8",
|
||||||
"react-dom": "^19.2.4",
|
"react-dom": "^19.2.8",
|
||||||
"react-i18next": "^16.5.6",
|
"react-i18next": "^17.0.11",
|
||||||
"react-is": "^19.2.4",
|
"react-is": "^19.2.8",
|
||||||
"react-leaflet": "^5.0.0",
|
"react-leaflet": "^5.0.0",
|
||||||
"react-loader-spinner": "^8.0.2",
|
"react-loader-spinner": "^8.0.2",
|
||||||
"react-router-dom": "^7.13.1",
|
"react-router-dom": "^7.18.2",
|
||||||
"react-toastify": "^11.0.5",
|
"react-toastify": "^11.1.0",
|
||||||
"recharts": "^3.8.0",
|
"recharts": "^3.10.1",
|
||||||
"xlsx": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz",
|
"xlsx": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz",
|
||||||
"xlsx-js-style": "^1.2.0"
|
"xlsx-js-style": "^1.2.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/react": "^19.2.14",
|
"@types/react": "^19.2.18",
|
||||||
"@types/react-dom": "^19.2.3",
|
"@types/react-dom": "^19.2.4",
|
||||||
"@vitejs/plugin-react": "^5.1.4",
|
"@vitejs/plugin-react": "^6.0.5",
|
||||||
"eslint": "^9.7.0",
|
"eslint": "^9.39.5",
|
||||||
"eslint-plugin-react": "^7.37.5",
|
"eslint-plugin-react": "^7.37.5",
|
||||||
"eslint-plugin-react-hooks": "^7.0.1",
|
"eslint-plugin-react-hooks": "^7.1.1",
|
||||||
"eslint-plugin-react-refresh": "^0.5.2",
|
"eslint-plugin-react-refresh": "^0.5.3",
|
||||||
"vite": "^7.3.1"
|
"vite": "8.0.16"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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}/> : <> </>}</span>
|
{(member.licence != null && member.licence.pay) ? <FontAwesomeIcon icon={faEuroSign}/> : <> </>}</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>
|
||||||
|
|||||||
Reference in New Issue
Block a user