Skip to content

Commit c3fd209

Browse files
committed
add basic tabularization of summary events
1 parent ecce163 commit c3fd209

File tree

4 files changed

+112
-25
lines changed

4 files changed

+112
-25
lines changed

internal/dev_server/ui/dist/index.html

Lines changed: 2 additions & 2 deletions
Large diffs are not rendered by default.

internal/dev_server/ui/src/App.css

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,3 +63,36 @@ code {
6363
code.has-override {
6464
color: var(--lp-color-pink-600);
6565
}
66+
67+
/* Events table styling */
68+
.events-table {
69+
border: 1px solid var(--lp-color-border-ui-primary);
70+
border-collapse: collapse;
71+
width: 100%;
72+
}
73+
74+
.events-table th,
75+
.events-table td {
76+
border: 1px solid var(--lp-color-border-ui-primary);
77+
padding: 8px;
78+
text-align: left;
79+
}
80+
81+
.events-table th {
82+
background-color: var(--lp-color-bg-ui-tertiary);
83+
font-weight: var(--lp-font-weight-bold);
84+
font-size: var(--lp-font-size-400);
85+
color: var(--lp-color-text-primary);
86+
text-transform: uppercase;
87+
letter-spacing: 0.5px;
88+
padding: 12px 8px;
89+
border-bottom: 2px solid var(--lp-color-border-ui-secondary);
90+
}
91+
92+
.events-table tbody tr:nth-child(even) {
93+
background-color: var(--lp-color-bg-ui-secondary);
94+
}
95+
96+
.events-table tbody tr:nth-child(odd) {
97+
background-color: var(--lp-color-bg-ui-primary);
98+
}

internal/dev_server/ui/src/Event.tsx

Lines changed: 0 additions & 13 deletions
This file was deleted.

internal/dev_server/ui/src/EventsPage.tsx

Lines changed: 77 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,58 @@
11
import { useEffect, useState } from "react";
22
import { apiRoute } from "./util";
33
import { EventData } from "./types";
4-
import Event from "./Event";
54

65
type Props = {
6+
limit?: number;
77
};
88

9+
const clipboardLink = (linkText: string, value: string) => {
10+
return (
11+
<a
12+
href="#"
13+
onClick={(e) => {
14+
e.preventDefault();
15+
navigator.clipboard.writeText(value);
16+
}}
17+
>
18+
{linkText}
19+
</a>
20+
);
21+
}
922

23+
const summaryRows = (summaryEvent: any) => {
24+
let parsed;
25+
try {
26+
parsed = JSON.parse(summaryEvent.data);
27+
} catch (error) {
28+
console.error('Failed to parse event data as JSON:', error);
29+
return <div>Error. See console.</div>;
30+
}
31+
console.log('parsed', parsed);
32+
33+
let rows = [];
34+
for (const [key, value] of Object.entries(parsed.features)) {
35+
const rowId = summaryEvent.id + key;
36+
const counters = (value as any).counters || [];
37+
38+
for (const counter of counters) {
39+
rows.push(
40+
<tr key={rowId}>
41+
<td>{new Date(summaryEvent.timestamp).toLocaleTimeString()}</td>
42+
<td>summary</td>
43+
<td>{key}</td>
44+
<td>evaluated as {String(counter.value)}</td>
45+
<td>{clipboardLink('copy to clipboard', JSON.stringify(parsed))}</td>
46+
</tr>
47+
);
48+
}
49+
}
50+
51+
return rows;
52+
}
53+
54+
// Return array of <tr>s:
55+
// Time, Type, Key, Event, ViewAttributes
1056
const renderEvent = (event: EventData) => {
1157
let parsed;
1258
try {
@@ -16,10 +62,22 @@ const renderEvent = (event: EventData) => {
1662
return <div>Error. See console.</div>;
1763
}
1864

19-
return <Event event={event} />;
65+
if (parsed.kind === 'summary') {
66+
return summaryRows(event);
67+
}
68+
69+
return [
70+
<tr key={event.id}>
71+
<td>{event.timestamp}</td>
72+
<td>{parsed.kind}</td>
73+
<td></td>
74+
<td>{parsed.kind}</td>
75+
<td></td>
76+
</tr>,
77+
];
2078
};
2179

22-
const EventsPage = ({}: Props) => {
80+
const EventsPage = ({ limit = 1000 }: Props) => {
2381
const [events, setEvents] = useState<EventData[]>([]);
2482

2583
useEffect(() => {
@@ -34,7 +92,7 @@ const EventsPage = ({}: Props) => {
3492
timestamp: Date.now(),
3593
data: event.data
3694
};
37-
setEvents(prevEvents => [...prevEvents, newEvent]);
95+
setEvents(prevEvents => [newEvent, ...prevEvents].slice(0, limit));
3896
});
3997

4098
return () => {
@@ -45,12 +103,21 @@ const EventsPage = ({}: Props) => {
45103

46104
return (
47105
<div>
48-
<h3>Events Stream</h3>
49-
<ul>
50-
{events.map(event => (
51-
<li key={event.id}>{renderEvent(event)}</li>
52-
))}
53-
</ul>
106+
<h3>Events Stream (limit: {limit})</h3>
107+
<table className="events-table">
108+
<thead>
109+
<tr>
110+
<th>Time</th>
111+
<th>Type</th>
112+
<th>Key</th>
113+
<th>Event</th>
114+
<th>Link</th>
115+
</tr>
116+
</thead>
117+
<tbody>
118+
{events.map(event => renderEvent(event))}
119+
</tbody>
120+
</table>
54121
{events.length === 0 && <p>No events received yet...</p>}
55122
</div>
56123
);

0 commit comments

Comments
 (0)