diff --git a/compass/app/admin/page.tsx b/compass/app/admin/page.tsx index b1ec1e9..abe2a8c 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 { Table } from "@/components/Table/Index" +import UserTable from "@/components/Table/UserTable"; import User from "@/utils/models/User"; import { createClient } from "@/utils/supabase/client"; @@ -38,7 +38,7 @@ export default function Page() {
{/* icon + title */} }> - + ); diff --git a/compass/app/admin_test/layout.tsx b/compass/app/admin_test/layout.tsx deleted file mode 100644 index 78bf6a6..0000000 --- a/compass/app/admin_test/layout.tsx +++ /dev/null @@ -1,100 +0,0 @@ -"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(); - - 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 ( -
- {user ? ( -
- {/* button to open sidebar */} - - {/* sidebar */} -
- -
- {/* page ui */} -
- {children} -
-
- ) : ( - - )} -
- ); -} diff --git a/compass/app/admin_test/page.tsx b/compass/app/admin_test/page.tsx deleted file mode 100644 index 78f97fa..0000000 --- a/compass/app/admin_test/page.tsx +++ /dev/null @@ -1,46 +0,0 @@ -"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([]); - - 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 ( -
- {/* icon + title */} - }> - - -
- ) -} diff --git a/compass/app/resource/page.tsx b/compass/app/resource/page.tsx index ba641dc..58c028a 100644 --- a/compass/app/resource/page.tsx +++ b/compass/app/resource/page.tsx @@ -2,7 +2,7 @@ import { PageLayout } from "@/components/PageLayout"; import Resource from "@/utils/models/Resource"; -import ResourceTable from "@/components/Table/ResourceIndex"; +import ResourceTable from "@/components/Table/ResourceTable"; import { createClient } from "@/utils/supabase/client"; import { BookmarkIcon } from "@heroicons/react/24/solid"; diff --git a/compass/app/service/page.tsx b/compass/app/service/page.tsx index cb6fbe5..67d9456 100644 --- a/compass/app/service/page.tsx +++ b/compass/app/service/page.tsx @@ -1,7 +1,7 @@ "use client"; import { PageLayout } from "@/components/PageLayout"; -import ServiceTable from "@/components/Table/ServiceIndex"; +import ServiceTable from "@/components/Table/ServiceTable"; import Service from "@/utils/models/Service"; import { createClient } from "@/utils/supabase/client"; diff --git a/compass/components/Table/ResourceIndex.tsx b/compass/components/Table/ResourceTable.tsx similarity index 89% rename from compass/components/Table/ResourceIndex.tsx rename to compass/components/Table/ResourceTable.tsx index 6737dc4..b9b175f 100644 --- a/compass/components/Table/ResourceIndex.tsx +++ b/compass/components/Table/ResourceTable.tsx @@ -1,20 +1,23 @@ import { Bars2Icon } from "@heroicons/react/24/solid"; -import { useState } from "react"; +import { Dispatch, SetStateAction, useState } from "react"; import useTagsHandler from "@/components/TagsInput/TagsHandler"; import { ColumnDef, createColumnHelper } from "@tanstack/react-table"; -import { Table } from "@/components/Table/Table"; import { RowOpenAction } from "@/components/Table/RowOpenAction"; +import Table from "@/components/Table/Table"; import TagsInput from "@/components/TagsInput/Index"; import Resource from "@/utils/models/Resource"; -import { DataPoint } from "@/components/Table/Table"; + +type ResourceTableProps = { + data: Resource[], + setData: Dispatch> +} /** * Table componenet used for displaying resources * @param props.resources List of resources to be displayed by the table */ -export default function ResourceTable({ resources }: { resources: Resource[] }) { +export default function ResourceTable({ data, setData }: ResourceTableProps ) { const columnHelper = createColumnHelper(); - const [data, setData] = useState([...resources]); // TODO: Update preset options for resources const { presetOptions, setPresetOptions, getTagColor } = useTagsHandler([ @@ -23,7 +26,7 @@ export default function ResourceTable({ resources }: { resources: Resource[] }) "employee", ]) - const handleRowUpdate = (updatedRow: DataPoint) => { + const handleRowUpdate = (updatedRow: Resource) => { const dataIndex = data.findIndex((row) => row.id === updatedRow.id); if (dataIndex !== -1) { const updatedData = [...data]; diff --git a/compass/components/Table/ServiceIndex.tsx b/compass/components/Table/ServiceTable.tsx similarity index 85% rename from compass/components/Table/ServiceIndex.tsx rename to compass/components/Table/ServiceTable.tsx index a4b8d66..27fddb9 100644 --- a/compass/components/Table/ServiceIndex.tsx +++ b/compass/components/Table/ServiceTable.tsx @@ -1,20 +1,24 @@ import { Bars2Icon } from "@heroicons/react/24/solid"; -import { useState } from "react"; +import { Dispatch, SetStateAction } from "react"; import useTagsHandler from "@/components/TagsInput/TagsHandler"; import { ColumnDef, createColumnHelper } from "@tanstack/react-table"; -import { Table } from "@/components/Table/Table"; +import Table from "@/components/Table/Table"; import { RowOpenAction } from "@/components/Table/RowOpenAction"; import TagsInput from "@/components/TagsInput/Index"; import Service from "@/utils/models/Service"; -import { DataPoint } from "@/components/Table/Table"; +import DataPoint from "@/utils/models/DataPoint"; + +type ServiceTableProps = { + data: Service[], + setData: Dispatch> +} /** * Table componenet used for displaying services * @param props.services List of services to be displayed by the table */ -export default function ServiceTable({ services }: { services: Service[] }) { +export default function ServiceTable({ data, setData }: ServiceTableProps ) { const columnHelper = createColumnHelper(); - const [data, setData] = useState([...services]); // TODO: Update preset options for services const { presetOptions, setPresetOptions, getTagColor } = useTagsHandler([ @@ -23,7 +27,7 @@ export default function ServiceTable({ services }: { services: Service[] }) { "employee", ]) - const handleRowUpdate = (updatedRow: DataPoint) => { + const handleRowUpdate = (updatedRow: Service) => { const dataIndex = data.findIndex((row) => row.id === updatedRow.id); if (dataIndex !== -1) { const updatedData = [...data]; @@ -101,5 +105,5 @@ export default function ServiceTable({ services }: { services: Service[] }) { }), ]; - return
+ return data={data} setData={setData} columns={columns} /> }; diff --git a/compass/components/Table/Table.tsx b/compass/components/Table/Table.tsx index 9598134..a1f469c 100644 --- a/compass/components/Table/Table.tsx +++ b/compass/components/Table/Table.tsx @@ -17,17 +17,13 @@ import { import { TableAction } from "./TableAction"; import { PlusIcon } from "@heroicons/react/24/solid"; import { rankItem } from "@tanstack/match-sorter-utils"; -import Resource from "@/utils/models/Resource"; -import Service from "@/utils/models/Service"; -import User from "@/utils/models/User"; +import DataPoint from "@/utils/models/DataPoint"; import { RowOptionMenu } from "./RowOptionMenu"; -export type DataPoint = Resource | User | Service; - -type TableProps = { - data: DataPoint[], - setData: Dispatch> - columns: ColumnDef[] +type TableProps = { + data: T[], + setData: Dispatch>, + columns: ColumnDef[] }; // For search @@ -53,15 +49,14 @@ const fuzzyFilter = ( * @param props.setData State setter to be used for data manipulation methods * @param props.columns Column definitions made with Tanstack columnHelper */ -export const Table = ({ data, setData, columns }: TableProps) => { - const columnHelper = createColumnHelper(); - useEffect(() => { - const sortedData = [...data].sort((a, b) => - a.visible === b.visible ? 0 : a.visible ? -1 : 1 - ); - setData(sortedData); - }, [data, setData]); +export default function Table({ data, setData, columns }: TableProps) { + const columnHelper = createColumnHelper(); + useEffect(() => { + setData(prevData => prevData.sort((a, b) => + a.visible === b.visible ? 0 : a.visible ? -1 : 1 + )) + }, [setData]); // Data manipulation // TODO: Connect data manipulation methods to the database (deleteData, hideData, addData) diff --git a/compass/components/Table/UserIndex.tsx b/compass/components/Table/UserTable.tsx similarity index 88% rename from compass/components/Table/UserIndex.tsx rename to compass/components/Table/UserTable.tsx index 766780a..55c316a 100644 --- a/compass/components/Table/UserIndex.tsx +++ b/compass/components/Table/UserTable.tsx @@ -1,20 +1,23 @@ import { ArrowDownCircleIcon, AtSymbolIcon, Bars2Icon } from "@heroicons/react/24/solid"; -import { useState } from "react"; +import { Dispatch, SetStateAction } from "react"; import useTagsHandler from "@/components/TagsInput/TagsHandler"; import { ColumnDef, createColumnHelper } from "@tanstack/react-table"; -import { Table } from "@/components/Table/Table"; +import Table from "@/components/Table/Table"; import { RowOpenAction } from "@/components/Table/RowOpenAction"; import TagsInput from "@/components/TagsInput/Index"; import User from "@/utils/models/User"; -import { DataPoint } from "@/components/Table/Table"; + +type UserTableProps = { + data: User[], + setData: Dispatch> +} /** * Table componenet used for displaying users * @param props.users List of users to be displayed by the table */ -export default function UserTable({ users }: { users: User[] }) { +export default function UserTable({ data, setData }: UserTableProps ) { const columnHelper = createColumnHelper(); - const [data, setData] = useState([...users]); const { presetOptions, setPresetOptions, getTagColor } = useTagsHandler([ "administrator", @@ -22,7 +25,7 @@ export default function UserTable({ users }: { users: User[] }) { "employee", ]) - const handleRowUpdate = (updatedRow: DataPoint) => { + const handleRowUpdate = (updatedRow: User) => { const dataIndex = data.findIndex((row) => row.id === updatedRow.id); if (dataIndex !== -1) { const updatedData = [...data]; @@ -93,5 +96,5 @@ export default function UserTable({ users }: { users: User[] }) { }), ]; - return
+ return data={data} setData={setData} columns={columns}/> } diff --git a/compass/utils/models/DataPoint.ts b/compass/utils/models/DataPoint.ts new file mode 100644 index 0000000..5fd69d3 --- /dev/null +++ b/compass/utils/models/DataPoint.ts @@ -0,0 +1,6 @@ +interface DataPoint { + id: number; + visible: boolean; +} + +export default DataPoint; \ No newline at end of file diff --git a/compass/utils/models/Resource.ts b/compass/utils/models/Resource.ts index c6c029c..84951ee 100644 --- a/compass/utils/models/Resource.ts +++ b/compass/utils/models/Resource.ts @@ -1,6 +1,7 @@ import { Program } from "./User"; +import DataPoint from "./DataPoint"; -export default interface Resource { +export default interface Resource extends DataPoint { id: number; created_at: Date; name: string; diff --git a/compass/utils/models/Service.ts b/compass/utils/models/Service.ts index 5093c5f..600f734 100644 --- a/compass/utils/models/Service.ts +++ b/compass/utils/models/Service.ts @@ -1,6 +1,7 @@ import { Program } from "./User"; +import DataPoint from "./DataPoint"; -export default interface Service { +export default interface Service extends DataPoint { id: number; created_at: Date; name: string; diff --git a/compass/utils/models/User.ts b/compass/utils/models/User.ts index 0c55114..2f0abd3 100644 --- a/compass/utils/models/User.ts +++ b/compass/utils/models/User.ts @@ -1,3 +1,5 @@ +import DataPoint from "./DataPoint"; + export enum Program { ECONOMIC = "ECONOMIC", DOMESTIC = "DOMESTIC", @@ -10,7 +12,7 @@ export enum Role { VOLUNTEER = "VOLUNTEER", } -export default interface User { +export default interface User extends DataPoint { id: number; uuid: string; username: string;