fix(grid): keep filters when refreshing restored table tabs

This commit is contained in:
Melody Ruch authored and GitHub committed 2026-09-03 17:52:07 +08:00
1 parent cd8300c3f5
commit aa637b2d90
5 files changed
+101 -4

No files matched your search

@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
import { canReloadUnavailableDataTab } from "@/lib/table/tableDataRefresh";
import { canReloadUnavailableDataTab, restoredDataTabReloadFilters } from "@/lib/table/tableDataRefresh";
describe("canReloadUnavailableDataTab", () => {
it("allows restored data tabs to reload before the grid mounts", () => {
@@ -21,3 +21,17 @@ describe("canReloadUnavailableDataTab", () => {
).toBe(false);
});
});
describe("restoredDataTabReloadFilters", () => {
it("carries the restored tab's own filter and sort back into the reload (#7963)", () => {
expect(restoredDataTabReloadFilters({ whereInput: "status = 'active'", orderByInput: "name DESC" })).toEqual({
whereInput: "status = 'active'",
orderBy: "name DESC",
});
});
it("reports blank filters as absent so the reload does not emit an empty WHERE/ORDER BY", () => {
expect(restoredDataTabReloadFilters({ whereInput: "", orderByInput: undefined })).toEqual({ whereInput: undefined, orderBy: undefined });
expect(restoredDataTabReloadFilters({ whereInput: " ", orderByInput: " " })).toEqual({ whereInput: undefined, orderBy: undefined });
});
});
@@ -5,3 +5,16 @@ type RefreshableDataTab = Pick<QueryTab, "mode" | "result" | "isExecuting">;
export function canReloadUnavailableDataTab(tab: RefreshableDataTab): boolean {
return tab.mode === "data" && !tab.result && !tab.isExecuting;
}
type RestoredDataTabFilters = Pick<QueryTab, "whereInput" | "orderByInput">;
// 恢复的数据标签页没有 result,刷新走的是 DataGrid 之外那条不带参数的 reload 入口。
// onReloadData 把缺省的 whereInput/orderBy 当成“用户已清空”(DataGrid 清空筛选时
// 正是传 undefined),所以这里必须显式回带标签页自己持久化的过滤/排序,
// 否则刷新会退回整张表的数据(#7963)。
export function restoredDataTabReloadFilters(tab: RestoredDataTabFilters): { whereInput?: string; orderBy?: string } {
return {
whereInput: tab.whereInput?.trim() || undefined,
orderBy: tab.orderByInput?.trim() || undefined,
};
}