From fa1a16388b326b6185959dee05a5ef495f1cfb85 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20H=C3=B8yland?= <daniehoy@stud.ntnu.no>
Date: Wed, 1 May 2024 18:46:22 +0200
Subject: [PATCH] added Something went wrong popout if backend catches error

---
 .../power-tracker/src/components/enoekAdd.tsx |  55 +-
 .../src/components/enoekAllMeasures.tsx       |  20 +
 .../src/components/enoekDecision.tsx          |  68 ++-
 .../src/components/manageBuildDep.tsx         | 521 +++++++++---------
 .../src/components/manageGateway.tsx          | 227 ++++----
 .../src/components/manageProcesses.tsx        | 336 +++++------
 .../power-tracker/src/pages/ManageSensors.tsx |  23 +
 .../src/pages/adminUserConfig.tsx             | 393 ++++++-------
 Frontend/power-tracker/src/pages/enoek.tsx    | 136 +++--
 9 files changed, 998 insertions(+), 781 deletions(-)

diff --git a/Frontend/power-tracker/src/components/enoekAdd.tsx b/Frontend/power-tracker/src/components/enoekAdd.tsx
index a9d3321..c294cb2 100644
--- a/Frontend/power-tracker/src/components/enoekAdd.tsx
+++ b/Frontend/power-tracker/src/components/enoekAdd.tsx
@@ -88,23 +88,7 @@ class Processes {
      }
  }
 
-  async function fetchDataProcess(): Promise<Processes[]> {
-    var processArrray: Processes[] = []
-    await axios.post(EgressAPI + '/process',
-    {
-      sessionToken: sessionStorage.getItem('TOKEN')
-    }).then((res) => {  
-        res.data.process.forEach((element: any) => {
-            processArrray.push({
-              name: element.name
-            })
-        });
-    }).catch((error) => {
-      console.log(error)
-    })
-    console.log(processArrray)
-    return processArrray 
-  }
+  
 
 
   
@@ -122,6 +106,23 @@ const MainComponent: React.FC<ManageAddingProps> = ({ enoek, setData, search })
           name: ""
         }]
     });
+    async function fetchDataProcess(): Promise<Processes[]> {
+        var processArrray: Processes[] = []
+        await axios.post(EgressAPI + '/process',
+        {
+          sessionToken: sessionStorage.getItem('TOKEN')
+        }).then((res) => {  
+            res.data.process.forEach((element: any) => {
+                processArrray.push({
+                  name: element.name
+                })
+            });
+        }).catch((error) => {
+          console.log(error)
+          setOpen(true)
+        })
+        return processArrray 
+      }
     
     // Assuming fetchDataProcess is an async function that fetches data
     useEffect(() => {
@@ -171,11 +172,31 @@ const MainComponent: React.FC<ManageAddingProps> = ({ enoek, setData, search })
             console.log(res.data)
         }).catch((error) => {
             console.log(error)
+            setOpen(true)
         })
     }
+    const [open, setOpen] = useState(false);
+
+    const handleClose = () => {
+        setOpen(false);
+    };
+    
 
     return (
         <>
+        <AlertDialog open={open}>
+            <AlertDialogContent>
+            <AlertDialogHeader>
+                <AlertDialogTitle>Something went wrong</AlertDialogTitle>
+            </AlertDialogHeader>
+                <div>
+                    Please try again or check your connection
+                </div>
+            <AlertDialogFooter>
+                <AlertDialogCancel onClick={handleClose}>Close</AlertDialogCancel>
+            </AlertDialogFooter>
+            </AlertDialogContent>
+        </AlertDialog>
         <div>
         <Form {...form}>
             <form onSubmit={form.handleSubmit(addEnoek)}>
diff --git a/Frontend/power-tracker/src/components/enoekAllMeasures.tsx b/Frontend/power-tracker/src/components/enoekAllMeasures.tsx
index f79a2db..f46eeba 100644
--- a/Frontend/power-tracker/src/components/enoekAllMeasures.tsx
+++ b/Frontend/power-tracker/src/components/enoekAllMeasures.tsx
@@ -112,14 +112,34 @@ const MainComponent: React.FC<ManageAddingProps> = ({ enoek, setData, search}) =
             console.log(res.data)
         }).catch((error) => {
             console.log(error)
+            setOpen(true)
         })
       }
       const permission = sessionStorage.getItem('PERMISSION');
 
+      const [open, setOpen] = useState(false);
+
+    const handleClose = () => {
+        setOpen(false);
+    };
+
     return (
         <>
 
         <ScrollArea>
+        <AlertDialog open={open}>
+            <AlertDialogContent>
+            <AlertDialogHeader>
+                <AlertDialogTitle>Something went wrong</AlertDialogTitle>
+            </AlertDialogHeader>
+                <div>
+                    Please try again or check your connection
+                </div>
+            <AlertDialogFooter>
+                <AlertDialogCancel onClick={handleClose}>Close</AlertDialogCancel>
+            </AlertDialogFooter>
+            </AlertDialogContent>
+        </AlertDialog>
                 <Table>
                     <TableCaption>
                         (づ ◕‿◕ )づ
diff --git a/Frontend/power-tracker/src/components/enoekDecision.tsx b/Frontend/power-tracker/src/components/enoekDecision.tsx
index afcd772..fcabd50 100644
--- a/Frontend/power-tracker/src/components/enoekDecision.tsx
+++ b/Frontend/power-tracker/src/components/enoekDecision.tsx
@@ -53,7 +53,6 @@ import {
 import { ScrollArea } from "@/components/ui/scroll-area"
 
 const IngressAPI = import.meta.env.VITE_IAPI_URL
-
 type EnokDataItem = {
     id: number;
     header: string;
@@ -77,30 +76,6 @@ interface ManageAddingProps {
     setData: React.Dispatch<React.SetStateAction<{ enoek: EnokDataItem[] }>>;
     search: string;
 }
-const judge = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>, id: number, bool: boolean) =>  {
-    e.preventDefault()
-
-    var token: string = ""
-    var tokenBool = sessionStorage.getItem("TOKEN")
-    if (tokenBool == null) {
-        redirect('/')
-    } else {
-        token = tokenBool
-    }
-    console.log('URL To call: ' + IngressAPI + 'token used' + token)
-    axios.put(
-        IngressAPI + '/new-enoek',
-        {   
-            id: id,
-            bool: bool,
-            sessionToken:token,
-        })
-    .then((res)=>{
-        console.log(res.data)
-    }).catch((error) => {
-        console.log(error)
-    })
-}
 
 const MainComponent: React.FC<ManageAddingProps> = ({ enoek, setData, search}) =>{
 
@@ -117,11 +92,54 @@ const MainComponent: React.FC<ManageAddingProps> = ({ enoek, setData, search}) =
         setSortDirection('asc');
         }
     };
+    const [open, setOpen] = useState(false);
 
+    const handleClose = () => {
+        setOpen(false);
+    };
+
+    const judge = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>, id: number, bool: boolean) =>  {
+        e.preventDefault()
+    
+        var token: string = ""
+        var tokenBool = sessionStorage.getItem("TOKEN")
+        if (tokenBool == null) {
+            redirect('/')
+        } else {
+            token = tokenBool
+        }
+        console.log('URL To call: ' + IngressAPI + 'token used' + token)
+        axios.put(
+            IngressAPI + '/new-enoek',
+            {   
+                id: id,
+                bool: bool,
+                sessionToken:token,
+            })
+        .then((res)=>{
+            console.log(res.data)
+        }).catch((error) => {
+            console.log(error)
+            setOpen(true)
+        })
+    }
     return (
         <>
 
         <ScrollArea>
+        <AlertDialog open={open}>
+            <AlertDialogContent>
+            <AlertDialogHeader>
+                <AlertDialogTitle>Something went wrong</AlertDialogTitle>
+            </AlertDialogHeader>
+                <div>
+                    Please try again or check your connection
+                </div>
+            <AlertDialogFooter>
+                <AlertDialogCancel onClick={handleClose}>Close</AlertDialogCancel>
+            </AlertDialogFooter>
+            </AlertDialogContent>
+        </AlertDialog>
                 <Table>
                     <TableCaption>
                         (づ ◕‿◕ )づ
diff --git a/Frontend/power-tracker/src/components/manageBuildDep.tsx b/Frontend/power-tracker/src/components/manageBuildDep.tsx
index 8032d53..35f0600 100644
--- a/Frontend/power-tracker/src/components/manageBuildDep.tsx
+++ b/Frontend/power-tracker/src/components/manageBuildDep.tsx
@@ -131,10 +131,283 @@ function BuildDepSubpage () {
 			});
 		});
 	}, []);
