From fefd5c5080f6a2e842b6eeb3582045cb04865dad Mon Sep 17 00:00:00 2001 From: Thibaut Valentin Date: Fri, 10 Jan 2025 16:22:14 +0100 Subject: [PATCH 01/10] fix(utils): remove JMI for MimeType --- src/main/java/fr/titionfire/ffsaf/utils/Utils.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/main/java/fr/titionfire/ffsaf/utils/Utils.java b/src/main/java/fr/titionfire/ffsaf/utils/Utils.java index 709786a..b1a700c 100644 --- a/src/main/java/fr/titionfire/ffsaf/utils/Utils.java +++ b/src/main/java/fr/titionfire/ffsaf/utils/Utils.java @@ -11,7 +11,6 @@ import java.io.*; import java.net.URISyntaxException; import java.net.URLConnection; import java.nio.file.Files; -import java.util.Arrays; import java.util.Calendar; import java.util.Date; import java.util.concurrent.CompletableFuture; @@ -78,14 +77,7 @@ public class Utils { try (InputStream is = new BufferedInputStream(new ByteArrayInputStream(input))) { String mimeType = URLConnection.guessContentTypeFromStream(is); - System.out.println(mimeType); - /*try { - mimeType = Magic.getMagicMatch(input, false).getMimeType(); - } catch (MagicParseException | MagicMatchNotFoundException | MagicException e) { - mimeType = URLConnection.guessContentTypeFromStream(is); - }*/ String[] detectedExtensions = MimeTypes.findExtensionsByMimeTypes(mimeType, false); - System.out.println(Arrays.toString(detectedExtensions)); if (detectedExtensions.length == 0) throw new IOException("Fail to detect file extension for MIME type " + mimeType); From f637300e87c85dfd172738e89d7ccb44ce0119d4 Mon Sep 17 00:00:00 2001 From: Thibaut Valentin Date: Fri, 17 Jan 2025 10:10:02 +0100 Subject: [PATCH 02/10] fix(build): add asset resource tout native exec --- src/main/resources/application.properties | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index c0346aa..90c91bd 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -52,3 +52,6 @@ quarkus.http.auth.permission.authenticated.policy=authenticated quarkus.http.auth.permission.public.paths=/index.html quarkus.http.auth.permission.public.policy=permit quarkus.keycloak.admin-client.server-url=https://auth.safca.fr + + +quarkus.native.resources.includes=asset/** \ No newline at end of file From 8623275854ba5dc7bbf76cfc367805150281ed06 Mon Sep 17 00:00:00 2001 From: Thibaut Valentin Date: Fri, 17 Jan 2025 10:56:46 +0100 Subject: [PATCH 03/10] feat(membre): add certificat make date --- .../ffsaf/domain/service/MembreService.java | 19 +++++++++- .../src/pages/admin/member/LicenceCard.jsx | 31 ++++++++++------ .../src/pages/club/member/LicenceCard.jsx | 36 ++++++++++++++----- 3 files changed, 66 insertions(+), 20 deletions(-) diff --git a/src/main/java/fr/titionfire/ffsaf/domain/service/MembreService.java b/src/main/java/fr/titionfire/ffsaf/domain/service/MembreService.java index 672f059..02b5ae9 100644 --- a/src/main/java/fr/titionfire/ffsaf/domain/service/MembreService.java +++ b/src/main/java/fr/titionfire/ffsaf/domain/service/MembreService.java @@ -41,6 +41,7 @@ import org.hibernate.reactive.mutiny.Mutiny; import java.io.*; import java.nio.file.Files; +import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.List; import java.util.Objects; @@ -438,11 +439,27 @@ public class MembreService { photoCell.setBorder(PdfPCell.NO_BORDER); memberTable.addCell(photoCell); + String[] cert; + if (licence.getCertificate() != null && !licence.getCertificate().isBlank()) { + cert = licence.getCertificate().split("¤"); + if (cert.length <= 1){ + cert = new String[]{licence.getCertificate(), "--"}; + }else{ + try { + cert[1] = sdf.format(new SimpleDateFormat("yyyy-MM-dd").parse(cert[1])); + } catch (ParseException e) { + cert[1] = "--"; + } + } + } else { + cert = new String[]{"--", "--"}; + } + // Adding member details memberTable.addCell(new Phrase("NOM : " + m.getLname().toUpperCase(), bodyFont)); memberTable.addCell(new Phrase("Prénom : " + m.getFname(), bodyFont)); memberTable.addCell(new Phrase("Licence n° : " + m.getLicence(), bodyFont)); - memberTable.addCell(new Phrase("Certificat médical par Dr " + licence.getCertificate(), bodyFont)); + memberTable.addCell(new Phrase("Certificat médical par " + cert[0] + ", le " + cert[1], bodyFont)); memberTable.addCell(new Phrase("")); // Empty cell for spacing document.add(memberTable); diff --git a/src/main/webapp/src/pages/admin/member/LicenceCard.jsx b/src/main/webapp/src/pages/admin/member/LicenceCard.jsx index b662be5..fd3f20d 100644 --- a/src/main/webapp/src/pages/admin/member/LicenceCard.jsx +++ b/src/main/webapp/src/pages/admin/member/LicenceCard.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, errFormater, getSaison} from "../../../utils/Tools.js"; -import {Input} from "../../../components/Input.jsx"; import {toast} from "react-toastify"; function licenceReducer(licences, action) { @@ -93,6 +91,7 @@ function sendLicence(event, dispatch) { event.preventDefault(); const formData = new FormData(event.target); + formData.set('certificate', `${event.target.certificateBy?.value}¤${event.target.certificateDate?.value}`) formData.set('licence', event.target.licence?.value?.length > 0 ? event.target.licence?.value : null) toast.promise( @@ -132,14 +131,18 @@ function removeLicence(id, dispatch) { function ModalContent({licence, dispatch}) { const [saison, setSaison] = useState(0) - const [certificate, setCertificate] = useState("") + const [certificateBy, setCertificateBy] = useState("") + const [certificateDate, setCertificateDate] = useState("") const [validate, setValidate] = useState(false) const [isNew, setNew] = useState(true) const setSeason = (event) => { setSaison(Number(event.target.value)) } - const handleCertificateChange = (event) => { - setCertificate(event.target.value); + const handleCertificateByChange = (event) => { + setCertificateBy(event.target.value.replaceAll('¤', '')); + } + const handleCertificateDateChange = (event) => { + setCertificateDate(event.target.value.replaceAll('¤', '')); } const handleValidateChange = (event) => { setValidate(event.target.value === 'true'); @@ -149,12 +152,14 @@ function ModalContent({licence, dispatch}) { if (licence.id !== -1) { setNew(false) setSaison(licence.saison) - setCertificate(licence.certificate) + setCertificateBy(licence.certificate.split('¤')[0]) + setCertificateDate(licence.certificate.split('¤')[1]) setValidate(licence.validate) } else { setNew(true) setSaison(getSaison()) - setCertificate("") + setCertificateBy("") + setCertificateDate("") setValidate(false) } }, [licence]); @@ -178,9 +183,15 @@ function ModalContent({licence, dispatch}) { {saison + 1} - Médecin figurant sur le certificat médical - + Certificat médical +
+ Fait par + + , le + +
diff --git a/src/main/webapp/src/pages/club/member/LicenceCard.jsx b/src/main/webapp/src/pages/club/member/LicenceCard.jsx index ec3c913..b3e6b03 100644 --- a/src/main/webapp/src/pages/club/member/LicenceCard.jsx +++ b/src/main/webapp/src/pages/club/member/LicenceCard.jsx @@ -7,7 +7,6 @@ import {AxiosError} from "../../../components/AxiosError.jsx"; import {apiAxios, errFormater, getSaison} from "../../../utils/Tools.js"; import {toast} from "react-toastify"; import {ColoredText} from "../../../components/ColoredCircle.jsx"; -import {TextField} from "../../../components/MemberCustomFiels.jsx"; function licenceReducer(licences, action) { switch (action.type) { @@ -91,6 +90,8 @@ function sendLicence(event, dispatch) { event.preventDefault(); const formData = new FormData(event.target); + formData.set('certificate', `${event.target.certificateBy?.value}¤${event.target.certificateDate?.value}`) + toast.promise( apiAxios.post(`/licence/club/${formData.get('membre')}`, formData), { @@ -127,20 +128,31 @@ function removeLicence(id, dispatch) { } function ModalContent({licence, dispatch}) { - const [certificate, setCertificate] = useState("") + const [certificateBy, setCertificateBy] = useState("") + const [certificateDate, setCertificateDate] = useState("") const [isNew, setNew] = useState(true) - const handleCertificateChange = (event) => { - setCertificate(event.target.value); + const handleCertificateByChange = (event) => { + setCertificateBy(event.target.value.replaceAll('¤', '')); + } + const handleCertificateDateChange = (event) => { + setCertificateDate(event.target.value.replaceAll('¤', '')); } useEffect(() => { if (licence.id !== -1) { setNew(false) - setCertificate(licence.certificate) + if (licence.certificate === null){ + setCertificateBy("") + setCertificateDate("") + }else { + setCertificateBy(licence.certificate.split('¤')[0]) + setCertificateDate(licence.certificate.split('¤')[1]) + } } else { setNew(true) - setCertificate("") + setCertificateBy("") + setCertificateDate("") } }, [licence]); @@ -157,9 +169,15 @@ function ModalContent({licence, dispatch}) { aria-label="Close">
- Médecin figurant sur le certificat médical - + Certificat médical +
+ Fait par + + , le + +
Validation de la licence:
From 520c3ad89b5327bda9ca2c637ad6290e4300f128 Mon Sep 17 00:00:00 2001 From: Thibaut Valentin Date: Fri, 17 Jan 2025 11:22:44 +0100 Subject: [PATCH 04/10] feat: change site name and icon --- src/main/webapp/index.html | 4 ++-- .../FFSSAF-bord-blanc-fond-transparent.webp | Bin src/main/webapp/src/components/Nav.jsx | 3 +-- 3 files changed, 3 insertions(+), 4 deletions(-) rename src/main/webapp/{src/assets => public}/FFSSAF-bord-blanc-fond-transparent.webp (100%) diff --git a/src/main/webapp/index.html b/src/main/webapp/index.html index 95678f6..5ff88bf 100644 --- a/src/main/webapp/index.html +++ b/src/main/webapp/index.html @@ -2,9 +2,9 @@ - + - Vite + React + FFSAF Intranet diff --git a/src/main/webapp/src/assets/FFSSAF-bord-blanc-fond-transparent.webp b/src/main/webapp/public/FFSSAF-bord-blanc-fond-transparent.webp similarity index 100% rename from src/main/webapp/src/assets/FFSSAF-bord-blanc-fond-transparent.webp rename to src/main/webapp/public/FFSSAF-bord-blanc-fond-transparent.webp diff --git a/src/main/webapp/src/components/Nav.jsx b/src/main/webapp/src/components/Nav.jsx index 4e5a01d..e64dc76 100644 --- a/src/main/webapp/src/components/Nav.jsx +++ b/src/main/webapp/src/components/Nav.jsx @@ -1,4 +1,3 @@ -import LogoIcon from '../assets/FFSSAF-bord-blanc-fond-transparent.webp' import './Nav.css' import {NavLink} from "react-router-dom"; import {useAuth} from "../hooks/useAuth.jsx"; @@ -9,7 +8,7 @@ export function Nav() { return