UNPKG

@tanstack/table-core

Version:

Headless UI for building powerful tables & datagrids for TS/JS.

392 lines (366 loc) 13 kB
/** * table-core * * Copyright (c) TanStack * * This source code is licensed under the MIT license found in the * LICENSE.md file in the root directory of this source tree. * * @license MIT */ 'use strict'; var utils = require('../utils.js'); // const RowSelection = { getInitialState: state => { return { rowSelection: {}, ...state }; }, getDefaultOptions: table => { return { onRowSelectionChange: utils.makeStateUpdater('rowSelection', table), enableRowSelection: true, enableMultiRowSelection: true, enableSubRowSelection: true // enableGroupingRowSelection: false, // isAdditiveSelectEvent: (e: unknown) => !!e.metaKey, // isInclusiveSelectEvent: (e: unknown) => !!e.shiftKey, }; }, createTable: table => { table.setRowSelection = updater => table.options.onRowSelectionChange == null ? void 0 : table.options.onRowSelectionChange(updater); table.resetRowSelection = defaultState => { var _table$initialState$r; return table.setRowSelection(defaultState ? {} : (_table$initialState$r = table.initialState.rowSelection) != null ? _table$initialState$r : {}); }; table.toggleAllRowsSelected = value => { table.setRowSelection(old => { value = typeof value !== 'undefined' ? value : !table.getIsAllRowsSelected(); const rowSelection = { ...old }; const preGroupedFlatRows = table.getPreGroupedRowModel().flatRows; // We don't use `mutateRowIsSelected` here for performance reasons. // All of the rows are flat already, so it wouldn't be worth it if (value) { preGroupedFlatRows.forEach(row => { if (!row.getCanSelect()) { return; } rowSelection[row.id] = true; }); } else { preGroupedFlatRows.forEach(row => { delete rowSelection[row.id]; }); } return rowSelection; }); }; table.toggleAllPageRowsSelected = value => table.setRowSelection(old => { const resolvedValue = typeof value !== 'undefined' ? value : !table.getIsAllPageRowsSelected(); const rowSelection = { ...old }; table.getRowModel().rows.forEach(row => { mutateRowIsSelected(rowSelection, row.id, resolvedValue, true, table); }); return rowSelection; }); // addRowSelectionRange: rowId => { // const { // rows, // rowsById, // options: { selectGroupingRows, selectSubRows }, // } = table // const findSelectedRow = (rows: Row[]) => { // let found // rows.find(d => { // if (d.getIsSelected()) { // found = d // return true // } // const subFound = findSelectedRow(d.subRows || []) // if (subFound) { // found = subFound // return true // } // return false // }) // return found // } // const firstRow = findSelectedRow(rows) || rows[0] // const lastRow = rowsById[rowId] // let include = false // const selectedRowIds = {} // const addRow = (row: Row) => { // mutateRowIsSelected(selectedRowIds, row.id, true, { // rowsById, // selectGroupingRows: selectGroupingRows!, // selectSubRows: selectSubRows!, // }) // } // table.rows.forEach(row => { // const isFirstRow = row.id === firstRow.id // const isLastRow = row.id === lastRow.id // if (isFirstRow || isLastRow) { // if (!include) { // include = true // } else if (include) { // addRow(row) // include = false // } // } // if (include) { // addRow(row) // } // }) // table.setRowSelection(selectedRowIds) // }, table.getPreSelectedRowModel = () => table.getCoreRowModel(); table.getSelectedRowModel = utils.memo(() => [table.getState().rowSelection, table.getCoreRowModel()], (rowSelection, rowModel) => { if (!Object.keys(rowSelection).length) { return { rows: [], flatRows: [], rowsById: {} }; } return selectRowsFn(table, rowModel); }, utils.getMemoOptions(table.options, 'debugTable', 'getSelectedRowModel')); table.getFilteredSelectedRowModel = utils.memo(() => [table.getState().rowSelection, table.getFilteredRowModel()], (rowSelection, rowModel) => { if (!Object.keys(rowSelection).length) { return { rows: [], flatRows: [], rowsById: {} }; } return selectRowsFn(table, rowModel); }, utils.getMemoOptions(table.options, 'debugTable', 'getFilteredSelectedRowModel')); table.getGroupedSelectedRowModel = utils.memo(() => [table.getState().rowSelection, table.getSortedRowModel()], (rowSelection, rowModel) => { if (!Object.keys(rowSelection).length) { return { rows: [], flatRows: [], rowsById: {} }; } return selectRowsFn(table, rowModel); }, utils.getMemoOptions(table.options, 'debugTable', 'getGroupedSelectedRowModel')); /// // getGroupingRowCanSelect: rowId => { // const row = table.getRow(rowId) // if (!row) { // throw new Error() // } // if (typeof table.options.enableGroupingRowSelection === 'function') { // return table.options.enableGroupingRowSelection(row) // } // return table.options.enableGroupingRowSelection ?? false // }, table.getIsAllRowsSelected = () => { const preGroupedFlatRows = table.getFilteredRowModel().flatRows; const { rowSelection } = table.getState(); let isAllRowsSelected = Boolean(preGroupedFlatRows.length && Object.keys(rowSelection).length); if (isAllRowsSelected) { if (preGroupedFlatRows.some(row => row.getCanSelect() && !rowSelection[row.id])) { isAllRowsSelected = false; } } return isAllRowsSelected; }; table.getIsAllPageRowsSelected = () => { const paginationFlatRows = table.getPaginationRowModel().flatRows.filter(row => row.getCanSelect()); const { rowSelection } = table.getState(); let isAllPageRowsSelected = !!paginationFlatRows.length; if (isAllPageRowsSelected && paginationFlatRows.some(row => !rowSelection[row.id])) { isAllPageRowsSelected = false; } return isAllPageRowsSelected; }; table.getIsSomeRowsSelected = () => { var _table$getState$rowSe; const totalSelected = Object.keys((_table$getState$rowSe = table.getState().rowSelection) != null ? _table$getState$rowSe : {}).length; return totalSelected > 0 && totalSelected < table.getFilteredRowModel().flatRows.length; }; table.getIsSomePageRowsSelected = () => { const paginationFlatRows = table.getPaginationRowModel().flatRows; return table.getIsAllPageRowsSelected() ? false : paginationFlatRows.filter(row => row.getCanSelect()).some(d => d.getIsSelected() || d.getIsSomeSelected()); }; table.getToggleAllRowsSelectedHandler = () => { return e => { table.toggleAllRowsSelected(e.target.checked); }; }; table.getToggleAllPageRowsSelectedHandler = () => { return e => { table.toggleAllPageRowsSelected(e.target.checked); }; }; }, createRow: (row, table) => { row.toggleSelected = (value, opts) => { const isSelected = row.getIsSelected(); table.setRowSelection(old => { var _opts$selectChildren; value = typeof value !== 'undefined' ? value : !isSelected; if (row.getCanSelect() && isSelected === value) { return old; } const selectedRowIds = { ...old }; mutateRowIsSelected(selectedRowIds, row.id, value, (_opts$selectChildren = opts == null ? void 0 : opts.selectChildren) != null ? _opts$selectChildren : true, table); return selectedRowIds; }); }; row.getIsSelected = () => { const { rowSelection } = table.getState(); return isRowSelected(row, rowSelection); }; row.getIsSomeSelected = () => { const { rowSelection } = table.getState(); return isSubRowSelected(row, rowSelection) === 'some'; }; row.getIsAllSubRowsSelected = () => { const { rowSelection } = table.getState(); return isSubRowSelected(row, rowSelection) === 'all'; }; row.getCanSelect = () => { var _table$options$enable; if (typeof table.options.enableRowSelection === 'function') { return table.options.enableRowSelection(row); } return (_table$options$enable = table.options.enableRowSelection) != null ? _table$options$enable : true; }; row.getCanSelectSubRows = () => { var _table$options$enable2; if (typeof table.options.enableSubRowSelection === 'function') { return table.options.enableSubRowSelection(row); } return (_table$options$enable2 = table.options.enableSubRowSelection) != null ? _table$options$enable2 : true; }; row.getCanMultiSelect = () => { var _table$options$enable3; if (typeof table.options.enableMultiRowSelection === 'function') { return table.options.enableMultiRowSelection(row); } return (_table$options$enable3 = table.options.enableMultiRowSelection) != null ? _table$options$enable3 : true; }; row.getToggleSelectedHandler = () => { const canSelect = row.getCanSelect(); return e => { var _target; if (!canSelect) return; row.toggleSelected((_target = e.target) == null ? void 0 : _target.checked); }; }; } }; const mutateRowIsSelected = (selectedRowIds, id, value, includeChildren, table) => { var _row$subRows; const row = table.getRow(id, true); // const isGrouped = row.getIsGrouped() // if ( // TODO: enforce grouping row selection rules // !isGrouped || // (isGrouped && table.options.enableGroupingRowSelection) // ) { if (value) { if (!row.getCanMultiSelect()) { Object.keys(selectedRowIds).forEach(key => delete selectedRowIds[key]); } if (row.getCanSelect()) { selectedRowIds[id] = true; } } else { delete selectedRowIds[id]; } // } if (includeChildren && (_row$subRows = row.subRows) != null && _row$subRows.length && row.getCanSelectSubRows()) { row.subRows.forEach(row => mutateRowIsSelected(selectedRowIds, row.id, value, includeChildren, table)); } }; function selectRowsFn(table, rowModel) { const rowSelection = table.getState().rowSelection; const newSelectedFlatRows = []; const newSelectedRowsById = {}; // Filters top level and nested rows const recurseRows = function (rows, depth) { return rows.map(row => { var _row$subRows2; const isSelected = isRowSelected(row, rowSelection); if (isSelected) { newSelectedFlatRows.push(row); newSelectedRowsById[row.id] = row; } if ((_row$subRows2 = row.subRows) != null && _row$subRows2.length) { row = { ...row, subRows: recurseRows(row.subRows) }; } if (isSelected) { return row; } }).filter(Boolean); }; return { rows: recurseRows(rowModel.rows), flatRows: newSelectedFlatRows, rowsById: newSelectedRowsById }; } function isRowSelected(row, selection) { var _selection$row$id; return (_selection$row$id = selection[row.id]) != null ? _selection$row$id : false; } function isSubRowSelected(row, selection, table) { var _row$subRows3; if (!((_row$subRows3 = row.subRows) != null && _row$subRows3.length)) return false; let allChildrenSelected = true; let someSelected = false; row.subRows.forEach(subRow => { // Bail out early if we know both of these if (someSelected && !allChildrenSelected) { return; } if (subRow.getCanSelect()) { if (isRowSelected(subRow, selection)) { someSelected = true; } else { allChildrenSelected = false; } } // Check row selection of nested subrows if (subRow.subRows && subRow.subRows.length) { const subRowChildrenSelected = isSubRowSelected(subRow, selection); if (subRowChildrenSelected === 'all') { someSelected = true; } else if (subRowChildrenSelected === 'some') { someSelected = true; allChildrenSelected = false; } else { allChildrenSelected = false; } } }); return allChildrenSelected ? 'all' : someSelected ? 'some' : false; } exports.RowSelection = RowSelection; exports.isRowSelected = isRowSelected; exports.isSubRowSelected = isSubRowSelected; exports.selectRowsFn = selectRowsFn; //# sourceMappingURL=RowSelection.js.map