+	const [open, setOpen] = useState(false);
+
+	const handleClose = () => {
+		setOpen(false);
+	};
+
+	
+//ADD NEW DATA
+const addBuilding = (e: React.FormEvent<HTMLFormElement>, buildingName: string) =>  {
+	e.preventDefault()
+
+	var token: string = ""
+	var tokenBool = sessionStorage.getItem("TOKEN")
+	if (tokenBool == null) {
+		redirect('/')
+	} else {
+		token = tokenBool
+	}
+	console.log('URL To call: ' + IngressAPI + 'token used' + token)
+	axios.post(
+		IngressAPI + '/new-building',
+		{
+			building_name: buildingName,
+			sessionToken: token,
+		})
+	.then((res)=>{
+		console.log(res.data)
+	}).catch((error) => {
+		console.log(error)
+		setOpen(true)
+	})
+}
+
+const addDepartment = ( buildingName: string, departmentName: string) =>  {
+
+	var token: string = ""
+	var tokenBool = sessionStorage.getItem("TOKEN")
+	if (tokenBool == null) {
+		redirect('/')
+	} else {
+		token = tokenBool
+	}
+	console.log('URL To call: ' + IngressAPI + 'token used' + token)
+	axios.post(
+		IngressAPI + '/new-department',
+		{
+			building_name: buildingName,
+			department_name: departmentName,
+			sessionToken: token,
+		})
+	.then((res)=>{
+		console.log(res.data)
+	}).catch((error) => {
+		console.log(error)
+		setOpen(true)
+	})
+}
+
+  ///EDIT THE DATA
+const editBuilding= ( oldBuildingName: string, newBuildingName: string) =>  {
+
+
+	var token: string = ""
+	var tokenBool = sessionStorage.getItem("TOKEN")
+	if (tokenBool == null) {
+		redirect('/')
+	} else {
+		token = tokenBool
+	}
+	console.log('URL To call: ' + IngressAPI + 'token used' + token)
+	axios.put(
+		IngressAPI + '/new-building',
+		{
+			old_building_name: oldBuildingName,
+			new_building_name: newBuildingName,
+			sessionToken: token,
+		})
+	.then((res)=>{
+		console.log(res.data)
+	}).catch((error) => {
+		console.log(error)
+		setOpen(true)
+	})
+}
+const editDepartment= ( oldDepartmentName: string, newDepartmentName: string, buildingName: string) =>  {
+
+
+	var token: string = ""
+	var tokenBool = sessionStorage.getItem("TOKEN")
+	if (tokenBool == null) {
+		redirect('/')
+	} else {
+		token = tokenBool
+	}
+	console.log('URL To call: ' + IngressAPI + 'token used' + token)
+	axios.put(
+		IngressAPI + '/new-department',
+		{
+			building_name: buildingName,
+			old_department_name: oldDepartmentName,
+			new_department_name: newDepartmentName,
+			sessionToken: token,
+		})
+	.then((res)=>{
+		console.log(res.data)
+	}).catch((error) => {
+		console.log(error)
+		setOpen(true)
+	})
+}
+
+const deleteBuilding = ( name: string) =>  {
+
+
+	var token: string = ""
+	var tokenBool = sessionStorage.getItem("TOKEN")
+	if (tokenBool == null) {
+		redirect('/')
+	} else {
+		token = tokenBool
+	}
+	console.log('URL To call: ' + IngressAPI + 'token used' + token)
+	axios.delete(
+		IngressAPI + '/new-building',
+		{
+		data:{
+			building_name: name,
+			sessionToken: token,
+			}
+		})
+	.then((res)=>{
+		console.log(res.data)
+	}).catch((error) => {
+		console.log(error)
+		setOpen(true)
+	})
+}
+const deleteDepartment= ( name: string) =>  {
+
+
+	var token: string = ""
+	var tokenBool = sessionStorage.getItem("TOKEN")
+	if (tokenBool == null) {
+		redirect('/')
+	} else {
+		token = tokenBool
+	}
+	console.log('URL To call: ' + IngressAPI + 'token used' + token)
+	axios.delete(
+		IngressAPI + '/new-department',
+		{
+		data:{
+			dep_name: name,
+			sessionToken: token,
+			}
+		})
+	.then((res)=>{
+		console.log(res.data)
+	}).catch((error) => {
+		console.log(error)
+		setOpen(true)
+	})
+}
+
+  // GET THE DATA
+class BuildingDep {
+	buildingName: string = "";
+	departments: string = "";
+
+	constructor(buildingName: string, departments: string) {
+		this.buildingName = buildingName;
+		this.departments = departments;
+	}
+}
+
+async function fetchDataBuildingAndDepartment(): Promise<BuildingDep[]> {
+	var buiDep: BuildingDep[] = []
+	await axios.post(EgressAPI + '/buildDep',
+	{
+	sessionToken: sessionStorage.getItem('TOKEN')
+	}).then((res) => {
+		const buildingDepData = res.data.buildingDep;
+
+		for (const buildingName in buildingDepData) {
+			const departments = buildingDepData[buildingName];
+			if (Array.isArray(departments)) {
+				departments.forEach((department: any) => {
+					buiDep.push(new BuildingDep(buildingName, department.name));
+				});
+			}
+		}
+	}).catch((error) => {
+	console.log(error)
+	setOpen(true)
+	})
+
+	return buiDep
+}
+
+type BuildDepData = {
+	buildingDepartmentData: {
+		building: {
+			name: string;
+		};
+		departments: {
+			name: string;
+		}[];
+	}[];
+};
+
+type SetBuildDepData = React.Dispatch<React.SetStateAction<{
+	buildingDepartmentData: {
+		building: {
+			name: string;
+		};
+		departments: {
+			name: string;
+		}[];
+	}[];
+}>>;
+
+const usePopoutState = () => {
+	const [isPopoutOpen, setPopoutOpen] = useState(false);
+	const [whatOperation, setOperation] = useState(0);
+	const [assignValue, setassignValue] = useState(0);
+
+
+
+	const handleOpenPopout = () => {
+	setPopoutOpen(true);
+	};
+
+	const handleClosePopout = () => {
+	setPopoutOpen(false);
+	};
+
+	const handleChangeOperation = (op:number) => {
+	setOperation(op);
+	};
+
+	return {
+	isPopoutOpen,
+	handleOpenPopout,
+	handleClosePopout,
+	whatOperation,
+	handleChangeOperation,
+	assignValue,
+	setassignValue,
+	};
+};
+
+
+interface ManagePopup {
+	handleChangeOperation: (op: number) => void;
+	setassignValue: React.Dispatch<React.SetStateAction<number>>;
+}
+interface DisplayBuildingDepartmentDataProps extends ManagePopup {
+	data: BuildDepData;
+	setData: SetBuildDepData;
+}
+
 
 	return (
 		<div className='flex h-[100%]'>
-            
+            <AlertDialog open={open}>
+            <AlertDialogContent>
+            <AlertDialogHeader>
+                <AlertDialogTitle>Something went wrong</AlertDialogTitle>
+            </AlertDialogHeader>
+                <div>
+                    Please try again or check your connection
+                </div>
+            <AlertDialogFooter>
+                <AlertDialogCancel onClick={handleClose}>Close</AlertDialogCancel>
+            </AlertDialogFooter>
+            </AlertDialogContent>
+        </AlertDialog>
 			<div className='w-[1100px]'>
 				{/* Title and search bar */}
 				<div className="w-[100%] h-[40px] flex justify-between content-center" style={{ marginTop: '5px' }}>
@@ -400,252 +673,6 @@ function BuildDepSubpage () {
 	);
 };
 
