diff --git a/compass/app/admin/page.tsx b/compass/app/admin/page.tsx index 15bf9c0..050a865 100644 --- a/compass/app/admin/page.tsx +++ b/compass/app/admin/page.tsx @@ -1,7 +1,7 @@ "use client"; import { PageLayout } from "@/components/PageLayout"; -import UserTable from "@/components/Table/UserIndex"; +import { Table } from "@/components/Table/Index" import User from "@/utils/models/User"; import { createClient } from "@/utils/supabase/client"; @@ -38,7 +38,7 @@ export default function Page() { <div className="min-h-screen flex flex-col"> {/* icon + title */} <PageLayout title="Users" icon={<UsersIcon />}> - <UserTable users={users} /> + <Table users={users} /> </PageLayout> </div> ); diff --git a/compass/app/admin_test/layout.tsx b/compass/app/admin_test/layout.tsx new file mode 100644 index 0000000..78bf6a6 --- /dev/null +++ b/compass/app/admin_test/layout.tsx @@ -0,0 +1,100 @@ +"use client"; + +import Sidebar from "@/components/Sidebar/Sidebar"; +import React, { useState } from "react"; +import { ChevronDoubleRightIcon } from "@heroicons/react/24/outline"; +import { createClient } from "@/utils/supabase/client"; +import { useRouter } from "next/navigation"; +import { useEffect } from "react"; +import User, { Role } from "@/utils/models/User"; +import Loading from "@/components/auth/Loading"; + +export default function RootLayout({ + children, +}: { + children: React.ReactNode; +}) { + const [isSidebarOpen, setIsSidebarOpen] = useState(false); + const router = useRouter(); + const [user, setUser] = useState<User>(); + + useEffect(() => { + async function getUser() { + const supabase = createClient(); + + const { data, error } = await supabase.auth.getUser(); + + console.log(data, error); + + if (error) { + console.log("Accessed admin page but not logged in"); + router.push("/auth/login"); + return; + } + + const userData = await fetch( + `${process.env.NEXT_PUBLIC_HOST}/api/user?uuid=${data.user.id}` + ); + + const user: User = await userData.json(); + + if (user.role !== Role.ADMIN) { + console.log( + `Accessed admin page but incorrect permissions: ${user.username} ${user.role}` + ); + router.push("/home"); + return; + } + + setUser(user); + } + + getUser(); + }, [router]); + + return ( + <div className="flex-row"> + {user ? ( + <div> + {/* button to open sidebar */} + <button + onClick={() => setIsSidebarOpen(!isSidebarOpen)} + className={`fixed z-20 p-2 text-gray-500 hover:text-gray-800 left-0`} + aria-label={"Open sidebar"} + > + { + !isSidebarOpen && ( + <ChevronDoubleRightIcon className="h-5 w-5" /> + ) // Icon for closing the sidebar + } + </button> + {/* sidebar */} + <div + className={`absolute inset-y-0 left-0 transform ${ + isSidebarOpen + ? "translate-x-0" + : "-translate-x-full" + } w-64 transition duration-300 ease-in-out`} + > + <Sidebar + setIsSidebarOpen={setIsSidebarOpen} + name={user.username} + email={user.email} + isAdmin={user.role === Role.ADMIN} + /> + </div> + {/* page ui */} + <div + className={`flex-1 transition duration-300 ease-in-out ${ + isSidebarOpen ? "ml-64" : "ml-0" + }`} + > + {children} + </div> + </div> + ) : ( + <Loading /> + )} + </div> + ); +} diff --git a/compass/app/admin_test/page.tsx b/compass/app/admin_test/page.tsx new file mode 100644 index 0000000..78f97fa --- /dev/null +++ b/compass/app/admin_test/page.tsx @@ -0,0 +1,46 @@ +"use client"; + +import { PageLayout } from "@/components/PageLayout"; +import { Table } from "@/components/Table/Index" +import UserTable from "@/components/Table/UserIndex"; +import User from "@/utils/models/User"; +import { createClient } from "@/utils/supabase/client"; + +import { UsersIcon } from "@heroicons/react/24/solid"; +import { useEffect, useState } from "react"; + +export default function Page() { + const [users, setUsers] = useState<User[]>([]); + + useEffect(() => { + async function getUser() { + const supabase = createClient(); + + const { data, error } = await supabase.auth.getUser(); + + if (error) { + console.log("Accessed admin page but not logged in"); + return; + } + + const userListData = await fetch( + `${process.env.NEXT_PUBLIC_HOST}/api/user/all?uuid=${data.user.id}` + ); + + const users: User[] = await userListData.json(); + + setUsers(users); + } + + getUser(); + }, []); + + return ( + <div className="min-h-screen flex flex-col"> + {/* icon + title */} + <PageLayout title="Users" icon={<UsersIcon />}> + <UserTable users={users} /> + </PageLayout> + </div> + ) +} diff --git a/compass/components/Table/Table.tsx b/compass/components/Table/Table.tsx index 4bd5d1c..9598134 100644 --- a/compass/components/Table/Table.tsx +++ b/compass/components/Table/Table.tsx @@ -54,17 +54,17 @@ const fuzzyFilter = ( * @param props.columns Column definitions made with Tanstack columnHelper */ export const Table = ({ data, setData, columns }: TableProps) => { - const columnHelper = createColumnHelper<Resource>(); + const columnHelper = createColumnHelper<DataPoint>(); useEffect(() => { const sortedData = [...data].sort((a, b) => a.visible === b.visible ? 0 : a.visible ? -1 : 1 ); - setData(sortedData); + setData(sortedData); }, [data, setData]); // Data manipulation - // TODO: Connect data manipulation methods to the database (deleteResource, hideResource, addResource) + // TODO: Connect data manipulation methods to the database (deleteData, hideData, addData) const deleteData = (dataId: number) => { console.log(data); setData((currentData) => diff --git a/compass/components/Table/UserIndex.tsx b/compass/components/Table/UserIndex.tsx index 30ec363..766780a 100644 --- a/compass/components/Table/UserIndex.tsx +++ b/compass/components/Table/UserIndex.tsx @@ -13,7 +13,7 @@ import { DataPoint } from "@/components/Table/Table"; * @param props.users List of users to be displayed by the table */ export default function UserTable({ users }: { users: User[] }) { - const columnHelper = createColumnHelper<User>(); + const columnHelper = createColumnHelper<User>(); const [data, setData] = useState<DataPoint[]>([...users]); const { presetOptions, setPresetOptions, getTagColor } = useTagsHandler([