From 936392f8bd0caa442d87445111709a64c3633910 Mon Sep 17 00:00:00 2001 From: Thibaut Valentin Date: Sun, 30 Nov 2025 18:38:18 +0100 Subject: [PATCH] feat: add guest comb to competition register form --- .../domain/service/CompetitionService.java | 144 +++++++++++++----- .../ffsaf/rest/data/CompetitionData.java | 20 ++- .../ffsaf/rest/data/RegisterRequestData.java | 9 ++ .../ffsaf/rest/data/SimpleRegisterComb.java | 19 ++- .../titionfire/ffsaf/ws/send/SRegister.java | 53 +++++++ .../competition/CompetitionRegisterAdmin.jsx | 103 +++++++++++-- src/main/webapp/src/utils/Tools.js | 2 + 7 files changed, 286 insertions(+), 64 deletions(-) create mode 100644 src/main/java/fr/titionfire/ffsaf/ws/send/SRegister.java diff --git a/src/main/java/fr/titionfire/ffsaf/domain/service/CompetitionService.java b/src/main/java/fr/titionfire/ffsaf/domain/service/CompetitionService.java index 76f62f5..87e7d2a 100644 --- a/src/main/java/fr/titionfire/ffsaf/domain/service/CompetitionService.java +++ b/src/main/java/fr/titionfire/ffsaf/domain/service/CompetitionService.java @@ -1,9 +1,6 @@ package fr.titionfire.ffsaf.domain.service; -import fr.titionfire.ffsaf.data.model.CompetitionModel; -import fr.titionfire.ffsaf.data.model.HelloAssoRegisterModel; -import fr.titionfire.ffsaf.data.model.MembreModel; -import fr.titionfire.ffsaf.data.model.RegisterModel; +import fr.titionfire.ffsaf.data.model.*; import fr.titionfire.ffsaf.data.repository.*; import fr.titionfire.ffsaf.net2.ServerCustom; import fr.titionfire.ffsaf.net2.data.SimpleCompet; @@ -16,10 +13,9 @@ import fr.titionfire.ffsaf.rest.data.SimpleCompetData; import fr.titionfire.ffsaf.rest.data.SimpleRegisterComb; import fr.titionfire.ffsaf.rest.exception.DBadRequestException; import fr.titionfire.ffsaf.rest.exception.DForbiddenException; -import fr.titionfire.ffsaf.utils.CompetitionSystem; -import fr.titionfire.ffsaf.utils.RegisterMode; -import fr.titionfire.ffsaf.utils.SecurityCtx; -import fr.titionfire.ffsaf.utils.Utils; +import fr.titionfire.ffsaf.rest.exception.DNotFoundException; +import fr.titionfire.ffsaf.utils.*; +import fr.titionfire.ffsaf.ws.send.SRegister; import io.quarkus.cache.Cache; import io.quarkus.cache.CacheName; import io.quarkus.hibernate.reactive.panache.Panache; @@ -64,6 +60,9 @@ public class CompetitionService { @Inject CombRepository combRepository; + @Inject + CompetitionGuestRepository competitionGuestRepository; + @Inject ServerCustom serverCustom; @@ -83,6 +82,9 @@ public class CompetitionService { @Inject Vertx vertx; + @Inject + SRegister sRegister; + @Inject @CacheName("safca-config") Cache cache; @@ -108,7 +110,8 @@ public class CompetitionService { } return permService.hasAdminViewPerm(securityCtx, id) .chain(competitionModel -> Mutiny.fetch(competitionModel.getInsc()) - .map(insc -> CompetitionData.fromModel(competitionModel).addInsc(insc))) + .chain(insc -> Mutiny.fetch(competitionModel.getGuests()) + .map(guest -> CompetitionData.fromModel(competitionModel).addInsc(insc, guest)))) .chain(data -> vertx.getOrCreateContext().executeBlocking(() -> { keycloakService.getUser(UUID.fromString(data.getOwner())) @@ -175,6 +178,7 @@ public class CompetitionService { model.setSystem(data.getSystem()); model.setClub(clubModel); model.setInsc(new ArrayList<>()); + model.setGuests(new ArrayList<>()); model.setUuid(UUID.randomUUID().toString()); model.setOwner(securityCtx.getSubject()); @@ -235,11 +239,18 @@ public class CompetitionService { public Uni> getRegister(SecurityCtx securityCtx, Long id, String source) { if ("admin".equals(source)) return permService.hasEditPerm(securityCtx, id) - .chain(c -> Mutiny.fetch(c.getInsc())) - .onItem().transformToMulti(Multi.createFrom()::iterable) - .onItem().call(combModel -> Mutiny.fetch(combModel.getMembre().getLicences())) - .map(combModel -> SimpleRegisterComb.fromModel(combModel, combModel.getMembre().getLicences())) - .collect().asList(); + .chain(c -> { + Uni> uni = Mutiny.fetch(c.getInsc()) + .onItem().transformToMulti(Multi.createFrom()::iterable) + .onItem().call(combModel -> Mutiny.fetch(combModel.getMembre().getLicences())) + .map(cm -> SimpleRegisterComb.fromModel(cm, cm.getMembre().getLicences())) + .collect().asList(); + return uni + .call(l -> Mutiny.fetch(c.getGuests()) + .map(guest -> guest.stream().map(SimpleRegisterComb::fromModel).toList()) + .invoke(l::addAll)); + }); + if ("club".equals(source)) return Uni.createFrom().nullItem() .invoke(Unchecked.consumer(__ -> { @@ -262,17 +273,44 @@ public class CompetitionService { public Uni addRegisterComb(SecurityCtx securityCtx, Long id, RegisterRequestData data, String source) { if ("admin".equals(source)) - return permService.hasEditPerm(securityCtx, id) - .chain(c -> findComb(data.getLicence(), data.getFname(), data.getLname()) - .call(combModel -> { - if (c.getBanMembre() == null) - c.setBanMembre(new ArrayList<>()); - c.getBanMembre().remove(combModel.getId()); - return Panache.withTransaction(() -> repository.persist(c)); - }) - .chain(combModel -> updateRegister(data, c, combModel, true))) - .chain(r -> Mutiny.fetch(r.getMembre().getLicences()) - .map(licences -> SimpleRegisterComb.fromModel(r, licences))); + if (data.getLicence() != -1) { // not a guest + return permService.hasEditPerm(securityCtx, id) + .chain(c -> findComb(data.getLicence(), data.getFname(), data.getLname()) + .call(combModel -> Mutiny.fetch(combModel.getLicences())) + .call(combModel -> { + if (c.getBanMembre() == null) + c.setBanMembre(new ArrayList<>()); + c.getBanMembre().remove(combModel.getId()); + return Panache.withTransaction(() -> repository.persist(c)); + }) + .chain(combModel -> updateRegister(data, c, combModel, true))) + .map(r -> SimpleRegisterComb.fromModel(r, r.getMembre().getLicences())); + } else { + return permService.hasEditPerm(securityCtx, id) + .chain(c -> competitionGuestRepository.findById(data.getId() * -1) + .map(g -> { + if (g != null) + return g; + CompetitionGuestModel model = new CompetitionGuestModel(); + model.setCompetition(c); + return model; + })) + .chain(model -> { + model.setFname(data.getFname()); + model.setLname(data.getLname()); + model.setGenre(data.getGenre()); + model.setClub(data.getClub()); + model.setCountry(data.getCountry()); + model.setWeight(data.getWeight()); + model.setCategorie(data.getCategorie()); + + return Panache.withTransaction(() -> competitionGuestRepository.persist(model)) + .call(r -> model.getCompetition().getSystem() == CompetitionSystem.INTERNAL ? + sRegister.sendRegister(model.getCompetition().getUuid(), + r) : Uni.createFrom().voidItem()); + }) + .map(SimpleRegisterComb::fromModel); + } if ("club".equals(source)) return repository.findById(id) .invoke(Unchecked.consumer(cm -> { @@ -283,6 +321,7 @@ public class CompetitionService { throw new DBadRequestException("Inscription fermée"); })) .chain(c -> findComb(data.getLicence(), data.getFname(), data.getLname()) + .call(combModel -> Mutiny.fetch(combModel.getLicences())) .invoke(Unchecked.consumer(model -> { if (!securityCtx.isInClubGroup(model.getClub().getId())) throw new DForbiddenException(); @@ -291,8 +330,7 @@ public class CompetitionService { "Vous n'avez pas le droit d'inscrire ce membre (par décision de l'administrateur de la compétition)"); })) .chain(combModel -> updateRegister(data, c, combModel, false))) - .chain(r -> Mutiny.fetch(r.getMembre().getLicences()) - .map(licences -> SimpleRegisterComb.fromModel(r, licences))); + .map(r -> SimpleRegisterComb.fromModel(r, r.getMembre().getLicences())); return repository.findById(id) .invoke(Unchecked.consumer(cm -> { @@ -347,15 +385,18 @@ public class CompetitionService { SReqRegister.sendIfNeed(serverCustom.clients, new CompetitionData.SimpleRegister(r.getMembre().getId(), r.getOverCategory(), r.getWeight(), r.getCategorie(), - (r.getClub() == null) ? null : r.getClub().getId()), c.getId()); + (r.getClub() == null) ? null : r.getClub().getId(), + (r.getClub() == null) ? null : r.getClub().getName()), c.getId()); } return r; })) - .chain(r -> Panache.withTransaction(() -> registerRepository.persist(r))); + .chain(r -> Panache.withTransaction(() -> registerRepository.persist(r))) + .call(r -> c.getSystem() == CompetitionSystem.INTERNAL ? + sRegister.sendRegister(c.getUuid(), r) : Uni.createFrom().voidItem()); } private Uni findComb(Long licence, String fname, String lname) { - if (licence != null && licence != 0) { + if (licence != null && licence > 0) { return combRepository.find("licence = ?1", licence).firstResult() .invoke(Unchecked.consumer(combModel -> { if (combModel == null) @@ -398,30 +439,45 @@ public class CompetitionService { if (new Date().before(cm.getStartRegister()) || new Date().after(cm.getEndRegister())) throw new DBadRequestException("Inscription fermée"); })) - .call(cm -> membreService.getByAccountId(securityCtx.getSubject()) + .call(cm -> membreService.getById(combId) .invoke(Unchecked.consumer(model -> { + if (model == null) + throw new DNotFoundException("Membre " + combId + " n'existe pas"); if (!securityCtx.isInClubGroup(model.getClub().getId())) throw new DForbiddenException(); }))) .chain(c -> deleteRegister(combId, c, false)); return repository.findById(id) - .invoke(Unchecked.consumer(cm -> { - if (cm.getRegisterMode() != RegisterMode.FREE) - throw new DForbiddenException(); - if (new Date().before(cm.getStartRegister()) || new Date().after(cm.getEndRegister())) - throw new DBadRequestException("Inscription fermée"); - })) + .call(cm -> membreService.getByAccountId(securityCtx.getSubject()) + .invoke(Unchecked.consumer(model -> { + if (cm.getRegisterMode() != RegisterMode.FREE || !Objects.equals(model.getId(), combId)) + throw new DForbiddenException(); + if (new Date().before(cm.getStartRegister()) || new Date().after(cm.getEndRegister())) + throw new DBadRequestException("Inscription fermée"); + }))) .chain(c -> deleteRegister(combId, c, false)); } private Uni deleteRegister(Long combId, CompetitionModel c, boolean admin) { + if (admin && combId < 0) { + return competitionGuestRepository.find("competition = ?1 AND id = ?2", c, combId * -1).firstResult() + .onFailure().transform(t -> new DBadRequestException("Combattant non inscrit")) + .call(Unchecked.function( + model -> Panache.withTransaction(() -> competitionGuestRepository.delete(model)) + .call(r -> c.getSystem() == CompetitionSystem.INTERNAL ? + sRegister.sendRegisterRemove(c.getUuid(), combId) : Uni.createFrom() + .voidItem()))) + .replaceWithVoid(); + } return registerRepository.find("competition = ?1 AND membre.id = ?2", c, combId).firstResult() .onFailure().transform(t -> new DBadRequestException("Combattant non inscrit")) .call(Unchecked.function(registerModel -> { if (!admin && registerModel.isLockEdit()) throw new DForbiddenException("Modification bloquée par l'administrateur de la compétition"); - return Panache.withTransaction(() -> registerRepository.delete(registerModel)); + return Panache.withTransaction(() -> registerRepository.delete(registerModel)) + .call(r -> c.getSystem() == CompetitionSystem.INTERNAL ? + sRegister.sendRegisterRemove(c.getUuid(), combId) : Uni.createFrom().voidItem()); })) .replaceWithVoid(); } @@ -528,8 +584,13 @@ public class CompetitionService { continue; uni = uni.call(__ -> Panache.withTransaction( - () -> registerRepository.delete("competition = ?1 AND membre = ?2", - reg.getCompetition(), reg.getMembre()))); + () -> registerRepository.delete("competition = ?1 AND membre = ?2", + reg.getCompetition(), reg.getMembre()))) + .call(r -> reg.getCompetition().getSystem() == CompetitionSystem.INTERNAL ? + sRegister.sendRegisterRemove(reg.getCompetition().getUuid(), + reg.getMembre().getId()) : Uni.createFrom().voidItem()).onFailure() + .recoverWithNull() + ; } return uni; @@ -541,7 +602,8 @@ public class CompetitionService { public Uni registerHelloAsso(NotificationData data) { String organizationSlug = data.getOrganizationSlug(); String formSlug = data.getFormSlug(); - RegisterRequestData req = new RegisterRequestData(null, "", "", null, 0, false); + RegisterRequestData req = new RegisterRequestData(null, "", "", null, 0, false, null, Categorie.CADET, Genre.NA, + null, "fr"); return repository.find("data1 = ?1 AND data2 = ?2", organizationSlug, formSlug).firstResult() .onFailure().recoverWithNull() diff --git a/src/main/java/fr/titionfire/ffsaf/rest/data/CompetitionData.java b/src/main/java/fr/titionfire/ffsaf/rest/data/CompetitionData.java index d6b07d1..8b33c2c 100644 --- a/src/main/java/fr/titionfire/ffsaf/rest/data/CompetitionData.java +++ b/src/main/java/fr/titionfire/ffsaf/rest/data/CompetitionData.java @@ -1,5 +1,6 @@ package fr.titionfire.ffsaf.rest.data; +import fr.titionfire.ffsaf.data.model.CompetitionGuestModel; import fr.titionfire.ffsaf.data.model.CompetitionModel; import fr.titionfire.ffsaf.data.model.RegisterModel; import fr.titionfire.ffsaf.utils.Categorie; @@ -11,6 +12,7 @@ import lombok.Data; import java.util.Date; import java.util.List; +import java.util.stream.Stream; @Data @AllArgsConstructor @@ -57,9 +59,9 @@ public class CompetitionData { model.getAdresse(), "", model.getDate(), model.getTodate(), null, model.getRegisterMode(), model.getStartRegister(), model.getEndRegister(), model.isPublicVisible(), null, model.getClub().getName(), "", null, false, - "","", "",""); + "", "", "", ""); - if (model.getRegisterMode() == RegisterMode.HELLOASSO){ + if (model.getRegisterMode() == RegisterMode.HELLOASSO) { out.setData1(model.getData1()); out.setData2(model.getData2()); } @@ -67,10 +69,15 @@ public class CompetitionData { return out; } - public CompetitionData addInsc(List insc) { - this.registers = insc.stream() - .map(i -> new SimpleRegister(i.getMembre().getId(), i.getOverCategory(), i.getWeight(), - i.getCategorie(), (i.getClub() == null) ? null : i.getClub().getId())).toList(); + public CompetitionData addInsc(List insc, List guests) { + this.registers = Stream.concat( + insc.stream() + .map(i -> new SimpleRegister(i.getMembre().getId(), i.getOverCategory(), i.getWeight(), + i.getCategorie(), (i.getClub() == null) ? null : i.getClub().getId(), + (i.getClub() == null) ? null : i.getClub().getName())), + guests.stream() + .map(i -> new SimpleRegister(i.getId() * -1, 0, i.getWeight(), + i.getCategorie(), null, i.getClub()))).toList(); return this; } @@ -83,5 +90,6 @@ public class CompetitionData { Integer weight; Categorie categorie; Long club; + String club_str; } } diff --git a/src/main/java/fr/titionfire/ffsaf/rest/data/RegisterRequestData.java b/src/main/java/fr/titionfire/ffsaf/rest/data/RegisterRequestData.java index 11fa9aa..3b482f1 100644 --- a/src/main/java/fr/titionfire/ffsaf/rest/data/RegisterRequestData.java +++ b/src/main/java/fr/titionfire/ffsaf/rest/data/RegisterRequestData.java @@ -1,5 +1,7 @@ package fr.titionfire.ffsaf.rest.data; +import fr.titionfire.ffsaf.utils.Categorie; +import fr.titionfire.ffsaf.utils.Genre; import io.quarkus.runtime.annotations.RegisterForReflection; import lombok.AllArgsConstructor; import lombok.Data; @@ -17,4 +19,11 @@ public class RegisterRequestData { private Integer weight; private int overCategory; private boolean lockEdit = false; + + // for guest registration only + private Long id = null; + private Categorie categorie = Categorie.CADET; + private Genre genre = Genre.NA; + private String club = null; + private String country = null; } diff --git a/src/main/java/fr/titionfire/ffsaf/rest/data/SimpleRegisterComb.java b/src/main/java/fr/titionfire/ffsaf/rest/data/SimpleRegisterComb.java index 1125357..148c950 100644 --- a/src/main/java/fr/titionfire/ffsaf/rest/data/SimpleRegisterComb.java +++ b/src/main/java/fr/titionfire/ffsaf/rest/data/SimpleRegisterComb.java @@ -1,9 +1,12 @@ package fr.titionfire.ffsaf.rest.data; +import fr.titionfire.ffsaf.data.model.CompetitionGuestModel; import fr.titionfire.ffsaf.data.model.LicenceModel; import fr.titionfire.ffsaf.data.model.MembreModel; import fr.titionfire.ffsaf.data.model.RegisterModel; import fr.titionfire.ffsaf.net2.data.SimpleClubModel; +import fr.titionfire.ffsaf.utils.Categorie; +import fr.titionfire.ffsaf.utils.Genre; import fr.titionfire.ffsaf.utils.Utils; import io.quarkus.runtime.annotations.RegisterForReflection; import lombok.AllArgsConstructor; @@ -18,8 +21,9 @@ public class SimpleRegisterComb { private long id; private String fname; private String lname; - private String genre; - private String categorie; + private Genre genre; + private String country; + private Categorie categorie; private SimpleClubModel club; private Integer licence; private Integer weight; @@ -30,11 +34,18 @@ public class SimpleRegisterComb { public static SimpleRegisterComb fromModel(RegisterModel register, List licences) { MembreModel membreModel = register.getMembre(); return new SimpleRegisterComb(membreModel.getId(), membreModel.getFname(), membreModel.getLname(), - membreModel.getGenre().name(), - (register.getCategorie() == null) ? "Catégorie inconnue" : register.getCategorie().getName(), + membreModel.getGenre(), membreModel.getCountry(), + (register.getCategorie() == null) ? null : register.getCategorie(), SimpleClubModel.fromModel(register.getClub()), membreModel.getLicence(), register.getWeight(), register.getOverCategory(), licences.stream().anyMatch(l -> l.isValidate() && l.getSaison() == Utils.getSaison()), register.isLockEdit()); } + + public static SimpleRegisterComb fromModel(CompetitionGuestModel guest) { + return new SimpleRegisterComb(guest.getId() * -1, guest.getFname(), guest.getLname(), + guest.getGenre(), guest.getCountry(), guest.getCategorie(), + new SimpleClubModel(null, guest.getClub(), "fr", null), + null, guest.getWeight(), 0, false, false); + } } diff --git a/src/main/java/fr/titionfire/ffsaf/ws/send/SRegister.java b/src/main/java/fr/titionfire/ffsaf/ws/send/SRegister.java new file mode 100644 index 0000000..0aa6031 --- /dev/null +++ b/src/main/java/fr/titionfire/ffsaf/ws/send/SRegister.java @@ -0,0 +1,53 @@ +package fr.titionfire.ffsaf.ws.send; + +import fr.titionfire.ffsaf.data.model.CompetitionGuestModel; +import fr.titionfire.ffsaf.data.model.RegisterModel; +import fr.titionfire.ffsaf.domain.entity.CombEntity; +import fr.titionfire.ffsaf.net2.MessageType; +import fr.titionfire.ffsaf.ws.CompetitionWS; +import fr.titionfire.ffsaf.ws.MessageOut; +import fr.titionfire.ffsaf.ws.PermLevel; +import io.quarkus.runtime.annotations.RegisterForReflection; +import io.quarkus.websockets.next.OpenConnections; +import io.quarkus.websockets.next.UserData; +import io.smallrye.mutiny.Uni; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; + +import java.util.List; +import java.util.UUID; + +@ApplicationScoped +@RegisterForReflection +public class SRegister { + + @SuppressWarnings("CdiInjectionPointsInspection") + @Inject + OpenConnections connections; + + public Uni sendRegister(String uuid, RegisterModel registerModel) { + return send(uuid, "sendRegister", CombEntity.fromModel(registerModel)); + } + + public Uni sendRegister(String uuid, CompetitionGuestModel model) { + return send(uuid, "sendRegister", CombEntity.fromModel(model)); + } + + public Uni sendRegisterRemove(String uuid, Long combId) { + return send(uuid, "sendRegister", combId); + } + + public Uni send(String uuid, String code, Object data) { + List> queue = connections.findByEndpointId(CompetitionWS.class.getCanonicalName()).stream() + .filter(c -> c.pathParam("uuid").equals(uuid) && PermLevel.valueOf( + c.userData().get(UserData.TypedKey.forString("prem"))).ordinal() >= PermLevel.ADMIN.ordinal()) + .map(c -> c.sendText( + new MessageOut(UUID.randomUUID(), code, MessageType.NOTIFY, data))) + .toList(); + + if (queue.isEmpty()) + return Uni.createFrom().voidItem(); + return Uni.join().all(queue).andCollectFailures().replaceWithVoid(); + } + +} diff --git a/src/main/webapp/src/pages/competition/CompetitionRegisterAdmin.jsx b/src/main/webapp/src/pages/competition/CompetitionRegisterAdmin.jsx index ff92de2..a2a591a 100644 --- a/src/main/webapp/src/pages/competition/CompetitionRegisterAdmin.jsx +++ b/src/main/webapp/src/pages/competition/CompetitionRegisterAdmin.jsx @@ -4,14 +4,14 @@ import {useFetch} from "../../hooks/useFetch.js"; import {AxiosError} from "../../components/AxiosError.jsx"; import {ThreeDots} from "react-loader-spinner"; import {useEffect, useReducer, useRef, useState} from "react"; -import {apiAxios, errFormater} from "../../utils/Tools.js"; +import {apiAxios, CatList, getCatName} from "../../utils/Tools.js"; import {toast} from "react-toastify"; import {SimpleReducer} from "../../utils/SimpleReducer.jsx"; import {FontAwesomeIcon} from "@fortawesome/react-fontawesome"; import {faAdd, faGavel, faTrashCan} from "@fortawesome/free-solid-svg-icons"; import "./CompetitionRegisterAdmin.css" import * as XLSX from "xlsx-js-style"; -import * as Tools from "../../utils/Tools.js"; +import {useCountries} from "../../hooks/useCountries.jsx"; export function CompetitionRegisterAdmin({source}) { const {id} = useParams() @@ -70,9 +70,14 @@ export function CompetitionRegisterAdmin({source}) { : error ? : }
+
+ +
@@ -276,15 +281,22 @@ const AutoCompleteInput = ({suggestions = [], handleAdd}) => { }; function Modal({sendRegister, modalState, setModalState, source}) { + const country = useCountries('fr') + const [licence, setLicence] = useState("") const [fname, setFname] = useState("") const [lname, setLname] = useState("") const [weight, setWeight] = useState("") const [cat, setCat] = useState(0) + const [gcat, setGCat] = useState("") + const [club, setClub] = useState("") + const [country_, setCountry_] = useState("fr") + const [genre, setGenre] = useState("NA") const [editMode, setEditMode] = useState(false) const [lockEdit, setLockEdit] = useState(false) useEffect(() => { + console.log(modalState) if (!modalState) { setLicence("") setFname("") @@ -293,6 +305,10 @@ function Modal({sendRegister, modalState, setModalState, source}) { setCat(0) setEditMode(false) setLockEdit(false) + setClub("") + setGCat("") + setCountry_("fr") + setGenre("NA") } else { setLicence(modalState.licence ? modalState.licence : "") setFname(modalState.fname ? modalState.fname : "") @@ -301,6 +317,10 @@ function Modal({sendRegister, modalState, setModalState, source}) { setCat(modalState.overCategory ? modalState.overCategory : 0) setEditMode(modalState.licence || (modalState.fname && modalState.lname)) setLockEdit(modalState.lockEdit) + setClub(modalState.club ? modalState.club.name : "") + setGCat(modalState.categorie ? modalState.categorie : "") + setCountry_(modalState.country ? modalState.country : "fr") + setGenre(modalState.genre ? modalState.genre : "NA") } }, [modalState]); @@ -311,46 +331,103 @@ function Modal({sendRegister, modalState, setModalState, source}) {
{ e.preventDefault() const new_state = { - licence: licence, fname: fname, lname: lname, weight: weight, overCategory: cat, lockEdit: lockEdit, id: modalState.id + licence: licence, + fname: fname, + lname: lname, + weight: weight, + overCategory: cat, + lockEdit: lockEdit, + id: modalState.id !== 0 ? modalState.id : null + } + if (modalState.id < 0) { + new_state.licence = -1 + new_state.categorie = gcat + new_state.club = club + new_state.country = country_ + new_state.genre = genre } setModalState(new_state) sendRegister(new_state) }}>
-

{editMode ? "Modification d'" : "Ajouter "}un combattant

+

{editMode ? "Modification d'" : "Ajouter "}un {modalState.id >= 0 ? "combattant" : "invité"}

+ {modalState.id < 0 &&
Les invités sont réservés aux membres non licenciés par la fédération. Les combattants inscrits via ce formulaire ne pourront pas voir leur résultat depuis leur profil.
}
-
Recherche*
+
{modalState.id >= 0 ? "Recherche*" : "Information"}
-
+ -
Ou
+
- = 0} value={fname} onChange={e => setFname(e.target.value)}/>
- = 0} value={lname} onChange={e => setLname(e.target.value)}/>
+ + + + + + + +
Poids (en kg) setWeight(e.target.value)}/>
-
+ - {editMode && source === "admin" &&
+ {editMode && source === "admin" &&
- {req.data.categorie + (req.data.overCategory === 0 ? "" : (" avec " + req.data.overCategory + " de surclassement"))}
+ {getCatName(req.data.categorie) + (req.data.overCategory === 0 ? "" : (" avec " + req.data.overCategory + " de surclassement"))}
{req.data.weight ? req.data.weight : "---"} kg
diff --git a/src/main/webapp/src/utils/Tools.js b/src/main/webapp/src/utils/Tools.js index 1279838..4215fcd 100644 --- a/src/main/webapp/src/utils/Tools.js +++ b/src/main/webapp/src/utils/Tools.js @@ -99,6 +99,8 @@ export function getCatName(cat) { return "Vétéran 1"; case "VETERAN2": return "Vétéran 2"; + case null: + return "Catégorie inconnue"; default: return cat; }