-//ADD NEW DATA
-const addBuilding = (e: React.FormEvent<HTMLFormElement>, buildingName: string) =>  {
-	e.preventDefault()
-
-	var token: string = ""
-	var tokenBool = sessionStorage.getItem("TOKEN")
-	if (tokenBool == null) {
-		redirect('/')
-	} else {
-		token = tokenBool
-	}
-	console.log('URL To call: ' + IngressAPI + 'token used' + token)
-	axios.post(
-		IngressAPI + '/new-building',
-		{
-			building_name: buildingName,
-			sessionToken: token,
-		})
-	.then((res)=>{
-		console.log(res.data)
-	}).catch((error) => {
-		console.log(error)
-	})
-}
-
-const addDepartment = ( buildingName: string, departmentName: string) =>  {
-
-	var token: string = ""
-	var tokenBool = sessionStorage.getItem("TOKEN")
-	if (tokenBool == null) {
-		redirect('/')
-	} else {
-		token = tokenBool
-	}
-	console.log('URL To call: ' + IngressAPI + 'token used' + token)
-	axios.post(
-		IngressAPI + '/new-department',
-		{
-			building_name: buildingName,
-			department_name: departmentName,
-			sessionToken: token,
-		})
-	.then((res)=>{
-		console.log(res.data)
-	}).catch((error) => {
-		console.log(error)
-	})
-}
-
-  ///EDIT THE DATA
-const editBuilding= ( oldBuildingName: string, newBuildingName: string) =>  {
-
-
-	var token: string = ""
-	var tokenBool = sessionStorage.getItem("TOKEN")
-	if (tokenBool == null) {
-		redirect('/')
-	} else {
-		token = tokenBool
-	}
-	console.log('URL To call: ' + IngressAPI + 'token used' + token)
-	axios.put(
-		IngressAPI + '/new-building',
-		{
-			old_building_name: oldBuildingName,
-			new_building_name: newBuildingName,
-			sessionToken: token,
-		})
-	.then((res)=>{
-		console.log(res.data)
-	}).catch((error) => {
-		console.log(error)
-	})
-}
-const editDepartment= ( oldDepartmentName: string, newDepartmentName: string, buildingName: string) =>  {
-
-
-	var token: string = ""
-	var tokenBool = sessionStorage.getItem("TOKEN")
-	if (tokenBool == null) {
-		redirect('/')
-	} else {
-		token = tokenBool
-	}
-	console.log('URL To call: ' + IngressAPI + 'token used' + token)
-	axios.put(
-		IngressAPI + '/new-department',
-		{
-			building_name: buildingName,
-			old_department_name: oldDepartmentName,
-			new_department_name: newDepartmentName,
-			sessionToken: token,
-		})
-	.then((res)=>{
-		console.log(res.data)
-	}).catch((error) => {
-		console.log(error)
-	})
-}
-
-const deleteBuilding = ( name: string) =>  {
-
-
-	var token: string = ""
-	var tokenBool = sessionStorage.getItem("TOKEN")
-	if (tokenBool == null) {
-		redirect('/')
-	} else {
-		token = tokenBool
-	}
-	console.log('URL To call: ' + IngressAPI + 'token used' + token)
-	axios.delete(
-		IngressAPI + '/new-building',
-		{
-		data:{
-			building_name: name,
-			sessionToken: token,
-			}
-		})
-	.then((res)=>{
-		console.log(res.data)
-	}).catch((error) => {
-		console.log(error)
-	})
-}
-const deleteDepartment= ( name: string) =>  {
-
-
-	var token: string = ""
-	var tokenBool = sessionStorage.getItem("TOKEN")
-	if (tokenBool == null) {
-		redirect('/')
-	} else {
-		token = tokenBool
-	}
-	console.log('URL To call: ' + IngressAPI + 'token used' + token)
-	axios.delete(
-		IngressAPI + '/new-department',
-		{
-		data:{
-			dep_name: name,
-			sessionToken: token,
-			}
-		})
-	.then((res)=>{
-		console.log(res.data)
-	}).catch((error) => {
-		console.log(error)
-	})
-}
-
-  // GET THE DATA
-class BuildingDep {
-	buildingName: string = "";
-	departments: string = "";
-
-	constructor(buildingName: string, departments: string) {
-		this.buildingName = buildingName;
-		this.departments = departments;
-	}
-}
-
-async function fetchDataBuildingAndDepartment(): Promise<BuildingDep[]> {
-	var buiDep: BuildingDep[] = []
-	await axios.post(EgressAPI + '/buildDep',
-	{
-	sessionToken: sessionStorage.getItem('TOKEN')
-	}).then((res) => {
-		const buildingDepData = res.data.buildingDep;
-
-		for (const buildingName in buildingDepData) {
-			const departments = buildingDepData[buildingName];
-			if (Array.isArray(departments)) {
-				departments.forEach((department: any) => {
-					buiDep.push(new BuildingDep(buildingName, department.name));
-				});
-			}
-		}
-	}).catch((error) => {
-	console.log(error)
-	})
-
-	return buiDep
-}
-
-type BuildDepData = {
-	buildingDepartmentData: {
-		building: {
-			name: string;
-		};
-		departments: {
-			name: string;
-		}[];
-	}[];
-};
-
-type SetBuildDepData = React.Dispatch<React.SetStateAction<{
-	buildingDepartmentData: {
-		building: {
-			name: string;
-		};
-		departments: {
-			name: string;
-		}[];
-	}[];
-}>>;
-
-const usePopoutState = () => {
-	const [isPopoutOpen, setPopoutOpen] = useState(false);
-	const [whatOperation, setOperation] = useState(0);
-	const [assignValue, setassignValue] = useState(0);
-
-
-
-	const handleOpenPopout = () => {
-	setPopoutOpen(true);
-	};
-
-	const handleClosePopout = () => {
-	setPopoutOpen(false);
-	};
-
-	const handleChangeOperation = (op:number) => {
-	setOperation(op);
-	};
-
-	return {
-	isPopoutOpen,
-	handleOpenPopout,
-	handleClosePopout,
-	whatOperation,
-	handleChangeOperation,
-	assignValue,
-	setassignValue,
-	};
-};
-
-
-interface ManagePopup {
-	handleChangeOperation: (op: number) => void;
-	setassignValue: React.Dispatch<React.SetStateAction<number>>;
-}
-interface DisplayBuildingDepartmentDataProps extends ManagePopup {
-	data: BuildDepData;
-	setData: SetBuildDepData;
-}
 
 
 export default BuildDepSubpage
\ No newline at end of file
diff --git a/Frontend/power-tracker/src/components/manageGateway.tsx b/Frontend/power-tracker/src/components/manageGateway.tsx
index a501f54..b01fd0d 100644
--- a/Frontend/power-tracker/src/components/manageGateway.tsx
+++ b/Frontend/power-tracker/src/components/manageGateway.tsx
@@ -57,9 +57,135 @@ function ManageGateways() {
             });
         });
     }, [setGatewayData]);
