feat: update student import and graduation workflows
This commit is contained in:
@@ -1,86 +1,139 @@
|
||||
<div class="grid grid-cols-1 gap-5 md:grid-cols-2">
|
||||
<div class="md:col-span-2">
|
||||
<label for="student_id_search" class="mb-2 block text-sm font-medium text-slate-700">Siswa</label>
|
||||
<div class="relative" data-searchable-student-select>
|
||||
<input
|
||||
id="student_id_search"
|
||||
type="text"
|
||||
value="{{ optional($students->firstWhere('id', old('student_id', $achievement->student_id ?? null)))->full_name ? optional($students->firstWhere('id', old('student_id', $achievement->student_id ?? null)))->full_name . ' — NIS: ' . (optional($students->firstWhere('id', old('student_id', $achievement->student_id ?? null)))->student_number ?: '-') . ' — NISN: ' . (optional($students->firstWhere('id', old('student_id', $achievement->student_id ?? null)))->nisn ?: '-') : '' }}"
|
||||
class="h-12 w-full rounded-2xl border border-slate-200 bg-white px-4 pr-12 text-sm text-slate-700 placeholder:text-slate-400 focus:border-indigo-300 focus:outline-none focus:ring-4 focus:ring-indigo-100"
|
||||
placeholder="Ketik nama siswa / NIS / NISN"
|
||||
autocomplete="off"
|
||||
data-student-search-input
|
||||
required
|
||||
>
|
||||
<input type="hidden" name="student_id" value="{{ old('student_id', $achievement->student_id ?? '') }}" data-student-search-value>
|
||||
<button type="button" class="absolute inset-y-0 right-0 flex items-center px-4 text-slate-400 transition hover:text-slate-600" data-student-search-toggle aria-label="Tampilkan daftar siswa">
|
||||
<svg class="h-5 w-5" viewBox="0 0 24 24" fill="none" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.8" d="m6 9 6 6 6-6" />
|
||||
</svg>
|
||||
</button>
|
||||
<div class="absolute z-30 mt-2 hidden max-h-72 w-full overflow-auto rounded-2xl border border-slate-200 bg-white p-2 shadow-xl shadow-slate-200/60" data-student-search-dropdown>
|
||||
@foreach ($students as $studentOption)
|
||||
<button
|
||||
type="button"
|
||||
class="flex w-full flex-col rounded-xl px-3 py-3 text-left text-sm transition hover:bg-slate-50"
|
||||
data-student-option
|
||||
data-value="{{ $studentOption->id }}"
|
||||
data-label="{{ $studentOption->full_name }} — NIS: {{ $studentOption->student_number ?: '-' }} — NISN: {{ $studentOption->nisn ?: '-' }}"
|
||||
data-search="{{ strtolower($studentOption->full_name . ' ' . ($studentOption->student_number ?: '') . ' ' . ($studentOption->nisn ?: '')) }}"
|
||||
>
|
||||
<span class="font-semibold text-slate-800">{{ $studentOption->full_name }}</span>
|
||||
<span class="mt-1 text-xs text-slate-500">NIS: {{ $studentOption->student_number ?: '-' }} · NISN: {{ $studentOption->nisn ?: '-' }}</span>
|
||||
</button>
|
||||
@endforeach
|
||||
<div class="hidden px-3 py-3 text-sm text-slate-500" data-student-empty-state>Tidak ada siswa yang cocok.</div>
|
||||
@php
|
||||
$selectedStudent = $students->firstWhere('id', old('student_id', $achievement->student_id ?? null));
|
||||
@endphp
|
||||
|
||||
<div class="space-y-6">
|
||||
<div class="rounded-3xl border border-slate-200 bg-gradient-to-br from-white via-slate-50 to-amber-50/25 p-5 shadow-sm ring-1 ring-white/70">
|
||||
<div class="mb-5 flex flex-col gap-2 md:flex-row md:items-center md:justify-between">
|
||||
<div>
|
||||
<h3 class="text-base font-semibold text-slate-900">Identitas Prestasi</h3>
|
||||
<p class="mt-1 text-sm text-slate-500">Pilih siswa lalu lengkapi inti informasi prestasinya terlebih dahulu.</p>
|
||||
</div>
|
||||
<div class="inline-flex items-center rounded-full bg-amber-100 px-3 py-1 text-xs font-semibold text-amber-700">
|
||||
Field inti dulu, lampiran bisa menyusul
|
||||
</div>
|
||||
</div>
|
||||
@error('student_id')
|
||||
<p class="mt-2 text-sm text-rose-600">{{ $message }}</p>
|
||||
@enderror
|
||||
</div>
|
||||
|
||||
<x-form-input name="achievement_name" label="Nama Prestasi" :value="old('achievement_name', $achievement->achievement_name ?? '')" required />
|
||||
<x-form-input name="category" label="Kategori Prestasi" :value="old('category', $achievement->category ?? '')" placeholder="Akademik / Non Akademik / lainnya" />
|
||||
<x-form-select name="level" label="Tingkat Prestasi" :options="$levelOptions" :value="old('level', $achievement->level ?? '')" placeholder="-- Pilih tingkat --" />
|
||||
<x-form-input name="rank" label="Peringkat / Predikat" :value="old('rank', $achievement->rank ?? '')" placeholder="Juara 1 / Finalis / Best Speaker" />
|
||||
<x-form-input name="organizer" label="Penyelenggara" :value="old('organizer', $achievement->organizer ?? '')" placeholder="Nama sekolah / instansi / event" />
|
||||
<x-form-input name="achievement_year" label="Tahun Prestasi" type="number" :value="old('achievement_year', $achievement->achievement_year ?? '')" placeholder="2026" />
|
||||
<x-form-input name="achievement_date" label="Tanggal Prestasi" type="date" :value="old('achievement_date', isset($achievement->achievement_date) && $achievement->achievement_date ? $achievement->achievement_date->format('Y-m-d') : '')" />
|
||||
<div class="grid grid-cols-1 gap-5 md:grid-cols-2">
|
||||
<div class="md:col-span-2">
|
||||
<label for="student_id_search" class="mb-2 block text-sm font-medium text-slate-700">Siswa</label>
|
||||
<div class="relative" data-searchable-student-select>
|
||||
<input
|
||||
id="student_id_search"
|
||||
type="text"
|
||||
value="{{ $selectedStudent?->full_name ? $selectedStudent->full_name . ' — NIS: ' . ($selectedStudent->student_number ?: '-') . ' — NISN: ' . ($selectedStudent->nisn ?: '-') : '' }}"
|
||||
class="h-12 w-full rounded-2xl border border-slate-200 bg-white px-4 pr-12 text-sm text-slate-700 placeholder:text-slate-400 focus:border-indigo-300 focus:outline-none focus:ring-4 focus:ring-indigo-100"
|
||||
placeholder="Ketik nama siswa / NIS / NISN"
|
||||
autocomplete="off"
|
||||
data-student-search-input
|
||||
required
|
||||
>
|
||||
<input type="hidden" name="student_id" value="{{ old('student_id', $achievement->student_id ?? '') }}" data-student-search-value>
|
||||
<button type="button" class="absolute inset-y-0 right-0 flex items-center px-4 text-slate-400 transition hover:text-slate-600" data-student-search-toggle aria-label="Tampilkan daftar siswa">
|
||||
<svg class="h-5 w-5" viewBox="0 0 24 24" fill="none" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.8" d="m6 9 6 6 6-6" />
|
||||
</svg>
|
||||
</button>
|
||||
<div class="absolute z-30 mt-2 hidden max-h-72 w-full overflow-auto rounded-2xl border border-slate-200 bg-white p-2 shadow-xl shadow-slate-200/60" data-student-search-dropdown>
|
||||
@foreach ($students as $studentOption)
|
||||
<button
|
||||
type="button"
|
||||
class="flex w-full flex-col rounded-xl px-3 py-3 text-left text-sm transition hover:bg-slate-50"
|
||||
data-student-option
|
||||
data-value="{{ $studentOption->id }}"
|
||||
data-label="{{ $studentOption->full_name }} — NIS: {{ $studentOption->student_number ?: '-' }} — NISN: {{ $studentOption->nisn ?: '-' }}"
|
||||
data-search="{{ strtolower($studentOption->full_name . ' ' . ($studentOption->student_number ?: '') . ' ' . ($studentOption->nisn ?: '')) }}"
|
||||
>
|
||||
<span class="font-semibold text-slate-800">{{ $studentOption->full_name }}</span>
|
||||
<span class="mt-1 text-xs text-slate-500">NIS: {{ $studentOption->student_number ?: '-' }} · NISN: {{ $studentOption->nisn ?: '-' }}</span>
|
||||
</button>
|
||||
@endforeach
|
||||
<div class="hidden px-3 py-3 text-sm text-slate-500" data-student-empty-state>Tidak ada siswa yang cocok.</div>
|
||||
</div>
|
||||
</div>
|
||||
@if ($selectedStudent)
|
||||
<div class="mt-3 rounded-2xl border border-indigo-100 bg-indigo-50/70 px-4 py-3 text-xs text-indigo-700 shadow-sm ring-1 ring-white/70">
|
||||
Siswa terpilih: <span class="font-semibold">{{ $selectedStudent->full_name }}</span>
|
||||
@if ($selectedStudent->student_number)
|
||||
· NIS {{ $selectedStudent->student_number }}
|
||||
@endif
|
||||
@if ($selectedStudent->nisn)
|
||||
· NISN {{ $selectedStudent->nisn }}
|
||||
@endif
|
||||
</div>
|
||||
@endif
|
||||
@error('student_id')
|
||||
<p class="mt-2 text-sm text-rose-600">{{ $message }}</p>
|
||||
@enderror
|
||||
</div>
|
||||
|
||||
<div class="md:col-span-2">
|
||||
<label for="description" class="mb-2 block text-sm font-medium text-slate-700">Keterangan</label>
|
||||
<textarea id="description" name="description" rows="4" class="w-full rounded-2xl border border-slate-200 bg-white px-4 py-3 text-sm text-slate-700 focus:border-indigo-300 focus:outline-none focus:ring-4 focus:ring-indigo-100" placeholder="Catatan tambahan tentang prestasi siswa">{{ old('description', $achievement->description ?? '') }}</textarea>
|
||||
@error('description')
|
||||
<p class="mt-2 text-sm text-rose-600">{{ $message }}</p>
|
||||
@enderror
|
||||
</div>
|
||||
<x-form-input name="achievement_name" label="Nama Prestasi" :value="old('achievement_name', $achievement->achievement_name ?? '')" required />
|
||||
<x-form-input name="category" label="Kategori Prestasi" :value="old('category', $achievement->category ?? '')" placeholder="Akademik / Non Akademik / lainnya" />
|
||||
<x-form-select name="level" label="Tingkat Prestasi" :options="$levelOptions" :value="old('level', $achievement->level ?? '')" placeholder="-- Pilih tingkat --" />
|
||||
<x-form-input name="rank" label="Peringkat / Predikat" :value="old('rank', $achievement->rank ?? '')" placeholder="Juara 1 / Finalis / Best Speaker" />
|
||||
<x-form-input name="organizer" label="Penyelenggara" :value="old('organizer', $achievement->organizer ?? '')" placeholder="Nama sekolah / instansi / event" />
|
||||
|
||||
<div class="rounded-3xl border border-slate-200 bg-slate-50 p-5">
|
||||
<label for="certificate_file" class="mb-2 block text-sm font-medium text-slate-700">Upload Piagam</label>
|
||||
<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="certificate_file" name="certificate_file" type="file" class="block w-full text-sm text-slate-700 file:mr-3 file:rounded-xl file:border-0 file:bg-indigo-50 file:px-4 file:py-2.5 file:text-sm file:font-semibold file:text-indigo-700 hover:file:bg-indigo-100" accept=".pdf,.jpg,.jpeg,.png,.webp">
|
||||
<div class="grid grid-cols-1 gap-5 md:col-span-2 md:grid-cols-2">
|
||||
<x-form-input name="achievement_year" label="Tahun Prestasi" type="number" :value="old('achievement_year', $achievement->achievement_year ?? '')" placeholder="2026" />
|
||||
<x-form-input name="achievement_date" label="Tanggal Prestasi" type="date" :value="old('achievement_date', isset($achievement->achievement_date) && $achievement->achievement_date ? $achievement->achievement_date->format('Y-m-d') : '')" />
|
||||
</div>
|
||||
|
||||
<div class="md:col-span-2">
|
||||
<label for="description" class="mb-2 block text-sm font-medium text-slate-700">Keterangan</label>
|
||||
<textarea id="description" name="description" rows="4" class="w-full rounded-2xl border border-slate-200 bg-white px-4 py-3 text-sm text-slate-700 focus:border-indigo-300 focus:outline-none focus:ring-4 focus:ring-indigo-100" placeholder="Catatan tambahan tentang prestasi siswa, misalnya konteks lomba atau capaian khusus.">{{ old('description', $achievement->description ?? '') }}</textarea>
|
||||
<p class="mt-2 text-xs text-slate-500">Opsional, tapi berguna saat admin lain perlu memahami konteks prestasi ini.</p>
|
||||
@error('description')
|
||||
<p class="mt-2 text-sm text-rose-600">{{ $message }}</p>
|
||||
@enderror
|
||||
</div>
|
||||
</div>
|
||||
<p class="mt-2 text-xs text-slate-500">Format: PDF, JPG, JPEG, PNG, WEBP · maksimal 5 MB.</p>
|
||||
@if (!empty($achievement->certificate_file))
|
||||
<p class="mt-2 text-xs text-slate-500">File tersimpan: <a href="{{ asset('storage/' . $achievement->certificate_file) }}" target="_blank" class="font-semibold text-indigo-600 hover:text-indigo-700">Lihat Piagam</a></p>
|
||||
@endif
|
||||
@error('certificate_file')
|
||||
<p class="mt-2 text-sm text-rose-600">{{ $message }}</p>
|
||||
@enderror
|
||||
</div>
|
||||
|
||||
<div class="rounded-3xl border border-slate-200 bg-slate-50 p-5">
|
||||
<label for="activity_photo" class="mb-2 block text-sm font-medium text-slate-700">Upload Foto Kegiatan</label>
|
||||
<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="activity_photo" name="activity_photo" type="file" class="block w-full text-sm text-slate-700 file:mr-3 file:rounded-xl file:border-0 file:bg-emerald-50 file:px-4 file:py-2.5 file:text-sm file:font-semibold file:text-emerald-700 hover:file:bg-emerald-100" accept=".jpg,.jpeg,.png,.webp">
|
||||
<div class="grid grid-cols-1 gap-5 lg:grid-cols-2">
|
||||
<div class="rounded-3xl border border-slate-200 bg-slate-50 p-5 shadow-sm ring-1 ring-white/70">
|
||||
<div class="mb-4 flex items-start justify-between gap-3">
|
||||
<div>
|
||||
<label for="certificate_file" class="block text-sm font-medium text-slate-700">Upload Piagam</label>
|
||||
<p class="mt-1 text-xs text-slate-500">Simpan file sertifikat atau piagam bila sudah tersedia.</p>
|
||||
</div>
|
||||
<span class="rounded-full bg-indigo-100 px-3 py-1 text-[11px] font-semibold text-indigo-700">PDF / Gambar</span>
|
||||
</div>
|
||||
<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="certificate_file" name="certificate_file" type="file" class="block w-full text-sm text-slate-700 file:mr-3 file:rounded-xl file:border-0 file:bg-indigo-50 file:px-4 file:py-2.5 file:text-sm file:font-semibold file:text-indigo-700 hover:file:bg-indigo-100" accept=".pdf,.jpg,.jpeg,.png,.webp">
|
||||
</div>
|
||||
<p class="mt-2 text-xs text-slate-500">Format: PDF, JPG, JPEG, PNG, WEBP · maksimal 5 MB.</p>
|
||||
@if (!empty($achievement->certificate_file))
|
||||
<div class="mt-3 rounded-2xl border border-indigo-100 bg-white px-4 py-3 text-xs text-slate-500 shadow-sm">
|
||||
File tersimpan:
|
||||
<a href="{{ asset('storage/' . $achievement->certificate_file) }}" target="_blank" class="font-semibold text-indigo-600 hover:text-indigo-700">Lihat Piagam</a>
|
||||
</div>
|
||||
@endif
|
||||
@error('certificate_file')
|
||||
<p class="mt-2 text-sm text-rose-600">{{ $message }}</p>
|
||||
@enderror
|
||||
</div>
|
||||
|
||||
<div class="rounded-3xl border border-slate-200 bg-slate-50 p-5 shadow-sm ring-1 ring-white/70">
|
||||
<div class="mb-4 flex items-start justify-between gap-3">
|
||||
<div>
|
||||
<label for="activity_photo" class="block text-sm font-medium text-slate-700">Upload Foto Kegiatan</label>
|
||||
<p class="mt-1 text-xs text-slate-500">Tambahkan dokumentasi kegiatan jika ingin tampilan data lebih kaya.</p>
|
||||
</div>
|
||||
<span class="rounded-full bg-emerald-100 px-3 py-1 text-[11px] font-semibold text-emerald-700">Gambar</span>
|
||||
</div>
|
||||
<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="activity_photo" name="activity_photo" type="file" class="block w-full text-sm text-slate-700 file:mr-3 file:rounded-xl file:border-0 file:bg-emerald-50 file:px-4 file:py-2.5 file:text-sm file:font-semibold file:text-emerald-700 hover:file:bg-emerald-100" accept=".jpg,.jpeg,.png,.webp">
|
||||
</div>
|
||||
<p class="mt-2 text-xs text-slate-500">Format: JPG, JPEG, PNG, WEBP · maksimal 5 MB.</p>
|
||||
@if (!empty($achievement->activity_photo))
|
||||
<div class="mt-3 rounded-2xl border border-emerald-100 bg-white px-4 py-3 text-xs text-slate-500 shadow-sm">
|
||||
File tersimpan:
|
||||
<a href="{{ asset('storage/' . $achievement->activity_photo) }}" target="_blank" class="font-semibold text-emerald-600 hover:text-emerald-700">Lihat Foto</a>
|
||||
</div>
|
||||
@endif
|
||||
@error('activity_photo')
|
||||
<p class="mt-2 text-sm text-rose-600">{{ $message }}</p>
|
||||
@enderror
|
||||
</div>
|
||||
<p class="mt-2 text-xs text-slate-500">Format: JPG, JPEG, PNG, WEBP · maksimal 5 MB.</p>
|
||||
@if (!empty($achievement->activity_photo))
|
||||
<p class="mt-2 text-xs text-slate-500">File tersimpan: <a href="{{ asset('storage/' . $achievement->activity_photo) }}" target="_blank" class="font-semibold text-indigo-600 hover:text-indigo-700">Lihat Foto</a></p>
|
||||
@endif
|
||||
@error('activity_photo')
|
||||
<p class="mt-2 text-sm text-rose-600">{{ $message }}</p>
|
||||
@enderror
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,14 +1,86 @@
|
||||
<x-master-page title="Tambah Data Siswa Berprestasi" description="Catat prestasi siswa baru ke dalam sistem kesiswaan.">
|
||||
<x-master-card title="Form Prestasi Siswa" subtitle="Lengkapi data prestasi siswa lalu simpan.">
|
||||
<form method="POST" action="{{ route('student-achievements.store') }}" enctype="multipart/form-data" class="space-y-6">
|
||||
@csrf
|
||||
|
||||
@include('student-achievements._form')
|
||||
|
||||
<div class="flex items-center justify-end gap-3 pt-2">
|
||||
<a href="{{ route('student-achievements.index') }}" class="rounded-2xl border border-slate-200 px-5 py-3 text-sm font-semibold text-slate-700 transition hover:bg-slate-50">Batal</a>
|
||||
<button type="submit" class="rounded-2xl bg-slate-900 px-5 py-3 text-sm font-semibold text-white transition hover:bg-slate-800">Simpan</button>
|
||||
<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">Mode Form</div>
|
||||
<div class="mt-3 text-lg font-bold text-slate-900">Tambah Prestasi</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-plus text-lg"></i>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</x-master-card>
|
||||
</div>
|
||||
<div class="rounded-3xl border border-amber-200 bg-gradient-to-br from-white via-amber-50/50 to-amber-100/60 p-6 shadow-sm 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 text-amber-700">Fokus Input</div>
|
||||
<div class="mt-3 text-lg font-bold text-amber-800">Identitas + Capaian</div>
|
||||
</div>
|
||||
<div class="rounded-2xl bg-white/80 p-3 text-amber-600 ring-1 ring-amber-100 backdrop-blur-sm">
|
||||
<i class="fa-solid fa-award 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">Lampiran</div>
|
||||
<div class="mt-3 text-lg font-bold text-emerald-800">Opsional</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-paperclip 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">Target</div>
|
||||
<div class="mt-3 text-lg font-bold text-fuchsia-800">Entry Cepat & Rapi</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-wand-magic-sparkles text-lg"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="grid grid-cols-1 gap-6 xl:grid-cols-[minmax(0,1.8fr)_360px]">
|
||||
<x-master-card title="Form Prestasi Siswa" subtitle="Lengkapi data inti terlebih dahulu, lalu tambahkan lampiran bila sudah tersedia.">
|
||||
<form method="POST" action="{{ route('student-achievements.store') }}" enctype="multipart/form-data" class="space-y-6">
|
||||
@csrf
|
||||
|
||||
@include('student-achievements._form')
|
||||
|
||||
<div class="flex items-center justify-end gap-3 border-t border-slate-200 pt-5">
|
||||
<a href="{{ route('student-achievements.index') }}" class="inline-flex items-center gap-2 rounded-2xl border border-slate-200 px-5 py-3 text-sm font-semibold text-slate-700 transition hover:bg-slate-50">
|
||||
<i class="fa-solid fa-arrow-left"></i>
|
||||
<span>Batal</span>
|
||||
</a>
|
||||
<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-floppy-disk"></i>
|
||||
<span>Simpan</span>
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</x-master-card>
|
||||
|
||||
<x-master-card title="Tips Input Cepat" subtitle="Biar admin tidak perlu mikir ulang saat entry data prestasi.">
|
||||
<div class="space-y-4 text-sm text-slate-600">
|
||||
<div class="rounded-2xl border border-slate-200 bg-slate-50 px-4 py-4">
|
||||
<div class="flex items-center gap-2 font-semibold text-slate-800"><i class="fa-solid fa-user-check text-amber-500"></i><span>1. Pilih siswa dulu</span></div>
|
||||
<p class="mt-1 text-slate-500">Gunakan pencarian nama, NIS, atau NISN supaya tidak salah kaitkan prestasi.</p>
|
||||
</div>
|
||||
<div class="rounded-2xl border border-slate-200 bg-slate-50 px-4 py-4">
|
||||
<div class="flex items-center gap-2 font-semibold text-slate-800"><i class="fa-solid fa-star text-indigo-500"></i><span>2. Isi nama prestasi yang spesifik</span></div>
|
||||
<p class="mt-1 text-slate-500">Contoh yang bagus: Olimpiade Matematika Kabupaten, bukan hanya "Lomba Matematika".</p>
|
||||
</div>
|
||||
<div class="rounded-2xl border border-slate-200 bg-slate-50 px-4 py-4">
|
||||
<div class="flex items-center gap-2 font-semibold text-slate-800"><i class="fa-solid fa-file-circle-plus text-emerald-500"></i><span>3. Lampiran tidak wajib langsung</span></div>
|
||||
<p class="mt-1 text-slate-500">Kalau piagam atau foto belum ada, data tetap bisa disimpan dulu lalu diedit belakangan.</p>
|
||||
</div>
|
||||
</div>
|
||||
</x-master-card>
|
||||
</div>
|
||||
</x-master-page>
|
||||
|
||||
@@ -1,15 +1,90 @@
|
||||
<x-master-page title="Edit Data Siswa Berprestasi" description="Perbarui data prestasi siswa yang sudah tersimpan.">
|
||||
<x-master-card title="Form Edit Prestasi Siswa" subtitle="Sesuaikan data prestasi lalu simpan perubahan.">
|
||||
<form method="POST" action="{{ route('student-achievements.update', $achievement) }}" enctype="multipart/form-data" class="space-y-6">
|
||||
@csrf
|
||||
@method('PUT')
|
||||
|
||||
@include('student-achievements._form')
|
||||
|
||||
<div class="flex items-center justify-end gap-3 pt-2">
|
||||
<a href="{{ route('student-achievements.index') }}" class="rounded-2xl border border-slate-200 px-5 py-3 text-sm font-semibold text-slate-700 transition hover:bg-slate-50">Batal</a>
|
||||
<button type="submit" class="rounded-2xl bg-slate-900 px-5 py-3 text-sm font-semibold text-white transition hover:bg-slate-800">Simpan Perubahan</button>
|
||||
@php
|
||||
$filterReviewIcon = 'fa-filter';
|
||||
@endphp
|
||||
<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">Mode Form</div>
|
||||
<div class="mt-3 text-lg font-bold text-slate-900">Edit Prestasi</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-pen text-lg"></i>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</x-master-card>
|
||||
</div>
|
||||
<div class="rounded-3xl border border-amber-200 bg-gradient-to-br from-white via-amber-50/50 to-amber-100/60 p-6 shadow-sm 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 text-amber-700">Fokus Review</div>
|
||||
<div class="mt-3 text-lg font-bold text-amber-800">Kategori & Tingkat</div>
|
||||
</div>
|
||||
<div class="rounded-2xl bg-white/80 p-3 text-amber-600 ring-1 ring-amber-100 backdrop-blur-sm">
|
||||
<i class="fa-solid fa-layer-group 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">Lampiran Lama</div>
|
||||
<div class="mt-3 text-lg font-bold text-emerald-800">Tetap Aman</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-shield-check 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">Target</div>
|
||||
<div class="mt-3 text-lg font-bold text-fuchsia-800">Update Konsisten</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-arrows-rotate text-lg"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="grid grid-cols-1 gap-6 xl:grid-cols-[minmax(0,1.8fr)_360px]">
|
||||
<x-master-card title="Form Edit Prestasi Siswa" subtitle="Sesuaikan data inti, cek kembali lampiran, lalu simpan perubahan.">
|
||||
<form method="POST" action="{{ route('student-achievements.update', $achievement) }}" enctype="multipart/form-data" class="space-y-6">
|
||||
@csrf
|
||||
@method('PUT')
|
||||
|
||||
@include('student-achievements._form')
|
||||
|
||||
<div class="flex items-center justify-end gap-3 border-t border-slate-200 pt-5">
|
||||
<a href="{{ route('student-achievements.index') }}" class="inline-flex items-center gap-2 rounded-2xl border border-slate-200 px-5 py-3 text-sm font-semibold text-slate-700 transition hover:bg-slate-50">
|
||||
<i class="fa-solid fa-arrow-left"></i>
|
||||
<span>Batal</span>
|
||||
</a>
|
||||
<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-floppy-disk"></i>
|
||||
<span>Simpan Perubahan</span>
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</x-master-card>
|
||||
|
||||
<x-master-card title="Checklist Review" subtitle="Biar perubahan tidak cuma rapi, tapi juga konsisten.">
|
||||
<div class="space-y-4 text-sm text-slate-600">
|
||||
<div class="rounded-2xl border border-slate-200 bg-slate-50 px-4 py-4">
|
||||
<div class="flex items-center gap-2 font-semibold text-slate-800"><i class="fa-solid fa-link text-amber-500"></i><span>Pastikan siswa tetap benar</span></div>
|
||||
<p class="mt-1 text-slate-500">Kalau prestasi awalnya salah tempel ke siswa, perbaiki relasinya dari sini.</p>
|
||||
</div>
|
||||
<div class="rounded-2xl border border-slate-200 bg-slate-50 px-4 py-4">
|
||||
<div class="flex items-center gap-2 font-semibold text-slate-800"><i class="fa-solid {{ $filterReviewIcon }} text-indigo-500"></i><span>Cek tingkat dan kategori</span></div>
|
||||
<p class="mt-1 text-slate-500">Dua field ini penting untuk filter, rekap, dan kualitas data ke depan.</p>
|
||||
</div>
|
||||
<div class="rounded-2xl border border-slate-200 bg-slate-50 px-4 py-4">
|
||||
<div class="flex items-center gap-2 font-semibold text-slate-800"><i class="fa-solid fa-lock text-emerald-500"></i><span>Lampiran lama tetap aman</span></div>
|
||||
<p class="mt-1 text-slate-500">File lama hanya terganti jika admin mengunggah file baru saat edit.</p>
|
||||
</div>
|
||||
</div>
|
||||
</x-master-card>
|
||||
</div>
|
||||
</x-master-page>
|
||||
|
||||
@@ -1,98 +1,271 @@
|
||||
<x-master-page title="Data Siswa Berprestasi" description="Kelola data prestasi siswa berdasarkan capaian akademik maupun non-akademik." action-label="Tambah Data Prestasi" :action-url="route('student-achievements.create')">
|
||||
<div class="grid grid-cols-1 gap-4 md:grid-cols-2">
|
||||
<div class="rounded-3xl border border-slate-200 bg-white p-6 shadow-sm shadow-slate-200/50">
|
||||
<div class="text-sm font-medium text-slate-500">Total Prestasi</div>
|
||||
<div class="mt-3 text-3xl font-bold text-slate-900">{{ $summary['total'] }}</div>
|
||||
<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 Prestasi</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-trophy text-lg"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="rounded-3xl border border-indigo-200 bg-indigo-50 p-6 shadow-sm shadow-indigo-100/50">
|
||||
<div class="text-sm font-medium text-indigo-700">Hasil Filter</div>
|
||||
<div class="mt-3 text-3xl font-bold text-indigo-800">{{ $summary['filtered'] }}</div>
|
||||
|
||||
<div class="group rounded-3xl border border-amber-200 bg-gradient-to-br from-white via-amber-50/50 to-amber-100/60 p-6 shadow-sm shadow-amber-100/50 ring-1 ring-white/70 transition hover:-translate-y-0.5 hover:shadow-lg hover:shadow-amber-200/60">
|
||||
<div class="flex items-start justify-between gap-3">
|
||||
<div>
|
||||
<div class="text-sm font-medium text-amber-700">Siswa Berprestasi</div>
|
||||
<div class="mt-3 text-3xl font-bold text-amber-800">{{ $summary['students'] }}</div>
|
||||
</div>
|
||||
<div class="rounded-2xl bg-white/80 p-3 text-amber-600 ring-1 ring-amber-100 backdrop-blur-sm">
|
||||
<i class="fa-solid fa-medal text-lg"></i>
|
||||
</div>
|
||||
</div>
|
||||
</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">Ada Piagam</div>
|
||||
<div class="mt-3 text-3xl font-bold text-emerald-800">{{ $summary['with_certificate'] }}</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 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">Prestasi 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_year'] ? 'Tahun terbaru ' . $summary['latest_year'] : 'Belum ada tahun prestasi' }}</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>
|
||||
|
||||
<x-master-card title="Filter Data Siswa Berprestasi" subtitle="Cari berdasarkan nama siswa, NIS, NISN, kategori, atau tingkat prestasi.">
|
||||
<form method="GET" action="{{ route('student-achievements.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 / prestasi" />
|
||||
<x-form-select name="academic_year_id" label="Tahun Angkatan" :options="$academicYears->all()" :value="$filters['academic_year_id']" />
|
||||
<x-form-select name="class_id" label="Kelas" :options="$classes->all()" :value="$filters['class_id']" />
|
||||
<div class="grid grid-cols-1 gap-6 xl:grid-cols-[1.15fr_0.85fr]">
|
||||
<x-master-card title="Filter Data Siswa Berprestasi" subtitle="Cari lebih cepat berdasarkan siswa, rombel, kategori, atau tingkat prestasi.">
|
||||
<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-achievements.index') }}" class="grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-5">
|
||||
<x-form-input name="search" label="Pencarian" :value="$search" placeholder="Nama / NIS / NISN / prestasi" />
|
||||
<x-form-select name="academic_year_id" label="Tahun Angkatan" :options="$academicYears->all()" :value="$filters['academic_year_id']" />
|
||||
<x-form-select name="class_id" label="Kelas" :options="$classes->all()" :value="$filters['class_id']" />
|
||||
<x-form-select name="category" label="Kategori" :options="$categoryOptions->all()" :value="$filters['category']" placeholder="Semua kategori" />
|
||||
<x-form-select name="level" label="Tingkat Prestasi" :options="$levelOptions" :value="$filters['level']" placeholder="Semua tingkat" />
|
||||
|
||||
<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-achievements.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="flex flex-wrap items-end gap-3 md:col-span-2 xl:col-span-5">
|
||||
<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>Terapkan Filter</span>
|
||||
</button>
|
||||
<a href="{{ route('student-achievements.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>
|
||||
</form>
|
||||
</x-master-card>
|
||||
</x-master-card>
|
||||
|
||||
<x-data-table :headers="['Siswa', 'Prestasi', 'Akademik', 'Lampiran', 'Waktu', 'Aksi']">
|
||||
@forelse ($achievements as $achievement)
|
||||
<tr>
|
||||
<td class="px-6 py-4 text-sm text-slate-600">
|
||||
<div class="font-semibold text-slate-800">{{ $achievement->student?->full_name ?: '-' }}</div>
|
||||
<div class="mt-1 text-xs text-slate-500">NIS: {{ $achievement->student?->student_number ?: '-' }} · NISN: {{ $achievement->student?->nisn ?: '-' }}</div>
|
||||
</td>
|
||||
<td class="px-6 py-4 text-sm text-slate-600">
|
||||
<div class="font-semibold text-slate-800">{{ $achievement->achievement_name }}</div>
|
||||
<div class="mt-1 text-xs text-slate-500">
|
||||
{{ $achievement->category ?: 'Tanpa kategori' }}
|
||||
@if($achievement->rank)
|
||||
· {{ $achievement->rank }}
|
||||
@endif
|
||||
</div>
|
||||
<div class="mt-1 text-xs text-slate-500"><span class="font-semibold text-slate-600">Tingkat:</span> {{ $achievement->level ?: '-' }}</div>
|
||||
<div class="mt-1 text-xs text-slate-400"><span class="font-semibold text-slate-500">Penyelenggara:</span> {{ $achievement->organizer ?: 'Belum diisi' }}</div>
|
||||
</td>
|
||||
<td class="px-6 py-4 text-sm text-slate-600">
|
||||
<div>{{ $achievement->student?->academicYear?->name ?: '-' }}</div>
|
||||
<div>{{ $achievement->student?->department?->name ?: '-' }}</div>
|
||||
<div>{{ $achievement->student?->classRoom?->name ?: '-' }}</div>
|
||||
</td>
|
||||
<td class="px-6 py-4 text-sm text-slate-600">
|
||||
<div class="flex flex-col gap-2">
|
||||
@if($achievement->certificate_file)
|
||||
@php
|
||||
$certificateUrl = asset('storage/' . $achievement->certificate_file);
|
||||
$certificateExtension = strtolower(pathinfo($achievement->certificate_file, PATHINFO_EXTENSION));
|
||||
$certificateIsImage = in_array($certificateExtension, ['jpg', 'jpeg', 'png', 'webp']);
|
||||
@endphp
|
||||
@if($certificateIsImage)
|
||||
<button type="button" data-lightbox-trigger data-lightbox-src="{{ $certificateUrl }}" data-lightbox-title="Piagam — {{ $achievement->achievement_name }}" class="inline-flex w-fit items-center rounded-xl border border-indigo-200 bg-indigo-50 px-3 py-2 text-xs font-semibold text-indigo-700 transition hover:bg-indigo-100">Lihat Piagam</button>
|
||||
@else
|
||||
<a href="{{ $certificateUrl }}" target="_blank" class="inline-flex w-fit items-center rounded-xl border border-indigo-200 bg-indigo-50 px-3 py-2 text-xs font-semibold text-indigo-700 transition hover:bg-indigo-100">Lihat Piagam</a>
|
||||
@endif
|
||||
@else
|
||||
<span class="text-xs text-slate-400">Piagam belum diunggah</span>
|
||||
@endif
|
||||
<x-master-card title="Aktivitas Terbaru" subtitle="Tiga catatan prestasi yang paling akhir masuk ke sistem.">
|
||||
@if ($recentAchievements->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 data prestasi terbaru untuk ditampilkan.
|
||||
</div>
|
||||
@else
|
||||
<div class="space-y-3">
|
||||
@foreach ($recentAchievements as $recentAchievement)
|
||||
<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">{{ $recentAchievement->achievement_name }}</div>
|
||||
<div class="mt-1 text-xs text-slate-500">{{ $recentAchievement->student?->full_name ?: '-' }}</div>
|
||||
</div>
|
||||
@if ($recentAchievement->level)
|
||||
<span class="rounded-full bg-amber-100 px-3 py-1 text-[11px] font-semibold text-amber-700">{{ $recentAchievement->level }}</span>
|
||||
@endif
|
||||
</div>
|
||||
<div class="mt-3 flex flex-wrap gap-2 text-xs text-slate-500">
|
||||
<span class="rounded-full bg-white px-3 py-1 ring-1 ring-slate-200">{{ $recentAchievement->category ?: 'Tanpa kategori' }}</span>
|
||||
<span class="rounded-full bg-white px-3 py-1 ring-1 ring-slate-200">{{ $recentAchievement->achievement_year ?: 'Tahun belum diisi' }}</span>
|
||||
@if ($recentAchievement->achievement_date)
|
||||
<span class="rounded-full bg-white px-3 py-1 ring-1 ring-slate-200">{{ $recentAchievement->achievement_date->format('d M Y') }}</span>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
@endif
|
||||
</x-master-card>
|
||||
</div>
|
||||
|
||||
@if($achievement->activity_photo)
|
||||
<button type="button" data-lightbox-trigger data-lightbox-src="{{ asset('storage/' . $achievement->activity_photo) }}" data-lightbox-title="Foto Kegiatan — {{ $achievement->achievement_name }}" class="inline-flex w-fit items-center rounded-xl border border-emerald-200 bg-emerald-50 px-3 py-2 text-xs font-semibold text-emerald-700 transition hover:bg-emerald-100">Lihat Foto Kegiatan</button>
|
||||
@else
|
||||
<span class="text-xs text-slate-400">Foto kegiatan belum diunggah</span>
|
||||
@endif
|
||||
</div>
|
||||
</td>
|
||||
<td class="px-6 py-4 text-sm text-slate-600">
|
||||
<div>Tahun: {{ $achievement->achievement_year ?: '-' }}</div>
|
||||
<div class="mt-1">Tanggal: {{ $achievement->achievement_date?->format('d-m-Y') ?: '-' }}</div>
|
||||
</td>
|
||||
<td class="px-6 py-4">
|
||||
<div class="flex flex-wrap items-center gap-2">
|
||||
<a href="{{ route('student-achievements.edit', $achievement) }}" class="rounded-xl border border-slate-200 px-3 py-2 text-xs font-semibold text-slate-700 transition hover:bg-slate-50">Edit</a>
|
||||
<form action="{{ route('student-achievements.destroy', $achievement) }}" method="POST" class="delete-form" data-entity="data prestasi {{ $achievement->achievement_name }}">
|
||||
@csrf
|
||||
@method('DELETE')
|
||||
<button type="submit" class="rounded-xl border border-rose-200 px-3 py-2 text-xs font-semibold text-rose-600 transition hover:bg-rose-50">Hapus</button>
|
||||
</form>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
@empty
|
||||
<tr>
|
||||
<td colspan="6" class="px-6 py-10 text-center text-sm text-slate-500">Belum ada data siswa berprestasi.</td>
|
||||
</tr>
|
||||
@endforelse
|
||||
</x-data-table>
|
||||
<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-3 lg:flex-row lg:items-center lg:justify-between">
|
||||
<div>
|
||||
<div class="text-lg font-semibold text-slate-800">Daftar Prestasi</div>
|
||||
<div class="mt-1 text-sm text-slate-500">Tabel utama untuk review, edit, dan bersih-bersih data prestasi siswa.</div>
|
||||
</div>
|
||||
<div class="flex flex-wrap items-center gap-2 text-[11px] font-semibold uppercase tracking-[0.16em] text-slate-500">
|
||||
<span class="inline-flex items-center gap-2 rounded-full bg-slate-900 px-3 py-1.5 text-white shadow-sm">
|
||||
<i class="fa-solid fa-table-list"></i>
|
||||
{{ $achievements->total() }} data cocok
|
||||
</span>
|
||||
@if ($filters['category'])
|
||||
<span class="rounded-full bg-amber-50 px-3 py-1.5 text-amber-700">Kategori: {{ $filters['category'] }}</span>
|
||||
@endif
|
||||
@if ($filters['level'])
|
||||
<span class="rounded-full bg-emerald-50 px-3 py-1.5 text-emerald-700">Tingkat: {{ $filters['level'] }}</span>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
{{ $achievements->links() }}
|
||||
<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">Prestasi</th>
|
||||
<th class="px-6 py-4 text-left text-xs font-semibold uppercase tracking-[0.16em] text-slate-500">Akademik</th>
|
||||
<th class="px-6 py-4 text-left text-xs font-semibold uppercase tracking-[0.16em] text-slate-500">Lampiran</th>
|
||||
<th class="px-6 py-4 text-left text-xs font-semibold uppercase tracking-[0.16em] text-slate-500">Waktu</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 ($achievements as $achievement)
|
||||
<tr class="transition hover:bg-slate-50/80">
|
||||
<td class="px-6 py-4 text-sm text-slate-600">
|
||||
<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($achievement->student?->full_name ?: '-', 0, 1)) }}
|
||||
</div>
|
||||
<div>
|
||||
<div class="font-semibold text-slate-800">{{ $achievement->student?->full_name ?: '-' }}</div>
|
||||
<div class="mt-1 text-xs text-slate-500">NIS: {{ $achievement->student?->student_number ?: '-' }} · NISN: {{ $achievement->student?->nisn ?: '-' }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<td class="px-6 py-4 text-sm text-slate-600">
|
||||
<div class="font-semibold text-slate-800">{{ $achievement->achievement_name }}</div>
|
||||
<div class="mt-2 flex flex-wrap gap-2 text-xs">
|
||||
<span class="rounded-full bg-slate-100 px-3 py-1 font-medium text-slate-600">{{ $achievement->category ?: 'Tanpa kategori' }}</span>
|
||||
@if($achievement->level)
|
||||
<span class="rounded-full bg-amber-100 px-3 py-1 font-medium text-amber-700">{{ $achievement->level }}</span>
|
||||
@endif
|
||||
@if($achievement->rank)
|
||||
<span class="rounded-full bg-indigo-100 px-3 py-1 font-medium text-indigo-700">{{ $achievement->rank }}</span>
|
||||
@endif
|
||||
</div>
|
||||
<div class="mt-2 text-xs text-slate-500"><span class="font-semibold text-slate-600">Penyelenggara:</span> {{ $achievement->organizer ?: 'Belum diisi' }}</div>
|
||||
@if ($achievement->description)
|
||||
<div class="mt-2 line-clamp-2 text-xs text-slate-400">{{ $achievement->description }}</div>
|
||||
@endif
|
||||
</td>
|
||||
<td class="px-6 py-4 text-sm text-slate-600">
|
||||
<div class="font-medium text-slate-700">{{ $achievement->student?->academicYear?->name ?: '-' }}</div>
|
||||
<div>{{ $achievement->student?->department?->name ?: '-' }}</div>
|
||||
<div class="text-xs text-slate-500">{{ $achievement->student?->classRoom?->name ?: '-' }}</div>
|
||||
</td>
|
||||
<td class="px-6 py-4 text-sm text-slate-600">
|
||||
<div class="flex flex-col gap-2">
|
||||
@if($achievement->certificate_file)
|
||||
@php
|
||||
$certificateUrl = asset('storage/' . $achievement->certificate_file);
|
||||
$certificateExtension = strtolower(pathinfo($achievement->certificate_file, PATHINFO_EXTENSION));
|
||||
$certificateIsImage = in_array($certificateExtension, ['jpg', 'jpeg', 'png', 'webp']);
|
||||
@endphp
|
||||
@if($certificateIsImage)
|
||||
<button type="button" data-lightbox-trigger data-lightbox-src="{{ $certificateUrl }}" data-lightbox-title="Piagam — {{ $achievement->achievement_name }}" class="inline-flex w-fit items-center gap-2 rounded-xl border border-indigo-200 bg-indigo-50 px-3 py-2 text-xs font-semibold text-indigo-700 transition hover:bg-indigo-100">
|
||||
<i class="fa-solid fa-file-image"></i>
|
||||
<span>Lihat Piagam</span>
|
||||
</button>
|
||||
@else
|
||||
<a href="{{ $certificateUrl }}" target="_blank" class="inline-flex w-fit items-center gap-2 rounded-xl border border-indigo-200 bg-indigo-50 px-3 py-2 text-xs font-semibold text-indigo-700 transition hover:bg-indigo-100">
|
||||
<i class="fa-solid fa-file-pdf"></i>
|
||||
<span>Buka Piagam</span>
|
||||
</a>
|
||||
@endif
|
||||
@else
|
||||
<span class="inline-flex w-fit 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>Piagam belum ada</span>
|
||||
</span>
|
||||
@endif
|
||||
|
||||
@if($achievement->activity_photo)
|
||||
<button type="button" data-lightbox-trigger data-lightbox-src="{{ asset('storage/' . $achievement->activity_photo) }}" data-lightbox-title="Foto Kegiatan — {{ $achievement->achievement_name }}" class="inline-flex w-fit items-center gap-2 rounded-xl border border-emerald-200 bg-emerald-50 px-3 py-2 text-xs font-semibold text-emerald-700 transition hover:bg-emerald-100">
|
||||
<i class="fa-solid fa-camera"></i>
|
||||
<span>Lihat Foto</span>
|
||||
</button>
|
||||
@else
|
||||
<span class="inline-flex w-fit items-center gap-2 rounded-full bg-slate-100 px-3 py-1 text-xs font-semibold text-slate-600">
|
||||
<i class="fa-solid fa-image"></i>
|
||||
<span>Foto belum ada</span>
|
||||
</span>
|
||||
@endif
|
||||
</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>{{ $achievement->achievement_year ?: '-' }}</span>
|
||||
</div>
|
||||
<div class="mt-2 text-xs text-slate-500">{{ $achievement->achievement_date?->format('d-m-Y') ?: 'Tanggal belum diisi' }}</div>
|
||||
</td>
|
||||
<td class="px-6 py-4">
|
||||
<div class="flex flex-wrap items-center gap-2">
|
||||
<a href="{{ route('student-achievements.edit', $achievement) }}" class="inline-flex items-center gap-2 rounded-xl border border-slate-200 px-3 py-2 text-xs font-semibold text-slate-700 transition hover:bg-slate-50">
|
||||
<i class="fa-solid fa-pen"></i>
|
||||
<span>Edit</span>
|
||||
</a>
|
||||
<form action="{{ route('student-achievements.destroy', $achievement) }}" method="POST" class="delete-form" data-entity="data prestasi {{ $achievement->achievement_name }}">
|
||||
@csrf
|
||||
@method('DELETE')
|
||||
<button type="submit" class="inline-flex items-center gap-2 rounded-xl border border-rose-200 px-3 py-2 text-xs font-semibold text-rose-600 transition hover:bg-rose-50">
|
||||
<i class="fa-solid fa-trash"></i>
|
||||
<span>Hapus</span>
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
@empty
|
||||
<tr>
|
||||
<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 berprestasi.</div>
|
||||
<div class="mt-2 text-sm text-slate-500">Mulai dari menambahkan prestasi pertama, atau longgarkan filter jika data seharusnya sudah ada.</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
@endforelse
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mt-6 flex justify-end">
|
||||
{{ $achievements->onEachSide(1)->links() }}
|
||||
</div>
|
||||
</x-master-page>
|
||||
|
||||
Reference in New Issue
Block a user