@chumsinc/sortable-tables 2.2.0 → 3.0.0

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 (66) hide show
  1. package/CHANGELOG.md +69 -52
  2. package/README.md +94 -4
  3. package/dist/DataTable.d.ts +6 -6
  4. package/dist/DataTableCell.d.ts +299 -295
  5. package/dist/DataTableCols.d.ts +5 -5
  6. package/dist/DataTableContext.d.ts +10 -0
  7. package/dist/DataTableProvider.d.ts +12 -0
  8. package/dist/DataTableTH.d.ts +6 -6
  9. package/dist/SortableTable.d.ts +6 -6
  10. package/dist/SortableTableHead.d.ts +6 -6
  11. package/dist/SortableTableHeadWrapper.d.ts +9 -0
  12. package/dist/SortableTableTH.d.ts +6 -6
  13. package/dist/StandaloneDataTable.d.ts +6 -0
  14. package/dist/StandaloneSortHelper.d.ts +5 -0
  15. package/dist/StandaloneSortableTable.d.ts +6 -0
  16. package/dist/Table.d.ts +6 -5
  17. package/dist/index.cjs.js +30 -34
  18. package/dist/index.cjs.js.map +1 -1
  19. package/dist/index.d.ts +20 -16
  20. package/dist/index.es.js +521 -471
  21. package/dist/index.es.js.map +1 -1
  22. package/dist/types.d.ts +104 -103
  23. package/dist/useField.d.ts +6 -0
  24. package/dist/useTableContext.d.ts +2 -0
  25. package/dist/useTableFields.d.ts +9 -0
  26. package/dist/useTableSort.d.ts +9 -0
  27. package/package.json +3 -3
  28. package/src/DataTable.tsx +34 -11
  29. package/src/DataTableCell.tsx +33 -28
  30. package/src/DataTableCols.tsx +11 -18
  31. package/src/DataTableContext.ts +13 -0
  32. package/src/DataTableHead.tsx +6 -7
  33. package/src/DataTableProvider.tsx +62 -0
  34. package/src/DataTableRow.tsx +8 -7
  35. package/src/DataTableTBody.tsx +1 -3
  36. package/src/DataTableTH.tsx +4 -3
  37. package/src/RowsPerPage.tsx +2 -4
  38. package/src/SortableTable.tsx +36 -12
  39. package/src/SortableTableHead.tsx +9 -9
  40. package/src/SortableTableHeadWrapper.tsx +20 -0
  41. package/src/SortableTableTH.tsx +4 -4
  42. package/src/StandaloneDataTable.tsx +16 -0
  43. package/src/StandaloneSortHelper.tsx +15 -0
  44. package/src/StandaloneSortableTable.tsx +21 -0
  45. package/src/Table.tsx +49 -44
  46. package/src/TablePagination.tsx +1 -3
  47. package/src/index.tsx +21 -15
  48. package/src/types.ts +127 -126
  49. package/src/useField.ts +19 -0
  50. package/src/useTableContext.ts +10 -0
  51. package/src/useTableFields.ts +20 -0
  52. package/src/useTableSort.ts +20 -0
  53. package/test/Main.tsx +37 -0
  54. package/test/TableColumnsHandler.tsx +9 -9
  55. package/test/TestTable.tsx +51 -46
  56. package/test/data.ts +232 -232
  57. package/test/index.tsx +11 -11
  58. package/test/tableFields.tsx +11 -3
  59. package/test/utils.ts +19 -0
  60. package/tsconfig.json +1 -0
  61. package/dist/DataTableWithContext.d.ts +0 -2
  62. package/dist/SortableTableWithContext.d.ts +0 -2
  63. package/dist/TableProvider.d.ts +0 -17
  64. package/src/DataTableWithContext.tsx +0 -41
  65. package/src/SortableTableWithContext.tsx +0 -44
  66. package/src/TableProvider.tsx +0 -77
