UNPKG

@itwin/itwinui-react

Version:

A react component library for iTwinUI

114 lines (113 loc) 3.37 kB
import { iuiId } from '../Table.js'; let onSelectHandler = (newState, instance, onSelect, isRowDisabled) => { if (!instance?.rows.length) return void onSelect?.([], newState); let newSelectedRowIds = {}; let handleRow = (row) => { if (isRowDisabled?.(row.original)) return false; let hasSubComponents = !!row.initialSubRows[0]?.original[iuiId]; let hasSubRows = row.subRows.length > 0 && !hasSubComponents; let isAllSubSelected = true; if (hasSubRows) row.initialSubRows.forEach((subRow) => { let result = handleRow(subRow); if (!result) isAllSubSelected = false; }); let isRowSelected = newState.selectedRowIds[row.id]; let case1 = isRowSelected && (!instance.selectSubRows || !hasSubRows); let case2 = hasSubRows && isAllSubSelected; if (case1 || case2) newSelectedRowIds[row.id] = true; return !!newSelectedRowIds[row.id]; }; instance.initialRows.forEach((row) => handleRow(row)); let selectedData = getSelectedData(newSelectedRowIds, instance); newState.selectedRowIds = newSelectedRowIds; onSelect?.(selectedData, newState); }; export const onToggleHandler = ( newState, action, instance, onSelect, isRowDisabled, ) => { onSelectHandler(newState, instance, onSelect, isRowDisabled); newState.lastSelectedRowId = action.id; }; export const onSingleSelectHandler = ( state, action, instance, onSelect, isRowDisabled, ) => { let selectedRowIds = { [action.id]: true, }; if (instance?.selectSubRows) { let handleRow = (row) => { selectedRowIds[row.id] = true; row.subRows.forEach((r) => handleRow(r)); }; handleRow(instance.rowsById[action.id]); } let newState = { ...state, lastSelectedRowId: action.id, selectedRowIds, }; onSelectHandler(newState, instance, onSelect, isRowDisabled); return newState; }; export const onShiftSelectHandler = ( state, action, instance, onSelect, isRowDisabled, ) => { if (null == instance) return state; let startIndex = Math.max( 0, instance.flatRows.findIndex((row) => row.id === state.lastSelectedRowId), ); let endIndex = Math.max( 0, instance.flatRows.findIndex((row) => row.id === action.id), ); if (startIndex > endIndex) { let temp = startIndex; startIndex = endIndex; endIndex = temp; } let isLastSelectedRowIdSelected = null == state.lastSelectedRowId || !!state.selectedRowIds[state.lastSelectedRowId]; let selectedRowIds = action.ctrlPressed ? { ...state.selectedRowIds, } : {}; instance.flatRows .slice(startIndex, endIndex + 1) .forEach((r) => (selectedRowIds[r.id] = isLastSelectedRowIdSelected)); let handleRow = (row) => { selectedRowIds[row.id] = isLastSelectedRowIdSelected; row.subRows.forEach((r) => handleRow(r)); }; handleRow(instance.flatRows[endIndex]); let newState = { ...state, selectedRowIds, }; onSelectHandler(newState, instance, onSelect, isRowDisabled); return newState; }; let getSelectedData = (selectedRowIds, instance) => { let selectedData = []; let setSelectedData = (row) => { if (selectedRowIds[row.id]) selectedData.push(row.original); row.initialSubRows.forEach((subRow) => setSelectedData(subRow)); }; instance?.initialRows.forEach((row) => setSelectedData(row)); return selectedData; };