"use client"; import { useState, useEffect, useCallback } from "react"; import { Package, Plus, Search, UserCheck, ArrowLeftCircle, Loader2, X, } from "lucide-react"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Select } from "@/components/ui/select"; import { fetchAssets, createAsset, assignAsset, returnAsset, getAssetCounts, fetchActiveEmployees, } from "@/lib/supabase/asset-actions"; // ── Constants ────────────────────────────────────────────── const CATEGORIES = [ { value: "laptop", label: "Laptop" }, { value: "phone", label: "Phone" }, { value: "monitor", label: "Monitor" }, { value: "access_card", label: "Access Card" }, { value: "vehicle", label: "Vehicle" }, { value: "equipment", label: "Equipment" }, { value: "other", label: "Other" }, ]; const STATUSES = [ { value: "available", label: "Available" }, { value: "assigned", label: "Assigned" }, { value: "maintenance", label: "Maintenance" }, { value: "retired", label: "Retired" }, ]; const STATUS_BADGE_COLORS: Record = { available: "bg-teal-100 text-teal-700", assigned: "bg-blue-100 text-blue-700", maintenance: "bg-amber-100 text-amber-700", retired: "bg-gray-100 text-gray-600", }; const CATEGORY_BADGE_COLORS: Record = { laptop: "bg-indigo-50 text-indigo-700", phone: "bg-purple-50 text-purple-700", monitor: "bg-cyan-50 text-cyan-700", access_card: "bg-orange-50 text-orange-700", vehicle: "bg-emerald-50 text-emerald-700", equipment: "bg-slate-100 text-slate-700", other: "bg-gray-50 text-gray-600", }; // ── Add Asset Modal ──────────────────────────────────────── function AddAssetModal({ onClose, onSuccess, }: { onClose: () => void; onSuccess: () => void; }) { const [name, setName] = useState(""); const [category, setCategory] = useState("laptop"); const [serialNumber, setSerialNumber] = useState(""); const [purchaseDate, setPurchaseDate] = useState(""); const [purchaseValue, setPurchaseValue] = useState(""); const [notes, setNotes] = useState(""); const [submitting, setSubmitting] = useState(false); const [error, setError] = useState(null); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(null); setSubmitting(true); try { const result = await createAsset({ name, category, serial_number: serialNumber || undefined, purchase_date: purchaseDate || undefined, purchase_value: purchaseValue ? parseFloat(purchaseValue) : undefined, notes: notes || undefined, }); if (result.success) { onSuccess(); } else { setError(result.error || "Failed to create asset"); } } catch (err: any) { setError(err.message || "Failed to create asset"); } finally { setSubmitting(false); } }; return (
e.stopPropagation()} >

Add Asset

{error && (
{error}
)}
setName(e.target.value)} placeholder="e.g. MacBook Pro 14"" required className="mt-1" />
setSerialNumber(e.target.value)} placeholder="Optional" className="mt-1" />
setPurchaseValue(e.target.value)} placeholder="0.00" className="mt-1" />
setPurchaseDate(e.target.value)} className="mt-1" />