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;