feat: membre required field light

This commit is contained in:
Thibaut Valentin 2024-07-17 11:46:13 +02:00
parent f84ad91dc8
commit 5ba4ee1f90
6 changed files with 53 additions and 26 deletions

View File

@ -57,7 +57,8 @@ public class MembreService {
}
public SimpleCombModel findByIdOptionalComb(long id) throws Throwable {
return VertxContextSupport.subscribeAndAwait(() -> Panache.withTransaction(() -> repository.findById(id).map(SimpleCombModel::fromModel)));
return VertxContextSupport.subscribeAndAwait(
() -> Panache.withTransaction(() -> repository.findById(id).map(SimpleCombModel::fromModel)));
}
public Uni<PageResult<SimpleMembre>> searchAdmin(int limit, int page, String search, String club) {
@ -84,7 +85,8 @@ public class MembreService {
return repository.find("userId = ?1", subject).firstResult()
.chain(membreModel -> {
PanacheQuery<MembreModel> query = repository.find("club = ?1 AND (lname LIKE ?2 OR fname LIKE ?2)",
Sort.ascending("fname", "lname"), membreModel.getClub(), finalSearch).page(Page.ofSize(limit));
Sort.ascending("fname", "lname"), membreModel.getClub(), finalSearch)
.page(Page.ofSize(limit));
return getPageResult(query, limit, page);
});
}
@ -114,7 +116,8 @@ public class MembreService {
public Uni<String> update(long id, FullMemberForm membre) {
return repository.findById(id)
.chain(membreModel -> clubRepository.findById(membre.getClub()).map(club -> new Pair<>(membreModel, club)))
.chain(membreModel -> clubRepository.findById(membre.getClub())
.map(club -> new Pair<>(membreModel, club)))
.onItem().transformToUni(pair -> {
MembreModel m = pair.getKey();
m.setFname(membre.getFname());
@ -129,14 +132,19 @@ public class MembreService {
m.setEmail(membre.getEmail());
return Panache.withTransaction(() -> repository.persist(m));
})
.invoke(membreModel -> SReqComb.sendIfNeed(serverCustom.clients, SimpleCombModel.fromModel(membreModel)))
.invoke(membreModel -> SReqComb.sendIfNeed(serverCustom.clients,
SimpleCombModel.fromModel(membreModel)))
.call(membreModel -> (membreModel.getUserId() != null) ?
keycloakService.setClubGroupMembre(membreModel, membreModel.getClub()) : Uni.createFrom().nullItem())
((membreModel.getClub() != null) ?
keycloakService.setClubGroupMembre(membreModel, membreModel.getClub()) :
keycloakService.clearUser(membreModel.getUserId()))
: Uni.createFrom().nullItem())
.call(membreModel -> (membreModel.getUserId() != null) ?
keycloakService.setAutoRoleMembre(membreModel.getUserId(), membreModel.getRole(),
membreModel.getGrade_arbitrage()) : Uni.createFrom().nullItem())
.call(membreModel -> (membreModel.getUserId() != null) ?
keycloakService.setEmail(membreModel.getUserId(), membreModel.getEmail()) : Uni.createFrom().nullItem())
keycloakService.setEmail(membreModel.getUserId(), membreModel.getEmail()) : Uni.createFrom()
.nullItem())
.map(__ -> "OK");
}
@ -166,12 +174,14 @@ public class MembreService {
target.setRole(membre.getRole());
return Panache.withTransaction(() -> repository.persist(target));
})
.invoke(membreModel -> SReqComb.sendIfNeed(serverCustom.clients, SimpleCombModel.fromModel(membreModel)))
.invoke(membreModel -> SReqComb.sendIfNeed(serverCustom.clients,
SimpleCombModel.fromModel(membreModel)))
.call(membreModel -> (membreModel.getUserId() != null) ?
keycloakService.setAutoRoleMembre(membreModel.getUserId(), membreModel.getRole(),
membreModel.getGrade_arbitrage()) : Uni.createFrom().nullItem())
.call(membreModel -> (membreModel.getUserId() != null) ?
keycloakService.setEmail(membreModel.getUserId(), membreModel.getEmail()) : Uni.createFrom().nullItem())
keycloakService.setEmail(membreModel.getUserId(), membreModel.getEmail()) : Uni.createFrom()
.nullItem())
.map(__ -> "OK");
}
@ -181,7 +191,8 @@ public class MembreService {
MembreModel model = getMembreModel(input, clubModel);
return Panache.withTransaction(() -> repository.persist(model));
})
.invoke(membreModel -> SReqComb.sendIfNeedAdd(serverCustom.clients, SimpleCombModel.fromModel(membreModel)))
.invoke(membreModel -> SReqComb.sendIfNeedAdd(serverCustom.clients,
SimpleCombModel.fromModel(membreModel)))
.map(MembreModel::getId);
}
@ -193,7 +204,8 @@ public class MembreService {
model.setGrade_arbitrage(GradeArbitrage.NA);
return Panache.withTransaction(() -> repository.persist(model));
})
.invoke(membreModel -> SReqComb.sendIfNeedAdd(serverCustom.clients, SimpleCombModel.fromModel(membreModel)))
.invoke(membreModel -> SReqComb.sendIfNeedAdd(serverCustom.clients,
SimpleCombModel.fromModel(membreModel)))
.map(MembreModel::getId);
}

