mirror of
https://github.com/cssgunc/compass.git
synced 2025-04-20 18:40:17 -04:00
moved data manipulation logic into Table
This commit is contained in:
parent
2e93d82abf
commit
2fa983564b
|
@ -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", {
|
||||||
|
|
|
@ -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>
|
||||||
);
|
);
|
||||||
|
|
|
@ -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) => {
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user