// web/js/pages/manager/tabs/LostItemsTabManager.js const LostItemsTabManager = ({ state, handlers }) => { const { lostItems, items, loading } = state; const { showToast, loadLostItems, handleDeleteLostItem, handleMatchLostItem, handleViewLostItemDetail, } = handlers; return (

Kelola Laporan Barang Hilang

Lihat semua laporan barang hilang dan hubungkan dengan barang ditemukan

{/* Stats Summary */}
{lostItems.filter((i) => i.status === "active").length}
Aktif
{lostItems.filter((i) => i.status === "found").length}
Ditemukan
{lostItems.length}
Total
{loading ? (

Memuat data...

) : lostItems.length > 0 ? (
{lostItems.map((item) => (
{/* Header */}

{item.name}

👤 {item.user_name}

{item.status === "active" ? "😢 Hilang" : "✅ Ditemukan"}
{/* Details */}
🏷️ {item.category || item.category_name}
{item.color && (
🎨 {item.color}
)} {item.location && (
📍 {item.location}
)}
📅 {Helpers.formatDate(item.date_lost)}
📞 {item.user_contact || "Tidak ada kontak"}
{/* Description */}
Deskripsi:

{item.description}

{/* Matched Item (if found) */} {item.status === "found" && item.matched_item_id && (
🎉 Sudah Ditemukan

Dihubungkan dengan barang:{" "} {item.matched_item_name || "ID #" + item.matched_item_id}

{item.matched_at && (

Pada: {Helpers.formatDateTime(item.matched_at)}

)}
)} {/* AI Suggestions - Description Based */} {item.status === "active" && item.ai_suggestions && item.ai_suggestions.length > 0 && (
🤖 AI Suggestions (Description Similarity)

Berdasarkan kesamaan deskripsi barang hilang dengan ciri khusus barang ditemukan

{item.ai_suggestions .slice(0, 3) .map((suggestion, idx) => (
{suggestion.item_name} = 70 ? "bg-green-500/20 text-green-400" : suggestion.match_score >= 50 ? "bg-yellow-500/20 text-yellow-400" : "bg-orange-500/20 text-orange-400" }`} > {suggestion.match_score}% Match

📍 {suggestion.location} • 📅{" "} {Helpers.formatDateShort(suggestion.date_found)}

{suggestion.preview_text && (

"{suggestion.preview_text}"

)}
))}
)} {/* Actions */}
{item.status === "active" && ( )}
))}
) : (
😢

Belum ada laporan barang hilang

)} state.setShowLostDetailModal(false)} item={state.selectedLostDetail} />
); }; // Modal untuk menghubungkan barang hilang dengan barang ditemukan const MatchLostItemModal = ({ isOpen, onClose, lostItem, items, onSubmit, loading, }) => { const [selectedItemId, setSelectedItemId] = React.useState(""); const [searchTerm, setSearchTerm] = React.useState(""); const filteredItems = items.filter( (item) => item.status === "unclaimed" && (item.name.toLowerCase().includes(searchTerm.toLowerCase()) || item.location.toLowerCase().includes(searchTerm.toLowerCase())) ); const handleSubmit = (e) => { e.preventDefault(); if (!selectedItemId) { alert("Pilih barang yang ditemukan!"); return; } onSubmit(lostItem.id, parseInt(selectedItemId)); }; if (!isOpen) return null; return (
e.stopPropagation()} > {/* Header */}

🔗 Hubungkan Barang Hilang dengan Barang Ditemukan

{/* Body */}
{/* Lost Item Info */}
😢 Barang Hilang:
Nama:{" "} {lostItem.name}
Kategori:{" "} {lostItem.category || "-"}
Warna:{" "} {lostItem.color || "-"}
Lokasi:{" "} {lostItem.location || "-"}
Deskripsi:{" "} {lostItem.description}
{/* Search */}
setSearchTerm(e.target.value)} placeholder="Cari berdasarkan nama atau lokasi..." className="w-full px-4 py-3 bg-slate-700 border-2 border-slate-600 rounded-xl text-white placeholder-slate-400 focus:border-blue-500 focus:outline-none" />
{/* Items List */}
{filteredItems.length > 0 ? ( filteredItems.map((item) => (
setSelectedItemId(item.id.toString())} className={`p-4 rounded-lg cursor-pointer transition border-2 ${ selectedItemId === item.id.toString() ? "bg-blue-500/20 border-blue-500" : "bg-slate-800 border-slate-700 hover:border-blue-400" }`} >
{/* Radio */} setSelectedItemId(e.target.value)} className="mt-1" /> {/* Photo */} {item.photo_url && ( {item.name} (e.target.src = "https://via.placeholder.com/64?text=No+Image") } /> )} {/* Info */}

{item.name}

🏷️ {item.category || "-"}
📍 {item.location}
📅 {Helpers.formatDate(item.date_found)}
👤 Ditemukan oleh: {item.reporter_name}
{/* Show secret details preview for matching */} {item.secret_details && (
🔒 Ciri Khusus:

"{item.secret_details}"

)}
)) ) : (

Tidak ada barang ditemukan yang sesuai

)}
{/* Submit Button */}
); }; // Export window.LostItemsTabManager = LostItemsTabManager; window.MatchLostItemModal = MatchLostItemModal;