View File

@ -38,7 +38,7 @@ public class FullMemberForm {
private String country;
@FormParam("birth_date")
private Date birth_date;
private Date birth_date = null;
@FormParam("email")
private String email;

View File

@ -2,15 +2,15 @@ import {LoadingProvider, useLoadingSwitcher} from "../hooks/useLoading.jsx";
import {useFetch} from "../hooks/useFetch.js";
import {AxiosError} from "./AxiosError.jsx";
export function ClubSelect({defaultValue, name}) {
export function ClubSelect({defaultValue, name, na = false}) {
return <LoadingProvider>
<div className="input-group mb-3">
<ClubSelect_ defaultValue={defaultValue} name={name}/>
<ClubSelect_ defaultValue={defaultValue} name={name} na={na}/>
</div>
</LoadingProvider>
}
function ClubSelect_({defaultValue, name}) {
function ClubSelect_({defaultValue, name, na}) {
const setLoading = useLoadingSwitcher()
const {data, error} = useFetch(`/club/no_detail`, setLoading, 1)
@ -19,8 +19,9 @@ function ClubSelect_({defaultValue, name}) {
? <div className="input-group mb-3">
<label className="input-group-text" id="inputGroupSelect02">Club</label>
<select className="form-select" id="inputGroupSelect02"
defaultValue={defaultValue} name={name}>
defaultValue={defaultValue? defaultValue : -1} name={name}>
<option>Sélectionner...</option>
{na && <option value={-1}>-- Non licencier --</option>}
{data.map(club => (<option key={club.id} value={club.id}>{club.name}</option>))}
</select>
</div>

View File

@ -1,7 +1,7 @@
import {useEffect, useState} from "react";
import {getCategoryFormBirthDate} from "../utils/Tools.js";
export function BirthDayField({inti_date, inti_category}) {
export function BirthDayField({inti_date, inti_category, required = true}) {
const [date, setDate] = useState(inti_date)
const [category, setCategory] = useState(inti_category)
const [canUpdate, setCanUpdate] = useState(false)
@ -15,19 +15,18 @@ export function BirthDayField({inti_date, inti_category}) {
setCategory(getCategoryFormBirthDate(new Date(date), new Date('2023-09-01')))
}
return <>
<div className="input-group mb-3">
<span className="input-group-text" id="birth_date">Date de naissance</span>
<input type="date" className="form-control" placeholder="jj/mm/aaaa" aria-label="birth_date"
name="birth_date" aria-describedby="birth_date" defaultValue={date} required
name="birth_date" aria-describedby="birth_date" defaultValue={date} required={required}
onChange={(e) => setDate(e.target.value)}/>
</div>
<div className="row">
<div className="input-group mb-3">
<span className="input-group-text" id="category">Catégorie</span>
<input type="text" className="form-control" placeholder="" name="category"
aria-label="category" value={category} aria-describedby="category"
aria-label="category" value={category? category : ""} aria-describedby="category"
disabled/>
{canUpdate && <button className="btn btn-outline-secondary" type="button" id="button-addon1"
onClick={updateCat}>Mettre à jours</button>}

View File

@ -32,15 +32,30 @@ export function InformationForm({data}) {
event.preventDefault();
setLoading(1)
let error = false;
if (event.target.country?.value === "NA") {
toast.error('Veuillez sélectionner un pays valide 😕');
error = true;
}
if (event.target.club?.value === "Sélectionner...") {
toast.error('Veuillez sélectionner un club valide 😕');
error = true;
}
if (error) {
setLoading(0)
return;
}
const formData = new FormData();
formData.append("id", data.id);
formData.append("lname", event.target.lname?.value.toUpperCase());
formData.append("fname", event.target.fname?.value);
formData.append("categorie", event.target.category?.value);
formData.append("categorie", (event.target.category?.value.length === 0) ? null : event.target.category?.value);
formData.append("club", event.target.club?.value);
formData.append("genre", event.target.genre?.value);
formData.append("country", event.target.country?.value);
formData.append("birth_date", new Date(event.target.birth_date?.value).toUTCString());
formData.append("birth_date", (event.target.birth_date?.value.length === 0) ? null : new Date(event.target.birth_date?.value).toUTCString());
formData.append("email", event.target.email?.value);
formData.append("role", event.target.role?.value);
formData.append("grade_arbitrage", event.target.grade_arbitrage?.value);
@ -71,14 +86,14 @@ export function InformationForm({data}) {
<TextField name="lname" text="Nom" value={data.lname}/>
<TextField name="fname" text="Prénom" value={data.fname}/>
<TextField name="email" text="Email" value={data.email} placeholder="name@example.com"
type="email"/>
type="email" required={false}/>
<OptionField name="genre" text="Genre" value={data.genre}
values={{NA: 'N/A', H: 'H', F: 'F'}}/>
<CountryList name="country" text="Pays" value={data.country}/>
<BirthDayField inti_date={data.birth_date ? data.birth_date.split('T')[0] : ''}
inti_category={data.categorie}/>
inti_category={data.categorie} required={false}/>
<div className="row">
<ClubSelect defaultValue={data?.club?.id} name="club"/>
<ClubSelect defaultValue={data?.club?.id} name="club" na={true}/>
</div>
<RoleList name="role" text="Rôle" value={data.role}/>
<OptionField name="grade_arbitrage" text="Grade d'arbitrage" value={data.grade_arbitrage}

View File

@ -71,13 +71,13 @@ function Form() {
<TextField name="lname" text="Nom"/>
<TextField name="fname" text="Prénom"/>
<TextField name="email" text="Email" placeholder="name@example.com"
type="email"/>
type="email" required={false}/>
<OptionField name="genre" text="Genre" values={{NA: 'N/A', H: 'H', F: 'F'}}/>
<OptionField name="country" text="Pays" value={'fr'}
values={{NA: 'Sélectionner...', fr: 'FR', es: 'ES', be: 'BE'}}/>
<BirthDayField/>
<div className="row">
<ClubSelect name="club"/>
<ClubSelect name="club" na={true}/>
</div>
<RoleList name="role" text="Rôle" value={'MEMBRE'}/>
<OptionField name="grade_arbitrage" text="Grade d'arbitrage" value={'NA'}