progress: breadcrumbs fixation, submission task fixation and add new UI after submitted, Certificates change layout and new page (Certificate List)

This commit is contained in:
Kemas M. Aryadary Rasyad
2026-06-16 14:50:31 +07:00
parent 8b20c11822
commit f9bb21a961
23 changed files with 549 additions and 234 deletions
@@ -1,4 +1,4 @@
import { mockProjects } from '../../../lib/mockData';
import { mockProjects } from '../../../lib/mockProjects';
import MentorProjectCard from './components/MentorProjectCard';
import { Plus } from 'lucide-react';
import { useState } from 'react';
+5 -24
View File
@@ -1,26 +1,18 @@
import { useState } from 'react';
import { useNavigate, useParams } from 'react-router-dom';
import { mockProjects } from '../../../lib/mockData';
import { ChevronLeft } from 'lucide-react';
import { mockProjects } from '../../../lib/mockProjects';
import MentorForumTab from './ProjectForumTab';
import InternsTab from './ProjectsInternTab';
import TaskTab from './TaskTab';
// ─── ProjectDetailPage ─────────────────────────────────────────────────────────
const toSlug = (name: string) => name.toLowerCase().replace(/\s+/g, '-');
export default function ProjectDetailPage() {
const { slug } = useParams<{ slug: string }>();
const navigate = useNavigate();
const [activeTab, setActiveTab] = useState<'forum' | 'participants' | 'Task'>('forum');
const handleBack = () => {
if (window.history.length > 1) {
navigate(-1);
} else {
navigate('/intern/projects');
}
};
const project = mockProjects.find((p) => p.name === slug);
const project = mockProjects.find((p) => toSlug(p.name) === slug);
if (!project) {
return (
@@ -38,18 +30,7 @@ export default function ProjectDetailPage() {
return (
<div className="bg-gray-50 min-h-screen">
<div className="px-24 py-10">
{/* Back Button */}
<button
onClick={handleBack}
className="flex items-center gap-2 mb-6 text-sm font-medium text-[#666] hover:text-[#C0392B] transition-colors duration-150 group"
>
<span className='flex flex-row gap-2'>
<ChevronLeft width={20} height={20} className="transition-transform duration-150 group-hover:-translate-x-1" />
Kembali ke Daftar Project
</span>
</button>
<div className="">
{/* Tabs */}
<div className="flex mb-4 border-b-1 border-gray-300">
@@ -1,5 +1,5 @@
import { Trash2, UsersRound } from 'lucide-react'
import type { Intern } from '../../../../lib/mockData'
import type { Intern } from '../../../../lib/mockProjects'
import { useNavigate } from 'react-router-dom'
interface ProjectCardProps {
@@ -9,6 +9,8 @@ interface ProjectCardProps {
thumbnailUrl?: string
}
const toSlug = (name: string) => name.toLowerCase().replace(/\s+/g, '-');
export default function MentorProjectCard({
id,
name,
@@ -17,7 +19,7 @@ export default function MentorProjectCard({
}: ProjectCardProps) {
const navigate = useNavigate();
const handleCardClick = () => {
navigate(`/mentor/projects/${id}`)
navigate(`/mentor/projects/${toSlug(name)}`)
};
const handleDeleteClick = (e: React.MouseEvent<HTMLButtonElement>) => {
@@ -32,14 +32,9 @@ export default function SidebarMentor({ isOpen, closeSidebar }: SidebarProps) {
return (
<aside
className={`
/* Struktur Dasar Layout */
bg-white border-r border-gray-300 flex flex-col py-5 px-3 gap-1 overflow-y-auto flex-shrink-0 transition-transform duration-300 ease-in-out
/* Kondisi Layar Desktop (>= md) */
md:sticky md:top-[73px] md:h-[calc(100vh-73px)] md:w-[250px] md:translate-x-0 md:z-8
/* Kondisi Layar Mobile (< md) dan Logika Aktif-nya */
fixed top-0 left-0 h-screen w-[270px] z-40 pt-5
md:sticky md:top-[50px] md:h-[calc(100vh-73px)] md:w-[250px] md:translate-x-0 md:z-8
fixed top-0 left-0 h-[calc(100vh-50px)] w-[270px] z-40 pt-5
${isOpen ? "translate-x-0" : "-translate-x-full"}
`}
>