diff --git a/package-lock.json b/package-lock.json index c791dba..35b01ab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ "lucide-react": "^1.14.0", "react": "^19.2.5", "react-dom": "^19.2.5", + "react-icons": "^5.6.0", "react-router-dom": "^7.14.2" }, "devDependencies": { @@ -3521,6 +3522,15 @@ "react": "^19.2.5" } }, + "node_modules/react-icons": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.6.0.tgz", + "integrity": "sha512-RH93p5ki6LfOiIt0UtDyNg/cee+HLVR6cHHtW3wALfo+eOHTp8RnU2kRkI6E+H19zMIs03DyxUG/GfZMOGvmiA==", + "license": "MIT", + "peerDependencies": { + "react": "*" + } + }, "node_modules/react-router": { "version": "7.14.2", "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.14.2.tgz", diff --git a/package.json b/package.json index e41dd68..406f545 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "lucide-react": "^1.14.0", "react": "^19.2.5", "react-dom": "^19.2.5", + "react-icons": "^5.6.0", "react-router-dom": "^7.14.2" }, "devDependencies": { diff --git a/src/components/manajemenUsers/UserTable.tsx b/src/components/manajemenUsers/UserTable.tsx index 77c3a44..eb894c6 100644 --- a/src/components/manajemenUsers/UserTable.tsx +++ b/src/components/manajemenUsers/UserTable.tsx @@ -2,15 +2,25 @@ import { useState } from "react"; import axios from "axios"; import type { UserData } from "../../routes/ManajementUsers"; +import { FaEdit } from "react-icons/fa"; +import { MdDelete } from "react-icons/md"; + interface TableProps { dataUsers: UserData[]; onHapusUser: (user_id: number) => void; onUserDiedit: () => void; } -export default function UsersTable({ dataUsers, onHapusUser, onUserDiedit }: TableProps) { +export default function UsersTable({ + dataUsers, + onHapusUser, + onUserDiedit, +}: TableProps) { + const [isEditOpen, setIsEditOpen] = useState(false); + const [targetId, setTargetId] = useState(null); + const [editFormData, setEditFormData] = useState({ nama_lengkap: "", username: "", @@ -18,11 +28,14 @@ export default function UsersTable({ dataUsers, onHapusUser, onUserDiedit }: Tab email: "", lembaga: "", }); + const [loading, setLoading] = useState(false); - // Buka Modal Edit dan set data default-nya ke form + // BUKA MODAL EDIT const bukaModalEdit = (user: UserData) => { + setTargetId(user.user_id); + setEditFormData({ nama_lengkap: user.nama_lengkap, username: user.username, @@ -30,60 +43,133 @@ export default function UsersTable({ dataUsers, onHapusUser, onUserDiedit }: Tab email: user.email || "", lembaga: user.lembaga || "", }); + setIsEditOpen(true); }; - const handleUpdate = async (e: React.FormEvent) => { + // UPDATE USER + const handleUpdate = async ( + e: React.FormEvent + ) => { + e.preventDefault(); + if (!targetId) return; + setLoading(true); try { - const respon = await axios.put(`http://localhost:5000/api/users/${targetId}`, editFormData); + + const respon = await axios.put( + `http://localhost:5000/api/users/${targetId}`, + editFormData + ); + if (respon.data.success) { + alert(respon.data.message); + setIsEditOpen(false); - onUserDiedit(); // Memicu refresh state di rute induk + + onUserDiedit(); } + } catch (error: any) { + console.error(error); - alert(error.response?.data?.message || "Gagal memperbarui data user!"); + + alert( + error.response?.data?.message || + "Gagal memperbarui data user!" + ); + } finally { + setLoading(false); } }; return (
+
+ + + - - - - - - - + + + + + + + + + + + + + + + + + + {dataUsers.length === 0 ? ( + - + + ) : ( + dataUsers.map((user) => ( - - - + + + + + + + + - - + + + + + + + )) )} + +
ID PenggunaNama LengkapUsernameHak Akses / RoleEmailLembaga / InstansiAksi Operasional + ID Pengguna + + Nama Lengkap + + Username + + Hak Akses / Role + + Email + + Lembaga / Instansi + + Aksi Operasional +
+ + Belum ada data pengguna terdaftar atau kata kunci salah, Bang! 📭
#{user.user_id}{user.nama_lengkap}
+ #{user.user_id} + + {user.nama_lengkap} + {user.username} + {user.role} + {user.email || "-"}{user.lembaga || "-"} + {user.email || "-"} + + {user.lembaga || "-"} + +
+ + {/* BUTTON EDIT */} + + {/* BUTTON HAPUS */} +
+
+
- {/* MODAL POP UP FORM EDIT USER */} + {/* MODAL EDIT */} {isEditOpen && ( +
+
+

✏️ Sunting Data Pengguna

-
+ +
- + + + setEditFormData({ ...editFormData, nama_lengkap: e.target.value })} + onChange={(e) => + setEditFormData({ + ...editFormData, + nama_lengkap: e.target.value, + }) + } className="w-full px-4 py-2.5 rounded-xl border border-gray-300 focus:ring-2 focus:ring-amber-500 focus:border-amber-500 outline-none transition" /> +
- + + + setEditFormData({ ...editFormData, username: e.target.value })} + onChange={(e) => + setEditFormData({ + ...editFormData, + username: e.target.value, + }) + } className="w-full px-4 py-2.5 rounded-xl border border-gray-300 focus:ring-2 focus:ring-amber-500 focus:border-amber-500 outline-none transition bg-gray-50" /> +
- + + + +
- + + + setEditFormData({ ...editFormData, email: e.target.value })} + onChange={(e) => + setEditFormData({ + ...editFormData, + email: e.target.value, + }) + } className="w-full px-4 py-2.5 rounded-xl border border-gray-300 focus:ring-2 focus:ring-amber-500 focus:border-amber-500 outline-none transition" /> +
- + + + setEditFormData({ ...editFormData, lembaga: e.target.value })} + onChange={(e) => + setEditFormData({ + ...editFormData, + lembaga: e.target.value, + }) + } className="w-full px-4 py-2.5 rounded-xl border border-gray-300 focus:ring-2 focus:ring-amber-500 focus:border-amber-500 outline-none transition" /> +
+ + +
+
+
+
+ )} +
); } \ No newline at end of file