diff --git a/app/Http/Controllers/Admin/ChallengeController.php b/app/Http/Controllers/Admin/ChallengeController.php index e69de29..e8504fe 100644 --- a/app/Http/Controllers/Admin/ChallengeController.php +++ b/app/Http/Controllers/Admin/ChallengeController.php @@ -0,0 +1,108 @@ +get(); + $kelass = Kelas::all(); + return view('admin.challenge.index', compact('challenges', 'kelass')); + } + + public function create() + { + return view('admin.challenge.create'); + } + + public function store(Request $request) +{ + $request->validate([ + 'judul_challenge' => 'required', + 'exp' => 'required|integer|min:1', + 'tenggat_waktu' => 'required|date', + 'kelas' => 'required|array' + ]); + + $challenge = Challenge::create([ + 'id_admin' => auth('admin')->id(), + 'judul_challenge' => $request->judul_challenge, + 'deskripsi' => $request->deskripsi, + 'exp' => $request->exp, + 'tenggat_waktu' => $request->tenggat_waktu, + ]); + + // attach kelas + $challenge->kelas()->attach($request->kelas); + + return redirect()->route('admin.challenge.soal.create', $challenge->id_challenge); + } + + public function createSoal($id) + { + $challenge = Challenge::findOrFail($id); + return view('admin.challenge.soal', compact('challenge')); + } + + public function storeSoal(Request $request, $id) + { + $challenge = Challenge::findOrFail($id); + + $jumlahSoal = count($request->pertanyaan); + $expPerSoal = floor($challenge->exp / $jumlahSoal); + + foreach ($request->pertanyaan as $key => $pertanyaan) { + SoalChallenge::create([ + 'id_challenge' => $id, + 'pertanyaan' => $pertanyaan, + 'opsi_a' => $request->opsi_a[$key], + 'opsi_b' => $request->opsi_b[$key], + 'opsi_c' => $request->opsi_c[$key], + 'opsi_d' => $request->opsi_d[$key], + 'jawaban_benar' => $request->jawaban_benar[$key], + 'exp_per_soal' => $expPerSoal, + ]); + } + + return redirect()->route('admin.challenge.index') + ->with('success', 'Challenge & soal berhasil dibuat!'); + } + + + public function edit($id) + { + $challenge = Challenge::findOrFail($id); + return view('admin.challenge.edit', compact('challenge')); + } + + public function update(Request $request, $id) + { + $challenge = Challenge::findOrFail($id); + + $challenge->update([ + 'judul_challenge' => $request->judul_challenge, + 'deskripsi' => $request->deskripsi, + 'exp' => $request->exp, + 'tenggat_waktu' => $request->tenggat_waktu, + ]); + + return redirect()->route('admin.challenge.index') + ->with('success', 'Challenge berhasil diupdate!'); + } + + public function destroy($id) + { + $challenge = Challenge::findOrFail($id); + $challenge->delete(); + + return redirect()->route('admin.challenge.index') + ->with('success', 'Challenge berhasil dihapus!'); + } +} diff --git a/app/Http/Controllers/Admin/LeaderboardController.php b/app/Http/Controllers/Admin/LeaderboardController.php index e69de29..d1e48be 100644 --- a/app/Http/Controllers/Admin/LeaderboardController.php +++ b/app/Http/Controllers/Admin/LeaderboardController.php @@ -0,0 +1,18 @@ +orderByDesc('total_exp') + ->paginate(10); + + return view('admin.leaderboard.index', compact('leaderboards')); + } +} diff --git a/app/Http/Controllers/Guru/MapelController.php b/app/Http/Controllers/Guru/MapelController.php index a0a7eef..1c8056d 100644 --- a/app/Http/Controllers/Guru/MapelController.php +++ b/app/Http/Controllers/Guru/MapelController.php @@ -4,12 +4,18 @@ use App\Http\Controllers\Controller; use App\Models\Mapel; +use Illuminate\Support\Facades\Auth; class MapelController extends Controller { public function index() { - $mapels = Mapel::paginate(10); + $guru = Auth::guard('guru')->user(); + + // Ambil hanya mapel yang dia ajar + $mapels = Mapel::whereHas('mengajars', function ($query) use ($guru) { + $query->where('nip', $guru->nip); + })->paginate(10); return view('guru.mapel.index', compact('mapels')); } diff --git a/app/Models/Challenge.php b/app/Models/Challenge.php index 87224f7..d64f508 100644 --- a/app/Models/Challenge.php +++ b/app/Models/Challenge.php @@ -21,4 +21,20 @@ class Challenge extends Model 'id_badge', 'tenggat_waktu', ]; + + public function kelas() +{ + return $this->belongsToMany( + Kelas::class, + 'challenge_kelas', + 'id_challenge', + 'id_kelas' + ); +} + +public function soal() +{ + return $this->hasMany(SoalChallenge::class, 'id_challenge'); +} + } \ No newline at end of file diff --git a/database/migrations/2026_02_18_022351_create_soal_challenge_table.php b/database/migrations/2026_02_18_022351_create_soal_challenge_table.php new file mode 100644 index 0000000..b69c590 --- /dev/null +++ b/database/migrations/2026_02_18_022351_create_soal_challenge_table.php @@ -0,0 +1,41 @@ +id('id_soal'); + $table->unsignedBigInteger('id_challenge'); + $table->text('pertanyaan'); + $table->string('opsi_a'); + $table->string('opsi_b'); + $table->string('opsi_c'); + $table->string('opsi_d'); + $table->enum('jawaban_benar', ['A','B','C','D']); + $table->integer('exp_per_soal')->default(0); + $table->timestamps(); + + $table->foreign('id_challenge') + ->references('id_challenge') + ->on('challenges') + ->onDelete('cascade'); +}); + + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('soal_challenge'); + } +}; diff --git a/database/migrations/2026_02_18_022905_create_challenge_kelas_table.php b/database/migrations/2026_02_18_022905_create_challenge_kelas_table.php new file mode 100644 index 0000000..c21b261 --- /dev/null +++ b/database/migrations/2026_02_18_022905_create_challenge_kelas_table.php @@ -0,0 +1,40 @@ +id(); + $table->unsignedBigInteger('id_challenge'); + $table->unsignedBigInteger('id_kelas'); + $table->timestamps(); + + $table->foreign('id_challenge') + ->references('id_challenge') + ->on('challenges') + ->onDelete('cascade'); + + $table->foreign('id_kelas') + ->references('id_kelas') + ->on('kelas') + ->onDelete('cascade'); +}); + + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('challenge_kelas'); + } +}; diff --git a/resources/views/admin/challenge/create.blade.php b/resources/views/admin/challenge/create.blade.php new file mode 100644 index 0000000..05b11f4 --- /dev/null +++ b/resources/views/admin/challenge/create.blade.php @@ -0,0 +1,23 @@ +@extends('admin.layouts.app') + +@section('content') +

Tambah Challenge

+ +
+ @csrf + +
+

+ +
+

+ +
+

+ +
+

+ + +
+@endsection diff --git a/resources/views/admin/challenge/edit.blade.php b/resources/views/admin/challenge/edit.blade.php new file mode 100644 index 0000000..6ca60c6 --- /dev/null +++ b/resources/views/admin/challenge/edit.blade.php @@ -0,0 +1,26 @@ +@extends('admin.layouts.app') + +@section('content') +

Edit Challenge

+ +
+ @csrf + @method('PUT') + +
+

+ +
+

+ +
+

+ +
+

+ + +
+@endsection diff --git a/resources/views/admin/challenge/index.blade.php b/resources/views/admin/challenge/index.blade.php index e69de29..9c30fa4 100644 --- a/resources/views/admin/challenge/index.blade.php +++ b/resources/views/admin/challenge/index.blade.php @@ -0,0 +1,282 @@ +@extends('admin.layouts.app') + +@section('title', 'Daftar Challenge') + +@section('content') + + + +

DAFTAR CHALLENGE

+ +
+ +
+ + + +
+ +
+ +
+ + {{-- Alert --}} + @if(session('success')) +
+ {{ session('success') }} + +
+ @endif + + + + + + + + + + + + + + @forelse($challenges as $index => $challenge) + + + + + + + + + @empty + + + + @endforelse + +
NoJudul ChallengeEXPTenggatAksi
{{ $loop->iteration }}{{ $challenge->judul_challenge }}{{ $challenge->exp }}{{ \Carbon\Carbon::parse($challenge->tenggat_waktu)->format('d M Y H:i') }} + + +
+ @csrf + @method('DELETE') + +
+
Belum ada challenge
+ +
+ +{{-- MODAL TAMBAH --}} + + +{{-- MODAL EDIT --}} + + + + +@endsection diff --git a/resources/views/admin/challenge/soal.blade.php b/resources/views/admin/challenge/soal.blade.php new file mode 100644 index 0000000..fc723cd --- /dev/null +++ b/resources/views/admin/challenge/soal.blade.php @@ -0,0 +1,174 @@ +@extends('admin.layouts.app') + +@section('title', 'Tambah Soal Challenge') + +@section('content') + + + +

+ TAMBAH SOAL - {{ $challenge->judul_challenge }} +

+ +
+ +
+@csrf + +
+ + {{-- SOAL PERTAMA (DEFAULT) --}} +
+
Soal 1
+ +
+ + +
+ +
+
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+ +
+ + +
+
+ +
+ + + +
+ +
+ +
+ +
+ +
+ + + +@endsection diff --git a/resources/views/guru/mapel/index.blade.php b/resources/views/guru/mapel/index.blade.php index e69de29..30ebf29 100644 --- a/resources/views/guru/mapel/index.blade.php +++ b/resources/views/guru/mapel/index.blade.php @@ -0,0 +1,91 @@ +@extends('guru.layouts.app') + +@section('title', 'Daftar Mata Pelajaran') + +@section('content') + + + +

MATA PELAJARAN YANG ANDA AJAR

+ +
+ + + + + + + + + + + + + @forelse($mapels as $index => $mapel) + + + + + + + + @empty + + + + @endforelse + +
NoID MapelNama Mata PelajaranAksi
{{ $mapels->firstItem() + $index }}{{ $mapel->id_mapel }}{{ $mapel->nama_mapel }} + + Upload Materi + + + + Buat Tugas + +
Anda belum mengajar mata pelajaran apapun.
+ +
+ {{ $mapels->links() }} +
+ +
+ +@endsection diff --git a/routes/web.php b/routes/web.php index e76eb10..51e83b5 100644 --- a/routes/web.php +++ b/routes/web.php @@ -11,8 +11,10 @@ use App\Http\Controllers\Admin\KelasController as AdminKelasController; use App\Http\Controllers\Admin\SiswaController as AdminSiswaController; use App\Http\Controllers\Admin\MapelController as AdminMapelController; +use App\Http\Controllers\Admin\ChallengeController as AdminChallengeController; use App\Http\Controllers\Admin\LeaderboardController as AdminLeaderboardController; + // GURU CONTROLLERS use App\Http\Controllers\Guru\LoginController as GuruLoginController; use App\Http\Controllers\Guru\DashboardController as GuruDashboardController; @@ -98,7 +100,15 @@ Route::resource('mapel', AdminMapelController::class); Route::resource('leaderboard', AdminLeaderboardController::class) ->only(['index']); + Route::resource('challenge', AdminChallengeController::class); + Route::get('challenge/{id}/soal', + [AdminChallengeController::class, 'createSoal'] + )->name('challenge.soal.create'); + + Route::post('challenge/{id}/soal', + [AdminChallengeController::class, 'storeSoal'] + )->name('challenge.soal.store'); // LOGOUT ADMIN Route::post('/logout', [LoginController::class, 'logout']) @@ -125,9 +135,17 @@ Route::get('/mapel', [GuruMapelController::class, 'index']) ->name('mapel.index'); -Route::get('/leaderboard', [GuruLeaderboardController::class, 'index']) + 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('/tugas/{id_mapel}/create', function ($id_mapel) { + return "Form Buat Tugas untuk Mapel: " . $id_mapel; + })->name('tugas.create'); + // Profil (Edit) Route::get('/profil', [GuruProfilController::class, 'show'])->name('profil.show');