// assets/js/pages/admin/tabs/ItemsTab.js
const ItemsTab = ({ state, handlers }) => {
const {
showExpired,
setShowExpired,
itemSearchTerm,
setItemSearchTerm,
itemStatusFilter,
setItemStatusFilter,
itemCategoryFilter,
setItemCategoryFilter,
filteredItems,
items,
showCreateItemModal,
setShowCreateItemModal,
photoPreview,
itemPage,
itemTotalPages,
itemTotalRecords,
loading,
} = state;
const {
handleViewItemDetail,
handleCreateItem,
handleEditItemClick,
handleDeleteItem,
handlePhotoChange,
loadItems,
} = handlers;
// ✅ Gunakan useEffect untuk reload data saat Filter / Page berubah
// Kita menggunakan debounce (tunda) untuk search agar tidak spam API
React.useEffect(() => {
const timer = setTimeout(() => {
// Reset ke halaman 1 jika filter berubah
// Jika hanya halaman yang berubah, load halaman tersebut
loadItems(itemPage);
}, 500);
return () => clearTimeout(timer);
}, [
itemPage,
itemSearchTerm,
itemStatusFilter,
itemCategoryFilter,
showExpired,
]);
// Reset page ke 1 jika filter berubah (kecuali itemPage itu sendiri)
React.useEffect(() => {
state.setItemPage(1);
}, [itemSearchTerm, itemStatusFilter, itemCategoryFilter, showExpired]);
return (
{loading ? (
) : (
<>
{/* ✅ PERUBAHAN UTAMA:
Kita me-map 'items' secara langsung.
Tidak perlu filteredItems.filter() lagi karena backend sudah mengirimkan data
yang sudah terfilter (hanya 10 biji) sesuai halaman aktif.
*/}
{items.map((item) => (
{item.status === "expired" && (
⚠️ EXPIRED
)}
handleViewItemDetail(item)}
onError={(e) =>
(e.target.src =
"https://via.placeholder.com/280x200?text=No+Image")
}
/>
{item.name}
📍 {item.location}
📅 {Helpers.formatDate(item.date_found)}
👤 {item.reporter_name}
{item.status}
handleViewItemDetail(item)}
className="flex-1 px-3 py-2 bg-gradient-to-r from-blue-600 to-blue-700 text-white text-sm rounded-lg hover:from-blue-700 hover:to-blue-800 transition shadow-lg"
>
📋 Detail
{/* Tombol Edit/Hapus hanya muncul jika bukan case_closed */}
{item.status !== "case_closed" && (
<>
handleEditItemClick(item)}
className="flex-1 px-3 py-2 bg-gradient-to-r from-yellow-600 to-yellow-700 text-white text-sm rounded-lg hover:from-yellow-700 hover:to-yellow-800 transition shadow-lg"
>
✏️ Edit
{
if (
confirm(
`⚠️ Yakin ingin menghapus "${item.name}"?`
)
) {
handleDeleteItem(item.id);
}
}}
className="px-3 py-2 bg-gradient-to-r from-red-600 to-red-700 text-white text-sm rounded-lg hover:from-red-700 hover:to-red-800 transition shadow-lg"
>
🗑️
>
)}
))}
{items.length === 0 && (
{showExpired ? "⚠️" : "📦"}
{showExpired
? "Belum ada barang expired"
: "Tidak ada barang ditemukan"}
)}
{/* ✅ KOMPONEN PAGINATION */}
{items.length > 0 && (
state.setItemPage(page)}
itemsPerPage={10}
/>
)}
>
)}
);
};