fix(grid): use table-open page size for documents

Closes #6903
This commit is contained in:
t8y2 committed 2026-08-21 17:32:32 +00:00
1 parent f57cd3960b
commit 3bec5091df
5 files changed
+85 -13

No files matched your search

@@ -134,7 +134,7 @@ const documentLoadExecutionId = ref("");
const documentLoadCancelling = ref(false);
const documentLoadingElapsedSeconds = ref("0.0");
const page = ref(0);
const pageSize = ref(normalizeResultPageSize(settingsStore.editorSettings.pageSize));
const pageSize = ref(normalizeResultPageSize(settingsStore.editorSettings.tableOpenPageSize));
const selectedIdx = ref<number | null>(null);
const editJson = ref("");
const isEditing = ref(false);
@@ -2300,6 +2300,7 @@ defineExpose({ focusSearch });
:table-meta="props.tableMeta"
:column-layout-scope-key="documentColumnLayoutScopeKey"
context="results"
page-size-preference="table-open"
:database-type="props.databaseType"
:mongo-update-target="mongoUpdateTarget"
:editable="documentStoreEditable"
@@ -25,6 +25,7 @@ const dataGrid = vi.hoisted(() => ({
appendedFromRowCount: undefined as number | undefined,
pageOffset: undefined as number | undefined,
pageLimit: undefined as number | undefined,
pageSizePreference: undefined as string | undefined,
selectionActive: false,
editActive: false,
fullReplaceCount: 0,
@@ -33,6 +34,7 @@ const dataGrid = vi.hoisted(() => ({
const settings = vi.hoisted(() => ({
editorSettings: {
pageSize: 2,
tableOpenPageSize: 5,
infiniteScroll: true,
mongoViewMode: "table" as "document" | "table",
columnWidthDensity: "standard" as "compact" | "standard" | "comfortable",
@@ -87,6 +89,7 @@ vi.mock("@/components/grid/DataGrid.vue", async () => {
customSaveHandler: { type: Object, required: false },
pageOffset: { type: Number, required: false },
pageLimit: { type: Number, required: false },
pageSizePreference: { type: String, required: false },
},
setup(props, { attrs, expose }) {
dataGrid.paginate = attrs.onPaginate as typeof dataGrid.paginate;
@@ -127,6 +130,7 @@ vi.mock("@/components/grid/DataGrid.vue", async () => {
dataGrid.appendedFromRowCount = result.appended_from_row_count;
dataGrid.pageOffset = props.pageOffset;
dataGrid.pageLimit = props.pageLimit;
dataGrid.pageSizePreference = props.pageSizePreference;
return h("div", { "data-testid": "data-grid" });
};
},
@@ -182,12 +186,12 @@ async function flushUi() {
}
}
async function mountBrowser() {
async function mountBrowser(databaseType: "mongodb" | "elasticsearch" = "mongodb") {
app = createApp(DocumentBrowser, {
connectionId: "mongo-1",
database: "test",
collection: "docs",
databaseType: "mongodb",
databaseType,
});
app.mount(root!);
await flushUi();
@@ -230,10 +234,12 @@ beforeEach(async () => {
dataGrid.appendedFromRowCount = undefined;
dataGrid.pageOffset = undefined;
dataGrid.pageLimit = undefined;
dataGrid.pageSizePreference = undefined;
dataGrid.selectionActive = false;
dataGrid.editActive = false;
dataGrid.fullReplaceCount = 0;
settings.editorSettings.pageSize = 2;
settings.editorSettings.tableOpenPageSize = 5;
settings.editorSettings.infiniteScroll = true;
root = document.createElement("div");
@@ -249,6 +255,16 @@ afterEach(() => {
});
describe("DocumentBrowser infinite scroll (issue #6455)", () => {
it.each(["mongodb", "elasticsearch"] as const)("uses the table-open page-size preference for %s", async (databaseType) => {
backend.documentFindDocuments.mockResolvedValueOnce(documentResult(1, 5, 5));
await mountBrowser(databaseType);
expect(backend.documentFindDocuments.mock.calls[0]!.slice(0, 5)).toEqual(["mongo-1", "test", "docs", 0, 5]);
expect(dataGrid.pageLimit).toBe(5);
expect(dataGrid.pageSizePreference).toBe("table-open");
});
it("preserves existing row identity and DataGrid selection/edit state for same-column appends", async () => {
backend.documentFindDocuments.mockResolvedValueOnce(documentResult(1, 2, 4)).mockResolvedValueOnce(documentResult(3, 2, 4));
@@ -310,11 +326,11 @@ describe("DocumentBrowser infinite scroll (issue #6455)", () => {
await dataGrid.reload!();
await flushUi();
expect(backend.documentFindDocuments.mock.calls[3]!.slice(0, 5)).toEqual(["mongo-1", "test", "docs", 0, 2]);
expect(backend.documentFindDocuments.mock.calls[3]!.slice(0, 5)).toEqual(["mongo-1", "test", "docs", 0, 5]);
expect(dataGrid.rows).toHaveLength(2);
expect(dataGrid.appendedFromRowCount).toBeUndefined();
expect(dataGrid.pageOffset).toBe(0);
expect(dataGrid.pageLimit).toBe(2);
expect(dataGrid.pageLimit).toBe(5);
expect(dataGrid.resetInfiniteScrollState).toHaveBeenCalledTimes(1);
});
@@ -341,16 +357,16 @@ describe("DocumentBrowser infinite scroll (issue #6455)", () => {
await flushUi();
expect(backend.documentUpdateDocument).toHaveBeenCalledTimes(1);
expect(backend.documentFindDocuments.mock.calls[3]!.slice(0, 5)).toEqual(["mongo-1", "test", "docs", 0, 2]);
expect(backend.documentFindDocuments.mock.calls[3]!.slice(0, 5)).toEqual(["mongo-1", "test", "docs", 0, 5]);
expect(dataGrid.rows).toHaveLength(2);
expect(dataGrid.appendedFromRowCount).toBeUndefined();
expect(dataGrid.pageOffset).toBe(0);
expect(dataGrid.pageLimit).toBe(2);
expect(dataGrid.pageLimit).toBe(5);
expect(dataGrid.resetInfiniteScrollState).toHaveBeenCalledTimes(1);
});
it("keeps the configured page size when the final capped segment has a smaller limit", async () => {
settings.editorSettings.pageSize = 3;
settings.editorSettings.tableOpenPageSize = 3;
backend.documentFindDocuments
.mockResolvedValueOnce(documentResult(1, 3, 11))
.mockResolvedValueOnce(documentResult(4, 3, 11))
@@ -84,7 +84,6 @@ import { dataGridCellDisplayText, dataGridCellEditorText } from "@/lib/dataGrid/
import { createColumnDrafts } from "@/lib/table/tableStructureEditorState";
import type { BuildSingleColumnAlterSqlOptions } from "@/lib/table/tableStructureEditorSql";
import { buildTableSelectSql, quoteTableDataIdentifier } from "@/lib/table/tableSelectSql";
import { tableOpenPageLimit } from "@/lib/table/tableOpenPageLimit";
import { uuid } from "@/lib/common/utils";
import { generateCellValues, type CellValueGenerationKind } from "@/lib/dataGrid/cellValueGeneration";
import { compactHeaderColumnType, isNumericColumnType, resolveDataGridTypeVisualKind, resolveHeaderColumnType, resolveResultColumnType } from "@/lib/dataGrid/dataGridColumnType";
@@ -219,6 +218,7 @@ import {
replaceColumnValueFilterCondition,
} from "@/lib/dataGrid/dataGridColumnFilter";
import { normalizeResultPageSize, resultPageSizeMenuOptions } from "@/lib/dataGrid/paginationPageSize";
import { dataGridPageSizeSettingsPatch, preferredDataGridPageSize, resolveDataGridPageSizePreference, type DataGridPageSizePreference } from "@/lib/dataGrid/dataGridPageSizePreference";
import { continuousQueryResultMaxRows, effectiveQueryResultMaxRows } from "@/lib/dataGrid/queryResultRowLimit";
import { allNullColumnIndexes } from "@/lib/dataGrid/dataGridColumnVisibility";
import { buildDataGridColumnLookupItems, dataGridColumnCommentFor, filterDataGridColumnLookupItems } from "@/lib/dataGrid/dataGridColumnLookup";
@@ -385,6 +385,7 @@ interface DataGridProps {
schema?: string;
columnLayoutScopeKey?: string;
context?: "results" | "table-data";
pageSizePreference?: DataGridPageSizePreference;
autoTransposeSingleRow?: boolean;
sourceColumns?: Array<string | undefined>;
readonlyColumnIndexes?: number[];
@@ -3076,7 +3077,8 @@ watch(
);
// --- Pagination ---
const pageSize = ref(normalizeResultPageSize(props.context === "table-data" ? (props.pageLimit ?? tableOpenPageLimit(settingsStore.editorSettings.tableOpenPageSize)) : settingsStore.editorSettings.pageSize));
const pageSizePreference = computed(() => resolveDataGridPageSizePreference(props.context, props.pageSizePreference));
const pageSize = ref(preferredDataGridPageSize(settingsStore.editorSettings, pageSizePreference.value, props.pageLimit));
const currentPage = ref(1);
const pageSizeOptions = computed(() => resultPageSizeMenuOptions(pageSize.value));
const customPageSizeInput = ref(String(pageSize.value));
@@ -3097,8 +3099,8 @@ watch(pageSize, (value) => {
watch(
() => settingsStore.editorSettings.pageSize,
(value) => {
// Table-data segments keep their own pagination state instead of following SQL result settings.
if (props.context === "table-data") return;
// Table-open grids keep their own pagination state instead of following SQL result settings.
if (pageSizePreference.value !== "results") return;
pageSize.value = normalizeResultPageSize(value, pageSize.value);
},
);
@@ -3440,7 +3442,7 @@ function checkInfiniteScroll(scroller: HTMLElement) {
function changePageSize(size: number) {
const normalizedSize = normalizeResultPageSize(size);
pageSize.value = normalizedSize;
settingsStore.updateEditorSettings(props.context === "table-data" ? { tableOpenPageSize: normalizedSize } : { pageSize: normalizedSize });
settingsStore.updateEditorSettings(dataGridPageSizeSettingsPatch(pageSizePreference.value, normalizedSize));
currentPage.value = 1;
lastInfiniteScrollPage = 0;
infiniteScrollAllLoaded = false;