- 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.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 (
+
+ );
+}
+
+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 */}
+
+
+
+
+ | # |
+ Name |
+ Address |
+ Roles |
+ Instances |
+ Actions |
+
+
+
+ {jis.map((site: Ji, index: number) => (
+
+ | {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 */}
+
+
+
+
+ | # |
+ Name |
+ Address |
+ Roles |
+ Instances |
+ Actions |
+
+
+
+ {sites.map((site: Site, index: number) => (
+
+ | {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;
+}