From 46040fa88645b09655976543f3efbfffc5183324 Mon Sep 17 00:00:00 2001 From: Mahayoga Date: Mon, 11 May 2026 14:53:56 +0700 Subject: [PATCH] Done: bagian halaman ujian only --- .../Controllers/FinishUjianController.php | 20 +- .../Controllers/HalamanUjianController.php | 47 ++++- .../user/pages/cek_status/index.blade.php | 4 + .../user/pages/ujian/temp_index.blade.php | 194 +++++++++++++++--- routes/web.php | 1 + 5 files changed, 233 insertions(+), 33 deletions(-) diff --git a/app/Http/Controllers/FinishUjianController.php b/app/Http/Controllers/FinishUjianController.php index ce0e397..858f64d 100644 --- a/app/Http/Controllers/FinishUjianController.php +++ b/app/Http/Controllers/FinishUjianController.php @@ -13,12 +13,12 @@ class FinishUjianController extends Controller public function getAllAnswer(Request $request) { $data_session = TestSessionsModel::where('id_test_sessions', $request->id_test_sessions)->first(); if($data_session != null) { - if($data_session->status_session != '1') { + if($data_session->status_session == '0') { return response()->json([ 'status' => false, - 'message' => 'Data sesi tes belum dimulai atau telah usai. Silahkan cek status dengan kode untuk informasi lebih lanjut.' + 'message' => 'Data sesi tes dinonaktifkan. Silahkan cek status dengan kode untuk informasi lebih lanjut.' ]); - } else if($data_session->status_session == '1') { + } else if($data_session->status_session == '2') { $detail_test = DetailTestModel::where('id_test_sessions', $request->id_test_sessions)->get(); $data_ujian = []; foreach($detail_test as $detail) { @@ -73,13 +73,15 @@ public function index(Request $request) $data_session = TestSessionsModel::where('id_test_sessions', $id_session)->first(); if($data_session != null) { - if($data_session->status_session != '1') { - return redirect()->route('cek-status.index')->with('error', 'Data sesi tes belum dimulai atau telah usai. Silahkan cek status dengan kode untuk informasi lebih lanjut.'); + if($data_session->status_session == '0') { + return redirect()->route('cek-status.index')->with('error', 'Data sesi tes dinonaktifkan. Silahkan cek status dengan kode untuk informasi lebih lanjut.'); } else if($data_session->status_session == '1') { - // $data_session->update([ - // 'status_session' => '2', - // 'is_active' => '0' - // ]); + $data_session->update([ + 'status_session' => '2', + 'is_active' => '0' + ]); + return view('user.pages.finish_ujian.index', compact('id_session')); + } else if($data_session->status_session == '2') { return view('user.pages.finish_ujian.index', compact('id_session')); } } else { diff --git a/app/Http/Controllers/HalamanUjianController.php b/app/Http/Controllers/HalamanUjianController.php index 5ca7fd8..131f4d0 100644 --- a/app/Http/Controllers/HalamanUjianController.php +++ b/app/Http/Controllers/HalamanUjianController.php @@ -14,7 +14,7 @@ class HalamanUjianController extends Controller function fetchQuestion(Request $request) { $data_question = DataSoalModel::all(); if($data_question != null) { - $number_question = $request->question_number; + $number_question = $request->question_index; if($number_question <= 0 || $number_question > count($data_question)) { $number_question = 1; } @@ -66,6 +66,12 @@ public function getCurrentAnswer(Request $request) { ]; } } + } else { + return response()->json([ + 'status' => false, + 'jawaban' => null, + 'choices' => null + ]); } $data_answer = DetailTestModel::where('id_soal', $request->id_question) ->where('id_test_sessions', $request->session_id) @@ -86,6 +92,45 @@ public function getCurrentAnswer(Request $request) { } } + public function getNavigationField(Request $request) { + $id_session = null; + if(session('session_id') != null) { + $id_session = session('session_id'); + } else if($request->session_id != null) { + $id_session = $request->session_id; + } else { + return response()->json([ + 'status' => false, + 'msg' => 'Test session id tidak ditemukan' + ]); + } + + $data_soal = DataSoalModel::all(); + $result = []; + $index = 1; + foreach($data_soal as $soal) { + $data_jawaban = DetailTestModel::where(['id_soal' => $soal->id_soal, 'id_test_sessions' => $id_session])->first(); + if($data_jawaban != null) { + $result[] = [ + 'index' => $index, + 'answered' => true, + 'data' => $data_jawaban + ]; + } else { + $result[] = [ + 'index' => $index, + 'answered' => false + ]; + } + $index += 1; + } + + return response()->json([ + 'status' => true, + 'data' => $result + ]); + } + public function getTimeLeft(Request $request) { $data_session = TestSessionsModel::where('id_test_sessions', $request->session_id)->first(); if($data_session != null) { diff --git a/resources/views/user/pages/cek_status/index.blade.php b/resources/views/user/pages/cek_status/index.blade.php index 43c4e35..1d12f24 100644 --- a/resources/views/user/pages/cek_status/index.blade.php +++ b/resources/views/user/pages/cek_status/index.blade.php @@ -180,6 +180,10 @@ function searchUserStatus() { $('#result_test_status').html('Selesai'); $('#result_test_status').removeClass(); $('#result_test_status').addClass('fw-bold text-white bg-success p-2 rounded-pill'); + let test_url = '{{ route('hasil-tes.index', ['id_test_sessions' => '__ID_TEST_SESSIONS__']) }}'; + $('#result_test_link').show(); + $('#result_test_link').html('Tes Sudah Selesai, Klik untuk melihat hasil'); + $('#result_test_link').attr('href', test_url.replace('__ID_TEST_SESSIONS__', test_session.id_test_sessions)); } } else if(!test_session.status) { $('#id_booking_input').val(response.id_booking); diff --git a/resources/views/user/pages/ujian/temp_index.blade.php b/resources/views/user/pages/ujian/temp_index.blade.php index a6b3bd0..76112ff 100644 --- a/resources/views/user/pages/ujian/temp_index.blade.php +++ b/resources/views/user/pages/ujian/temp_index.blade.php @@ -29,34 +29,16 @@
Soal
+
Jawaban:
- {{--
- - -
--}}
-
- - {{-- @foreach ($answered_question as $question) -
{{ $question['nomor_soal'] }}
- @endforeach - -
- @if ($question_number > 1) -
Previous
- @endif - - @if ($is_last_question) -
Finish
- @else -
Next
- @endif -
--}} +
@@ -93,6 +75,53 @@ const TOKEN_SESSION = '{{ $data_session->token_session }}'; let UNIX_END_TIME = null; let QUESTION_INDEX = 1; + let QUESTION_ID = null; + let CURRENT_BTN = null; + let CAPTION_BTN = null; + + function changeQuestion(num) { + Swal.showLoading(); + + let xhttp = new XMLHttpRequest(); + let the_answer = null; + let token = document.getElementById('_token').getAttribute('value'); + let formData = new FormData(); + + if(QUESTION_INDEX == num) { + console.log('same question'); + Swal.close(); + return; + } + + document.getElementsByName('jawaban_final').forEach(element => { + if (element.checked) { + the_answer = { + key: element.id.split('_')[1], + }; + } + }); + if(the_answer) { + formData.append('jawaban_final', the_answer.key); + formData.append('_token', token); + formData.append('question', num); + formData.append('id_question', QUESTION_ID); + formData.append('session_id', SESSION_ID); + xhttp.open("POST", "{{ route('ujian.store') }}", false); + xhttp.send(formData); + } + // stopTobii(); + QUESTION_INDEX = num; + getNavigationField(); + setCurrentNavigation(); + fetchQuestion(QUESTION_INDEX); + Swal.close(); + } + + function setCurrentNavigation() { + $('#nomor_' + QUESTION_INDEX).removeClass('bg-light-subtle'); + $('#nomor_' + QUESTION_INDEX).removeClass('bg-secondary-subtle'); + $('#nomor_' + QUESTION_INDEX).addClass('bg-info'); + } function fetchQuestion(question_index) { let xhttp = new XMLHttpRequest(); @@ -102,6 +131,7 @@ function fetchQuestion(question_index) { let response = JSON.parse(this.responseText); if(response.status) { $('#text_question').html(response.data.pertanyaan); + QUESTION_ID = response.data.id_soal; getCurrentAnswer(response.data.id_soal); } else { Swal.fire({ @@ -118,6 +148,65 @@ function fetchQuestion(question_index) { xhttp.send(); } + function finishExam() { + Swal.fire({ + title: 'Alert', + icon: 'question', + text: 'Apakah Anda yakin ingin mengakhiri ujian? (aksi tidak dapat dikembalikan)', + confirmButtonText: 'Ya', + cancelButtonText: 'Tidak', + showCancelButton: true, + showCloseButton: true, + + }).then((result) => { + if (result.isConfirmed) { + event.preventDefault(); + let xhttp = new XMLHttpRequest(); + let the_answer = null; + let token = document.getElementById('_token').getAttribute('value'); + let formData = new FormData(); + + document.getElementsByName('jawaban_final').forEach(element => { + if (element.checked) { + the_answer = { + key: element.id.split('_')[1], + }; + } + }); + if(the_answer) { + formData.append('jawaban_final', the_answer.key); + formData.append('_token', token); + formData.append('question', QUESTION_INDEX); + formData.append('id_question', QUESTION_ID); + formData.append('session_id', SESSION_ID); + xhttp.open("POST", "{{ route('ujian.store') }}", false); + xhttp.send(formData); + console.log("sending answer (finish)"); + } + + ws.send(JSON.stringify({ + type: "command", + action: "stop", + session_id: SESSION_ID + })); + + //send_data_to_db + ws.send(JSON.stringify({ + type: "send_data_to_db", + session_id: SESSION_ID + })); + + ws.send(JSON.stringify({ + type: "update_status", + status_sessions: false, + session_id: SESSION_ID + })); + + window.location.href = "{{ route('hasil-tes.index') }}?id_test_sessions=" + SESSION_ID; + } + }); + } + function getCurrentAnswer(id_question) { let xhttp = new XMLHttpRequest(); @@ -136,6 +225,13 @@ function getCurrentAnswer(id_question) { `; }); $('#answer_field').append(choices_html); + if(response.jawaban != null) { + document.getElementsByName('jawaban_final').forEach(element => { + if (element.id.split('_')[1] == response.jawaban) { + element.checked = true; + } + }); + } } } }; @@ -143,6 +239,57 @@ function getCurrentAnswer(id_question) { xhttp.send(); } + function getNavigationField() { + let xhttp = new XMLHttpRequest(); + let total_question = 0; + + xhttp.onreadystatechange = function() { + if(this.readyState == 4 && this.status == 200) { + let response = JSON.parse(this.responseText); + if(response.status) { + let navigation_field = '
Navigasi Soal
'; + $('#navigation_field').html(navigation_field); + response.data.forEach((q) => { + let answered = 'bg-light-subtle'; + if(q.answered) { + answered = 'bg-secondary-subtle' + } + navigation_field += ` +
${q.index}
+ `; + total_question += 1; + }); + if(QUESTION_INDEX <= total_question) { + let next_num = 0; + next_num = QUESTION_INDEX + 1; + if(next_num > total_question) { + // tombol finish dan back + navigation_field += ` +
Back
+ `; + navigation_field += ` +
Finish
+ `; + } else { + if((QUESTION_INDEX - 1) != 0) { + navigation_field += ` +
Back
+ `; + } + navigation_field += ` +
Next
+ `; + } + } + $('#navigation_field').html(navigation_field); + } + } + }; + + xhttp.open('GET', '{{ route('ujian.navigationField') }}?session_id=' + SESSION_ID, false); + xhttp.send(); + } + function getTimeLeft() { let xhttp = new XMLHttpRequest(); @@ -248,7 +395,6 @@ function checkFullscreen() { })); document.addEventListener('fullscreenchange', checkFullscreen); - // checkFullscreen(); ws.send(JSON.stringify({ type: "update_status", @@ -281,9 +427,11 @@ function checkFullscreen() { }; startTobii(); - // getCurrentAnswer(); + checkFullscreen(); getTimeLeft(); setInterval(updateTimeLeft, 1000); + getNavigationField(); + setCurrentNavigation(); fetchQuestion(QUESTION_INDEX); }; }); diff --git a/routes/web.php b/routes/web.php index 6dedebb..6cec98e 100644 --- a/routes/web.php +++ b/routes/web.php @@ -42,6 +42,7 @@ Route::get('ujian/get/current-answer', [HalamanUjianController::class, 'getCurrentAnswer'])->name('ujian.getCurrentAnswer'); Route::get('ujian/get/time-left', [HalamanUjianController::class, 'getTimeLeft'])->name('ujian.getTimeLeft'); Route::get('ujian/fetch/question', [HalamanUjianController::class, 'fetchQuestion'])->name('ujian.fetchQuestion'); + Route::get('ujian/fetch/navigation-field', [HalamanUjianController::class, 'getNavigationField'])->name('ujian.navigationField'); Route::resource('hasil-tes', FinishUjianController::class)->only(['index', 'show']); Route::get('hasil-tes/get/all-answer', [FinishUjianController::class, 'getAllAnswer'])->name('hasil-tes.getAllAnswer'); Route::middleware(['auth', 'role.auth'])->group(function() {