From 3c04af9532c267de78f1946e6298394883cb8a21 Mon Sep 17 00:00:00 2001 From: Joe Allen <49467845+LiJoeAllen@users.noreply.github.com> Date: Tue, 18 Aug 2026 19:29:12 +0800 Subject: [PATCH] feat: hover preview for truncated JSON content New HoverPreview component shows a floating tooltip with full content on mouse hover (400ms delay). Applied to: - MessageStream: collapsed + expanded payload views - PresetList: payload preview in table - LogPanel: details section The popup follows the mouse cursor, auto-positions within viewport, and supports monospace code formatting with scroll for long content. --- src/components/common/HoverPreview.vue | 119 +++++++++++++++++++++ src/components/dashboard/LogPanel.vue | 3 +- src/components/dashboard/MessageStream.vue | 7 +- src/components/presets/PresetList.vue | 5 +- 4 files changed, 130 insertions(+), 4 deletions(-) create mode 100644 src/components/common/HoverPreview.vue diff --git a/src/components/common/HoverPreview.vue b/src/components/common/HoverPreview.vue new file mode 100644 index 0000000..480820c --- /dev/null +++ b/src/components/common/HoverPreview.vue @@ -0,0 +1,119 @@ + + + + + \ No newline at end of file diff --git a/src/components/dashboard/LogPanel.vue b/src/components/dashboard/LogPanel.vue index db92a40..fd4ec21 100644 --- a/src/components/dashboard/LogPanel.vue +++ b/src/components/dashboard/LogPanel.vue @@ -3,6 +3,7 @@ import { ref, computed, watch, nextTick } from 'vue' import { useLogs } from '../../stores/useLogs' import { mqttGetLogDir } from '../../stores/useMqttBridge' import { prettyJson } from '../../utils/format' +import HoverPreview from '../common/HoverPreview.vue' import { ElMessage } from 'element-plus' const { logs, clear } = useLogs() @@ -122,7 +123,7 @@ function eventIcon(event: string): string { {{ expandedDetails.has(log.id) ? '收起' : '详情' }}
- {{ prettyJson(log.details) }} + {{ prettyJson(log.details) }}
diff --git a/src/components/dashboard/MessageStream.vue b/src/components/dashboard/MessageStream.vue index 13959c9..cdeddd5 100644 --- a/src/components/dashboard/MessageStream.vue +++ b/src/components/dashboard/MessageStream.vue @@ -2,6 +2,7 @@ import { ref, watch, nextTick } from 'vue' import type { MqttMessage } from '../../types/mqtt' import { prettyJson, isJson, truncate } from '../../utils/format' +import HoverPreview from '../common/HoverPreview.vue' const props = defineProps<{ messages: MqttMessage[] @@ -168,8 +169,10 @@ function formatTime(ts: number): string {
{{ formatPayload(msg) }}
-
{{ truncate(prettyJson(msg.payload), 200) }}
+ >{{ formatPayload(msg) }} +
+              {{ truncate(prettyJson(msg.payload), 200) }}
+            
diff --git a/src/components/presets/PresetList.vue b/src/components/presets/PresetList.vue index a1bcd55..616e39f 100644 --- a/src/components/presets/PresetList.vue +++ b/src/components/presets/PresetList.vue @@ -4,6 +4,7 @@ import { ElMessage, ElMessageBox } from 'element-plus' import type { Preset } from '../../types/mqtt' import { usePresets } from '../../stores/usePresets' import { prettyJson, truncate } from '../../utils/format' +import HoverPreview from '../common/HoverPreview.vue' import PresetForm from './PresetForm.vue' // eslint-disable-next-line @typescript-eslint/no-unused-vars @@ -77,7 +78,9 @@ const qosLabel = (qos: number) => `QoS ${qos}`