From 8c04856614474d177ec8fc5140ed0e780ceb6530 Mon Sep 17 00:00:00 2001 From: Arthur Wambst Date: Fri, 17 Oct 2025 00:45:48 +0200 Subject: [PATCH] still updating to new back --- src/App.tsx | 8 ++ src/component/Navigation/Navigation.tsx | 35 +++++++ src/pages/Immersion.tsx | 18 +--- src/pages/Login.tsx | 2 +- src/pages/Site.tsx | 88 +++++++++++++++++ src/pages/admin/CreateJi.tsx | 122 ++++++++++++++++++++++++ src/pages/admin/CreateSite.tsx | 106 ++++++++++++++++++++ src/pages/admin/ListJi.tsx | 75 +++++++++++++++ src/pages/admin/Sites.tsx | 75 +++++++++++++++ src/type/JiType.ts | 5 +- src/type/SiteType.ts | 9 ++ 11 files changed, 526 insertions(+), 17 deletions(-) create mode 100644 src/pages/Site.tsx create mode 100644 src/pages/admin/CreateJi.tsx create mode 100644 src/pages/admin/CreateSite.tsx create mode 100644 src/pages/admin/ListJi.tsx create mode 100644 src/pages/admin/Sites.tsx create mode 100644 src/type/SiteType.ts diff --git a/src/App.tsx b/src/App.tsx index 8e6998a..c049b34 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -5,11 +5,15 @@ import Dashboard from "./pages/Dashboard"; import Immersions from "./pages/Immersions"; import Instances from "./pages/Instances"; import Immersion from "./pages/Immersion"; +import Site from "./pages/Site"; import LoginPage from "./pages/Login"; import PageTest from "./pages/PageTest"; import CreateTp from "./pages/admin/CreateTp"; +import CreateSite from "./pages/admin/CreateSite"; +import CreateJi from "./pages/admin/CreateJi"; import BulkUsers from "./pages/admin/BulkCreateUser"; import Users from "./pages/admin/Users"; +import Sites from "./pages/admin/Sites"; import { ToastContainer } from "react-toastify"; import "react-toastify/dist/ReactToastify.css"; import AdminPage from "./pages/admin/AdminPage"; @@ -23,13 +27,17 @@ function App() { } /> } /> } /> + } /> } /> } /> } /> } /> } /> } /> + } /> + } /> } /> + } /> } /> diff --git a/src/component/Navigation/Navigation.tsx b/src/component/Navigation/Navigation.tsx index d7f4b01..37a1e94 100644 --- a/src/component/Navigation/Navigation.tsx +++ b/src/component/Navigation/Navigation.tsx @@ -147,6 +147,41 @@ const Navigation: React.FC = ({
  • +
    + + Create Site + +
    +
  • +
  • +
    + + Create new JDMI + +
    +
  • + +
  • +
    + + List Sites + +
    +
  • + +
  • {ji.name}
    -
    -
    - -
    -
    -

    - Information + {ji.name} - Information

    • {ji.description}
    • - Duration: - 2 hours + Description: + {ji.description}
    • Tools Used: @@ -61,7 +51,7 @@ function Immersion() {
    • Date: - Oct 23, 2024 + {ji.date}
    diff --git a/src/pages/Login.tsx b/src/pages/Login.tsx index cc79e7c..d589f36 100644 --- a/src/pages/Login.tsx +++ b/src/pages/Login.tsx @@ -22,7 +22,7 @@ const LoginPage: React.FC = () => { }) .then((response) => { if (response.status === 200) { - axios.get("/api/users/me").then((res) => { + axios.get("/api/user/me").then((res) => { localStorage.setItem("username", res.data.username); if (res.data.roles.includes("ROOT")) { localStorage.setItem("root", "true"); diff --git a/src/pages/Site.tsx b/src/pages/Site.tsx new file mode 100644 index 0000000..1e7d1c6 --- /dev/null +++ b/src/pages/Site.tsx @@ -0,0 +1,88 @@ +import { ArrowDownTrayIcon, ClipboardIcon } from "@heroicons/react/24/outline"; +import axios from "axios"; +import { useEffect, useState } from "react"; +import { useParams } from "react-router-dom"; +import { toast } from "react-toastify"; +import { Site } from "../type/SiteType"; + +function Site() { + const { id } = useParams(); + const [site, setSite] = useState(); + + const copyText = (copy: string) => { + navigator.clipboard.writeText(copy); + toast.success("Copied!", { + draggable: true, + theme: localStorage.getItem("theme") || "dark", + }); + }; + + useEffect(() => { + axios.get(`/api/sites/${id}`).then((res) => { + setSite(res.data); + }); + }, [id]); + + return ( + <> + {site && ( + <> +

    {site.name}

    +
    +
    +
    +
    + {site.listJi} +
    +
    + +
    +
    +

    + {site.name} - Informations +

    +
      +
    • + Description: + {site.description} +
    • +
    • + Address: + {site.address} +
    • +
    +
    +
    +

    + Responsables du site +

    + mettre une liste des respo site +
      + +
    +
    + +
    +
    +
    + Subject +
    +

    Download

    +
    + +
    +
    +
    +
    +
    + + )} + + ); +} + +export default Site; diff --git a/src/pages/admin/CreateJi.tsx b/src/pages/admin/CreateJi.tsx new file mode 100644 index 0000000..832ab05 --- /dev/null +++ b/src/pages/admin/CreateJi.tsx @@ -0,0 +1,122 @@ +import axios from "axios"; +import { useState } from "react"; +import { useNavigate } from "react-router-dom"; + +function CreateJi() { + const [ji, setJi] = useState({ + name: "", + respo: "", + site_id: "", + date: "", + }); + const navigate = useNavigate(); + + const handleInputChange = ( + e: React.ChangeEvent< + HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement + >, + ) => { + const { name, value } = e.target; + setJi({ ...ji, [name]: value }); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + + // Créer les query parameters + const params = new URLSearchParams({ + name: ji.name, + respo: ji.respo, + site_id: ji.site_id, + date: ji.date, + }); + + axios.post(`/api/ji/create?${params.toString()}`).then((res) => { + if (res.status === 200) { + navigate(`/immersion/${res.data.id}`); + } + }); + }; + return ( +
    +
    +

    + Create Ji +

    + +
    +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + +
    +
    +
    +
    + ); +} + +export default CreateJi; diff --git a/src/pages/admin/CreateSite.tsx b/src/pages/admin/CreateSite.tsx new file mode 100644 index 0000000..fe7c719 --- /dev/null +++ b/src/pages/admin/CreateSite.tsx @@ -0,0 +1,106 @@ +import axios from "axios"; +import { useState } from "react"; +import { useNavigate } from "react-router-dom"; + +function CreateSite() { + const [site, setSite] = useState({ + name: "", + desc: "", + address: "", + }); + const navigate = useNavigate(); + + const handleInputChange = ( + e: React.ChangeEvent< + HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement + >, + ) => { + const { name, value } = e.target; + setSite({ ...site, [name]: value }); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + + // Créer les query parameters + const params = new URLSearchParams({ + name: site.name, + description: site.description, + address: site.address, + }); + + axios.post(`/api/sites?${params.toString()}`).then((res) => { + if (res.status === 200) { + navigate(`/site/${res.data.id}`); + } + }); + }; + return ( +
    +
    +

    + Create Site +

    + +
    +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + +
    +
    +
    +
    + ); +} + +export default CreateSite; diff --git a/src/pages/admin/ListJi.tsx b/src/pages/admin/ListJi.tsx new file mode 100644 index 0000000..ed3decf --- /dev/null +++ b/src/pages/admin/ListJi.tsx @@ -0,0 +1,75 @@ +import axios from "axios"; +import { useEffect, useState } from "react"; +import { Ji } from "../../type/JiType"; + +function ListJI() { + const [jis, setJis] = useState([]); + const [reload, setReload] = useState(0); + + useEffect(() => { + axios.get("/api/ji/listall").then((res) => { + setJis(res.data); + }); + }, [reload]); + + const handleEditJi = (jiId: number) => { + alert(`Edit ji with ID: ${siteId}`); + }; + + /*const deleteJis = () => { + axios.delete("/api/jis").then(() => { + setReload(reload + 1); + }); + };*/ + + return ( +
    +
    +
    +

    + Manage Jis +

    + {/**/} +
    + + {/* Users Table */} +
    + + + + + + + + + + + + + {jis.map((site: Ji, index: number) => ( + + + + + + + + ))} + +
    #NameAddressRolesInstancesActions
    {index + 1}{ji.name}{ji.address}{ji.listJi} + +
    +
    +
    +
    + ); +} + +export default Jis; diff --git a/src/pages/admin/Sites.tsx b/src/pages/admin/Sites.tsx new file mode 100644 index 0000000..aa3fb1e --- /dev/null +++ b/src/pages/admin/Sites.tsx @@ -0,0 +1,75 @@ +import axios from "axios"; +import { useEffect, useState } from "react"; +import { Site } from "../../type/SiteType"; + +function Sites() { + const [sites, setSites] = useState([]); + const [reload, setReload] = useState(0); + + useEffect(() => { + axios.get("/api/sites").then((res) => { + setSites(res.data); + }); + }, [reload]); + + const handleEditSite = (siteId: number) => { + alert(`Edit site with ID: ${siteId}`); + }; + + /*const deleteSites = () => { + axios.delete("/api/sites").then(() => { + setReload(reload + 1); + }); + };*/ + + return ( +
    +
    +
    +

    + Manage Sites +

    + {/**/} +
    + + {/* Users Table */} +
    + + + + + + + + + + + + + {sites.map((site: Site, index: number) => ( + + + + + + + + ))} + +
    #NameAddressRolesInstancesActions
    {index + 1}{site.name}{site.address}{site.listJi} + +
    +
    +
    +
    + ); +} + +export default Sites; diff --git a/src/type/JiType.ts b/src/type/JiType.ts index cc9de2c..1387569 100644 --- a/src/type/JiType.ts +++ b/src/type/JiType.ts @@ -2,11 +2,12 @@ import { Sujet } from "./SujetType"; import { User } from "./UserType"; export interface Ji { + id: number, name: string; description: string; - respos: User[]; date: string; site: Site; - participants: User[]; + respos: User[]; + participants: User[] //instances: Instances[]; } diff --git a/src/type/SiteType.ts b/src/type/SiteType.ts new file mode 100644 index 0000000..9ca856e --- /dev/null +++ b/src/type/SiteType.ts @@ -0,0 +1,9 @@ +import { Ji } from "./JiType"; + +export interface Site { + id: number; + name: string; + description: string; + address: string; + listJi: List; +}