challenge fixed
This commit is contained in:
parent
b33a6bac48
commit
737279c05a
|
|
@ -6,7 +6,10 @@
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use App\Models\Challenge;
|
use App\Models\Challenge;
|
||||||
use App\Models\Kelas;
|
use App\Models\Kelas;
|
||||||
|
use App\Models\SoalChallenge;
|
||||||
use Illuminate\Support\Facades\Auth;
|
use Illuminate\Support\Facades\Auth;
|
||||||
|
use Illuminate\Support\Facades\DB;
|
||||||
|
|
||||||
|
|
||||||
class ChallengeController extends Controller
|
class ChallengeController extends Controller
|
||||||
{
|
{
|
||||||
|
|
@ -22,59 +25,49 @@ public function create()
|
||||||
return view('admin.challenge.create');
|
return view('admin.challenge.create');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function store(Request $request)
|
public function store(Request $request)
|
||||||
{
|
{
|
||||||
$request->validate([
|
$request->validate([
|
||||||
'judul_challenge' => 'required',
|
'judul_challenge' => 'required',
|
||||||
'exp' => 'required|integer|min:1',
|
'exp' => 'required|integer|min:1',
|
||||||
'tenggat_waktu' => 'required|date',
|
'tenggat_waktu' => 'required|date',
|
||||||
'kelas' => 'required|array'
|
'kelas' => 'required|array',
|
||||||
|
'pertanyaan' => 'required|array|min:1'
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$challenge = Challenge::create([
|
DB::transaction(function () use ($request) {
|
||||||
'id_admin' => auth('admin')->id(),
|
|
||||||
'judul_challenge' => $request->judul_challenge,
|
|
||||||
'deskripsi' => $request->deskripsi,
|
|
||||||
'exp' => $request->exp,
|
|
||||||
'tenggat_waktu' => $request->tenggat_waktu,
|
|
||||||
]);
|
|
||||||
|
|
||||||
// attach kelas
|
$challenge = Challenge::create([
|
||||||
$challenge->kelas()->attach($request->kelas);
|
'id_admin' => auth('admin')->id(),
|
||||||
|
'judul_challenge' => $request->judul_challenge,
|
||||||
return redirect()->route('admin.challenge.soal.create', $challenge->id_challenge);
|
'deskripsi' => $request->deskripsi,
|
||||||
}
|
'exp' => $request->exp,
|
||||||
|
'tenggat_waktu' => $request->tenggat_waktu,
|
||||||
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,
|
|
||||||
]);
|
]);
|
||||||
}
|
|
||||||
|
$challenge->kelas()->attach($request->kelas);
|
||||||
|
|
||||||
|
$jumlahSoal = count($request->pertanyaan);
|
||||||
|
$expPerSoal = floor($request->exp / $jumlahSoal);
|
||||||
|
|
||||||
|
foreach ($request->pertanyaan as $i => $pertanyaan) {
|
||||||
|
SoalChallenge::create([
|
||||||
|
'id_challenge' => $challenge->id_challenge,
|
||||||
|
'pertanyaan' => $pertanyaan,
|
||||||
|
'opsi_a' => $request->opsi_a[$i],
|
||||||
|
'opsi_b' => $request->opsi_b[$i],
|
||||||
|
'opsi_c' => $request->opsi_c[$i],
|
||||||
|
'opsi_d' => $request->opsi_d[$i],
|
||||||
|
'jawaban_benar' => $request->jawaban_benar[$i],
|
||||||
|
'exp_per_soal' => $expPerSoal,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
return redirect()->route('admin.challenge.index')
|
return redirect()->route('admin.challenge.index')
|
||||||
->with('success', 'Challenge & soal berhasil dibuat!');
|
->with('success', 'Challenge & soal berhasil dibuat!');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public function edit($id)
|
public function edit($id)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
class SoalChallenge extends Model
|
||||||
|
{
|
||||||
|
protected $table = 'soal_challenge';
|
||||||
|
protected $primaryKey = 'id_soal';
|
||||||
|
|
||||||
|
protected $fillable = [
|
||||||
|
'id_challenge',
|
||||||
|
'pertanyaan',
|
||||||
|
'opsi_a',
|
||||||
|
'opsi_b',
|
||||||
|
'opsi_c',
|
||||||
|
'opsi_d',
|
||||||
|
'jawaban_benar',
|
||||||
|
'exp_per_soal',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
@ -152,50 +152,104 @@
|
||||||
|
|
||||||
{{-- MODAL TAMBAH --}}
|
{{-- MODAL TAMBAH --}}
|
||||||
<div class="modal fade" id="modalTambah">
|
<div class="modal fade" id="modalTambah">
|
||||||
<div class="modal-dialog modal-dialog-centered">
|
<div class="modal-dialog modal-lg modal-dialog-centered">
|
||||||
<div class="modal-content">
|
<div class="modal-content">
|
||||||
|
|
||||||
<div class="modal-header modal-header-pastel">
|
<form action="{{ route('admin.challenge.store') }}" method="POST">
|
||||||
<h5 class="modal-title w-100 text-center">Tambah Challenge</h5>
|
@csrf
|
||||||
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<form action="{{ route('admin.challenge.store') }}" method="POST">
|
<div class="modal-header modal-header-pastel">
|
||||||
@csrf
|
<h5 class="modal-title w-100 text-center">Tambah Challenge</h5>
|
||||||
|
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="modal-body">
|
{{-- STEP 1 --}}
|
||||||
|
<div class="modal-body" id="tambahStep1">
|
||||||
|
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label>Judul Challenge *</label>
|
<label>Judul *</label>
|
||||||
<input type="text" name="judul_challenge" class="form-control" required>
|
<input type="text" name="judul_challenge" class="form-control" required>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label>Deskripsi</label>
|
<label>Deskripsi</label>
|
||||||
<textarea name="deskripsi" class="form-control"></textarea>
|
<textarea name="deskripsi" class="form-control"></textarea>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label>EXP *</label>
|
<label>Total EXP *</label>
|
||||||
<input type="number" name="exp" class="form-control" required>
|
<input type="number" name="exp" class="form-control" required>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label>Tenggat Waktu *</label>
|
<label>Tenggat *</label>
|
||||||
<input type="datetime-local" name="tenggat_waktu" class="form-control" required>
|
<input type="datetime-local" name="tenggat_waktu" class="form-control" required>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-3">
|
||||||
|
<label>Pilih Kelas *</label>
|
||||||
|
@foreach($kelass as $kelas)
|
||||||
|
<div class="form-check">
|
||||||
|
<input class="form-check-input"
|
||||||
|
type="checkbox"
|
||||||
|
name="kelas[]"
|
||||||
|
value="{{ $kelas->id_kelas }}">
|
||||||
|
<label class="form-check-label">
|
||||||
|
{{ $kelas->tingkat }} - {{ $kelas->nama_kelas }}
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
@endforeach
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{-- STEP 2 --}}
|
||||||
|
<div class="modal-body d-none" id="tambahStep2">
|
||||||
|
|
||||||
|
<h5 class="mb-3">Tambah Soal</h5>
|
||||||
|
|
||||||
|
<div id="soalContainer"></div>
|
||||||
|
|
||||||
|
<button type="button"
|
||||||
|
class="btn btn-primary"
|
||||||
|
onclick="addSoal()">
|
||||||
|
+ Tambah Soal
|
||||||
|
</button>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button"
|
||||||
|
class="btn btn-secondary"
|
||||||
|
data-bs-dismiss="modal">
|
||||||
|
Cancel
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button type="button"
|
||||||
|
class="btn btn-warning d-none"
|
||||||
|
id="tambahBackBtn"
|
||||||
|
onclick="backTambahStep()">
|
||||||
|
Back
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button type="button"
|
||||||
|
class="btn btn-primary"
|
||||||
|
id="tambahNextBtn"
|
||||||
|
onclick="nextTambahStep()">
|
||||||
|
Next
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button type="submit"
|
||||||
|
class="btn btn-success d-none"
|
||||||
|
id="tambahSubmitBtn">
|
||||||
|
Simpan Semua
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</form>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="modal-footer">
|
|
||||||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Batal</button>
|
|
||||||
<button class="btn btn-success">Simpan Data</button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</form>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{-- MODAL EDIT --}}
|
{{-- MODAL EDIT --}}
|
||||||
|
|
@ -234,29 +288,11 @@
|
||||||
<input type="datetime-local" id="editTenggat" name="tenggat_waktu" class="form-control" required>
|
<input type="datetime-local" id="editTenggat" name="tenggat_waktu" class="form-control" required>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="mb-3">
|
|
||||||
<label>Pilih Kelas *</label>
|
|
||||||
|
|
||||||
@foreach($kelass as $kelas)
|
|
||||||
<div class="form-check">
|
|
||||||
<input class="form-check-input"
|
|
||||||
type="checkbox"
|
|
||||||
name="kelas[]"
|
|
||||||
value="{{ $kelas->id_kelas }}">
|
|
||||||
|
|
||||||
<label class="form-check-label">
|
|
||||||
{{ $kelas->tingkat }} - {{ $kelas->nama_kelas }}
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
@endforeach
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Batal</button>
|
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Batal</button>
|
||||||
<button class="btn btn-success">Update</button>
|
<button type="submit" class="btn btn-success">Update</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</form>
|
</form>
|
||||||
|
|
@ -266,17 +302,74 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
|
||||||
function openEditModal(id, judul, deskripsi, exp, tenggat) {
|
function openEditModal(id, judul, deskripsi, exp, tenggat) {
|
||||||
document.getElementById('editJudul').value = judul;
|
document.getElementById('editJudul').value = judul;
|
||||||
document.getElementById('editDeskripsi').value = deskripsi;
|
document.getElementById('editDeskripsi').value = deskripsi;
|
||||||
document.getElementById('editExp').value = exp;
|
document.getElementById('editExp').value = exp;
|
||||||
document.getElementById('editTenggat').value = tenggat;
|
document.getElementById('editTenggat').value = tenggat;
|
||||||
|
document.getElementById('formEdit').action = '/admin/challenge/' + id;
|
||||||
|
|
||||||
document.getElementById('formEdit').action =
|
var modal = new bootstrap.Modal(document.getElementById('modalEdit'));
|
||||||
"{{ url('admin/challenge') }}/" + id;
|
modal.show();
|
||||||
|
|
||||||
new bootstrap.Modal(document.getElementById('modalEdit')).show();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function nextTambahStep(){
|
||||||
|
document.getElementById('tambahStep1').classList.add('d-none');
|
||||||
|
document.getElementById('tambahStep2').classList.remove('d-none');
|
||||||
|
|
||||||
|
document.getElementById('tambahNextBtn').classList.add('d-none');
|
||||||
|
document.getElementById('tambahSubmitBtn').classList.remove('d-none');
|
||||||
|
document.getElementById('tambahBackBtn').classList.remove('d-none');
|
||||||
|
}
|
||||||
|
|
||||||
|
function backTambahStep(){
|
||||||
|
document.getElementById('tambahStep1').classList.remove('d-none');
|
||||||
|
document.getElementById('tambahStep2').classList.add('d-none');
|
||||||
|
|
||||||
|
document.getElementById('tambahNextBtn').classList.remove('d-none');
|
||||||
|
document.getElementById('tambahSubmitBtn').classList.add('d-none');
|
||||||
|
document.getElementById('tambahBackBtn').classList.add('d-none');
|
||||||
|
}
|
||||||
|
|
||||||
|
function addSoal(){
|
||||||
|
let html = `
|
||||||
|
<div class="border rounded p-3 mb-3">
|
||||||
|
<div class="mb-2">
|
||||||
|
<label>Pertanyaan</label>
|
||||||
|
<textarea name="pertanyaan[]" class="form-control" required></textarea>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6 mb-2">
|
||||||
|
<input type="text" name="opsi_a[]" class="form-control" placeholder="Opsi A" required>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 mb-2">
|
||||||
|
<input type="text" name="opsi_b[]" class="form-control" placeholder="Opsi B" required>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 mb-2">
|
||||||
|
<input type="text" name="opsi_c[]" class="form-control" placeholder="Opsi C" required>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 mb-2">
|
||||||
|
<input type="text" name="opsi_d[]" class="form-control" placeholder="Opsi D" required>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-2">
|
||||||
|
<label>Jawaban Benar</label>
|
||||||
|
<select name="jawaban_benar[]" class="form-control" required>
|
||||||
|
<option value="A">A</option>
|
||||||
|
<option value="B">B</option>
|
||||||
|
<option value="C">C</option>
|
||||||
|
<option value="D">D</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
|
||||||
|
document.getElementById('soalContainer').insertAdjacentHTML('beforeend', html);
|
||||||
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@endsection
|
@endsection
|
||||||
|
|
@ -102,18 +102,10 @@
|
||||||
->only(['index']);
|
->only(['index']);
|
||||||
Route::resource('challenge', AdminChallengeController::class);
|
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
|
// LOGOUT ADMIN
|
||||||
Route::post('/logout', [LoginController::class, 'logout'])
|
Route::post('/logout', [LoginController::class, 'logout'])
|
||||||
->name('logout');
|
->name('logout');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
// =======================================================
|
// =======================================================
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue