@bsol-oss/react-datatable5 1.0.4 → 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/dist/index.d.ts +53 -0
  2. package/dist/index.js +12 -16
  3. package/dist/index.mjs +200 -0
  4. package/dist/index.mts +113 -0
  5. package/dist/index.ts +125 -0
  6. package/dist/types/components/DataTable.d.ts +1 -2
  7. package/dist/types/components/DataTableContext.d.ts +1 -2
  8. package/dist/types/components/EditFilterButton.d.ts +1 -2
  9. package/dist/types/components/EditSortingButton.d.ts +1 -2
  10. package/dist/types/components/EditViewButton.d.ts +1 -2
  11. package/dist/types/components/PageSizeControl.d.ts +1 -2
  12. package/dist/types/components/ResetFilteringButton.d.ts +1 -2
  13. package/dist/types/components/ResetSortingButton.d.ts +1 -2
  14. package/dist/types/components/Table.d.ts +1 -2
  15. package/dist/types/components/TableBody.d.ts +1 -2
  16. package/dist/types/components/TableCardContainer.d.ts +2 -3
  17. package/dist/types/components/TableCards.d.ts +1 -2
  18. package/dist/types/components/TableFilter.d.ts +1 -2
  19. package/dist/types/components/TableFooter.d.ts +0 -1
  20. package/dist/types/components/TableHeader.d.ts +1 -2
  21. package/dist/types/components/TablePagination.d.ts +1 -2
  22. package/dist/types/components/TableSorter.d.ts +1 -2
  23. package/dist/types/components/TextCell.d.ts +1 -2
  24. package/dist/types/components/useDataFromUrl.d.ts +3 -4
  25. package/dist/types/index.d.ts +12 -15
  26. package/package.json +12 -4
  27. package/.cache/storybook/default/dev-server/a5a8bf6e622aef57065c6498611f40c911543d7d-3920d97c51b8ad2521918fb1205babd22b0ed3d7 +0 -1
  28. package/.cache/storybook/default/dev-server/a5a8bf6e622aef57065c6498611f40c911543d7d-43fdebe5fc35e4e9fabee9a83c7faea931b05ea0 +0 -1
  29. package/.cache/storybook/default/dev-server/a5a8bf6e622aef57065c6498611f40c911543d7d-f086b87885981c04ce7a583ff90a49313de83de7 +0 -1
  30. package/.eslintrc.cjs +0 -19
  31. package/.prettierignore +0 -4
  32. package/.storybook/main.ts +0 -20
  33. package/.storybook/preview.ts +0 -14
  34. package/prettier.json +0 -6
  35. package/rollup.config.js +0 -10
  36. package/src/assets/react.svg +0 -1
  37. package/src/components/DataTable.tsx +0 -112
  38. package/src/components/DataTableContext.tsx +0 -12
  39. package/src/components/EditFilterButton.tsx +0 -37
  40. package/src/components/EditSortingButton.tsx +0 -37
  41. package/src/components/EditViewButton.tsx +0 -46
  42. package/src/components/PageSizeControl.tsx +0 -29
  43. package/src/components/ResetFilteringButton.tsx +0 -18
  44. package/src/components/ResetSortingButton.tsx +0 -18
  45. package/src/components/Table.tsx +0 -20
  46. package/src/components/TableBody.tsx +0 -23
  47. package/src/components/TableCardContainer.tsx +0 -22
  48. package/src/components/TableCards.tsx +0 -36
  49. package/src/components/TableFilter.tsx +0 -34
  50. package/src/components/TableFooter.tsx +0 -27
  51. package/src/components/TableHeader.tsx +0 -106
  52. package/src/components/TablePagination.tsx +0 -58
  53. package/src/components/TableSorter.tsx +0 -62
  54. package/src/components/TextCell.tsx +0 -18
  55. package/src/components/useDataFromUrl.tsx +0 -52
  56. package/src/components/useDataTable.tsx +0 -7
  57. package/src/index.tsx +0 -27
  58. package/src/stories/CardViewShowcase.tsx +0 -103
  59. package/src/stories/DataTable.stories.tsx +0 -30
  60. package/src/stories/TableViewShowcase.tsx +0 -105
  61. package/src/vite-env.d.ts +0 -1
  62. package/tsconfig.json +0 -26
  63. package/tsconfig.node.json +0 -11
  64. package/vite.config.ts +0 -7