+    const [open, setOpen] = useState(false);
+
+    const handleClose = () => {
+        setOpen(false);
+    };
+
+    
+const addGateway = ( euiI: string, nameI: string) =>  {
+
+    var token: string = ""
+    var tokenBool = sessionStorage.getItem("TOKEN")
+    if (tokenBool == null) {
+        redirect('/')
+    } else {
+        token = tokenBool
+    }
+    console.log('URL To call: ' + IngressAPI + 'token used' + token)
+    axios.post(
+        IngressAPI + '/add-gateway',
+        {                
+            name:nameI,
+            eui:euiI,
+            sessionToken:token
+        })
+    .then((res)=>{
+        console.log(res.data)
+    }).catch((error) => {
+        console.log(error)
+        setOpen(true)
+    })
+}
+
+const editGateway= ( eui: string, oldEui: string, name: string, oldName: string) =>  {
+
+
+	var token: string = ""
+	var tokenBool = sessionStorage.getItem("TOKEN")
+	if (tokenBool == null) {
+		redirect('/')
+	} else {
+		token = tokenBool
+	}
+	console.log('URL To call: ' + IngressAPI + 'token used' + token)
+	axios.put(
+		IngressAPI + '/add-gateway',
+		{
+            name: name,
+			oldName: oldName,
+			eui: eui,
+			oldEui: oldEui,
+			sessionToken: token,
+		})
+	.then((res)=>{
+		console.log(res.data)
+	}).catch((error) => {
+		console.log(error)
+        setOpen(true)
+	})
+}
+
+const deleteGateway = ( eui: string) =>  {
+
+    var token: string = ""
+    var tokenBool = sessionStorage.getItem("TOKEN")
+    if (tokenBool == null) {
+        redirect('/')
+    } else {
+        token = tokenBool
+    }
+    console.log('URL To call: ' + IngressAPI + 'token used' + token)
+    axios.delete(
+        IngressAPI + '/add-gateway',
+        {   
+        	data:{
+                eui: eui,
+                sessionToken: token
+            }
+        })
+    .then((res)=>{
+        console.log(res.data)
+    }).catch((error) => {
+        console.log(error)
+        setOpen(true)
+    })
+}
+
+class Gateway {
+    eui_gate: string = "";
+    name: string = "";
+    constructor(eui_gate: string, name:string) {
+        this.eui_gate = eui_gate; this.name = name;
+    }
+}
+
+async function fetchDataGateway(): Promise<Gateway[]> {
+    var gateway: Gateway[] = []
+    await axios.post(EgressAPI + '/sensorGatewayData',
+    {
+        sessionToken: sessionStorage.getItem('TOKEN')
+    }).then((res) => {  
+        res.data.gateway.forEach((element: any) => {
+            gateway.push({
+            	eui_gate: element.eui_gate,
+            	name: element.name
+            })
+        });
+    }).catch((error) => {
+    	console.log(error)
+        setOpen(true)
+    })
+    return gateway 
+}
+
 
     return (
         <ResizablePanelGroup className='flex h-[100%]' direction="horizontal">
+            <AlertDialog open={open}>
+            <AlertDialogContent>
+            <AlertDialogHeader>
+                <AlertDialogTitle>Something went wrong</AlertDialogTitle>
+            </AlertDialogHeader>
+                <div>
+                    Please try again or check your connection
+                </div>
+            <AlertDialogFooter>
+                <AlertDialogCancel onClick={handleClose}>Close</AlertDialogCancel>
+            </AlertDialogFooter>
+            </AlertDialogContent>
+        </AlertDialog>
             <ResizablePanel minSize={72.5} >
                 {/* Title and search bar */}
 				<div className="w-[100%] h-[40px] flex justify-between content-center" style={{ marginTop: '5px' }}>
@@ -162,107 +288,6 @@ function ManageGateways() {
 }
 
 
-const addGateway = ( euiI: string, nameI: string) =>  {
-
-    var token: string = ""
-    var tokenBool = sessionStorage.getItem("TOKEN")
-    if (tokenBool == null) {
-        redirect('/')
-    } else {
-        token = tokenBool
-    }
-    console.log('URL To call: ' + IngressAPI + 'token used' + token)
-    axios.post(
-        IngressAPI + '/add-gateway',
-        {                
-            name:nameI,
-            eui:euiI,
-            sessionToken:token
-        })
-    .then((res)=>{
-        console.log(res.data)
-    }).catch((error) => {
-        console.log(error)
-    })
-}
-
-const editGateway= ( eui: string, oldEui: string, name: string, oldName: string) =>  {
-
-
-	var token: string = ""
-	var tokenBool = sessionStorage.getItem("TOKEN")
-	if (tokenBool == null) {
-		redirect('/')
-	} else {
-		token = tokenBool
-	}
-	console.log('URL To call: ' + IngressAPI + 'token used' + token)
-	axios.put(
-		IngressAPI + '/add-gateway',
-		{
-            name: name,
-			oldName: oldName,
-			eui: eui,
-			oldEui: oldEui,
-			sessionToken: token,
-		})
-	.then((res)=>{
-		console.log(res.data)
-	}).catch((error) => {
-		console.log(error)
-	})
-}
-
-const deleteGateway = ( eui: string) =>  {
-
-    var token: string = ""
-    var tokenBool = sessionStorage.getItem("TOKEN")
-    if (tokenBool == null) {
-        redirect('/')
-    } else {
-        token = tokenBool
-    }
-    console.log('URL To call: ' + IngressAPI + 'token used' + token)
-    axios.delete(
-        IngressAPI + '/add-gateway',
-        {   
-        	data:{
-                eui: eui,
-                sessionToken: token
-            }
-        })
-    .then((res)=>{
-        console.log(res.data)
-    }).catch((error) => {
-        console.log(error)
-    })
-}
-
-class Gateway {
-    eui_gate: string = "";
-    name: string = "";
-    constructor(eui_gate: string, name:string) {
-        this.eui_gate = eui_gate; this.name = name;
-    }
-}
-
-async function fetchDataGateway(): Promise<Gateway[]> {
-    var gateway: Gateway[] = []
-    await axios.post(EgressAPI + '/sensorGatewayData',
-    {
-        sessionToken: sessionStorage.getItem('TOKEN')
-    }).then((res) => {  
-        res.data.gateway.forEach((element: any) => {
-            gateway.push({
-            	eui_gate: element.eui_gate,
-            	name: element.name
-            })
-        });
-    }).catch((error) => {
-    	console.log(error)
-    })
-    return gateway 
-}
 
 
 export default ManageGateways
\ No newline at end of file
diff --git a/Frontend/power-tracker/src/components/manageProcesses.tsx b/Frontend/power-tracker/src/components/manageProcesses.tsx
index 5a56333..be50aa3 100644
--- a/Frontend/power-tracker/src/components/manageProcesses.tsx
+++ b/Frontend/power-tracker/src/components/manageProcesses.tsx
@@ -122,163 +122,13 @@ const ManageProcesses= () => {
     });
   }, [processDropDownId]);
 
