import type { GridState } from '..' import { jest } from '@jest/globals' import type { StoreSimpleSelectors } from '../selectors' import type { SelectCollisionAreas, SelectPreviewColumnId, SelectPreviewLeftOffset, } from './drag' import generateSelectors from './drag' import { size } from '@planview/pv-utilities' import type { GridRowId } from '../../types' import { SELECTION_COLUMN_ID } from '../../constants' describe('compositeSelectors - drag', () => { let selectCollisionAreas: SelectCollisionAreas let selectPreviewColumnId: SelectPreviewColumnId let selectPreviewLeftOffset: SelectPreviewLeftOffset let selectDraggingRowIds: StoreSimpleSelectors['selectDraggingRowIds'] let selectColumnIdsWithHidden: StoreSimpleSelectors['selectColumnIdsWithHidden'] let selectHiddenIds: StoreSimpleSelectors['selectHiddenIds'] let selectColumn: StoreSimpleSelectors['selectColumn'] let selectConfiguredPreviewColumnId: StoreSimpleSelectors['selectConfiguredPreviewColumnId'] let selectTreeIndentSize: StoreSimpleSelectors['selectTreeIndentSize'] beforeEach(() => { selectDraggingRowIds = jest.fn() selectColumnIdsWithHidden = jest .fn() .mockReturnValue([]) selectHiddenIds = jest .fn() .mockReturnValue([]) selectColumn = jest.fn() selectConfiguredPreviewColumnId = jest.fn() selectTreeIndentSize = jest.fn() const rowLevelMap = new Map() const rowCollection = { ids: [], entities: new Map(), meta: new Map(), } const rowIds: GridRowId[] = ['1', '2'] ;({ selectCollisionAreas, selectPreviewColumnId, selectPreviewLeftOffset, } = generateSelectors( { selectCanConvertLeaf: () => true, selectDraggingRowIds, selectDragMode: () => 'parent', selectIsTreeGrid: () => false, selectRowCollection: () => rowCollection, selectRowHeight: () => size.small, selectRowLevelMap: () => rowLevelMap, selectColumn, selectColumnIdsWithHidden, selectHiddenIds, selectConfiguredPreviewColumnId, selectTreeIndentSize, }, () => rowIds )) }) describe('selectCollisionAreas', () => { describe('when no rows are being dragged', () => { it('should an empty result', () => { jest.mocked(selectDraggingRowIds).mockReturnValue(new Set()) const res = selectCollisionAreas({} as GridState) expect(res).toEqual({ collisions: [], maxTop: 0, maxBottom: 0, }) }) }) describe('when rows are being dragged', () => { it('should return values', () => { jest.mocked(selectDraggingRowIds).mockReturnValue( new Set(['1']) ) const res = selectCollisionAreas({} as GridState) expect(res).toEqual({ collisions: [ { operation: 'over', bottom: 122, left: 0, level: 0, parentId: null, prevId: null, prevInsertId: null, top: -50, }, ], maxTop: -50, maxBottom: 122, }) }) }) }) describe('selectPreviewColumnId', () => { it('should return the first non-selection column when no preview column is configured', () => { jest.mocked(selectColumnIdsWithHidden).mockReturnValue([ 'col1', 'col2', 'col3', ]) jest.mocked(selectHiddenIds).mockReturnValue([]) const state = {} as GridState const result = selectPreviewColumnId(state) expect(result).toBe('col1') }) it('should skip selection column and return the next column', () => { jest.mocked(selectColumnIdsWithHidden).mockReturnValue([ SELECTION_COLUMN_ID, 'col1', 'col2', ]) jest.mocked(selectHiddenIds).mockReturnValue([]) const state = {} as GridState const result = selectPreviewColumnId(state) expect(result).toBe('col1') }) it('should filter out hidden columns', () => { jest.mocked(selectColumnIdsWithHidden).mockReturnValue([ 'col1', 'col2', 'col3', ]) jest.mocked(selectHiddenIds).mockReturnValue(['col1']) const state = {} as GridState const result = selectPreviewColumnId(state) expect(result).toBe('col2') }) it('should return configured preview column when it exists and is visible', () => { jest.mocked(selectColumnIdsWithHidden).mockReturnValue([ 'col1', 'col2', 'col3', ]) jest.mocked(selectHiddenIds).mockReturnValue([]) jest.mocked(selectConfiguredPreviewColumnId).mockReturnValue('col2') const state = {} as GridState const result = selectPreviewColumnId(state) expect(result).toBe('col2') }) it('should fallback to first non-selection column when configured preview column is hidden', () => { jest.mocked(selectColumnIdsWithHidden).mockReturnValue([ 'col1', 'col2', 'col3', ]) jest.mocked(selectHiddenIds).mockReturnValue(['col2']) jest.mocked(selectConfiguredPreviewColumnId).mockReturnValue('col2') const state = {} as GridState const result = selectPreviewColumnId(state) expect(result).toBe('col1') }) it('should fallback when configured preview column does not exist', () => { jest.mocked(selectColumnIdsWithHidden).mockReturnValue([ 'col1', 'col2', ]) jest.mocked(selectHiddenIds).mockReturnValue([]) jest.mocked(selectConfiguredPreviewColumnId).mockReturnValue( 'col23' ) const state = {} as GridState const result = selectPreviewColumnId(state) expect(result).toBe('col1') }) }) describe('selectPreviewLeftOffset', () => { it('should return selection column width when it is first', () => { jest.mocked(selectColumnIdsWithHidden).mockReturnValue([ SELECTION_COLUMN_ID, 'col1', 'col2', ]) jest.mocked(selectColumn).mockReturnValue({ actualWidth: 48, } as any) const result = selectPreviewLeftOffset({} as GridState) expect(result).toBe(48) expect(selectColumn).toHaveBeenCalledWith({}, SELECTION_COLUMN_ID) }) it('should return 0 when selection column is first but has no actual width', () => { jest.mocked(selectColumnIdsWithHidden).mockReturnValue([ SELECTION_COLUMN_ID, 'col1', 'col2', ]) jest.mocked(selectColumn).mockReturnValue({ actualWidth: undefined, } as any) const result = selectPreviewLeftOffset({} as GridState) expect(result).toBe(0) }) it('should return 0 when selection column is first but column does not exist', () => { jest.mocked(selectColumnIdsWithHidden).mockReturnValue([ SELECTION_COLUMN_ID, 'col1', 'col2', ]) jest.mocked(selectColumn).mockReturnValue(undefined as any) const result = selectPreviewLeftOffset({} as GridState) expect(result).toBe(0) }) }) })