moved data manipulation logic into Table

This commit is contained in:
Nick A 2024-10-22 14:15:18 -04:00
parent 2e93d82abf
commit 2fa983564b
4 changed files with 59 additions and 70 deletions

View File

@ -112,15 +112,6 @@ export const ResourceTable = ({ users }: { users: Resource[] }) => {
}; };
const columns = [ const columns = [
columnHelper.display({
id: "options",
cell: (props) => (
<RowOptionMenu
onDelete={() => {}}
onHide={() => hideUser(props.row.original.id)}
/>
),
}),
columnHelper.accessor("name", { columnHelper.accessor("name", {
header: () => ( header: () => (
<> <>
@ -157,7 +148,14 @@ export const ResourceTable = ({ users }: { users: Resource[] }) => {
<Bars2Icon className="inline align-top h-4" /> Program <Bars2Icon className="inline align-top h-4" /> Program
</> </>
), ),
cell: (info) => <TagsInput presetValue={info.getValue()} />, cell: (info) => (
<TagsInput
presetValue={info.getValue()}
presetOptions={presetOptions}
setPresetOptions={setPresetOptions}
getTagColor={getTagColor}
/>
),
}), }),
columnHelper.accessor("summary", { columnHelper.accessor("summary", {

View File

@ -1,50 +1,16 @@
import { PageLayout } from "@/components/PageLayout"; import { PageLayout } from "@/components/PageLayout";
import { RowOpenAction } from "@/components/Table/RowOpenAction"; import { RowOpenAction } from "@/components/Table/RowOpenAction";
import { RowOptionMenu } from "@/components/Table/RowOptionMenu";
import { Table } from "@/components/Table/Table"; import { Table } from "@/components/Table/Table";
import TagsInput from "@/components/TagsInput/Index"; import TagsInput from "@/components/TagsInput/Index";
import Resource from "@/utils/models/Resource"; import Resource from "@/utils/models/Resource";
import { createClient } from "@/utils/supabase/client";
import { Bars2Icon, BookmarkIcon } from "@heroicons/react/24/solid"; import { Bars2Icon, BookmarkIcon } from "@heroicons/react/24/solid";
import { ColumnDef, createColumnHelper } from "@tanstack/react-table"; import { ColumnDef, createColumnHelper } from "@tanstack/react-table";
import { useEffect, useState } from "react"; import { useState } from "react";
import { DataPoint } from "@/components/Table/Table";
export function ResourceTable({ resources }: { resources: Resource[] }) { export function ResourceTable({ resources }: { resources: Resource[] }) {
const columnHelper = createColumnHelper<Resource>(); const columnHelper = createColumnHelper<Resource>();
const [data, setData] = useState<DataPoint[]>([...resources]);
const [data, setData] = useState<Resource[]>([...resources]);
// TODO: Connect data manipulation methods to the database (deleteResource, hideResource, addResource)
const deleteUser = (userId: number) => {
console.log(data);
setData((currentData) =>
currentData.filter((user) => user.id !== userId)
);
};
const hideUser = (userId: number) => {
console.log(`Toggling visibility for user with ID: ${userId}`);
setData((currentData) => {
const newData = currentData
.map((user) => {
if (user.id === userId) {
return { ...user, visible: !user.visible };
}
return user;
})
.sort((a, b) =>
a.visible === b.visible ? 0 : a.visible ? -1 : 1
);
console.log(newData);
return newData;
});
};
const addUser = () => {
setData([...data]);
};
const [presetOptions, setPresetOptions] = useState([ const [presetOptions, setPresetOptions] = useState([
"administrator", "administrator",
@ -79,15 +45,6 @@ export function ResourceTable({ resources }: { resources: Resource[] }) {
}; };
const columns: ColumnDef<Resource, any>[] = [ const columns: ColumnDef<Resource, any>[] = [
columnHelper.display({
id: "options",
cell: (props) => (
<RowOptionMenu
onDelete={() => {}}
onHide={() => hideUser(props.row.original.id)}
/>
),
}),
columnHelper.accessor("name", { columnHelper.accessor("name", {
header: () => ( header: () => (
<> <>
@ -125,7 +82,12 @@ export function ResourceTable({ resources }: { resources: Resource[] }) {
</> </>
), ),
cell: (info) => ( cell: (info) => (
<TagsInput presetValue={info.getValue()} /> <TagsInput
presetValue={info.getValue()}
presetOptions={presetOptions}
setPresetOptions={setPresetOptions}
getTagColor={getTagColor}
/>
), ),
}), }),
@ -145,7 +107,7 @@ export function ResourceTable({ resources }: { resources: Resource[] }) {
<div className="min-h-screen flex flex-col"> <div className="min-h-screen flex flex-col">
{/* icon + title */} {/* icon + title */}
<PageLayout title="Resources" icon={<BookmarkIcon />}> <PageLayout title="Resources" icon={<BookmarkIcon />}>
<Table initialData={resources} columns={columns}/> <Table data={resources} setData={setData} columns={columns}/>
</PageLayout> </PageLayout>
</div> </div>
); );

View File

@ -1,18 +1,34 @@
import { Row, ColumnDef, useReactTable, getCoreRowModel, flexRender } from "@tanstack/react-table"; import {
Row,
ColumnDef,
useReactTable,
getCoreRowModel,
flexRender,
createColumnHelper
} from "@tanstack/react-table";
import { import {
ChangeEvent, ChangeEvent,
useState, useState,
useEffect, useEffect,
Key, Key,
Dispatch,
SetStateAction
} from "react"; } from "react";
import { TableAction } from "./TableAction"; import { TableAction } from "./TableAction";
import { import { PlusIcon } from "@heroicons/react/24/solid";
PlusIcon,
} from "@heroicons/react/24/solid";
import { rankItem } from "@tanstack/match-sorter-utils"; import { rankItem } from "@tanstack/match-sorter-utils";
import Resource from "@/utils/models/Resource"; import Resource from "@/utils/models/Resource";
import Service from "@/utils/models/Service"; import Service from "@/utils/models/Service";
import User from "@/utils/models/User" import User from "@/utils/models/User";
import { RowOptionMenu } from "./RowOptionMenu";
export type DataPoint = Resource | User | Service;
type TableProps = {
data: DataPoint[],
setData: Dispatch<SetStateAction<DataPoint[]>>
columns: ColumnDef<any, any>[]
};
// For search // For search
const fuzzyFilter = ( const fuzzyFilter = (
@ -31,15 +47,15 @@ const fuzzyFilter = (
return itemRank.passed; return itemRank.passed;
}; };
export const Table = ({ initialData, columns }: { initialData: Resource[], columns: ColumnDef<any, any>[] }) => { export const Table = ({ data, columns, setData }: TableProps) => {
const columnHelper = createColumnHelper<Resource>();
useEffect(() => { useEffect(() => {
const sortedData = [...initialData].sort((a, b) => const sortedData = [...data].sort((a, b) =>
a.visible === b.visible ? 0 : a.visible ? -1 : 1 a.visible === b.visible ? 0 : a.visible ? -1 : 1
); );
setData(sortedData); setData(sortedData);
}, [initialData]); }, [data, setData]);
const [data, setData] = useState<(Resource | User | Service)[]>([...initialData]);
// Data manipulation // Data manipulation
// TODO: Connect data manipulation methods to the database (deleteResource, hideResource, addResource) // TODO: Connect data manipulation methods to the database (deleteResource, hideResource, addResource)
@ -73,6 +89,19 @@ export const Table = ({ initialData, columns }: { initialData: Resource[], colum
setData([...data]); setData([...data]);
}; };
// Add data manipulation options to the first column
columns.unshift(
columnHelper.display({
id: "options",
cell: (props) => (
<RowOptionMenu
onDelete={() => deleteData(props.row.original.id)}
onHide={() => hideData(props.row.original.id)}
/>
),
})
)
// Searching // Searching
const [query, setQuery] = useState(""); const [query, setQuery] = useState("");
const handleSearchChange = (e: ChangeEvent) => { const handleSearchChange = (e: ChangeEvent) => {

View File

@ -7,7 +7,7 @@ import { CreateNewTagAction } from "./CreateNewTagAction";
interface TagsInputProps { interface TagsInputProps {
presetOptions: string[]; presetOptions: string[];
presetValue: string | string[]; presetValue: string | string[];
setPresetOptions: Dispatch<SetStateAction<string | string[]>>; setPresetOptions: Dispatch<SetStateAction<string[]>>;
getTagColor(tag: string): string; getTagColor(tag: string): string;
} }