Compare commits

..

No commits in common. "9954dd002cf738d643fa806fb77432a7e39eb1dc" and "b37902466c5ef741242a289d41a043d6a855fdf0" have entirely different histories.

9 changed files with 31 additions and 137 deletions

View File

@ -1,6 +1,5 @@
package fr.titionfire.ffsaf.domain.entity; package fr.titionfire.ffsaf.domain.entity;
import fr.titionfire.ffsaf.data.model.CatPresetModel;
import fr.titionfire.ffsaf.data.model.CompetitionGuestModel; import fr.titionfire.ffsaf.data.model.CompetitionGuestModel;
import fr.titionfire.ffsaf.data.model.MembreModel; import fr.titionfire.ffsaf.data.model.MembreModel;
import fr.titionfire.ffsaf.data.model.RegisterModel; import fr.titionfire.ffsaf.data.model.RegisterModel;
@ -29,7 +28,6 @@ public class CombEntity {
int overCategory; int overCategory;
Integer weight; Integer weight;
List<CombEntity> teamMembers; List<CombEntity> teamMembers;
List<Long> categoriesInscrites;
public static CombEntity fromModel(MembreModel model) { public static CombEntity fromModel(MembreModel model) {
if (model == null) if (model == null)
@ -38,7 +36,7 @@ public class CombEntity {
return new CombEntity(model.getId(), model.getLname(), model.getFname(), model.getCategorie(), return new CombEntity(model.getId(), model.getLname(), model.getFname(), model.getCategorie(),
model.getClub() == null ? null : model.getClub().getClubId(), model.getClub() == null ? null : model.getClub().getClubId(),
model.getClub() == null ? "Sans club" : model.getClub().getName(), model.getGenre(), model.getCountry(), model.getClub() == null ? "Sans club" : model.getClub().getName(), model.getGenre(), model.getCountry(),
0, null, new ArrayList<>(), new ArrayList<>()); 0, null, new ArrayList<>());
} }
@ -49,15 +47,7 @@ public class CombEntity {
return new CombEntity(model.getId() * -1, model.getLname(), model.getFname(), model.getCategorie(), null, return new CombEntity(model.getId() * -1, model.getLname(), model.getFname(), model.getCategorie(), null,
model.getClub(), model.getGenre(), model.getCountry(), 0, model.getWeight(), model.getClub(), model.getGenre(), model.getCountry(), 0, model.getWeight(),
Stream.concat(model.getComb().stream().map(CombEntity::fromModel), Stream.concat(model.getComb().stream().map(CombEntity::fromModel),
model.getGuest().stream().map(CombEntity::fromModel)).toList(), model.getGuest().stream().map(CombEntity::fromModel)).toList());
new ArrayList<>());
}
public CombEntity addCategoriesInscrites(List<CatPresetModel> categoriesInscrites) {
if (categoriesInscrites == null)
return this;
this.categoriesInscrites = categoriesInscrites.stream().map(CatPresetModel::getId).toList();
return this;
} }
public static CombEntity fromModel(RegisterModel registerModel) { public static CombEntity fromModel(RegisterModel registerModel) {
@ -68,7 +58,6 @@ public class CombEntity {
return new CombEntity(model.getId(), model.getLname(), model.getFname(), registerModel.getCategorie(), return new CombEntity(model.getId(), model.getLname(), model.getFname(), registerModel.getCategorie(),
registerModel.getClub2() == null ? null : registerModel.getClub2().getClubId(), registerModel.getClub2() == null ? null : registerModel.getClub2().getClubId(),
registerModel.getClub2() == null ? "Sans club" : registerModel.getClub2().getName(), model.getGenre(), registerModel.getClub2() == null ? "Sans club" : registerModel.getClub2().getName(), model.getGenre(),
model.getCountry(), registerModel.getOverCategory(), registerModel.getWeight(), new ArrayList<>(), model.getCountry(), registerModel.getOverCategory(), registerModel.getWeight(), new ArrayList<>());
new ArrayList<>());
} }
} }

