diff --git a/packages/iris-grid/src/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.test.tsx b/packages/iris-grid/src/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.test.tsx index 85d41b6b09..7e9e3fc866 100644 --- a/packages/iris-grid/src/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.test.tsx +++ b/packages/iris-grid/src/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.test.tsx @@ -763,6 +763,57 @@ test('Sorts items', async () => { ); }); +test('Sort ascending items with frozen/front/back columns', async () => { + const user = userEvent.setup({ delay: null }); + const mockHandler = jest.fn(); + const sortButton = () => screen.getByLabelText('Sort ascending'); + const model = irisGridTestUtils.makeModel( + irisGridTestUtils.makeTable({ + columns: COLUMNS, + layoutHints: { + frontColumns: [`${COLUMN_PREFIX}2`, `${COLUMN_PREFIX}3`], + frozenColumns: [`${COLUMN_PREFIX}0`, `${COLUMN_PREFIX}1`], + backColumns: [`${COLUMN_PREFIX}9`], + }, + }) + ); + render(); + + await selectItems(user, [1]); + await user.click(sortButton()); + const newMoves = []; + expect(mockHandler).toBeCalledWith(newMoves); +}); + +test('Sort descending items with frozen/front/back columns', async () => { + const user = userEvent.setup({ delay: null }); + const mockHandler = jest.fn(); + const sortButton = () => screen.getByLabelText('Sort descending'); + const model = irisGridTestUtils.makeModel( + irisGridTestUtils.makeTable({ + columns: COLUMNS, + layoutHints: { + frontColumns: [`${COLUMN_PREFIX}1`], + frozenColumns: [`${COLUMN_PREFIX}0`], + backColumns: [`${COLUMN_PREFIX}9`], + }, + }) + ); + render(); + + await selectItems(user, [1]); + await user.click(sortButton()); + const newMoves = [ + { from: 8, to: 2 }, + { from: 8, to: 3 }, + { from: 8, to: 4 }, + { from: 8, to: 5 }, + { from: 8, to: 6 }, + { from: 8, to: 7 }, + ]; + expect(mockHandler).toBeCalledWith(newMoves); +}); + test('Creates groups', async () => { const user = userEvent.setup({ delay: null }); const model = makeModel(); diff --git a/packages/iris-grid/src/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.tsx b/packages/iris-grid/src/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.tsx index 9bc4955f01..4f7fb30a36 100644 --- a/packages/iris-grid/src/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.tsx +++ b/packages/iris-grid/src/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.tsx @@ -635,11 +635,31 @@ class VisibilityOrderingBuilder extends PureComponent< option: keyof typeof VisibilityOrderingBuilder.SORTING_OPTIONS ): void { const { model, onMovedColumnsChanged } = this.props; + const tree = this.getTreeItems(); + const firstIndex = this.getFirstMovableIndex() ?? 0; + const lastIndex = this.getLastMovableIndex() ?? tree.length - 1; + const moveableTree = tree.slice(firstIndex, lastIndex + 1); + + // add frozen moves + const initialAndFrozenMovedColumns = [...model.initialMovedColumns]; + for (let i = 0; i < model.frozenColumns.length; i += 1) { + const frozenColumn = model.frozenColumns[i]; + const newFrozenIndex = GridUtils.getVisibleIndex( + model.getColumnIndexByName(frozenColumn) ?? 0, + initialAndFrozenMovedColumns + ); + if (newFrozenIndex !== i) { + initialAndFrozenMovedColumns.push({ + from: newFrozenIndex, + to: i, + }); + } + } const newMoves = this.getSortMoves( - this.getTreeItems(), + moveableTree, option, - model.initialMovedColumns + initialAndFrozenMovedColumns ); onMovedColumnsChanged(newMoves);