From 1d2874514e60a342e494709857b813e79cd89fc7 Mon Sep 17 00:00:00 2001 From: Oliver Kieselbach Date: Tue, 3 Mar 2026 10:16:01 +0100 Subject: [PATCH] add copy-to-clipboard button to event detail blocks Co-Authored-By: Claude Opus 4.6 --- .../[sessionId]/components/EventTimeline.tsx | 68 ++++++++++++++++++- 1 file changed, 65 insertions(+), 3 deletions(-) diff --git a/src/Web/autopilot-monitor-web/app/sessions/[sessionId]/components/EventTimeline.tsx b/src/Web/autopilot-monitor-web/app/sessions/[sessionId]/components/EventTimeline.tsx index 696ed9b8..751a1d5e 100644 --- a/src/Web/autopilot-monitor-web/app/sessions/[sessionId]/components/EventTimeline.tsx +++ b/src/Web/autopilot-monitor-web/app/sessions/[sessionId]/components/EventTimeline.tsx @@ -255,6 +255,7 @@ function EventRow({ event, isGalacticAdmin }: { event: EnrollmentEvent; isGalact const [showDetails, setShowDetails] = useState(false); const [showRaw, setShowRaw] = useState(false); const [copied, setCopied] = useState(false); + const [copiedDetail, setCopiedDetail] = useState(false); const detailData = useMemo(() => normalizeEventDataForDisplay(event.data), [event.data]); // Detect truncated data: backend sets _rawDataJson when DataJson could not be parsed @@ -278,6 +279,16 @@ function EventRow({ event, isGalacticAdmin }: { event: EnrollmentEvent; isGalact ? gatherOutput.replace(/\r\n/g, "\n").replace(/\r/g, "\n") : null; + const copyDetailContent = async (text: string) => { + try { + await navigator.clipboard.writeText(text); + setCopiedDetail(true); + setTimeout(() => setCopiedDetail(false), 1400); + } catch (err) { + console.error('Failed to copy detail content:', err); + } + }; + const copyEventId = async () => { try { await navigator.clipboard.writeText(event.eventId); @@ -335,7 +346,24 @@ function EventRow({ event, isGalacticAdmin }: { event: EnrollmentEvent; isGalact {gatherCommand} )} -
+
+
{formattedOutput}
@@ -367,7 +395,24 @@ function EventRow({ event, isGalacticAdmin }: { event: EnrollmentEvent; isGalact
Data truncated (exceeded 64KB storage limit)
-
+
+
{rawDataJson}
@@ -375,7 +420,24 @@ function EventRow({ event, isGalacticAdmin }: { event: EnrollmentEvent; isGalact {/* Non-gather (or gather without output): raw JSON details */} {showDetails && !isTruncated && !hasGatherOutput && detailData && ( -
+
+
{JSON.stringify(detailData, null, 2)}
)}