@@ -0,0 +1,53 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode } from 'react';
3
+ import { Column } from '@tanstack/react-table';
4
+
5
+ interface DataTableProps<T> {
6
+ children: ReactNode;
7
+ url: string;
8
+ columns: Column<T>[];
9
+ }
10
+ interface Result<T> {
11
+ results: T[];
12
+ }
13
+ interface DataResponse<T> extends Result<T> {
14
+ success: boolean;
15
+ count: number;
16
+ filterCount: number;
17
+ }
18
+ declare const DataTable: <TData>({ columns, url, children, }: DataTableProps<TData>) => react_jsx_runtime.JSX.Element;
19
+
20
+ declare const EditViewButton: () => react_jsx_runtime.JSX.Element;
21
+
22
+ interface PageSizeControlProps {
23
+ pageSizes?: number[];
24
+ }
25
+ declare const PageSizeControl: ({ pageSizes, }: PageSizeControlProps) => react_jsx_runtime.JSX.Element;
26
+
27
+ declare const ResetFilteringButton: () => react_jsx_runtime.JSX.Element;
28
+
29
+ declare const ResetSortingButton: () => react_jsx_runtime.JSX.Element;
30
+
31
+ interface TableProps {
32
+ children: ReactNode;
33
+ }
34
+ declare const Table: ({ children }: TableProps) => react_jsx_runtime.JSX.Element;
35
+
36
+ declare const TableBody: () => react_jsx_runtime.JSX.Element;
37
+
38
+ declare const TableFilter: () => react_jsx_runtime.JSX.Element;
39
+
40
+ declare const TableFooter: () => react_jsx_runtime.JSX.Element;
41
+
42
+ interface TableHeaderProps {
43
+ canResize?: boolean;
44
+ }
45
+ declare const TableHeader: ({ canResize }: TableHeaderProps) => react_jsx_runtime.JSX.Element;
46
+
47
+ interface PaginationProps {
48
+ }
49
+ declare const TablePagination: ({}: PaginationProps) => react_jsx_runtime.JSX.Element;
50
+
51
+ declare const TextCell: ({ label, children }: any) => react_jsx_runtime.JSX.Element;
52
+
53
+ export { type DataResponse, DataTable, type DataTableProps, EditViewButton, PageSizeControl, type PageSizeControlProps, type PaginationProps, ResetFilteringButton, ResetSortingButton, type Result, Table, TableBody, TableFilter, TableFooter, TableHeader, type TableHeaderProps, TablePagination, type TableProps, TextCell };
package/dist/index.js CHANGED
@@ -199,19 +199,15 @@ const TextCell = ({ label, children }) => {
199
199
  return (jsxRuntime.jsx(react$1.Tooltip, { label: label, children: jsxRuntime.jsx(react$1.Text, { as: "span", overflow: "hidden", textOverflow: "ellipsis", noOfLines: [1, 2, 3], children: children }) }));
200
200
  };
201
201
 
