From b836e66af75986e7201e755a73fc52620339eefc Mon Sep 17 00:00:00 2001 From: Stephen Date: Thu, 16 Nov 2023 12:17:48 +0700 Subject: [PATCH] memecah komponen data table dan dropdown shadcnui --- .../src/components/main/model/TableModel.ts | 24 +++++++ .../table/stories/BodyTable.stories.tsx | 33 ++++++++++ .../table/stories/DataTables.stories.tsx | 8 ++- .../table/stories/DropDownMenu.stories.tsx | 66 +++++++++++++++++++ .../table/stories/HeaderTable.stories.tsx | 34 ++++++++++ .../tableComponent/BodyTableComponent.tsx | 43 ++++++++++++ .../table/tableComponent/DataTable.tsx | 2 +- .../tableComponent/DropDownMenuComponent.tsx | 51 ++++++++++++++ .../tableComponent/HeaderTableComponent.tsx | 31 +++++++++ .../table/tableComponent/columns.tsx | 41 ++++++++++++ .../table/tableComponent/newDataTable.tsx | 26 ++++++++ 11 files changed, 357 insertions(+), 2 deletions(-) create mode 100644 front_end_portserver/src/components/main/model/TableModel.ts create mode 100644 front_end_portserver/src/components/table/stories/BodyTable.stories.tsx create mode 100644 front_end_portserver/src/components/table/stories/DropDownMenu.stories.tsx create mode 100644 front_end_portserver/src/components/table/stories/HeaderTable.stories.tsx create mode 100644 front_end_portserver/src/components/table/tableComponent/BodyTableComponent.tsx create mode 100644 front_end_portserver/src/components/table/tableComponent/DropDownMenuComponent.tsx create mode 100644 front_end_portserver/src/components/table/tableComponent/HeaderTableComponent.tsx create mode 100644 front_end_portserver/src/components/table/tableComponent/columns.tsx create mode 100644 front_end_portserver/src/components/table/tableComponent/newDataTable.tsx diff --git a/front_end_portserver/src/components/main/model/TableModel.ts b/front_end_portserver/src/components/main/model/TableModel.ts new file mode 100644 index 0000000..763d823 --- /dev/null +++ b/front_end_portserver/src/components/main/model/TableModel.ts @@ -0,0 +1,24 @@ +import { ColumnDef } from "@tanstack/react-table"; + +export type PortServerData = { + id : string; + info : string; + date : Date; + type : 'status' | 'result' | 'query'; +} + +export type HeaderTableProps = { + data: PortServerData[]; + columns: ColumnDef[]; + } + +export type DropDownComponentProps = { + label: string ; + type : string ; +} + +export type TableBodyProps = { + data: PortServerData[]; // Sesuaikan dengan tipe data sebenarnya + columns: ColumnDef[]; // Sesuaikan dengan tipe data sebenarnya + } + \ No newline at end of file diff --git a/front_end_portserver/src/components/table/stories/BodyTable.stories.tsx b/front_end_portserver/src/components/table/stories/BodyTable.stories.tsx new file mode 100644 index 0000000..c8a33bf --- /dev/null +++ b/front_end_portserver/src/components/table/stories/BodyTable.stories.tsx @@ -0,0 +1,33 @@ +import { Meta, StoryObj } from "@storybook/react"; +import { PortServerData } from "@/components/main/model/TableModel"; +import { TableBodyComponent } from "../tableComponent/BodyTableComponent"; +import { columns } from "../tableComponent/columns"; + +const data:PortServerData[] = [ + { id: "1", info: "Info 1", date: new Date("2023-10-30 15:26:04"), type: 'status' }, + { id: "2", info: "Info 2", date: new Date("2023-10-30 15:26:04"), type: 'result' }, + { id: "3", info: "Info 3", date: new Date("2023-10-30 15:26:04"), type: 'query' } +]; + +const meta = { + title: 'Component/Table/Body', + component: TableBodyComponent, + args: { + data: data, + columns: columns, + }, + parameters: { + // Optional parameter to center the component in the Canvas. More info: https://storybook.js.org/docs/react/configure/story-layout + layout: 'centered', + }, + +} satisfies Meta + +export default meta; +type Story = StoryObj + +export const PortServerBodyTables = (args: Story ) => { + return ( + + ) +} \ No newline at end of file diff --git a/front_end_portserver/src/components/table/stories/DataTables.stories.tsx b/front_end_portserver/src/components/table/stories/DataTables.stories.tsx index 54d877c..7f94b8e 100644 --- a/front_end_portserver/src/components/table/stories/DataTables.stories.tsx +++ b/front_end_portserver/src/components/table/stories/DataTables.stories.tsx @@ -1,11 +1,11 @@ import { Meta, StoryObj} from "@storybook/react"; import { DataTableDemo, columns, data } from "../tableComponent/DataTable"; +import DataTable from "../tableComponent/newDataTable"; const meta = { title: 'Component/Table', component: DataTableDemo, parameters: { - // Optional parameter to center the component in the Canvas. More info: https://storybook.js.org/docs/react/configure/story-layout layout: 'centered', }, tags: ['autodocs'], @@ -24,4 +24,10 @@ export const Datable = (args:Story) => { return( ) +} + +export const DataTable2 = (args: Story) => { + return ( + + ) } \ No newline at end of file diff --git a/front_end_portserver/src/components/table/stories/DropDownMenu.stories.tsx b/front_end_portserver/src/components/table/stories/DropDownMenu.stories.tsx new file mode 100644 index 0000000..c8f8c5c --- /dev/null +++ b/front_end_portserver/src/components/table/stories/DropDownMenu.stories.tsx @@ -0,0 +1,66 @@ +import { Meta, StoryObj } from '@storybook/react'; +import { DropDownMenuComponent } from '../tableComponent/DropDownMenuComponent'; + + +const meta = { + title: 'Component/Table/DropdownOption', + component: DropDownMenuComponent, + argTypes:{ + label: { + options: ["cog", "dot",], + control: { type: 'radio' }, + }, + type: { + options: ['status','query','result','head'], + control: {type: 'radio'}, + }, + }, + tags: ['autodocs'], + parameters: { + // Optional parameter to center the component in the Canvas. More info: https://storybook.js.org/docs/react/configure/story-layout + layout: 'centered', +}, +} satisfies Meta; + +export default meta + +type Story = StoryObj + +export const CogDropDown = () => { + return( + + ) +} + +export const DotDropDownStatus = (args: Story) => { + return( + + ) +} + +export const DotDropDownQuery = (args: Story) => { + return( + + ) +} + +export const DotDropDownResult = (args: Story) => { + return( + + ) +} \ No newline at end of file diff --git a/front_end_portserver/src/components/table/stories/HeaderTable.stories.tsx b/front_end_portserver/src/components/table/stories/HeaderTable.stories.tsx new file mode 100644 index 0000000..ead8de4 --- /dev/null +++ b/front_end_portserver/src/components/table/stories/HeaderTable.stories.tsx @@ -0,0 +1,34 @@ +import { Meta, StoryObj } from "@storybook/react"; +import { PortServerData } from "@/components/main/model/TableModel"; +import { TableHeaderComponent } from "../tableComponent/HeaderTableComponent"; +import { columns } from "../tableComponent/columns"; + +const data:PortServerData[] = [ + { id: "1", info: "Info 1", date: new Date("2023-10-30 15:26:04"), type: 'status' }, + { id: "2", info: "Info 2", date: new Date("2023-10-30 15:26:04"), type: 'result' }, + { id: "3", info: "Info 3", date: new Date("2023-10-30 15:26:04"), type: 'query' } +]; + +const meta = { + title: 'Component/Table/Header', + component: TableHeaderComponent, + + parameters: { + // Optional parameter to center the component in the Canvas. More info: https://storybook.js.org/docs/react/configure/story-layout + layout: 'centered', + }, + args: { + data: data, + columns: columns + } + +} satisfies Meta + +export default meta; +type Story = StoryObj + +export const PortServerHeadTables = (args: Story) => { + return ( + + ) +} \ No newline at end of file diff --git a/front_end_portserver/src/components/table/tableComponent/BodyTableComponent.tsx b/front_end_portserver/src/components/table/tableComponent/BodyTableComponent.tsx new file mode 100644 index 0000000..6001c36 --- /dev/null +++ b/front_end_portserver/src/components/table/tableComponent/BodyTableComponent.tsx @@ -0,0 +1,43 @@ +import { TableBody, TableRow, TableCell } from '@/components/ui/table'; +import { flexRender, getCoreRowModel, useReactTable } from '@tanstack/react-table'; +import { TableBodyProps } from '@/components/main/model/TableModel'; + + +export const TableBodyComponent = ({ data, columns }:TableBodyProps) => { + const table = useReactTable({ + data, + columns, + getCoreRowModel: getCoreRowModel(), + }) + return ( + + {table.getRowModel().rows?.length ? ( + table.getRowModel().rows.map((row) => ( + + {row.getVisibleCells().map((cell) => ( + + {flexRender( + cell.column.columnDef.cell, + cell.getContext() + )} + + ))} + + )) + ) : ( + + + No results. + + + ) + } + + ) +}; diff --git a/front_end_portserver/src/components/table/tableComponent/DataTable.tsx b/front_end_portserver/src/components/table/tableComponent/DataTable.tsx index ae00171..1756ed6 100644 --- a/front_end_portserver/src/components/table/tableComponent/DataTable.tsx +++ b/front_end_portserver/src/components/table/tableComponent/DataTable.tsx @@ -91,7 +91,7 @@ export const columns: ColumnDef[] = [ - + {}} > diff --git a/front_end_portserver/src/components/table/tableComponent/DropDownMenuComponent.tsx b/front_end_portserver/src/components/table/tableComponent/DropDownMenuComponent.tsx new file mode 100644 index 0000000..72bc39d --- /dev/null +++ b/front_end_portserver/src/components/table/tableComponent/DropDownMenuComponent.tsx @@ -0,0 +1,51 @@ +import { DropDownComponentProps } from "@/components/main/model/TableModel"; +import { CogIcon, DotIcon } from "../stories/Icon.stories" +import { Button } from "@/components/ui/button" +import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu" + + +export const DropDownMenuComponent = ({label, type}:DropDownComponentProps) => { + return ( + <> + + + + + + {type.toLowerCase() === 'status' && ( + {}} + > + Info + + )} + {type.toLowerCase() === 'result' && ( + <> + {}} >Raw Data + {}}>Result + {}}>Export + + )} + {type.toLowerCase() === 'query' && ( + <> + {}}>Raw Data + {}}>Query Response + {}}>Export + + )} + {type.toLowerCase() === 'head' && ( + {}}>Change Password + )} + + + + + ); + }; \ No newline at end of file diff --git a/front_end_portserver/src/components/table/tableComponent/HeaderTableComponent.tsx b/front_end_portserver/src/components/table/tableComponent/HeaderTableComponent.tsx new file mode 100644 index 0000000..cd68e29 --- /dev/null +++ b/front_end_portserver/src/components/table/tableComponent/HeaderTableComponent.tsx @@ -0,0 +1,31 @@ +import { HeaderTableProps } from "@/components/main/model/TableModel"; +import { TableHeader, TableRow, TableHead } from "@/components/ui/table"; +import { flexRender, getCoreRowModel, useReactTable } from '@tanstack/react-table'; + +export const TableHeaderComponent = ({ data, columns }:HeaderTableProps) => { + + const table = useReactTable({ + data, + columns, + getCoreRowModel: getCoreRowModel(), + }) + + return ( + + {table.getHeaderGroups().map((headerGroup: any) => ( + + {headerGroup.headers.map((header: any) => ( + + {header.isPlaceholder + ? null + : flexRender( + header.column.columnDef.header, + typeof header.getContext === 'function' ? header.getContext() : {} + )} + + ))} + + ))} + + ) +}; \ No newline at end of file diff --git a/front_end_portserver/src/components/table/tableComponent/columns.tsx b/front_end_portserver/src/components/table/tableComponent/columns.tsx new file mode 100644 index 0000000..7ba5404 --- /dev/null +++ b/front_end_portserver/src/components/table/tableComponent/columns.tsx @@ -0,0 +1,41 @@ +import { PortServerData } from "@/components/main/model/TableModel" +import { ColumnDef } from "@tanstack/react-table" +import { DateDisplay } from "./DateDisplay" +import { CogDropDown } from "../stories/DropDownMenu.stories" +import { DropDownMenuComponent } from "./DropDownMenuComponent" + +export const columns: ColumnDef[] = [ + { + accessorKey: "date", + header: "Date", + cell: ({ row }) => { + const date = new Date(row.getValue("date")) + return( +
+ +
+ ) + } + }, + { + accessorKey: "info", + header: "Info", + cell: ({ row }) => ( +
{row.getValue("info")}
+ ), + }, + { + id: "actions", + header:() => { + return( + + ) + }, + enableHiding: false, + cell: ({ row }) => { + const type = row.original + return ( + + )} + }, +] \ No newline at end of file diff --git a/front_end_portserver/src/components/table/tableComponent/newDataTable.tsx b/front_end_portserver/src/components/table/tableComponent/newDataTable.tsx new file mode 100644 index 0000000..411636b --- /dev/null +++ b/front_end_portserver/src/components/table/tableComponent/newDataTable.tsx @@ -0,0 +1,26 @@ +import { Table} from "@/components/ui/table"; +import { TableBodyComponent } from "./BodyTableComponent"; +import { TableHeaderComponent } from "./HeaderTableComponent"; +import { PortServerData } from "@/components/main/model/TableModel"; +import { ColumnDef } from "@tanstack/react-table"; + +interface DataTableprops { + data: PortServerData[]; + columns: ColumnDef[]; +} + +const DataTable = ({data, columns }:DataTableprops) => { + + return ( +
+
+ + + +
+
+
+ ); +}; + +export default DataTable; \ No newline at end of file