fix(grid): preserve selection across column reordering

This commit is contained in:
hanxuanyu authored and GitHub committed 2026-08-14 12:57:05 +08:00
1 parent b406c0a52c
commit d63a407931
4 files changed
+189 -18

No files matched your search

+35 -12
View File
@@ -1910,15 +1910,15 @@ const {
invertColumnVisibility,
showColumn,
persistColumnOrder,
moveDisplayableColumn,
resetColumnOrder,
moveDisplayableColumn: moveDisplayableColumnInLayout,
resetColumnOrder: resetColumnOrderInLayout,
toggleAllNullColumns,
resetColumnVisibility,
onTableDataGridColumnOrderChanged,
frozenColumnCount,
freezeToColumn,
freezeSelectedColumns,
unfreezeAllColumns,
freezeSelectedColumns: freezeSelectedColumnsInLayout,
unfreezeAllColumns: unfreezeAllColumnsInLayout,
} = useDataGridColumnLayoutState({
columns: computed(() => props.result.columns),
sourceColumns: computed(() => props.sourceColumns),
@@ -2136,13 +2136,36 @@ let gridScrollLeftBeforeTranspose = 0;
let gridScrollTopBeforeKeyboardTranspose: number | null = null;
let restoreGridScrollTopAfterTranspose = false;
function persistDraggedColumnOrder(indexes: number[]) {
function applyColumnOrderChange(change: () => void) {
const previousVisibleColumnIndexes = [...visibleColumnIndexes.value];
persistColumnOrder(indexes);
selection.remapColumnSelection(
previousVisibleColumnIndexes,
indexes.filter((index) => !hiddenColumnIndexes.value.has(index)),
);
change();
const nextVisibleColumnIndexes = [...visibleColumnIndexes.value];
if (previousVisibleColumnIndexes.length === nextVisibleColumnIndexes.length && previousVisibleColumnIndexes.every((index, position) => index === nextVisibleColumnIndexes[position])) return;
selection.reconcileSelectionAfterColumnReorder(previousVisibleColumnIndexes, nextVisibleColumnIndexes);
}
function onSynchronizedTableDataGridColumnOrderChanged(event: Event) {
applyColumnOrderChange(() => onTableDataGridColumnOrderChanged(event));
}
function persistDraggedColumnOrder(indexes: number[]) {
applyColumnOrderChange(() => persistColumnOrder(indexes));
}
function moveDisplayableColumn(fromDisplayableIndex: number, toDisplayableIndex: number) {
applyColumnOrderChange(() => moveDisplayableColumnInLayout(fromDisplayableIndex, toDisplayableIndex));
}
function resetColumnOrder() {
applyColumnOrderChange(resetColumnOrderInLayout);
}
function freezeSelectedColumns(selectedVisibleColumnIndexes: number[]) {
applyColumnOrderChange(() => freezeSelectedColumnsInLayout(selectedVisibleColumnIndexes));
}
function unfreezeAllColumns() {
applyColumnOrderChange(unfreezeAllColumnsInLayout);
}
const {
@@ -6304,7 +6327,7 @@ onMounted(() => {
window.addEventListener("resize", refreshDataGridViewportMetrics);
window.visualViewport?.addEventListener("resize", refreshDataGridViewportMetrics);
window.addEventListener("dbx:ui-scale-applied", refreshDataGridViewportMetrics);
window.addEventListener(TABLE_DATA_GRID_COLUMN_ORDER_CHANGED_EVENT, onTableDataGridColumnOrderChanged);
window.addEventListener(TABLE_DATA_GRID_COLUMN_ORDER_CHANGED_EVENT, onSynchronizedTableDataGridColumnOrderChanged);
window.addEventListener("blur", clearInternalClipboardCopy);
document.addEventListener("visibilitychange", clearInternalClipboardCopy);
});
@@ -6326,7 +6349,7 @@ onUnmounted(() => {
window.removeEventListener("resize", refreshDataGridViewportMetrics);
window.visualViewport?.removeEventListener("resize", refreshDataGridViewportMetrics);
window.removeEventListener("dbx:ui-scale-applied", refreshDataGridViewportMetrics);
window.removeEventListener(TABLE_DATA_GRID_COLUMN_ORDER_CHANGED_EVENT, onTableDataGridColumnOrderChanged);
window.removeEventListener(TABLE_DATA_GRID_COLUMN_ORDER_CHANGED_EVENT, onSynchronizedTableDataGridColumnOrderChanged);
window.removeEventListener("blur", clearInternalClipboardCopy);
document.removeEventListener("visibilitychange", clearInternalClipboardCopy);
});
@@ -0,0 +1,12 @@
import { readFileSync } from "node:fs";
import { describe, expect, it } from "vitest";
const dataGridSource = readFileSync(new URL("../DataGrid.vue", import.meta.url), "utf8");
describe("DataGrid synchronized column order selection", () => {
it("reconciles the active selection when another grid changes the table order", () => {
expect(dataGridSource).toContain("applyColumnOrderChange(() => onTableDataGridColumnOrderChanged(event));");
expect(dataGridSource).toContain("window.addEventListener(TABLE_DATA_GRID_COLUMN_ORDER_CHANGED_EVENT, onSynchronizedTableDataGridColumnOrderChanged);");
expect(dataGridSource).toContain("window.removeEventListener(TABLE_DATA_GRID_COLUMN_ORDER_CHANGED_EVENT, onSynchronizedTableDataGridColumnOrderChanged);");
});
});