View File

@ -4,12 +4,10 @@ import fr.titionfire.ffsaf.data.model.CatPresetModel;
import io.quarkus.runtime.annotations.RegisterForReflection; import io.quarkus.runtime.annotations.RegisterForReflection;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List; import java.util.List;
@Data @Data
@NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@RegisterForReflection @RegisterForReflection
public class PresetData { public class PresetData {

View File

@ -55,9 +55,6 @@ public class RCategorie {
@Inject @Inject
CardRepository cardRepository; CardRepository cardRepository;
@Inject
CatPresetRepository catPresetRepository;
@Inject @Inject
ResultService resultService; ResultService resultService;
@ -127,21 +124,13 @@ public class RCategorie {
@WSReceiver(code = "updateCategory", permission = PermLevel.ADMIN) @WSReceiver(code = "updateCategory", permission = PermLevel.ADMIN)
public Uni<Void> updateCategory(WebSocketConnection connection, JustCategorie categorie) { public Uni<Void> updateCategory(WebSocketConnection connection, JustCategorie categorie) {
return getById(categorie.id, connection) return getById(categorie.id, connection)
.call(cat -> {
if (categorie.preset() == null) {
cat.setPreset(null);
return Uni.createFrom().item(cat);
} else {
return catPresetRepository.findById(categorie.preset().getId())
.invoke(cat::setPreset);
}
})
.chain(cat -> { .chain(cat -> {
cat.setName(categorie.name); cat.setName(categorie.name);
cat.setLiceName(categorie.liceName); cat.setLiceName(categorie.liceName);
cat.setType(categorie.type); cat.setType(categorie.type);
cat.setTreeAreClassement(categorie.treeAreClassement); cat.setTreeAreClassement(categorie.treeAreClassement);
cat.setFullClassement(categorie.fullClassement); cat.setFullClassement(categorie.fullClassement);
// cat.setPreset(cat.getPreset()); //TODO preset update
return Panache.withTransaction(() -> categoryRepository.persist(cat)); return Panache.withTransaction(() -> categoryRepository.persist(cat));
}) })
.call(cat -> { .call(cat -> {
@ -250,12 +239,6 @@ public class RCategorie {
.replaceWithVoid(); .replaceWithVoid();
} }
@WSReceiver(code = "listPreset", permission = PermLevel.VIEW)
public Uni<List<PresetData>> listPreset(WebSocketConnection connection, Object o) {
return catPresetRepository.list("competition.uuid", connection.pathParam("uuid"))
.map(presets -> presets.stream().map(PresetData::fromModel).toList());
}
@WSReceiver(code = "createClassementMatchs", permission = PermLevel.TABLE) @WSReceiver(code = "createClassementMatchs", permission = PermLevel.TABLE)
public Uni<Void> createClassementMatchs(WebSocketConnection connection, Long categoryId) { public Uni<Void> createClassementMatchs(WebSocketConnection connection, Long categoryId) {
return getById(categoryId, connection) return getById(categoryId, connection)

View File

@ -6,7 +6,6 @@ import fr.titionfire.ffsaf.ws.PermLevel;
import io.quarkus.hibernate.reactive.panache.common.WithSession; import io.quarkus.hibernate.reactive.panache.common.WithSession;
import io.quarkus.runtime.annotations.RegisterForReflection; import io.quarkus.runtime.annotations.RegisterForReflection;
import io.quarkus.websockets.next.WebSocketConnection; import io.quarkus.websockets.next.WebSocketConnection;
import io.smallrye.mutiny.Multi;
import io.smallrye.mutiny.Uni; import io.smallrye.mutiny.Uni;
import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject; import jakarta.inject.Inject;
@ -25,20 +24,14 @@ public class RRegister {
@WSReceiver(code = "getRegister", permission = PermLevel.TABLE) @WSReceiver(code = "getRegister", permission = PermLevel.TABLE)
public Uni<List<CombEntity>> getRegister(WebSocketConnection connection, Object o) { public Uni<List<CombEntity>> getRegister(WebSocketConnection connection, Object o) {
ArrayList<CombEntity> combEntities = new ArrayList<>();
return competitionRepository.find("uuid", connection.pathParam("uuid")).firstResult() return competitionRepository.find("uuid", connection.pathParam("uuid")).firstResult()
.call(cm -> Mutiny.fetch(cm.getInsc()) .call(cm -> Mutiny.fetch(cm.getInsc()))
.onItem().transformToMulti(Multi.createFrom()::iterable) .call(cm -> Mutiny.fetch(cm.getGuests()))
.call(r -> Mutiny.fetch(r.getCategoriesInscrites())) .map(cm -> {
.map(r -> CombEntity.fromModel(r).addCategoriesInscrites(r.getCategoriesInscrites())) ArrayList<CombEntity> combEntities = new ArrayList<>();
.collect().asList() combEntities.addAll(cm.getInsc().stream().map(CombEntity::fromModel).toList());
.invoke(combEntities::addAll)) combEntities.addAll(cm.getGuests().stream().map(CombEntity::fromModel).toList());
.call(cm -> Mutiny.fetch(cm.getGuests()) return combEntities;
.onItem().transformToMulti(Multi.createFrom()::iterable) });
.call(r -> Mutiny.fetch(r.getCategoriesInscrites()))
.map(r -> CombEntity.fromModel(r).addCategoriesInscrites(r.getCategoriesInscrites()))
.collect().asList()
.invoke(combEntities::addAll))
.replaceWith(combEntities);
} }
} }

View File

@ -14,7 +14,6 @@ import io.quarkus.websockets.next.UserData;
import io.smallrye.mutiny.Uni; import io.smallrye.mutiny.Uni;
import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject; import jakarta.inject.Inject;
import org.hibernate.reactive.mutiny.Mutiny;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
@ -31,20 +30,18 @@ public class SRegister {
CardService cardService; CardService cardService;
public Uni<Void> sendRegister(String uuid, RegisterModel registerModel) { public Uni<Void> sendRegister(String uuid, RegisterModel registerModel) {
return Mutiny.fetch(registerModel.getCategoriesInscrites()).chain(o -> return send(uuid, "sendRegister", CombEntity.fromModel(registerModel))
send(uuid, "sendRegister", CombEntity.fromModel(registerModel).addCategoriesInscrites(o)) .call(__ -> cardService.addTeamCartToNewComb(registerModel.getMembre().getId(),
.call(__ -> cardService.addTeamCartToNewComb(registerModel.getMembre().getId(), registerModel.getClub2().getClubId(), registerModel.getClub2().getName(),
registerModel.getClub2().getClubId(), registerModel.getClub2().getName(), registerModel.getCompetition())
registerModel.getCompetition()) .chain(cardModels -> send(uuid, "sendCards", cardModels)));
.chain(cardModels -> send(uuid, "sendCards", cardModels))));
} }
public Uni<Void> sendRegister(String uuid, CompetitionGuestModel model) { public Uni<Void> sendRegister(String uuid, CompetitionGuestModel model) {
return Mutiny.fetch(model.getCategoriesInscrites()).chain(o -> return send(uuid, "sendRegister", CombEntity.fromModel(model))
send(uuid, "sendRegister", CombEntity.fromModel(model).addCategoriesInscrites(o)) .call(__ -> cardService.addTeamCartToNewComb(model.getId() * -1,
.call(__ -> cardService.addTeamCartToNewComb(model.getId() * -1, null, model.getClub(), model.getCompetition())
null, model.getClub(), model.getCompetition()) .chain(cardModels -> send(uuid, "sendCards", cardModels)));
.chain(cardModels -> send(uuid, "sendCards", cardModels))));
} }
public Uni<Void> sendRegisterRemove(String uuid, Long combId) { public Uni<Void> sendRegisterRemove(String uuid, Long combId) {

View File

@ -1,37 +0,0 @@
import {useRequestWS} from "../../hooks/useWS.jsx";
import {AxiosError} from "../AxiosError.jsx";
import {useTranslation} from "react-i18next";
import React, {useId} from "react";
export function ListPresetSelect({disabled, value, onChange}) {
const id = useId()
const {data, error} = useRequestWS("listPreset", {}, null);
const {t} = useTranslation();
return <>
{data
? <div className="mb-3">
<label className="form-label" htmlFor={id}>{t('catégorie')}</label>
<select className="form-select" id={id} disabled={disabled}
value={value} onChange={e => onChange(Number(e.target.value))}>
<option value={-1}>{t('sélectionner...')}</option>
{data.sort((a, b) => a.name.localeCompare(b.name)).map(club => (<option key={club.id} value={club.id}>{club.name}</option>))}
</select>
</div>
: error
? <AxiosError error={error}/>
: <Def/>
}
</>
}
function Def() {
const {t} = useTranslation();
return <div className="input-group mb-3">
<label className="input-group-text" id="inputGroupSelect02">{t('catégorie')}</label>
<select className="form-select" id="inputGroupSelect02"
defaultValue={t('chargement...')}>
<option>{t('chargement...')}</option>
</select>
</div>;
}

View File

@ -19,7 +19,6 @@ import {copyStyles} from "../../../utils/copyStyles.js";
import {StateWindow} from "./StateWindow.jsx"; import {StateWindow} from "./StateWindow.jsx";
import {CombName, useCombs} from "../../../hooks/useComb.jsx"; import {CombName, useCombs} from "../../../hooks/useComb.jsx";
import {useCards, useCardsDispatch} from "../../../hooks/useCard.jsx"; import {useCards, useCardsDispatch} from "../../../hooks/useCard.jsx";
import {ListPresetSelect} from "../../../components/cm/ListPresetSelect.jsx";
const vite_url = import.meta.env.VITE_URL; const vite_url = import.meta.env.VITE_URL;
@ -611,7 +610,6 @@ function ModalContent({state, setCatId, setConfirm, confirmRef}) {
const [fullClassement, setFullClassement] = useState(false) const [fullClassement, setFullClassement] = useState(false)
const [size, setSize] = useState(4) const [size, setSize] = useState(4)
const [loserMatch, setLoserMatch] = useState(1) const [loserMatch, setLoserMatch] = useState(1)
const [preset, setPreset] = useState(-1)
const {t} = useTranslation("cm"); const {t} = useTranslation("cm");
const {sendRequest} = useWS(); const {sendRequest} = useWS();
@ -623,14 +621,8 @@ function ModalContent({state, setCatId, setConfirm, confirmRef}) {
setTournoi((state.type & 2) !== 0); setTournoi((state.type & 2) !== 0);
setClassement(state.treeAreClassement !== undefined && state.treeAreClassement !== false); setClassement(state.treeAreClassement !== undefined && state.treeAreClassement !== false);
setFullClassement(state.fullClassement !== undefined && state.fullClassement !== false); setFullClassement(state.fullClassement !== undefined && state.fullClassement !== false);
setPreset(state.preset?.id || -1);
let trees_ = [] const trees_ = state?.trees ? state.trees.filter(t => t.level > 0) : null;
for (let i = 0; i < state?.raw_trees?.length; i++) {
if (state.raw_trees.at(i).level > 0) {
trees_.push(state.trees.at(i))
}
}
if (trees_ && trees_.length >= 1) { if (trees_ && trees_.length >= 1) {
const tree = trees_[0]; const tree = trees_[0];
setSize(tree.getMaxChildrenAtDepth(tree.death() - 1) * 2); setSize(tree.getMaxChildrenAtDepth(tree.death() - 1) * 2);
@ -663,12 +655,7 @@ function ModalContent({state, setCatId, setConfirm, confirmRef}) {
return; return;
} }
let trees_ = [] const trees_ = state?.trees ? state.trees.filter(t => t.level > 0) : null;
for (let i = 0; i < state?.raw_trees?.length; i++) {
if (state.raw_trees.at(i).level > 0) {
trees_.push(state.trees.at(i))
}
}
if (state?.id) { if (state?.id) {
const applyChanges = () => { const applyChanges = () => {
const newData = { const newData = {
@ -677,8 +664,7 @@ function ModalContent({state, setCatId, setConfirm, confirmRef}) {
liceName: lice.trim(), liceName: lice.trim(),
type: nType, type: nType,
treeAreClassement: classement, treeAreClassement: classement,
fullClassement: fullClassement, fullClassement: fullClassement
preset: {id: preset !== -1 ? preset : null}
} }
let nbMatch = -1; let nbMatch = -1;
@ -749,10 +735,7 @@ function ModalContent({state, setCatId, setConfirm, confirmRef}) {
toast.promise(sendRequest('createCategory', { toast.promise(sendRequest('createCategory', {
name: name.trim(), name: name.trim(),
liceName: lice.trim(), liceName: lice.trim(),
type: nType, type: nType
treeAreClassement: classement,
fullClassement: fullClassement,
preset: {id: preset !== -1 ? preset : null}
}), getToastMessage("toast.createCategory", "cm") }), getToastMessage("toast.createCategory", "cm")
).then(id => { ).then(id => {
if (tournoi) { if (tournoi) {
@ -781,8 +764,6 @@ function ModalContent({state, setCatId, setConfirm, confirmRef}) {
onChange={e => setName(e.target.value)}/> onChange={e => setName(e.target.value)}/>
</div> </div>
<ListPresetSelect value={preset} onChange={setPreset}/>
<div className="mb-3"> <div className="mb-3">
<label htmlFor="liceInput1" className="form-label"><Trans i18nKey="nomDesZonesDeCombat" ns="cm">t <small>(séparée par des ';')</small></Trans></label> <label htmlFor="liceInput1" className="form-label"><Trans i18nKey="nomDesZonesDeCombat" ns="cm">t <small>(séparée par des ';')</small></Trans></label>
<input type="text" className="form-control" id="liceInput1" placeholder="1;2" name="zone de combat" value={lice} <input type="text" className="form-control" id="liceInput1" placeholder="1;2" name="zone de combat" value={lice}

View File

@ -169,7 +169,7 @@ export function CategoryContent({cat, catId, setCat, menuActions}) {
return <> return <>
<div className="col-md-3"> <div className="col-md-3">
<AddComb groups={groups} setGroups={setGroups} removeGroup={removeGroup} menuActions={menuActions} cat={cat}/> <AddComb groups={groups} setGroups={setGroups} removeGroup={removeGroup} menuActions={menuActions}/>
</div> </div>
<div className="col-md-9"> <div className="col-md-9">
{cat && <ListMatch cat={cat} matches={matches} groups={groups} reducer={reducer}/>} {cat && <ListMatch cat={cat} matches={matches} groups={groups} reducer={reducer}/>}
@ -177,7 +177,7 @@ export function CategoryContent({cat, catId, setCat, menuActions}) {
</> </>
} }
function AddComb({groups, setGroups, removeGroup, menuActions, cat}) { function AddComb({groups, setGroups, removeGroup, menuActions}) {
const {data, setData} = useRequestWS("getRegister", null) const {data, setData} = useRequestWS("getRegister", null)
const combDispatch = useCombsDispatch() const combDispatch = useCombsDispatch()
const {dispatch} = useWS() const {dispatch} = useWS()
@ -243,8 +243,7 @@ function AddComb({groups, setGroups, removeGroup, menuActions, cat}) {
<div className="modal fade" id="selectCombModal" tabIndex="-1" aria-labelledby="selectCombModalLabel" aria-hidden="true"> <div className="modal fade" id="selectCombModal" tabIndex="-1" aria-labelledby="selectCombModalLabel" aria-hidden="true">
<div className="modal-dialog modal-dialog-scrollable modal-lg modal-fullscreen-lg-down"> <div className="modal-dialog modal-dialog-scrollable modal-lg modal-fullscreen-lg-down">
<div className="modal-content"> <div className="modal-content">
<SelectCombModalContent data={data} setGroups={setGroups} teamMode={modalMode} groups={groups} <SelectCombModalContent data={data} setGroups={setGroups} teamMode={modalMode} groups={groups}/>
defaultPreset={cat?.preset?.id || -1}/>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,11 +1,10 @@
import {useCountries} from "../../../hooks/useCountries.jsx"; import {useCountries} from "../../../hooks/useCountries.jsx";
import React, {useEffect, useReducer, useRef, useState} from "react"; import {useEffect, useReducer, useRef, useState} from "react";
import {CatList, getCatName, getToastMessage} from "../../../utils/Tools.js"; import {CatList, getCatName, getToastMessage} from "../../../utils/Tools.js";
import {CombName} from "../../../hooks/useComb.jsx"; import {CombName} from "../../../hooks/useComb.jsx";
import {useWS} from "../../../hooks/useWS.jsx"; import {useWS} from "../../../hooks/useWS.jsx";
import {useTranslation} from "react-i18next"; import {useTranslation} from "react-i18next";
import {toast} from "react-toastify"; import {toast} from "react-toastify";
import {ListPresetSelect} from "../../../components/cm/ListPresetSelect.jsx";
function SelectReducer(state, action) { function SelectReducer(state, action) {
switch (action.type) { switch (action.type) {
@ -60,7 +59,7 @@ function SelectReducer(state, action) {
} }
} }
export function SelectCombModalContent({data, groups, setGroups, teamMode = false, defaultPreset = -1}) { export function SelectCombModalContent({data, groups, setGroups, teamMode = false}) {
const country = useCountries('fr') const country = useCountries('fr')
const {t} = useTranslation("cm"); const {t} = useTranslation("cm");
const {sendRequest, dispatch} = useWS() const {sendRequest, dispatch} = useWS()
@ -78,11 +77,6 @@ export function SelectCombModalContent({data, groups, setGroups, teamMode = fals
const [weightMax, setWeightMax] = useState(0) const [weightMax, setWeightMax] = useState(0)
const [team, setTeam] = useState(false) const [team, setTeam] = useState(false)
const [teamName, setTeamName] = useState(""); const [teamName, setTeamName] = useState("");
const [preset, setPreset] = useState(-1)
useEffect(() => {
setPreset(defaultPreset)
}, [defaultPreset])
const handleSubmit = (e) => { const handleSubmit = (e) => {
e.preventDefault(); e.preventDefault();
@ -155,8 +149,7 @@ export function SelectCombModalContent({data, groups, setGroups, teamMode = fals
&& (weightMin === 0 || comb.weight !== null && comb.weight >= weightMin) && (weightMin === 0 || comb.weight !== null && comb.weight >= weightMin)
&& (weightMax === 0 || comb.weight !== null && comb.weight <= weightMax) && (weightMax === 0 || comb.weight !== null && comb.weight <= weightMax)
&& (teamMode && (comb.teamMembers == null || comb.teamMembers.length === 0) || !teamMode && (teamMode && (comb.teamMembers == null || comb.teamMembers.length === 0) || !teamMode
&& ((comb.teamMembers == null || comb.teamMembers.length === 0) !== team)) && ((comb.teamMembers == null || comb.teamMembers.length === 0) !== team))) {
&& (preset === -1 || comb.categoriesInscrites.includes(preset))) {
dataOut[id] = dataIn[id]; dataOut[id] = dataIn[id];
} }
} }
@ -222,8 +215,6 @@ export function SelectCombModalContent({data, groups, setGroups, teamMode = fals
</select> </select>
</div> </div>
<ListPresetSelect value={preset} onChange={setPreset}/>
<div> <div>
<label htmlFor="inputState1" className="form-label">{t('club')}</label> <label htmlFor="inputState1" className="form-label">{t('club')}</label>
<select id="inputState1" className="form-select" value={club} onChange={(e) => setClub(e.target.value)}> <select id="inputState1" className="form-select" value={club} onChange={(e) => setClub(e.target.value)}>