Update graduation workflow, promotions, and admin module improvements

This commit is contained in:
2026-05-02 13:09:26 +07:00
parent 700c24209d
commit 96d6e364a6
16 changed files with 1593 additions and 32 deletions
@@ -78,7 +78,7 @@
</div>
</div>
<form method="POST" action="{{ route('graduated-students.bulk-upload.preview') }}" enctype="multipart/form-data" class="space-y-5">
<form method="POST" action="{{ route('graduated-students.bulk-upload.preview') }}" enctype="multipart/form-data" class="space-y-5" data-bulk-upload-form data-bulk-upload-mode="preview" data-bulk-upload-file-count-source="input" data-bulk-upload-ajax-preview="true" data-bulk-upload-preview-url="{{ route('graduated-students.bulk-upload.preview-ajax') }}">
@csrf
<div class="grid grid-cols-1 gap-5 md:grid-cols-2">
@@ -130,9 +130,9 @@
</div>
<div class="flex flex-wrap items-center gap-3">
<button type="submit" class="inline-flex items-center gap-2 rounded-2xl bg-indigo-600 px-5 py-3 text-sm font-semibold text-white shadow-lg shadow-indigo-200 transition hover:bg-indigo-700">
<i class="fa-solid fa-magnifying-glass"></i>
<span>Preview Mapping Dokumen</span>
<button type="submit" class="inline-flex items-center gap-2 rounded-2xl bg-indigo-600 px-5 py-3 text-sm font-semibold text-white shadow-lg shadow-indigo-200 transition hover:bg-indigo-700 disabled:cursor-not-allowed disabled:opacity-70" data-bulk-upload-submit-button>
<i class="fa-solid fa-magnifying-glass" data-bulk-upload-submit-icon></i>
<span data-bulk-upload-submit-label>Preview Mapping Dokumen</span>
</button>
<a href="{{ route('graduated-students.index') }}" class="inline-flex items-center gap-2 rounded-2xl border border-slate-200 bg-white px-5 py-3 text-sm font-semibold text-slate-700 transition hover:bg-slate-50">
<i class="fa-solid fa-arrow-left"></i>
@@ -262,10 +262,10 @@
</div>
</div>
<form method="POST" action="{{ route('graduated-students.bulk-upload.store') }}" class="mt-6 flex flex-wrap items-center gap-3">
<form method="POST" action="{{ route('graduated-students.bulk-upload.store') }}" class="mt-6 flex flex-wrap items-center gap-3" data-bulk-upload-form data-bulk-upload-mode="process" data-bulk-upload-file-count-source="preview" data-bulk-upload-preview-count="{{ $preview['summary']['ready_to_upload'] ?? $preview['summary']['total_files'] ?? 0 }}">
@csrf
<input type="hidden" name="preview_token" value="{{ $preview['token'] }}">
<button type="submit" class="inline-flex items-center gap-2 rounded-2xl bg-emerald-600 px-5 py-3 text-sm font-semibold text-white shadow-lg shadow-emerald-200 transition hover:bg-emerald-700">
<button type="submit" class="inline-flex items-center gap-2 rounded-2xl bg-emerald-600 px-5 py-3 text-sm font-semibold text-white shadow-lg shadow-emerald-200 transition hover:bg-emerald-700 disabled:cursor-not-allowed disabled:opacity-70" data-bulk-upload-submit-button>
<i class="fa-solid fa-cloud-arrow-up"></i>
<span>Proses Bulk Upload</span>
</button>
@@ -273,4 +273,55 @@
</x-master-card>
@endif
</div>
<div class="fixed inset-0 z-[11000] hidden items-center justify-center bg-slate-950/60 px-4" data-bulk-upload-overlay>
<div class="w-full max-w-lg rounded-3xl border border-white/10 bg-slate-900/95 p-6 text-white shadow-2xl backdrop-blur">
<div class="flex items-start gap-4">
<div class="flex h-14 w-14 shrink-0 items-center justify-center rounded-2xl bg-indigo-500/15 text-indigo-200">
<i class="fa-solid fa-arrows-rotate animate-spin text-2xl"></i>
</div>
<div>
<div class="text-lg font-bold" data-bulk-upload-overlay-title>Sedang memproses dokumen...</div>
<div class="mt-2 text-sm leading-6 text-slate-300" data-bulk-upload-overlay-message>Mohon tunggu. File sedang diunggah dan dipetakan oleh sistem. Jangan tutup tab ini agar proses tidak terputus.</div>
</div>
</div>
<div class="mt-5">
<div class="mb-2 flex items-center justify-between gap-3 text-xs text-slate-300">
<span class="font-semibold" data-bulk-upload-overlay-progress-label>Menunggu proses dimulai...</span>
<span class="font-semibold" data-bulk-upload-overlay-progress-percent>0%</span>
</div>
<div class="overflow-hidden rounded-full bg-white/10">
<div class="h-2 w-0 rounded-full bg-gradient-to-r from-indigo-400 via-sky-300 to-emerald-300 transition-all duration-300" data-bulk-upload-overlay-progress-bar></div>
</div>
</div>
<div class="mt-4 grid grid-cols-1 gap-3 sm:grid-cols-3">
<div class="rounded-2xl border border-white/10 bg-white/5 px-4 py-3">
<div class="text-[11px] font-semibold uppercase tracking-[0.14em] text-slate-400">Tahap 1</div>
<div class="mt-1 text-sm font-semibold text-white" data-bulk-upload-stage-upload>Upload file</div>
</div>
<div class="rounded-2xl border border-white/10 bg-white/5 px-4 py-3">
<div class="text-[11px] font-semibold uppercase tracking-[0.14em] text-slate-400">Tahap 2</div>
<div class="mt-1 text-sm font-semibold text-white" data-bulk-upload-stage-match>Cocokkan data</div>
</div>
<div class="rounded-2xl border border-white/10 bg-white/5 px-4 py-3">
<div class="text-[11px] font-semibold uppercase tracking-[0.14em] text-slate-400">Tahap 3</div>
<div class="mt-1 text-sm font-semibold text-white" data-bulk-upload-stage-save>Simpan hasil</div>
</div>
</div>
<div class="mt-4 flex flex-wrap items-center gap-3 text-xs text-slate-300">
<div class="inline-flex items-center gap-2 rounded-full border border-white/10 bg-white/5 px-3 py-1.5">
<i class="fa-solid fa-files"></i>
<span data-bulk-upload-overlay-file-count>Menyiapkan jumlah file...</span>
</div>
<div class="inline-flex items-center gap-2 rounded-full border border-white/10 bg-white/5 px-3 py-1.5">
<i class="fa-solid fa-hourglass-half"></i>
<span>Durasi tergantung jumlah dan ukuran file</span>
</div>
</div>
<div class="mt-4 rounded-2xl border border-white/10 bg-white/5 px-4 py-3 text-xs leading-5 text-slate-300">
Proses bulk upload bisa butuh beberapa detik, terutama jika file banyak atau ukuran file mendekati batas maksimum.
</div>
</div>
</div>
</x-master-page>
@@ -81,11 +81,11 @@
<x-master-card title="Filter Arsip Kelulusan" subtitle="Cari lulusan berdasarkan nama, identitas siswa, jurusan, kelas terakhir, tahun ajaran, dan status dokumen.">
<div class="rounded-3xl border border-slate-200 bg-gradient-to-br from-white via-slate-50 to-sky-50/30 p-4 shadow-sm ring-1 ring-white/70">
<form method="GET" action="{{ $indexRoute }}" class="grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-5">
<form method="GET" action="{{ $indexRoute }}" class="grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-5" data-graduation-filter-form>
<x-form-input name="search" label="Pencarian" :value="$search" placeholder="Nama / NIS / NISN" />
<x-form-select name="academic_year_id" label="Tahun Ajaran" :options="$academicYears->all()" :value="$filters['academic_year_id']" />
<x-form-select name="academic_year_id" label="Tahun Ajaran" :options="$academicYears->all()" :value="$filters['academic_year_id']" data-graduation-academic-year-filter />
<x-form-select name="department_id" label="Program Keahlian" :options="$departments->all()" :value="$filters['department_id']" />
<x-form-select name="class_id" label="Kelas Terakhir" :options="$classes->all()" :value="$filters['class_id']" />
<x-form-select name="class_id" label="Kelas Terakhir" :options="$classes->all()" :value="$filters['class_id']" :placeholder="$filters['academic_year_id'] ? 'Pilih kelas terakhir' : 'Pilih tahun ajaran dulu'" />
<x-form-select name="document_status" label="Status Dokumen" :options="$documentStatusOptions" :value="$filters['document_status']" />
<input type="hidden" name="sort" value="{{ $sort }}">