diff --git a/apps/desktop/src/components/grid/DataGrid.vue b/apps/desktop/src/components/grid/DataGrid.vue index 931cc01e5c..6ca2b38c96 100644 --- a/apps/desktop/src/components/grid/DataGrid.vue +++ b/apps/desktop/src/components/grid/DataGrid.vue @@ -645,6 +645,10 @@ let preservedSelectionOnNextResult: { selection: PersistedDataGridSelection; sourceResult: QueryResult; } | null = null; +let preservedTransposeRecordOnNextResult: { + selection: PersistedDataGridSelection; + sourceResult: QueryResult; +} | null = null; let preservedDetailsOnNextResult: { sideCell?: PersistedDataGridSelection; sideCellHasPendingDraft?: boolean; @@ -5334,6 +5338,20 @@ function restoreSelectionAfterRefresh(snapshot: PersistedDataGridSelection) { }); } +function restoreTransposeRecordAfterRefresh(snapshot: PersistedDataGridSelection) { + const restored = restoreDataGridSelection({ + snapshot, + columns: props.result.columns, + sourceColumns: props.sourceColumns, + rows: props.result.rows, + visibleColumnIndexes: visibleColumnIndexes.value, + displayItems: displayItems.value, + }); + if (restored?.kind !== "rows") return; + transposeRowIndex.value = restored.scrollRowIndex; + nextTick(() => scrollTransposeRecordIntoView(restored.scrollRowIndex)); +} + /** Bounded settling envelope for a replayed tab-switch viewport. */ const MAX_VIEW_SNAPSHOT_RESTORE_FRAMES = 8; let viewSnapshotRestoreFrame = 0; @@ -6297,6 +6315,14 @@ function applyColumnSort(column: string, columnIndex: number, direction: "asc" | toast(t("grid.largeValueLocalSortUnavailable"), 5000); return; } + if (showTranspose.value) { + const selection = captureCurrentSelectionForRefresh(); + preservedSelectionOnNextResult = selection ? { selection, sourceResult: props.result } : null; + const activeRecord = transposeRowIndex.value === null ? undefined : displayItemAt(transposeRowIndex.value); + const activeRecordSelection = captureRowTargetForRefresh(activeRecord?.id ?? null); + preservedTransposeRecordOnNextResult = activeRecordSelection ? { selection: activeRecordSelection, sourceResult: props.result } : null; + preserveTransposeOnNextResult.value = true; + } if (mode === "database" && (infiniteScrollEnabled.value || loadAllRowsActive.value)) { resetInfiniteScrollState(); } else { @@ -10150,6 +10176,8 @@ watch( // check has to run before the markers are consumed below. const inPlaceRefreshPending = preservedSelectionOnNextResult !== null || preservedViewportAnchorOnNextResult !== null || preservedDetailsOnNextResult !== null || preserveTransposeOnNextResult.value; preservedSelectionOnNextResult = null; + const transposeRecordSnapshot = preservedTransposeRecordOnNextResult?.selection; + preservedTransposeRecordOnNextResult = null; const viewportAnchorSnapshot = preservedViewportAnchorOnNextResult?.anchor; preservedViewportAnchorOnNextResult = null; const detailsSnapshot = preservedDetailsOnNextResult; @@ -10211,6 +10239,7 @@ watch( } exitTransaction(); if (selectionSnapshot) restoreSelectionAfterRefresh(selectionSnapshot); + if (transposeRecordSnapshot) restoreTransposeRecordAfterRefresh(transposeRecordSnapshot); if (detailsSnapshot) restoreDetailsAfterRefresh(detailsSnapshot); if (viewportAnchorSnapshot) restoreViewportAnchorAfterRefresh(viewportAnchorSnapshot); }, @@ -12537,6 +12566,8 @@ useUpdateBlocker(() => (hasPendingChanges.value || hasPendingDataEditorDraft.val
- + {{ item.column }} + + +