@bsol-oss/react-datatable5 1.0.5 → 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 (63) hide show
  1. package/dist/index.d.ts +53 -0
  2. package/dist/index.js +188 -5
  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/package.json +11 -4
  26. package/.cache/storybook/default/dev-server/a5a8bf6e622aef57065c6498611f40c911543d7d-3920d97c51b8ad2521918fb1205babd22b0ed3d7 +0 -1
  27. package/.cache/storybook/default/dev-server/a5a8bf6e622aef57065c6498611f40c911543d7d-43fdebe5fc35e4e9fabee9a83c7faea931b05ea0 +0 -1
  28. package/.cache/storybook/default/dev-server/a5a8bf6e622aef57065c6498611f40c911543d7d-f086b87885981c04ce7a583ff90a49313de83de7 +0 -1
  29. package/.eslintrc.cjs +0 -19
  30. package/.prettierignore +0 -4
  31. package/.storybook/main.ts +0 -20
  32. package/.storybook/preview.ts +0 -14
  33. package/prettier.json +0 -6
  34. package/rollup.config.js +0 -10
  35. package/src/assets/react.svg +0 -1
  36. package/src/components/DataTable.tsx +0 -112
  37. package/src/components/DataTableContext.tsx +0 -12
  38. package/src/components/EditFilterButton.tsx +0 -37
  39. package/src/components/EditSortingButton.tsx +0 -37
  40. package/src/components/EditViewButton.tsx +0 -46
  41. package/src/components/PageSizeControl.tsx +0 -29
  42. package/src/components/ResetFilteringButton.tsx +0 -18
  43. package/src/components/ResetSortingButton.tsx +0 -18
  44. package/src/components/Table.tsx +0 -20
  45. package/src/components/TableBody.tsx +0 -23
  46. package/src/components/TableCardContainer.tsx +0 -22
  47. package/src/components/TableCards.tsx +0 -36
  48. package/src/components/TableFilter.tsx +0 -34
  49. package/src/components/TableFooter.tsx +0 -27
  50. package/src/components/TableHeader.tsx +0 -106
  51. package/src/components/TablePagination.tsx +0 -58
  52. package/src/components/TableSorter.tsx +0 -62
  53. package/src/components/TextCell.tsx +0 -18
  54. package/src/components/useDataFromUrl.tsx +0 -52
  55. package/src/components/useDataTable.tsx +0 -7
  56. package/src/index.tsx +0 -12
  57. package/src/stories/CardViewShowcase.tsx +0 -103
  58. package/src/stories/DataTable.stories.tsx +0 -30
  59. package/src/stories/TableViewShowcase.tsx +0 -105
  60. package/src/vite-env.d.ts +0 -1
  61. package/tsconfig.json +0 -26
  62. package/tsconfig.node.json +0 -11
  63. 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
@@ -3,23 +3,159 @@
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
4
  var react = require('react');
5
5
  var reactTable = require('@tanstack/react-table');
6
- require('axios');
6
+ var axios = require('axios');
7
7
  var react$1 = require('@chakra-ui/react');
8
- require('react-icons/io');
9
- require('@chakra-ui/table');
10
- require('react-icons/md');
11
- require('@chakra-ui/icons');
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
12
 
13
13
  const TableContext = react.createContext({
14
14
  table: {},
15
15
  refreshData: () => { },
16
16
  });
17
17
 
