diff --git a/src/main/java/fr/titionfire/ffsaf/rest/ClubEndpoints.java b/src/main/java/fr/titionfire/ffsaf/rest/ClubEndpoints.java index 7b4c918..45a8199 100644 --- a/src/main/java/fr/titionfire/ffsaf/rest/ClubEndpoints.java +++ b/src/main/java/fr/titionfire/ffsaf/rest/ClubEndpoints.java @@ -5,6 +5,7 @@ import fr.titionfire.ffsaf.domain.service.ClubService; import fr.titionfire.ffsaf.net2.data.SimpleClubModel; import fr.titionfire.ffsaf.rest.data.SimpleClub; import fr.titionfire.ffsaf.rest.from.FullClubForm; +import fr.titionfire.ffsaf.utils.Contact; import fr.titionfire.ffsaf.utils.GroupeUtils; import fr.titionfire.ffsaf.utils.PageResult; import fr.titionfire.ffsaf.utils.Utils; @@ -76,7 +77,9 @@ public class ClubEndpoints { @RolesAllowed({"federation_admin", "club_president", "club_secretaire", "club_respo_intra"}) @Produces(MediaType.APPLICATION_JSON) public Uni getById(@PathParam("id") long id) { - return clubService.getById(id).onItem().invoke(checkPerm).map(SimpleClub::fromModel); + return clubService.getById(id).onItem().invoke(checkPerm).map(SimpleClub::fromModel).invoke(m -> { + m.setContactMap(Contact.toSite()); + }); } @PUT diff --git a/src/main/java/fr/titionfire/ffsaf/rest/data/SimpleClub.java b/src/main/java/fr/titionfire/ffsaf/rest/data/SimpleClub.java index 7941562..9e8d8ff 100644 --- a/src/main/java/fr/titionfire/ffsaf/rest/data/SimpleClub.java +++ b/src/main/java/fr/titionfire/ffsaf/rest/data/SimpleClub.java @@ -8,6 +8,7 @@ import lombok.Builder; import lombok.Data; import lombok.ToString; +import java.util.HashMap; import java.util.Map; @Data @@ -29,6 +30,7 @@ public class SimpleClub { private String SIRET; private String no_affiliation; private boolean international; + private HashMap contactMap = null; public static SimpleClub fromModel(ClubModel model) { if (model == null) diff --git a/src/main/java/fr/titionfire/ffsaf/utils/Contact.java b/src/main/java/fr/titionfire/ffsaf/utils/Contact.java index 884e6d6..ea49228 100644 --- a/src/main/java/fr/titionfire/ffsaf/utils/Contact.java +++ b/src/main/java/fr/titionfire/ffsaf/utils/Contact.java @@ -2,6 +2,9 @@ package fr.titionfire.ffsaf.utils; import io.quarkus.runtime.annotations.RegisterForReflection; +import javax.naming.ldap.HasControls; +import java.util.HashMap; + @RegisterForReflection public enum Contact { COURRIEL("Courriel"), @@ -20,8 +23,11 @@ public enum Contact { this.name = name; } - @Override - public String toString() { - return name; + public static HashMap toSite() { + HashMap map = new HashMap<>(); + for (Contact contact : Contact.values()) { + map.put(contact.toString(), contact.name); + } + return map; } } diff --git a/src/main/webapp/src/components/ListEditor.jsx b/src/main/webapp/src/components/ListEditor.jsx new file mode 100644 index 0000000..52edec4 --- /dev/null +++ b/src/main/webapp/src/components/ListEditor.jsx @@ -0,0 +1,83 @@ +import {useEffect, useReducer, useState} from "react"; +import {FontAwesomeIcon} from "@fortawesome/react-fontawesome"; +import {faPen, faTrashCan} from "@fortawesome/free-solid-svg-icons"; +import {AxiosError} from "./AxiosError.jsx"; + +function SimpleReducer(datas, action) { + switch (action.type) { + case 'ADD': + return [ + ...datas, + action.payload + ] + case 'REMOVE': + return datas.filter(data => data.id !== action.payload) + case 'UPDATE_OR_ADD': + const index = datas.findIndex(data => data.id === action.payload.id) + if (index === -1) { + return [ + ...datas, + action.payload + ] + } else { + datas[index] = action.payload + return [...datas] + } + default: + throw new Error() + } +} + +export function ListEditorTest() { + const [html, dispatch] = ListEditor(ListHTML) + + useEffect(() => { + dispatch({type: 'UPDATE_OR_ADD', payload: {id: 1, content: "data in"}}) + }, []); + + return html +} + +export function ListEditor(ListItem) { + const [modal, setModal] = useState({id: -1}) + const [state, dispatch] = useReducer(SimpleReducer, []) + + const sendAffiliation = (e) => { + + dispatch({type: 'UPDATE_OR_ADD', payload: e}) + } + + return [<> +
    + {state.map((d, index) => { + return
    + + + +
    + })} +
+ + +, dispatch] +} + +function ListHTML({ + data +}) { + return
{data.content}
+} \ No newline at end of file diff --git a/src/main/webapp/src/pages/admin/club/AffiliationCard.jsx b/src/main/webapp/src/pages/admin/club/AffiliationCard.jsx index e392e9c..a2b82c9 100644 --- a/src/main/webapp/src/pages/admin/club/AffiliationCard.jsx +++ b/src/main/webapp/src/pages/admin/club/AffiliationCard.jsx @@ -4,9 +4,7 @@ import {useEffect, useReducer, useState} from "react"; import {FontAwesomeIcon} from "@fortawesome/react-fontawesome"; import {faPen} from "@fortawesome/free-solid-svg-icons"; import {AxiosError} from "../../../components/AxiosError.jsx"; -import {CheckField, TextField} from "../../../components/MemberCustomFiels.jsx"; import {apiAxios, getSaison} from "../../../utils/Tools.js"; -import {Input} from "../../../components/Input.jsx"; import {toast} from "react-toastify"; function affiliationReducer(affiliation, action) { diff --git a/src/main/webapp/src/pages/admin/club/ClubPage.jsx b/src/main/webapp/src/pages/admin/club/ClubPage.jsx index 0269304..53a79dd 100644 --- a/src/main/webapp/src/pages/admin/club/ClubPage.jsx +++ b/src/main/webapp/src/pages/admin/club/ClubPage.jsx @@ -9,9 +9,38 @@ import {AffiliationCard} from "./AffiliationCard.jsx"; import {CheckField, CountryList, TextField} from "../../../components/MemberCustomFiels.jsx"; import {MapContainer, Marker, Popup, TileLayer, useMap} from 'react-leaflet' +import {ListEditorTest} from "../../../components/ListEditor.jsx"; +import {useEffect, useReducer, useState} from "react"; +import {FontAwesomeIcon} from "@fortawesome/react-fontawesome"; +import {faPen, faTrashCan} from "@fortawesome/free-solid-svg-icons"; const vite_url = import.meta.env.VITE_URL; +function SimpleReducer(datas, action) { + switch (action.type) { + case 'ADD': + return [ + ...datas, + action.payload + ] + case 'REMOVE': + return datas.filter(data => data.id !== action.payload) + case 'UPDATE_OR_ADD': + const index = datas.findIndex(data => data.id === action.payload.id) + if (index === -1) { + return [ + ...datas, + action.payload + ] + } else { + datas[index] = action.payload + return [...datas] + } + default: + throw new Error() + } +} + export function ClubPage() { const {id} = useParams() const navigate = useNavigate(); @@ -41,15 +70,19 @@ export function ClubPage() { ?
- + + +
-
-
@@ -83,18 +116,150 @@ function InformationForm({data}) {
Laissez vide pour ne rien changer.
- + + + + ; } - // https://annuaire-entreprises.data.gouv.fr/entreprise/la-mesnie-des-chevaliers-de-st-georges-et-de-st-michel-500213731 + +export function LocationEditor({data}) { + const [modal, setModal] = useState({id: -1}) + const [state, dispatch] = useReducer(SimpleReducer, []) + + useEffect(() => { + JSON.parse(data.training_location).forEach((d, index) => { + dispatch({type: 'UPDATE_OR_ADD', payload: {id: index, data: d}}) + }) + }, [data.training_location]); + + const sendAffiliation = (e) => { + + dispatch({type: 'UPDATE_OR_ADD', payload: e}) + } + + return <> +
    + {state.map((d, index) => { + return
    +
    {d.data.text}
    + + +
    + })} +
+ + +} + +function Autoc() { + const [location, setLocation] = useState("9 rue Gracchus") + const { + data, + error, + refresh + } = useFetch(`https://api-adresse.data.gouv.fr/search/?q=${encodeURI(location)}&type=housenumber&autocomplete=1`) + + useEffect(() => { + refresh(`https://api-adresse.data.gouv.fr/search/?q=${encodeURI(location)}&type=housenumber&autocomplete=1`) + }, [location]); + + return <> +
+ + setLocation(e.target.value)}/> + + {data && data.features.map((d, index) => { + return + })} + +
+ +} + +export function ContactEditor({ + data + }) { + const [state, dispatch] = useReducer(SimpleReducer, []) + + useEffect(() => { + for (const key in data.contact) { + dispatch({type: 'UPDATE_OR_ADD', payload: {id: key, data: data.contact[key]}}) + } + }, [data.contact]); + + return <> +
    + {state.map((d, index) => { + if (d.data === undefined) + return; + + return
    +
    + + { + dispatch({type: 'UPDATE_OR_ADD', payload: {id: d.id, data: e.target.value}}) + }}/> + +
    +
    + })} +
+ +} + +// https://annuaire-entreprises.data.gouv.fr/entreprise/la-mesnie-des-chevaliers-de-st-georges-et-de-st-michel-500213731 const position = [51.505, -0.09] + function MainMap() { function handleReturnCurrentPosition() { console.log("I have clicked return button!!"); @@ -105,7 +270,7 @@ function MainMap() { return ( <> - +