halaman-psikolog #1

Merged
Mahayoga merged 52 commits from halaman-psikolog into master 2026-07-06 12:37:30 +07:00
7 changed files with 227 additions and 6 deletions
Showing only changes of commit 50b0ec2c1b - Show all commits

View File

@ -41,6 +41,7 @@ public function show(string $id)
return response()->json([
'status' => true,
'msg' => 'Data ditemukan (' . $id . ')',
'id_booking' => $data->id_booking,
'status_data' => $data->status_tes,
'nama_lengkap' => $data->nama_lengkap,
'kode_unik' => $data->kode_unik,

View File

@ -0,0 +1,88 @@
<?php
namespace App\Http\Controllers;
use App\Models\TestSessionsModel;
use Illuminate\Http\Request;
class TestSessionsController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
//
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
$request->validate([
'id_booking' => 'required|exists:booking,id_booking',
]);
$testSession = TestSessionsModel::create([
'id_booking' => $request->id_booking,
'status_session' => 0, // Set status awal sebagai "Belum Dimulai"
]);
return redirect()->route('cek-status.show', $request->id_booking)->with('success', 'Sesi tes berhasil dibuat. Token: ' . $testSession->token_session);
}
/**
* Display the specified resource.
*/
public function show(string $id)
{
$data = TestSessionsModel::where('id_booking', $id)->first();
if($data != null) {
return response()->json([
'status' => true,
'msg' => 'Data ditemukan (' . $id . ')',
'status_session' => $data->status_session,
'token_session' => $data->token_session,
'id_booking' => $data->id_booking,
]);
}
return response()->json([
'status' => false,
'msg' => 'Data tidak ditemukan (' . $id . ')',
]);
}
/**
* Show the form for editing the specified resource.
*/
public function edit(string $id)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id)
{
//
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
//
}
}

View File

@ -38,7 +38,7 @@ protected static function boot()
}
if(empty($model->status_tes)) {
$model->status_tes = 0;
$model->status_tes = '0';
}
});
}

View File

@ -0,0 +1,42 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class TestSessionsModel extends Model
{
protected $table = 'test_sessions';
protected $primaryKey = 'id_test_sessions';
protected $keyType = 'string';
public $incrementing = false;
protected $fillable = [
'status_session',
'token_session',
'id_booking'
];
protected $casts = [
'id_test_sessions' => 'string',
'id_booking' => 'string',
];
protected static function boot()
{
parent::boot();
static::creating(function ($model) {
if (empty($model->id_test_sessions)) {
$model->id_test_sessions = (string) \Illuminate\Support\Str::uuid();
}
if (empty($model->token_session)) {
$model->token_session = \Illuminate\Support\Str::random(50);
}
});
}
}

View File

