From 28bd1d3d87f6d88bf6ff8878ffb12c5af140ab2f Mon Sep 17 00:00:00 2001 From: "Kemas M. Aryadary Rasyad" <112590882+aryadary0706@users.noreply.github.com> Date: Mon, 29 Jun 2026 20:01:37 +0700 Subject: [PATCH] test pertama: - implementasi seluruh backend pada akun intern dan mentor pada bagian lms - kondisi semua hooks dan types yang dibutuhkan - Pengujian task, project, dan submission pada mentor dan intern next progress: - Implementasi lib eksternal untuk unduh kedalam devices dan kirim sertifikat ke internet (linkedin) - implementasi proses sertifikat pada mentor untuk melakukan generate sertifikat dengan template dan intern pada projek --- .../components/CertificateNotAvailable.tsx | 16 +++++++--------- .../intern/components/HomeProjectList.tsx | 2 +- .../intern/components/ProjectTaskCard.tsx | 19 ++++++++++++++----- .../mentor/components/AddInternsDialog.tsx | 9 +++++++-- .../mentor/components/MentorTaskCard.tsx | 2 +- src/hooks/useProjects.ts | 1 + src/hooks/useUser.ts | 3 +-- src/types/project.types.ts | 2 +- 8 files changed, 33 insertions(+), 21 deletions(-) diff --git a/src/Pages/internify/intern/components/CertificateNotAvailable.tsx b/src/Pages/internify/intern/components/CertificateNotAvailable.tsx index 7d3a117..97eeab3 100644 --- a/src/Pages/internify/intern/components/CertificateNotAvailable.tsx +++ b/src/Pages/internify/intern/components/CertificateNotAvailable.tsx @@ -59,6 +59,13 @@ export default function CertificateNotAvailable({

Semua tugas telah diselesaikan! Silahkan tunggu untuk mendapatkan sertifikat

+ ) : ( <> @@ -84,15 +91,6 @@ export default function CertificateNotAvailable({ /> - - - {error &&

{error}

} )} diff --git a/src/Pages/internify/intern/components/HomeProjectList.tsx b/src/Pages/internify/intern/components/HomeProjectList.tsx index ebbdfd2..fb273dc 100644 --- a/src/Pages/internify/intern/components/HomeProjectList.tsx +++ b/src/Pages/internify/intern/components/HomeProjectList.tsx @@ -24,7 +24,7 @@ const HomeProjectList = () => { {projects.map((project) => (
navigate(`/intern/projects/${toSlug(project.project_name)}`)} + onClick={() => navigate(`/intern/projects/${toSlug(project.slug)}`)} className="flex items-center gap-4 border border-card-outline rounded-lg px-4 py-3 hover:bg-gray-50 cursor-pointer transition-colors duration-150" >
diff --git a/src/Pages/internify/intern/components/ProjectTaskCard.tsx b/src/Pages/internify/intern/components/ProjectTaskCard.tsx index 26a3479..43f034d 100644 --- a/src/Pages/internify/intern/components/ProjectTaskCard.tsx +++ b/src/Pages/internify/intern/components/ProjectTaskCard.tsx @@ -7,6 +7,16 @@ const formatDate = (dateStr: string) => const formatTime = (dateStr: string) => new Date(dateStr).toLocaleTimeString('id-ID', { hour: '2-digit', minute: '2-digit' }); +const statusStyles: Record = { + not_submitted: "bg-gray-50 text-gray-700 border-gray-200", + submitted: "bg-green-50 text-green-700 border-green-200", +}; + +const statusLabels: Record = { + not_submitted: "Pending", + submitted: "Submitted", +}; + export default function TaskCard({ task }: { task: InternTaskItem }) { const navigate = useNavigate(); return ( @@ -29,13 +39,12 @@ export default function TaskCard({ task }: { task: InternTaskItem }) {
-
+
-
+
- {task.submission_status} + className={`font-semibold text-xs px-3.5 py-[5px] rounded-md whitespace-nowrap border ${statusStyles[task.submission_status]}`}> + {statusLabels[task.submission_status]}
diff --git a/src/Pages/internify/mentor/components/AddInternsDialog.tsx b/src/Pages/internify/mentor/components/AddInternsDialog.tsx index 2a13239..f4850e3 100644 --- a/src/Pages/internify/mentor/components/AddInternsDialog.tsx +++ b/src/Pages/internify/mentor/components/AddInternsDialog.tsx @@ -19,7 +19,7 @@ export default function ManageInternsModal({ isOpen, onClose, projectId, initial const [invitedList, setInvitedList] = useState(initialMembers); const { mahasiswa, loading: loadingMahasiswa } = useMahasiswa(); - const { assign, loading: assigning } = useAssignMember(); + const { assign, loading: assigning, error } = useAssignMember(); // Sync saat modal dibuka useEffect(() => { @@ -84,8 +84,13 @@ export default function ManageInternsModal({ isOpen, onClose, projectId, initial />
+ {error && +
+ {error}: Sudah berada di project lain +
+ } -
+
{/* Sudah jadi member */} {invitedList.map((member) => (
diff --git a/src/Pages/internify/mentor/components/MentorTaskCard.tsx b/src/Pages/internify/mentor/components/MentorTaskCard.tsx index 4e0cfb6..cda6dba 100644 --- a/src/Pages/internify/mentor/components/MentorTaskCard.tsx +++ b/src/Pages/internify/mentor/components/MentorTaskCard.tsx @@ -17,7 +17,7 @@ export default function MentorTaskCard({ task }: {task: ProjectTask}) { return (
diff --git a/src/hooks/useProjects.ts b/src/hooks/useProjects.ts index f313574..8319780 100644 --- a/src/hooks/useProjects.ts +++ b/src/hooks/useProjects.ts @@ -253,6 +253,7 @@ export const useAssignMember = () => { return { assign, loading, error }; }; +// Hapus/Keluarkan Member dari Projek export const useRemoveMember = () => { const [loading, setLoading] = useState(false); const [error, setError] = useState(null); diff --git a/src/hooks/useUser.ts b/src/hooks/useUser.ts index f87679d..63d2317 100644 --- a/src/hooks/useUser.ts +++ b/src/hooks/useUser.ts @@ -101,8 +101,7 @@ export const useUpdateProfile = () => { return { save, loading, error, successMsg, setSuccessMsg, setError }; }; - - +// Ambil Seluruh Mahasiswa export const useMahasiswa = () => { const [mahasiswa, setMahasiswa] = useState([]); const [loading, setLoading] = useState(true); diff --git a/src/types/project.types.ts b/src/types/project.types.ts index 5825a66..c78b959 100644 --- a/src/types/project.types.ts +++ b/src/types/project.types.ts @@ -48,7 +48,7 @@ export interface InternTaskItem { description: string; deadline_at: string; submission_type: "file_upload" | "url_link"; - submission_status: "pending" | "submitted" | "done" | "overdue"; + submission_status: "not_submitted" | "submitted"; submission_details: { id: number; file_path: string | null;