@ackplus/react-tanstack-data-table 1.0.19-beta-0.9 → 1.0.19-beta-0.12
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.
- package/README.md +4 -4
- package/package.json +1 -1
- package/src/index.d.ts +1 -0
- package/src/index.js +3 -1
- package/src/lib/components/table/data-table.d.ts +2 -1
- package/src/lib/components/table/data-table.js +141 -121
- package/src/lib/components/table/data-table.types.d.ts +9 -9
- package/src/lib/components/toolbar/bulk-actions-toolbar.d.ts +1 -1
- package/src/lib/components/toolbar/column-filter-control.d.ts +1 -0
- package/src/lib/components/toolbar/{column-custom-filter-control.js → column-filter-control.js} +22 -20
- package/src/lib/components/toolbar/data-table-toolbar.js +2 -2
- package/src/lib/components/toolbar/index.d.ts +1 -0
- package/src/lib/components/toolbar/index.js +3 -1
- package/src/lib/components/toolbar/table-export-control.d.ts +4 -4
- package/src/lib/components/toolbar/table-export-control.js +18 -6
- package/src/lib/contexts/data-table-context.d.ts +8 -8
- package/src/lib/contexts/data-table-context.js +5 -5
- package/src/lib/examples/index.d.ts +1 -0
- package/src/lib/examples/index.js +3 -1
- package/src/lib/examples/server-side-fetching-example.d.ts +1 -0
- package/src/lib/examples/server-side-fetching-example.js +250 -0
- package/src/lib/examples/server-side-test.d.ts +1 -0
- package/src/lib/examples/server-side-test.js +9 -0
- package/src/lib/features/{custom-column-filter.feature.d.ts → column-filter.feature.d.ts} +14 -14
- package/src/lib/features/{custom-column-filter.feature.js → column-filter.feature.js} +51 -26
- package/src/lib/features/index.d.ts +2 -2
- package/src/lib/features/index.js +6 -6
- package/src/lib/features/{custom-selection.feature.d.ts → selection.feature.d.ts} +8 -8
- package/src/lib/features/{custom-selection.feature.js → selection.feature.js} +22 -10
- package/src/lib/hooks/use-data-table-api.d.ts +6 -6
- package/src/lib/hooks/use-data-table-api.js +20 -20
- package/src/lib/types/data-table-api.d.ts +4 -4
- package/src/lib/types/table.types.d.ts +4 -4
- package/src/lib/utils/column-helpers.d.ts +1 -2
- package/src/lib/utils/column-helpers.js +3 -2
- package/src/lib/utils/export-utils.d.ts +4 -4
- package/src/lib/utils/export-utils.js +47 -24
- package/src/lib/components/toolbar/column-custom-filter-control.d.ts +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Table, TableFeature, RowData, Updater, RowModel } from '@tanstack/react-table';
|
|
2
|
-
import type {
|
|
2
|
+
import type { ColumnFilterState } from '../types/table.types';
|
|
3
3
|
export interface ColumnFilterRule {
|
|
4
4
|
id: string;
|
|
5
5
|
columnId: string;
|
|
@@ -7,24 +7,24 @@ export interface ColumnFilterRule {
|
|
|
7
7
|
value: any;
|
|
8
8
|
columnType?: string;
|
|
9
9
|
}
|
|
10
|
-
export interface
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
export interface ColumnFilterOptions {
|
|
11
|
+
enableAdvanceColumnFilter?: boolean;
|
|
12
|
+
onColumnFilterChange?: (updater: Updater<ColumnFilterState>) => void;
|
|
13
|
+
onColumnFilterApply?: (state: ColumnFilterState) => void;
|
|
14
14
|
}
|
|
15
|
-
export interface
|
|
16
|
-
|
|
15
|
+
export interface ColumnFilterTableState {
|
|
16
|
+
columnFilter: ColumnFilterState;
|
|
17
17
|
}
|
|
18
18
|
declare module '@tanstack/table-core' {
|
|
19
|
-
interface TableState extends
|
|
19
|
+
interface TableState extends ColumnFilterTableState {
|
|
20
20
|
}
|
|
21
|
-
interface TableOptionsResolved<TData extends RowData> extends
|
|
21
|
+
interface TableOptionsResolved<TData extends RowData> extends ColumnFilterOptions {
|
|
22
22
|
}
|
|
23
|
-
interface Table<TData extends RowData> extends
|
|
23
|
+
interface Table<TData extends RowData> extends ColumnFilterInstance<TData> {
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
|
-
export interface
|
|
27
|
-
|
|
26
|
+
export interface ColumnFilterInstance<TData extends RowData> {
|
|
27
|
+
setColumnFilterState: (updater: Updater<ColumnFilterState>) => void;
|
|
28
28
|
addPendingColumnFilter: (columnId: string, operator: string, value: any) => void;
|
|
29
29
|
updatePendingColumnFilter: (filterId: string, updates: Partial<ColumnFilterRule>) => void;
|
|
30
30
|
removePendingColumnFilter: (filterId: string) => void;
|
|
@@ -38,8 +38,8 @@ export interface CustomColumnFilterInstance<TData extends RowData> {
|
|
|
38
38
|
setFilterLogic: (logic: 'AND' | 'OR') => void;
|
|
39
39
|
getActiveColumnFilters: () => ColumnFilterRule[];
|
|
40
40
|
getPendingColumnFilters: () => ColumnFilterRule[];
|
|
41
|
-
|
|
41
|
+
getColumnFilterState: () => ColumnFilterState;
|
|
42
42
|
}
|
|
43
|
-
export declare const
|
|
43
|
+
export declare const ColumnFilterFeature: TableFeature<any>;
|
|
44
44
|
export declare function matchesCustomColumnFilters<TData extends RowData>(row: any, filters: ColumnFilterRule[], logic?: 'AND' | 'OR'): boolean;
|
|
45
45
|
export declare const getCombinedFilteredRowModel: <TData>() => (table: Table<TData>) => () => RowModel<TData>;
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getCombinedFilteredRowModel = exports.
|
|
3
|
+
exports.getCombinedFilteredRowModel = exports.ColumnFilterFeature = void 0;
|
|
4
4
|
exports.matchesCustomColumnFilters = matchesCustomColumnFilters;
|
|
5
5
|
const tslib_1 = require("tslib");
|
|
6
6
|
const react_table_1 = require("@tanstack/react-table");
|
|
7
7
|
const moment_1 = tslib_1.__importDefault(require("moment"));
|
|
8
|
-
exports.
|
|
8
|
+
exports.ColumnFilterFeature = {
|
|
9
9
|
getInitialState: (state) => {
|
|
10
|
-
return Object.assign({
|
|
10
|
+
return Object.assign({ columnFilter: {
|
|
11
11
|
filters: [],
|
|
12
12
|
logic: 'AND',
|
|
13
13
|
pendingFilters: [],
|
|
@@ -16,23 +16,28 @@ exports.CustomColumnFilterFeature = {
|
|
|
16
16
|
},
|
|
17
17
|
getDefaultOptions: (table) => {
|
|
18
18
|
return {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
enableAdvanceColumnFilter: true,
|
|
20
|
+
onColumnFilterChange: (0, react_table_1.makeStateUpdater)('columnFilter', table),
|
|
21
|
+
onColumnFilterApply: (state) => {
|
|
22
22
|
},
|
|
23
23
|
};
|
|
24
24
|
},
|
|
25
25
|
createTable: (table) => {
|
|
26
|
-
table.
|
|
26
|
+
table.setColumnFilterState = (updater) => {
|
|
27
27
|
var _a, _b;
|
|
28
|
+
if (!table.options.enableAdvanceColumnFilter)
|
|
29
|
+
return;
|
|
28
30
|
const safeUpdater = (old) => {
|
|
29
31
|
const newState = (0, react_table_1.functionalUpdate)(updater, old);
|
|
30
32
|
return newState;
|
|
31
33
|
};
|
|
32
|
-
return (_b = (_a = table.options).
|
|
34
|
+
return (_b = (_a = table.options).onColumnFilterChange) === null || _b === void 0 ? void 0 : _b.call(_a, safeUpdater);
|
|
33
35
|
};
|
|
34
36
|
table.addPendingColumnFilter = (columnId, operator, value) => {
|
|
35
|
-
table.
|
|
37
|
+
if (!table.options.enableAdvanceColumnFilter)
|
|
38
|
+
return;
|
|
39
|
+
console.log('addPendingColumnFilter', columnId, operator, value);
|
|
40
|
+
table.setColumnFilterState((old) => {
|
|
36
41
|
const newFilter = {
|
|
37
42
|
id: `filter_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`,
|
|
38
43
|
columnId,
|
|
@@ -43,32 +48,44 @@ exports.CustomColumnFilterFeature = {
|
|
|
43
48
|
});
|
|
44
49
|
};
|
|
45
50
|
table.updatePendingColumnFilter = (filterId, updates) => {
|
|
46
|
-
table.
|
|
51
|
+
if (!table.options.enableAdvanceColumnFilter)
|
|
52
|
+
return;
|
|
53
|
+
table.setColumnFilterState((old) => {
|
|
47
54
|
const updatedFilters = old.pendingFilters.map((filter) => filter.id === filterId ? Object.assign(Object.assign({}, filter), updates) : filter);
|
|
48
55
|
return Object.assign(Object.assign({}, old), { pendingFilters: updatedFilters });
|
|
49
56
|
});
|
|
50
57
|
};
|
|
51
58
|
table.removePendingColumnFilter = (filterId) => {
|
|
52
|
-
|
|
59
|
+
if (!table.options.enableAdvanceColumnFilter)
|
|
60
|
+
return;
|
|
61
|
+
table.setColumnFilterState((old) => (Object.assign(Object.assign({}, old), { pendingFilters: old.pendingFilters.filter((filter) => filter.id !== filterId) })));
|
|
53
62
|
};
|
|
54
63
|
table.clearAllPendingColumnFilters = () => {
|
|
55
|
-
|
|
64
|
+
if (!table.options.enableAdvanceColumnFilter)
|
|
65
|
+
return;
|
|
66
|
+
table.setColumnFilterState((old) => (Object.assign(Object.assign({}, old), { pendingFilters: [] })));
|
|
56
67
|
};
|
|
57
68
|
table.setPendingFilterLogic = (logic) => {
|
|
58
|
-
|
|
69
|
+
if (!table.options.enableAdvanceColumnFilter)
|
|
70
|
+
return;
|
|
71
|
+
table.setColumnFilterState((old) => (Object.assign(Object.assign({}, old), { pendingLogic: logic })));
|
|
59
72
|
};
|
|
60
73
|
table.applyPendingColumnFilters = () => {
|
|
61
|
-
table.
|
|
74
|
+
if (!table.options.enableAdvanceColumnFilter)
|
|
75
|
+
return;
|
|
76
|
+
table.setColumnFilterState((old) => {
|
|
62
77
|
const newState = Object.assign(Object.assign({}, old), { filters: [...old.pendingFilters], logic: old.pendingLogic });
|
|
63
78
|
setTimeout(() => {
|
|
64
79
|
var _a, _b;
|
|
65
|
-
(_b = (_a = table.options).
|
|
80
|
+
(_b = (_a = table.options).onColumnFilterApply) === null || _b === void 0 ? void 0 : _b.call(_a, newState);
|
|
66
81
|
}, 0);
|
|
67
82
|
return newState;
|
|
68
83
|
});
|
|
69
84
|
};
|
|
70
85
|
table.addColumnFilter = (columnId, operator, value) => {
|
|
71
|
-
table.
|
|
86
|
+
if (!table.options.enableAdvanceColumnFilter)
|
|
87
|
+
return;
|
|
88
|
+
table.setColumnFilterState((old) => {
|
|
72
89
|
const newFilter = {
|
|
73
90
|
id: `filter_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`,
|
|
74
91
|
columnId,
|
|
@@ -79,30 +96,38 @@ exports.CustomColumnFilterFeature = {
|
|
|
79
96
|
});
|
|
80
97
|
};
|
|
81
98
|
table.updateColumnFilter = (filterId, updates) => {
|
|
82
|
-
table.
|
|
99
|
+
if (!table.options.enableAdvanceColumnFilter)
|
|
100
|
+
return;
|
|
101
|
+
table.setColumnFilterState((old) => {
|
|
83
102
|
const updatedFilters = old.filters.map((filter) => filter.id === filterId ? Object.assign(Object.assign({}, filter), updates) : filter);
|
|
84
103
|
return Object.assign(Object.assign({}, old), { filters: updatedFilters });
|
|
85
104
|
});
|
|
86
105
|
};
|
|
87
106
|
table.removeColumnFilter = (filterId) => {
|
|
88
|
-
|
|
107
|
+
if (!table.options.enableAdvanceColumnFilter)
|
|
108
|
+
return;
|
|
109
|
+
table.setColumnFilterState((old) => (Object.assign(Object.assign({}, old), { filters: old.filters.filter((filter) => filter.id !== filterId) })));
|
|
89
110
|
};
|
|
90
111
|
table.clearAllColumnFilters = () => {
|
|
91
|
-
|
|
112
|
+
if (!table.options.enableAdvanceColumnFilter)
|
|
113
|
+
return;
|
|
114
|
+
table.setColumnFilterState((old) => (Object.assign(Object.assign({}, old), { filters: [] })));
|
|
92
115
|
};
|
|
93
116
|
table.setFilterLogic = (logic) => {
|
|
94
|
-
|
|
117
|
+
if (!table.options.enableAdvanceColumnFilter)
|
|
118
|
+
return;
|
|
119
|
+
table.setColumnFilterState((old) => (Object.assign(Object.assign({}, old), { logic })));
|
|
95
120
|
};
|
|
96
121
|
table.getActiveColumnFilters = () => {
|
|
97
|
-
const state = table.getState().
|
|
122
|
+
const state = table.getState().columnFilter;
|
|
98
123
|
return state.filters.filter((f) => f.columnId && f.operator);
|
|
99
124
|
};
|
|
100
125
|
table.getPendingColumnFilters = () => {
|
|
101
|
-
const state = table.getState().
|
|
126
|
+
const state = table.getState().columnFilter;
|
|
102
127
|
return state.pendingFilters.filter((f) => f.columnId && f.operator);
|
|
103
128
|
};
|
|
104
|
-
table.
|
|
105
|
-
return table.getState().
|
|
129
|
+
table.getColumnFilterState = () => {
|
|
130
|
+
return table.getState().columnFilter;
|
|
106
131
|
};
|
|
107
132
|
},
|
|
108
133
|
};
|
|
@@ -137,11 +162,11 @@ const getCombinedFilteredRowModel = () => {
|
|
|
137
162
|
return (table) => () => {
|
|
138
163
|
var _a;
|
|
139
164
|
const baseFilteredModel = (0, react_table_1.getFilteredRowModel)()(table)();
|
|
140
|
-
const { filters, logic } = (_a = table.getState().
|
|
165
|
+
const { filters, logic } = (_a = table.getState().columnFilter) !== null && _a !== void 0 ? _a : {
|
|
141
166
|
filters: [],
|
|
142
167
|
logic: 'AND',
|
|
143
168
|
};
|
|
144
|
-
if (!filters.length)
|
|
169
|
+
if (!filters.length || !table.options.enableAdvanceColumnFilter)
|
|
145
170
|
return baseFilteredModel;
|
|
146
171
|
const filteredRows = baseFilteredModel.rows.filter(row => matchesCustomColumnFilters(row, filters, logic));
|
|
147
172
|
const flatRows = [];
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export {
|
|
1
|
+
export { ColumnFilterFeature, matchesCustomColumnFilters, type ColumnFilterRule, type ColumnFilterOptions, type ColumnFilterTableState, type ColumnFilterInstance, } from './column-filter.feature';
|
|
2
|
+
export { SelectionFeature, type SelectionState, type SelectMode, type SelectionOptions, type SelectionTableState, type SelectionInstance, } from './selection.feature';
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
var
|
|
5
|
-
Object.defineProperty(exports, "
|
|
6
|
-
Object.defineProperty(exports, "matchesCustomColumnFilters", { enumerable: true, get: function () { return
|
|
7
|
-
var
|
|
8
|
-
Object.defineProperty(exports, "
|
|
3
|
+
exports.SelectionFeature = exports.matchesCustomColumnFilters = exports.ColumnFilterFeature = void 0;
|
|
4
|
+
var column_filter_feature_1 = require("./column-filter.feature");
|
|
5
|
+
Object.defineProperty(exports, "ColumnFilterFeature", { enumerable: true, get: function () { return column_filter_feature_1.ColumnFilterFeature; } });
|
|
6
|
+
Object.defineProperty(exports, "matchesCustomColumnFilters", { enumerable: true, get: function () { return column_filter_feature_1.matchesCustomColumnFilters; } });
|
|
7
|
+
var selection_feature_1 = require("./selection.feature");
|
|
8
|
+
Object.defineProperty(exports, "SelectionFeature", { enumerable: true, get: function () { return selection_feature_1.SelectionFeature; } });
|
|
@@ -9,24 +9,24 @@ export type IsRowSelectableFunction<T = any> = (params: {
|
|
|
9
9
|
id: string;
|
|
10
10
|
}) => boolean;
|
|
11
11
|
export type SelectMode = 'page' | 'all';
|
|
12
|
-
export interface
|
|
13
|
-
|
|
12
|
+
export interface SelectionOptions {
|
|
13
|
+
enableAdvanceSelection?: boolean;
|
|
14
14
|
selectMode?: SelectMode;
|
|
15
15
|
isRowSelectable?: IsRowSelectableFunction;
|
|
16
16
|
onSelectionStateChange?: (updater: Updater<SelectionState>) => void;
|
|
17
17
|
}
|
|
18
|
-
export interface
|
|
18
|
+
export interface SelectionTableState {
|
|
19
19
|
selectionState: SelectionState;
|
|
20
20
|
}
|
|
21
21
|
declare module '@tanstack/table-core' {
|
|
22
|
-
interface TableState extends
|
|
22
|
+
interface TableState extends SelectionTableState {
|
|
23
23
|
}
|
|
24
|
-
interface TableOptionsResolved<TData extends RowData> extends
|
|
24
|
+
interface TableOptionsResolved<TData extends RowData> extends SelectionOptions {
|
|
25
25
|
}
|
|
26
|
-
interface Table<TData extends RowData> extends
|
|
26
|
+
interface Table<TData extends RowData> extends SelectionInstance<TData> {
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
|
-
export interface
|
|
29
|
+
export interface SelectionInstance<TData extends RowData> {
|
|
30
30
|
setSelectionState: (updater: Updater<SelectionState>) => void;
|
|
31
31
|
toggleAllRowsSelected: () => void;
|
|
32
32
|
toggleRowSelected: (rowId: string) => void;
|
|
@@ -43,4 +43,4 @@ export interface CustomSelectionInstance<TData extends RowData> {
|
|
|
43
43
|
getSelectedRowIds: () => string[];
|
|
44
44
|
canSelectRow: (rowId: string) => boolean;
|
|
45
45
|
}
|
|
46
|
-
export declare const
|
|
46
|
+
export declare const SelectionFeature: TableFeature<any>;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.SelectionFeature = void 0;
|
|
4
4
|
const react_table_1 = require("@tanstack/react-table");
|
|
5
|
-
exports.
|
|
5
|
+
exports.SelectionFeature = {
|
|
6
6
|
getInitialState: (state) => {
|
|
7
7
|
return Object.assign({ selectionState: {
|
|
8
8
|
ids: [],
|
|
@@ -12,7 +12,7 @@ exports.CustomSelectionFeature = {
|
|
|
12
12
|
},
|
|
13
13
|
getDefaultOptions: (table) => {
|
|
14
14
|
return {
|
|
15
|
-
|
|
15
|
+
enableAdvanceSelection: true,
|
|
16
16
|
selectMode: 'page',
|
|
17
17
|
onSelectionStateChange: (0, react_table_1.makeStateUpdater)('selectionState', table),
|
|
18
18
|
};
|
|
@@ -20,6 +20,8 @@ exports.CustomSelectionFeature = {
|
|
|
20
20
|
createTable: (table) => {
|
|
21
21
|
table.setSelectionState = (updater) => {
|
|
22
22
|
var _a, _b;
|
|
23
|
+
if (!table.options.enableAdvanceSelection)
|
|
24
|
+
return;
|
|
23
25
|
const safeUpdater = (old) => {
|
|
24
26
|
const newState = (0, react_table_1.functionalUpdate)(updater, old);
|
|
25
27
|
return newState;
|
|
@@ -27,6 +29,8 @@ exports.CustomSelectionFeature = {
|
|
|
27
29
|
return (_b = (_a = table.options).onSelectionStateChange) === null || _b === void 0 ? void 0 : _b.call(_a, safeUpdater);
|
|
28
30
|
};
|
|
29
31
|
table.selectRow = (rowId) => {
|
|
32
|
+
if (!table.options.enableAdvanceSelection)
|
|
33
|
+
return;
|
|
30
34
|
if (!table.canSelectRow(rowId))
|
|
31
35
|
return;
|
|
32
36
|
table.setSelectionState((old) => {
|
|
@@ -40,6 +44,8 @@ exports.CustomSelectionFeature = {
|
|
|
40
44
|
});
|
|
41
45
|
};
|
|
42
46
|
table.deselectRow = (rowId) => {
|
|
47
|
+
if (!table.options.enableAdvanceSelection)
|
|
48
|
+
return;
|
|
43
49
|
table.setSelectionState((old) => {
|
|
44
50
|
if (old.type === 'exclude') {
|
|
45
51
|
const newIds = old.ids.includes(rowId) ? old.ids : [...old.ids, rowId];
|
|
@@ -51,6 +57,8 @@ exports.CustomSelectionFeature = {
|
|
|
51
57
|
});
|
|
52
58
|
};
|
|
53
59
|
table.toggleRowSelected = (rowId) => {
|
|
60
|
+
if (!table.options.enableAdvanceSelection)
|
|
61
|
+
return;
|
|
54
62
|
if (table.getIsRowSelected(rowId)) {
|
|
55
63
|
table.deselectRow(rowId);
|
|
56
64
|
}
|
|
@@ -59,6 +67,8 @@ exports.CustomSelectionFeature = {
|
|
|
59
67
|
}
|
|
60
68
|
};
|
|
61
69
|
table.selectAll = () => {
|
|
70
|
+
if (!table.options.enableAdvanceSelection)
|
|
71
|
+
return;
|
|
62
72
|
const selectMode = table.options.selectMode || 'page';
|
|
63
73
|
if (selectMode === 'all') {
|
|
64
74
|
table.setSelectionState((old) => (Object.assign(Object.assign({}, old), { ids: [], type: 'exclude' })));
|
|
@@ -72,9 +82,13 @@ exports.CustomSelectionFeature = {
|
|
|
72
82
|
}
|
|
73
83
|
};
|
|
74
84
|
table.deselectAll = () => {
|
|
85
|
+
if (!table.options.enableAdvanceSelection)
|
|
86
|
+
return;
|
|
75
87
|
table.setSelectionState((old) => (Object.assign(Object.assign({}, old), { ids: [], type: 'include' })));
|
|
76
88
|
};
|
|
77
89
|
table.toggleAllRowsSelected = () => {
|
|
90
|
+
if (!table.options.enableAdvanceSelection)
|
|
91
|
+
return;
|
|
78
92
|
if (table.getIsAllRowsSelected()) {
|
|
79
93
|
table.deselectAll();
|
|
80
94
|
}
|
|
@@ -116,7 +130,7 @@ exports.CustomSelectionFeature = {
|
|
|
116
130
|
const selectMode = table.options.selectMode || 'page';
|
|
117
131
|
if (selectMode === 'all' && state.type === 'exclude') {
|
|
118
132
|
const totalCount = table.getRowCount();
|
|
119
|
-
return state.ids.length < totalCount;
|
|
133
|
+
return state.ids.length < totalCount && totalCount > 0;
|
|
120
134
|
}
|
|
121
135
|
else {
|
|
122
136
|
return state.ids.length > 0;
|
|
@@ -134,7 +148,7 @@ exports.CustomSelectionFeature = {
|
|
|
134
148
|
const selectMode = table.options.selectMode || 'page';
|
|
135
149
|
if (selectMode === 'all' && state.type === 'exclude') {
|
|
136
150
|
const totalCount = table.getRowCount();
|
|
137
|
-
return totalCount - state.ids.length;
|
|
151
|
+
return Math.max(0, totalCount - state.ids.length);
|
|
138
152
|
}
|
|
139
153
|
else {
|
|
140
154
|
return state.ids.length;
|
|
@@ -143,12 +157,10 @@ exports.CustomSelectionFeature = {
|
|
|
143
157
|
table.getSelectedRowIds = () => {
|
|
144
158
|
const state = table.getSelectionState();
|
|
145
159
|
if (state.type === 'exclude') {
|
|
146
|
-
console.warn('getSelectedRowIds()
|
|
147
|
-
return
|
|
148
|
-
}
|
|
149
|
-
else {
|
|
150
|
-
return state.ids;
|
|
160
|
+
console.warn('[SelectionFeature] getSelectedRowIds() is not accurate in exclude mode. Use getSelectionState() to interpret selection properly.');
|
|
161
|
+
return [];
|
|
151
162
|
}
|
|
163
|
+
return state.ids;
|
|
152
164
|
};
|
|
153
165
|
table.getSelectedRows = () => {
|
|
154
166
|
const state = table.getSelectionState();
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ColumnOrderState, ColumnPinningState, SortingState, Table } from '@tanstack/react-table';
|
|
2
2
|
import { Ref } from 'react';
|
|
3
|
-
import {
|
|
3
|
+
import { ColumnFilterState, TableFilters, TableState } from '../types';
|
|
4
4
|
import { DataTableApi } from '../types/data-table-api';
|
|
5
5
|
import { SelectionState } from '../features';
|
|
6
6
|
interface UseDataTableApiProps<T> {
|
|
@@ -8,7 +8,7 @@ interface UseDataTableApiProps<T> {
|
|
|
8
8
|
data: T[];
|
|
9
9
|
idKey: keyof T;
|
|
10
10
|
globalFilter: string;
|
|
11
|
-
|
|
11
|
+
columnFilter: ColumnFilterState;
|
|
12
12
|
sorting: SortingState;
|
|
13
13
|
pagination: {
|
|
14
14
|
pageIndex: number;
|
|
@@ -24,15 +24,15 @@ interface UseDataTableApiProps<T> {
|
|
|
24
24
|
pageSize: number;
|
|
25
25
|
selectMode?: 'page' | 'all';
|
|
26
26
|
onSelectionChange?: (state: SelectionState) => void;
|
|
27
|
-
handleColumnFilterStateChange: (filterState:
|
|
27
|
+
handleColumnFilterStateChange: (filterState: ColumnFilterState) => void;
|
|
28
28
|
onDataStateChange?: (state: Partial<TableState>) => void;
|
|
29
29
|
onFetchData?: (filters: Partial<TableFilters>) => void;
|
|
30
30
|
onDataChange?: (newData: T[]) => void;
|
|
31
31
|
exportFilename?: string;
|
|
32
32
|
onExportProgress?: (progress: {
|
|
33
|
-
processedRows
|
|
34
|
-
totalRows
|
|
35
|
-
percentage
|
|
33
|
+
processedRows?: number;
|
|
34
|
+
totalRows?: number;
|
|
35
|
+
percentage?: number;
|
|
36
36
|
}) => void;
|
|
37
37
|
onExportComplete?: (result: {
|
|
38
38
|
success: boolean;
|
|
@@ -5,7 +5,7 @@ const tslib_1 = require("tslib");
|
|
|
5
5
|
const react_1 = require("react");
|
|
6
6
|
const export_utils_1 = require("../utils/export-utils");
|
|
7
7
|
function useDataTableApi(props, ref) {
|
|
8
|
-
const { table, data, idKey, globalFilter,
|
|
8
|
+
const { table, data, idKey, globalFilter, columnFilter, sorting, pagination, columnOrder, columnPinning, enhancedColumns, enablePagination, enableColumnPinning, initialPageIndex, initialPageSize, pageSize, selectMode = 'page', onSelectionChange, handleColumnFilterStateChange, onDataStateChange, onFetchData, onDataChange, exportFilename = 'export', onExportProgress, onExportComplete, onExportError, onServerExport, exportController, setExportController, isExporting, dataMode = 'client', } = props;
|
|
9
9
|
(0, react_1.useImperativeHandle)(ref, () => ({
|
|
10
10
|
table: {
|
|
11
11
|
getTable: () => table,
|
|
@@ -113,7 +113,7 @@ function useDataTableApi(props, ref) {
|
|
|
113
113
|
clearGlobalFilter: () => {
|
|
114
114
|
table.setGlobalFilter('');
|
|
115
115
|
},
|
|
116
|
-
|
|
116
|
+
setColumnFilters: (filters) => {
|
|
117
117
|
handleColumnFilterStateChange(filters);
|
|
118
118
|
},
|
|
119
119
|
addColumnFilter: (columnId, operator, value) => {
|
|
@@ -123,23 +123,23 @@ function useDataTableApi(props, ref) {
|
|
|
123
123
|
operator,
|
|
124
124
|
value,
|
|
125
125
|
};
|
|
126
|
-
const currentFilters =
|
|
126
|
+
const currentFilters = columnFilter.filters || [];
|
|
127
127
|
const newFilters = [...currentFilters, newFilter];
|
|
128
128
|
handleColumnFilterStateChange({
|
|
129
129
|
filters: newFilters,
|
|
130
|
-
logic:
|
|
131
|
-
pendingFilters:
|
|
132
|
-
pendingLogic:
|
|
130
|
+
logic: columnFilter.logic,
|
|
131
|
+
pendingFilters: columnFilter.pendingFilters || [],
|
|
132
|
+
pendingLogic: columnFilter.pendingLogic || 'AND',
|
|
133
133
|
});
|
|
134
134
|
},
|
|
135
135
|
removeColumnFilter: (filterId) => {
|
|
136
|
-
const currentFilters =
|
|
136
|
+
const currentFilters = columnFilter.filters || [];
|
|
137
137
|
const newFilters = currentFilters.filter((f) => f.id !== filterId);
|
|
138
138
|
handleColumnFilterStateChange({
|
|
139
139
|
filters: newFilters,
|
|
140
|
-
logic:
|
|
141
|
-
pendingFilters:
|
|
142
|
-
pendingLogic:
|
|
140
|
+
logic: columnFilter.logic,
|
|
141
|
+
pendingFilters: columnFilter.pendingFilters || [],
|
|
142
|
+
pendingLogic: columnFilter.pendingLogic || 'AND',
|
|
143
143
|
});
|
|
144
144
|
},
|
|
145
145
|
clearAllFilters: () => {
|
|
@@ -222,7 +222,7 @@ function useDataTableApi(props, ref) {
|
|
|
222
222
|
refresh: () => {
|
|
223
223
|
const currentFilters = {
|
|
224
224
|
globalFilter,
|
|
225
|
-
|
|
225
|
+
columnFilter: columnFilter,
|
|
226
226
|
sorting,
|
|
227
227
|
pagination,
|
|
228
228
|
};
|
|
@@ -238,7 +238,7 @@ function useDataTableApi(props, ref) {
|
|
|
238
238
|
reload: () => {
|
|
239
239
|
const currentFilters = {
|
|
240
240
|
globalFilter,
|
|
241
|
-
|
|
241
|
+
columnFilter: columnFilter,
|
|
242
242
|
sorting,
|
|
243
243
|
pagination,
|
|
244
244
|
};
|
|
@@ -392,7 +392,7 @@ function useDataTableApi(props, ref) {
|
|
|
392
392
|
sorting: table.getState().sorting,
|
|
393
393
|
pagination: table.getState().pagination,
|
|
394
394
|
globalFilter: table.getState().globalFilter,
|
|
395
|
-
|
|
395
|
+
columnFilter: columnFilter,
|
|
396
396
|
};
|
|
397
397
|
},
|
|
398
398
|
restoreLayout: (layout) => {
|
|
@@ -417,8 +417,8 @@ function useDataTableApi(props, ref) {
|
|
|
417
417
|
if (layout.globalFilter !== undefined) {
|
|
418
418
|
table.setGlobalFilter(layout.globalFilter);
|
|
419
419
|
}
|
|
420
|
-
if (layout.
|
|
421
|
-
handleColumnFilterStateChange(layout.
|
|
420
|
+
if (layout.columnFilter) {
|
|
421
|
+
handleColumnFilterStateChange(layout.columnFilter);
|
|
422
422
|
}
|
|
423
423
|
},
|
|
424
424
|
},
|
|
@@ -427,7 +427,7 @@ function useDataTableApi(props, ref) {
|
|
|
427
427
|
return table.getState();
|
|
428
428
|
},
|
|
429
429
|
getCurrentFilters: () => {
|
|
430
|
-
return
|
|
430
|
+
return columnFilter;
|
|
431
431
|
},
|
|
432
432
|
getCurrentSorting: () => {
|
|
433
433
|
return table.getState().sorting;
|
|
@@ -450,7 +450,7 @@ function useDataTableApi(props, ref) {
|
|
|
450
450
|
if (dataMode === 'server' && onServerExport) {
|
|
451
451
|
const currentFilters = {
|
|
452
452
|
globalFilter,
|
|
453
|
-
|
|
453
|
+
columnFilter,
|
|
454
454
|
sorting,
|
|
455
455
|
pagination,
|
|
456
456
|
columnOrder,
|
|
@@ -496,7 +496,7 @@ function useDataTableApi(props, ref) {
|
|
|
496
496
|
if (dataMode === 'server' && onServerExport) {
|
|
497
497
|
const currentFilters = {
|
|
498
498
|
globalFilter,
|
|
499
|
-
|
|
499
|
+
columnFilter,
|
|
500
500
|
sorting,
|
|
501
501
|
pagination,
|
|
502
502
|
columnOrder,
|
|
@@ -548,7 +548,7 @@ function useDataTableApi(props, ref) {
|
|
|
548
548
|
setExportController === null || setExportController === void 0 ? void 0 : setExportController(controller);
|
|
549
549
|
const currentFilters = {
|
|
550
550
|
globalFilter,
|
|
551
|
-
|
|
551
|
+
columnFilter,
|
|
552
552
|
sorting,
|
|
553
553
|
pagination,
|
|
554
554
|
columnOrder,
|
|
@@ -585,7 +585,7 @@ function useDataTableApi(props, ref) {
|
|
|
585
585
|
table,
|
|
586
586
|
enhancedColumns,
|
|
587
587
|
handleColumnFilterStateChange,
|
|
588
|
-
|
|
588
|
+
columnFilter,
|
|
589
589
|
data,
|
|
590
590
|
idKey,
|
|
591
591
|
onDataStateChange,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ColumnPinningState, SortingState, ColumnOrderState, TableState, Row } from '@tanstack/react-table';
|
|
2
|
-
import {
|
|
3
|
-
import { SelectionState } from '../features
|
|
2
|
+
import { ColumnFilterState } from './table.types';
|
|
3
|
+
import { SelectionState } from '../features';
|
|
4
4
|
export interface DataTableApi<T = any> {
|
|
5
5
|
columnVisibility: {
|
|
6
6
|
showColumn: (columnId: string) => void;
|
|
@@ -31,7 +31,7 @@ export interface DataTableApi<T = any> {
|
|
|
31
31
|
filtering: {
|
|
32
32
|
setGlobalFilter: (filter: string) => void;
|
|
33
33
|
clearGlobalFilter: () => void;
|
|
34
|
-
|
|
34
|
+
setColumnFilters: (filters: ColumnFilterState) => void;
|
|
35
35
|
addColumnFilter: (columnId: string, operator: string, value: any) => void;
|
|
36
36
|
removeColumnFilter: (filterId: string) => void;
|
|
37
37
|
clearAllFilters: () => void;
|
|
@@ -97,7 +97,7 @@ export interface DataTableApi<T = any> {
|
|
|
97
97
|
};
|
|
98
98
|
state: {
|
|
99
99
|
getTableState: () => any;
|
|
100
|
-
getCurrentFilters: () =>
|
|
100
|
+
getCurrentFilters: () => ColumnFilterState;
|
|
101
101
|
getCurrentSorting: () => SortingState;
|
|
102
102
|
getCurrentPagination: () => {
|
|
103
103
|
pageIndex: number;
|
|
@@ -2,7 +2,7 @@ import { SortingState } from '@tanstack/react-table';
|
|
|
2
2
|
import { ColumnFilterRule, SelectionState } from '../features';
|
|
3
3
|
export type TableSize = 'small' | 'medium';
|
|
4
4
|
export interface TableState {
|
|
5
|
-
|
|
5
|
+
columnFilter: ColumnFilterState;
|
|
6
6
|
selectionState?: SelectionState;
|
|
7
7
|
globalFilter?: string;
|
|
8
8
|
sorting?: SortingState;
|
|
@@ -20,7 +20,7 @@ export interface TableState {
|
|
|
20
20
|
}
|
|
21
21
|
export interface TableFilters {
|
|
22
22
|
globalFilter: string;
|
|
23
|
-
|
|
23
|
+
columnFilter: ColumnFilterState;
|
|
24
24
|
sorting: SortingState;
|
|
25
25
|
pagination: {
|
|
26
26
|
pageIndex: number;
|
|
@@ -37,9 +37,9 @@ export interface TableFiltersForFetch {
|
|
|
37
37
|
page?: number;
|
|
38
38
|
pageSize?: number;
|
|
39
39
|
sorting?: SortingState;
|
|
40
|
-
|
|
40
|
+
columnFilter?: ColumnFilterState;
|
|
41
41
|
}
|
|
42
|
-
export interface
|
|
42
|
+
export interface ColumnFilterState {
|
|
43
43
|
filters: ColumnFilterRule[];
|
|
44
44
|
logic: 'AND' | 'OR';
|
|
45
45
|
pendingFilters: ColumnFilterRule[];
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { DataTableColumn } from '../types';
|
|
2
1
|
import { Column } from "@tanstack/react-table";
|
|
3
2
|
export type ColumnType = 'text' | 'number' | 'date' | 'boolean' | 'select' | 'actions';
|
|
4
3
|
export declare function getColumnType(column: Column<any, unknown>): ColumnType;
|
|
5
4
|
export declare function getCustomFilterComponent(column: Column<any, unknown>): any;
|
|
6
5
|
export declare function getColumnOptions(column: Column<any, unknown>): any[];
|
|
7
|
-
export declare function isColumnFilterable(column:
|
|
6
|
+
export declare function isColumnFilterable(column: Column<any, unknown>): boolean;
|
|
@@ -36,8 +36,9 @@ function getColumnOptions(column) {
|
|
|
36
36
|
return [];
|
|
37
37
|
}
|
|
38
38
|
function isColumnFilterable(column) {
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
var _a, _b;
|
|
40
|
+
if (((_a = column === null || column === void 0 ? void 0 : column.columnDef) === null || _a === void 0 ? void 0 : _a.filterable) !== undefined) {
|
|
41
|
+
return (_b = column === null || column === void 0 ? void 0 : column.columnDef) === null || _b === void 0 ? void 0 : _b.filterable;
|
|
41
42
|
}
|
|
42
43
|
return true;
|
|
43
44
|
}
|