18
+ const useDataFromUrl = ({ url, params = {}, defaultData, }) => {
19
+ const [loading, setLoading] = react.useState(true);
20
+ const [hasError, setHasError] = react.useState(false);
21
+ const [data, setData] = react.useState(defaultData);
22
+ const refreshData = async () => {
23
+ await getData();
24
+ };
25
+ const getData = async () => {
26
+ try {
27
+ setLoading(true);
28
+ const { data } = await axios.get(url, { params: params });
29
+ console.log("get DataFromUrl success", data);
30
+ setLoading(false);
31
+ setData(data);
32
+ }
33
+ catch (e) {
34
+ console.log(e);
35
+ setLoading(false);
36
+ setHasError(true);
37
+ }
38
+ };
39
+ react.useEffect(() => {
40
+ getData().catch((e) => {
41
+ console.error(e);
42
+ });
43
+ }, []);
44
+ return { data, loading, hasError, refreshData };
45
+ };
46
+
47
+ const DataTable = ({ columns, url, children, }) => {
48
+ const [sorting, setSorting] = react.useState([]);
49
+ const [columnFilters, setColumnFilters] = react.useState([]); // can set initial column filter state here
50
+ const [pagination, setPagination] = react.useState({
51
+ pageIndex: 0, //initial page index
52
+ pageSize: 10, //default page size
53
+ });
54
+ const { data, loading, hasError, refreshData } = useDataFromUrl({
55
+ url: url,
56
+ defaultData: {
57
+ success: false,
58
+ results: [],
59
+ count: 0,
60
+ filterCount: 0,
61
+ },
62
+ params: {
63
+ pagination: JSON.stringify({
64
+ offset: pagination.pageIndex * pagination.pageSize,
65
+ rows: pagination.pageSize,
66
+ }),
67
+ sorting: JSON.stringify(sorting.length > 0
68
+ ? { field: sorting[0].id, sort: sorting[0].desc ? "desc" : "asc" }
69
+ : {}),
70
+ where: JSON.stringify(columnFilters.reduce((accumulator, filter) => {
71
+ const obj = {};
72
+ obj[filter.id] = filter.value;
73
+ return { ...accumulator, ...obj };
74
+ }, {})),
75
+ },
76
+ });
77
+ const table = reactTable.useReactTable({
78
+ data: data.results,
79
+ columns: columns,
80
+ getCoreRowModel: reactTable.getCoreRowModel(),
81
+ // getPaginationRowModel: getPaginationRowModel(),
82
+ manualPagination: true,
83
+ manualSorting: true,
84
+ onPaginationChange: setPagination,
85
+ onSortingChange: setSorting,
86
+ onColumnFiltersChange: setColumnFilters,
87
+ columnResizeMode: "onChange",
88
+ state: {
89
+ pagination,
90
+ sorting,
91
+ columnFilters,
92
+ },
93
+ defaultColumn: {
94
+ size: 10, //starting column size
95
+ minSize: 10, //enforced during column resizing
96
+ maxSize: 10000, //enforced during column resizing
97
+ },
98
+ });
99
+ react.useEffect(() => {
100
+ refreshData();
101
+ }, [pagination, sorting, columnFilters]);
102
+ return (jsxRuntime.jsx(TableContext.Provider, { value: { table: { ...table }, refreshData: refreshData }, children: children }));
103
+ };
104
+
105
+ const EditViewButton = () => {
106
+ const { table } = react.useContext(TableContext);
107
+ 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) => {
108
+ 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()));
109
+ }) }) })] })] }));
110
+ };
111
+
112
+ const PageSizeControl = ({ pageSizes = [10, 20, 30, 40, 50], }) => {
113
+ const { table } = react.useContext(TableContext);
114
+ return (jsxRuntime.jsx("select", { value: table.getState().pagination.pageSize, onChange: (e) => {
115
+ table.setPageSize(Number(e.target.value));
116
+ }, children: pageSizes.map((pageSize) => (jsxRuntime.jsx("option", { value: pageSize, children: pageSize }, pageSize))) }));
117
+ };
118
+
119
+ const ResetFilteringButton = () => {
120
+ const { table } = react.useContext(TableContext);
121
+ return (jsxRuntime.jsx(react$1.Button, { onClick: () => {
122
+ table.resetColumnFilters();
123
+ }, children: "Reset Filtering" }));
124
+ };
125
+
126
+ const ResetSortingButton = () => {
127
+ const { table } = react.useContext(TableContext);
128
+ return (jsxRuntime.jsx(react$1.Button, { onClick: () => {
129
+ table.resetSorting();
130
+ }, children: "Reset Sorting" }));
131
+ };
132
+
18
133
  const useDataTable = () => {
19
134
  const { table, refreshData } = react.useContext(TableContext);
20
135
  return { table, refreshData };
21
136
  };