package/src/types.ts CHANGED
@@ -1,126 +1,127 @@
1
- import React, {type HTMLAttributes, type MouseEvent, type ReactNode, type TableHTMLAttributes} from 'react'
2
- import type {ClassValue} from "clsx";
3
-
4
-
5
- export interface SortProps<T = unknown> {
6
- field: keyof T;
7
- ascending: boolean;
8
- }
9
-
10
- export type UISize = 'sm' | 'lg' | '';
11
- export type UITableSize = UISize | 'xs';
12
-
13
- export type DataTableClassNames<T = unknown> =
14
- string
15
- | ClassValue
16
- | ((row: T) => (string | ClassValue));
17
-
18
-
19
- export type UIFlexAlign = 'start' | 'end' | 'center' | 'baseline' | 'stretch';
20
-
21
- export interface DataTableField<T = unknown> {
22
- id?: number | string;
23
- field: keyof T;
24
- title: ReactNode;
25
- as?: 'td' | 'th';
26
- align?: 'start' | 'center' | 'end';
27
- render?: (row: T) => ReactNode;
28
- className?: DataTableClassNames<T>;
29
- colSpan?: number;
30
- thProps?: Omit<DataTableTHProps<T>, 'field'>;
31
- cellProps?: TableHTMLAttributes<HTMLTableCellElement>;
32
- collapse?: boolean;
33
- colClassName?: string;
34
- sortable?: boolean;
35
- }
36
-
37
- export type SortableTableField<T = unknown> = DataTableField<T>;
38
-
39
- export interface DataTableProps<T = unknown> extends TableHTMLAttributes<HTMLTableElement> {
40
- fields: DataTableField<T>[];
41
- data: T[];
42
- keyField: keyof T | ((row: T) => string | number);
43
- size?: UITableSize;
44
- sticky?: boolean;
45
- responsive?: boolean | "sm" | "md" | "lg" | "xl" | 'xxl';
46
- rowClassName?: DataTableClassNames<T>;
47
- renderRow?: (row: T) => React.ReactNode;
48
- onSelectRow?: (row: T, ev?: MouseEvent<HTMLTableRowElement>) => void;
49
- selected?: string | number | ((row: T) => boolean);
50
- tfoot?: React.ReactElement<HTMLTableSectionElement>;
51
- tableHeadProps?: TableHTMLAttributes<HTMLTableSectionElement>;
52
- children?: ReactNode;
53
- }
54
-
55
- export interface DataTableCellProps<T = unknown> extends Omit<TableHTMLAttributes<HTMLTableCellElement>, 'className'> {
56
- field: DataTableField<T>;
57
- row: T;
58
- as?: 'td' | 'th',
59
- className?: string | ClassValue;
60
- children?: React.ReactNode;
61
- }
62
-
63
- export interface DataTableTHProps<T = unknown> extends Omit<DataTableCellProps<T>, 'row'> {
64
- as?: 'th',
65
- }
66
-
67
- export interface DataTableTBodyProps<T = unknown> extends TableHTMLAttributes<HTMLTableSectionElement> {
68
- data: T[];
69
- keyField: keyof T | ((row: T) => string | number);
70
- rowClassName?: DataTableClassNames<T>;
71
- renderRow?: (row: T) => React.ReactNode;
72
- onSelectRow?: (row: T, ev?: MouseEvent<HTMLTableRowElement>) => void;
73
- selected?: string | number | ((row: T) => boolean);
74
- children?: ReactNode;
75
- }
76
-
77
- export interface DataTableRowProps<T = unknown> extends Omit<TableHTMLAttributes<HTMLTableRowElement>, 'onClick'> {
78
- rowClassName?: string | ClassValue | ((row: T) => string | ClassValue);
79
- selected?: boolean;
80
- row: T;
81
- trRef?: React.Ref<HTMLTableRowElement>;
82
- onClick?: (row: T, ev?: MouseEvent<HTMLTableRowElement>) => void;
83
- }
84
-
85
- export interface SortableTableProps<T = unknown> extends DataTableProps<T> {
86
- fields: DataTableField<T>[];
87
- currentSort: SortProps<T>;
88
- onChangeSort: (sort: SortProps<T>) => void;
89
- }
90
-
91
- export interface SortableTableHeadProps<T = unknown> extends TableHTMLAttributes<HTMLTableSectionElement> {
92
- currentSort: SortProps<T>;
93
- onChangeSort: (sort: SortProps<T>) => void;
94
- }
95
-
96
- export interface SortableTableTHProps<T = unknown> extends Omit<DataTableTHProps<T>, 'onClick'> {
97
- field: DataTableField<T>;
98
- sorted?: boolean;
99
- ascending?: boolean;
100
- onClick: (sort: SortProps<T>) => void;
101
- }
102
-
103
- export interface RowsPerPageProps extends Omit<HTMLAttributes<HTMLSelectElement>, 'onChange'> {
104
- value: number;
105
- pageValues?: number[];
106
- label?: string | React.ReactNode;
107
- size?: UISize;
108
- className?: string;
109
- onChange: (value: number) => void;
110
- }
111
-
112
- export interface TablePaginationProps extends HTMLAttributes<HTMLDivElement> {
113
- page: number;
114
- rowsPerPage: number;
115
- onChangePage: (page: number) => void;
116
- count: number;
117
- size?: UISize;
118
- showFirst?: boolean;
119
- showLast?: boolean;
120
- rowsPerPageProps?: Omit<RowsPerPageProps, 'value'>;
121
- }
122
-
123
-
124
- export interface DataTableColProps<T = unknown> extends TableHTMLAttributes<HTMLTableSectionElement> {
125
- fields: DataTableField<T>[];
126
- }
1
+ import React, {type HTMLAttributes, type MouseEvent, type ReactNode, type TableHTMLAttributes} from 'react'
2
+ import type {ClassValue} from "clsx";
3
+
4
+
5
+ export interface SortProps<T = unknown> {
6
+ field: keyof T;
7
+ ascending: boolean;
8
+ }
9
+
10
+ export type UISize = 'sm' | 'lg' | '';
11
+ export type UITableSize = UISize | 'xs';
12
+
13
+ export type DataTableClassNames<T = unknown> =
14
+ string
15
+ | ClassValue
16
+ | ((row: T) => (string | ClassValue));
17
+
18
+
19
+ export type UIFlexAlign = 'start' | 'end' | 'center' | 'baseline' | 'stretch';
20
+
21
+ export interface DataTableField<T = unknown> {
22
+ id?: keyof T | (number & {}) | (string & {});
23
+ field: keyof T;
24
+ title: ReactNode;
25
+ as?: 'td' | 'th';
26
+ align?: 'start' | 'center' | 'end';
27
+ render?: (row: T) => ReactNode;
28
+ className?: DataTableClassNames<T>;
29
+ colSpan?: number;
30
+ thProps?: Omit<DataTableTHProps<T>, 'field'>;
31
+ cellProps?: TableHTMLAttributes<HTMLTableCellElement>;
32
+ visible?: boolean;
33
+ colClassName?: string;
34
+ sortable?: boolean;
35
+ }
36
+
37
+ export type SortableTableField<T = unknown> = DataTableField<T>;
38
+
39
+ export interface DataTableProps<T = unknown> extends TableHTMLAttributes<HTMLTableElement> {
40
+ fields: DataTableField<T>[];
41
+ data: T[];
42
+ keyField: keyof T | ((row: T) => string | number);
43
+ size?: UITableSize;
44
+ sticky?: boolean;
45
+ responsive?: boolean | "sm" | "md" | "lg" | "xl" | 'xxl';
46
+ rowClassName?: DataTableClassNames<T>;
47
+ renderRow?: (row: T) => React.ReactNode;
48
+ onSelectRow?: (row: T, ev?: MouseEvent<HTMLTableRowElement>) => void;
49
+ selected?: string | number | ((row: T) => boolean);
50
+ tfoot?: React.ReactElement<HTMLTableSectionElement>;
51
+ tableHeadProps?: TableHTMLAttributes<HTMLTableSectionElement>;
52
+ children?: ReactNode;
53
+ }
54
+
55
+ export interface DataTableCellProps<T = unknown> extends Omit<TableHTMLAttributes<HTMLTableCellElement>, 'className'> {
56
+ field: DataTableField<T>;
57
+ row: T;
58
+ as?: 'td' | 'th',
59
+ className?: string | ClassValue;
60
+ children?: React.ReactNode;
61
+ }
62
+
63
+ export interface DataTableTHProps<T = unknown> extends Omit<DataTableCellProps<T>, 'row'> {
64
+ as?: 'th',
65
+ }
66
+
67
+ export interface DataTableTBodyProps<T = unknown> extends TableHTMLAttributes<HTMLTableSectionElement> {
68
+ data: T[];
69
+ keyField: keyof T | ((row: T) => string | number);
70
+ rowClassName?: DataTableClassNames<T>;
71
+ renderRow?: (row: T) => React.ReactNode;
72
+ onSelectRow?: (row: T, ev?: MouseEvent<HTMLTableRowElement>) => void;
73
+ selected?: string | number | ((row: T) => boolean);
74
+ children?: ReactNode;
75
+ }
76
+
77
+ export interface DataTableRowProps<T = unknown> extends Omit<TableHTMLAttributes<HTMLTableRowElement>, 'onClick'> {
78
+ rowClassName?: string | ClassValue | ((row: T) => string | ClassValue);
79
+ selected?: boolean;
80
+ row: T;
81
+ trRef?: React.Ref<HTMLTableRowElement>;
82
+ onClick?: (row: T, ev?: MouseEvent<HTMLTableRowElement>) => void;
83
+ }
84
+
85
+ export interface SortableTableProps<T = unknown> extends DataTableProps<T> {
86
+ fields: DataTableField<T>[];
87
+ currentSort: SortProps<T>;
88
+ onChangeSort: (sort: SortProps<T>) => void;
89
+ }
90
+
91
+ export interface SortableTableHeadProps<T = unknown> extends TableHTMLAttributes<HTMLTableSectionElement> {
92
+ fields: DataTableField<T>[];
93
+ currentSort: SortProps<T>|null;
94
+ onChangeSort: (sort: SortProps<T>) => void;
95
+ }
96
+
97
+ export interface SortableTableTHProps<T = unknown> extends Omit<DataTableTHProps<T>, 'onClick'> {
98
+ field: DataTableField<T>;
99
+ sorted?: boolean;
100
+ ascending?: boolean;
101
+ onClick: (sort: SortProps<T>) => void;
102
+ }
103
+
104
+ export interface RowsPerPageProps extends Omit<HTMLAttributes<HTMLSelectElement>, 'onChange'> {
105
+ value: number;
106
+ pageValues?: number[];
107
+ label?: string | React.ReactNode;
108
+ size?: UISize;
109
+ className?: string;
110
+ onChange: (value: number) => void;
111
+ }
112
+
113
+ export interface TablePaginationProps extends HTMLAttributes<HTMLDivElement> {
114
+ page: number;
115
+ rowsPerPage: number;
116
+ onChangePage: (page: number) => void;
117
+ count: number;
118
+ size?: UISize;
119
+ showFirst?: boolean;
120
+ showLast?: boolean;
121
+ rowsPerPageProps?: Omit<RowsPerPageProps, 'value'>;
122
+ }
123
+
124
+
125
+ export interface DataTableColProps<T = unknown> extends TableHTMLAttributes<HTMLTableSectionElement> {
126
+ fields: DataTableField<T>[];
127
+ }
@@ -0,0 +1,19 @@
1
+ import type {DataTableField} from "./types";
2
+ import {useContext} from "react";
3
+ import {DataTableContext, type TableContextData} from "./DataTableContext";
4
+
5
+ export type UseFieldArg<T = unknown> = keyof T & ((string | number) & {})
6
+ export function useField<T = unknown>(key: UseFieldArg<T>): [
7
+ field:DataTableField<T>|null,
8
+ updateField: (key: string|number, arg: Partial<DataTableField<T>>) => void
9
+ ] {
10
+ const context = useContext(DataTableContext) as TableContextData<T>;
11
+ if (!context) {
12
+ throw new Error('useField must be used within a DataTableProvider');
13
+ }
14
+
15
+ return [
16
+ context.fields.find(field => field.id === key) ?? null,
17
+ context.updateField,
18
+ ]
19
+ }
@@ -0,0 +1,10 @@
1
+ import {useContext} from "react";
2
+ import {DataTableContext, type TableContextData} from "./DataTableContext";
3
+
4
+ export function useTableContext<T = unknown>():TableContextData<T> {
5
+ const context = useContext(DataTableContext) as TableContextData<T>;
6
+ if (!context) {
7
+ throw new Error('useTableContext must be used within a DataTableProvider');
8
+ }
9
+ return context;
10
+ }
@@ -0,0 +1,20 @@
1
+ import {useContext} from "react";
2
+ import {DataTableContext, type TableContextData} from "./DataTableContext";
3
+
4
+ /**
5
+ * Returns a tuple containing the fields and a function to update them.
6
+ * @returns [fields, setFields]
7
+ */
8
+ export function useTableFields<T = unknown>(): [
9
+ fields: TableContextData<T>['fields'],
10
+ setFields: TableContextData<T>['setFields']
11
+ ] {
12
+ const context = useContext(DataTableContext) as TableContextData<T>;
13
+ if (!context) {
14
+ throw new Error('useTableContext must be used within a DataTableProvider');
15
+ }
16
+ return [
17
+ context.fields,
18
+ context.setFields
19
+ ];
20
+ }
@@ -0,0 +1,20 @@
1
+ import {useContext} from "react";
2
+ import {DataTableContext, type TableContextData} from "./DataTableContext";
3
+
4
+ /**
5
+ * Returns a tuple containing the currentSort and a function to update the sort.
6
+ * @returns [sort, setSort]
7
+ */
8
+ export function useTableSort<T = unknown>(): [
9
+ sort: TableContextData<T>['sort'],
10
+ setSort: TableContextData<T>['setSort']
11
+ ] {
12
+ const context = useContext(DataTableContext) as TableContextData<T>;
13
+ if (!context) {
14
+ throw new Error('useTableSort must be used within a DataTableProvider');
15
+ }
16
+ return [
17
+ context.sort,
18
+ context.setSort
19
+ ];
20
+ }
package/test/Main.tsx ADDED
@@ -0,0 +1,37 @@
1
+ import {useId, useState} from "react";
2
+ import {DataTableProvider, type SortProps, StandaloneSortableTable} from "../src";
3
+ import {type ProductLine, productLines, productLineSorter} from "./data";
4
+ import {tableFields} from "./tableFields";
5
+ import TestTable from "./TestTable";
6
+
7
+ export default function Main() {
8
+ const initialSort: SortProps<ProductLine> = {field: 'ProductLine', ascending: true};
9
+ const [list, setList] = useState<ProductLine[]>([...productLines].sort(productLineSorter(initialSort)));
10
+ const [sort, setSort] = useState<SortProps<ProductLine>>(initialSort);
11
+ const [withProvider, setWithProvider] = useState(true);
12
+ const idProviderCheckbox = useId();
13
+
14
+ const sortChangeHandler = (sort: SortProps<ProductLine>) => {
15
+ setList([...productLines.sort(productLineSorter(sort))])
16
+ setSort(sort);
17
+ }
18
+
19
+ return (
20
+ <div>
21
+ <div className="form-check form-check-inline">
22
+ <input className="form-check-input" type="checkbox" id={idProviderCheckbox} checked={withProvider}
23
+ onChange={e => setWithProvider(e.target.checked)}/>
24
+ <label className="form-check-label" htmlFor={idProviderCheckbox}>With DataTableProvider</label>
25
+ </div>
26
+ {withProvider && (
27
+ <DataTableProvider initialFields={tableFields} initialSort={initialSort}>
28
+ <TestTable data={list} onChangeSort={sortChangeHandler}/>
29
+ </DataTableProvider>
30
+ )}
31
+ {!withProvider && <StandaloneSortableTable fields={tableFields.map(f => ({...f, visible: true}))} data={list}
32
+ keyField={(row) => row.ProductLine}
33
+ currentSort={sort} onChangeSort={sortChangeHandler}/>
34
+ }
35
+ </div>
36
+ )
37
+ }
@@ -1,17 +1,17 @@
1
- import {useTableContext, useTableSort} from "../src";
1
+ import {useTableContext} from "../src";
2
2
  import React, {useCallback, useId} from "react";
