78 lines
3.1 KiB
TypeScript
78 lines
3.1 KiB
TypeScript
'use client';
|
|
|
|
import { X, History } from 'lucide-react';
|
|
import { cn } from '@/lib/utils'; // Assuming this exists or I'll use the local cn
|
|
|
|
interface LogsOverlayProps {
|
|
show: boolean;
|
|
onClose: () => void;
|
|
logs: any[];
|
|
inventory: any[];
|
|
}
|
|
|
|
export default function LogsOverlay({ show, onClose, logs, inventory }: LogsOverlayProps) {
|
|
if (!show) return null;
|
|
|
|
return (
|
|
<div className="fixed inset-0 z-50 flex flex-col bg-background p-6 animate-in slide-in-from-bottom-20 duration-500">
|
|
<div className="flex justify-between items-center mb-8">
|
|
<div>
|
|
<h2 className="text-2xl font-normal tracking-tight">Audit History</h2>
|
|
<p className="text-xs text-secondary">Live transaction log from cloud</p>
|
|
</div>
|
|
<button
|
|
onClick={onClose}
|
|
className="p-3 bg-surface text-secondary"
|
|
>
|
|
<X size={24} />
|
|
</button>
|
|
</div>
|
|
|
|
<div className="flex-1 overflow-y-auto space-y-4 pr-2 custom-scrollbar">
|
|
{logs.length === 0 ? (
|
|
<div className="h-full flex flex-col items-center justify-center text-secondary gap-4">
|
|
<History size={48} className="opacity-20" />
|
|
<p>No transactions found</p>
|
|
</div>
|
|
) : (
|
|
logs.map((log) => (
|
|
<div key={log.id} className="bg-surface/70 border border-outline/30 p-4 flex items-center justify-between gap-4">
|
|
<div className="flex-1 min-w-0">
|
|
<div className="flex items-center gap-2 mb-1">
|
|
<p className={`text-xs font-normal ${ log.action.includes('CHECK_IN') ? "text-success" : (log.action.includes('TRASH') ? "text-error" : "text-warning") }`}>
|
|
{log.action}
|
|
</p>
|
|
<span className="text-xs font-normal text-secondary">by</span>
|
|
<span className="text-xs font-normal text-secondary">{log.username || 'System'}</span>
|
|
</div>
|
|
<div className="flex items-center gap-2">
|
|
<span className="text-sm font-normal text-secondary">
|
|
{inventory.find(i => i.id === log.target_item_id)?.name || `Item #${log.target_item_id}`}
|
|
</span>
|
|
</div>
|
|
{(log.details || log.timestamp) && (
|
|
<div className="flex items-center gap-3 mt-2">
|
|
<p className="text-xs text-secondary font-mono">
|
|
{new Date(log.timestamp).toLocaleString()}
|
|
</p>
|
|
{log.details && (
|
|
<span className="text-xs bg-surface-container text-secondary px-2 py-0.5 border border-outline-variant font-mono">
|
|
{log.details}
|
|
</span>
|
|
)}
|
|
</div>
|
|
)}
|
|
</div>
|
|
<div className="text-right">
|
|
<p className={`text-lg font-normal ${ log.quantity_change > 0 ? "text-success" : "text-rose-400" }`}>
|
|
{log.quantity_change > 0 ? '+' : ''}{log.quantity_change}
|
|
</p>
|
|
</div>
|
|
</div>
|
|
))
|
|
)}
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|