fix(grid): preserve selection across column reordering
This commit is contained in:
1 parent
b406c0a52c
commit
d63a407931
4 files changed
+189
-18
No files matched your search
@@ -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);
|
||||
});
|
||||
|
||||
+12
@@ -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);");
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user