diff --git a/apps/arc-web/app/data/runs.ts b/apps/arc-web/app/data/runs.ts
index 0348a812f..875c7cff9 100644
--- a/apps/arc-web/app/data/runs.ts
+++ b/apps/arc-web/app/data/runs.ts
@@ -157,7 +157,7 @@ export const columns: {
];
export function allRunsFlat(): RunWithStatus[] {
- return columns.flatMap((col) =>
+ return [...columns].reverse().flatMap((col) =>
col.items.map((item) => ({
...item,
status: col.id,
diff --git a/apps/arc-web/app/routes/workflow-runs.tsx b/apps/arc-web/app/routes/workflow-runs.tsx
index bca224957..9666310a0 100644
--- a/apps/arc-web/app/routes/workflow-runs.tsx
+++ b/apps/arc-web/app/routes/workflow-runs.tsx
@@ -1,71 +1,90 @@
+import { useState } from "react";
+import { MagnifyingGlassIcon } from "@heroicons/react/24/outline";
import { allRunsFlat, ciConfig, statusColors } from "../data/runs";
-import type { CiStatus, RunWithStatus } from "../data/runs";
+import type { RunWithStatus } from "../data/runs";
const runs = allRunsFlat();
-function CiBadge({ status }: { status: CiStatus }) {
- const config = ciConfig[status];
+function GitPullRequestIcon({ className }: { className?: string }) {
return (
-
-
- {config.label}
-
+
);
}
function RunRow({ run }: { run: RunWithStatus }) {
const colors = statusColors[run.status];
return (
-
-
+
+
{run.statusLabel}
-
- {run.repo}
- {run.number != null && (
- #{run.number}
+
+ {run.elapsed}
+
+
+
+ {run.title}
+ {run.comments != null && run.comments > 0 && (
+
+
+ {run.comments}
+
)}
- {run.title}
+
+ {run.additions != null && +{run.additions.toLocaleString()}}
+ {run.deletions != null && -{run.deletions.toLocaleString()}}
+
- {run.additions != null && run.deletions != null && (
-
- +{run.additions.toLocaleString()}
- -{run.deletions.toLocaleString()}
-
- )}
-
- {run.ci != null && (
-
-
-
- )}
-
- {run.comments != null && run.comments > 0 && (
-
-
- {run.comments}
-
- )}
-
-
- {run.elapsed}
+
+ {run.number != null && (
+ <>
+
+ #{run.number}
+ {run.ci != null && }
+ >
+ )}
);
}
export default function WorkflowRuns() {
+ const [query, setQuery] = useState("");
+ const filtered = runs.filter(
+ (r) =>
+ r.title.toLowerCase().includes(query.toLowerCase()) ||
+ r.statusLabel.toLowerCase().includes(query.toLowerCase()) ||
+ (r.number != null && `#${r.number}`.includes(query)),
+ );
+
return (
-
- {runs.map((run) => (
-
- ))}
+
+
+
+ setQuery(e.target.value)}
+ className="w-full rounded-lg border border-white/[0.06] bg-navy-800/80 py-2 pl-9 pr-3 text-sm text-ice-100 placeholder-navy-600 outline-none transition-colors focus:border-teal-500/40 focus:ring-0"
+ />
+
+
+ {filtered.map((run) => (
+
+ ))}
+ {filtered.length === 0 && (
+
No runs match "{query}"
+ )}
+
);
}