diff --git a/pyproject.toml b/pyproject.toml index 0948d99..a9c8aaf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "uipath-dev" -version = "0.0.57" +version = "0.0.58" description = "UiPath Developer Console" readme = { file = "README.md", content-type = "text/markdown" } requires-python = ">=3.11" diff --git a/src/uipath/dev/server/frontend/src/components/runs/RunDetailsPanel.tsx b/src/uipath/dev/server/frontend/src/components/runs/RunDetailsPanel.tsx index e2b9fbb..8e5cf1c 100644 --- a/src/uipath/dev/server/frontend/src/components/runs/RunDetailsPanel.tsx +++ b/src/uipath/dev/server/frontend/src/components/runs/RunDetailsPanel.tsx @@ -460,12 +460,14 @@ function DataSection({ {copyText && ( diff --git a/src/uipath/dev/server/frontend/src/components/traces/SpanDetails.tsx b/src/uipath/dev/server/frontend/src/components/traces/SpanDetails.tsx index d1c4850..11ca330 100644 --- a/src/uipath/dev/server/frontend/src/components/traces/SpanDetails.tsx +++ b/src/uipath/dev/server/frontend/src/components/traces/SpanDetails.tsx @@ -28,15 +28,6 @@ function tryParseJson(value: unknown): string | null { return null; } -function formatDuration(ms: number): string { - if (ms < 1) return `${(ms * 1000).toFixed(0)}us`; - if (ms < 1000) return `${ms.toFixed(2)}ms`; - if (ms < 60000) return `${(ms / 1000).toFixed(2)}s`; - const mins = Math.floor(ms / 60000); - const secs = ((ms % 60000) / 1000).toFixed(1); - return `${mins}m ${secs}s`; -} - const TRUNCATE_LIMIT = 200; function stringifyValue(value: unknown): string { @@ -112,12 +103,16 @@ function AttributeValue({ value }: { value: unknown }) { export default function SpanDetails({ span }: Props) { const [attrsOpen, setAttrsOpen] = useState(true); const [idsOpen, setIdsOpen] = useState(false); + const [detailMode, setDetailMode] = useState<"table" | "json">("table"); + const [copied, setCopied] = useState(false); const status = STATUS_CONFIG[span.status.toLowerCase()] ?? { ...DEFAULT_STATUS, label: span.status }; - - const time = new Date(span.timestamp).toLocaleTimeString(undefined, { - hour12: false, - fractionalSecondDigits: 3, - } as Intl.DateTimeFormatOptions); + const spanJson = useMemo(() => JSON.stringify(span, null, 2), [span]); + const copySpanJson = useCallback(() => { + navigator.clipboard.writeText(spanJson).then(() => { + setCopied(true); + setTimeout(() => setCopied(false), 1500); + }); + }, [spanJson]); const attrEntries = Object.entries(span.attributes); const ids: { label: string; value: string }[] = [ @@ -128,17 +123,38 @@ export default function SpanDetails({ span }: Props) { ]; return ( -