202
- var index = {
203
- DataTable,
204
- EditViewButton,
205
- PageSizeControl,
206
- ResetFilteringButton,
207
- ResetSortingButton,
208
- Table,
209
- TableBody,
210
- TableFilter,
211
- TableFooter,
212
- TableHeader,
213
- TablePagination,
214
- TextCell,
215
- };
216
-
217
- module.exports = index;
202
+ exports.DataTable = DataTable;
203
+ exports.EditViewButton = EditViewButton;
204
+ exports.PageSizeControl = PageSizeControl;
205
+ exports.ResetFilteringButton = ResetFilteringButton;
206
+ exports.ResetSortingButton = ResetSortingButton;
207
+ exports.Table = Table;
208
+ exports.TableBody = TableBody;
209
+ exports.TableFilter = TableFilter;
210
+ exports.TableFooter = TableFooter;
211
+ exports.TableHeader = TableHeader;
212
+ exports.TablePagination = TablePagination;
213
+ exports.TextCell = TextCell;
package/dist/index.mjs ADDED
@@ -0,0 +1,200 @@
1
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
+ import { createContext, useState, useEffect, useContext } from 'react';
3
+ import { useReactTable, getCoreRowModel, flexRender } from '@tanstack/react-table';
4
+ import axios from 'axios';
5
+ import { Popover, PopoverTrigger, IconButton, PopoverContent, PopoverArrow, PopoverBody, Flex, FormControl, Checkbox, Button, Container, Table as Table$1, Box, Text, Input, Tfoot, Tr as Tr$1, Th, Thead, ButtonGroup, Tooltip } from '@chakra-ui/react';
6
+ import { IoMdEye } from 'react-icons/io';
7
+ import { Tbody, Tr, Td } from '@chakra-ui/table';
8
+ import { MdFilterListAlt, MdFirstPage, MdArrowBack, MdArrowForward, MdLastPage } from 'react-icons/md';
9
+ import { ChevronUpIcon, UpDownIcon, ChevronDownIcon, CloseIcon } from '@chakra-ui/icons';
10
+
11
+ const TableContext = createContext({
12
+ table: {},
13
+ refreshData: () => { },
14
+ });
15
+
16
+ const useDataFromUrl = ({ url, params = {}, defaultData, }) => {
17
+ const [loading, setLoading] = useState(true);
18
+ const [hasError, setHasError] = useState(false);
19
+ const [data, setData] = useState(defaultData);
20
+ const refreshData = async () => {
21
+ await getData();
22
+ };
23
+ const getData = async () => {
24
+ try {
25
+ setLoading(true);
26
+ const { data } = await axios.get(url, { params: params });
27
+ console.log("get DataFromUrl success", data);
28
+ setLoading(false);
29
+ setData(data);
30
+ }
31
+ catch (e) {
32
+ console.log(e);
33
+ setLoading(false);
34
+ setHasError(true);
35
+ }
36
+ };
37
+ useEffect(() => {
38
+ getData().catch((e) => {
39
+ console.error(e);
40
+ });
41
+ }, []);
42
+ return { data, loading, hasError, refreshData };
43
+ };
44
+
45
+ const DataTable = ({ columns, url, children, }) => {
46
+ const [sorting, setSorting] = useState([]);
47
+ const [columnFilters, setColumnFilters] = useState([]); // can set initial column filter state here
48
+ const [pagination, setPagination] = useState({
49
+ pageIndex: 0, //initial page index
50
+ pageSize: 10, //default page size
51
+ });
52
+ const { data, loading, hasError, refreshData } = useDataFromUrl({
53
+ url: url,
54
+ defaultData: {
55
+ success: false,
56
+ results: [],
57
+ count: 0,
58
+ filterCount: 0,
59
+ },
60
+ params: {
61
+ pagination: JSON.stringify({
62
+ offset: pagination.pageIndex * pagination.pageSize,
63
+ rows: pagination.pageSize,
64
+ }),
65
+ sorting: JSON.stringify(sorting.length > 0
66
+ ? { field: sorting[0].id, sort: sorting[0].desc ? "desc" : "asc" }
67
+ : {}),
68
+ where: JSON.stringify(columnFilters.reduce((accumulator, filter) => {
69
+ const obj = {};
70
+ obj[filter.id] = filter.value;
71
+ return { ...accumulator, ...obj };
72
+ }, {})),
73
+ },
74
+ });
75
+ const table = useReactTable({
76
+ data: data.results,
77
+ columns: columns,
78
+ getCoreRowModel: getCoreRowModel(),
79
+ // getPaginationRowModel: getPaginationRowModel(),
80
+ manualPagination: true,
81
+ manualSorting: true,
82
+ onPaginationChange: setPagination,
83
+ onSortingChange: setSorting,
84
+ onColumnFiltersChange: setColumnFilters,
85
+ columnResizeMode: "onChange",
86
+ state: {
87
+ pagination,
88
+ sorting,
89
+ columnFilters,
90
+ },
91
+ defaultColumn: {
92
+ size: 10, //starting column size
93
+ minSize: 10, //enforced during column resizing
94
+ maxSize: 10000, //enforced during column resizing
95
+ },
96
+ });
97
+ useEffect(() => {
98
+ refreshData();
99
+ }, [pagination, sorting, columnFilters]);
100
+ return (jsx(TableContext.Provider, { value: { table: { ...table }, refreshData: refreshData }, children: children }));
101
+ };
102
+
103
+ const EditViewButton = () => {
104
+ const { table } = useContext(TableContext);
105
+ return (jsxs(Popover, { placement: "bottom-end", children: [jsx(PopoverTrigger, { children: jsx(IconButton, { "aria-label": "view", icon: jsx(IoMdEye, {}) }) }), jsxs(PopoverContent, { width: "auto", children: [jsx(PopoverArrow, {}), jsx(PopoverBody, { children: jsx(Flex, { flexFlow: "column", gap: "1rem", children: table.getAllLeafColumns().map((column) => {
106
+ return (jsx(FormControl, { width: "auto", children: jsx(Checkbox, { isChecked: column.getIsVisible(), onChange: column.getToggleVisibilityHandler(), children: column.id }) }, crypto.randomUUID()));
107
+ }) }) })] })] }));
108
+ };
109
+
110
+ const PageSizeControl = ({ pageSizes = [10, 20, 30, 40, 50], }) => {
111
+ const { table } = useContext(TableContext);
112
+ return (jsx("select", { value: table.getState().pagination.pageSize, onChange: (e) => {
113
+ table.setPageSize(Number(e.target.value));
114
+ }, children: pageSizes.map((pageSize) => (jsx("option", { value: pageSize, children: pageSize }, pageSize))) }));
115
+ };
116
+
117
+ const ResetFilteringButton = () => {
118
+ const { table } = useContext(TableContext);
119
+ return (jsx(Button, { onClick: () => {
120
+ table.resetColumnFilters();
121
+ }, children: "Reset Filtering" }));
122
+ };
123
+
124
+ const ResetSortingButton = () => {
125
+ const { table } = useContext(TableContext);
126
+ return (jsx(Button, { onClick: () => {
127
+ table.resetSorting();
128
+ }, children: "Reset Sorting" }));
129
+ };
130
+
131
+ const useDataTable = () => {
132
+ const { table, refreshData } = useContext(TableContext);
133
+ return { table, refreshData };
134
+ };
135
+
136
+ const Table = ({ children }) => {
137
+ const { table } = useDataTable();
138
+ return (jsx(Container, { maxW: "100%", overflowY: "scroll", children: jsx(Table$1, { width: table.getCenterTotalSize(), variant: "simple", children: children }) }));
139
+ };
140
+
141
+ const TableBody = () => {
142
+ const { table } = useContext(TableContext);
143
+ return (jsx(Tbody, { children: table.getRowModel().rows.map((row) => (jsx(Tr, { children: row.getVisibleCells().map((cell) => (jsx(Td, { width: `${cell.column.getSize()}px`, children: flexRender(cell.column.columnDef.cell, cell.getContext()) }, crypto.randomUUID()))) }, crypto.randomUUID()))) }));
144
+ };
145
+
146
+ const TableFilter = () => {
147
+ const { table } = useDataTable();
148
+ return (jsx(Fragment, { children: table.getLeafHeaders().map((header) => {
149
+ return (jsx(Fragment, { children: header.column.getCanFilter() && (jsxs(Box, { children: [jsx(Text, { children: header.column.id }), jsx(Input, { value: header.column.getFilterValue()
150
+ ? String(header.column.getFilterValue())
151
+ : "", onChange: (e) => {
152
+ header.column.setFilterValue(e.target.value);
153
+ } })] })) }));
154
+ }) }));
155
+ };
156
+
157
+ const TableFooter = () => {
158
+ const table = useDataTable().table;
159
+ return (jsx(Tfoot, { children: table.getFooterGroups().map((footerGroup) => (jsx(Tr$1, { children: footerGroup.headers.map((header) => (jsx(Th, { colSpan: header.colSpan, children: header.isPlaceholder
160
+ ? null
161
+ : flexRender(header.column.columnDef.footer, header.getContext()) }, crypto.randomUUID()))) }, crypto.randomUUID()))) }));
162
+ };
163
+
164
+ const TableHeader = ({ canResize }) => {
165
+ const { table } = useDataTable();
166
+ return (jsx(Thead, { children: table.getHeaderGroups().map((headerGroup) => (jsx(Tr$1, { style: { columnSpan: "all" }, children: headerGroup.headers.map((header) => {
167
+ const resizeProps = {
168
+ onClick: () => header.column.resetSize(),
169
+ onMouseDown: header.getResizeHandler(),
170
+ onTouchStart: header.getResizeHandler(),
171
+ cursor: "col-resize",
172
+ };
173
+ return (jsx(Th, { padding: "0rem", colSpan: header.colSpan, width: `${header.getSize()}px`, children: jsxs(Flex, { alignItems: "center", gap: "0.5rem", padding: "0.5rem", children: [jsx(Box, { children: header.isPlaceholder
174
+ ? null
175
+ : flexRender(header.column.columnDef.header, header.getContext()) }), header.column.getCanSort() && (jsxs(Fragment, { children: [jsxs(Button, { onClick: (e) => {
176
+ header.column.toggleSorting();
177
+ }, children: [header.column.getNextSortingOrder() === false && (
178
+ // <Text>To No sort</Text>
179
+ jsx(ChevronUpIcon, {})), header.column.getNextSortingOrder() === "asc" && (
180
+ // <Text>To asc</Text>
181
+ jsx(UpDownIcon, {})), header.column.getNextSortingOrder() === "desc" && (
182
+ // <Text>To desc</Text>
183
+ jsx(ChevronDownIcon, {}))] }), header.column.getIsSorted() && (jsx(Button, { onClick: (e) => {
184
+ header.column.clearSorting();
185
+ }, children: jsx(CloseIcon, {}) }))] })), header.column.getIsFiltered() && jsx(MdFilterListAlt, {}), canResize && (jsx(Box, { borderRight: header.column.getIsResizing()
186
+ ? "0.25rem solid black"
187
+ : "0.25rem solid grey", height: "5rem", width: "5px", userSelect: "none", style: { touchAction: "none" }, ...resizeProps }))] }) }, crypto.randomUUID()));
188
+ }) }, crypto.randomUUID()))) }));
189
+ };
190
+
191
+ const TablePagination = ({}) => {
192
+ const { firstPage, getCanPreviousPage, previousPage, getState, nextPage, getCanNextPage, lastPage, } = useDataTable().table;
193
+ return (jsxs(ButtonGroup, { isAttached: true, children: [jsx(IconButton, { icon: jsx(MdFirstPage, {}), onClick: () => firstPage(), disabled: !getCanPreviousPage(), "aria-label": "first-page" }), jsx(IconButton, { icon: jsx(MdArrowBack, {}), onClick: () => previousPage(), disabled: !getCanPreviousPage(), "aria-label": "previous-page" }), jsx(Button, { onClick: () => { }, disabled: !getCanPreviousPage(), children: getState().pagination.pageIndex + 1 }), jsx(IconButton, { onClick: () => nextPage(), disabled: !getCanNextPage(), "aria-label": "next-page", children: jsx(MdArrowForward, {}) }), jsx(IconButton, { onClick: () => lastPage(), disabled: !getCanNextPage(), "aria-label": "last-page", children: jsx(MdLastPage, {}) })] }));
194
+ };
195
+
196
+ const TextCell = ({ label, children }) => {
197
+ return (jsx(Tooltip, { label: label, children: jsx(Text, { as: "span", overflow: "hidden", textOverflow: "ellipsis", noOfLines: [1, 2, 3], children: children }) }));
198
+ };
199
+
200
+ export { DataTable, EditViewButton, PageSizeControl, ResetFilteringButton, ResetSortingButton, Table, TableBody, TableFilter, TableFooter, TableHeader, TablePagination, TextCell };
package/dist/index.mts ADDED
@@ -0,0 +1,113 @@
1
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
+ import { createContext, useContext } from 'react';
3
+ import { flexRender } from '@tanstack/react-table';
4
+ import 'axios';
5
+ import { Popover, PopoverTrigger, IconButton, PopoverContent, PopoverArrow, PopoverBody, Flex, FormControl, Checkbox, Button, Container, Table as Table$1, Box, Text, Input, Tfoot, Tr as Tr$1, Th, Thead, ButtonGroup, Tooltip } from '@chakra-ui/react';
6
+ import { IoMdEye } from 'react-icons/io';
7
+ import { Tbody, Tr, Td } from '@chakra-ui/table';
8
+ import { MdFilterListAlt, MdFirstPage, MdArrowBack, MdArrowForward, MdLastPage } from 'react-icons/md';
9
+ import { ChevronUpIcon, UpDownIcon, ChevronDownIcon, CloseIcon } from '@chakra-ui/icons';
10
+
11
+ const TableContext = createContext({
12
+ table: {},
13
+ refreshData: () => { },
14
+ });
15
+
16
+ const EditViewButton = () => {
17
+ const { table } = useContext(TableContext);
18
+ return (jsxs(Popover, { placement: "bottom-end", children: [jsx(PopoverTrigger, { children: jsx(IconButton, { "aria-label": "view", icon: jsx(IoMdEye, {}) }) }), jsxs(PopoverContent, { width: "auto", children: [jsx(PopoverArrow, {}), jsx(PopoverBody, { children: jsx(Flex, { flexFlow: "column", gap: "1rem", children: table.getAllLeafColumns().map((column) => {
19
+ return (jsx(FormControl, { width: "auto", children: jsx(Checkbox, { isChecked: column.getIsVisible(), onChange: column.getToggleVisibilityHandler(), children: column.id }) }, crypto.randomUUID()));
20
+ }) }) })] })] }));
21
+ };
22
+
23
+ const PageSizeControl = ({ pageSizes = [10, 20, 30, 40, 50], }) => {
24
+ const { table } = useContext(TableContext);
25
+ return (jsx("select", { value: table.getState().pagination.pageSize, onChange: (e) => {
26
+ table.setPageSize(Number(e.target.value));
27
+ }, children: pageSizes.map((pageSize) => (jsx("option", { value: pageSize, children: pageSize }, pageSize))) }));
28
+ };
29
+
30
+ const ResetFilteringButton = () => {
31
+ const { table } = useContext(TableContext);
32
+ return (jsx(Button, { onClick: () => {
33
+ table.resetColumnFilters();
34
+ }, children: "Reset Filtering" }));
35
+ };
36
+
37
+ const ResetSortingButton = () => {
38
+ const { table } = useContext(TableContext);
39
+ return (jsx(Button, { onClick: () => {
40
+ table.resetSorting();
41
+ }, children: "Reset Sorting" }));
42
+ };
43
+
44
+ const useDataTable = () => {
45
+ const { table, refreshData } = useContext(TableContext);
46
+ return { table, refreshData };
47
+ };
48
+
49
+ const Table = ({ children }) => {
50
+ const { table } = useDataTable();
51
+ return (jsx(Container, { maxW: "100%", overflowY: "scroll", children: jsx(Table$1, { width: table.getCenterTotalSize(), variant: "simple", children: children }) }));
52
+ };
53
+
54
+ const TableBody = () => {
55
+ const { table } = useContext(TableContext);
56
+ return (jsx(Tbody, { children: table.getRowModel().rows.map((row) => (jsx(Tr, { children: row.getVisibleCells().map((cell) => (jsx(Td, { width: `${cell.column.getSize()}px`, children: flexRender(cell.column.columnDef.cell, cell.getContext()) }, crypto.randomUUID()))) }, crypto.randomUUID()))) }));
57
+ };
58
+
59
+ const TableFilter = () => {
60
+ const { table } = useDataTable();
61
+ return (jsx(Fragment, { children: table.getLeafHeaders().map((header) => {
62
+ return (jsx(Fragment, { children: header.column.getCanFilter() && (jsxs(Box, { children: [jsx(Text, { children: header.column.id }), jsx(Input, { value: header.column.getFilterValue()
63
+ ? String(header.column.getFilterValue())
64
+ : "", onChange: (e) => {
65
+ header.column.setFilterValue(e.target.value);
66
+ } })] })) }));
67
+ }) }));
68
+ };
69
+
70
+ const TableFooter = () => {
71
+ const table = useDataTable().table;
72
+ return (jsx(Tfoot, { children: table.getFooterGroups().map((footerGroup) => (jsx(Tr$1, { children: footerGroup.headers.map((header) => (jsx(Th, { colSpan: header.colSpan, children: header.isPlaceholder
73
+ ? null
74
+ : flexRender(header.column.columnDef.footer, header.getContext()) }, crypto.randomUUID()))) }, crypto.randomUUID()))) }));
75
+ };
76
+
77
+ const TableHeader = ({ canResize }) => {
78
+ const { table } = useDataTable();
79
+ return (jsx(Thead, { children: table.getHeaderGroups().map((headerGroup) => (jsx(Tr$1, { style: { columnSpan: "all" }, children: headerGroup.headers.map((header) => {
80
+ const resizeProps = {
81
+ onClick: () => header.column.resetSize(),
82
+ onMouseDown: header.getResizeHandler(),
83
+ onTouchStart: header.getResizeHandler(),
84
+ cursor: "col-resize",
85
+ };
86
+ return (jsx(Th, { padding: "0rem", colSpan: header.colSpan, width: `${header.getSize()}px`, children: jsxs(Flex, { alignItems: "center", gap: "0.5rem", padding: "0.5rem", children: [jsx(Box, { children: header.isPlaceholder
87
+ ? null
88
+ : flexRender(header.column.columnDef.header, header.getContext()) }), header.column.getCanSort() && (jsxs(Fragment, { children: [jsxs(Button, { onClick: (e) => {
89
+ header.column.toggleSorting();
90
+ }, children: [header.column.getNextSortingOrder() === false && (
91
+ // <Text>To No sort</Text>
92
+ jsx(ChevronUpIcon, {})), header.column.getNextSortingOrder() === "asc" && (
93
+ // <Text>To asc</Text>
94
+ jsx(UpDownIcon, {})), header.column.getNextSortingOrder() === "desc" && (
95
+ // <Text>To desc</Text>
96
+ jsx(ChevronDownIcon, {}))] }), header.column.getIsSorted() && (jsx(Button, { onClick: (e) => {
97
+ header.column.clearSorting();
98
+ }, children: jsx(CloseIcon, {}) }))] })), header.column.getIsFiltered() && jsx(MdFilterListAlt, {}), canResize && (jsx(Box, { borderRight: header.column.getIsResizing()
99
+ ? "0.25rem solid black"
100
+ : "0.25rem solid grey", height: "5rem", width: "5px", userSelect: "none", style: { touchAction: "none" }, ...resizeProps }))] }) }, crypto.randomUUID()));
101
+ }) }, crypto.randomUUID()))) }));
102
+ };
103
+
104
+ const TablePagination = ({}) => {
105
+ const { firstPage, getCanPreviousPage, previousPage, getState, nextPage, getCanNextPage, lastPage, } = useDataTable().table;
106
+ return (jsxs(ButtonGroup, { isAttached: true, children: [jsx(IconButton, { icon: jsx(MdFirstPage, {}), onClick: () => firstPage(), disabled: !getCanPreviousPage(), "aria-label": "first-page" }), jsx(IconButton, { icon: jsx(MdArrowBack, {}), onClick: () => previousPage(), disabled: !getCanPreviousPage(), "aria-label": "previous-page" }), jsx(Button, { onClick: () => { }, disabled: !getCanPreviousPage(), children: getState().pagination.pageIndex + 1 }), jsx(IconButton, { onClick: () => nextPage(), disabled: !getCanNextPage(), "aria-label": "next-page", children: jsx(MdArrowForward, {}) }), jsx(IconButton, { onClick: () => lastPage(), disabled: !getCanNextPage(), "aria-label": "last-page", children: jsx(MdLastPage, {}) })] }));
107
+ };
108
+
109
+ const TextCell = ({ label, children }) => {
110
+ return (jsx(Tooltip, { label: label, children: jsx(Text, { as: "span", overflow: "hidden", textOverflow: "ellipsis", noOfLines: [1, 2, 3], children: children }) }));
111
+ };
112
+
113
+ export { EditViewButton, PageSizeControl, ResetFilteringButton, ResetSortingButton, Table, TableBody, TableFilter, TableFooter, TableHeader, TablePagination, TextCell };
package/dist/index.ts ADDED
@@ -0,0 +1,125 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var react = require('react');
5
+ var reactTable = require('@tanstack/react-table');
6
+ require('axios');
7
+ var react$1 = require('@chakra-ui/react');
8
+ var io = require('react-icons/io');
9
+ var table = require('@chakra-ui/table');
10
+ var md = require('react-icons/md');
11
+ var icons = require('@chakra-ui/icons');
12
+
13
+ const TableContext = react.createContext({
14
+ table: {},
15
+ refreshData: () => { },
16
+ });
17
+
18
+ const EditViewButton = () => {
19
+ const { table } = react.useContext(TableContext);
20
+ return (jsxRuntime.jsxs(react$1.Popover, { placement: "bottom-end", children: [jsxRuntime.jsx(react$1.PopoverTrigger, { children: jsxRuntime.jsx(react$1.IconButton, { "aria-label": "view", icon: jsxRuntime.jsx(io.IoMdEye, {}) }) }), jsxRuntime.jsxs(react$1.PopoverContent, { width: "auto", children: [jsxRuntime.jsx(react$1.PopoverArrow, {}), jsxRuntime.jsx(react$1.PopoverBody, { children: jsxRuntime.jsx(react$1.Flex, { flexFlow: "column", gap: "1rem", children: table.getAllLeafColumns().map((column) => {
21
+ return (jsxRuntime.jsx(react$1.FormControl, { width: "auto", children: jsxRuntime.jsx(react$1.Checkbox, { isChecked: column.getIsVisible(), onChange: column.getToggleVisibilityHandler(), children: column.id }) }, crypto.randomUUID()));
22
+ }) }) })] })] }));
23
+ };
24
+
25
+ const PageSizeControl = ({ pageSizes = [10, 20, 30, 40, 50], }) => {
26
+ const { table } = react.useContext(TableContext);
27
+ return (jsxRuntime.jsx("select", { value: table.getState().pagination.pageSize, onChange: (e) => {
28
+ table.setPageSize(Number(e.target.value));
29
+ }, children: pageSizes.map((pageSize) => (jsxRuntime.jsx("option", { value: pageSize, children: pageSize }, pageSize))) }));
30
+ };
31
+
32
+ const ResetFilteringButton = () => {
33
+ const { table } = react.useContext(TableContext);
34
+ return (jsxRuntime.jsx(react$1.Button, { onClick: () => {
35
+ table.resetColumnFilters();
36
+ }, children: "Reset Filtering" }));
37
+ };
38
+
39
+ const ResetSortingButton = () => {
40
+ const { table } = react.useContext(TableContext);
41
+ return (jsxRuntime.jsx(react$1.Button, { onClick: () => {
42
+ table.resetSorting();
43
+ }, children: "Reset Sorting" }));
44
+ };
45
+
46
+ const useDataTable = () => {
47
+ const { table, refreshData } = react.useContext(TableContext);
48
+ return { table, refreshData };
49
+ };
50
+
51
+ const Table = ({ children }) => {
52
+ const { table } = useDataTable();
53
+ return (jsxRuntime.jsx(react$1.Container, { maxW: "100%", overflowY: "scroll", children: jsxRuntime.jsx(react$1.Table, { width: table.getCenterTotalSize(), variant: "simple", children: children }) }));
54
+ };
55
+
56
+ const TableBody = () => {
57
+ const { table: table$1 } = react.useContext(TableContext);
58
+ return (jsxRuntime.jsx(table.Tbody, { children: table$1.getRowModel().rows.map((row) => (jsxRuntime.jsx(table.Tr, { children: row.getVisibleCells().map((cell) => (jsxRuntime.jsx(table.Td, { width: `${cell.column.getSize()}px`, children: reactTable.flexRender(cell.column.columnDef.cell, cell.getContext()) }, crypto.randomUUID()))) }, crypto.randomUUID()))) }));
59
+ };
60
+
61
+ const TableFilter = () => {
62
+ const { table } = useDataTable();
63
+ return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: table.getLeafHeaders().map((header) => {
64
+ return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: header.column.getCanFilter() && (jsxRuntime.jsxs(react$1.Box, { children: [jsxRuntime.jsx(react$1.Text, { children: header.column.id }), jsxRuntime.jsx(react$1.Input, { value: header.column.getFilterValue()
65
+ ? String(header.column.getFilterValue())
66
+ : "", onChange: (e) => {
67
+ header.column.setFilterValue(e.target.value);
68
+ } })] })) }));
69
+ }) }));
70
+ };
71
+
72
+ const TableFooter = () => {
73
+ const table = useDataTable().table;
74
+ return (jsxRuntime.jsx(react$1.Tfoot, { children: table.getFooterGroups().map((footerGroup) => (jsxRuntime.jsx(react$1.Tr, { children: footerGroup.headers.map((header) => (jsxRuntime.jsx(react$1.Th, { colSpan: header.colSpan, children: header.isPlaceholder
75
+ ? null
76
+ : reactTable.flexRender(header.column.columnDef.footer, header.getContext()) }, crypto.randomUUID()))) }, crypto.randomUUID()))) }));
77
+ };
78
+
79
+ const TableHeader = ({ canResize }) => {
80
+ const { table } = useDataTable();
81
+ return (jsxRuntime.jsx(react$1.Thead, { children: table.getHeaderGroups().map((headerGroup) => (jsxRuntime.jsx(react$1.Tr, { style: { columnSpan: "all" }, children: headerGroup.headers.map((header) => {
82
+ const resizeProps = {
83
+ onClick: () => header.column.resetSize(),
84
+ onMouseDown: header.getResizeHandler(),
85
+ onTouchStart: header.getResizeHandler(),
86
+ cursor: "col-resize",
87
+ };
88
+ return (jsxRuntime.jsx(react$1.Th, { padding: "0rem", colSpan: header.colSpan, width: `${header.getSize()}px`, children: jsxRuntime.jsxs(react$1.Flex, { alignItems: "center", gap: "0.5rem", padding: "0.5rem", children: [jsxRuntime.jsx(react$1.Box, { children: header.isPlaceholder
89
+ ? null
90
+ : reactTable.flexRender(header.column.columnDef.header, header.getContext()) }), header.column.getCanSort() && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsxs(react$1.Button, { onClick: (e) => {
91
+ header.column.toggleSorting();
92
+ }, children: [header.column.getNextSortingOrder() === false && (
93
+ // <Text>To No sort</Text>
94
+ jsxRuntime.jsx(icons.ChevronUpIcon, {})), header.column.getNextSortingOrder() === "asc" && (
95
+ // <Text>To asc</Text>
96
+ jsxRuntime.jsx(icons.UpDownIcon, {})), header.column.getNextSortingOrder() === "desc" && (
97
+ // <Text>To desc</Text>
98
+ jsxRuntime.jsx(icons.ChevronDownIcon, {}))] }), header.column.getIsSorted() && (jsxRuntime.jsx(react$1.Button, { onClick: (e) => {
99
+ header.column.clearSorting();
100
+ }, children: jsxRuntime.jsx(icons.CloseIcon, {}) }))] })), header.column.getIsFiltered() && jsxRuntime.jsx(md.MdFilterListAlt, {}), canResize && (jsxRuntime.jsx(react$1.Box, { borderRight: header.column.getIsResizing()
101
+ ? "0.25rem solid black"
102
+ : "0.25rem solid grey", height: "5rem", width: "5px", userSelect: "none", style: { touchAction: "none" }, ...resizeProps }))] }) }, crypto.randomUUID()));
103
+ }) }, crypto.randomUUID()))) }));
104
+ };
105
+
106
+ const TablePagination = ({}) => {
107
+ const { firstPage, getCanPreviousPage, previousPage, getState, nextPage, getCanNextPage, lastPage, } = useDataTable().table;
108
+ return (jsxRuntime.jsxs(react$1.ButtonGroup, { isAttached: true, children: [jsxRuntime.jsx(react$1.IconButton, { icon: jsxRuntime.jsx(md.MdFirstPage, {}), onClick: () => firstPage(), disabled: !getCanPreviousPage(), "aria-label": "first-page" }), jsxRuntime.jsx(react$1.IconButton, { icon: jsxRuntime.jsx(md.MdArrowBack, {}), onClick: () => previousPage(), disabled: !getCanPreviousPage(), "aria-label": "previous-page" }), jsxRuntime.jsx(react$1.Button, { onClick: () => { }, disabled: !getCanPreviousPage(), children: getState().pagination.pageIndex + 1 }), jsxRuntime.jsx(react$1.IconButton, { onClick: () => nextPage(), disabled: !getCanNextPage(), "aria-label": "next-page", children: jsxRuntime.jsx(md.MdArrowForward, {}) }), jsxRuntime.jsx(react$1.IconButton, { onClick: () => lastPage(), disabled: !getCanNextPage(), "aria-label": "last-page", children: jsxRuntime.jsx(md.MdLastPage, {}) })] }));
109
+ };
110
+
111
+ const TextCell = ({ label, children }) => {
112
+ return (jsxRuntime.jsx(react$1.Tooltip, { label: label, children: jsxRuntime.jsx(react$1.Text, { as: "span", overflow: "hidden", textOverflow: "ellipsis", noOfLines: [1, 2, 3], children: children }) }));
113
+ };
114
+
115
+ exports.EditViewButton = EditViewButton;
116
+ exports.PageSizeControl = PageSizeControl;
117
+ exports.ResetFilteringButton = ResetFilteringButton;
118
+ exports.ResetSortingButton = ResetSortingButton;
119
+ exports.Table = Table;
120
+ exports.TableBody = TableBody;
121
+ exports.TableFilter = TableFilter;
122
+ exports.TableFooter = TableFooter;
123
+ exports.TableHeader = TableHeader;
124
+ exports.TablePagination = TablePagination;
125
+ exports.TextCell = TextCell;
@@ -13,5 +13,4 @@ export interface DataResponse<T> extends Result<T> {
13
13
  count: number;
14
14
  filterCount: number;
15
15
  }
