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
+23
View File
@@ -0,0 +1,23 @@
<x-master-page title="Tambah Kelas" description="Tambahkan kelas baru sesuai tahun angkatan dan program keahlian.">
<x-master-card title="Form Kelas" subtitle="Lengkapi data kelas sebelum disimpan.">
<form action="{{ route('classes.store') }}" method="POST" class="space-y-6">
@csrf
<div class="grid grid-cols-1 gap-6 md:grid-cols-2">
<x-form-select name="academic_year_id" label="Tahun Angkatan" :options="$academicYears->all()" required />
<x-form-select name="department_id" label="Program Keahlian" :options="$departments->all()" required />
<x-form-input name="name" label="Nama Kelas" placeholder="Contoh: X RPL 1" required />
<x-form-select name="level" label="Tingkat" :options="['X' => 'X', 'XI' => 'XI', 'XII' => 'XII']" required />
<x-form-input name="homeroom_teacher" label="Wali Kelas" placeholder="Nama wali kelas" />
<x-form-input name="capacity" label="Kapasitas" type="number" placeholder="Contoh: 36" />
</div>
<x-form-checkbox name="is_active" label="Kelas aktif" :checked="true" />
<div class="flex flex-wrap items-center gap-3">
<button type="submit" class="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</button>
<a href="{{ route('classes.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>
</div>
</form>
</x-master-card>
</x-master-page>
+24
View File
@@ -0,0 +1,24 @@
<x-master-page title="Edit Kelas" description="Perbarui data kelas yang sudah ada.">
<x-master-card title="Form Edit Kelas" subtitle="Sesuaikan data kelas lalu simpan perubahan.">
<form action="{{ route('classes.update', $class) }}" method="POST" class="space-y-6">
@csrf
@method('PUT')
<div class="grid grid-cols-1 gap-6 md:grid-cols-2">
<x-form-select name="academic_year_id" label="Tahun Angkatan" :options="$academicYears->all()" :value="$class->academic_year_id" required />
<x-form-select name="department_id" label="Program Keahlian" :options="$departments->all()" :value="$class->department_id" required />
<x-form-input name="name" label="Nama Kelas" :value="$class->name" placeholder="Contoh: X RPL 1" required />
<x-form-select name="level" label="Tingkat" :options="['X' => 'X', 'XI' => 'XI', 'XII' => 'XII']" :value="$class->level" required />
<x-form-input name="homeroom_teacher" label="Wali Kelas" :value="$class->homeroom_teacher" placeholder="Nama wali kelas" />
<x-form-input name="capacity" label="Kapasitas" type="number" :value="$class->capacity" placeholder="Contoh: 36" />
</div>
<x-form-checkbox name="is_active" label="Kelas aktif" :checked="$class->is_active" />
<div class="flex flex-wrap items-center gap-3">
<button type="submit" class="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">Update</button>
<a href="{{ route('classes.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>
</div>
</form>
</x-master-card>
</x-master-page>
+112
View File
@@ -0,0 +1,112 @@
<x-master-page
title="Kelas"
description="Kelola data kelas berdasarkan tahun angkatan dan program keahlian."
action-label="Tambah Kelas"
:action-url="route('classes.create')"
>
<x-master-card title="Generate Kelas Tahun Ajaran Baru" subtitle="Salin kelas dari tahun ajaran sumber ke tahun ajaran target. Cocok untuk menyiapkan kelas tahun ajaran baru sebelum promosi siswa.">
<form method="POST" action="{{ route('classes.generate') }}" class="grid grid-cols-1 gap-4 xl:grid-cols-4 xl:items-end">
@csrf
<div>
<label for="source_academic_year_id" class="mb-2 block text-sm font-medium text-slate-700">Tahun Ajaran Sumber</label>
<select id="source_academic_year_id" name="source_academic_year_id" 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-2 focus:ring-indigo-100">
<option value="">Pilih tahun sumber</option>
@foreach ($academicYears as $academicYear)
<option value="{{ $academicYear->id }}">{{ $academicYear->name }}</option>
@endforeach
</select>
</div>
<div>
<label for="target_academic_year_id" class="mb-2 block text-sm font-medium text-slate-700">Tahun Ajaran Target</label>
<select id="target_academic_year_id" name="target_academic_year_id" 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-2 focus:ring-indigo-100">
<option value="">Pilih tahun target</option>
@foreach ($academicYears as $academicYear)
<option value="{{ $academicYear->id }}">{{ $academicYear->name }}</option>
@endforeach
</select>
</div>
<div>
<label for="generation_mode" class="mb-2 block text-sm font-medium text-slate-700">Mode Generate</label>
<select id="generation_mode" name="generation_mode" 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-2 focus:ring-indigo-100">
<option value="promote_level">Naikkan level kelas (X→XI, XI→XII)</option>
<option value="same_level">Salin level yang sama</option>
</select>
</div>
<div>
<button type="submit" class="inline-flex w-full items-center justify-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">
Generate Kelas
</button>
</div>
</form>
<div class="mt-4 rounded-2xl border border-sky-200 bg-sky-50 px-4 py-3 text-sm text-sky-700">
Tips: untuk persiapan promosi siswa, biasanya pilih mode <span class="font-semibold">Naikkan level kelas</span> agar kelas X pada tahun lama menjadi XI di tahun baru, dan XI menjadi XII.
</div>
</x-master-card>
<x-master-card title="Filter Data" subtitle="Cari berdasarkan nama kelas, tingkat, atau wali kelas.">
<form method="GET" action="{{ route('classes.index') }}" class="flex flex-col gap-4 md:flex-row md:items-end">
<div class="md:flex-1">
<x-form-input name="search" label="Pencarian" :value="$search" placeholder="Cari kelas..." />
</div>
<div class="flex items-end gap-3">
<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('classes.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-data-table :headers="['Nama Kelas', 'Tingkat', 'Tahun Angkatan', 'Program Keahlian', 'Dipakai', 'Histori', 'Status', 'Aksi']">
@forelse ($classes as $class)
<tr>
<td class="px-6 py-4">
<div class="font-semibold text-slate-800">{{ $class->name }}</div>
<div class="text-xs text-slate-400">Wali Kelas: {{ $class->homeroom_teacher ?: '-' }}</div>
</td>
<td class="px-6 py-4 text-sm text-slate-600">{{ $class->level }}</td>
<td class="px-6 py-4 text-sm text-slate-600">{{ $class->academicYear?->name }}</td>
<td class="px-6 py-4 text-sm text-slate-600">{{ $class->department?->name }}</td>
<td class="px-6 py-4">
<span class="rounded-full bg-indigo-100 px-3 py-1 text-xs font-semibold text-indigo-700">Siswa: {{ $class->students_count }}</span>
</td>
<td class="px-6 py-4">
<span class="rounded-full bg-sky-100 px-3 py-1 text-xs font-semibold text-sky-700">Histori: {{ $class->academic_histories_count }}</span>
</td>
<td class="px-6 py-4">
@if ($class->is_active)
<span class="rounded-full bg-emerald-100 px-3 py-1 text-xs font-semibold text-emerald-700">Aktif</span>
@else
<span class="rounded-full bg-slate-100 px-3 py-1 text-xs font-semibold text-slate-600">Nonaktif</span>
@endif
</td>
<td class="px-6 py-4">
<div class="flex flex-wrap items-center gap-2">
<a href="{{ route('classes.edit', $class) }}" 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>
@if ($class->students_count === 0 && $class->academic_histories_count === 0)
<form action="{{ route('classes.destroy', $class) }}" method="POST" class="delete-form" data-entity="kelas {{ $class->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>
@else
<button type="button" disabled class="cursor-not-allowed rounded-xl border border-slate-200 bg-slate-100 px-3 py-2 text-xs font-semibold text-slate-400" title="Tidak bisa dihapus karena masih dipakai data siswa atau histori akademik">
Dipakai
</button>
@endif
</div>
</td>
</tr>
@empty
<tr>
<td colspan="8" class="px-6 py-10 text-center text-sm text-slate-500">Belum ada data kelas.</td>
</tr>
@endforelse
</x-data-table>
<div>
{{ $classes->links() }}
</div>
</x-master-page>