fixed Internships Detail design

This commit is contained in:
Billy Marcello
2025-12-01 09:41:14 +07:00
parent 462582d8ec
commit 077483e6c9
2 changed files with 45 additions and 10 deletions
+11 -8
View File
@@ -3,6 +3,7 @@ import { useParams } from "react-router-dom";
import NavbarAdmin from "../Layout/NavbarAdmin"; import NavbarAdmin from "../Layout/NavbarAdmin";
import SidebarAdmin from "../Layout/SidebarAdmin"; import SidebarAdmin from "../Layout/SidebarAdmin";
import axios from "axios"; import axios from "axios";
import { useNavigate } from "react-router-dom";
type Applicant = { type Applicant = {
id: number; id: number;
@@ -24,6 +25,7 @@ const InternshipDetailsAdmin = () => {
const { id } = useParams(); // id lamaran magang const { id } = useParams(); // id lamaran magang
const [applicant, setApplicant] = useState<Applicant | null>(null); const [applicant, setApplicant] = useState<Applicant | null>(null);
const [error, setError] = useState<string | null>(null); const [error, setError] = useState<string | null>(null);
const navigate = useNavigate();
useEffect(() => { useEffect(() => {
if (!id) return; if (!id) return;
@@ -43,8 +45,6 @@ const InternshipDetailsAdmin = () => {
} }
) )
.then((res) => { .then((res) => {
console.log("Detail lamaran:", res.data);
const raw = const raw =
Array.isArray(res.data?.data) && res.data.data.length > 0 Array.isArray(res.data?.data) && res.data.data.length > 0
? res.data.data[0] ? res.data.data[0]
@@ -57,26 +57,21 @@ const InternshipDetailsAdmin = () => {
return; return;
} }
console.log("Raw detail:", raw); // cek struktur asli
const mapped: Applicant = { const mapped: Applicant = {
id: raw.id, id: raw.id,
// dari relasi mahasiswa
nama_depan: raw.mahasiswa?.nama_depan ?? "", nama_depan: raw.mahasiswa?.nama_depan ?? "",
nama_belakang: raw.mahasiswa?.nama_belakang ?? "", nama_belakang: raw.mahasiswa?.nama_belakang ?? "",
email: raw.mahasiswa?.email ?? raw.email ?? "", email: raw.mahasiswa?.email ?? raw.email ?? "",
kontak: raw.mahasiswa?.kontak ?? raw.kontak ?? "", kontak: raw.mahasiswa?.kontak ?? raw.kontak ?? "",
jurusan: raw.mahasiswa?.jurusan ?? raw.jurusan ?? "", jurusan: raw.mahasiswa?.jurusan ?? raw.jurusan ?? "",
// dari relasi lowongan_magang
posisi: raw.lowongan_magang?.posisi ?? raw.posisi ?? "", posisi: raw.lowongan_magang?.posisi ?? raw.posisi ?? "",
kelompok_peminatan: kelompok_peminatan:
raw.lowongan_magang?.kelompok_peminatan ?? raw.lowongan_magang?.kelompok_peminatan ??
raw.kelompok_peminatan ?? raw.kelompok_peminatan ??
"", "",
// 🔥 ini dia: ambil dari mahasiswa
motivasi: raw.mahasiswa?.motivasi ?? raw.motivasi ?? "", motivasi: raw.mahasiswa?.motivasi ?? raw.motivasi ?? "",
relevant_skills: relevant_skills:
@@ -85,7 +80,6 @@ const InternshipDetailsAdmin = () => {
raw.relevant_skill ?? raw.relevant_skill ??
"", "",
// sekalian amankan CV & portofolio kalau memang ikut di object mahasiswa
cv_path: raw.cv_path ?? raw.mahasiswa?.cv_path ?? "", cv_path: raw.cv_path ?? raw.mahasiswa?.cv_path ?? "",
portofolio_path: portofolio_path:
raw.portofolio_path ?? raw.mahasiswa?.portofolio_path ?? "", raw.portofolio_path ?? raw.mahasiswa?.portofolio_path ?? "",
@@ -124,6 +118,7 @@ const InternshipDetailsAdmin = () => {
.then(() => { .then(() => {
alert(`Status berhasil diubah menjadi ${status}`); alert(`Status berhasil diubah menjadi ${status}`);
setApplicant((prev) => (prev ? { ...prev, status } : prev)); setApplicant((prev) => (prev ? { ...prev, status } : prev));
navigate("/internships-list")
}) })
.catch((err) => { .catch((err) => {
console.error("Gagal update status", err); console.error("Gagal update status", err);
@@ -190,6 +185,14 @@ const InternshipDetailsAdmin = () => {
{/* Detail */} {/* Detail */}
<div className="flex gap-[200px] mb-12"> <div className="flex gap-[200px] mb-12">
<div className="flex flex-col gap-4"> <div className="flex flex-col gap-4">
<p>
<span className="font-semibold">Negara:</span>{" "}
{applicant.jurusan}
</p>
<p>
<span className="font-semibold">Universitas:</span>{" "}
{applicant.jurusan}
</p>
<p> <p>
<span className="font-semibold">Jurusan:</span>{" "} <span className="font-semibold">Jurusan:</span>{" "}
{applicant.jurusan} {applicant.jurusan}
+34 -2
View File
@@ -231,13 +231,45 @@ const InternshipList = () => {
</span> </span>
</td> </td>
<td className="px-6 py-3"> <td className="px-6 py-3">
{/* <button
onClick={() => handleStatusUpdate("diterima")}
className="bg-[#3BB525] hover:bg-green-600 cursor-pointer text-white p-2 rounded-xl"
>
Terima
</button>
<button <button
onClick={() => handleStatusUpdate("ditolak")}
className="bg-[#C3423F] hover:bg-red-600 cursor-pointer text-white p-2 rounded-xl"
>
Tolak
</button> */}
<button
className="bg-blue-500 hover:bg-blue-600 cursor-pointer text-white p-2 rounded-xl"
onClick={() => onClick={() =>
navigate(`/internships-details-admin/${app.id}`) navigate(`/internships-details-admin/${app.id}`)
} }
className="bg-blue-500 hover:bg-blue-600 cursor-pointer text-white px-4 py-2 rounded-lg"
> >
Lihat Detail <svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
strokeWidth={1.5}
stroke="currentColor"
className="size-6"
>
<path
strokeLinecap="round"
strokeLinejoin="round"
d="M2.036 12.322a1.012 1.012 0 0 1 0-.639C3.423 7.51 7.36 4.5 12 4.5c4.638 0 8.573 3.007 9.963 7.178.07.207.07.431 0 .639C20.577 16.49 16.64 19.5 12 19.5c-4.638 0-8.573-3.007-9.963-7.178Z"
/>
<path
strokeLinecap="round"
strokeLinejoin="round"
d="M15 12a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z"
/>
</svg>
</button> </button>
</td> </td>
</tr> </tr>