import type { GroupedInstance } from "../types"; interface Props { groups: GroupedInstance[]; totalGroups: number; onSelect: (instanceId: string) => void; filterResolved: "all" | "resolved" | "unresolved"; onFilterChange: (f: "all" | "resolved" | "unresolved") => void; searchQuery: string; onSearchChange: (q: string) => void; loading: boolean; } export function InstanceList({ groups, totalGroups, onSelect, filterResolved, onFilterChange, searchQuery, onSearchChange, loading, }: Props) { return (
{/* Toolbar */}
onSearchChange(e.target.value)} placeholder="Search instances..." className="flex-1 max-w-sm bg-gray-800 border border-gray-700 rounded px-3 py-1.5 text-sm text-gray-200 placeholder-gray-500 focus:outline-none focus:border-blue-500" />
{(["all", "resolved", "unresolved"] as const).map((f) => ( ))}
{groups.length === totalGroups ? `${groups.length} instances` : `${groups.length} / ${totalGroups} instances`} {loading && ( Loading... )}
{/* Instance grid */}
{groups.map((g) => ( onSelect(g.instance_id)} /> ))}
{groups.length === 0 && !loading && (
No instances match your filters
)}
); } function InstanceCard({ group, onClick, }: { group: GroupedInstance; onClick: () => void; }) { const anyResolved = group.datasets.some((d) => d.summary.resolved); const allResolved = group.datasets.every((d) => d.summary.resolved); // Parse instance_id: "repo__issue-number" const parts = group.instance_id.split("__"); const repo = parts[0] || ""; const issue = parts.slice(1).join("__") || ""; return ( ); }