@ackplus/react-tanstack-data-table
Version:
A powerful React data table component built with MUI and TanStack Table
173 lines (172 loc) • 6.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.CustomSelectionFeature = void 0;
const react_table_1 = require("@tanstack/react-table");
exports.CustomSelectionFeature = {
getInitialState: (state) => {
return Object.assign({ selectionState: {
ids: [],
type: 'include',
selectMode: 'page',
} }, state);
},
getDefaultOptions: (table) => {
return {
enableCustomSelection: true,
selectMode: 'page',
onSelectionStateChange: (0, react_table_1.makeStateUpdater)('selectionState', table),
};
},
createTable: (table) => {
table.setSelectionState = (updater) => {
var _a, _b;
const safeUpdater = (old) => {
const newState = (0, react_table_1.functionalUpdate)(updater, old);
return newState;
};
return (_b = (_a = table.options).onSelectionStateChange) === null || _b === void 0 ? void 0 : _b.call(_a, safeUpdater);
};
table.selectRow = (rowId) => {
if (!table.canSelectRow(rowId))
return;
table.setSelectionState((old) => {
if (old.type === 'exclude') {
return Object.assign(Object.assign({}, old), { ids: old.ids.filter(id => id !== rowId) });
}
else {
const newIds = old.ids.includes(rowId) ? old.ids : [...old.ids, rowId];
return Object.assign(Object.assign({}, old), { ids: newIds });
}
});
};
table.deselectRow = (rowId) => {
table.setSelectionState((old) => {
if (old.type === 'exclude') {
const newIds = old.ids.includes(rowId) ? old.ids : [...old.ids, rowId];
return Object.assign(Object.assign({}, old), { ids: newIds });
}
else {
return Object.assign(Object.assign({}, old), { ids: old.ids.filter(id => id !== rowId) });
}
});
};
table.toggleRowSelected = (rowId) => {
if (table.getIsRowSelected(rowId)) {
table.deselectRow(rowId);
}
else {
table.selectRow(rowId);
}
};
table.selectAll = () => {
const selectMode = table.options.selectMode || 'page';
if (selectMode === 'all') {
table.setSelectionState((old) => (Object.assign(Object.assign({}, old), { ids: [], type: 'exclude' })));
}
else {
const currentPageRows = table.getPaginationRowModel().rows;
const selectableRowIds = currentPageRows
.filter(row => table.canSelectRow(row.id))
.map(row => row.id);
table.setSelectionState((old) => (Object.assign(Object.assign({}, old), { ids: selectableRowIds, type: 'include' })));
}
};
table.deselectAll = () => {
table.setSelectionState((old) => (Object.assign(Object.assign({}, old), { ids: [], type: 'include' })));
};
table.toggleAllRowsSelected = () => {
if (table.getIsAllRowsSelected()) {
table.deselectAll();
}
else {
table.selectAll();
}
};
table.getIsRowSelected = (rowId) => {
const state = table.getSelectionState();
if (state.type === 'exclude') {
return !state.ids.includes(rowId);
}
else {
return state.ids.includes(rowId);
}
};
table.getIsAllRowsSelected = () => {
const state = table.getSelectionState();
const selectMode = table.options.selectMode || 'page';
if (selectMode === 'all') {
if (state.type === 'exclude') {
return state.ids.length === 0;
}
else {
const totalCount = table.getRowCount();
return state.ids.length === totalCount;
}
}
else {
const currentPageRows = table.getPaginationRowModel().rows;
const selectableRows = currentPageRows.filter(row => table.canSelectRow(row.id));
if (selectableRows.length === 0)
return false;
return selectableRows.every(row => table.getIsRowSelected(row.id));
}
};
table.getIsSomeRowsSelected = () => {
const state = table.getSelectionState();
const selectMode = table.options.selectMode || 'page';
if (selectMode === 'all' && state.type === 'exclude') {
const totalCount = table.getRowCount();
return state.ids.length < totalCount;
}
else {
return state.ids.length > 0;
}
};
table.getSelectionState = () => {
return table.getState().selectionState || {
ids: [],
type: 'include',
selectMode: 'page',
};
};
table.getSelectedCount = () => {
const state = table.getSelectionState();
const selectMode = table.options.selectMode || 'page';
if (selectMode === 'all' && state.type === 'exclude') {
const totalCount = table.getRowCount();
return totalCount - state.ids.length;
}
else {
return state.ids.length;
}
};
table.getSelectedRowIds = () => {
const state = table.getSelectionState();
if (state.type === 'exclude') {
console.warn('getSelectedRowIds() in exclude mode returns exclude list. Use getSelectionState() instead.');
return state.ids;
}
else {
return state.ids;
}
};
table.getSelectedRows = () => {
const state = table.getSelectionState();
const allRows = table.getRowModel().rows;
if (state.type === 'exclude') {
return allRows.filter(row => !state.ids.includes(row.id));
}
else {
return allRows.filter(row => state.ids.includes(row.id));
}
};
table.canSelectRow = (rowId) => {
if (!table.options.isRowSelectable)
return true;
const row = table.getRowModel().rows.find(r => r.id === rowId);
if (!row)
return false;
return table.options.isRowSelectable({ row: row.original, id: rowId });
};
},
};