161 lines
6.0 KiB
JavaScript
161 lines
6.0 KiB
JavaScript
const CreateLostItemModal = ({ state, handlers }) => {
|
||
const {
|
||
showCreateLostItemModal,
|
||
setShowCreateLostItemModal,
|
||
categories,
|
||
users,
|
||
loading,
|
||
} = state;
|
||
|
||
const { handleCreateLostItem } = handlers;
|
||
|
||
if (!showCreateLostItemModal) return null;
|
||
|
||
return (
|
||
<Modal
|
||
isOpen={showCreateLostItemModal}
|
||
onClose={() => setShowCreateLostItemModal(false)}
|
||
title="➕ Tambah Laporan Barang Hilang"
|
||
size="large"
|
||
>
|
||
<form onSubmit={handleCreateLostItem} className="space-y-6">
|
||
<div className="grid grid-cols-2 gap-4">
|
||
<div>
|
||
<label className="block text-slate-300 mb-2 font-semibold">
|
||
User ID (Pelapor) <span className="text-red-500">*</span>
|
||
</label>
|
||
<select
|
||
name="user_id"
|
||
required
|
||
className="w-full px-4 py-2 bg-slate-700 border-2 border-slate-600 rounded-xl text-white focus:border-blue-500 focus:outline-none"
|
||
>
|
||
<option value="">Pilih User</option>
|
||
{users &&
|
||
users.map((user) => (
|
||
<option key={user.id} value={user.id}>
|
||
{user.name} (#{user.id})
|
||
</option>
|
||
))}
|
||
</select>
|
||
<p className="text-xs text-slate-400 mt-1">
|
||
Pilih user yang melaporkan kehilangan
|
||
</p>
|
||
</div>
|
||
|
||
<div>
|
||
<label className="block text-slate-300 mb-2 font-semibold">
|
||
Nama Barang <span className="text-red-500">*</span>
|
||
</label>
|
||
<input
|
||
type="text"
|
||
name="name"
|
||
required
|
||
className="w-full px-4 py-2 bg-slate-700 border-2 border-slate-600 rounded-xl text-white placeholder-slate-400 focus:border-blue-500 focus:outline-none"
|
||
placeholder="Contoh: HP Samsung Galaxy"
|
||
/>
|
||
</div>
|
||
|
||
<div>
|
||
<label className="block text-slate-300 mb-2 font-semibold">
|
||
Kategori <span className="text-red-500">*</span>
|
||
</label>
|
||
<select
|
||
name="category_id"
|
||
required
|
||
className="w-full px-4 py-2 bg-slate-700 border-2 border-slate-600 rounded-xl text-white focus:border-blue-500 focus:outline-none"
|
||
>
|
||
<option value="">Pilih Kategori</option>
|
||
{categories &&
|
||
categories.map((cat) => (
|
||
<option key={cat.id} value={cat.id}>
|
||
{cat.name}
|
||
</option>
|
||
))}
|
||
</select>
|
||
</div>
|
||
|
||
<div>
|
||
<label className="block text-slate-300 mb-2 font-semibold">
|
||
Warna
|
||
</label>
|
||
<input
|
||
type="text"
|
||
name="color"
|
||
className="w-full px-4 py-2 bg-slate-700 border-2 border-slate-600 rounded-xl text-white placeholder-slate-400 focus:border-blue-500 focus:outline-none"
|
||
placeholder="Contoh: Hitam, Biru"
|
||
/>
|
||
</div>
|
||
|
||
<div>
|
||
<label className="block text-slate-300 mb-2 font-semibold">
|
||
Tanggal Hilang <span className="text-red-500">*</span>
|
||
</label>
|
||
<input
|
||
type="date"
|
||
name="date_lost"
|
||
required
|
||
max={new Date().toISOString().split("T")[0]}
|
||
className="w-full px-4 py-2 bg-slate-700 border-2 border-slate-600 rounded-xl text-white focus:border-blue-500 focus:outline-none"
|
||
/>
|
||
</div>
|
||
|
||
<div>
|
||
<label className="block text-slate-300 mb-2 font-semibold">
|
||
Lokasi Hilang
|
||
</label>
|
||
<input
|
||
type="text"
|
||
name="location"
|
||
className="w-full px-4 py-2 bg-slate-700 border-2 border-slate-600 rounded-xl text-white placeholder-slate-400 focus:border-blue-500 focus:outline-none"
|
||
placeholder="Contoh: Perpustakaan Lantai 2"
|
||
/>
|
||
</div>
|
||
|
||
<div className="col-span-2">
|
||
<label className="block text-slate-300 mb-2 font-semibold">
|
||
Deskripsi <span className="text-red-500">*</span>
|
||
</label>
|
||
<textarea
|
||
name="description"
|
||
required
|
||
rows="4"
|
||
className="w-full px-4 py-2 bg-slate-700 border-2 border-slate-600 rounded-xl text-white placeholder-slate-400 focus:border-blue-500 focus:outline-none"
|
||
placeholder="Jelaskan ciri-ciri barang yang hilang secara detail..."
|
||
/>
|
||
<p className="text-xs text-slate-400 mt-1">
|
||
Deskripsi ini akan digunakan untuk auto-matching dengan barang
|
||
yang ditemukan
|
||
</p>
|
||
</div>
|
||
</div>
|
||
|
||
<div className="bg-blue-500/10 border border-blue-500/30 rounded-lg p-4">
|
||
<p className="text-sm text-blue-300">
|
||
ℹ️ <strong>Info:</strong> Setelah laporan dibuat, sistem akan
|
||
otomatis mencari kecocokan dengan barang yang telah ditemukan. User
|
||
akan mendapat notifikasi jika ada barang yang cocok.
|
||
</p>
|
||
</div>
|
||
|
||
<div className="flex gap-3 justify-end pt-4 border-t border-slate-700">
|
||
<button
|
||
type="button"
|
||
onClick={() => setShowCreateLostItemModal(false)}
|
||
className="px-6 py-2 bg-slate-700 text-white rounded-lg hover:bg-slate-600 transition"
|
||
disabled={loading}
|
||
>
|
||
Batal
|
||
</button>
|
||
<button
|
||
type="submit"
|
||
className="px-6 py-2 bg-gradient-to-r from-green-600 to-green-700 text-white rounded-lg hover:from-green-700 hover:to-green-800 transition shadow-lg disabled:opacity-50"
|
||
disabled={loading}
|
||
>
|
||
{loading ? "Memproses..." : "➕ Tambah Laporan"}
|
||
</button>
|
||
</div>
|
||
</form>
|
||
</Modal>
|
||
);
|
||
};
|