import { GroupArea, GroupLink, GroupPin, GroupSelection } from '@/lib/types/group'; import { getMinAndMax } from '@/lib/utils/math'; import { getMinAndMaxColumn } from '@/lib/utils/row-column'; import { CellLocation, IndexColumn, IndexRow } from '@/lib/types'; import { StoreState } from '@/lib/store/types'; const someHitAreaColumn = (area: GroupSelection) => (link: GroupLink, row: [number, number], columnMinIndex: number, columnMaxIndex: number) => { area.hit = true; area.link = link; area.row = row; area.column = [columnMinIndex, columnMaxIndex]; }; const allHitAreaColumn = (area: GroupSelection) => (row: [number, number], columnMinIndex: number, columnMaxIndex: number) => { area.hit = true; area.row = row; area.column = [columnMinIndex, columnMaxIndex]; }; export const getClickedCellAnglePoint = ( cellLocation: CellLocation, columnRecord: Record, rowRecord: Record, ): GroupArea => { const columnIndex = columnRecord[cellLocation.columnId].index; const rowIndex = rowRecord[cellLocation.rowId].index; return { pin: cellLocation.pin, column: [columnIndex, columnIndex], row: [rowIndex, rowIndex], }; }; export const getSingleSelectionAnglePoint = ( selectingArea: StoreState['selectionStatus'], ): GroupArea => { if (selectingArea.leftArea.hit) return { pin: GroupPin.left, column: selectingArea.leftArea.column, row: selectingArea.leftArea.row, }; if (selectingArea.rightArea.hit) return { pin: GroupPin.right, column: selectingArea.rightArea.column, row: selectingArea.rightArea.row, }; return { pin: GroupPin.scroll, column: selectingArea.scrollArea.column, row: selectingArea.scrollArea.row, }; }; /** * 获取当前击中的区域(仅单区获取)) * @param selectionStatus */ export const getSelectionHitAreaWhenSingleHit = ( selectionStatus: StoreState['selectionStatus'], ) => { return selectionStatus.leftArea.hit ? selectionStatus.leftArea : selectionStatus.scrollArea.hit ? selectionStatus.scrollArea : selectionStatus.rightArea; }; export const calculateSelectionArea = (leftLength: number, scrollLength: number) => (selectionStatus: StoreState['selectionStatus']) => { const { startColumn, endColumn, startRowIndex, endRowIndex } = selectionStatus; const leftArea: GroupSelection = { hit: false }; const rightArea: GroupSelection = { hit: false }; const scrollArea: GroupSelection = { hit: false }; const row = getMinAndMax(startRowIndex, endRowIndex); const [min, max] = getMinAndMaxColumn(startColumn, endColumn); if (min.pin === GroupPin.left && max.pin === GroupPin.left) { allHitAreaColumn(leftArea)(row, min.index, max.index); return { leftArea }; } if (min.pin === GroupPin.right && max.pin === GroupPin.right) { allHitAreaColumn(rightArea)(row, min.index, max.index); return { rightArea }; } if (min.pin === GroupPin.scroll && max.pin === GroupPin.scroll) { allHitAreaColumn(scrollArea)(row, min.index, max.index); return { scrollArea }; } if (min.pin === GroupPin.left && max.pin === GroupPin.scroll) { someHitAreaColumn(leftArea)('scroll', row, min.index, leftLength - 1); someHitAreaColumn(scrollArea)('left', row, 0, max.index); return { leftArea, scrollArea, }; } if (min.pin === GroupPin.scroll && max.pin === GroupPin.right) { someHitAreaColumn(scrollArea)('right', row, min.index, scrollLength - 1); someHitAreaColumn(rightArea)('scroll', row, 0, max.index); return { rightArea, scrollArea, }; } someHitAreaColumn(leftArea)('scroll', row, min.index, leftLength - 1); someHitAreaColumn(scrollArea)('all', row, 0, scrollLength - 1); someHitAreaColumn(rightArea)('scroll', row, 0, max.index); return { leftArea, rightArea, scrollArea, }; };