feat: update student import and graduation workflows

This commit is contained in:
2026-04-30 00:04:52 +07:00
parent 189b076ab0
commit ac22f8b7c8
51 changed files with 4547 additions and 1287 deletions
+170 -29
View File
@@ -1,19 +1,129 @@
<x-master-page title="Data Siswa Mutasi" description="Data siswa yang dipindahkan ke tabel arsip siswa mutasi saat statusnya diubah menjadi Pindah ke sekolah lain.">
<x-master-card title="Filter Data Siswa Mutasi" subtitle="Cari data siswa mutasi berdasarkan identitas dan akademik terakhir.">
<form method="GET" action="{{ route('student-transfers.index') }}" class="grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-4">
<x-form-input name="search" label="Pencarian" :value="$search" placeholder="Nama / NIS / NISN" />
<x-form-select name="academic_year_id" label="Tahun Angkatan" :options="$academicYears->all()" :value="$filters['academic_year_id']" />
<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']" />
<div class="flex items-end gap-3 md:col-span-2 xl:col-span-4">
<button type="submit" class="rounded-2xl bg-slate-900 px-5 py-3 text-sm font-semibold text-white transition hover:bg-slate-800">Cari</button>
<a href="{{ route('student-transfers.index') }}" class="rounded-2xl border border-slate-200 px-5 py-3 text-sm font-semibold text-slate-700 transition hover:bg-slate-50">Reset</a>
<div class="grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-5">
<div class="group rounded-3xl border border-slate-200 bg-gradient-to-br from-white via-slate-50 to-indigo-50/40 p-6 shadow-sm shadow-slate-200/50 ring-1 ring-white/70 transition hover:-translate-y-0.5 hover:shadow-lg hover:shadow-slate-200/70">
<div class="flex items-start justify-between gap-3">
<div>
<div class="text-sm font-medium text-slate-500">Total Arsip Mutasi</div>
<div class="mt-3 text-3xl font-bold text-slate-900">{{ $summary['total'] }}</div>
</div>
<div class="rounded-2xl bg-white/80 p-3 text-indigo-600 ring-1 ring-indigo-100 backdrop-blur-sm">
<i class="fa-solid fa-right-left text-lg"></i>
</div>
</div>
</form>
</x-master-card>
</div>
<div class="group rounded-3xl border border-emerald-200 bg-gradient-to-br from-white via-emerald-50/50 to-emerald-100/60 p-6 shadow-sm shadow-emerald-100/50 ring-1 ring-white/70 transition hover:-translate-y-0.5 hover:shadow-lg hover:shadow-emerald-200/60">
<div class="flex items-start justify-between gap-3">
<div>
<div class="text-sm font-medium text-emerald-700">Sudah Ada Surat</div>
<div class="mt-3 text-3xl font-bold text-emerald-800">{{ $summary['with_letter'] }}</div>
</div>
<div class="rounded-2xl bg-white/80 p-3 text-emerald-600 ring-1 ring-emerald-100 backdrop-blur-sm">
<i class="fa-solid fa-file-circle-check text-lg"></i>
</div>
</div>
</div>
<div class="group rounded-3xl border {{ $summary['without_letter'] > 0 ? 'border-amber-200 bg-gradient-to-br from-white via-amber-50/50 to-amber-100/60' : 'border-sky-200 bg-gradient-to-br from-white via-sky-50/50 to-sky-100/60' }} p-6 shadow-sm {{ $summary['without_letter'] > 0 ? 'shadow-amber-100/50' : 'shadow-sky-100/50' }} ring-1 ring-white/70 transition hover:-translate-y-0.5 hover:shadow-lg {{ $summary['without_letter'] > 0 ? 'hover:shadow-amber-200/60' : 'hover:shadow-sky-200/60' }}">
<div class="flex items-start justify-between gap-3">
<div>
<div class="text-sm font-medium {{ $summary['without_letter'] > 0 ? 'text-amber-700' : 'text-sky-700' }}">Belum Ada Surat</div>
<div class="mt-3 text-3xl font-bold {{ $summary['without_letter'] > 0 ? 'text-amber-800' : 'text-sky-800' }}">{{ $summary['without_letter'] }}</div>
</div>
<div class="rounded-2xl bg-white/80 p-3 {{ $summary['without_letter'] > 0 ? 'text-amber-600 ring-1 ring-amber-100' : 'text-sky-600 ring-1 ring-sky-100' }} backdrop-blur-sm">
<i class="fa-solid {{ $summary['without_letter'] > 0 ? 'fa-file-circle-xmark' : 'fa-folder-open' }} text-lg"></i>
</div>
</div>
</div>
<div class="group rounded-3xl border border-fuchsia-200 bg-gradient-to-br from-white via-fuchsia-50/50 to-fuchsia-100/60 p-6 shadow-sm shadow-fuchsia-100/50 ring-1 ring-white/70 transition hover:-translate-y-0.5 hover:shadow-lg hover:shadow-fuchsia-200/60">
<div class="flex items-start justify-between gap-3">
<div>
<div class="text-sm font-medium text-fuchsia-700">Mutasi Tahun Ini</div>
<div class="mt-3 text-3xl font-bold text-fuchsia-800">{{ $summary['this_year'] }}</div>
</div>
<div class="rounded-2xl bg-white/80 p-3 text-fuchsia-600 ring-1 ring-fuchsia-100 backdrop-blur-sm">
<i class="fa-solid fa-calendar-check text-lg"></i>
</div>
</div>
</div>
<div class="group rounded-3xl border border-slate-200 bg-gradient-to-br from-white via-slate-50 to-slate-100/70 p-6 shadow-sm shadow-slate-200/50 ring-1 ring-white/70 transition hover:-translate-y-0.5 hover:shadow-lg hover:shadow-slate-200/70">
<div class="flex items-start justify-between gap-3">
<div>
<div class="text-sm font-medium text-slate-500">Hasil Filter</div>
<div class="mt-3 text-3xl font-bold text-slate-900">{{ $summary['filtered'] }}</div>
<div class="mt-2 text-xs text-slate-500">{{ $summary['latest_transfer_date'] ? 'Update terakhir ' . \Illuminate\Support\Carbon::parse($summary['latest_transfer_date'])->format('d M Y') : 'Belum ada tanggal mutasi' }}</div>
</div>
<div class="rounded-2xl bg-white/80 p-3 text-slate-600 ring-1 ring-slate-200 backdrop-blur-sm">
<i class="fa-solid fa-filter text-lg"></i>
</div>
</div>
</div>
</div>
<div class="grid grid-cols-1 gap-6 xl:grid-cols-[1.15fr_0.85fr]">
<x-master-card title="Filter Data Siswa Mutasi" subtitle="Cari data siswa mutasi berdasarkan identitas dan akademik terakhir.">
<div class="rounded-3xl border border-slate-200 bg-gradient-to-br from-white via-slate-50 to-indigo-50/30 p-4 shadow-sm ring-1 ring-white/70">
<form method="GET" action="{{ route('student-transfers.index') }}" class="grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-4">
<x-form-input name="search" label="Pencarian" :value="$search" placeholder="Nama / NIS / NISN" />
<x-form-select name="academic_year_id" label="Tahun Angkatan" :options="$academicYears->all()" :value="$filters['academic_year_id']" />
<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']" />
<div class="flex flex-wrap items-end gap-3 md:col-span-2 xl:col-span-4">
<button type="submit" class="inline-flex items-center gap-2 rounded-2xl bg-slate-900 px-5 py-3 text-sm font-semibold text-white transition hover:bg-slate-800">
<i class="fa-solid fa-magnifying-glass"></i>
<span>Cari</span>
</button>
<a href="{{ route('student-transfers.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-rotate-left"></i>
<span>Reset</span>
</a>
</div>
</form>
</div>
</x-master-card>
<x-master-card title="Aktivitas Terbaru" subtitle="Tiga arsip mutasi terbaru yang masuk ke sistem.">
@if ($recentTransfers->isEmpty())
<div class="rounded-2xl border border-dashed border-slate-200 bg-slate-50 px-4 py-6 text-sm text-slate-500">
Belum ada arsip mutasi terbaru untuk ditampilkan.
</div>
@else
<div class="space-y-3">
@foreach ($recentTransfers as $recentTransfer)
<div class="rounded-2xl border border-slate-200 bg-slate-50/80 px-4 py-4 shadow-sm ring-1 ring-white/70">
<div class="flex items-start justify-between gap-3">
<div>
<div class="text-sm font-semibold text-slate-800">{{ $recentTransfer->full_name }}</div>
<div class="mt-1 text-xs text-slate-500">{{ $recentTransfer->department?->name ?: '-' }} · {{ $recentTransfer->classRoom?->name ?: '-' }}</div>
</div>
<span class="rounded-full bg-white px-3 py-1 text-[11px] font-semibold text-slate-600 ring-1 ring-slate-200">
{{ $recentTransfer->transfer_date?->format('d M Y') ?: 'Tanggal belum diisi' }}
</span>
</div>
</div>
@endforeach
</div>
@endif
</x-master-card>
</div>
<div class="overflow-hidden rounded-3xl border border-slate-200 bg-white shadow-sm shadow-slate-200/50 ring-1 ring-white/70">
<div class="border-b border-slate-200 bg-gradient-to-r from-white via-slate-50 to-indigo-50/30 px-6 py-5">
<div class="flex flex-col gap-2 lg:flex-row lg:items-center lg:justify-between">
<div>
<div class="text-lg font-semibold text-slate-800">Daftar Siswa Mutasi</div>
<div class="mt-1 text-sm text-slate-500">Arsip ini terisi otomatis saat status siswa diubah menjadi pindah sekolah.</div>
</div>
<div class="inline-flex items-center gap-2 rounded-full bg-slate-900 px-3 py-1.5 text-[11px] font-semibold uppercase tracking-[0.16em] text-white shadow-sm">
<i class="fa-solid fa-box-archive"></i>
{{ $studentTransfers->total() }} data terfilter
</div>
</div>
</div>
<x-master-card title="Daftar Siswa Mutasi" subtitle="Arsip ini terisi otomatis saat status siswa diubah menjadi Pindah.">
<div class="overflow-x-auto">
<table class="min-w-full divide-y divide-slate-200">
<thead class="bg-slate-50">
@@ -28,44 +138,75 @@
</thead>
<tbody class="divide-y divide-slate-100 bg-white">
@forelse ($studentTransfers as $studentTransfer)
<tr>
<tr class="transition hover:bg-slate-50/80">
<td class="px-6 py-4 text-sm text-slate-700">
<div class="font-semibold text-slate-800">{{ $studentTransfer->full_name }}</div>
<div class="mt-1 text-xs text-slate-500">NIS: {{ $studentTransfer->student_number ?: '-' }} · NISN: {{ $studentTransfer->nisn ?: '-' }}</div>
<div class="flex items-start gap-3">
<div class="flex h-11 w-11 shrink-0 items-center justify-center rounded-2xl bg-indigo-100 text-sm font-bold text-indigo-700">
{{ strtoupper(mb_substr($studentTransfer->full_name, 0, 1)) }}
</div>
<div>
<div class="font-semibold text-slate-800">{{ $studentTransfer->full_name }}</div>
<div class="mt-1 text-xs text-slate-500">NIS: {{ $studentTransfer->student_number ?: '-' }} · NISN: {{ $studentTransfer->nisn ?: '-' }}</div>
</div>
</div>
</td>
<td class="px-6 py-4 text-sm text-slate-600">
<div>{{ $studentTransfer->academicYear?->name ?: '-' }}</div>
<div class="font-medium text-slate-700">{{ $studentTransfer->academicYear?->name ?: '-' }}</div>
<div>{{ $studentTransfer->department?->name ?: '-' }}</div>
<div>{{ $studentTransfer->classRoom?->name ?: '-' }}</div>
<div class="text-xs text-slate-500">{{ $studentTransfer->classRoom?->name ?: '-' }}</div>
</td>
<td class="px-6 py-4 text-sm text-slate-600">
<div class="inline-flex items-center gap-2 rounded-2xl border border-slate-200 bg-slate-50 px-3 py-2">
<i class="fa-solid fa-calendar-days text-xs text-slate-400"></i>
<span>{{ $studentTransfer->transfer_date?->format('d-m-Y') ?: '-' }}</span>
</div>
</td>
<td class="px-6 py-4 text-sm text-slate-600">{{ $studentTransfer->transfer_date?->format('d-m-Y') ?: '-' }}</td>
<td class="px-6 py-4 text-sm text-slate-600">
@if ($studentTransfer->transfer_letter_file_path)
<span class="inline-flex rounded-full bg-emerald-100 px-3 py-1 text-xs font-semibold text-emerald-700">Sudah diupload</span>
<span class="inline-flex items-center gap-2 rounded-full bg-emerald-100 px-3 py-1 text-xs font-semibold text-emerald-700">
<i class="fa-solid fa-circle-check"></i>
<span>Sudah diupload</span>
</span>
<div class="mt-2 text-xs text-slate-500">{{ $studentTransfer->transfer_letter_file_name }}</div>
<div class="mt-3">
<a href="{{ route('student-transfers.preview-letter', $studentTransfer) }}" class="inline-flex items-center rounded-xl border border-sky-200 px-3 py-2 text-xs font-semibold text-sky-700 transition hover:bg-sky-50">Preview Surat</a>
<a href="{{ route('student-transfers.preview-letter', $studentTransfer) }}" class="inline-flex items-center gap-2 rounded-xl border border-sky-200 bg-sky-50 px-3 py-2 text-xs font-semibold text-sky-700 transition hover:bg-sky-100">
<i class="fa-solid fa-eye"></i>
<span>Preview Surat</span>
</a>
</div>
@else
<span class="inline-flex rounded-full bg-amber-100 px-3 py-1 text-xs font-semibold text-amber-700">Surat Pindah Sekolah belum di upload</span>
<span class="inline-flex items-center gap-2 rounded-full bg-amber-100 px-3 py-1 text-xs font-semibold text-amber-700">
<i class="fa-solid fa-triangle-exclamation"></i>
<span>Belum upload surat</span>
</span>
@endif
</td>
<td class="px-6 py-4 text-sm text-slate-600">{{ $studentTransfer->transfer_reason ?: '-' }}</td>
<td class="px-6 py-4 text-sm text-slate-600">
<div class="line-clamp-3">{{ $studentTransfer->transfer_reason ?: '-' }}</div>
</td>
<td class="px-6 py-4 text-sm">
<a href="{{ route('student-transfers.show', $studentTransfer) }}" class="rounded-xl border border-sky-200 px-3 py-2 text-xs font-semibold text-sky-700 transition hover:bg-sky-50">Detail Arsip</a>
<a href="{{ route('student-transfers.show', $studentTransfer) }}" class="inline-flex items-center gap-2 rounded-xl border border-sky-200 bg-sky-50 px-3 py-2 text-xs font-semibold text-sky-700 transition hover:bg-sky-100">
<i class="fa-solid fa-arrow-up-right-from-square"></i>
<span>Detail Arsip</span>
</a>
</td>
</tr>
@empty
<tr>
<td colspan="6" class="px-6 py-10 text-center text-sm text-slate-500">Belum ada data siswa mutasi.</td>
<td colspan="6" class="px-6 py-12 text-center text-sm text-slate-500">
<div class="mx-auto max-w-md">
<div class="text-base font-semibold text-slate-700">Belum ada data siswa mutasi.</div>
<div class="mt-2 text-sm text-slate-500">Arsip mutasi akan muncul otomatis saat status siswa diubah menjadi pindah sekolah.</div>
</div>
</td>
</tr>
@endforelse
</tbody>
</table>
</div>
</div>
<div class="mt-5">
{{ $studentTransfers->links() }}
</div>
</x-master-card>
<div class="mt-6 flex justify-end">
{{ $studentTransfers->onEachSide(1)->links() }}
</div>
</x-master-page>
@@ -1,38 +1,141 @@
<x-master-page title="Preview Surat Pindah Sekolah" description="Lihat surat pindah sekolah langsung di browser bila format mendukung.">
<div class="grid grid-cols-1 gap-6 xl:grid-cols-3">
<x-master-card title="Informasi Surat Pindah" subtitle="Metadata surat pindah sekolah.">
<div class="space-y-4 text-sm text-slate-600">
<div><span class="font-semibold text-slate-800">Nama Siswa:</span> {{ $studentTransfer->full_name }}</div>
<div><span class="font-semibold text-slate-800">Nama File:</span> {{ $studentTransfer->transfer_letter_file_name ?: '-' }}</div>
<div><span class="font-semibold text-slate-800">Tipe MIME:</span> {{ $mimeType ?: '-' }}</div>
<div><span class="font-semibold text-slate-800">Ukuran:</span> {{ $studentTransfer->transfer_letter_file_size ? number_format($studentTransfer->transfer_letter_file_size / 1024, 1) . ' KB' : '-' }}</div>
<div><span class="font-semibold text-slate-800">Tanggal Pindah:</span> {{ $studentTransfer->transfer_date?->format('d-m-Y') ?: '-' }}</div>
<div><span class="font-semibold text-slate-800">Catatan:</span> {{ $studentTransfer->transfer_reason ?: '-' }}</div>
<div class="grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-4">
<div class="rounded-3xl border border-slate-200 bg-gradient-to-br from-white via-slate-50 to-indigo-50/40 p-6 shadow-sm shadow-slate-200/50 ring-1 ring-white/70">
<div class="flex items-start justify-between gap-3">
<div>
<div class="text-sm font-medium text-slate-500">Nama Siswa</div>
<div class="mt-3 text-lg font-bold text-slate-900">{{ $studentTransfer->full_name }}</div>
</div>
<div class="rounded-2xl bg-white/80 p-3 text-indigo-600 ring-1 ring-indigo-100 backdrop-blur-sm">
<i class="fa-solid fa-user text-lg"></i>
</div>
</div>
</div>
<div class="rounded-3xl border border-sky-200 bg-gradient-to-br from-white via-sky-50/50 to-sky-100/60 p-6 shadow-sm shadow-sky-100/50 ring-1 ring-white/70">
<div class="flex items-start justify-between gap-3">
<div>
<div class="text-sm font-medium text-sky-700">Format File</div>
<div class="mt-3 text-lg font-bold text-sky-800">{{ strtoupper(pathinfo($studentTransfer->transfer_letter_file_name ?: '', PATHINFO_EXTENSION) ?: 'FILE') }}</div>
</div>
<div class="rounded-2xl bg-white/80 p-3 text-sky-600 ring-1 ring-sky-100 backdrop-blur-sm">
<i class="fa-solid fa-file-lines text-lg"></i>
</div>
</div>
</div>
<div class="rounded-3xl border border-emerald-200 bg-gradient-to-br from-white via-emerald-50/50 to-emerald-100/60 p-6 shadow-sm shadow-emerald-100/50 ring-1 ring-white/70">
<div class="flex items-start justify-between gap-3">
<div>
<div class="text-sm font-medium text-emerald-700">Ukuran File</div>
<div class="mt-3 text-lg font-bold text-emerald-800">{{ $studentTransfer->transfer_letter_file_size ? number_format($studentTransfer->transfer_letter_file_size / 1024, 1) . ' KB' : '-' }}</div>
</div>
<div class="rounded-2xl bg-white/80 p-3 text-emerald-600 ring-1 ring-emerald-100 backdrop-blur-sm">
<i class="fa-solid fa-weight-scale text-lg"></i>
</div>
</div>
</div>
<div class="rounded-3xl border border-fuchsia-200 bg-gradient-to-br from-white via-fuchsia-50/50 to-fuchsia-100/60 p-6 shadow-sm shadow-fuchsia-100/50 ring-1 ring-white/70">
<div class="flex items-start justify-between gap-3">
<div>
<div class="text-sm font-medium text-fuchsia-700">Tanggal Pindah</div>
<div class="mt-3 text-lg font-bold text-fuchsia-800">{{ $studentTransfer->transfer_date?->format('d M Y') ?: 'Belum diisi' }}</div>
</div>
<div class="rounded-2xl bg-white/80 p-3 text-fuchsia-600 ring-1 ring-fuchsia-100 backdrop-blur-sm">
<i class="fa-solid fa-calendar-right text-lg"></i>
</div>
</div>
</div>
</div>
<div class="grid grid-cols-1 gap-6 xl:grid-cols-[380px_minmax(0,1fr)]">
<x-master-card title="Informasi Surat Pindah" subtitle="Metadata file dan ringkasan arsip mutasi.">
<div class="mb-4 flex items-center gap-3 rounded-2xl border border-slate-200 bg-slate-50 px-4 py-3 shadow-sm ring-1 ring-white/70">
<div class="flex h-11 w-11 items-center justify-center rounded-2xl bg-indigo-100 text-indigo-600">
<i class="fa-solid fa-folder-open text-lg"></i>
</div>
<div>
<div class="text-xs font-semibold uppercase tracking-[0.16em] text-slate-500">Metadata Dokumen</div>
<div class="mt-1 text-sm font-semibold text-slate-800">Informasi cepat sebelum file dibuka atau diunduh</div>
</div>
</div>
<div class="space-y-3 text-sm text-slate-600">
<div class="rounded-2xl border border-slate-200 bg-white px-4 py-3 shadow-sm ring-1 ring-white/70">
<div class="flex items-center gap-2 text-[11px] font-semibold uppercase tracking-[0.14em] text-slate-500"><i class="fa-solid fa-user"></i><span>Nama Siswa</span></div>
<div class="mt-2 font-semibold text-slate-800">{{ $studentTransfer->full_name }}</div>
</div>
<div class="rounded-2xl border border-slate-200 bg-white px-4 py-3 shadow-sm ring-1 ring-white/70">
<div class="flex items-center gap-2 text-[11px] font-semibold uppercase tracking-[0.14em] text-slate-500"><i class="fa-solid fa-file-signature"></i><span>Nama File</span></div>
<div class="mt-2 break-words font-semibold text-slate-800">{{ $studentTransfer->transfer_letter_file_name ?: '-' }}</div>
</div>
<div class="rounded-2xl border border-slate-200 bg-white px-4 py-3 shadow-sm ring-1 ring-white/70">
<div class="flex items-center gap-2 text-[11px] font-semibold uppercase tracking-[0.14em] text-slate-500"><i class="fa-solid fa-code"></i><span>Tipe MIME</span></div>
<div class="mt-2 text-slate-700">{{ $mimeType ?: '-' }}</div>
</div>
<div class="rounded-2xl border border-slate-200 bg-white px-4 py-3 shadow-sm ring-1 ring-white/70">
<div class="flex items-center gap-2 text-[11px] font-semibold uppercase tracking-[0.14em] text-slate-500"><i class="fa-solid fa-weight-scale"></i><span>Ukuran File</span></div>
<div class="mt-2 text-slate-700">{{ $studentTransfer->transfer_letter_file_size ? number_format($studentTransfer->transfer_letter_file_size / 1024, 1) . ' KB' : '-' }}</div>
</div>
<div class="rounded-2xl border border-slate-200 bg-white px-4 py-3 shadow-sm ring-1 ring-white/70">
<div class="flex items-center gap-2 text-[11px] font-semibold uppercase tracking-[0.14em] text-slate-500"><i class="fa-solid fa-calendar-days"></i><span>Tanggal Pindah</span></div>
<div class="mt-2 text-slate-700">{{ $studentTransfer->transfer_date?->format('d-m-Y') ?: '-' }}</div>
</div>
<div class="rounded-2xl border border-slate-200 bg-white px-4 py-3 shadow-sm ring-1 ring-white/70">
<div class="flex items-center gap-2 text-[11px] font-semibold uppercase tracking-[0.14em] text-slate-500"><i class="fa-solid fa-align-left"></i><span>Catatan</span></div>
<div class="mt-2 leading-6 text-slate-700">{{ $studentTransfer->transfer_reason ?: '-' }}</div>
</div>
</div>
<div class="mt-6 flex flex-wrap gap-3">
<a href="{{ $fileUrl }}" target="_blank" rel="noopener noreferrer" class="rounded-2xl bg-sky-600 px-4 py-3 text-sm font-semibold text-white transition hover:bg-sky-700">Buka File Asli</a>
<a href="{{ route('student-transfers.index') }}" class="rounded-2xl border border-slate-200 px-4 py-3 text-sm font-semibold text-slate-700 transition hover:bg-slate-50">Kembali</a>
<a href="{{ $fileUrl }}" target="_blank" rel="noopener noreferrer" class="inline-flex items-center gap-2 rounded-2xl bg-sky-600 px-4 py-3 text-sm font-semibold text-white transition hover:bg-sky-700">
<i class="fa-solid fa-up-right-from-square"></i>
<span>Buka File Asli</span>
</a>
<a href="{{ route('student-transfers.show', $studentTransfer) }}" class="inline-flex items-center gap-2 rounded-2xl border border-slate-200 px-4 py-3 text-sm font-semibold text-slate-700 transition hover:bg-slate-50">
<i class="fa-solid fa-arrow-left"></i>
<span>Kembali ke Detail</span>
</a>
</div>
</x-master-card>
<div class="xl:col-span-2">
<x-master-card title="Tampilan Surat Pindah" subtitle="Preview langsung untuk gambar dan PDF.">
@if ($isImage)
<div class="overflow-hidden rounded-2xl border border-slate-200 bg-slate-50 p-4">
<img src="{{ $fileUrl }}" alt="{{ $studentTransfer->transfer_letter_file_name }}" class="mx-auto max-h-[70vh] rounded-xl object-contain shadow-sm">
<x-master-card title="Tampilan Surat Pindah" subtitle="Preview langsung untuk gambar dan PDF.">
<div class="mb-4 flex items-center justify-between gap-3 rounded-2xl border border-slate-200 bg-gradient-to-r from-white via-slate-50 to-indigo-50/30 px-4 py-3 shadow-sm ring-1 ring-white/70">
<div>
<div class="text-xs font-semibold uppercase tracking-[0.16em] text-slate-500">Mode Preview</div>
<div class="mt-1 text-sm font-semibold text-slate-800">
@if ($isImage)
Gambar langsung di browser
@elseif ($isPdf)
PDF embed di browser
@else
Preview tidak didukung
@endif
</div>
@elseif ($isPdf)
<div class="overflow-hidden rounded-2xl border border-slate-200 bg-slate-50">
<iframe src="{{ $fileUrl }}" class="h-[75vh] w-full rounded-2xl" title="Preview Surat Pindah"></iframe>
</div>
<div class="rounded-2xl bg-white/80 p-3 text-indigo-600 ring-1 ring-indigo-100 backdrop-blur-sm">
<i class="fa-solid {{ $isImage ? 'fa-image' : ($isPdf ? 'fa-file-pdf' : 'fa-circle-info') }} text-lg"></i>
</div>
</div>
@if ($isImage)
<div class="overflow-hidden rounded-3xl border border-slate-200 bg-slate-50 p-4 shadow-sm ring-1 ring-white/70">
<img src="{{ $fileUrl }}" alt="{{ $studentTransfer->transfer_letter_file_name }}" class="mx-auto max-h-[72vh] rounded-2xl object-contain shadow-sm">
</div>
@elseif ($isPdf)
<div class="overflow-hidden rounded-3xl border border-slate-200 bg-slate-50 shadow-sm ring-1 ring-white/70">
<iframe src="{{ $fileUrl }}" class="h-[78vh] w-full rounded-3xl" title="Preview Surat Pindah"></iframe>
</div>
@else
<div class="rounded-3xl border border-dashed border-slate-300 bg-slate-50 p-10 text-center shadow-sm ring-1 ring-white/70">
<div class="mx-auto flex h-14 w-14 items-center justify-center rounded-2xl bg-white text-slate-500 shadow-sm ring-1 ring-slate-200">
<i class="fa-solid fa-file-circle-question text-xl"></i>
</div>
@else
<div class="rounded-2xl border border-dashed border-slate-300 bg-slate-50 p-10 text-center">
<div class="text-lg font-semibold text-slate-800">Preview tidak tersedia</div>
<p class="mt-2 text-sm text-slate-500">Format file ini belum didukung untuk preview langsung di browser. Silakan gunakan tombol buka file asli.</p>
</div>
@endif
</x-master-card>
</div>
<div class="mt-4 text-lg font-semibold text-slate-800">Preview tidak tersedia</div>
<p class="mt-2 text-sm text-slate-500">Format file ini belum didukung untuk preview langsung di browser. Gunakan tombol buka file asli untuk melihat dokumen.</p>
</div>
@endif
</x-master-card>
</div>
</x-master-page>
+116 -35
View File
@@ -1,44 +1,109 @@
<x-master-page title="Detail Arsip Siswa Mutasi" description="Lihat ringkasan arsip siswa mutasi dan kelola surat pindah tanpa masuk ke modul siswa aktif.">
<div class="grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-4">
<div class="rounded-3xl border border-slate-200 bg-gradient-to-br from-white via-slate-50 to-indigo-50/40 p-6 shadow-sm shadow-slate-200/50 ring-1 ring-white/70">
<div class="flex items-start justify-between gap-3">
<div>
<div class="text-sm font-medium text-slate-500">Status Arsip</div>
<div class="mt-3 text-lg font-bold text-slate-900">Siswa Mutasi</div>
</div>
<div class="rounded-2xl bg-white/80 p-3 text-indigo-600 ring-1 ring-indigo-100 backdrop-blur-sm">
<i class="fa-solid fa-box-archive text-lg"></i>
</div>
</div>
</div>
<div class="rounded-3xl border border-sky-200 bg-gradient-to-br from-white via-sky-50/50 to-sky-100/60 p-6 shadow-sm shadow-sky-100/50 ring-1 ring-white/70">
<div class="flex items-start justify-between gap-3">
<div>
<div class="text-sm font-medium text-sky-700">Tanggal Pindah</div>
<div class="mt-3 text-lg font-bold text-sky-800">{{ $studentTransfer->transfer_date?->format('d M Y') ?: 'Belum diisi' }}</div>
</div>
<div class="rounded-2xl bg-white/80 p-3 text-sky-600 ring-1 ring-sky-100 backdrop-blur-sm">
<i class="fa-solid fa-calendar-right text-lg"></i>
</div>
</div>
</div>
<div class="rounded-3xl border {{ $studentTransfer->transfer_letter_file_path ? 'border-emerald-200 bg-gradient-to-br from-white via-emerald-50/50 to-emerald-100/60' : 'border-amber-200 bg-gradient-to-br from-white via-amber-50/50 to-amber-100/60' }} p-6 shadow-sm {{ $studentTransfer->transfer_letter_file_path ? 'shadow-emerald-100/50' : 'shadow-amber-100/50' }} ring-1 ring-white/70">
<div class="flex items-start justify-between gap-3">
<div>
<div class="text-sm font-medium {{ $studentTransfer->transfer_letter_file_path ? 'text-emerald-700' : 'text-amber-700' }}">Surat Pindah</div>
<div class="mt-3 text-lg font-bold {{ $studentTransfer->transfer_letter_file_path ? 'text-emerald-800' : 'text-amber-800' }}">{{ $studentTransfer->transfer_letter_file_path ? 'Sudah tersedia' : 'Belum diupload' }}</div>
</div>
<div class="rounded-2xl bg-white/80 p-3 {{ $studentTransfer->transfer_letter_file_path ? 'text-emerald-600 ring-1 ring-emerald-100' : 'text-amber-600 ring-1 ring-amber-100' }} backdrop-blur-sm">
<i class="fa-solid {{ $studentTransfer->transfer_letter_file_path ? 'fa-file-circle-check' : 'fa-file-circle-xmark' }} text-lg"></i>
</div>
</div>
</div>
<div class="rounded-3xl border border-fuchsia-200 bg-gradient-to-br from-white via-fuchsia-50/50 to-fuchsia-100/60 p-6 shadow-sm shadow-fuchsia-100/50 ring-1 ring-white/70">
<div class="flex items-start justify-between gap-3">
<div>
<div class="text-sm font-medium text-fuchsia-700">Kelas Terakhir</div>
<div class="mt-3 text-lg font-bold text-fuchsia-800">{{ $studentTransfer->classRoom?->name ?: '-' }}</div>
</div>
<div class="rounded-2xl bg-white/80 p-3 text-fuchsia-600 ring-1 ring-fuchsia-100 backdrop-blur-sm">
<i class="fa-solid fa-school text-lg"></i>
</div>
</div>
</div>
</div>
<div class="grid grid-cols-1 gap-6 xl:grid-cols-3">
<div class="xl:col-span-2 space-y-6">
<x-master-card title="Identitas Siswa" subtitle="Snapshot data terakhir saat siswa dipindahkan ke arsip mutasi.">
<div class="grid grid-cols-1 gap-5 md:grid-cols-2">
<div>
<div class="text-xs font-semibold uppercase tracking-[0.16em] text-slate-500">Nama Lengkap</div>
<div class="mt-1 text-sm font-semibold text-slate-900">{{ $studentTransfer->full_name }}</div>
<div class="mb-4 flex items-center gap-3 rounded-2xl border border-slate-200 bg-slate-50 px-4 py-3 shadow-sm ring-1 ring-white/70">
<div class="flex h-11 w-11 items-center justify-center rounded-2xl bg-indigo-100 text-indigo-600">
<i class="fa-solid fa-id-card text-lg"></i>
</div>
<div>
<div class="text-xs font-semibold uppercase tracking-[0.16em] text-slate-500">Status Arsip</div>
<div class="mt-1"><span class="inline-flex rounded-full bg-amber-100 px-3 py-1 text-xs font-semibold text-amber-700">Siswa Mutasi</span></div>
<div class="text-xs font-semibold uppercase tracking-[0.16em] text-slate-500">Snapshot Identitas</div>
<div class="mt-1 text-sm font-semibold text-slate-800">Identitas dasar siswa saat masuk arsip mutasi</div>
</div>
<div>
<div class="text-xs font-semibold uppercase tracking-[0.16em] text-slate-500">NIS</div>
<div class="mt-1 text-sm text-slate-700">{{ $studentTransfer->student_number ?: '-' }}</div>
</div>
<div class="grid grid-cols-1 gap-4 md:grid-cols-2">
<div class="rounded-2xl border border-slate-200 bg-white px-4 py-4 shadow-sm ring-1 ring-white/70">
<div class="flex items-center gap-2 text-[11px] font-semibold uppercase tracking-[0.14em] text-slate-500"><i class="fa-solid fa-user"></i><span>Nama Lengkap</span></div>
<div class="mt-2 text-sm font-semibold text-slate-900">{{ $studentTransfer->full_name }}</div>
</div>
<div>
<div class="text-xs font-semibold uppercase tracking-[0.16em] text-slate-500">NISN</div>
<div class="mt-1 text-sm text-slate-700">{{ $studentTransfer->nisn ?: '-' }}</div>
<div class="rounded-2xl border border-slate-200 bg-white px-4 py-4 shadow-sm ring-1 ring-white/70">
<div class="flex items-center gap-2 text-[11px] font-semibold uppercase tracking-[0.14em] text-slate-500"><i class="fa-solid fa-badge-check"></i><span>Status Arsip</span></div>
<div class="mt-2"><span class="inline-flex items-center gap-2 rounded-full bg-amber-100 px-3 py-1 text-xs font-semibold text-amber-700"><i class="fa-solid fa-right-left"></i><span>Siswa Mutasi</span></span></div>
</div>
<div class="rounded-2xl border border-slate-200 bg-white px-4 py-4 shadow-sm ring-1 ring-white/70">
<div class="flex items-center gap-2 text-[11px] font-semibold uppercase tracking-[0.14em] text-slate-500"><i class="fa-solid fa-hashtag"></i><span>NIS</span></div>
<div class="mt-2 text-sm text-slate-700">{{ $studentTransfer->student_number ?: '-' }}</div>
</div>
<div class="rounded-2xl border border-slate-200 bg-white px-4 py-4 shadow-sm ring-1 ring-white/70">
<div class="flex items-center gap-2 text-[11px] font-semibold uppercase tracking-[0.14em] text-slate-500"><i class="fa-solid fa-fingerprint"></i><span>NISN</span></div>
<div class="mt-2 text-sm text-slate-700">{{ $studentTransfer->nisn ?: '-' }}</div>
</div>
</div>
</x-master-card>
<x-master-card title="Akademik Terakhir" subtitle="Data akademik terakhir sebelum status siswa menjadi mutasi.">
<div class="grid grid-cols-1 gap-5 md:grid-cols-2 xl:grid-cols-4">
<div>
<div class="text-xs font-semibold uppercase tracking-[0.16em] text-slate-500">Tahun Angkatan</div>
<div class="mt-1 text-sm text-slate-700">{{ $studentTransfer->academicYear?->name ?: '-' }}</div>
<div class="mb-4 flex items-center gap-3 rounded-2xl border border-slate-200 bg-slate-50 px-4 py-3 shadow-sm ring-1 ring-white/70">
<div class="flex h-11 w-11 items-center justify-center rounded-2xl bg-amber-100 text-amber-600">
<i class="fa-solid fa-graduation-cap text-lg"></i>
</div>
<div>
<div class="text-xs font-semibold uppercase tracking-[0.16em] text-slate-500">Program Keahlian</div>
<div class="mt-1 text-sm text-slate-700">{{ $studentTransfer->department?->name ?: '-' }}</div>
<div class="text-xs font-semibold uppercase tracking-[0.16em] text-slate-500">Posisi Akademik Terakhir</div>
<div class="mt-1 text-sm font-semibold text-slate-800">Rombel dan relasi akademik sebelum siswa pindah sekolah</div>
</div>
<div>
<div class="text-xs font-semibold uppercase tracking-[0.16em] text-slate-500">Kelas Terakhir</div>
<div class="mt-1 text-sm text-slate-700">{{ $studentTransfer->classRoom?->name ?: '-' }}</div>
</div>
<div class="grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-4">
<div class="rounded-2xl border border-slate-200 bg-white px-4 py-4 shadow-sm ring-1 ring-white/70">
<div class="flex items-center gap-2 text-[11px] font-semibold uppercase tracking-[0.14em] text-slate-500"><i class="fa-solid fa-calendar-days"></i><span>Tahun Angkatan</span></div>
<div class="mt-2 text-sm text-slate-700">{{ $studentTransfer->academicYear?->name ?: '-' }}</div>
</div>
<div>
<div class="text-xs font-semibold uppercase tracking-[0.16em] text-slate-500">Tanggal Masuk</div>
<div class="mt-1 text-sm text-slate-700">{{ $studentTransfer->entry_date?->format('d-m-Y') ?: '-' }}</div>
<div class="rounded-2xl border border-slate-200 bg-white px-4 py-4 shadow-sm ring-1 ring-white/70">
<div class="flex items-center gap-2 text-[11px] font-semibold uppercase tracking-[0.14em] text-slate-500"><i class="fa-solid fa-sitemap"></i><span>Program Keahlian</span></div>
<div class="mt-2 text-sm text-slate-700">{{ $studentTransfer->department?->name ?: '-' }}</div>
</div>
<div class="rounded-2xl border border-slate-200 bg-white px-4 py-4 shadow-sm ring-1 ring-white/70">
<div class="flex items-center gap-2 text-[11px] font-semibold uppercase tracking-[0.14em] text-slate-500"><i class="fa-solid fa-school"></i><span>Kelas Terakhir</span></div>
<div class="mt-2 text-sm text-slate-700">{{ $studentTransfer->classRoom?->name ?: '-' }}</div>
</div>
<div class="rounded-2xl border border-slate-200 bg-white px-4 py-4 shadow-sm ring-1 ring-white/70">
<div class="flex items-center gap-2 text-[11px] font-semibold uppercase tracking-[0.14em] text-slate-500"><i class="fa-solid fa-door-open"></i><span>Tanggal Masuk</span></div>
<div class="mt-2 text-sm text-slate-700">{{ $studentTransfer->entry_date?->format('d-m-Y') ?: '-' }}</div>
</div>
</div>
</x-master-card>
@@ -48,20 +113,33 @@
<x-master-card title="Dokumen Surat Pindah" subtitle="Upload atau ganti surat pindah langsung dari modul arsip.">
<div class="space-y-4">
@if ($studentTransfer->transfer_letter_file_path)
<div class="rounded-2xl border border-emerald-200 bg-emerald-50 px-4 py-4">
<div class="text-sm font-semibold text-emerald-700">Surat pindah sudah tersedia</div>
<div class="mt-1 text-xs text-emerald-600">{{ $studentTransfer->transfer_letter_file_name }}</div>
<div class="mt-3">
<a href="{{ route('student-transfers.preview-letter', $studentTransfer) }}" class="inline-flex items-center rounded-xl border border-sky-200 px-3 py-2 text-xs font-semibold text-sky-700 transition hover:bg-sky-50">Preview Surat</a>
<div class="rounded-2xl border border-emerald-200 bg-gradient-to-r from-emerald-50 to-white px-4 py-4 shadow-sm shadow-emerald-100/40">
<div class="flex items-start gap-3">
<div class="flex h-10 w-10 items-center justify-center rounded-2xl bg-white text-emerald-600 shadow-sm ring-1 ring-emerald-100">
<i class="fa-solid fa-file-circle-check"></i>
</div>
<div>
<div class="text-sm font-semibold text-emerald-700">Surat pindah sudah tersedia</div>
<div class="mt-1 text-xs text-emerald-600">{{ $studentTransfer->transfer_letter_file_name }}</div>
<div class="mt-3">
<a href="{{ route('student-transfers.preview-letter', $studentTransfer) }}" class="inline-flex items-center gap-2 rounded-xl border border-sky-200 bg-sky-50 px-3 py-2 text-xs font-semibold text-sky-700 transition hover:bg-sky-100">
<i class="fa-solid fa-eye"></i>
<span>Preview Surat</span>
</a>
</div>
</div>
</div>
</div>
@else
<div class="rounded-2xl border border-amber-200 bg-amber-50 px-4 py-4 text-sm font-medium text-amber-700">
Surat pindah belum diupload.
<div class="rounded-2xl border border-amber-200 bg-gradient-to-r from-amber-50 to-white px-4 py-4 text-sm font-medium text-amber-700 shadow-sm shadow-amber-100/40">
<div class="flex items-center gap-3">
<i class="fa-solid fa-triangle-exclamation"></i>
<span>Surat pindah belum diupload.</span>
</div>
</div>
@endif
<form method="POST" action="{{ route('student-transfers.update', $studentTransfer) }}" enctype="multipart/form-data" class="space-y-4">
<form method="POST" action="{{ route('student-transfers.update', $studentTransfer) }}" enctype="multipart/form-data" class="space-y-4 rounded-3xl border border-slate-200 bg-gradient-to-br from-white via-slate-50 to-indigo-50/25 p-4 shadow-sm ring-1 ring-white/70">
@csrf
@method('PATCH')
@@ -70,13 +148,16 @@
<div>
<label for="transfer_letter" class="mb-2 block text-sm font-medium text-slate-700">Upload / Ganti Surat Pindah</label>
<input id="transfer_letter" name="transfer_letter" type="file" accept=".pdf,.jpg,.jpeg,.png" class="block w-full rounded-2xl border border-slate-200 bg-white px-4 py-3 text-sm text-slate-700 file:mr-4 file:rounded-xl file:border-0 file:bg-slate-100 file:px-4 file:py-2 file:text-sm file:font-semibold file:text-slate-700 hover:file:bg-slate-200">
<div class="flex min-h-[3rem] items-center rounded-2xl border border-slate-200 bg-white px-3 py-2 transition focus-within:border-indigo-300 focus-within:ring-4 focus-within:ring-indigo-100">
<input id="transfer_letter" name="transfer_letter" type="file" accept=".pdf,.jpg,.jpeg,.png" class="block w-full text-sm text-slate-700 file:mr-3 file:rounded-xl file:border-0 file:bg-slate-100 file:px-4 file:py-2.5 file:text-sm file:font-semibold file:text-slate-700 hover:file:bg-slate-200">
</div>
<p class="mt-2 text-xs text-slate-500">Format: PDF, JPG, JPEG, PNG. Maksimal 2 MB.</p>
<x-input-error :messages="$errors->get('transfer_letter')" class="mt-2" />
</div>
<button type="submit" class="inline-flex items-center 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">
Simpan Arsip Mutasi
<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-floppy-disk"></i>
<span>Simpan Arsip Mutasi</span>
</button>
</form>
</div>