From 6ffc4627905d9a35b633145ec30a4e868586805e Mon Sep 17 00:00:00 2001 From: zipg Date: Tue, 29 Sep 2026 13:39:58 +0800 Subject: [PATCH] fix(grid): add tooltips for auto refresh and go-to-column toolbar controls --- apps/desktop/src/components/grid/DataGrid.vue | 72 +++---- .../src/components/grid/DataGridToolbar.vue | 34 ++-- .../DataGridToolbarIconTooltips.spec.ts | 189 ++++++++++++++++++ ...ssue-10602-toolbar-tooltip-autorefresh.png | Bin 0 -> 16931 bytes ...issue-10602-toolbar-tooltip-gotocolumn.png | Bin 0 -> 16151 bytes 5 files changed, 244 insertions(+), 51 deletions(-) create mode 100644 apps/desktop/src/components/grid/__tests__/DataGridToolbarIconTooltips.spec.ts create mode 100644 docs/screenshots/issue-10602-toolbar-tooltip-autorefresh.png create mode 100644 docs/screenshots/issue-10602-toolbar-tooltip-gotocolumn.png diff --git a/apps/desktop/src/components/grid/DataGrid.vue b/apps/desktop/src/components/grid/DataGrid.vue index aee63a9281..fd847bcdf8 100644 --- a/apps/desktop/src/components/grid/DataGrid.vue +++ b/apps/desktop/src/components/grid/DataGrid.vue @@ -12524,9 +12524,9 @@ useUpdateBlocker(() => (hasPendingChanges.value || hasPendingDataEditorDraft.val diff --git a/apps/desktop/src/components/grid/DataGridToolbar.vue b/apps/desktop/src/components/grid/DataGridToolbar.vue index 2314984a28..203308cf6c 100644 --- a/apps/desktop/src/components/grid/DataGridToolbar.vue +++ b/apps/desktop/src/components/grid/DataGridToolbar.vue @@ -94,21 +94,25 @@ function actionLabelClass(action: DataGridToolbarActionKey) { - - - + + + + + + + {{ autoRefresh?.label ?? autoRefresh?.shortLabel }} + diff --git a/apps/desktop/src/components/grid/__tests__/DataGridToolbarIconTooltips.spec.ts b/apps/desktop/src/components/grid/__tests__/DataGridToolbarIconTooltips.spec.ts new file mode 100644 index 0000000000..a24c34ec7a --- /dev/null +++ b/apps/desktop/src/components/grid/__tests__/DataGridToolbarIconTooltips.spec.ts @@ -0,0 +1,189 @@ +// @vitest-environment happy-dom + +import { createApp, defineComponent, h, markRaw, nextTick, type App, type PropType } from "vue"; +import { createPinia, setActivePinia } from "pinia"; +import { afterEach, describe, expect, it, vi } from "vitest"; +import i18n from "@/i18n"; +import type { QueryResult } from "@/types/database"; +import { TooltipProvider } from "@/components/ui/tooltip"; + +vi.mock("@/composables/useDataGridColumnResize", async (importOriginal) => { + const actual = await importOriginal(); + const { ref } = await import("vue"); + return { + ...actual, + useDataGridColumnResize: () => ({ + initColumnWidths: vi.fn(), + onResizeStart: vi.fn(), + autoFitColumn: vi.fn(), + renderedColumnWidths: ref([120]), + totalWidth: ref(120), + columnVars: ref({ "--total-w": "120px" }), + getIsResizing: () => false, + }), + }; +}); + +import DataGrid from "../DataGrid.vue"; +import DataGridToolbar from "../DataGridToolbar.vue"; +import { useSettingsStore } from "@/stores/settingsStore"; + +const mountedApps: Array<{ app: App; host: HTMLElement }> = []; + +const RecycleScroller = defineComponent({ + props: { + items: { + type: Array as PropType, + default: () => [], + }, + }, + setup(props, { attrs, slots }) { + return () => + h( + "div", + attrs, + props.items.map((item) => slots.default?.({ item })), + ); + }, +}); + +function mountWithProvider(render: () => ReturnType) { + const pinia = createPinia(); + setActivePinia(pinia); + const host = document.createElement("div"); + document.body.append(host); + const Root = defineComponent({ + setup() { + return () => h(TooltipProvider, { delayDuration: 0 }, { default: render }); + }, + }); + const app = createApp(Root); + app.use(pinia); + app.use(i18n); + app.component("RecycleScroller", RecycleScroller); + app.mount(host); + const mounted = { app, host }; + mountedApps.push(mounted); + return mounted; +} + +function mountToolbar() { + return mountWithProvider(() => + h(DataGridToolbar, { + compact: true, + refresh: { label: "Refresh", tooltip: "Refresh (Mod+R)", onTrigger: vi.fn() }, + autoRefresh: { + label: "Auto-refresh results", + shortLabel: "Auto", + startLabel: "Start auto-refresh", + stopLabel: "Stop auto-refresh", + enabled: false, + intervalSeconds: 30, + sweepKey: 0, + intervalOptions: [10, 30, 60], + intervalLabel: (seconds: number) => `Refresh every ${seconds}s`, + onToggle: vi.fn(), + onSelectInterval: vi.fn(), + }, + }), + ); +} + +function mountGrid() { + const pinia = createPinia(); + setActivePinia(pinia); + const settingsStore = useSettingsStore(); + settingsStore.updateEditorSettings({ + dataGridRenderMode: "canvas", + shortcuts: { ...settingsStore.editorSettings.shortcuts, goToColumn: "Mod+G" }, + }); + const result = markRaw({ + columns: ["id"], + rows: [[1]], + affected_rows: 0, + execution_time_ms: 0, + }); + const host = document.createElement("div"); + document.body.append(host); + const Root = defineComponent({ + setup() { + return () => h(TooltipProvider, { delayDuration: 0 }, { default: () => h(DataGrid, { result, databaseType: "mysql", context: "table-data" }) }); + }, + }); + const app = createApp(Root); + app.use(pinia); + app.use(i18n); + app.component("RecycleScroller", RecycleScroller); + app.mount(host); + const mounted = { app, host }; + mountedApps.push(mounted); + return mounted; +} + +async function settle() { + await nextTick(); + await Promise.resolve(); + await nextTick(); + await new Promise((resolve) => setTimeout(resolve, 20)); + await nextTick(); +} + +function toolbarButton(host: HTMLElement, action: string): HTMLButtonElement { + const button = host.querySelector(`[data-toolbar-action="${action}"]`); + if (!button) throw new Error(`Toolbar button ${action} not found`); + return button; +} + +function visibleTooltipTexts(): string[] { + return [...document.querySelectorAll('[data-slot="tooltip-content"]')].map((element) => element.textContent?.trim() ?? ""); +} + +function showsTooltip(text: string): boolean { + return visibleTooltipTexts().some((candidate) => candidate.includes(text)); +} + +async function hover(element: HTMLElement) { + element.dispatchEvent(new PointerEvent("pointermove", { bubbles: true, cancelable: true, pointerType: "mouse" })); + await settle(); +} + +afterEach(() => { + vi.restoreAllMocks(); + for (const { app, host } of mountedApps.splice(0)) { + app.unmount(); + host.remove(); + } + document.body.innerHTML = ""; +}); + +describe("data grid icon-only toolbar tooltips", () => { + it("keeps the existing refresh tooltip (control case)", async () => { + const { host } = mountToolbar(); + await settle(); + + const button = toolbarButton(host, "refresh"); + await hover(button); + + expect(showsTooltip("Refresh (Mod+R)")).toBe(true); + }); + + it("shows a tooltip for the auto refresh control", async () => { + const { host } = mountToolbar(); + await settle(); + + const button = toolbarButton(host, "autoRefresh"); + await hover(button); + + expect(showsTooltip("Auto-refresh results")).toBe(true); + }); + + it("shows a tooltip for the go to column control", async () => { + const { host } = mountGrid(); + await settle(); + + const button = toolbarButton(host, "navigation"); + await hover(button); + + expect(showsTooltip("Go to column")).toBe(true); + }); +}); diff --git a/docs/screenshots/issue-10602-toolbar-tooltip-autorefresh.png b/docs/screenshots/issue-10602-toolbar-tooltip-autorefresh.png new file mode 100644 index 0000000000000000000000000000000000000000..4f9f0f9407640bc8e295737347c98182b39b9a48 GIT binary patch literal 16931 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 literal 0 HcmV?d00001 diff --git a/docs/screenshots/issue-10602-toolbar-tooltip-gotocolumn.png b/docs/screenshots/issue-10602-toolbar-tooltip-gotocolumn.png new file mode 100644 index 0000000000000000000000000000000000000000..9ba16d7f43d0130894998076350e75106257d01c GIT binary patch literal 16151 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 literal 0 HcmV?d00001