diff --git a/packages/web/src/pages/EventDetailPage.jsx b/packages/web/src/pages/EventDetailPage.jsx
index 9b3bd31..1052f68 100644
--- a/packages/web/src/pages/EventDetailPage.jsx
+++ b/packages/web/src/pages/EventDetailPage.jsx
@@ -1,5 +1,6 @@
+import { useMemo, useState } from "react";
import { Link, useParams } from "react-router-dom";
-import { LuArrowLeft } from "react-icons/lu";
+import { LuArrowLeft, LuFilter } from "react-icons/lu";
import { useRun } from "../api/hooks.js";
import { LogViewer } from "../components/LogViewer.jsx";
import { formatTime, StatusBadge } from "../lib/format.jsx";
@@ -11,6 +12,10 @@ function stepLabel(s) {
return s.script;
}
+function filterLabel(s) {
+ return `#${s.step_index} ${stepLabel(s)}`;
+}
+
function isEditableScript(s) {
return Boolean(s.script) && s.script !== "set";
}
@@ -18,6 +23,29 @@ function isEditableScript(s) {
export function EventDetailPage() {
const { id } = useParams();
const { data: run, isLoading, error } = useRun(id);
+ const [stepFilters, setStepFilters] = useState([]);
+
+ const steps = run?.steps ?? [];
+ const logs = run?.logs ?? [];
+ const logFilters = useMemo(
+ () =>
+ stepFilters
+ .map((stepId) => steps.find((s) => s.id === stepId))
+ .filter(Boolean)
+ .map((s) => ({ id: s.id, label: filterLabel(s) })),
+ [stepFilters, steps],
+ );
+ const visibleLogs = useMemo(() => {
+ if (stepFilters.length === 0) return logs;
+ const ids = new Set(stepFilters);
+ return logs.filter((l) => ids.has(l.step_id));
+ }, [logs, stepFilters]);
+
+ function toggleStepFilter(stepId) {
+ setStepFilters((prev) =>
+ prev.includes(stepId) ? prev.filter((id) => id !== stepId) : [...prev, stepId],
+ );
+ }
if (isLoading) return
;
if (error || !run) return
Event not found
;
@@ -71,10 +99,11 @@ export function EventDetailPage() {
Status |
Duration |
Error |
+
|
- {(run.steps ?? []).map((s) => (
+ {steps.map((s) => (
| {s.step_index} |
@@ -91,6 +120,17 @@ export function EventDetailPage() {
|
{s.duration_ms != null ? `${s.duration_ms}ms` : "—"} |
{s.error || ""} |
+
+
+ |
))}
@@ -98,7 +138,11 @@ export function EventDetailPage() {