diff --git a/webui/src/pages/Config.tsx b/webui/src/pages/Config.tsx index 98a707e..0dff63d 100644 --- a/webui/src/pages/Config.tsx +++ b/webui/src/pages/Config.tsx @@ -21,10 +21,32 @@ const Config: React.FC = () => { const { t } = useTranslation(); const { cfg, setCfg, cfgRaw, setCfgRaw, loadConfig, hotReloadFieldDetails, q } = useAppContext(); const [showRaw, setShowRaw] = useState(false); - const topKeys = useMemo(() => Object.keys(cfg || {}).filter(k => typeof (cfg as any)?.[k] === 'object' && (cfg as any)?.[k] !== null), [cfg]); - const [selectedTop, setSelectedTop] = useState(''); + const [basicMode, setBasicMode] = useState(true); + const [hotOnly, setHotOnly] = useState(false); + const [search, setSearch] = useState(''); - const activeTop = selectedTop || topKeys[0] || ''; + const hotPrefixes = useMemo(() => hotReloadFieldDetails.map((x) => String(x.path || '').replace(/\.\*$/, '')).filter(Boolean), [hotReloadFieldDetails]); + + const allTopKeys = useMemo(() => Object.keys(cfg || {}).filter(k => typeof (cfg as any)?.[k] === 'object' && (cfg as any)?.[k] !== null), [cfg]); + const basicTopKeys = useMemo(() => { + const preferred = ['gateway', 'providers', 'channels', 'tools', 'cron', 'agents', 'logging']; + return preferred.filter((k) => allTopKeys.includes(k)); + }, [allTopKeys]); + + const filteredTopKeys = useMemo(() => { + let keys = basicMode ? basicTopKeys : allTopKeys; + if (hotOnly) { + keys = keys.filter((k) => hotPrefixes.some((p) => p === k || p.startsWith(`${k}.`) || k.startsWith(`${p}.`))); + } + if (search.trim()) { + const s = search.trim().toLowerCase(); + keys = keys.filter((k) => k.toLowerCase().includes(s)); + } + return keys; + }, [allTopKeys, basicTopKeys, basicMode, hotOnly, search, hotPrefixes]); + + const [selectedTop, setSelectedTop] = useState(''); + const activeTop = filteredTopKeys.includes(selectedTop) ? selectedTop : (filteredTopKeys[0] || ''); async function saveConfig() { try { @@ -48,13 +70,21 @@ const Config: React.FC = () => { -
+
+ + + setSearch(e.target.value)} placeholder="搜索分类..." className="px-3 py-2 bg-zinc-950 border border-zinc-800 rounded-lg text-sm" />
@@ -75,7 +105,7 @@ const Config: React.FC = () => {