Files
fusion/packages/dashboard/app/components/AgentsOverviewBar.tsx
gsxdsm 1e49494bac feat(i18n): full-sweep string migration — 5,930 keys across 5 locales (#1352)
Migration (multi-agent sweep over 216 files, 60 batches):
- Every user-visible dashboard + TUI string moved to t() with the exact
  English inline default (en rendering byte-identical)
- Catalogs merged from per-batch fragments: en/zh-CN/zh-TW/fr/es now
  carry ~5,930 keys each across common/app/errors/cli namespaces;
  CLI bundles regenerated (6 locales incl. ko)

Integration fixes:
- 18 type errors: reserved {{count}} interpolations renamed, malformed
  plural call, hand-rolled t-param types replaced with TFunction<"app">
- 23 lint errors: superseded label constants/helpers removed
- ExecutorStatusBar hook-order violation (keyboard-open early return
  moved below hooks)
- TUI tests wrapped in I18nextProvider (uninitialized fallback renders
  literal {{placeholders}}); dashboard vitest.setup boots a minimal en
  i18next instance for the same reason

Known WIP (next commits): ~457 residual strings across 50 batches,
Korean drafts for swept keys, and a dashboard test-suite pass that is
still being stabilized (~283 failures under investigation — fake-timer
waitFor interaction, likely stale node_modules vs merged lockfile).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 19:06:53 -07:00

62 lines
2.1 KiB
TypeScript

import { ChevronDown, ChevronRight } from "lucide-react";
import { useTranslation } from "react-i18next";
import { AgentMetricsBar } from "./AgentMetricsBar";
import { ActiveAgentsPanel } from "./ActiveAgentsPanel";
import type { Agent, AgentStats } from "../api";
import "./AgentsOverviewBar.css";
interface AgentsOverviewBarProps {
stats: AgentStats | null;
activeAgents: Agent[];
projectId?: string;
isOpen: boolean;
onToggle: () => void;
onSelectAgent?: (agentId: string) => void;
onOpenTaskLogs?: (taskId: string) => void;
}
export function AgentsOverviewBar({
stats,
activeAgents,
projectId,
isOpen,
onToggle,
onSelectAgent,
onOpenTaskLogs,
}: AgentsOverviewBarProps) {
const { t } = useTranslation("app");
const activeCount = activeAgents.filter((a) => a.state === "active").length;
const runningCount = activeAgents.filter((a) => a.state === "running").length;
return (
<section className="agents-overview-bar" aria-label="Agents overview">
<button
type="button"
className="agents-overview-bar__toggle"
aria-expanded={isOpen}
onClick={onToggle}
>
<span className="agents-overview-bar__title-wrap">
{isOpen ? <ChevronDown size={16} aria-hidden="true" /> : <ChevronRight size={16} aria-hidden="true" />}
<span className="agents-overview-bar__title">{t("agents.overview", "Overview")}</span>
</span>
<span className="agents-overview-bar__meta text-secondary">
{t("agents.statusCount", "{{activeCount}} active · {{runningCount}} running", { activeCount, runningCount })}
</span>
</button>
{isOpen ? (
<div className="agents-overview-bar__content">
<AgentMetricsBar stats={stats} className="agents-overview-bar__metrics" />
<ActiveAgentsPanel
agents={activeAgents}
projectId={projectId}
onAgentSelect={onSelectAgent}
onOpenTaskLogs={onOpenTaskLogs}
className="agents-overview-bar__active-panel"
/>
</div>
) : null}
</section>
);
}