Initial commit

This commit is contained in:
2026-04-12 06:24:30 +00:00
commit 007f107be6
213 changed files with 25576 additions and 0 deletions
@@ -0,0 +1,71 @@
<x-master-page title="Data Siswa Keluar" description="Data siswa yang sudah dipindahkan ke tabel arsip siswa keluar saat statusnya diubah menjadi Keluar.">
<x-master-card title="Filter Data Siswa Keluar" subtitle="Cari data siswa keluar berdasarkan identitas dan akademik terakhir.">
<form method="GET" action="{{ route('student-exits.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-exits.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>
</form>
</x-master-card>
<x-master-card title="Daftar Siswa Keluar" subtitle="Arsip ini terisi otomatis saat status siswa diubah menjadi Keluar.">
<div class="overflow-x-auto">
<table class="min-w-full divide-y divide-slate-200">
<thead class="bg-slate-50">
<tr>
<th class="px-6 py-4 text-left text-xs font-semibold uppercase tracking-[0.16em] text-slate-500">Siswa</th>
<th class="px-6 py-4 text-left text-xs font-semibold uppercase tracking-[0.16em] text-slate-500">Akademik Terakhir</th>
<th class="px-6 py-4 text-left text-xs font-semibold uppercase tracking-[0.16em] text-slate-500">Tanggal Keluar</th>
<th class="px-6 py-4 text-left text-xs font-semibold uppercase tracking-[0.16em] text-slate-500">Surat Keluar</th>
<th class="px-6 py-4 text-left text-xs font-semibold uppercase tracking-[0.16em] text-slate-500">Catatan</th>
<th class="px-6 py-4 text-left text-xs font-semibold uppercase tracking-[0.16em] text-slate-500">Aksi</th>
</tr>
</thead>
<tbody class="divide-y divide-slate-100 bg-white">
@forelse ($studentExits as $studentExit)
<tr>
<td class="px-6 py-4 text-sm text-slate-700">
<div class="font-semibold text-slate-800">{{ $studentExit->full_name }}</div>
<div class="mt-1 text-xs text-slate-500">NIS: {{ $studentExit->student_number ?: '-' }} · NISN: {{ $studentExit->nisn ?: '-' }}</div>
</td>
<td class="px-6 py-4 text-sm text-slate-600">
<div>{{ $studentExit->academicYear?->name ?: '-' }}</div>
<div>{{ $studentExit->department?->name ?: '-' }}</div>
<div>{{ $studentExit->classRoom?->name ?: '-' }}</div>
</td>
<td class="px-6 py-4 text-sm text-slate-600">{{ $studentExit->exit_date?->format('d-m-Y') ?: '-' }}</td>
<td class="px-6 py-4 text-sm text-slate-600">
@if ($studentExit->exit_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>
<div class="mt-2 text-xs text-slate-500">{{ $studentExit->exit_letter_file_name }}</div>
<div class="mt-3">
<a href="{{ route('student-exits.preview-letter', $studentExit) }}" 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>
@else
<span class="inline-flex rounded-full bg-amber-100 px-3 py-1 text-xs font-semibold text-amber-700">Surat Keluar belum di upload</span>
@endif
</td>
<td class="px-6 py-4 text-sm text-slate-600">{{ $studentExit->exit_reason ?: '-' }}</td>
<td class="px-6 py-4 text-sm">
<a href="{{ route('student-exits.show', $studentExit) }}" 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>
</td>
</tr>
@empty
<tr>
<td colspan="6" class="px-6 py-10 text-center text-sm text-slate-500">Belum ada data siswa keluar.</td>
</tr>
@endforelse
</tbody>
</table>
</div>
<div class="mt-5">
{{ $studentExits->links() }}
</div>
</x-master-card>
</x-master-page>
@@ -0,0 +1,38 @@
<x-master-page title="Preview Surat Keluar" description="Lihat surat keluar siswa langsung di browser bila format mendukung.">
<div class="grid grid-cols-1 gap-6 xl:grid-cols-3">
<x-master-card title="Informasi Surat Keluar" subtitle="Metadata surat keluar siswa.">
<div class="space-y-4 text-sm text-slate-600">
<div><span class="font-semibold text-slate-800">Nama Siswa:</span> {{ $studentExit->full_name }}</div>
<div><span class="font-semibold text-slate-800">Nama File:</span> {{ $studentExit->exit_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> {{ $studentExit->exit_letter_file_size ? number_format($studentExit->exit_letter_file_size / 1024, 1) . ' KB' : '-' }}</div>
<div><span class="font-semibold text-slate-800">Tanggal Keluar:</span> {{ $studentExit->exit_date?->format('d-m-Y') ?: '-' }}</div>
<div><span class="font-semibold text-slate-800">Catatan:</span> {{ $studentExit->exit_reason ?: '-' }}</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-exits.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>
</div>
</x-master-card>
<div class="xl:col-span-2">
<x-master-card title="Tampilan Surat Keluar" 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="{{ $studentExit->exit_letter_file_name }}" class="mx-auto max-h-[70vh] rounded-xl object-contain shadow-sm">
</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 Keluar"></iframe>
</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>
</x-master-page>
@@ -0,0 +1,86 @@
<x-master-page title="Detail Arsip Siswa Keluar" description="Lihat ringkasan arsip siswa keluar dan kelola surat keluar tanpa masuk ke modul siswa aktif.">
<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 keluar.">
<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">{{ $studentExit->full_name }}</div>
</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-rose-100 px-3 py-1 text-xs font-semibold text-rose-700">Siswa Keluar</span></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">{{ $studentExit->student_number ?: '-' }}</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">{{ $studentExit->nisn ?: '-' }}</div>
</div>
</div>
</x-master-card>
<x-master-card title="Akademik Terakhir" subtitle="Data akademik terakhir sebelum status siswa menjadi keluar.">
<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">{{ $studentExit->academicYear?->name ?: '-' }}</div>
</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">{{ $studentExit->department?->name ?: '-' }}</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">{{ $studentExit->classRoom?->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">{{ $studentExit->entry_date?->format('d-m-Y') ?: '-' }}</div>
</div>
</div>
</x-master-card>
</div>
<div class="space-y-6">
<x-master-card title="Dokumen Surat Keluar" subtitle="Upload atau ganti surat keluar langsung dari modul arsip.">
<div class="space-y-4">
@if ($studentExit->exit_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 keluar sudah tersedia</div>
<div class="mt-1 text-xs text-emerald-600">{{ $studentExit->exit_letter_file_name }}</div>
<div class="mt-3">
<a href="{{ route('student-exits.preview-letter', $studentExit) }}" 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>
</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 keluar belum diupload.
</div>
@endif
<form method="POST" action="{{ route('student-exits.update', $studentExit) }}" enctype="multipart/form-data" class="space-y-4">
@csrf
@method('PATCH')
<x-form-input name="exit_date" label="Tanggal Keluar" type="date" :value="optional($studentExit->exit_date)->format('Y-m-d')" />
<x-form-textarea name="exit_reason" label="Catatan / Alasan Keluar" :value="$studentExit->exit_reason" rows="4" placeholder="Masukkan catatan tambahan bila perlu" />
<div>
<label for="exit_letter" class="mb-2 block text-sm font-medium text-slate-700">Upload / Ganti Surat Keluar</label>
<input id="exit_letter" name="exit_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">
<p class="mt-2 text-xs text-slate-500">Format: PDF, JPG, JPEG, PNG. Maksimal 2 MB.</p>
<x-input-error :messages="$errors->get('exit_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 Keluar
</button>
</form>
</div>
</x-master-card>
</div>
</div>
</x-master-page>