-  return (
-    <div className="flex h-[100%]">
-      <div className='w-[1100px]'>
-        {/* Title and search bar */}
-        <div className="w-[100%] h-[40px] flex justify-between content-center" style={{ marginTop: '5px' }}>
-					<h1 className="scroll-m-20 text-2xl font-semibold tracking-tight">Processes</h1>
-					<Input 
-						className="h-[30px] w-[200px]" 
-						type="text" 
-						value={search} 
-						onChange={(event) => setSearch(event.target.value) } 
-						placeholder="Search.."
-					/>
-				</div>
-
-        <Separator className="mb-[10px]" />	
-
-        {/* New process button */}
-				<AlertDialog>
-					<AlertDialogTrigger> 
-						<Button className="w-[60px] h-[30px] mb-[10px] ml-[10px]" variant="default" size="icon" >
-							<Waypoints className="h-[20px]" />
-							<Plus className="h-[18px]" />
-						</Button>
-					</AlertDialogTrigger>
-					<AlertDialogContent>
-            <form onSubmit={(e) => {addProcess(e, nameInput, descriptionInput); }}>
-              <Input className="mb-[10px]" type="text" id="uname" value={nameInput} onChange={(event) => setNameInput(event.target.value)} placeholder="Process Name" required/>
-              <Textarea id="description" value={descriptionInput} onChange={(event) => setDescriptionInput(event.target.value)} placeholder="Description" required/>
-              <br/><br/>
-              <AlertDialogFooter>
-                <AlertDialogAction>
-                  <Button type='submit' onClick={() => {
-                    setProcessData(prevState => ({
-                      ...prevState,
-                      process: [
-                        ...prevState.process,
-                        {
-                          id: 0,
-                          name: nameInput,
-                          description: descriptionInput
-                        }
-                      ]
-                    }));
-                  }}>Submit Process!</Button>
-                </AlertDialogAction>
-                <AlertDialogCancel>Cancel</AlertDialogCancel>
-              </AlertDialogFooter>
-            </form>
-					</AlertDialogContent>
-				</AlertDialog>	
-
-        <Separator />	
+  const [open, setOpen] = useState(false);
 
-        <ul>
-          {processData.process.map((process, index) => (
-            <li>
-              <div className="buildingbar flex items-center">
-                <Separator orientation='vertical' className="mr-[5px]"/>
-                <div className='flex flex-row'>
-                  <Waypoints className="mx-[20px] mt-[2px]" />
-                  <strong><h4 className="scroll-m-20 text-xl font-semibold tracking-tight">{process.name}</h4></strong>
-                </div> 
-                <Separator orientation='vertical' className="mx-[5px]"/>
-                <div className="h-[100%] flex items-center justify-around">
-                <AlertDialog>
-                  <AlertDialogTrigger asChild>
-                    <Button className="h-[30px] w-[60px]" variant="outline" onClick={()=>{setText(process.name); setDesc(process.description)}}>Edit</Button>
-                  </AlertDialogTrigger>
-                  <AlertDialogContent> 
-                    <AlertDialogHeader>Edit {process.name}</AlertDialogHeader>
-                    <form onSubmit={(e)=>{e.preventDefault();editProcess(process.name, text ,process.description,desc); setText(""); setDesc("");}}>
-                      <label>Process Name</label>
-                      <Input className="mb-[20px]" type="text" placeholder="Process Name" value={text} onChange={(event) => setText(event.target.value)} required/>
-                      <label>Description</label>
-                      <Input className="mb-[20px]" type="text" placeholder="Description" value={desc} onChange={(event) => setDesc(event.target.value)} required/>
-                      <AlertDialogAction type='submit'>Confirm</AlertDialogAction>
-                      <AlertDialogCancel onClick={()=>{setText(""); setDesc("");}}>Cancel</AlertDialogCancel>
-                    </form>
-                  </AlertDialogContent>
-                </AlertDialog>
-                <AlertDialog>
-                  <AlertDialogTrigger asChild>
-                    <Button className="h-[30px] w-[60px]" variant="outline" >Delete</Button>
-                  </AlertDialogTrigger>
-                  <AlertDialogContent> 
-                    <AlertDialogHeader>Are you sure about deleting {process.name}?</AlertDialogHeader>
-                    <AlertDialogAction onClick={()=>deleteProcess(process.name, process.description)}>DELETE</AlertDialogAction>
-                    <AlertDialogCancel>Cancel</AlertDialogCancel>
-                  </AlertDialogContent>
-                </AlertDialog>
-                </div>
-                <Separator orientation='vertical' className="ml-[5px]"/>
-              </div>
-              <Separator />	
-            </li>
-          ))}
-        </ul>
-
-        <div className="center">
-          <AlertDialog>
-            <AlertDialogTrigger asChild>
-              <Button size="sm" variant="outline" onClick={()=>{}}>Add machine to process</Button>
-            </AlertDialogTrigger>
-            <AlertDialogContent>
-              <AlertDialogHeader>
-                <AlertDialogTitle>Add machine to process</AlertDialogTitle>
-                <label>Process</label>
-                <select onChange={(e) => { const selectedIndex = e.target.selectedIndex; setProcessDropDown(e.target.value); setProcessDropDownId(processData.process[selectedIndex-1].id)}} value={processDropDown}>
-                  <option value={""}>Select an option</option>
-                  {processData.process.map((pro, index) => (
-                    pro.name !== "" ? (
-                      <option key={index} value={pro.name}>
-                        {pro.name} 
-                      </option>
-                    ) : null
-                  ))}
-                </select>
-                {processDropDown !== "" && (
-                  <div>
-                    {processMachineData.processMachine.map((element, index) => (
-                      <div key={index}>
-                        <input
-                          type="checkbox"
-                          checked={element.added}
-                          onChange={() => {
-                            const updatedProcessMachineData = [...processMachineData.processMachine];
-                            updatedProcessMachineData[index].added = !element.added;
-                            setProcessMachineData({
-                              ...processMachineData,
-                              processMachine: updatedProcessMachineData
-                            });
-                          }}
-                        />
-                        {element.machineEUI}  {element.machineName}
-                        <br/>
-                      </div>
-                    ))}
-                  </div>
-                )}
-              </AlertDialogHeader>
-              <AlertDialogFooter>
-                <AlertDialogAction type='submit' onClick={()=>{handleSave2(processMachineData, processMachineData2, processDropDownId); console.log(processDropDownId)}}>Save</AlertDialogAction>
-                <AlertDialogCancel>Cancel</AlertDialogCancel>
-              </AlertDialogFooter>
-            </AlertDialogContent>
-          </AlertDialog>
-        </div>
-      </div>
-      <Separator className='mx-10' orientation="vertical"/> {/* Needs parent container to be set to 100% height for it to work as it takes on the height of parent container */}
-      <div className="w-[400px]">
-
-			</div>
-    </div>
-  );
-};
+  const handleClose = () => {
+      setOpen(false);
+  };
 
+  
 interface Process {
   process: {
       id: number,
@@ -358,6 +208,7 @@ const addProcess = (e: React.FormEvent<HTMLFormElement>, name: string, descripti
     console.log(res.data)
   }).catch((error) => {
     console.log(error)
+    setOpen(true)
   })
 }
 
@@ -428,6 +279,7 @@ const editProcessMachine = ( realData:  ProcessMachineInsert[], oldData: Process
     console.log(res.data)
   }).catch((error) => {
     console.log(error)
+    setOpen(true)
   })
 }
 
@@ -452,6 +304,7 @@ const editProcess = ( oldName: string, newName: string, oldDescription: string,
     console.log(res.data)
   }).catch((error) => {
     console.log(error)
+    setOpen(true)
   })
 }
 const deleteProcess = (name: string, description:string) =>  {
@@ -477,6 +330,7 @@ const deleteProcess = (name: string, description:string) =>  {
     console.log(res.data)
   }).catch((error) => {
     console.log(error)
+    setOpen(true)
   })
 }
 
@@ -505,6 +359,7 @@ async function fetchDataProcess(): Promise<Processes[]> {
     });
   }).catch((error) => {
     console.log(error)
+    setOpen(true)
   })
   return processArrray 
 }
@@ -544,5 +399,176 @@ async function fetchDataProcessMachine(processId: number): Promise<ProcessesMach
   }
 }
 
