fix(sheets-ui): reorder tabs correctly with hidden sheets (#7259)

This commit is contained in:
wpxp123456
2026-07-14 17:07:53 +08:00
committed by GitHub
parent d23c8df311
commit e2ece01f61
3 changed files with 27 additions and 2 deletions
@@ -54,6 +54,7 @@ import { SheetSkeletonManagerService } from '../../../services/sheet-skeleton-ma
import { useActiveWorkbook } from '../../hook';
import { SheetBarItem } from './SheetBarItem';
import { SheetBarTabsContextMenu } from './SheetBarTabsContextMenu';
import { getSheetTabTargetOrder } from './utils/sheet-tab-drag-sort';
import { SlideTabBar } from './utils/slide-tab-bar';
const SCROLL_SHADOW_NONE = '';
@@ -507,7 +508,12 @@ export function SheetBarTabs() {
});
},
onSlideEnd: async (event: Event, order: number) => {
await commandService.executeCommand(SetWorksheetOrderCommand.id, { order });
const targetOrder = getSheetTabTargetOrder(
workbook.getSheetOrders(),
workbook.getUnhiddenWorksheets(),
order
);
await commandService.executeCommand(SetWorksheetOrderCommand.id, { order: targetOrder });
},
onChangeTab: (_event: MouseEvent, subUnitId: string) => {
// Do not use SetWorksheetActivateCommand, otherwise activation timing may be incorrect.
@@ -15,7 +15,7 @@
*/
import { describe, expect, it } from 'vitest';
import { calculateSheetTabDragSort, reorderItems } from '../sheet-tab-drag-sort';
import { calculateSheetTabDragSort, getSheetTabTargetOrder, reorderItems } from '../sheet-tab-drag-sort';
const layout = [
{ id: 'sheet-0', left: 0, width: 40 },
@@ -75,4 +75,19 @@ describe('sheet-tab-drag-sort', () => {
expect(reorderItems(['a', 'b', 'c', 'd'], 2, 0)).toEqual(['c', 'a', 'b', 'd']);
expect(reorderItems(['a', 'b', 'c', 'd'], 2, 2)).toEqual(['a', 'b', 'c', 'd']);
});
it('moves sheet 2 after sheet 6 when sheet 5 is hidden', () => {
const sheetOrder = ['sheet-1', 'sheet-2', 'sheet-3', 'sheet-4', 'sheet-5', 'sheet-6'];
const visibleSheetIds = ['sheet-1', 'sheet-2', 'sheet-3', 'sheet-4', 'sheet-6'];
const targetOrder = getSheetTabTargetOrder(sheetOrder, visibleSheetIds, 4);
expect(reorderItems(sheetOrder, 1, targetOrder)).toEqual([
'sheet-1',
'sheet-3',
'sheet-4',
'sheet-5',
'sheet-6',
'sheet-2',
]);
});
});
@@ -88,3 +88,7 @@ export function reorderItems<T>(items: T[], fromIndex: number, toIndex: number):
nextItems.splice(toIndex, 0, movedItem);
return nextItems;
}
export function getSheetTabTargetOrder(sheetOrder: readonly string[], visibleSheetIds: string[], targetIndex: number): number {
return sheetOrder.indexOf(visibleSheetIds[targetIndex]);
}