16
- declare const DataTable: <TData>({ columns, url, children, }: DataTableProps<TData>) => import("react/jsx-runtime").JSX.Element;
17
- export default DataTable;
16
+ export declare const DataTable: <TData>({ columns, url, children, }: DataTableProps<TData>) => import("react/jsx-runtime").JSX.Element;
@@ -1,8 +1,7 @@
1
1
  /// <reference types="react" />
2
2
  import { Table } from "@tanstack/react-table";
3
- interface DataTableContext<T> {
3
+ export interface DataTableContext<T> {
4
4
  table: Table<T>;
5
5
  refreshData: () => void;
6
6
  }
7
7
  export declare const TableContext: import("react").Context<DataTableContext<any>>;
8
- export {};
@@ -1,2 +1 @@
1
- declare const EditFilterButton: () => import("react/jsx-runtime").JSX.Element;
2
- export default EditFilterButton;
1
+ export declare const EditFilterButton: () => import("react/jsx-runtime").JSX.Element;
@@ -1,2 +1 @@
1
- declare const EditSortingButton: () => import("react/jsx-runtime").JSX.Element;
2
- export default EditSortingButton;
1
+ export declare const EditSortingButton: () => import("react/jsx-runtime").JSX.Element;
@@ -1,2 +1 @@
1
- declare const EditViewButton: () => import("react/jsx-runtime").JSX.Element;
2
- export default EditViewButton;
1
+ export declare const EditViewButton: () => import("react/jsx-runtime").JSX.Element;
@@ -1,5 +1,4 @@
1
1
  export interface PageSizeControlProps {
2
2
  pageSizes?: number[];
3
3
  }
4
- declare const PageSizeControl: ({ pageSizes, }: PageSizeControlProps) => import("react/jsx-runtime").JSX.Element;
5
- export default PageSizeControl;
4
+ export declare const PageSizeControl: ({ pageSizes, }: PageSizeControlProps) => import("react/jsx-runtime").JSX.Element;
@@ -1,2 +1 @@
1
- declare const ResetFilteringButton: () => import("react/jsx-runtime").JSX.Element;
2
- export default ResetFilteringButton;
1
+ export declare const ResetFilteringButton: () => import("react/jsx-runtime").JSX.Element;
@@ -1,2 +1 @@
1
- declare const ResetSortingButton: () => import("react/jsx-runtime").JSX.Element;
2
- export default ResetSortingButton;
1
+ export declare const ResetSortingButton: () => import("react/jsx-runtime").JSX.Element;
@@ -2,5 +2,4 @@ import { ReactNode } from "react";
2
2
  export interface TableProps {
3
3
  children: ReactNode;
4
4
  }
5
- declare const Table: ({ children }: TableProps) => import("react/jsx-runtime").JSX.Element;
6
- export default Table;
5
+ export declare const Table: ({ children }: TableProps) => import("react/jsx-runtime").JSX.Element;
@@ -1,2 +1 @@
1
- declare const TableBody: () => import("react/jsx-runtime").JSX.Element;
2
- export default TableBody;
1
+ export declare const TableBody: () => import("react/jsx-runtime").JSX.Element;
@@ -1,6 +1,5 @@
1
1
  /// <reference types="react" />
2
- interface TableCardContainerProps {
2
+ export interface TableCardContainerProps {
3
3
  children: JSX.Element;
4
4
  }
5
- declare const TableCardContainer: ({ children, ...props }: TableCardContainerProps) => import("react/jsx-runtime").JSX.Element;
6
- export default TableCardContainer;
5
+ export declare const TableCardContainer: ({ children, ...props }: TableCardContainerProps) => import("react/jsx-runtime").JSX.Element;
@@ -1,2 +1 @@
1
- declare const TableCards: () => import("react/jsx-runtime").JSX.Element;
2
- export default TableCards;
1
+ export declare const TableCards: () => import("react/jsx-runtime").JSX.Element;
@@ -1,2 +1 @@
1
- declare const TableFilter: () => import("react/jsx-runtime").JSX.Element;
2
- export default TableFilter;
1
+ export declare const TableFilter: () => import("react/jsx-runtime").JSX.Element;
@@ -1,2 +1 @@
1
1
  export declare const TableFooter: () => import("react/jsx-runtime").JSX.Element;
2
- export default TableFooter;
@@ -1,5 +1,4 @@
1
1
  export interface TableHeaderProps {
2
2
  canResize?: boolean;
3
3
  }
4
- declare const TableHeader: ({ canResize }: TableHeaderProps) => import("react/jsx-runtime").JSX.Element;
5
- export default TableHeader;
4
+ export declare const TableHeader: ({ canResize }: TableHeaderProps) => import("react/jsx-runtime").JSX.Element;
@@ -1,4 +1,3 @@
1
1
  export interface PaginationProps {
2
2
  }
3
- declare const TablePagination: ({}: PaginationProps) => import("react/jsx-runtime").JSX.Element;
4
- export default TablePagination;
3
+ export declare const TablePagination: ({}: PaginationProps) => import("react/jsx-runtime").JSX.Element;
@@ -1,2 +1 @@
1
- declare const TableSorter: () => import("react/jsx-runtime").JSX.Element;
2
- export default TableSorter;
1
+ export declare const TableSorter: () => import("react/jsx-runtime").JSX.Element;