+  return (
+    <div className="flex h-[100%]">
+      <AlertDialog open={open}>
+            <AlertDialogContent>
+            <AlertDialogHeader>
+                <AlertDialogTitle>Something went wrong</AlertDialogTitle>
+            </AlertDialogHeader>
+                <div>
+                    Please try again or check your connection
+                </div>
+            <AlertDialogFooter>
+                <AlertDialogCancel onClick={handleClose}>Close</AlertDialogCancel>
+            </AlertDialogFooter>
+            </AlertDialogContent>
+        </AlertDialog>
+      <div className='w-[1100px]'>
+        {/* Title and search bar */}
+        <div className="w-[100%] h-[40px] flex justify-between content-center" style={{ marginTop: '5px' }}>
+					<h1 className="scroll-m-20 text-2xl font-semibold tracking-tight">Processes</h1>
+					<Input 
+						className="h-[30px] w-[200px]" 
+						type="text" 
+						value={search} 
+						onChange={(event) => setSearch(event.target.value) } 
+						placeholder="Search.."
+					/>
+				</div>
+
+        <Separator className="mb-[10px]" />	
+
+        {/* New process button */}
+				<AlertDialog>
+					<AlertDialogTrigger> 
+						<Button className="w-[60px] h-[30px] mb-[10px] ml-[10px]" variant="default" size="icon" >
+							<Waypoints className="h-[20px]" />
+							<Plus className="h-[18px]" />
+						</Button>
+					</AlertDialogTrigger>
+					<AlertDialogContent>
+            <form onSubmit={(e) => {addProcess(e, nameInput, descriptionInput); }}>
+              <Input className="mb-[10px]" type="text" id="uname" value={nameInput} onChange={(event) => setNameInput(event.target.value)} placeholder="Process Name" required/>
+              <Textarea id="description" value={descriptionInput} onChange={(event) => setDescriptionInput(event.target.value)} placeholder="Description" required/>
+              <br/><br/>
+              <AlertDialogFooter>
+                <AlertDialogAction>
+                  <Button type='submit' onClick={() => {
+                    setProcessData(prevState => ({
+                      ...prevState,
+                      process: [
+                        ...prevState.process,
+                        {
+                          id: 0,
+                          name: nameInput,
+                          description: descriptionInput
+                        }
+                      ]
+                    }));
+                  }}>Submit Process!</Button>
+                </AlertDialogAction>
+                <AlertDialogCancel>Cancel</AlertDialogCancel>
+              </AlertDialogFooter>
+            </form>
+					</AlertDialogContent>
+				</AlertDialog>	
+
+        <Separator />	
+
+        <ul>
+          {processData.process.map((process, index) => (
+            <li>
+              <div className="buildingbar flex items-center">
+                <Separator orientation='vertical' className="mr-[5px]"/>
+                <div className='flex flex-row'>
+                  <Waypoints className="mx-[20px] mt-[2px]" />
+                  <strong><h4 className="scroll-m-20 text-xl font-semibold tracking-tight">{process.name}</h4></strong>
+                </div> 
+                <Separator orientation='vertical' className="mx-[5px]"/>
+                <div className="h-[100%] flex items-center justify-around">
+                <AlertDialog>
+                  <AlertDialogTrigger asChild>
+                    <Button className="h-[30px] w-[60px]" variant="outline" onClick={()=>{setText(process.name); setDesc(process.description)}}>Edit</Button>
+                  </AlertDialogTrigger>
+                  <AlertDialogContent> 
+                    <AlertDialogHeader>Edit {process.name}</AlertDialogHeader>
+                    <form onSubmit={(e)=>{e.preventDefault();editProcess(process.name, text ,process.description,desc); setText(""); setDesc("");}}>
+                      <label>Process Name</label>
+                      <Input className="mb-[20px]" type="text" placeholder="Process Name" value={text} onChange={(event) => setText(event.target.value)} required/>
+                      <label>Description</label>
+                      <Input className="mb-[20px]" type="text" placeholder="Description" value={desc} onChange={(event) => setDesc(event.target.value)} required/>
+                      <AlertDialogAction type='submit'>Confirm</AlertDialogAction>
+                      <AlertDialogCancel onClick={()=>{setText(""); setDesc("");}}>Cancel</AlertDialogCancel>
+                    </form>
+                  </AlertDialogContent>
+                </AlertDialog>
+                <AlertDialog>
+                  <AlertDialogTrigger asChild>
+                    <Button className="h-[30px] w-[60px]" variant="outline" >Delete</Button>
+                  </AlertDialogTrigger>
+                  <AlertDialogContent> 
+                    <AlertDialogHeader>Are you sure about deleting {process.name}?</AlertDialogHeader>
+                    <AlertDialogAction onClick={()=>deleteProcess(process.name, process.description)}>DELETE</AlertDialogAction>
+                    <AlertDialogCancel>Cancel</AlertDialogCancel>
+                  </AlertDialogContent>
+                </AlertDialog>
+                </div>
+                <Separator orientation='vertical' className="ml-[5px]"/>
+              </div>
+              <Separator />	
+            </li>
+          ))}
+        </ul>
+
+        <div className="center">
+          <AlertDialog>
+            <AlertDialogTrigger asChild>
+              <Button size="sm" variant="outline" onClick={()=>{}}>Add machine to process</Button>
+            </AlertDialogTrigger>
+            <AlertDialogContent>
+              <AlertDialogHeader>
+                <AlertDialogTitle>Add machine to process</AlertDialogTitle>
+                <label>Process</label>
+                <select onChange={(e) => { const selectedIndex = e.target.selectedIndex; setProcessDropDown(e.target.value); setProcessDropDownId(processData.process[selectedIndex-1].id)}} value={processDropDown}>
+                  <option value={""}>Select an option</option>
+                  {processData.process.map((pro, index) => (
+                    pro.name !== "" ? (
+                      <option key={index} value={pro.name}>
+                        {pro.name} 
+                      </option>
+                    ) : null
+                  ))}
+                </select>
+                {processDropDown !== "" && (
+                  <div>
+                    {processMachineData.processMachine.map((element, index) => (
+                      <div key={index}>
+                        <input
+                          type="checkbox"
+                          checked={element.added}
+                          onChange={() => {
+                            const updatedProcessMachineData = [...processMachineData.processMachine];
+                            updatedProcessMachineData[index].added = !element.added;
+                            setProcessMachineData({
+                              ...processMachineData,
+                              processMachine: updatedProcessMachineData
+                            });
+                          }}
+                        />
+                        {element.machineEUI}  {element.machineName}
+                        <br/>
+                      </div>
+                    ))}
+                  </div>
+                )}
+              </AlertDialogHeader>
+              <AlertDialogFooter>
+                <AlertDialogAction type='submit' onClick={()=>{handleSave2(processMachineData, processMachineData2, processDropDownId); console.log(processDropDownId)}}>Save</AlertDialogAction>
+                <AlertDialogCancel>Cancel</AlertDialogCancel>
+              </AlertDialogFooter>
+            </AlertDialogContent>
+          </AlertDialog>
+        </div>
+      </div>
+      <Separator className='mx-10' orientation="vertical"/> {/* Needs parent container to be set to 100% height for it to work as it takes on the height of parent container */}
+      <div className="w-[400px]">
+
+			</div>
+    </div>
+  );
+};
+
+
 
 export default ManageProcesses
\ No newline at end of file
diff --git a/Frontend/power-tracker/src/pages/ManageSensors.tsx b/Frontend/power-tracker/src/pages/ManageSensors.tsx
index 0db22b6..a51833f 100644
--- a/Frontend/power-tracker/src/pages/ManageSensors.tsx
+++ b/Frontend/power-tracker/src/pages/ManageSensors.tsx
@@ -132,6 +132,7 @@ function ManageSensors() {
             console.log(res.data)
         }).catch((error) => {
             console.log(error)
+            setOpen(true)
         })
     }
 
@@ -173,6 +174,7 @@ function ManageSensors() {
             console.log(res.data)
         }).catch((error) => {
             console.log(error)
+            setOpen(true)
         })
     }
 
@@ -204,6 +206,7 @@ function ManageSensors() {
         }
     }).catch((error) => {
         console.log(error)
+        setOpen(true)
     })
 
     return buiDep 
@@ -295,6 +298,7 @@ function ManageSensors() {
             });
         }).catch((error) => {
           console.log(error)
+          setOpen(true)
         })
         console.log(sensorArray)
         return sensorArray 
@@ -336,6 +340,7 @@ function ManageSensors() {
             console.log(res.data)
         }).catch((error) => {
             console.log(error)
+            setOpen(true)
         })
       }
       
@@ -373,11 +378,29 @@ function ManageSensors() {
         setSortDirection('asc');
         }
     };
