From db135f217f4df00d0ae4d4903967a2d01d2a2b98 Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Sun, 19 Apr 2026 15:31:20 +0800 Subject: [PATCH] feat(web): add tooltips for truncated fields in system status dialog Wrap session_id, image, and mount path fields with Tooltip components so hovering over truncated text shows the full value. --- .../overview-cards/SystemStatusCards.tsx | 375 ++++++++++-------- 1 file changed, 201 insertions(+), 174 deletions(-) diff --git a/web/src/app/home/monitoring/components/overview-cards/SystemStatusCards.tsx b/web/src/app/home/monitoring/components/overview-cards/SystemStatusCards.tsx index c83b08ab..51b34685 100644 --- a/web/src/app/home/monitoring/components/overview-cards/SystemStatusCards.tsx +++ b/web/src/app/home/monitoring/components/overview-cards/SystemStatusCards.tsx @@ -28,6 +28,12 @@ import { ApiRespBoxStatus, BoxSessionInfo, } from '@/app/infra/entities/api'; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from '@/components/ui/tooltip'; import { httpClient } from '@/app/infra/http/HttpClient'; function StatusDot({ ok }: { ok: boolean | null }) { @@ -141,195 +147,216 @@ export default function SystemStatusCard({ {t('monitoring.systemStatus')} -
- {/* Plugin Runtime */} -
-
- - - {t('monitoring.pluginRuntime')} - -
-
-
- {pluginOk ? ( - - ) : ( - - )} - - {pluginOk - ? t('monitoring.connected') - : pluginStatus && !pluginStatus.is_enable - ? t('monitoring.disabled') - : t('monitoring.disconnected')} + +
+ {/* Plugin Runtime */} +
+
+ + + {t('monitoring.pluginRuntime')}
- {pluginStatus && !pluginStatus.is_enable && ( -

- {t('monitoring.pluginDisabled')} -

- )} - {pluginStatus && - !pluginOk && - pluginStatus.is_enable && - pluginStatus.plugin_connector_error && - pluginStatus.plugin_connector_error !== 'ok' && ( -

- {pluginStatus.plugin_connector_error} -

- )} -
-
- -
- - {/* Box Runtime */} -
-
- - - {t('monitoring.boxRuntime')} - -
-
-
- {boxOk ? ( - - ) : ( - - )} - - {boxOk - ? t('monitoring.connected') - : t('monitoring.disconnected')} - -
- {boxStatus && !boxOk && boxStatus.connector_error && ( -

- {boxStatus.connector_error} -

- )} - {boxStatus && ( -
- {boxStatus.backend && ( -

- {t('monitoring.boxBackend')}:{' '} - - {boxStatus.backend.name} - -

- )} -

- {t('monitoring.boxProfile')}:{' '} - - {boxStatus.profile} - -

- {boxOk && boxStatus.active_sessions !== undefined && ( -

- {t('monitoring.boxSandboxes')}:{' '} - - {boxStatus.active_sessions} - -

+
+
+ {pluginOk ? ( + + ) : ( + )} + + {pluginOk + ? t('monitoring.connected') + : pluginStatus && !pluginStatus.is_enable + ? t('monitoring.disabled') + : t('monitoring.disconnected')} +
- )} + {pluginStatus && !pluginStatus.is_enable && ( +

+ {t('monitoring.pluginDisabled')} +

+ )} + {pluginStatus && + !pluginOk && + pluginStatus.is_enable && + pluginStatus.plugin_connector_error && + pluginStatus.plugin_connector_error !== 'ok' && ( +

+ {pluginStatus.plugin_connector_error} +

+ )} +
+
- {/* Active Sandboxes */} - {boxSessions.length > 0 && ( -
- {boxSessions.map((session) => ( -
-
- - - {session.session_id} +
+ + {/* Box Runtime */} +
+
+ + + {t('monitoring.boxRuntime')} + +
+
+
+ {boxOk ? ( + + ) : ( + + )} + + {boxOk + ? t('monitoring.connected') + : t('monitoring.disconnected')} + +
+ {boxStatus && !boxOk && boxStatus.connector_error && ( +

+ {boxStatus.connector_error} +

+ )} + {boxStatus && ( +
+ {boxStatus.backend && ( +

+ {t('monitoring.boxBackend')}:{' '} + + {boxStatus.backend.name} -

-
-
- - - {session.image} - +

+ )} +

+ {t('monitoring.boxProfile')}:{' '} + + {boxStatus.profile} + +

+ {boxOk && boxStatus.active_sessions !== undefined && ( +

+ {t('monitoring.boxSandboxes')}:{' '} + + {boxStatus.active_sessions} + +

+ )} +
+ )} + + {/* Active Sandboxes */} + {boxSessions.length > 0 && ( +
+ {boxSessions.map((session) => ( +
+
+ + + + + {session.session_id} + + + + {session.session_id} + +
-
- - - {session.backend_name} - -
-
- - - {session.cpus} CPU / {session.memory_mb} MB - -
-
- - - {session.network} - -
- {session.host_path && ( -
- - - {session.mount_path}{' '} - - ({session.host_path_mode}) +
+
+ + + + + {session.image} + + + {session.image} + +
+
+ + + {session.backend_name} + +
+
+ + + {session.cpus} CPU / {session.memory_mb} MB + +
+
+ + + {session.network} + +
+ {session.host_path && ( +
+ + + + + {session.host_path} : {session.mount_path}{' '} + + ({session.host_path_mode}) + + + + + {session.host_path} : {session.mount_path} ( + {session.host_path_mode}) + + +
+ )} +
+ + + {t('monitoring.boxSessionCreated')}:{' '} + + {new Date( + session.created_at, + ).toLocaleString()}
- )} -
- - - {t('monitoring.boxSessionCreated')}:{' '} - - {new Date(session.created_at).toLocaleString()} +
+ + + {t('monitoring.boxSessionLastUsed')}:{' '} + + {new Date( + session.last_used_at, + ).toLocaleString()} + - -
-
- - - {t('monitoring.boxSessionLastUsed')}:{' '} - - {new Date( - session.last_used_at, - ).toLocaleString()} - - +
-
- ))} -
- )} + ))} +
+ )} +
-
+