// 监控大屏 — 标签页切换 Agent / Zabbix / Prometheus // Logan.Li import React, { useState } from 'react'; import { useTranslation } from 'react-i18next'; import { Monitor, Server, Activity, Maximize2, Minimize2 } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { PageShell } from '@/components/layout/PageShell'; import { promDatasourceApi, zabbixDatasourceApi } from '@/api'; import { ZabbixDashboard } from './ZabbixDashboard'; import { PrometheusDashboard } from './PrometheusDashboard'; import i18n from '@/i18n'; import type { TabId } from './grafana-dashboard/types'; import { AgentTab } from './grafana-dashboard/AgentTab'; import { ExternalDatasourceTab } from './grafana-dashboard/ExternalDatasourceTab'; import { normalizeDatasourceList } from './grafana-dashboard/datasource-toolbar'; // ═══════════ Tab 配置 ═══════════ const getTabs = (): { id: TabId; label: string; icon: React.ReactNode }[] => [ { id: 'agent', label: i18n.t('monitor.dashboard.tab.agent'), icon: }, { id: 'zabbix', label: 'Zabbix', icon: }, { id: 'prometheus', label: 'Prometheus', icon: }, ]; // ═══════════ Zabbix Tab(薄包装) ═══════════ const ZabbixTab: React.FC = () => ( normalizeDatasourceList(await zabbixDatasourceApi.list())} loadingLabel={i18n.t('monitor.dashboard.zabbix.loading')} emptyTitle={i18n.t('monitor.dashboard.zabbix.emptyTitle')} > {(ds) => } ); // ═══════════ Prometheus Tab(薄包装) ═══════════ const PrometheusTab: React.FC = () => ( normalizeDatasourceList(await promDatasourceApi.list())} loadingLabel={i18n.t('monitor.dashboard.prometheus.loading')} emptyTitle={i18n.t('monitor.dashboard.prometheus.emptyTitle')} > {(ds) => } ); // ═══════════ 主组件 ═══════════ const GrafanaDashboard: React.FC = () => { useTranslation(); const [tab, setTab] = useState('agent'); const [fullscreen, setFullscreen] = useState(false); const tabs = getTabs(); const pageTabs = tabs.map((item) => ({ id: item.id, label: item.label })); return ( } tabs={pageTabs} activeTab={tab} onTabChange={(id) => setTab(id as TabId)} className={fullscreen ? 'fixed inset-0 z-50 bg-background p-4 overflow-auto' : undefined} contentClassName="min-h-[50vh]" actions={ } > {tab === 'agent' && } {tab === 'zabbix' && } {tab === 'prometheus' && } ); }; export default GrafanaDashboard;