3
- import {ProductLine} from "./data";
3
+ import type {ProductLine} from "./data";
4
4
 
5
5
  export default function TableColumnsHandler() {
6
6
  const {updateField, getField} = useTableContext<ProductLine>();
7
- const [collapse, setCollapse] = React.useState<boolean>(getField('ProductLineDesc')?.collapse ?? false);
8
- const {sort} = useTableSort();
7
+ const [visible, setVisible] = React.useState<boolean>(getField('ProductLineDesc')?.visible ?? true);
8
+ // const {sort} = useTableSort();
9
9
  const id = useId();
10
10
 
11
11
  const toggleFieldCollapse = useCallback((key: string, next: boolean) => {
12
12
  console.debug('toggleFieldVisibility', key, next);
13
- updateField(key, {collapse: next})
14
- setCollapse(next);
13
+ updateField(key, {visible: next})
14
+ setVisible(next);
15
15
  }, [updateField]);
16
16
 
17
17
  const handleVisibleChange = (ev: React.ChangeEvent<HTMLInputElement>) => {
@@ -20,9 +20,9 @@ export default function TableColumnsHandler() {
20
20
 
21
21
  return (
22
22
  <div style={{display: 'flex', alignItems: 'center', justifyContent: 'flex-start', gap: '1rem'}}>
23
- <input type="checkbox" checked={collapse} id={id} onChange={handleVisibleChange}/>
24
- <label htmlFor={id}>Hide Description</label>
25
- <code>{JSON.stringify(sort)}</code>
23
+ <input type="checkbox" checked={visible} id={id} onChange={handleVisibleChange}/>
24
+ <label htmlFor={id}>Show Description</label>
25
+ {/*<code>{JSON.stringify(sort)}</code>*/}
26
26
  </div>
27
27
  )
28
28
  }
@@ -1,46 +1,51 @@
1
- import React, {useState} from 'react';
2
- import {ProductLine, productLines} from './data'
3
- import {SortableTableWithContext, SortProps} from "../src";
4
- import TablePagination from "../src/TablePagination";
5
- import TableProvider from "../src/TableProvider";
6
- import TableColumnsHandler from "./TableColumnsHandler";
7
- import {tableFields} from "./tableFields";
8
-
9
-
10
- const rowClassName = (row: ProductLine) => row.active ? '' : 'table-warning';
11
-
12
- export default function TestTable() {
13
- const [sort, setSort] = useState<SortProps<ProductLine>>({field: 'ProductLine', ascending: true});
14
- const [list, setList] = useState<ProductLine[]>(productLines);
15
- const [page, setPage] = useState(0);
16
- const [rowsPerPage, setRowsPerPage] = useState(5);
17
-
18
-
19
- const rowsPerPageChangeHandler = (rpp: number) => {
20
- setPage(0);
21
- setRowsPerPage(rpp);
22
- }
23
-
24
-
25
- return (
26
- <div>
27
- <TableProvider initialFields={tableFields}>
28
- <TableColumnsHandler/>
29
- <SortableTableWithContext currentSort={sort} onChangeSort={setSort} size="lg" responsive
30
- data={list.slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)}
31
- keyField="ProductLine" rowClassName={rowClassName}/>
32
- </TableProvider>
33
- <TablePagination page={page} onChangePage={setPage} size="sm"
34
- rowsPerPage={rowsPerPage}
35
- rowsPerPageProps={{
36
- onChange: rowsPerPageChangeHandler,
37
- label: <span className="bi-images"/>,
38
- pageValues: [5, 10, 15, 25, 50, 100]
39
- }}
40
- showFirst={list.length > rowsPerPage}
41
- showLast={list.length > rowsPerPage}
42
- count={list.length}/>
43
- </div>
44
-
45
- )
46
- }
1
+ import React, {useState} from 'react';
2
+ import type {ProductLine} from './data'
3
+ import {SortableTable, type SortProps, useTableSort} from "../src";
4
+ import TablePagination from "../src/TablePagination";
5
+ import TableColumnsHandler from "./TableColumnsHandler";
6
+
7
+
8
+ const rowClassName = (row: ProductLine) => row.active ? '' : 'table-warning';
9
+
10
+ export interface TestTableProps {
11
+ data: ProductLine[];
12
+ onChangeSort?: (sort: SortProps<ProductLine>) => void;
13
+ }
14
+
15
+ export default function TestTable({data, onChangeSort}: TestTableProps) {
16
+ const [page, setPage] = useState(0);
17
+ const [rowsPerPage, setRowsPerPage] = useState(5);
18
+ const [, setSort] = useTableSort<ProductLine>();
19
+
20
+
21
+ const rowsPerPageChangeHandler = (rpp: number) => {
22
+ setPage(0);
23
+ setRowsPerPage(rpp);
24
+ }
25
+
26
+ const sortChangeHandler = (sort: SortProps<ProductLine>) => {
27
+ onChangeSort?.(sort);
28
+ setSort(sort);
29
+ }
30
+
31
+
32
+ return (
33
+ <div>
34
+ <TableColumnsHandler/>
35
+ <SortableTable onChangeSort={sortChangeHandler} size="lg" responsive
36
+ data={data.slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)}
37
+ keyField="ProductLine" rowClassName={rowClassName}/>
38
+ <TablePagination page={page} onChangePage={setPage} size="sm"
39
+ rowsPerPage={rowsPerPage}
40
+ rowsPerPageProps={{
41
+ onChange: rowsPerPageChangeHandler,
42
+ label: <span className="bi-images"/>,
43
+ pageValues: [5, 10, 15, 25, 50, 100]
44
+ }}
45
+ showFirst={data.length > rowsPerPage}
46
+ showLast={data.length > rowsPerPage}
47
+ count={data.length}/>
48
+ </div>
49
+
50
+ )
51
+ }