Anons79 Mini Shell

Directory : /home/aplikasiposinfo/public_html/talent.gosepakat.id/resources/js/Pages/
Upload File :
Current File : /home/aplikasiposinfo/public_html/talent.gosepakat.id/resources/js/Pages/Dashboard.tsx

import AuthenticatedLayout from '@/Layouts/AuthenticatedLayout';
import { Head, Link, useForm, usePage } from '@inertiajs/react';
import { PageProps } from '@/types';
import { Card, CardHeader, CardTitle, CardContent } from "@/Components/ui/card";
import { Button } from "@/Components/ui/button";
import { Progress } from "@/Components/ui/progress";
import {
    Table,
    TableBody,
    TableCell,
    TableHead,
    TableHeader,
    TableRow,
} from "@/Components/ui/table";
import { Badge } from "@/Components/ui/badge"
import { FormEventHandler, useEffect, useState } from 'react';
import { AlertCircle, BookOpenCheck, GraduationCap, PlusCircle, Rocket, Search, Users } from 'lucide-react';
import { Alert, AlertDescription, AlertTitle } from "@/Components/ui/alert"
import {
    Dialog,
    DialogContent,
    DialogHeader,
    DialogTitle,
    DialogDescription,
} from '@/Components/ui/dialog';
import InputError from '@/Components/InputError';
import { Label } from '@/Components/ui/label';
import { Input } from '@/Components/ui/input';
import { Transition } from '@headlessui/react';
import PrimaryButton from '@/Components/PrimaryButton';


function MateriTugas({ materi }: { materi: any }) {

    return (<><TableRow className="even:bg-gray-50">
        <TableCell className="font-medium">{materi.code}</TableCell>
        <TableCell>{materi.name}</TableCell>
        <TableCell>{materi.due_date}</TableCell>
        <TableCell className="text-right">
            <Badge
                variant="secondary"
                className={materi.tugas_pesertas.length > 0
                    ? "bg-emerald-500 hover:bg-emerald-500 text-white"
                    : "bg-red-400 hover:bg-red-400 text-white"}
            >
                Belum
            </Badge>
        </TableCell>
    </TableRow>{materi.materi_tugas.map((item: any) => (
        <TableRow key={`tugas-${item.id}`} className="even:bg-gray-50">
            <TableCell className="font-medium">{item.code}</TableCell>
            <TableCell>{item.name}</TableCell>
            <TableCell>{item.tanggal}</TableCell>
            <TableCell className="text-right">
                <Badge
                    variant="secondary"
                    className={
                        item.status === "Terkirim"
                            ? "bg-emerald-500 hover:bg-emerald-500 text-white"
                            : "bg-red-400 hover:bg-red-400 text-white"
                    }
                >
                    Belum
                </Badge>
            </TableCell>
        </TableRow>
    ))}</>)
}



