import { Head, router } from '@inertiajs/react'; import { Database, PlugZap, RefreshCw, ServerCog } from 'lucide-react'; import { useState } from 'react'; import { PageHeading } from '@/components/page-heading'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import AppLayout from '@/layouts/app-layout'; import type { BreadcrumbItem } from '@/types'; type SyncRun = { id: number; status: 'running' | 'succeeded' | 'failed'; started_at: string | null; finished_at: string | null; records_processed: number; records_created: number; records_updated: number; records_disabled: number; error_message: string | null; }; type Props = { configured: boolean; baseUrl: string | null; assets: { total: number; active: number; requestable: number; }; syncRuns: SyncRun[]; }; const breadcrumbs: BreadcrumbItem[] = [ { title: 'Administração', href: '/administracao/snipe-it' }, { title: 'Snipe-IT', href: '/administracao/snipe-it' }, ]; const statusLabel: Record = { running: 'Em curso', succeeded: 'Concluída', failed: 'Falhou', }; function formatDate(value: string | null) { if (!value) { return '—'; } return new Intl.DateTimeFormat('pt-PT', { dateStyle: 'short', timeStyle: 'short', }).format(new Date(value)); } export default function SnipeItAdmin({ configured, baseUrl, assets, syncRuns, }: Props) { const [action, setAction] = useState<'test' | 'sync' | null>(null); const postAction = (url: string, currentAction: 'test' | 'sync') => { router.post( url, {}, { preserveScroll: true, onStart: () => setAction(currentAction), onFinish: () => setAction(null), }, ); }; return (
} />
Configuração {configured ? 'Configurada' : 'Por configurar'}

{baseUrl ?? 'Defina URL e token no ambiente.'}

{[ ['Registos locais', assets.total], ['Ativos', assets.active], ['Requisitáveis', assets.requestable], ].map(([label, value]) => ( {label}

{value}

))}
Últimas sincronizações {syncRuns.length === 0 ? (
Ainda não existem sincronizações registadas.
) : (
{syncRuns.map((run) => ( ))}
Início Estado Processados Criados Atualizados Desativados
{formatDate(run.started_at)} { statusLabel[ run.status ] } {run.records_processed} {run.records_created} {run.records_updated} {run.records_disabled}
)}
); }