diff --git a/app/Http/Controllers/Guru/MapelController.php b/app/Http/Controllers/Guru/MapelController.php index f71cb90..1f607e2 100644 --- a/app/Http/Controllers/Guru/MapelController.php +++ b/app/Http/Controllers/Guru/MapelController.php @@ -97,4 +97,105 @@ public function storeTugas(Request $request) return redirect()->route('guru.mapel.index') ->with('success', 'Tugas berhasil dibuat!'); } + + /** + * History semua materi yang dibuat guru ini + */ + public function historyMateri() + { + $guru = Auth::guard('guru')->user(); + + // Ambil id_mengajar milik guru ini + $idMengajars = Mengajar::where('id_guru', $guru->id_guru) + ->pluck('id_mengajar'); + + $materiList = Materi::with(['mengajar.mapel', 'mengajar.kelas']) + ->whereIn('id_mengajar', $idMengajars) + ->orderBy('created_at', 'desc') + ->paginate(15); + + return view('guru.materi.history', compact('materiList')); + } + + /** + * Hapus materi + */ + public function destroyMateri($id) + { + $guru = Auth::guard('guru')->user(); + + $idMengajars = Mengajar::where('id_guru', $guru->id_guru)->pluck('id_mengajar'); + + $materi = Materi::whereIn('id_mengajar', $idMengajars) + ->where('id_materi', $id) + ->firstOrFail(); + + // Hapus file jika ada + if ($materi->lampiran_materi && \Storage::disk('public')->exists($materi->lampiran_materi)) { + \Storage::disk('public')->delete($materi->lampiran_materi); + } + + $materi->delete(); + + return redirect()->route('guru.materi.history') + ->with('success', 'Materi berhasil dihapus.'); + } + + /** + * History semua tugas yang dibuat guru ini + */ + public function historyTugas() + { + $guru = Auth::guard('guru')->user(); + + $idMengajars = Mengajar::where('id_guru', $guru->id_guru) + ->pluck('id_mengajar'); + + $tugasList = Tugas::with(['mengajar.mapel', 'mengajar.kelas', 'pengumpulanTugas']) + ->whereIn('id_mengajar', $idMengajars) + ->orderBy('created_at', 'desc') + ->paginate(15); + + return view('guru.tugas.history', compact('tugasList')); + } + + /** + * Detail tugas + daftar pengumpulan siswa + */ + public function detailTugas($id) + { + $guru = Auth::guard('guru')->user(); + + $idMengajars = Mengajar::where('id_guru', $guru->id_guru)->pluck('id_mengajar'); + + $tugas = Tugas::with([ + 'mengajar.mapel', + 'mengajar.kelas', + 'pengumpulanTugas.siswa', + ]) + ->whereIn('id_mengajar', $idMengajars) + ->where('id_tugas', $id) + ->firstOrFail(); + + return view('guru.tugas.detail', compact('tugas')); + } + + /** + * Hapus tugas + */ + public function destroyTugas($id) + { + $guru = Auth::guard('guru')->user(); + + $idMengajars = Mengajar::where('id_guru', $guru->id_guru)->pluck('id_mengajar'); + + $tugas = Tugas::whereIn('id_mengajar', $idMengajars) + ->where('id_tugas', $id) + ->firstOrFail(); + + $tugas->delete(); + + return redirect()->route('guru.tugas.history') + ->with('success', 'Tugas berhasil dihapus.'); + } } \ No newline at end of file diff --git a/app/Models/PengumpulanTugas.php b/app/Models/PengumpulanTugas.php index dcb3703..134d05c 100644 --- a/app/Models/PengumpulanTugas.php +++ b/app/Models/PengumpulanTugas.php @@ -15,7 +15,7 @@ class PengumpulanTugas extends Model protected $fillable = [ 'id_tugas', - 'is_siswa', + 'id_siswa', 'lampiran_tugas', 'tanggal_submit', 'exp', diff --git a/resources/views/guru/mapel/index.blade.php b/resources/views/guru/mapel/index.blade.php index c12436c..5e871d6 100644 --- a/resources/views/guru/mapel/index.blade.php +++ b/resources/views/guru/mapel/index.blade.php @@ -121,7 +121,17 @@ .file-preview.show { display: flex; } -.alert-success-custom { +.btn-history-materi { + background: #8b5cf6; + color: white; +} +.btn-history-materi:hover { background: #7c3aed; color: white; } + +.btn-history-tugas { + background: #14b8a6; + color: white; +} +.btn-history-tugas:hover { background: #0d9488; color: white; } background: #dcfce7; color: #166534; border-radius: 10px; @@ -192,21 +202,33 @@ {{-- AKSI --}} - +
+ - + + + + 🗂️ History Materi + + + + 📑 History Tugas + +
@empty diff --git a/resources/views/guru/materi/history.blade.php b/resources/views/guru/materi/history.blade.php new file mode 100644 index 0000000..5f61b37 --- /dev/null +++ b/resources/views/guru/materi/history.blade.php @@ -0,0 +1,203 @@ +@extends('guru.layouts.app') + +@section('title', 'History Materi') + +@push('styles') + +@endpush + +@section('content') + +← Kembali ke Mata Pelajaran + +

🗂️ History Materi

+

+ Semua materi yang pernah Anda upload. +

+ +@if(session('success')) +
✅ {{ session('success') }}
+@endif + +
+ @if($materiList->isEmpty()) +
+
📭
+

Belum ada materi yang diupload.

+
+ @else + + + + + + + + + + + + + + @foreach($materiList as $i => $materi) + + + + + + + + + + @endforeach + +
NoJudul MateriMata PelajaranKelasTanggal UploadFileAksi
{{ $materiList->firstItem() + $i }} +
{{ $materi->judul_materi }}
+ @if($materi->deskripsi) +
+ {{ Str::limit($materi->deskripsi, 60) }} +
+ @endif +
+ + {{ optional(optional($materi->mengajar)->mapel)->nama_mapel ?? '-' }} + + + + {{ optional(optional($materi->mengajar)->kelas)->tingkat }} + {{ optional(optional($materi->mengajar)->kelas)->nama_kelas ?? '-' }} + + + {{ \Carbon\Carbon::parse($materi->tanggal_upload)->format('d M Y, H:i') }} + + @if($materi->lampiran_materi) + @php + $ext = strtolower(pathinfo($materi->lampiran_materi, PATHINFO_EXTENSION)); + $icon = match(true) { + in_array($ext, ['pdf']) => '📄', + in_array($ext, ['doc','docx']) => '📝', + in_array($ext, ['ppt','pptx']) => '📊', + in_array($ext, ['jpg','jpeg','png']) => '🖼️', + default => '📎', + }; + @endphp + + {{ $icon }} Unduh + + @else + Tidak ada file + @endif + +
+ @csrf + @method('DELETE') + +
+
+ +
+ {{ $materiList->links() }} +
+ @endif +
+ +@endsection \ No newline at end of file diff --git a/resources/views/guru/tugas/detail.blade.php b/resources/views/guru/tugas/detail.blade.php new file mode 100644 index 0000000..718c58d --- /dev/null +++ b/resources/views/guru/tugas/detail.blade.php @@ -0,0 +1,279 @@ +@extends('guru.layouts.app') + +@section('title', 'Detail Tugas') + +@push('styles') + +@endpush + +@section('content') + +← Kembali ke History Tugas + +{{-- INFO TUGAS --}} +@php + $isLewat = \Carbon\Carbon::parse($tugas->deadline)->isPast(); + $jumlahKumpul = $tugas->pengumpulanTugas->where('status', 'dikumpulkan')->count(); + $jumlahLambat = $tugas->pengumpulanTugas->where('status', 'terlambat')->count(); + $totalKumpul = $tugas->pengumpulanTugas->count(); +@endphp + +
+

{{ $tugas->judul_tugas }}

+ +
+ + 📚 {{ optional(optional($tugas->mengajar)->mapel)->nama_mapel ?? '-' }} + + + 🏫 {{ optional(optional($tugas->mengajar)->kelas)->tingkat }} + {{ optional(optional($tugas->mengajar)->kelas)->nama_kelas ?? '-' }} + + + ⏰ Deadline: {{ \Carbon\Carbon::parse($tugas->deadline)->format('d M Y, H:i') }} + — {{ $isLewat ? 'Sudah lewat' : 'Masih aktif' }} + +
+ + @if($tugas->keterangan) +
+ {!! nl2br(e($tugas->keterangan)) !!} +
+ @endif +
+ +{{-- STATISTIK --}} +
+
+

{{ $jumlahKumpul }}

+

Tepat Waktu

+
+
+

{{ $jumlahLambat }}

+

Terlambat

+
+
+

{{ $totalKumpul }}

+

Total Pengumpulan

+
+
+ +{{-- DAFTAR PENGUMPULAN --}} +
+

📥 Daftar Pengumpulan Siswa

+ + @if($tugas->pengumpulanTugas->isEmpty()) +
+
📭
+

Belum ada siswa yang mengumpulkan tugas ini.

+
+ @else + + + + + + + + + + + + + + @foreach($tugas->pengumpulanTugas as $i => $kumpul) + + + + + + + + + + @endforeach + +
NoNama SiswaNISNWaktu SubmitStatusEXPFile
{{ $i + 1 }} + {{ optional($kumpul->siswa)->nama ?? '-' }} + + {{ optional($kumpul->siswa)->nisn ?? '-' }} + + {{ \Carbon\Carbon::parse($kumpul->tanggal_submit)->format('d M Y, H:i') }} + + + @if($kumpul->status === 'dikumpulkan') ✅ Tepat Waktu + @elseif($kumpul->status === 'terlambat') ⏰ Terlambat + @else ❌ Belum + @endif + + + @if($kumpul->exp > 0) + + ⭐ {{ $kumpul->exp }} EXP + + @else + Belum dinilai + @endif + + @if($kumpul->lampiran_tugas) + + 📎 Unduh + + @else + - + @endif +
+ @endif +
+ +@endsection \ No newline at end of file diff --git a/resources/views/guru/tugas/history.blade.php b/resources/views/guru/tugas/history.blade.php new file mode 100644 index 0000000..f1fc87c --- /dev/null +++ b/resources/views/guru/tugas/history.blade.php @@ -0,0 +1,217 @@ +@extends('guru.layouts.app') + +@section('title', 'History Tugas') + +@push('styles') + +@endpush + +@section('content') + +← Kembali ke Mata Pelajaran + +

📑 History Tugas

+

+ Semua tugas yang pernah Anda buat. +

+ +@if(session('success')) +
✅ {{ session('success') }}
+@endif + +
+ @if($tugasList->isEmpty()) +
+
📭
+

Belum ada tugas yang dibuat.

+
+ @else + + + + + + + + + + + + + + @foreach($tugasList as $i => $tugas) + @php + $isLewat = \Carbon\Carbon::parse($tugas->deadline)->isPast(); + $jumlahKumpul = $tugas->pengumpulanTugas->count(); + @endphp + + + + + + + + + + @endforeach + +
NoJudul TugasMata PelajaranKelasDeadlinePengumpulanAksi
{{ $tugasList->firstItem() + $i }} +
{{ $tugas->judul_tugas }}
+ @if($tugas->keterangan) +
+ {{ Str::limit($tugas->keterangan, 60) }} +
+ @endif +
+ + {{ optional(optional($tugas->mengajar)->mapel)->nama_mapel ?? '-' }} + + + + {{ optional(optional($tugas->mengajar)->kelas)->tingkat }} + {{ optional(optional($tugas->mengajar)->kelas)->nama_kelas ?? '-' }} + + + + {{ $isLewat ? '⏰ Lewat' : '✅ Aktif' }} + +
+ {{ \Carbon\Carbon::parse($tugas->deadline)->format('d M Y, H:i') }} +
+
+ {{ $jumlahKumpul }} + pengumpulan + +
+ + 👁️ Detail + +
+ @csrf + @method('DELETE') + +
+
+
+ +
+ {{ $tugasList->links() }} +
+ @endif +
+ +@endsection \ No newline at end of file diff --git a/resources/views/siswa/challenge/index.blade.php b/resources/views/siswa/challenge/index.blade.php new file mode 100644 index 0000000..e69de29 diff --git a/resources/views/siswa/leaderboard/index.blade.php b/resources/views/siswa/leaderboard/index.blade.php new file mode 100644 index 0000000..e69de29 diff --git a/routes/web.php b/routes/web.php index b471cc6..c92b175 100644 --- a/routes/web.php +++ b/routes/web.php @@ -30,6 +30,8 @@ use App\Http\Controllers\Siswa\DashboardController as SiswaDashboardController; use App\Http\Controllers\Siswa\MateriController as SiswaMateriController; use App\Http\Controllers\Siswa\TugasController as SiswaTugasController; +use App\Http\Controllers\Siswa\ChallengeController as SiswaChallengeController; +use App\Http\Controllers\Siswa\LeaderboardController as SiswaLeaderboardController; // ==================== // LANDING PAGE @@ -131,13 +133,12 @@ Route::get('/leaderboard', [GuruLeaderboardController::class, 'index']) ->name('leaderboard.index'); - Route::get('/materi/{id_mapel}/create', function ($id_mapel) { - return "Form Upload Materi untuk Mapel: " . $id_mapel; - })->name('materi.create'); + Route::get('/materi/history', [GuruMapelController::class, 'historyMateri'])->name('materi.history'); + Route::delete('/materi/{id}', [GuruMapelController::class, 'destroyMateri'])->name('materi.destroy'); - Route::get('/tugas/{id_mapel}/create', function ($id_mapel) { - return "Form Buat Tugas untuk Mapel: " . $id_mapel; - })->name('tugas.create'); + Route::get('/tugas/history', [GuruMapelController::class, 'historyTugas'])->name('tugas.history'); + Route::get('/tugas/{id}/detail', [GuruMapelController::class, 'detailTugas'])->name('tugas.detail'); + Route::delete('/tugas/{id}', [GuruMapelController::class, 'destroyTugas'])->name('tugas.destroy'); // Profil (Edit)