@@ -15,6 +15,20 @@ import { useEffect, useState } from "react";
15
15
import { BarChart } from "@/viz/BarChart" ;
16
16
import { LineChart } from "@/viz/LineChart" ;
17
17
import { useAlertsStore } from "@/hooks/useAlertsStore" ;
18
+ import { Markdown } from "./Markdown" ;
19
+
20
+ const wrapObjectOutput = ( input : string ) => {
21
+ const isObject = / \{ " / . test ( input ) ;
22
+
23
+ if ( isObject ) {
24
+ return (
25
+ < pre className = "w-full h-40 overflow-auto whitespace-pre-wrap bg-gray-100 p-2" >
26
+ < code > { input } </ code >
27
+ </ pre >
28
+ ) ;
29
+ }
30
+ return < Markdown className = "overflow-x-hidden" > { input || "N/A" } </ Markdown > ;
31
+ } ;
18
32
19
33
export function Dashboard ( ) {
20
34
const { alerts, loading, fetchAlerts } = useAlertsStore ( ) ;
@@ -52,7 +66,7 @@ export function Dashboard() {
52
66
/>
53
67
</ div >
54
68
< div className = "relative w-[350px] h-[240px]" >
55
- < LineChart alerts = { alerts } loading = { loading } />
69
+ < LineChart alerts = { alerts } loading = { loading } />
56
70
</ div >
57
71
</ div >
58
72
@@ -92,29 +106,39 @@ export function Dashboard() {
92
106
< Table >
93
107
< TableHeader >
94
108
< TableRow >
95
- < TableHead > Trigger Type</ TableHead >
96
- < TableHead > Trigger Token</ TableHead >
97
- < TableHead > File</ TableHead >
98
- < TableHead > Code</ TableHead >
99
- < TableHead > Timestamp</ TableHead >
109
+ < TableHead className = "max-w-[100px]" > Trigger Type</ TableHead >
110
+ < TableHead className = "w-[30%] max-w-[300px]" >
111
+ Trigger Token
112
+ </ TableHead >
113
+ < TableHead className = "max-w-[100px]" > File</ TableHead >
114
+ < TableHead className = "w-[30%] max-w-[300px]" > Code</ TableHead >
115
+ < TableHead className = "max-w-[100px]" > Timestamp</ TableHead >
100
116
</ TableRow >
101
117
</ TableHeader >
102
118
< TableBody >
103
119
{ filteredAlerts . map ( ( alert ) => (
104
120
< TableRow key = { alert . alert_id } >
105
- < TableCell > { alert . trigger_type } </ TableCell >
106
- < TableCell > { alert . trigger_string || "N/A" } </ TableCell >
107
- < TableCell > { alert . code_snippet ?. filepath || "N/A" } </ TableCell >
108
- < TableCell >
121
+ < TableCell className = "max-w-[100px] truncate" >
122
+ { alert . trigger_type }
123
+ </ TableCell >
124
+ < TableCell className = "w-[30%] max-w-[300px]" >
125
+ < div className = "max-h-40 p-4 rounded overflow-y-auto whitespace-pre-wrap" >
126
+ { wrapObjectOutput ( alert . trigger_string ?? "" ) }
127
+ </ div >
128
+ </ TableCell >
129
+ < TableCell className = "max-w-[100px] truncate" >
130
+ { alert . code_snippet ?. filepath || "N/A" }
131
+ </ TableCell >
132
+ < TableCell className = "w-[30%] max-w-[300px]" >
109
133
{ alert . code_snippet ?. code ? (
110
- < pre className = "whitespace-pre-wrap bg-gray-100 p-2 h-20 overflow-auto text-sm " >
111
- { alert . code_snippet ?. code }
134
+ < pre className = "w-full h-40 overflow-auto whitespace-pre-wrap bg-gray-100 p-2" >
135
+ < code > { alert . code_snippet ?. code } </ code >
112
136
</ pre >
113
137
) : (
114
138
"N/A"
115
139
) }
116
140
</ TableCell >
117
- < TableCell >
141
+ < TableCell className = "max-w-[100px] truncate" >
118
142
< div > { format ( new Date ( alert . timestamp ) , "y/MM/dd" ) } </ div >
119
143
< div > { format ( new Date ( alert . timestamp ) , "HH:mm a" ) } </ div >
120
144
</ TableCell >
0 commit comments