22
137
 
138
+ const Table = ({ children }) => {
139
+ const { table } = useDataTable();
140
+ return (jsxRuntime.jsx(react$1.Container, { maxW: "100%", overflowY: "scroll", children: jsxRuntime.jsx(react$1.Table, { width: table.getCenterTotalSize(), variant: "simple", children: children }) }));
141
+ };
142
+
143
+ const TableBody = () => {
144
+ const { table: table$1 } = react.useContext(TableContext);
145
+ 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()))) }));
146
+ };
147
+
148
+ const TableFilter = () => {
149
+ const { table } = useDataTable();
150
+ return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: table.getLeafHeaders().map((header) => {
151
+ 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()
152
+ ? String(header.column.getFilterValue())
153
+ : "", onChange: (e) => {
154
+ header.column.setFilterValue(e.target.value);
155
+ } })] })) }));
156
+ }) }));
157
+ };
158
+
23
159
  const TableFooter = () => {
24
160
  const table = useDataTable().table;
25
161
  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
@@ -27,4 +163,51 @@ const TableFooter = () => {
27
163
  : reactTable.flexRender(header.column.columnDef.footer, header.getContext()) }, crypto.randomUUID()))) }, crypto.randomUUID()))) }));
28
164
  };
29
165
 
166
+ const TableHeader = ({ canResize }) => {
167
+ const { table } = useDataTable();
168
+ return (jsxRuntime.jsx(react$1.Thead, { children: table.getHeaderGroups().map((headerGroup) => (jsxRuntime.jsx(react$1.Tr, { style: { columnSpan: "all" }, children: headerGroup.headers.map((header) => {
169
+ const resizeProps = {
170
+ onClick: () => header.column.resetSize(),
171
+ onMouseDown: header.getResizeHandler(),
172
+ onTouchStart: header.getResizeHandler(),
173
+ cursor: "col-resize",
174
+ };
175
+ 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
176
+ ? null
177
+ : reactTable.flexRender(header.column.columnDef.header, header.getContext()) }), header.column.getCanSort() && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsxs(react$1.Button, { onClick: (e) => {
178
+ header.column.toggleSorting();
179
+ }, children: [header.column.getNextSortingOrder() === false && (
180
+ // <Text>To No sort</Text>
181
+ jsxRuntime.jsx(icons.ChevronUpIcon, {})), header.column.getNextSortingOrder() === "asc" && (
182
+ // <Text>To asc</Text>
183
+ jsxRuntime.jsx(icons.UpDownIcon, {})), header.column.getNextSortingOrder() === "desc" && (
184
+ // <Text>To desc</Text>
185
+ jsxRuntime.jsx(icons.ChevronDownIcon, {}))] }), header.column.getIsSorted() && (jsxRuntime.jsx(react$1.Button, { onClick: (e) => {
186
+ header.column.clearSorting();
187
+ }, children: jsxRuntime.jsx(icons.CloseIcon, {}) }))] })), header.column.getIsFiltered() && jsxRuntime.jsx(md.MdFilterListAlt, {}), canResize && (jsxRuntime.jsx(react$1.Box, { borderRight: header.column.getIsResizing()
188
+ ? "0.25rem solid black"
189
+ : "0.25rem solid grey", height: "5rem", width: "5px", userSelect: "none", style: { touchAction: "none" }, ...resizeProps }))] }) }, crypto.randomUUID()));
190
+ }) }, crypto.randomUUID()))) }));
191
+ };
192
+
193
+ const TablePagination = ({}) => {
194
+ const { firstPage, getCanPreviousPage, previousPage, getState, nextPage, getCanNextPage, lastPage, } = useDataTable().table;
195
+ 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, {}) })] }));
196
+ };
197
+
198
+ const TextCell = ({ label, children }) => {
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
+ };
201
+
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;
30
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 };