@ -14,7 +14,7 @@ public function up(): void
Schema::create('test_sessions', function (Blueprint $table) {
$table->uuid('id_test_sessions')->primary();
$table->enum('status_session', [0, 1, 2]);
$table->string();
$table->string('token_session', 50)->unique();
$table->uuid('id_booking');
$table->timestamps();

View File

@ -71,18 +71,25 @@
</div>
</div>
</div>
<div class="col-md-8 my-3">
<div class="col-md-8 my-3" id="result_test">
<div class="card">
<div class="card-body">
<h5 class="card-title text-center">Lakukan Tes</h5>
<h6 class="card-subtitle mb-2 text-body-secondary text-center">Kalau kamu sudah siap menjalankan tes, klik tombol di bawah untuk mulai tes kecemasan dari sistem kami!</h6>
<h6 class="card-subtitle mb-2 text-body-secondary text-center" id="result_test_title">Kalau kamu sudah siap menjalankan tes, klik tombol di bawah untuk mulai tes kecemasan dari sistem kami!</h6>
<div class="row justify-content-center">
<div class="col-md-12 text-center my-3">
<span>Status tes kamu: <span id="status_tes_down" class="fw-bold text-white bg-secondary p-2 rounded-pill">Belum Dimulai</span></span>
<span>Status tes kamu: <span id="result_test_status" class="fw-bold text-white bg-secondary p-2 rounded-pill">Belum Dimulai</span></span>
</div>
<div class="col-md-9 mb-3">
<div class="row justify-content-center">
<a href="#" class="btn btn-primary text-white fw-bold">Cari</a>
<form action="" method="POST" id="result_test_form">
@csrf
<input type="hidden" name="id_booking" id="id_booking_input">
<div class="row justify-content-center">
<button type="button" class="btn btn-primary text-white fw-bold" onclick="startSessionTest()">Mulai Tes</button>
</div>
</form>
<a href="#" class="btn btn-primary text-white fw-bold" id="result_test_link">Mulai Tes</a>
</div>
</div>
</div>
@ -98,8 +105,12 @@
@section('script')
<script>
$('#result_data').hide();
$('#result_test').hide();
$('#result_test_form').hide();
$('#result_test_link').hide();
function searchUserStatus() {
$('#result_data').hide();
$('#result_test').hide();
Swal.fire({
title: 'Status',
text: 'Mencari data...',
@ -132,6 +143,35 @@ function searchUserStatus() {
$('#alert_status').removeClass();
$('#alert_status').addClass('alert alert-info');
$('#alert_status').html('Kamu sudah dikonfirmasi oleh psikolog!');
let test_session = getTestSession(response.id_booking);
$('#result_test').show();
$('#result_test_title').html('Kamu sudah dikonfirmasi oleh psikolog! Kalau kamu sudah siap menjalankan tes, klik tombol di bawah untuk mulai tes kecemasan dari sistem kami!');
if(test_session.status) {
if(test_session.status_session == 0) {
$('#result_test_status').html('Belum Dimulai');
$('#result_test_status').removeClass();
$('#result_test_status').addClass('fw-bold text-white bg-secondary p-2 rounded-pill');
$('#result_test_form').show();
} else if(test_session.status_session == 1) {
$('#result_test_status').html('Sedang Berlangsung');
$('#result_test_status').removeClass();
$('#result_test_status').addClass('fw-bold text-white bg-warning p-2 rounded-pill');
} else if(test_session.status_session == 2) {
$('#result_test_status').html('Selesai');
$('#result_test_status').removeClass();
$('#result_test_status').addClass('fw-bold text-white bg-success p-2 rounded-pill');
}
} else if(!test_session.status) {
console.log(test_session.msg);
$('#result_test').show();
$('#result_test_title').html('Kamu sudah dikonfirmasi oleh psikolog! Kalau kamu sudah siap menjalankan tes, klik tombol di bawah untuk mulai tes kecemasan dari sistem kami!');
$('#result_test_status').html('Belum Dimulai');
$('#result_test_status').removeClass();
$('#result_test_status').addClass('fw-bold text-white bg-secondary p-2 rounded-pill');
$('#result_test_form').show();
}
} else if(response.status_data == 2) {
$('#alert_status').removeClass();
$('#alert_status').addClass('alert alert-success');
@ -152,5 +192,53 @@ function searchUserStatus() {
xhttp.open('GET', url.replace('__CODE__', the_code));
xhttp.send();
}
function getTestSession(id_booking) {
let xhttp = new XMLHttpRequest();
let result = {
'status': false,
'msg': 'Data tidak ditemukan (' + id_booking + ')',
};
xhttp.onreadystatechange = function() {
if(this.readyState == 4 && this.status == 200) {
let response = JSON.parse(this.responseText);
if(response.status) {
result = {
'status': true,
'msg': 'Data ditemukan (' + id_booking + ')',
'id_booking': response.id_booking,
'status_session': response.status_session,
'token_session': response.token_session
};
}
}
};
let url = '{{ route('test-sessions.show', ['__ID__']) }}';
xhttp.open('GET', url.replace('__ID__', id_booking), false);
xhttp.send();
return result;
}
function startSessionTest() {
let id_booking = $('#id_booking_input').val();
let url = '{{ route('test-sessions.store') }}';
let form = $('#result_test_form');
Swal.fire({
title: 'Konfirmasi',
text: 'Apakah kamu yakin ingin memulai tes sekarang?',
icon: 'question',
showCancelButton: true,
confirmButtonText: 'Ya, mulai tes!',
cancelButtonText: 'Nggak jadi deh'
}).then((result) => {
if(result.isConfirmed) {
form.attr('action', url);
form.submit();
}
});
}
</script>
@endsection

View File

@ -7,6 +7,7 @@
use App\Http\Controllers\HasilTesController;
use App\Http\Controllers\LandingController;
use App\Http\Controllers\ProfileController;
use App\Http\Controllers\TestSessionsController;
use App\Http\Controllers\UsersController;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
@ -29,6 +30,7 @@
Route::get('/about', [LandingController::class, 'about'])->name('beranda.about');
Route::resource('booking', BookingController::class)->only(['store']);
Route::resource('cek-status', CekStatusController::class)->only(['index', 'show']);
Route::resource('test-sessions', TestSessionsController::class)->only(['store', 'show']);
Route::middleware(['auth', 'role.auth'])->group(function() {
Route::resource('dashboard', DashboardController::class);
Route::resource('users', UsersController::class);