import { Card, Descriptions, Table, Typography, Button, Space, message } from 'antd'; import type { ColumnsType } from 'antd/es/table'; import { CopyOutlined, LinkOutlined } from '@ant-design/icons'; import { useQuery } from '@tanstack/react-query'; import { fetchGrafanaConfig, type GrafanaDashboard } from '../../api/grafana'; const { Text, Paragraph } = Typography; interface DashboardRow extends GrafanaDashboard { url: string; } export function GrafanaInfoCard() { const { data, isLoading } = useQuery({ queryKey: ['grafana-config'], queryFn: fetchGrafanaConfig }); const baseUrl = data?.baseUrl?.replace(/\/$/, '') ?? ''; const rows: DashboardRow[] = (data?.dashboards ?? []).map((d) => ({ ...d, url: baseUrl ? `${baseUrl}/d/${encodeURIComponent(d.uid)}?orgId=1&kiosk=tv&theme=light` : '', })); const copy = async (text: string) => { try { await navigator.clipboard.writeText(text); message.success('Copied'); } catch { message.error('Copy failed'); } }; const columns: ColumnsType = [ { title: 'Title', dataIndex: 'title', key: 'title' }, { title: 'UID', dataIndex: 'uid', key: 'uid' }, { title: 'Description', dataIndex: 'description', key: 'desc' }, { title: 'Embed URL', dataIndex: 'url', key: 'url', render: (url: string) => ( {url} )} {data?.defaultDashboardUid || '(unset)'} {data?.dashboards.length ?? 0} Add dashboards by dropping JSON into grafana/dashboards/ and adding a matching entry to Grafana.Dashboards in configuration. rowKey="uid" size="small" columns={columns} dataSource={rows} pagination={false} /> ); }