diff --git a/packages/ui/src/index.ts b/packages/ui/src/index.ts index 34a0de26c..34eff7648 100644 --- a/packages/ui/src/index.ts +++ b/packages/ui/src/index.ts @@ -22,3 +22,4 @@ export * from "./favorite-star"; export * from "./loader"; export * from "./collapsible"; export * from "./popovers"; +export * from "./tables"; diff --git a/packages/ui/src/tables/index.ts b/packages/ui/src/tables/index.ts new file mode 100644 index 000000000..0e948df9e --- /dev/null +++ b/packages/ui/src/tables/index.ts @@ -0,0 +1 @@ +export * from "./table"; diff --git a/packages/ui/src/tables/table.stories.tsx b/packages/ui/src/tables/table.stories.tsx new file mode 100644 index 000000000..b780c49f1 --- /dev/null +++ b/packages/ui/src/tables/table.stories.tsx @@ -0,0 +1,61 @@ +import type { Meta, StoryObj } from "@storybook/react"; +import React from "react"; +import { Table } from "./table"; + +const meta: Meta = { + title: "Table", + component: Table, +}; + +export default meta; + +// types +type TTableData = { + id: string; + name: string; + age: number; +}; + +type Story = StoryObj>; + +// data +const tableData: TTableData[] = [ + { id: "1", name: "Ernest", age: 25 }, + { id: "2", name: "Ann", age: 30 }, + { id: "3", name: "Russell", age: 35 }, + { id: "4", name: "Verna", age: 40 }, +]; + +const tableColumns = [ + { + key: "id", + content: "Id", + tdRender: (rowData: TTableData) => {rowData.id}, + }, + { + key: "name", + content: "Name", + tdRender: (rowData: TTableData) => {rowData.name}, + }, + { + key: "age", + content: "Age", + tdRender: (rowData: TTableData) => {rowData.age}, + }, +]; + +// stories +export const Default: Story = { + args: { + data: tableData, + columns: tableColumns, + keyExtractor: (rowData) => rowData.id, + tableClassName: "bg-gray-100", + tHeadClassName: "bg-gray-200", + tHeadTrClassName: "text-gray-600 text-left text-sm font-medium", + thClassName: "font-medium", + tBodyClassName: "bg-gray-100", + tBodyTrClassName: "text-gray-600", + tdClassName: "font-medium", + }, +}; diff --git a/packages/ui/src/tables/table.tsx b/packages/ui/src/tables/table.tsx new file mode 100644 index 000000000..7d903c77f --- /dev/null +++ b/packages/ui/src/tables/table.tsx @@ -0,0 +1,48 @@ +import React from "react"; +// helpers +import { cn } from "../../helpers"; +// types +import { TTableData } from "./types"; + +export const Table = (props: TTableData) => { + const { + data, + columns, + keyExtractor, + tableClassName = "", + tHeadClassName = "", + tHeadTrClassName = "", + thClassName = "", + tBodyClassName = "", + tBodyTrClassName = "", + tdClassName = "", + } = props; + + return ( + + + + {columns.map((column) => ( + + ))} + + + + {data.map((item) => ( + + {columns.map((column) => ( + + ))} + + ))} + +
+ {(column?.thRender && column?.thRender()) || column.content} +
+ {column.tdRender(item)} +
+ ); +}; diff --git a/packages/ui/src/tables/types.ts b/packages/ui/src/tables/types.ts new file mode 100644 index 000000000..220e4d738 --- /dev/null +++ b/packages/ui/src/tables/types.ts @@ -0,0 +1,20 @@ +export type TTableColumn = { + key: string; + content: string; + thRender?: () => JSX.Element; + tdRender: (rowData: T) => JSX.Element; +}; + +export type TTableData = { + data: T[]; + columns: TTableColumn[]; + keyExtractor: (rowData: T) => string; + // classNames + tableClassName?: string; + tHeadClassName?: string; + tHeadTrClassName?: string; + thClassName?: string; + tBodyClassName?: string; + tBodyTrClassName?: string; + tdClassName?: string; +};