import { Dialog, DialogContent, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; import { Badge } from '@/components/ui/badge'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table'; import type { FormHistory } from './columns'; type AttributeChangesDialogProps = { open: boolean; onOpenChange: (open: boolean) => void; item: FormHistory | null; }; const eventBadgeVariant: Record = { created: 'default', updated: 'secondary', deleted: 'destructive', }; const eventLabel: Record = { created: 'Ditambahkan', updated: 'Diperbarui', deleted: 'Dihapus', }; function renderValue(key: string, value: unknown): React.ReactNode { if (value === null || value === undefined) { return -; } if (typeof value === 'boolean') { return value ? 'Ya' : 'Tidak'; } if (Array.isArray(value)) { if (value.length === 0) { return -; } if (typeof value[0] === 'object' && value[0] !== null) { return ; } return value.join(', '); } if (typeof value === 'object') { return JSON.stringify(value); } return String(value); } function RenderObjectArray({ items }: { items: Record[] }) { if (!items.length) { return -; } const keys = Object.keys(items[0]); return (
{keys.map((key) => ( {key} ))} {items.map((item, index) => ( {keys.map((key) => ( {renderValue(key, item[key])} ))} ))}
); } export function AttributeChangesDialog({ open, onOpenChange, item }: AttributeChangesDialogProps) { if (!item) { return null; } const changes = item.attribute_changes; const hasNew = changes?.new && Object.keys(changes.new).length > 0; const hasOld = changes?.old && Object.keys(changes.old).length > 0; return ( {item.description} {eventLabel[item.event] ?? item.event}
Oleh: {item.causer?.full_name ?? item.causer?.username ?? '-'}
{item.formatted_created_at}
{hasNew && (

Nilai Baru

{Object.entries(changes!.new!).map(([key, value]) => (
{key}
{renderValue(key, value)}
))}
)} {hasOld && (

Nilai Lama

{Object.entries(changes!.old!).map(([key, value]) => (
{key}
{renderValue(key, value)}
))}
)} {!hasNew && !hasOld && (

Tidak ada perubahan data.

)}
); }