@itwin/itwinui-react
Version:
A react component library for iTwinUI
114 lines (113 loc) • 3.37 kB
JavaScript
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;
};