diff --git a/src/components/Navbar/index.js b/src/components/Navbar/index.js
index 14fe1d8..fc5b3cc 100644
--- a/src/components/Navbar/index.js
+++ b/src/components/Navbar/index.js
@@ -21,6 +21,11 @@ const Navbar = ({ className, onClick, handleClose }) => {
Hanzo Character Maker
+
+
+ Admin
+
+
);
diff --git a/src/pages/Admin/index.js b/src/pages/Admin/index.js
new file mode 100644
index 0000000..a07cfad
--- /dev/null
+++ b/src/pages/Admin/index.js
@@ -0,0 +1,210 @@
+import "./styles.css";
+
+import parse from "html-react-parser";
+import { render } from "react-dom";
+import { useEffect, useState } from "react";
+
+import Container from "../../layouts/Container/index.js";
+import allData from "../../data/dataFiltered.js";
+
+const Admin = () => {
+ const [data, setData] = useState();
+
+ useEffect(() => {
+ const filterDataByFolder = (folderId) => {
+ const filteredData = allData.filter((item) => item.folder === folderId);
+
+ return filteredData.map((item) => {
+ const subItems = filterDataByFolder(item._id);
+ return {
+ ...item,
+ subItems,
+ };
+ });
+ };
+
+ const mainFolders = allData.filter((item) => item.folder === null);
+ const filteredData = mainFolders.map((item) => {
+ const subItems = filterDataByFolder(item._id);
+ return {
+ ...item,
+ subItems,
+ };
+ });
+
+ setData(filteredData);
+ }, [setData]);
+
+ let trash = [];
+ const addToTrash = (itemId) => (e) => {
+ trash.push(itemId);
+ e.target.parentNode.style.backgroundColor = "green";
+ };
+ const recoverFromTrash = (itemId) => (e) => {
+ trash = trash.filter((item) => item._id !== itemId);
+ e.target.parentNode.style.backgroundColor = "white";
+ };
+
+ const createNewJSON = () => {
+ const newJSON = allData.filter((item) => !trash.includes(item._id));
+ console.log(newJSON);
+ };
+
+ const showTrash = () => {
+ console.log(trash);
+ };
+
+ const changeObjectName = (itemId) => (e) => {
+ console.log(itemId);
+ console.log(e.target.parentNode.querySelector("input").value);
+ let newName = e.target.parentNode.querySelector("input").value;
+ allData.map((item) => {
+ if (item._id === itemId) {
+ item.name = newName;
+ }
+ });
+ console.log(allData.filter((item) => item._id === itemId)); // check if the name has been changed
+ };
+
+ const changeObjectDescription = (itemId) => (e) => {
+ console.log(itemId);
+ console.log(e.target.parentNode.querySelector("textarea").value);
+ let newDesc = e.target.parentNode.querySelector("textarea").value;
+ // allData.map((item) => {
+ // if (item._id === itemId) {
+ // item.system.description.value = newDesc;
+ // }
+ // });
+ // console.log(allData.filter((item) => item._id === itemId)); // check if the name has been changed
+ };
+
+ const renderSubItems = (subItems) => {
+ if (subItems?.length === 0) {
+ return subItems?.length !== 0 ? (
+
+
+
+
+ {subItems?._id} - {subItems?.name}
+
+ Change name
+
+ Valider
+
+
Recover
+
Delete
+
+ ) : (
+ <>>
+ );
+ } else {
+ return subItems?.map((subItem, subId) => {
+ return (
+
+ {subItems?.length !== 0 ? (
+
+
+
+
+ {subItem?._id} - {subItem?.name}
+
+
+ Change name
+
+
+ Valider
+
+
+
+ {subItem.system && parse(subItem.system.description.value)}
+
Change description
+
+
+
+ Valider
+
+
+
+
+ Recover
+
+
Delete
+
+ ) : (
+ <>>
+ )}
+ {renderSubItems(subItem?.subItems)}
+
+ );
+ });
+ }
+ };
+
+ return (
+
+
+ {data?.map((item, id) => (
+
+
+
+
+ {item?._id} - {item?.name}
+
+
Recover
+
Delete
+
+ {renderSubItems(item?.subItems)}
+
+ ))}
+ Valider
+ Afficher corbeille
+
+
+ );
+};
+
+// {
+// _id: "kLHR7GDjdqHOA4bl",
+// name: "Billes explosives",
+// type: "consumable",
+// img: "/icons/magic/fire/explosion-fireball-small-orange.webp",
+// folder: "e2iHmimKcOR3YCha",
+// description: "Le shinobi peut créer un sac de billes explosives. Au début, elle ne contient qu'une seule bille, mais si ce gadget est séléctionné a plus haut niveau, il multiple les dégats finaux.
\nLe shinobi défait un sac de bille sur son adversaire qui prends des explosions de plein fouet.
\nChaque bille inflige 1d8+INT dégat de feu.
",
+// source: "",
+// quantity: 1,
+// weight: 0,
+// price: 0,
+// rarity: "uncommon",
+// activation: { type: "action", cost: 1, condition: "" },
+// duration: { value: null, units: "" },
+// range: { value: null, long: null, units: "" },
+// uses: {
+// value: 1,
+// max: "1",
+// per: "charges",
+// recovery: "",
+// autoDestroy: false,
+// },
+// consume: { type: "", target: "", amount: null },
+// ability: "",
+// actionType: "msak",
+// attackBonus: "0",
+// critical: { threshold: null},
+// damage: { parts: [["1d8+@abilites.int.mod", "fire"]], versatile: "" },
+// formula: "",
+// save: { ability: "", dc: null, scaling: "spell" },
+// },
+
+export default Admin;
diff --git a/src/pages/Admin/styles.css b/src/pages/Admin/styles.css
new file mode 100644
index 0000000..eb47179
--- /dev/null
+++ b/src/pages/Admin/styles.css
@@ -0,0 +1,10 @@
+.character {}
+
+.selected {
+ color: blue;
+}
+
+img {
+ width: 100px;
+ height: 100px;
+}
\ No newline at end of file
diff --git a/src/pages/Root/index.js b/src/pages/Root/index.js
index 9c02bfb..35586d4 100644
--- a/src/pages/Root/index.js
+++ b/src/pages/Root/index.js
@@ -1,6 +1,7 @@
import { Route, Routes } from "react-router-dom";
import About from "../About";
+import Admin from "../Admin";
import BasicLayout from "../../layouts/BasicLayout";
import Character from "../Character";
import Home from "../Home";
@@ -12,6 +13,7 @@ const Root = () => {
} />
} />
} />
+ } />
ERROR 404>} />