From 00701fb874f94e5fc76f50a878f569a8c8d7019c Mon Sep 17 00:00:00 2001 From: Thibaut Valentin Date: Sun, 30 Nov 2025 19:16:32 +0100 Subject: [PATCH] feat: cm admin comb selector --- .../titionfire/ffsaf/ws/recv/RRegister.java | 3 ++- .../titionfire/ffsaf/ws/send/SRegister.java | 2 +- .../competition/CompetitionRegisterAdmin.jsx | 6 ++--- .../editor/CategoryAdminContent.jsx | 27 ++++++++++++++++++- .../editor/SelectCombModalContent.jsx | 20 +++++++++++++- 5 files changed, 51 insertions(+), 7 deletions(-) diff --git a/src/main/java/fr/titionfire/ffsaf/ws/recv/RRegister.java b/src/main/java/fr/titionfire/ffsaf/ws/recv/RRegister.java index ade05eb..b5189ca 100644 --- a/src/main/java/fr/titionfire/ffsaf/ws/recv/RRegister.java +++ b/src/main/java/fr/titionfire/ffsaf/ws/recv/RRegister.java @@ -12,6 +12,7 @@ import jakarta.inject.Inject; import org.hibernate.reactive.mutiny.Mutiny; import java.util.ArrayList; +import java.util.List; @WithSession @ApplicationScoped @@ -22,7 +23,7 @@ public class RRegister { CompetitionRepository competitionRepository; @WSReceiver(code = "getRegister", permission = PermLevel.ADMIN) - public Uni getRegister(WebSocketConnection connection, Object o) { + public Uni> getRegister(WebSocketConnection connection, Object o) { return competitionRepository.find("uuid", connection.pathParam("uuid")).firstResult() .call(cm -> Mutiny.fetch(cm.getInsc())) .call(cm -> Mutiny.fetch(cm.getGuests())) diff --git a/src/main/java/fr/titionfire/ffsaf/ws/send/SRegister.java b/src/main/java/fr/titionfire/ffsaf/ws/send/SRegister.java index 0aa6031..4815298 100644 --- a/src/main/java/fr/titionfire/ffsaf/ws/send/SRegister.java +++ b/src/main/java/fr/titionfire/ffsaf/ws/send/SRegister.java @@ -34,7 +34,7 @@ public class SRegister { } public Uni sendRegisterRemove(String uuid, Long combId) { - return send(uuid, "sendRegister", combId); + return send(uuid, "sendRegisterRemove", combId); } public Uni send(String uuid, String code, Object data) { diff --git a/src/main/webapp/src/pages/competition/CompetitionRegisterAdmin.jsx b/src/main/webapp/src/pages/competition/CompetitionRegisterAdmin.jsx index a2a591a..9227e72 100644 --- a/src/main/webapp/src/pages/competition/CompetitionRegisterAdmin.jsx +++ b/src/main/webapp/src/pages/competition/CompetitionRegisterAdmin.jsx @@ -290,7 +290,7 @@ function Modal({sendRegister, modalState, setModalState, source}) { const [cat, setCat] = useState(0) const [gcat, setGCat] = useState("") const [club, setClub] = useState("") - const [country_, setCountry_] = useState("fr") + const [country_, setCountry_] = useState("FR") const [genre, setGenre] = useState("NA") const [editMode, setEditMode] = useState(false) const [lockEdit, setLockEdit] = useState(false) @@ -307,7 +307,7 @@ function Modal({sendRegister, modalState, setModalState, source}) { setLockEdit(false) setClub("") setGCat("") - setCountry_("fr") + setCountry_("FR") setGenre("NA") } else { setLicence(modalState.licence ? modalState.licence : "") @@ -319,7 +319,7 @@ function Modal({sendRegister, modalState, setModalState, source}) { setLockEdit(modalState.lockEdit) setClub(modalState.club ? modalState.club.name : "") setGCat(modalState.categorie ? modalState.categorie : "") - setCountry_(modalState.country ? modalState.country : "fr") + setCountry_(modalState.country ? modalState.country : "FR") setGenre(modalState.genre ? modalState.genre : "NA") } }, [modalState]); diff --git a/src/main/webapp/src/pages/competition/editor/CategoryAdminContent.jsx b/src/main/webapp/src/pages/competition/editor/CategoryAdminContent.jsx index ae91ea9..fe30a92 100644 --- a/src/main/webapp/src/pages/competition/editor/CategoryAdminContent.jsx +++ b/src/main/webapp/src/pages/competition/editor/CategoryAdminContent.jsx @@ -104,8 +104,33 @@ export function CategoryContent({cat, catId, setCat}) { } function AddComb({groups, setGroups}) { - const {data} = useRequestWS("getRegister", null) + const {data, setData} = useRequestWS("getRegister", null) const combDispatch = useCombsDispatch(); + const {dispatch} = useWS(); + + useEffect(() => { + const sendRegister = ({data}) => { + setData(prev => { + if (prev === null) + return [data]; + return [...prev.filter(d => d.id !== data.id), data]; + }) + } + const sendRegisterRemove = ({data}) => { + setData(prev => { + if (prev === null) + return null; + return [...prev.filter(d => d.id !== data)]; + }) + } + + dispatch({type: 'addListener', payload: {callback: sendRegister, code: 'sendRegister'}}) + dispatch({type: 'addListener', payload: {callback: sendRegisterRemove, code: 'sendRegisterRemove'}}) + return () => { + dispatch({type: 'removeListener', payload: {callback: sendRegister, code: 'sendRegister'}}) + dispatch({type: 'removeListener', payload: {callback: sendRegisterRemove, code: 'sendRegisterRemove'}}) + } + }, []); useEffect(() => { if (data === null) diff --git a/src/main/webapp/src/pages/competition/editor/SelectCombModalContent.jsx b/src/main/webapp/src/pages/competition/editor/SelectCombModalContent.jsx index 91746e7..b9f7738 100644 --- a/src/main/webapp/src/pages/competition/editor/SelectCombModalContent.jsx +++ b/src/main/webapp/src/pages/competition/editor/SelectCombModalContent.jsx @@ -2,6 +2,7 @@ import {useCountries} from "../../../hooks/useCountries.jsx"; import {useEffect, useReducer, useState} from "react"; import {CatList, getCatName} from "../../../utils/Tools.js"; import {CombName} from "../../../hooks/useComb.jsx"; +import {useWS} from "../../../hooks/useWS.jsx"; function SelectReducer(state, action) { switch (action.type) { @@ -40,6 +41,10 @@ function SelectReducer(state, action) { } }); return filteredState2; + case 'REMOVE_ID': + const newState2 = {...state}; + delete newState2[action.payload]; + return newState2; case 'REMOVE_ALL': return {}; default: @@ -49,6 +54,7 @@ function SelectReducer(state, action) { export function SelectCombModalContent({data, setGroups}) { const country = useCountries('fr') + const {dispatch} = useWS() const [dispo, dispoReducer] = useReducer(SelectReducer, {}) const [select, selectReducer] = useReducer(SelectReducer, {}) @@ -74,7 +80,19 @@ export function SelectCombModalContent({data, setGroups}) { dispoReducer({type: 'ADD_ALL', payload: data.map(d => d.id)}) } - useEffect(() => { // TODO: add ws listener + + useEffect(() => { + const sendRegisterRemove = ({data}) => { + dispoReducer({type: 'REMOVE_ID', payload: data}) + selectReducer({type: 'REMOVE_ID', payload: data}) + } + dispatch({type: 'addListener', payload: {callback: sendRegisterRemove, code: 'sendRegisterRemove'}}) + return () => { + dispatch({type: 'removeListener', payload: {callback: sendRegisterRemove, code: 'sendRegisterRemove'}}) + } + }, []); + + useEffect(() => { if (data == null) return const selectedIds = Object.keys(select).map(g => Number(g))