feat: add view mode state and toggle to runtime dashboard
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
import { useState, useMemo, useCallback } from 'react';
|
import { useState, useMemo, useCallback } from 'react';
|
||||||
import { useParams, useNavigate } from 'react-router';
|
import { useParams, useNavigate } from 'react-router';
|
||||||
import { ExternalLink, RefreshCw, Pencil } from 'lucide-react';
|
import { ExternalLink, RefreshCw, Pencil, LayoutGrid, List, ChevronRight, ChevronDown } from 'lucide-react';
|
||||||
import {
|
import {
|
||||||
StatCard, StatusDot, Badge, MonoText,
|
StatCard, StatusDot, Badge, MonoText,
|
||||||
GroupCard, DataTable, EventFeed,
|
GroupCard, DataTable, EventFeed,
|
||||||
@@ -114,6 +114,27 @@ export default function AgentHealth() {
|
|||||||
const catalogEntry = catalogApps?.find((a) => a.slug === appId);
|
const catalogEntry = catalogApps?.find((a) => a.slug === appId);
|
||||||
|
|
||||||
const [confirmDismissOpen, setConfirmDismissOpen] = useState(false);
|
const [confirmDismissOpen, setConfirmDismissOpen] = useState(false);
|
||||||
|
const [viewMode, setViewMode] = useState<'compact' | 'expanded'>(() => {
|
||||||
|
const saved = localStorage.getItem('cameleer:runtime:viewMode');
|
||||||
|
return saved === 'expanded' ? 'expanded' : 'compact';
|
||||||
|
});
|
||||||
|
const [expandedApps, setExpandedApps] = useState<Set<string>>(new Set());
|
||||||
|
|
||||||
|
const toggleViewMode = useCallback((mode: 'compact' | 'expanded') => {
|
||||||
|
setViewMode(mode);
|
||||||
|
setExpandedApps(new Set());
|
||||||
|
localStorage.setItem('cameleer:runtime:viewMode', mode);
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
const toggleAppExpanded = useCallback((appId: string) => {
|
||||||
|
setExpandedApps((prev) => {
|
||||||
|
const next = new Set(prev);
|
||||||
|
if (next.has(appId)) next.delete(appId);
|
||||||
|
else next.add(appId);
|
||||||
|
return next;
|
||||||
|
});
|
||||||
|
}, []);
|
||||||
|
|
||||||
const [configEditing, setConfigEditing] = useState(false);
|
const [configEditing, setConfigEditing] = useState(false);
|
||||||
const [configDraft, setConfigDraft] = useState<Record<string, string | boolean>>({});
|
const [configDraft, setConfigDraft] = useState<Record<string, string | boolean>>({});
|
||||||
|
|
||||||
@@ -399,6 +420,22 @@ export default function AgentHealth() {
|
|||||||
accent={deadCount > 0 ? 'error' : 'success'}
|
accent={deadCount > 0 ? 'error' : 'success'}
|
||||||
detail={deadCount > 0 ? 'requires attention' : 'all healthy'}
|
detail={deadCount > 0 ? 'requires attention' : 'all healthy'}
|
||||||
/>
|
/>
|
||||||
|
<div className={styles.viewToggle}>
|
||||||
|
<button
|
||||||
|
className={`${styles.viewToggleBtn} ${viewMode === 'compact' ? styles.viewToggleBtnActive : ''}`}
|
||||||
|
onClick={() => toggleViewMode('compact')}
|
||||||
|
title="Compact view"
|
||||||
|
>
|
||||||
|
<LayoutGrid size={14} />
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
className={`${styles.viewToggleBtn} ${viewMode === 'expanded' ? styles.viewToggleBtnActive : ''}`}
|
||||||
|
onClick={() => toggleViewMode('expanded')}
|
||||||
|
title="Expanded view"
|
||||||
|
>
|
||||||
|
<List size={14} />
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Application config bar */}
|
{/* Application config bar */}
|
||||||
|
|||||||
Reference in New Issue
Block a user