@monolith-forensics/monolith-ui 1.1.90 → 1.1.91
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/dist/MonolithUIProvider/GlobalStyle.d.ts +1 -0
- package/dist/MonolithUIProvider/GlobalStyle.js +17 -0
- package/dist/NewTable/ActionButton.d.ts +4 -0
- package/dist/NewTable/ActionButton.js +11 -0
- package/dist/NewTable/ActionCell.d.ts +4 -0
- package/dist/NewTable/ActionCell.js +12 -0
- package/dist/NewTable/Column.d.ts +3 -0
- package/dist/NewTable/Column.js +5 -0
- package/dist/NewTable/ColumnResizer.d.ts +14 -0
- package/dist/NewTable/ColumnResizer.js +45 -0
- package/dist/NewTable/SelectionCell.d.ts +4 -0
- package/dist/NewTable/SelectionCell.js +12 -0
- package/dist/NewTable/StateStorage.d.ts +18 -0
- package/dist/NewTable/StateStorage.js +72 -0
- package/dist/NewTable/StaticRows.d.ts +5 -0
- package/dist/NewTable/StaticRows.js +10 -0
- package/dist/NewTable/Table.d.ts +3 -0
- package/dist/NewTable/Table.js +83 -0
- package/dist/NewTable/TableComponents.d.ts +16 -0
- package/dist/NewTable/TableComponents.js +139 -0
- package/dist/NewTable/TableDefaults.d.ts +20 -0
- package/dist/NewTable/TableDefaults.js +20 -0
- package/dist/NewTable/TableHeader.d.ts +3 -0
- package/dist/NewTable/TableHeader.js +92 -0
- package/dist/NewTable/TableProvider.d.ts +4 -0
- package/dist/NewTable/TableProvider.js +330 -0
- package/dist/NewTable/TableRow.d.ts +3 -0
- package/dist/NewTable/TableRow.js +27 -0
- package/dist/NewTable/Utils/index.d.ts +3 -0
- package/dist/NewTable/Utils/index.js +3 -0
- package/dist/NewTable/Utils/resizeHandler.d.ts +3 -0
- package/dist/NewTable/Utils/resizeHandler.js +84 -0
- package/dist/NewTable/Utils/resolveColumnReorder.d.ts +3 -0
- package/dist/NewTable/Utils/resolveColumnReorder.js +5 -0
- package/dist/NewTable/Utils/resolveColumnResize.d.ts +3 -0
- package/dist/NewTable/Utils/resolveColumnResize.js +5 -0
- package/dist/NewTable/Utils/syncColumnState.d.ts +3 -0
- package/dist/NewTable/Utils/syncColumnState.js +26 -0
- package/dist/NewTable/VirtualIzedRows.d.ts +12 -0
- package/dist/NewTable/VirtualIzedRows.js +26 -0
- package/dist/NewTable/enums.d.ts +6 -0
- package/dist/NewTable/enums.js +7 -0
- package/dist/NewTable/index.d.ts +4 -0
- package/dist/NewTable/index.js +4 -0
- package/dist/NewTable/types.d.ts +191 -0
- package/dist/NewTable/types.js +1 -0
- package/dist/NewTable/useTable.d.ts +3 -0
- package/dist/NewTable/useTable.js +10 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import ColumnResizer from "./ColumnResizer";
|
|
4
|
+
import { InnerCellContent, TH, THead, THR } from "./TableComponents";
|
|
5
|
+
import { resolveColumnResize } from "./Utils";
|
|
6
|
+
import useTable from "./useTable";
|
|
7
|
+
import CheckBox from "../CheckBox";
|
|
8
|
+
import { ArrowDownIcon, ArrowUpIcon } from "lucide-react";
|
|
9
|
+
import resolveColumnReorder from "./Utils/resolveColumnReorder";
|
|
10
|
+
const TableHeader = ({ headerRowElm }) => {
|
|
11
|
+
var _a;
|
|
12
|
+
const { columnState, sortState, setColumnState, onColumnResize, handleColumnReorder, enableColumnReorder, handleColumnHeaderClick, enableColumnResize, headerRowHeight, enableActionButton, enableSelection, selectionState, disableSelectAll, selectAllRows, clearSelections, } = useTable();
|
|
13
|
+
const [dragColumn, setDragColumn] = useState(null);
|
|
14
|
+
const [dropColumn, setDropColumn] = useState(null);
|
|
15
|
+
const handleResize = (e) => {
|
|
16
|
+
const columnId = e.column.columnId;
|
|
17
|
+
setColumnState((prevColumnState) => {
|
|
18
|
+
const newState = prevColumnState.map((col) => {
|
|
19
|
+
if (col.columnId === columnId) {
|
|
20
|
+
return Object.assign(Object.assign({}, col), { width: Number(e.newWidth) });
|
|
21
|
+
}
|
|
22
|
+
return col;
|
|
23
|
+
});
|
|
24
|
+
onColumnResize === null || onColumnResize === void 0 ? void 0 : onColumnResize({
|
|
25
|
+
column: Object.assign(Object.assign({}, e.column), { width: Number(e.newWidth) }),
|
|
26
|
+
columnState: newState,
|
|
27
|
+
});
|
|
28
|
+
return newState;
|
|
29
|
+
});
|
|
30
|
+
};
|
|
31
|
+
const handleChangeSelection = (e) => {
|
|
32
|
+
e ? selectAllRows() : clearSelections();
|
|
33
|
+
};
|
|
34
|
+
return (_jsx(THead, { className: "mfui-thead", children: _jsxs(THR, { ref: headerRowElm, height: headerRowHeight, children: [enableSelection && (_jsx(TH, { className: `mfui-th column-action`, style: {
|
|
35
|
+
width: "40px",
|
|
36
|
+
minWidth: "40px",
|
|
37
|
+
maxWidth: "40px",
|
|
38
|
+
display: "flex",
|
|
39
|
+
justifyContent: "center",
|
|
40
|
+
alignItems: "center",
|
|
41
|
+
}, children: _jsx(InnerCellContent, { className: "mfui inner-cell-content", children: disableSelectAll !== true && (_jsx(CheckBox, { value: selectionState.selectionStatus === "all", partialCheck: (_a = selectionState.selectionStatus) === null || _a === void 0 ? void 0 : _a.includes("some"), onChange: handleChangeSelection })) }) })), enableActionButton && (_jsx(TH, { className: `mfui-th column-action`, style: {
|
|
42
|
+
width: "40px",
|
|
43
|
+
minWidth: "40px",
|
|
44
|
+
maxWidth: "40px",
|
|
45
|
+
}, children: _jsx(InnerCellContent, { className: "mfui inner-cell-content" }) })), columnState.map((column) => {
|
|
46
|
+
if (column.visible === false)
|
|
47
|
+
return null;
|
|
48
|
+
const canReorder = resolveColumnReorder(column, enableColumnReorder);
|
|
49
|
+
const canResize = resolveColumnResize(column, enableColumnResize);
|
|
50
|
+
const dndEvents = canReorder
|
|
51
|
+
? {
|
|
52
|
+
onDragOver: (e) => {
|
|
53
|
+
e.preventDefault();
|
|
54
|
+
e.dataTransfer.dropEffect = "move";
|
|
55
|
+
},
|
|
56
|
+
onDragEnter: (e) => {
|
|
57
|
+
e.target.classList.add("dragover");
|
|
58
|
+
setDropColumn(column);
|
|
59
|
+
},
|
|
60
|
+
onDragLeave: (e) => {
|
|
61
|
+
e.target.classList.remove("dragover");
|
|
62
|
+
},
|
|
63
|
+
onDrop: (e) => {
|
|
64
|
+
e.preventDefault();
|
|
65
|
+
e.target.classList.remove("dragover");
|
|
66
|
+
if (dragColumn && dropColumn) {
|
|
67
|
+
handleColumnReorder(dragColumn, dropColumn);
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
onDragStart: (e) => {
|
|
71
|
+
//set dragging class
|
|
72
|
+
setDragColumn(column);
|
|
73
|
+
e.target.classList.add("dragging");
|
|
74
|
+
},
|
|
75
|
+
onDragEnd: (e) => {
|
|
76
|
+
e.target.classList.remove("dragging");
|
|
77
|
+
},
|
|
78
|
+
}
|
|
79
|
+
: {};
|
|
80
|
+
return (_jsxs(TH, Object.assign({ className: `mfui-th column-${column.columnId}`, "data-field": column.dataField, draggable: canReorder, onClick: () => handleColumnHeaderClick(column) }, dndEvents, { style: {
|
|
81
|
+
width: column.width,
|
|
82
|
+
minWidth: column.minWidth,
|
|
83
|
+
flex: column.width ? "0 0 auto" : "1",
|
|
84
|
+
}, children: [canResize && (_jsx(ColumnResizer, { column: column, showOnHover: true, onResize: (e) => {
|
|
85
|
+
// console.log("onResize", e);
|
|
86
|
+
}, onResizeFinished: (e) => {
|
|
87
|
+
handleResize(e);
|
|
88
|
+
} })), _jsxs(InnerCellContent, { className: "mfui inner-cell-content", children: [column.caption, (sortState === null || sortState === void 0 ? void 0 : sortState.dataField) === column.dataField &&
|
|
89
|
+
(sortState.dir === "asc" ? (_jsx(ArrowUpIcon, { size: 14 })) : (_jsx(ArrowDownIcon, { size: 14 })))] })] }), column.columnId));
|
|
90
|
+
})] }) }));
|
|
91
|
+
};
|
|
92
|
+
export default TableHeader;
|
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
2
|
+
var t = {};
|
|
3
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
4
|
+
t[p] = s[p];
|
|
5
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
6
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
7
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
8
|
+
t[p[i]] = s[p[i]];
|
|
9
|
+
}
|
|
10
|
+
return t;
|
|
11
|
+
};
|
|
12
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
13
|
+
import { createContext, useEffect, useMemo, useState } from "react";
|
|
14
|
+
import StateStorage from "./StateStorage";
|
|
15
|
+
import { resolveColumnResize, syncColumnState } from "./Utils";
|
|
16
|
+
import TableDefaults from "./TableDefaults";
|
|
17
|
+
import shortUUID from "short-uuid";
|
|
18
|
+
import { SelectionStatus } from "./enums";
|
|
19
|
+
const defaultSelectionState = {
|
|
20
|
+
selectedRowKeys: [],
|
|
21
|
+
excludedRowKeys: [],
|
|
22
|
+
selectionStatus: SelectionStatus.None,
|
|
23
|
+
};
|
|
24
|
+
export const TableContext = createContext({
|
|
25
|
+
columnState: [],
|
|
26
|
+
data: [],
|
|
27
|
+
setColumnState: () => { },
|
|
28
|
+
onColumnResize: () => { },
|
|
29
|
+
onColumnStateChange: () => { },
|
|
30
|
+
handleColumnReorder: () => { },
|
|
31
|
+
handleColumnHeaderClick: () => { },
|
|
32
|
+
onSelectionChange: () => { },
|
|
33
|
+
selectedRowKeys: [],
|
|
34
|
+
selectionState: defaultSelectionState,
|
|
35
|
+
isRowSelected: () => false,
|
|
36
|
+
selectRow: () => { },
|
|
37
|
+
deselectRow: () => { },
|
|
38
|
+
getSelectedRowKeys: () => [],
|
|
39
|
+
selectAllRows: () => { },
|
|
40
|
+
clearSelections: () => { },
|
|
41
|
+
});
|
|
42
|
+
const TableProvider = (_a) => {
|
|
43
|
+
var { children, columns, tableInstanceRef, stateStorage } = _a, props = __rest(_a, ["children", "columns", "tableInstanceRef", "stateStorage"]);
|
|
44
|
+
const _columns = columns
|
|
45
|
+
.map((child, index) => {
|
|
46
|
+
if (child.dataField === "__key") {
|
|
47
|
+
throw new Error("dataField cannot be __key");
|
|
48
|
+
}
|
|
49
|
+
// check for duplicate dataFields
|
|
50
|
+
const dataFieldCount = columns.filter((col) => col.dataField === child.dataField).length;
|
|
51
|
+
if (dataFieldCount > 1) {
|
|
52
|
+
throw new Error(`Duplicate dataField found: ${child.dataField}. dataField must be unique.`);
|
|
53
|
+
}
|
|
54
|
+
return Object.assign(Object.assign({}, child), { visible: child.visible === undefined ? true : child.visible, orderValue: index, minWidth: (child === null || child === void 0 ? void 0 : child.width)
|
|
55
|
+
? child.width < TableDefaults.td.minWidth
|
|
56
|
+
? child.width
|
|
57
|
+
: TableDefaults.td.minWidth
|
|
58
|
+
: TableDefaults.td.minWidth, columnId: shortUUID.generate(), enableResize: resolveColumnResize(child, props.enableColumnResize) });
|
|
59
|
+
})
|
|
60
|
+
.sort((a, b) => a.orderValue - b.orderValue);
|
|
61
|
+
const savedTableState = useMemo(() => {
|
|
62
|
+
return (stateStorage === null || stateStorage === void 0 ? void 0 : stateStorage.enabled)
|
|
63
|
+
? StateStorage.getTableState(stateStorage.key)
|
|
64
|
+
: undefined;
|
|
65
|
+
}, []);
|
|
66
|
+
const { columnState: savedColumnState, selectionState: savedSelectionState, sortState: savedSortState, } = savedTableState || {};
|
|
67
|
+
const [columnState, setColumnState] = useState(syncColumnState(_columns, savedColumnState));
|
|
68
|
+
const [search, setSearch] = useState();
|
|
69
|
+
const [sortState, setSortState] = useState(savedSortState);
|
|
70
|
+
const [selectionStatus, setSelectionStatus] = useState((savedSelectionState === null || savedSelectionState === void 0 ? void 0 : savedSelectionState.selectionStatus) || SelectionStatus.None);
|
|
71
|
+
const [excludedRowKeys, setExcludedRowKeys] = useState((savedSelectionState === null || savedSelectionState === void 0 ? void 0 : savedSelectionState.excludedRowKeys) || []);
|
|
72
|
+
const [selectedRowKeys, setSelectedRowKeys] = useState((savedSelectionState === null || savedSelectionState === void 0 ? void 0 : savedSelectionState.selectedRowKeys) || []);
|
|
73
|
+
const getColumnState = (dataField) => {
|
|
74
|
+
return columnState.find((col) => col.dataField === dataField);
|
|
75
|
+
};
|
|
76
|
+
const handleColumnReorder = (dragColumn, dropColumn) => {
|
|
77
|
+
var _a, _b, _c;
|
|
78
|
+
if (!dragColumn || !dropColumn)
|
|
79
|
+
return;
|
|
80
|
+
const dropColumnOrder = (_a = columnState.find((col) => col.dataField === dropColumn.dataField)) === null || _a === void 0 ? void 0 : _a.orderValue;
|
|
81
|
+
const dragColumnOrder = (_b = columnState.find((col) => col.dataField === dragColumn.dataField)) === null || _b === void 0 ? void 0 : _b.orderValue;
|
|
82
|
+
if (dropColumnOrder === undefined || dragColumnOrder === undefined)
|
|
83
|
+
return;
|
|
84
|
+
const moveDirection = dragColumnOrder < dropColumnOrder ? "right" : "left";
|
|
85
|
+
const newColumnState = columnState
|
|
86
|
+
.map((col) => {
|
|
87
|
+
if (col.dataField === dragColumn.dataField) {
|
|
88
|
+
col.orderValue =
|
|
89
|
+
dropColumnOrder + (moveDirection === "right" ? 1 : -1);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
if (col.orderValue > dropColumnOrder) {
|
|
93
|
+
col.orderValue = col.orderValue + 1;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return col;
|
|
97
|
+
})
|
|
98
|
+
.sort((a, b) => a.orderValue - b.orderValue);
|
|
99
|
+
setColumnState(newColumnState);
|
|
100
|
+
(_c = props.onColumnReorder) === null || _c === void 0 ? void 0 : _c.call(props, {
|
|
101
|
+
columnState: newColumnState,
|
|
102
|
+
column: dragColumn,
|
|
103
|
+
});
|
|
104
|
+
};
|
|
105
|
+
const handleColumnHeaderClick = (column) => {
|
|
106
|
+
var _a;
|
|
107
|
+
if (props.enableSorting === true || column.enableSorting === true) {
|
|
108
|
+
setSortState((prevSortState) => {
|
|
109
|
+
var _a;
|
|
110
|
+
let newSortState = {
|
|
111
|
+
dataField: column.dataField,
|
|
112
|
+
dir: "asc",
|
|
113
|
+
};
|
|
114
|
+
if ((prevSortState === null || prevSortState === void 0 ? void 0 : prevSortState.dataField) === column.dataField) {
|
|
115
|
+
if (prevSortState.dir === "desc") {
|
|
116
|
+
newSortState = null;
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
if (newSortState) {
|
|
120
|
+
newSortState.dir = prevSortState.dir === "asc" ? "desc" : "asc";
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
(_a = props.onColumnHeaderClick) === null || _a === void 0 ? void 0 : _a.call(props, { column, sort: newSortState });
|
|
125
|
+
return newSortState;
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
(_a = props.onColumnHeaderClick) === null || _a === void 0 ? void 0 : _a.call(props, { column, sort: null });
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
const runSearch = (searchText) => {
|
|
133
|
+
setSearch(searchText);
|
|
134
|
+
};
|
|
135
|
+
const sortData = (sortState) => {
|
|
136
|
+
// sort data
|
|
137
|
+
return props.data.sort((a, b) => {
|
|
138
|
+
if (sortState) {
|
|
139
|
+
if (sortState.dir === "asc") {
|
|
140
|
+
if (a[sortState.dataField] < b[sortState.dataField]) {
|
|
141
|
+
return -1;
|
|
142
|
+
}
|
|
143
|
+
if (a[sortState.dataField] > b[sortState.dataField]) {
|
|
144
|
+
return 1;
|
|
145
|
+
}
|
|
146
|
+
return 0;
|
|
147
|
+
}
|
|
148
|
+
else if (sortState.dir === "desc") {
|
|
149
|
+
if (a[sortState.dataField] > b[sortState.dataField]) {
|
|
150
|
+
return -1;
|
|
151
|
+
}
|
|
152
|
+
if (a[sortState.dataField] < b[sortState.dataField]) {
|
|
153
|
+
return 1;
|
|
154
|
+
}
|
|
155
|
+
return 0;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// sort by __index
|
|
159
|
+
if (a.__index < b.__index) {
|
|
160
|
+
return -1;
|
|
161
|
+
}
|
|
162
|
+
if (a.__index > b.__index) {
|
|
163
|
+
return 1;
|
|
164
|
+
}
|
|
165
|
+
return 0;
|
|
166
|
+
});
|
|
167
|
+
};
|
|
168
|
+
const searchData = (searchText) => {
|
|
169
|
+
return props.data.filter((row) => {
|
|
170
|
+
return Object.keys(row)
|
|
171
|
+
.filter((key) => key !== "__key" && key !== "__index")
|
|
172
|
+
.some((key) => {
|
|
173
|
+
if (typeof row[key] === "string") {
|
|
174
|
+
return row[key].toLowerCase().includes(searchText.toLowerCase());
|
|
175
|
+
}
|
|
176
|
+
return false;
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
};
|
|
180
|
+
const toggleColumnVisibility = (dataField) => {
|
|
181
|
+
setColumnState((prevColumnState) => {
|
|
182
|
+
return prevColumnState.map((col) => {
|
|
183
|
+
if (col.dataField === dataField) {
|
|
184
|
+
return Object.assign(Object.assign({}, col), { visible: !col.visible });
|
|
185
|
+
}
|
|
186
|
+
return col;
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
};
|
|
190
|
+
const getColumnVisibility = (dataField) => {
|
|
191
|
+
var _a;
|
|
192
|
+
return (((_a = columnState.find((col) => col.dataField === dataField)) === null || _a === void 0 ? void 0 : _a.visible) || true);
|
|
193
|
+
};
|
|
194
|
+
const selectRow = (row) => {
|
|
195
|
+
const key = !!props.keyField ? row[props.keyField] : row.__key;
|
|
196
|
+
const keyField = !!props.keyField ? props.keyField : "__key";
|
|
197
|
+
if (props.data.length === selectedRowKeys.length + 1) {
|
|
198
|
+
setSelectionStatus(SelectionStatus.All);
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
setSelectionStatus(SelectionStatus.SomeIncluded);
|
|
202
|
+
}
|
|
203
|
+
setSelectedRowKeys((prevSelectedRowKeys) => {
|
|
204
|
+
return [...prevSelectedRowKeys, key];
|
|
205
|
+
});
|
|
206
|
+
setExcludedRowKeys((prev) => prev.filter((k) => k !== key));
|
|
207
|
+
};
|
|
208
|
+
const deselectRow = (row) => {
|
|
209
|
+
const key = !!props.keyField ? props.keyField : "__key";
|
|
210
|
+
if (selectionStatus === SelectionStatus.All ||
|
|
211
|
+
selectionStatus === SelectionStatus.SomeExcluded) {
|
|
212
|
+
setSelectionStatus(SelectionStatus.SomeExcluded);
|
|
213
|
+
setExcludedRowKeys((prev) => [...prev, row[key]]);
|
|
214
|
+
}
|
|
215
|
+
if (selectedRowKeys.length === 1) {
|
|
216
|
+
setSelectionStatus(SelectionStatus.None);
|
|
217
|
+
}
|
|
218
|
+
setSelectedRowKeys((prevSelectedRowKeys) => {
|
|
219
|
+
return prevSelectedRowKeys.filter((k) => k !== row[key]);
|
|
220
|
+
});
|
|
221
|
+
};
|
|
222
|
+
const selectAllRows = () => {
|
|
223
|
+
var _a;
|
|
224
|
+
const keys = ((_a = props.data) === null || _a === void 0 ? void 0 : _a.map((row) => !!props.keyField ? row[props.keyField] : row.__key)) || [];
|
|
225
|
+
setSelectedRowKeys(keys);
|
|
226
|
+
setSelectionStatus(SelectionStatus.All);
|
|
227
|
+
setExcludedRowKeys([]);
|
|
228
|
+
};
|
|
229
|
+
const clearSelections = () => {
|
|
230
|
+
setSelectedRowKeys([]);
|
|
231
|
+
setSelectionStatus(SelectionStatus.None);
|
|
232
|
+
setExcludedRowKeys([]);
|
|
233
|
+
};
|
|
234
|
+
const getSelectedRows = () => {
|
|
235
|
+
return props.data.filter((row) => {
|
|
236
|
+
const key = !!props.keyField ? row[props.keyField] : row.__key;
|
|
237
|
+
return selectedRowKeys.includes(key);
|
|
238
|
+
});
|
|
239
|
+
};
|
|
240
|
+
const getSelectedRowKeys = () => {
|
|
241
|
+
return selectedRowKeys;
|
|
242
|
+
};
|
|
243
|
+
const isRowSelected = (row) => {
|
|
244
|
+
const key = !!props.keyField ? row[props.keyField] : row.__key;
|
|
245
|
+
return selectedRowKeys.includes(key);
|
|
246
|
+
};
|
|
247
|
+
useEffect(() => {
|
|
248
|
+
var _a;
|
|
249
|
+
(_a = props.onColumnStateChange) === null || _a === void 0 ? void 0 : _a.call(props, columnState);
|
|
250
|
+
if (stateStorage === null || stateStorage === void 0 ? void 0 : stateStorage.enabled) {
|
|
251
|
+
if ((stateStorage === null || stateStorage === void 0 ? void 0 : stateStorage.type) === "localStorage") {
|
|
252
|
+
StateStorage.setColumnState(stateStorage.key, columnState);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
if (tableInstanceRef) {
|
|
256
|
+
tableInstanceRef.current = {
|
|
257
|
+
columnState,
|
|
258
|
+
setColumnState,
|
|
259
|
+
getColumnState,
|
|
260
|
+
toggleColumnVisibility,
|
|
261
|
+
getColumnVisibility,
|
|
262
|
+
getSelectedRows,
|
|
263
|
+
getSelectedRowKeys,
|
|
264
|
+
selectRow,
|
|
265
|
+
deselectRow,
|
|
266
|
+
selectAllRows,
|
|
267
|
+
clearSelections,
|
|
268
|
+
runSearch,
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
}, [columnState]);
|
|
272
|
+
useEffect(() => {
|
|
273
|
+
var _a;
|
|
274
|
+
(_a = props === null || props === void 0 ? void 0 : props.onSelectionChange) === null || _a === void 0 ? void 0 : _a.call(props, {
|
|
275
|
+
selectedRowKeys,
|
|
276
|
+
excludedRowKeys,
|
|
277
|
+
selectionStatus,
|
|
278
|
+
});
|
|
279
|
+
if (stateStorage === null || stateStorage === void 0 ? void 0 : stateStorage.enabled) {
|
|
280
|
+
if ((stateStorage === null || stateStorage === void 0 ? void 0 : stateStorage.type) === "localStorage") {
|
|
281
|
+
StateStorage.setSelectionState(stateStorage.key, {
|
|
282
|
+
selectedRowKeys,
|
|
283
|
+
excludedRowKeys,
|
|
284
|
+
selectionStatus,
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}, [
|
|
289
|
+
selectedRowKeys,
|
|
290
|
+
selectionStatus,
|
|
291
|
+
excludedRowKeys,
|
|
292
|
+
props === null || props === void 0 ? void 0 : props.onSelectionChange,
|
|
293
|
+
stateStorage === null || stateStorage === void 0 ? void 0 : stateStorage.enabled,
|
|
294
|
+
stateStorage === null || stateStorage === void 0 ? void 0 : stateStorage.type,
|
|
295
|
+
stateStorage === null || stateStorage === void 0 ? void 0 : stateStorage.key,
|
|
296
|
+
]);
|
|
297
|
+
useEffect(() => {
|
|
298
|
+
if (stateStorage === null || stateStorage === void 0 ? void 0 : stateStorage.enabled) {
|
|
299
|
+
if ((stateStorage === null || stateStorage === void 0 ? void 0 : stateStorage.type) === "localStorage") {
|
|
300
|
+
StateStorage.setSortState(stateStorage.key, sortState);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}, [sortState]);
|
|
304
|
+
const _data = useMemo(() => {
|
|
305
|
+
let processedData = props.data;
|
|
306
|
+
if (props.manualSorting !== true) {
|
|
307
|
+
processedData = sortData(sortState);
|
|
308
|
+
}
|
|
309
|
+
if (search) {
|
|
310
|
+
processedData = searchData(search);
|
|
311
|
+
}
|
|
312
|
+
return processedData;
|
|
313
|
+
}, [props.data, columnState, search, sortState]);
|
|
314
|
+
return (_jsx(TableContext.Provider, { value: Object.assign(Object.assign({ columnState,
|
|
315
|
+
setColumnState,
|
|
316
|
+
sortState,
|
|
317
|
+
handleColumnReorder,
|
|
318
|
+
handleColumnHeaderClick, selectionState: {
|
|
319
|
+
selectedRowKeys,
|
|
320
|
+
excludedRowKeys,
|
|
321
|
+
selectionStatus,
|
|
322
|
+
}, selectRow,
|
|
323
|
+
deselectRow,
|
|
324
|
+
isRowSelected,
|
|
325
|
+
selectedRowKeys,
|
|
326
|
+
getSelectedRowKeys,
|
|
327
|
+
selectAllRows,
|
|
328
|
+
clearSelections }, props), { data: _data }), children: children }));
|
|
329
|
+
};
|
|
330
|
+
export default TableProvider;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Maximize2Icon } from "lucide-react";
|
|
3
|
+
import ColumnResizer from "./ColumnResizer";
|
|
4
|
+
import { InnerCellContent, TD, TR } from "./TableComponents";
|
|
5
|
+
import useTable from "./useTable";
|
|
6
|
+
import ActionCell from "./ActionCell";
|
|
7
|
+
import ActionButton from "./ActionButton";
|
|
8
|
+
import CheckBox from "../CheckBox";
|
|
9
|
+
const TableRow = ({ rowData, rowStyle }) => {
|
|
10
|
+
const { columnState, enableActionButton, onActionButtonClick, actionButtonIcon: Icon, enableSelection, selectRow, deselectRow, isRowSelected, } = useTable();
|
|
11
|
+
const selected = isRowSelected(rowData);
|
|
12
|
+
const handleSelectionChange = (e) => {
|
|
13
|
+
e === true ? selectRow(rowData) : deselectRow(rowData);
|
|
14
|
+
};
|
|
15
|
+
return (_jsxs(TR, { className: "mfui-tr", style: rowStyle, "data-key": rowData.__key, children: [enableSelection && (_jsx(ActionCell, { className: `mfui-td column-select`, children: _jsx(InnerCellContent, { className: "mfui inner-cell-content", children: _jsx(CheckBox, { value: selected, onChange: (e) => handleSelectionChange(e) }) }) })), enableActionButton && (_jsx(ActionCell, { className: `mfui-td column-action`, children: _jsx(InnerCellContent, { className: "mfui inner-cell-content", children: _jsx(ActionButton, { variant: "subtle", onClick: () => onActionButtonClick === null || onActionButtonClick === void 0 ? void 0 : onActionButtonClick(rowData), children: Icon ? _jsx(Icon, { size: 14 }) : _jsx(Maximize2Icon, { size: 14 }) }) }) })), columnState.map((column, index) => {
|
|
16
|
+
if (column.visible === false)
|
|
17
|
+
return null;
|
|
18
|
+
return (_jsxs(TD, { className: `mfui-td column-${column.columnId}`, "data-field": column.dataField, style: {
|
|
19
|
+
width: column.width,
|
|
20
|
+
minWidth: column.minWidth,
|
|
21
|
+
flex: column.width ? "0 0 auto" : "1",
|
|
22
|
+
}, children: [(column === null || column === void 0 ? void 0 : column.enableResize) === true && _jsx(ColumnResizer, { column: column }), _jsx(InnerCellContent, { className: "mfui inner-cell-content", children: column.render
|
|
23
|
+
? column.render(rowData)
|
|
24
|
+
: rowData[column.dataField] })] }, index));
|
|
25
|
+
})] }));
|
|
26
|
+
};
|
|
27
|
+
export default TableRow;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import TableDefaults from "../TableDefaults";
|
|
2
|
+
const enableResizeClass = (dataField) => {
|
|
3
|
+
if (dataField === undefined) {
|
|
4
|
+
return;
|
|
5
|
+
}
|
|
6
|
+
document.querySelectorAll(`.resizer.col-${dataField}`).forEach((resizer) => {
|
|
7
|
+
resizer.classList.add("isResizing");
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
const disableResizeClass = (dataField) => {
|
|
11
|
+
if (dataField === undefined) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
document.querySelectorAll(`.resizer.col-${dataField}`).forEach((resizer) => {
|
|
15
|
+
resizer.classList.remove("isResizing");
|
|
16
|
+
});
|
|
17
|
+
};
|
|
18
|
+
const resizeHandler = ({ event, columnId, columnProps, onResize, onResizeFinished, }) => {
|
|
19
|
+
let col = event.target
|
|
20
|
+
.parentElement;
|
|
21
|
+
let newColumns = [];
|
|
22
|
+
let x = 0;
|
|
23
|
+
let w = 0;
|
|
24
|
+
const mouseMoveHandler = function (e) {
|
|
25
|
+
const selectedColumn = document.querySelectorAll(`.column-${columnId}`);
|
|
26
|
+
const columnHeaders = document.querySelectorAll(`.mfui-th.column-${columnId}`);
|
|
27
|
+
const dx = e.clientX - x;
|
|
28
|
+
let newWidth = w + dx;
|
|
29
|
+
// Calculate what the minimum width should be
|
|
30
|
+
// min width should be the defined column width or the default min width
|
|
31
|
+
if (columnProps.minWidth === undefined) {
|
|
32
|
+
if (newWidth < TableDefaults.td.minWidth)
|
|
33
|
+
newWidth = TableDefaults.td.minWidth;
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
if (newWidth < columnProps.minWidth)
|
|
37
|
+
newWidth = columnProps.minWidth;
|
|
38
|
+
}
|
|
39
|
+
selectedColumn.forEach((col) => {
|
|
40
|
+
var _a;
|
|
41
|
+
col.style.width = `${newWidth}px`;
|
|
42
|
+
col.style.flex = "0 0 auto";
|
|
43
|
+
// col.style.maxWidth = `${newWidth}px`;
|
|
44
|
+
// col.style.minWidth = `${newWidth}px`;
|
|
45
|
+
newColumns.push({
|
|
46
|
+
dataField: ((_a = col === null || col === void 0 ? void 0 : col.dataset) === null || _a === void 0 ? void 0 : _a.field) || "",
|
|
47
|
+
width: newWidth,
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
newColumns = Array.from(columnHeaders).map((col) => {
|
|
51
|
+
var _a;
|
|
52
|
+
return {
|
|
53
|
+
dataField: ((_a = col === null || col === void 0 ? void 0 : col.dataset) === null || _a === void 0 ? void 0 : _a.field) || "",
|
|
54
|
+
width: newWidth,
|
|
55
|
+
};
|
|
56
|
+
});
|
|
57
|
+
onResize({
|
|
58
|
+
columns: newColumns,
|
|
59
|
+
});
|
|
60
|
+
};
|
|
61
|
+
const mouseUpHandler = function () {
|
|
62
|
+
var _a, _b, _c;
|
|
63
|
+
let newWidth = ((_c = (_b = (_a = document === null || document === void 0 ? void 0 : document.querySelector) === null || _a === void 0 ? void 0 : _a.call(document, `.column-${columnId}`)) === null || _b === void 0 ? void 0 : _b.style) === null || _c === void 0 ? void 0 : _c.width) || null;
|
|
64
|
+
if (newWidth) {
|
|
65
|
+
newWidth = newWidth.replace("px", "");
|
|
66
|
+
}
|
|
67
|
+
disableResizeClass(columnId);
|
|
68
|
+
document.removeEventListener("mousemove", mouseMoveHandler);
|
|
69
|
+
document.removeEventListener("mouseup", mouseUpHandler);
|
|
70
|
+
onResizeFinished === null || onResizeFinished === void 0 ? void 0 : onResizeFinished({
|
|
71
|
+
column: columnProps,
|
|
72
|
+
columnId: columnId,
|
|
73
|
+
targetColumn: document.querySelector(`.column-${columnId}`),
|
|
74
|
+
newWidth,
|
|
75
|
+
});
|
|
76
|
+
};
|
|
77
|
+
x = event.clientX;
|
|
78
|
+
const styles = window.getComputedStyle(col);
|
|
79
|
+
w = parseInt(styles.width, 10);
|
|
80
|
+
document.addEventListener("mousemove", mouseMoveHandler);
|
|
81
|
+
document.addEventListener("mouseup", mouseUpHandler);
|
|
82
|
+
enableResizeClass(columnId);
|
|
83
|
+
};
|
|
84
|
+
export default resizeHandler;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// Synchronizes columnDefs and stored column state
|
|
2
|
+
// Ensures if ColumnDefs are updated, the column state is updated as well
|
|
3
|
+
function syncColumnState(initialState, columnState) {
|
|
4
|
+
if (!columnState) {
|
|
5
|
+
return initialState;
|
|
6
|
+
}
|
|
7
|
+
const newColumnState = [...initialState];
|
|
8
|
+
// remove columns that are no longer in columnDefs
|
|
9
|
+
columnState = columnState.filter((savedColumn) => initialState.find((c) => savedColumn.dataField.includes("custom_field_") || // ignore custom fields
|
|
10
|
+
c.dataField === savedColumn.dataField));
|
|
11
|
+
for (const savedColumn of columnState) {
|
|
12
|
+
const column = initialState.find((c) => c.dataField === savedColumn.dataField);
|
|
13
|
+
if (column) {
|
|
14
|
+
column.visible = savedColumn.visible;
|
|
15
|
+
// column.sorting = savedColumn.sorting;
|
|
16
|
+
column.columnId = savedColumn.columnId;
|
|
17
|
+
column.width = savedColumn.width;
|
|
18
|
+
column.orderValue = savedColumn.orderValue;
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
newColumnState.push(savedColumn);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return newColumnState.sort((a, b) => a.orderValue - b.orderValue);
|
|
25
|
+
}
|
|
26
|
+
export default syncColumnState;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
declare const VirtualizedRows: React.FC<{
|
|
2
|
+
tableDimensions: {
|
|
3
|
+
width: number;
|
|
4
|
+
height: number;
|
|
5
|
+
};
|
|
6
|
+
targetElm: React.RefObject<HTMLDivElement>;
|
|
7
|
+
listElm: React.RefObject<HTMLDivElement>;
|
|
8
|
+
rowHeight?: number;
|
|
9
|
+
headerRowHeight?: number;
|
|
10
|
+
compact?: boolean;
|
|
11
|
+
}>;
|
|
12
|
+
export default VirtualizedRows;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { FixedSizeList } from "react-window";
|
|
3
|
+
import { TableViewPort } from "./TableComponents";
|
|
4
|
+
import useTable from "./useTable";
|
|
5
|
+
import TableDefaults from "./TableDefaults";
|
|
6
|
+
import TableRow from "./TableRow";
|
|
7
|
+
const VirtualizedRows = ({ tableDimensions, targetElm, listElm, rowHeight, headerRowHeight, compact, }) => {
|
|
8
|
+
const { data } = useTable();
|
|
9
|
+
return (_jsx(TableViewPort, { className: "mfui-tbody-viewport", ref: targetElm, style: tableDimensions, children: _jsx(FixedSizeList, { itemData: { data }, overscanCount: 10, height: tableDimensions.height -
|
|
10
|
+
(headerRowHeight
|
|
11
|
+
? headerRowHeight
|
|
12
|
+
: compact
|
|
13
|
+
? TableDefaults.row.height.compact
|
|
14
|
+
: TableDefaults.row.height.normal), width: tableDimensions.width, itemCount: (data === null || data === void 0 ? void 0 : data.length) || 0, itemSize: rowHeight
|
|
15
|
+
? rowHeight
|
|
16
|
+
: compact
|
|
17
|
+
? TableDefaults.row.height.compact
|
|
18
|
+
: TableDefaults.row.height.normal, outerRef: listElm, innerElementType: (props) => {
|
|
19
|
+
return _jsx("tbody", Object.assign({ className: "mfui-tbody" }, props));
|
|
20
|
+
}, children: ({ data, index, style }) => {
|
|
21
|
+
var _a;
|
|
22
|
+
const row = ((_a = data === null || data === void 0 ? void 0 : data.data) === null || _a === void 0 ? void 0 : _a[index]) || {};
|
|
23
|
+
return (_jsx(TableRow, { rowData: row, rowStyle: Object.assign(Object.assign({}, style), { height: rowHeight }) }, index));
|
|
24
|
+
} }) }));
|
|
25
|
+
};
|
|
26
|
+
export default VirtualizedRows;
|