export default function Dashboard({ pelatihan, aku, tugas }: { pelatihan: any, aku: any, tugas: any }) {

    const user = usePage<PageProps>().props.auth.user;
    const [selectedTugas, setSelectedTugas] = useState<any>(null);
    const { data, setData, post, errors, processing, recentlySuccessful } = useForm({
        file: null,
        link: '',
        materi_tugas_id: 0
    });

    const submit: FormEventHandler = (e) => {
        e.preventDefault();

        post(route('kirim-tugas'), {
            onFinish() {
                setSelectedTugas(null);
            }
        });
    };

    const handleFileChange = (
        e: React.ChangeEvent<HTMLInputElement>,
    ) => {
        const file = e.target.files?.[0]
        if (file) {
            const reader = new FileReader()

            reader.readAsDataURL(file)
            setData((prev) => ({ ...prev, [e.target.name]: file }))
        }
    }
    return (
        <AuthenticatedLayout
            user={user}
            header={<h2 className="font-semibold text-xl text-gray-800 leading-tight">Dashboard</h2>}
        >
            <Head title="Dashboard" />

            {(aku != null && aku.status == "pending") && <Alert>
                <AlertCircle className="h-4 w-4" />
                <AlertTitle>Status Pendaftaran</AlertTitle>
                <AlertDescription>
                    Terima kasih sudah mendaftar pelatihan. Saat ini status pendfataraanmu sedang diproses oleh admin.
                </AlertDescription>
            </Alert>}

            {pelatihan != null && <div className="py-2">

                <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 lg:gap-6 mb-8">

                    <Card className="bg-[#5BA4CF] text-white">
                        <CardHeader>
                            <CardTitle className="text-sm font-normal">Pelatihan yang diikuti</CardTitle>
                            <p className="text-lg font-semibold">{pelatihan.title}</p>
                        </CardHeader>
                    </Card>

                    {/* Certification Card */}
                    {/* <Card className="bg-[#E6C88A]">
                        <CardHeader>
                            <CardTitle className="text-sm font-normal">Sertifikasi BNSP</CardTitle>
                        </CardHeader>
                        <CardContent className="flex items-center justify-between">
                            <span className="text-sm">Tidak Ada</span>
                            <Button variant="outline" className="bg-white hover:bg-gray-100">
                                Ajukan
                            </Button>
                        </CardContent>
                    </Card> */}

                    {/* Progress Card */}
                    <Card className="bg-[#4CAF50] text-white">
                        <CardHeader>
                            <CardTitle className="text-sm font-normal">Progress Anda</CardTitle>
                        </CardHeader>
                        <CardContent className="space-y-4">
                            {aku.status == "approve" && <><Progress value={100 * (tugas.filter((t: any) => (t.tugas_pesertas.length > 0 && t.tugas_pesertas[0].status !== "reject")).length / tugas.length)} className="h-2 bg-white/20" />
                                <div className="flex justify-between text-sm">
                                    {tugas.map((item: any, index: number) => (<span key={`progress-tugas-${item.id}`}>Tugas {index + 1}</span>))}

                                </div></>}

                        </CardContent>
                    </Card>
                </div>
                <div className="mb-8">
                    <h2 className="text-xl font-semibold mb-4">Jadwal Pelatihan</h2>
                    <Card className="overflow-auto">
                        <Table>
                            <TableHeader className="bg-gray-200">
                                <TableRow>
                                    <TableHead className="font-semibold">Kode Unit</TableHead>
                                    <TableHead className="font-semibold">Kompetensi</TableHead>
                                    <TableHead className="font-semibold">Tanggal</TableHead>
                                    <TableHead className="font-semibold">Instruktur</TableHead>
                                </TableRow>
                            </TableHeader>
                            <TableBody>
                                {pelatihan.pelatihan_jadwals.map((item: any) => (
                                    <TableRow key={`jadwal-${item.id}`}>
                                        <TableCell className="font-medium">{item.code}</TableCell>
                                        <TableCell>{item.name}</TableCell>
                                        <TableCell>{item.course_date}</TableCell>
                                        <TableCell>{item.instructor.nama}</TableCell>
                                    </TableRow>
                                ))}
                            </TableBody>
                        </Table>
                    </Card>
                </div>

                {/* Assignments */}
                <div className=" rounded-lg">
                    <h2 className="text-xl font-semibold mb-4">Pengumpulan Tugas</h2>
                    <Card className="overflow-auto">
                        <Table>
                            <TableHeader className="bg-gray-200">
                                <TableRow>
                                    <TableHead className="font-semibold">Tugas</TableHead>
                                    <TableHead className="font-semibold">Tanggal Akhir Pengumpulan</TableHead>
                                    <TableHead className="font-semibold ">Status</TableHead>
                                    <TableHead className="font-semibold text-right">Upload</TableHead>
                                </TableRow>
                            </TableHeader>
                            <TableBody>
                                {tugas.map((item: any) => (
                                    <TableRow key={`tugas-${item.id}`} className="even:bg-gray-50">

                                        <TableCell>{item.name}</TableCell>
                                        <TableCell>{item.due_date}</TableCell>
                                        <TableCell>{item.tugas_pesertas.length > 0 ? (
                                            item.tugas_pesertas[0].status == 'pending'
                                                ? <span className="inline-flex items-center rounded bg-orange-50 px-2 py-0.5 text-xs font-medium text-orange-500 ring-1 ring-inset ring-orange-600/20">Pending</span>
                                                : item.tugas_pesertas[0].status == 'reject' ? <span className="inline-flex items-center rounded bg-red-50 px-2 py-0.5 text-xs font-medium text-red-700 ring-1 ring-inset ring-red-600/10">Reject</span> : <span className="inline-flex items-center rounded bg-green-50 px-2 py-0.5 text-xs font-medium text-green-700 ring-1 ring-inset ring-green-600/20">Approve</span>
                                        ) : "-"}</TableCell>
                                        <TableCell className="text-right">

                                            {(item.tugas_pesertas.length > 0 && item.tugas_pesertas[0].status !== "reject") ? <Badge

                                                variant="secondary"
                                                className="bg-emerald-500 hover:bg-emerald-500 text-white"
                                            >
                                                Sudah Dikirim
                                            </Badge> : <Button
                                                onClick={() => {
                                                    if (item.tugas_pesertas.length <= 0 || (item.tugas_pesertas.length > 0 && item.tugas_pesertas[0].status == "reject")) {
                                                        setSelectedTugas(item);
                                                        setData('materi_tugas_id', item.id);

                                                    } else { alert('Anda sudah mengirim tugas'); }
                                                }}
                                                variant="secondary"

                                            >
                                                Upload
                                            </Button>}

                                        </TableCell>
                                    </TableRow>

                                ))}
                            </TableBody>
                        </Table>
                    </Card>

                </div>

            </div>}

            {pelatihan == null && <div className="text-center max-w-2xl mx-auto py-12">
                <div className="bg-blue-50 w-16 h-16 rounded-full flex items-center justify-center mx-auto mb-6">
                    <Rocket className="w-8 h-8 text-blue-600" />
                </div>
                <h2 className="text-2xl font-bold mb-3">Mulai tingkatkan skill-mu sekarang juga</h2>
                <p className="text-gray-600 mb-8">
                    Kamu belum terdaftar di pelatihan manamupun. Yuk cari dan daftar pelatiha untuk meningkatan skill-mu.
                </p>
                <div className="flex flex-col sm:flex-row gap-4 justify-center">
                    <Link href={route('course.index')}>
                        <Button className="gap-2">
                            <Search className="w-4 h-4" />
                            Cari Pelatihan
                        </Button>
                    </Link>
                    <Button variant="outline" className="gap-2">
                        <BookOpenCheck className="w-4 h-4" />
                        Lihat Rekomendasi
                    </Button>
                </div>
                <div className="mt-12 grid grid-cols-1 sm:grid-cols-3 gap-6 text-left">
                    <Card className="p-6">
                        <PlusCircle className="w-8 h-8 text-blue-600 mb-4" />
                        <h3 className="font-semibold mb-2">Berbagai macam pelatihan</h3>
                        <p className="text-sm text-gray-600">Browse through our extensive catalog of professional courses.</p>
                    </Card>
                    <Card className="p-6">
                        <GraduationCap className="w-8 h-8 text-blue-600 mb-4" />
                        <h3 className="font-semibold mb-2">Dapatka sertifikat BNSP</h3>
                        <p className="text-sm text-gray-600">Earn industry-recognized certificates to boost your career.</p>
                    </Card>
                    <Card className="p-6">
                        <Users className="w-8 h-8 text-blue-600 mb-4" />
                        <h3 className="font-semibold mb-2">Bergabung bersama komunitas</h3>
                        <p className="text-sm text-gray-600">Connect with fellow learners and industry experts.</p>
                    </Card>
                </div>
            </div>}

            <Dialog open={!!selectedTugas} onOpenChange={() => setSelectedTugas(null)}>
                <DialogContent className="sm:max-w-[425px] transition-all duration-300 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=open]:slide-in-from-left-1/2">
                    <DialogHeader>
                        <DialogTitle className="text-xl font-semibold">
                            {selectedTugas?.name}
                        </DialogTitle>

                    </DialogHeader>

                    <div>
                        <form onSubmit={submit} className='space-y-2' encType='multipart/form-data' method='POST'>
                            <div className="space-y-2">
                                <div className="space-y-2">
                                    <Label htmlFor="file">File Tugas (Max 50 MB)</Label>
                                    <Input
                                        id="file"
                                        name="file"
                                        type="file"
                                        onChange={(e) => handleFileChange(e)}
                                        accept="image/*,
                                                video/*,
                                                application/pdf,
                                                application/msword,
                                                application/vnd.openxmlformats-officedocument.wordprocessingml.document,
                                                application/vnd.ms-excel,
                                                application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,
                                                application/vnd.ms-powerpoint,
                                                application/vnd.openxmlformats-officedocument.presentationml.presentation,
                                                application/zip"
                                    />
                                </div>
                                <InputError message={errors.file} />
                            </div>

                            <div className="space-y-2">
                                <div className="space-y-2">
                                    <Label htmlFor="link">Link Tugas</Label>
                                    <Input
                                        id="link"
                                        name="link"
                                        placeholder="masukan link..."
                                        value={data.link}
                                        onChange={(e) => setData('link', e.target.value)}
                                    />
                                </div>
                                <InputError message={errors.link} />
                            </div>
                            <div className="flex items-center gap-4 mt-4">
                                <PrimaryButton disabled={processing}>Kirim</PrimaryButton>

                                <Transition
                                    show={recentlySuccessful}
                                    enter="transition ease-in-out"
                                    enterFrom="opacity-0"
                                    leave="transition ease-in-out"
                                    leaveTo="opacity-0"
                                >
                                    <p className="text-sm text-gray-600">Kirim.</p>
                                </Transition>
                            </div>
                        </form>
                    </div>
                </DialogContent>
            </Dialog>

        </AuthenticatedLayout>
    );
}

Anons79 File Manager Version 1.0, Coded By Anons79
Email: [email protected]