mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-05-18 04:41:56 +00:00
Dashboard UX polish pass — consolidates create forms into modals triggered from the page header, fixes layout inconsistencies, adds scroll-to navigation for the Keys page, and aligns the TokenBar with the design system. Changes: - App.tsx: add padding to sidebar header - resolve-page-title.ts: add missing routes, better fallback title - en.ts: fix nav labels (Profiles was 'profiles : multi agents') - ModelsPage: two-col layout, auxiliary tasks modal, TokenBar redesign - ProfilesPage: create button in header, form in modal, Checkbox component - CronPage: create button in header, form in modal - EnvPage: scroll-to sub-nav in header, fix text overflow Modal and dialog standardization: - Replace all native confirm()/window.confirm() with ConfirmDialog (OAuthProvidersCard, PluginsPage, ModelsPage, ConfigPage) - Add useModalBehavior hook (Escape-to-close, scroll lock, focus restore) - Apply hook to ProfilesPage, CronPage, AuxiliaryTasksModal Component fixes (from PR review): - Checkbox: fix controlled/uncontrolled mismatch, add focus-visible ring - TokenBar: add rounded-full to legend dots, remove dead code CI/test fixes: - Fix TS unused imports (noUnusedLocals), type-narrow PickerTarget union - Add windows-footgun suppression on platform-guarded os.killpg - Fix 19 stale unit tests + 9 e2e tests broken by recent main changes - Restore minimal example-dashboard plugin for plugin auth test
41 lines
1 KiB
TypeScript
41 lines
1 KiB
TypeScript
import type { Translations } from "@/i18n/types";
|
|
|
|
const BUILTIN: Record<string, keyof Translations["app"]["nav"]> = {
|
|
"/chat": "chat",
|
|
"/sessions": "sessions",
|
|
"/analytics": "analytics",
|
|
"/models": "models",
|
|
"/logs": "logs",
|
|
"/cron": "cron",
|
|
"/skills": "skills",
|
|
"/plugins": "plugins",
|
|
"/profiles": "profiles",
|
|
"/config": "config",
|
|
"/env": "keys",
|
|
"/docs": "documentation",
|
|
};
|
|
|
|
export function resolvePageTitle(
|
|
pathname: string,
|
|
t: Translations,
|
|
pluginTabs: { path: string; label: string }[],
|
|
): string {
|
|
const normalized = pathname.replace(/\/$/, "") || "/";
|
|
if (normalized === "/") {
|
|
return t.app.nav.sessions;
|
|
}
|
|
const plugin = pluginTabs.find((p) => p.path === normalized);
|
|
if (plugin) {
|
|
return plugin.label;
|
|
}
|
|
const key = BUILTIN[normalized];
|
|
if (key) {
|
|
return t.app.nav[key];
|
|
}
|
|
// Derive title from pathname: "/profiles" → "Profiles"
|
|
const segment = normalized.slice(1);
|
|
if (segment) {
|
|
return segment.charAt(0).toUpperCase() + segment.slice(1);
|
|
}
|
|
return t.app.webUi;
|
|
}
|