+    const [open, setOpen] = useState(false);
+
+    const handleClose = () => {
+        setOpen(false);
+    };
 
     return(
         <>
         <TopBar></TopBar>
         <main>
+        <AlertDialog open={open}>
+            <AlertDialogContent>
+            <AlertDialogHeader>
+                <AlertDialogTitle>Something went wrong</AlertDialogTitle>
+            </AlertDialogHeader>
+                <div>
+                    Please try again or check your connection
+                </div>
+            <AlertDialogFooter>
+                <AlertDialogCancel onClick={handleClose}>Close</AlertDialogCancel>
+            </AlertDialogFooter>
+            </AlertDialogContent>
+        </AlertDialog>
             <div className='leftbar'>
                 <div className='w-[100%] rounded-md border shadow-md pl-[10px] flex items-center justify-between'>
                     <p>Add Sensor</p>
diff --git a/Frontend/power-tracker/src/pages/adminUserConfig.tsx b/Frontend/power-tracker/src/pages/adminUserConfig.tsx
index 4398d0e..374a5de 100644
--- a/Frontend/power-tracker/src/pages/adminUserConfig.tsx
+++ b/Frontend/power-tracker/src/pages/adminUserConfig.tsx
@@ -66,6 +66,11 @@ const s_schema = z.object({
 
 // MAIN COMPONENT
 function UserConfig() {
+  const [open, setOpen] = useState(false);
+
+  const handleClose = () => {
+      setOpen(false);
+  };
 
   const [userData, setUserData] = useState<UserData>({ Users: [] });
   const [search, setSearch] = useState("");
@@ -141,11 +146,215 @@ function UserConfig() {
         setSortDirection('asc');
         }
     };
+
+  
+//ADD NEW DATA
+const addUser = ( firstName: string, lastName: string, email: string, password: string, permission: number) =>  {
+
+  var token: string = ""
+  var tokenBool = sessionStorage.getItem("TOKEN")
+  if (tokenBool == null) {
+      redirect('/')
+  } else {
+      token = tokenBool
+  }
+  axios.post(
+    IngressAPI + '/new-user',
+    {     
+      sessionToken: token, 
+      userData: {
+        id:         0,
+        email:       email,
+        first_name:   firstName,
+        last_name:    lastName,
+        password:    password,
+        permission:  permission
+      }          
+    })
+  .then((res)=>{
+      console.log(res.data)
+  }).catch((error) => {
+      console.log(error)
+      setOpen(true)
+  })
+}
+
+///EDIT THE DATA
+const editUser = ( id: number, firstName: string, lastName: string, email: string, password: string, permission: number) =>  {
+  
+  var token: string = ""
+  var tokenBool = sessionStorage.getItem("TOKEN")
+  if (tokenBool == null) {
+    redirect('/')
+  } else {
+    token = tokenBool
+  }
+  axios.put(
+    IngressAPI + '/new-user',
+    {     
+      sessionToken: token, 
+      userData: {
+        id:         id,
+        email:       email,
+        first_name:   firstName,
+        last_name:    lastName,
+        password:    password,
+        permission:  permission
+      }          
+    })
+  .then((res)=>{
+    console.log(res.data)
+  }).catch((error) => {
+    console.log(error)
+    setOpen(true)
+  })
+}
+const deleteUser = ( id: number) =>  {
+
+
+  var token: string = ""
+  var tokenBool = sessionStorage.getItem("TOKEN")
+  if (tokenBool == null) {
+    redirect('/')
+  } else {
+    token = tokenBool
+  }
+  axios.delete(
+    IngressAPI + '/new-user',
+    {   
+      data:{
+        sessionToken: token,
+        userID: id
+      }
+    })
+  .then((res)=>{
+    console.log(res.data)
+  }).catch((error) => {
+    console.log(error)
+    setOpen(true)
+  })
+}
+
+async function fetchData(): Promise<UserData>{
+  var data: UserData = { Users: [] };
+  await axios.post(EgressAPI + '/userData',
+  {
+    sessionToken: sessionStorage.getItem('TOKEN')
+  }).then((res) => {
+    // extract data from response
+    res.data.Users.forEach((user: any) => {
+      data.Users.push({id: user.id, FirstName: user.first_name, email: user.email, LastName: user.last_name, permission: user.permission})
+    })
+    console.log(res.data)
+  }).catch((error) => {
+    console.log(error)
+    setOpen(true)
+  })
+  return data
+}
+
+const permissions: Permission[] = [
+  { value: 0, label: 'Admin' },
+  { value: 1, label: 'EnøkSuperuser' },
+  { value: 2, label: 'Employee' },
+];
+
+const translatePermissionValue = (value: number): string => {
+  const matchingPermission = permissions.find(permission => permission.value === value);
+
+  return matchingPermission ? matchingPermission.label : 'Unknown';
+};
+
+//Classes and interfaces here
+
+//Enum for which operation is used so easy implementation later on
+enum Operation {
+  add = 0,
+  edit = 1,
+  delete = 2,
+}
+// interface for user value from api
+interface User {
+  id: number,
+  email: string,
+  FirstName: string,
+  LastName: string,
+  permission: number
+}
+// interface for data from api
+interface UserData {
+  Users: User[]
+}
+
+//STUFF FOR SHOWING THE GET DATA AND MORE
+interface PermissionDropDownProps {
+  selectedValue: number;
+  onChange: (value: number) => void;
+}
+
+interface Permission {
+  value: number;
+  label: string;
+}
+type Users = {
+  id: number;
+  email: string;
+  firstName: string;
+  lastName: string;
+  password: string;
+  permission: number;
+}
+interface ManageUsersEdit {
+  isPopoutOpen: boolean;
+  handleClosePopout: () => void;
+  handleOpenPopout: () => void;
+  handleChangeOperation: (op: number) => void;
+  setassignValue: React.Dispatch<React.SetStateAction<number>>;
+  usersData: {
+    users: {
+      id: number;
+      email: string;
+      FirstName: string;
+      LastName: string;
+      permission: number;
+    }[];
+  }
+}
+
+//THE STUFF ON THE POPOUT SCREEN
+interface ManageUsersProps {
+  handleClosePopout: () => void;
+  op: Operation;
+  assignValue: number;
+  usersData: {
+    users: {
+        id: number;
+        email: string;
+        FirstName: string;
+        LastName: string;
+        permission: number;
+    }[];
+  }
+}
+    
   // --------------------
   return (
     <>
       <TopBar></TopBar>
       <main>
+      <AlertDialog open={open}>
+            <AlertDialogContent>
+            <AlertDialogHeader>
+                <AlertDialogTitle>Something went wrong</AlertDialogTitle>
+            </AlertDialogHeader>
+                <div>
+                    Please try again or check your connection
+                </div>
+            <AlertDialogFooter>
+                <AlertDialogCancel onClick={handleClose}>Close</AlertDialogCancel>
+            </AlertDialogFooter>
+            </AlertDialogContent>
+        </AlertDialog>
         <div className ="leftbar">
         <div className='w-[100%] rounded-md border shadow-md pl-[10px] flex items-center justify-between'>
                     <p>Add User</p>
@@ -430,190 +639,6 @@ function UserConfig() {
 
 
 
-//ADD NEW DATA
-const addUser = ( firstName: string, lastName: string, email: string, password: string, permission: number) =>  {
-
-  var token: string = ""
-  var tokenBool = sessionStorage.getItem("TOKEN")
-  if (tokenBool == null) {
-      redirect('/')
-  } else {
-      token = tokenBool
-  }
-  axios.post(
-    IngressAPI + '/new-user',
-    {     
-      sessionToken: token, 
-      userData: {
-        id:         0,
-        email:       email,
-        first_name:   firstName,
-        last_name:    lastName,
-        password:    password,
-        permission:  permission
-      }          
-    })
-  .then((res)=>{
-      console.log(res.data)
-  }).catch((error) => {
-      console.log(error)
-  })
-}
-
-///EDIT THE DATA
-const editUser = ( id: number, firstName: string, lastName: string, email: string, password: string, permission: number) =>  {
-  
-  var token: string = ""
-  var tokenBool = sessionStorage.getItem("TOKEN")
-  if (tokenBool == null) {
-    redirect('/')
-  } else {
-    token = tokenBool
-  }
-  axios.put(
-    IngressAPI + '/new-user',
-    {     
-      sessionToken: token, 
-      userData: {
-        id:         id,
-        email:       email,
-        first_name:   firstName,
-        last_name:    lastName,
-        password:    password,
-        permission:  permission
-      }          
-    })
-  .then((res)=>{
-    console.log(res.data)
-  }).catch((error) => {
-    console.log(error)
-  })
-}
-const deleteUser = ( id: number) =>  {
-
-
-  var token: string = ""
-  var tokenBool = sessionStorage.getItem("TOKEN")
-  if (tokenBool == null) {
-    redirect('/')
-  } else {
-    token = tokenBool
-  }
-  axios.delete(
-    IngressAPI + '/new-user',
-    {   
-      data:{
-        sessionToken: token,
-        userID: id
-      }
-    })
-  .then((res)=>{
-    console.log(res.data)
-  }).catch((error) => {
-    console.log(error)
-  })
-}
-
-async function fetchData(): Promise<UserData>{
-  var data: UserData = { Users: [] };
-  await axios.post(EgressAPI + '/userData',
-  {
-    sessionToken: sessionStorage.getItem('TOKEN')
-  }).then((res) => {
-    // extract data from response
-    res.data.Users.forEach((user: any) => {
-      data.Users.push({id: user.id, FirstName: user.first_name, email: user.email, LastName: user.last_name, permission: user.permission})
-    })
-    console.log(res.data)
-  }).catch((error) => {
-    console.log(error)
-  })
-  return data
-}
-
-const permissions: Permission[] = [
-  { value: 0, label: 'Admin' },
-  { value: 1, label: 'EnøkSuperuser' },
-  { value: 2, label: 'Employee' },
-];
-
-const translatePermissionValue = (value: number): string => {
-  const matchingPermission = permissions.find(permission => permission.value === value);
-
-  return matchingPermission ? matchingPermission.label : 'Unknown';
-};
-
-//Classes and interfaces here
-
-//Enum for which operation is used so easy implementation later on
-enum Operation {
-  add = 0,
-  edit = 1,
-  delete = 2,
-}
-// interface for user value from api
-interface User {
-  id: number,
-  email: string,
-  FirstName: string,
-  LastName: string,
-  permission: number
-}
-// interface for data from api
-interface UserData {
-  Users: User[]
-}
-
-//STUFF FOR SHOWING THE GET DATA AND MORE
-interface PermissionDropDownProps {
-  selectedValue: number;
-  onChange: (value: number) => void;
-}
-
-interface Permission {
-  value: number;
-  label: string;
-}
-type Users = {
-  id: number;
-  email: string;
-  firstName: string;
-  lastName: string;
-  password: string;
-  permission: number;
-}
-interface ManageUsersEdit {
-  isPopoutOpen: boolean;
-  handleClosePopout: () => void;
-  handleOpenPopout: () => void;
-  handleChangeOperation: (op: number) => void;
-  setassignValue: React.Dispatch<React.SetStateAction<number>>;
-  usersData: {
-    users: {
-      id: number;
-      email: string;
-      FirstName: string;
-      LastName: string;
-      permission: number;
-    }[];
-  }
-}
-
-//THE STUFF ON THE POPOUT SCREEN
-interface ManageUsersProps {
-  handleClosePopout: () => void;
-  op: Operation;
-  assignValue: number;
-  usersData: {
-    users: {
-        id: number;
-        email: string;
-        FirstName: string;
-        LastName: string;
-        permission: number;
-    }[];
-  }
-}
 
 export default UserConfig;
 
diff --git a/Frontend/power-tracker/src/pages/enoek.tsx b/Frontend/power-tracker/src/pages/enoek.tsx
index b7ce5fa..6a243ee 100644
--- a/Frontend/power-tracker/src/pages/enoek.tsx
+++ b/Frontend/power-tracker/src/pages/enoek.tsx
@@ -14,6 +14,17 @@ import Approved from '../components/enoekApprovedMeasures'
 import Rejected from '../components/enoekRejectedMeasures'
 import MyMeasures from '../components/enoekMyMeasures'
 import Jugde from '../components/enoekDecision'
+import {
+  AlertDialog,
+  AlertDialogAction,
+  AlertDialogCancel,
+  AlertDialogContent,
+  AlertDialogDescription,
+  AlertDialogFooter,
+  AlertDialogHeader,
+  AlertDialogTitle,
+  AlertDialogTrigger,
+} from "@/components/ui/alert-dialog"
 
 const EgressAPI = import.meta.env.VITE_EAPI_URL
 const IngressAPI = import.meta.env.VITE_IAPI_URL
@@ -52,59 +63,7 @@ class EnoekClass {
         this.approved = approved;
     }
   }
-  async function fetchData(): Promise<EnoekClass[]> {
-    var enoekData: EnoekClass[] = []
-    await axios.post(EgressAPI + '/enoek',
-    {
-      sessionToken: sessionStorage.getItem('TOKEN')
-    }).then((res) => {  
-
-      res.data.enoek.forEach((element: any) => {
-         enoekData.push({
-            id : element.id,
-            header : element.header,
-            description : element.description,
-            author : element.author,
-            start_date : element.start_date,
-            end_date : element.stop_date,
-            active : element.active,
-            process : element.process,
-            approved : element.approved,
-            })
-      });
-    }).catch((error) => {
-      console.log(error)
-    })
-    
-    return enoekData 
-  }
-
-
-  const deleteEnoek = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>, id: number) =>  {
-    e.preventDefault()
   
-    var token: string = ""
-    var tokenBool = sessionStorage.getItem("TOKEN")
-    if (tokenBool == null) {
-        redirect('/')
-    } else {
-        token = tokenBool
-    }
-    console.log('URL To call: ' + IngressAPI + 'token used' + token)
-    axios.delete(
-        IngressAPI + '/new-enoek',
-        {   
-          data:{
-            id: id,
-            sessionToken: token
-            }
-        })
-    .then((res)=>{
-        console.log(res.data)
-    }).catch((error) => {
-        console.log(error)
-    })
-  }
 
 const MainComponent= () =>{
     
@@ -137,6 +96,61 @@ const MainComponent= () =>{
           approved: null, // Nullable boolean
         }],
       });
+      async function fetchData(): Promise<EnoekClass[]> {
+        var enoekData: EnoekClass[] = []
+        await axios.post(EgressAPI + '/enoek',
+        {
+          sessionToken: sessionStorage.getItem('TOKEN')
+        }).then((res) => {  
+    
+          res.data.enoek.forEach((element: any) => {
+             enoekData.push({
+                id : element.id,
+                header : element.header,
+                description : element.description,
+                author : element.author,
+                start_date : element.start_date,
+                end_date : element.stop_date,
+                active : element.active,
+                process : element.process,
+                approved : element.approved,
+                })
+          });
+        }).catch((error) => {
+          console.log(error)
+          setOpen(true)
+        })
+        
+        return enoekData 
+      }
+    
+    
+      const deleteEnoek = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>, id: number) =>  {
+        e.preventDefault()
+      
+        var token: string = ""
+        var tokenBool = sessionStorage.getItem("TOKEN")
+        if (tokenBool == null) {
+            redirect('/')
+        } else {
+            token = tokenBool
+        }
+        console.log('URL To call: ' + IngressAPI + 'token used' + token)
+        axios.delete(
+            IngressAPI + '/new-enoek',
+            {   
+              data:{
+                id: id,
+                sessionToken: token
+                }
+            })
+        .then((res)=>{
+            console.log(res.data)
+        }).catch((error) => {
+            console.log(error)
+            setOpen(true)
+        })
+      }
   
     useEffect(() => {
 
@@ -154,12 +168,30 @@ if (permissionString !== null) {
     // Result is not null, it's safe to assign it to a variable
      permissionInt = parseInt(permissionString, 10);
 }
+const [open, setOpen] = useState(false);
+
+    const handleClose = () => {
+        setOpen(false);
+    };
 
     return (
         <>
           
             <TopBar></TopBar>
             <main>
+            <AlertDialog open={open}>
+            <AlertDialogContent>
+            <AlertDialogHeader>
+                <AlertDialogTitle>Something went wrong</AlertDialogTitle>
+            </AlertDialogHeader>
+                <div>
+                    Please try again or check your connection
+                </div>
+            <AlertDialogFooter>
+                <AlertDialogCancel onClick={handleClose}>Close</AlertDialogCancel>
+            </AlertDialogFooter>
+            </AlertDialogContent>
+        </AlertDialog>
               <div className='leftbar'>
                 
               {permissionInt!= undefined && permissionInt <= 2 && (
-- 
GitLab