// app/(app)/devices/page.tsx 'use client'; import Button from '@/components/ui/Button'; import Table, { TableColumn } from '@/components/ui/Table'; import { Dropdown } from '@/components/ui/Dropdown'; import { BookOpenIcon, PencilIcon, TrashIcon, } from '@heroicons/react/24/outline'; type DeviceRow = { id: string; // Fachliche Felder (entsprechend deinem Prisma-Model) name: string; manufacturer: string; model: string; inventoryNumber: string; serialNumber?: string | null; productNumber?: string | null; comment?: string | null; // optionale Netzwerk-/Zugangs-Felder ipv4Address?: string | null; ipv6Address?: string | null; macAddress?: string | null; username?: string | null; // Beziehungen (als einfache Strings für die Tabelle) group?: string | null; location?: string | null; // Audit updatedAt: string; }; // TODO: später per Prisma laden const mockDevices: DeviceRow[] = [ { id: '1', name: 'Dienstrechner Sachbearbeitung 1', manufacturer: 'Dell', model: 'OptiPlex 7010', inventoryNumber: 'INV-00123', serialNumber: 'SN-ABC-123', productNumber: 'PN-4711', group: 'Dienstrechner', location: 'Raum 1.12', comment: 'Steht am Fensterplatz', ipv4Address: '10.0.0.12', ipv6Address: null, macAddress: '00-11-22-33-44-55', username: 'sachb1', updatedAt: '2025-01-10T09:15:00Z', }, { id: '2', name: 'Monitor Lager 27"', manufacturer: 'Samsung', model: 'S27F350', inventoryNumber: 'INV-00124', serialNumber: 'SN-DEF-456', productNumber: 'PN-0815', group: 'Monitore', location: 'Lager Keller', comment: null, ipv4Address: null, ipv6Address: null, macAddress: null, username: null, updatedAt: '2025-01-08T14:30:00Z', }, ]; function formatDate(iso: string) { return new Intl.DateTimeFormat('de-DE', { dateStyle: 'short', timeStyle: 'short', }).format(new Date(iso)); } const columns: TableColumn[] = [ { key: 'name', header: 'Bezeichnung', sortable: true, canHide: true, headerClassName: 'min-w-48', cellClassName: 'font-medium text-gray-900 dark:text-white', }, { key: 'inventoryNumber', header: 'Inventar-Nr.', sortable: true, canHide: false, headerClassName: 'min-w-32', }, { key: 'manufacturer', header: 'Hersteller', sortable: true, canHide: false, }, { key: 'model', header: 'Modell', sortable: true, canHide: false, }, { key: 'serialNumber', header: 'Seriennummer', sortable: true, canHide: true, }, { key: 'productNumber', header: 'Produktnummer', sortable: true, canHide: true, }, { key: 'group', header: 'Gruppe', sortable: true, canHide: true, }, { key: 'location', header: 'Standort / Raum', sortable: true, canHide: false, }, { key: 'comment', header: 'Kommentar', sortable: false, canHide: true, cellClassName: 'whitespace-normal max-w-xs', }, { key: 'updatedAt', header: 'Geändert am', sortable: true, canHide: true, render: (row) => formatDate(row.updatedAt), }, ]; export default function DevicesPage() { const devices = mockDevices; return ( <> {/* Header über der Tabelle */}

Geräte

Übersicht aller erfassten Geräte im Inventar.

{/* Tabelle */}
data={devices} columns={columns} getRowId={(row) => row.id} selectable actionsHeader="" renderActions={(row) => (
{/* Desktop: drei Icon-Buttons nebeneinander */}
{/* Mobile / kleine Screens: kompaktes Dropdown mit Ellipsis-Trigger */}
, onClick: () => console.log('Details', row.id), }, { label: 'Bearbeiten', icon: , onClick: () => console.log('Bearbeiten', row.id), }, { label: 'Löschen', icon: , tone: 'danger', onClick: () => console.log('Löschen', row.id), }, ], }, ]} />
)} />
); }