Fitur Kuesioner

-Pembuatan tampilan Kuesioner(Admin)
-Pembuatan CRUD Kuesioner(Admin)
-Pembuatan tampilan Kuesioner(Mahasiswa/User)
This commit is contained in:
DimazzP 2023-09-27 19:10:44 +07:00
parent 178870ee04
commit 7a82c8df64
16 changed files with 9896 additions and 1185 deletions

View File

@ -0,0 +1,41 @@
<?php
namespace App\Http\Controllers\AdminBackend;
use App\Http\Controllers\Controller;
use App\Models\Kuesioner;
use Illuminate\Http\Request;
class AdminQuestionnaireController extends Controller
{
public function index()
{
$kuesioners = Kuesioner::get();
return view('admin_backend.admin_questionnaire', compact('kuesioners'));
}
public function store(Request $request)
{
Kuesioner::create([
'kategori_soal' => $request->create_kategori,
'soal' => $request->create_soal,
]);
return redirect()->route('adminQuestionnaire.index')->with('success', 'Soal berhasil disimpan');
}
public function update(Request $request, $admin_questionnaire)
{
$kuesioner = Kuesioner::findOrFail($admin_questionnaire);
$kuesioner->kategori_soal = $request->edit_kategori;
$kuesioner->soal = $request->edit_soal;
$kuesioner->update();
return redirect()->route('adminQuestionnaire.index')->with('success', 'Soal berhasil diubah');
}
public function destroy($admin_questionnaire)
{
$kuesioner = Kuesioner::findOrFail($admin_questionnaire);
$kuesioner->delete();
return redirect()->route('adminQuestionnaire.index')->with('success', 'Soal telah dihapus');
}
}

View File

@ -0,0 +1,14 @@
<?php
namespace App\Http\Controllers\Backend;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class QuestionnaireController extends Controller
{
public function index()
{
return view('backend.users_questionnaire');
}
}

16
app/Models/Kuesioner.php Normal file
View File

@ -0,0 +1,16 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Kuesioner extends Model
{
use HasFactory;
protected $table = 'kuesioner';
protected $fillable = [
'soal',
'kategori_soal',
];
}

View File

@ -630,7 +630,6 @@ .sidebar::-webkit-scrollbar-thumb {
}
@media (min-width: 1200px) {
#main,
#footer {
margin-left: 300px;
@ -644,7 +643,6 @@ @media (max-width: 1199px) {
}
@media (min-width: 1200px) {
.toggle-sidebar #main,
.toggle-sidebar #footer {
margin-left: 0;
@ -1149,7 +1147,7 @@ .contact .php-email-form textarea {
padding: 12px 15px;
}
.contact .php-email-form button[type=submit] {
.contact .php-email-form button[type="submit"] {
background: #4154f1;
border: 0;
padding: 10px 30px;
@ -1158,7 +1156,7 @@ .contact .php-email-form button[type=submit] {
border-radius: 4px;
}
.contact .php-email-form button[type=submit]:hover {
.contact .php-email-form button[type="submit"]:hover {
background: #5969f3;
}
@ -1231,3 +1229,15 @@ .footer .credits {
font-size: 13px;
color: #012970;
}
.td-ellipsis {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 0px;
}
.ellipsis {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}

View File

@ -0,0 +1,16 @@
const Toast = Swal.mixin({
toast: true,
position: "top-end",
showConfirmButton: false,
timer: 3000,
timerProgressBar: true,
didOpen: (toast) => {
toast.addEventListener("mouseenter", Swal.stopTimer);
toast.addEventListener("mouseleave", Swal.resumeTimer);
},
});
Toast.fire({
icon: "success",
title: "Berhasil disimpan",
});

View File

@ -630,7 +630,6 @@ .sidebar::-webkit-scrollbar-thumb {
}
@media (min-width: 1200px) {
#main,
#footer {
margin-left: 300px;
@ -644,7 +643,6 @@ @media (max-width: 1199px) {
}
@media (min-width: 1200px) {
.toggle-sidebar #main,
.toggle-sidebar #footer {
margin-left: 0;
@ -1149,7 +1147,7 @@ .contact .php-email-form textarea {
padding: 12px 15px;
}
.contact .php-email-form button[type=submit] {
.contact .php-email-form button[type="submit"] {
background: #4154f1;
border: 0;
padding: 10px 30px;
@ -1158,7 +1156,7 @@ .contact .php-email-form button[type=submit] {
border-radius: 4px;
}
.contact .php-email-form button[type=submit]:hover {
.contact .php-email-form button[type="submit"]:hover {
background: #5969f3;
}
@ -1231,3 +1229,7 @@ .footer .credits {
font-size: 13px;
color: #012970;
}
.font-bold {
font-weight: bold;
}

2341
public/css/sweealert2.all.min.js vendored Normal file

File diff suppressed because one or more lines are too long

5966
public/js/jquery.js vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,168 @@
@extends('admin_backend/layouts.template')
@section('content')
<main id="main" class="main">
<div class="bg-white p-3">
{{--! start header --}}
<div class="row">
<div class="col-12 col-md-9 col-lg-10">
<h3 style="font-weight: bold">Soal Kuisioner</h3>
<p class="text-secondary">Lorem ipsum dolor sit amet consectetur adipisicing elit. Nesciunt aliquam fugit delectus nulla totam dolorem qui, corrupti perferendis mollitia vitae.</p>
</div>
<div class="mb-2 col-12 col-md-3 text-md-end align-center text-center col-lg-2">
<button class="btn btn-primary ellipsis" data-bs-toggle="modal" data-bs-target="#exampleModal">+ Buat Soal Baru</button>
</div>
</div>
{{--! end header --}}
{{--! start table --}}
<div class="my-3">
<table class="table">
<thead class="table-light">
<th class="text-secondary col-1 col-md-1">NOMOR</th>
<th class="text-secondary col-6 col-md-8">NAMA</th>
<th class="text-secondary col-5 col-md-3">ACTION</th>
</thead>
<tbody>
@foreach ($kuesioners as $index => $kuesioner)
<tr>
<td>{{ $index+1 }}</td>
<td class="td-ellipsis mt-1">{{ $kuesioner->soal }}</td>
<td>
{{-- <button class="btn btn-outline-dark btn-sm edit-button" data-bs-toggle="modal" data-bs-target="#exampleModalEdit" data-soal="cobadulu"><i class="bi bi-pencil"></i>Edit</button> --}}
<button class="btn btn-outline-dark btn-sm edit-button" data-bs-toggle="modal" data-bs-target="#editModal" data-kuesioner='{{ json_encode($kuesioner) }}'>
<i class="bi bi-pencil"></i>
Edit
</button>
<span class="p-1"></span>
<form action="{{ route('adminQuestionnaire.destroy', ['admin_questionnaire'=>$kuesioner->id]) }}" class="d-inline delete-form" method="POST">
@csrf
@method('DELETE')
<button class="btn btn-outline-danger btn-sm mt-1 mt-sm-0"><i class="bi bi-trash"></i>Hapus</button>
</form>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
{{--! end table --}}
{{--! start modal create --}}
<form action="{{ route('adminQuestionnaire.store') }}" method="POST" class="needs-validation" novalidate>
@csrf
<div class="modal fade" id="exampleModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">Buat Kuesioner</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<div class="mb-3">
<label for="create-kategori" class="col-form-label">Kategori soal:</label>
<select class="form-select" name="create_kategori" id="create-kategori">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
</select>
</div>
<div class="mb-3">
<label for="create-soal" class="col-form-label">Soal:</label>
<textarea class="form-control" name="create_soal" id="create-soal" rows="3" required></textarea>
<div class="invalid-feedback">
<i class="bi bi-exclamation-circle-fill"></i> Soal belum diisi!
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Tutup</button>
<button type="submit" class="btn btn-primary">Simpan</button>
</div>
</div>
</div>
</div>
</form>
{{--! end modal create --}}
{{--! start edit modal --}}
<form method="POST" id="edit-form" action="{{ route('adminQuestionnaire.update', ['admin_questionnaire' => '1']) }}" class="needs-validation" novalidate>
@csrf
@method('PUT')
<div class="modal fade" id="editModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">Edit Data</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<div class="mb-3">
<label for="edit-kategori" class="col-form-label">Kategori soal:</label>
<select class="form-select" name="edit_kategori" id="edit-kategori">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
</select>
</div>
<div class="mb-3">
<label for="edit-soal" class="col-form-label">Soal:</label>
<textarea class="form-control" name="edit_soal" id="edit-soal" rows="3" required></textarea>
<div class="invalid-feedback">
<i class="bi bi-exclamation-circle-fill"></i> Soal belum diisi!
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Tutup</button>
<button type="submit" class="btn btn-primary">Simpan Perubahan</button>
</div>
</div>
</div>
</div>
</form>
{{--! end edit modal --}}
</div>
</main>
@endsection
@section('script')
<script>
$(document).ready(function () {
$('.edit-button').click(function () {
let kuesionerData = $(this).data('kuesioner');
$('#edit-soal').val(kuesionerData.soal);
$('#edit-kategori').val(kuesionerData.kategori_soal);
let formAction = "{{ route('adminQuestionnaire.update', ['admin_questionnaire' => 'masuk_sini']) }}".replace('masuk_sini', kuesionerData.id);
$('#edit-form').attr('action', formAction);
});
$('.delete-form').click(function(event){
event.preventDefault();
Swal.fire({
title: 'Are you sure?',
text: "You won't be able to revert this!",
icon: 'warning',
showCancelButton: true,
confirmButtonColor: '#dc3545',
cancelButtonColor: '#6c757d',
confirmButtonText: 'Yes, delete it!',
reverseButtons: true
}).then((result) => {
if (result.isConfirmed) {
$(this).submit();
}
})
});
});
</script>
@endsection

View File

@ -13,7 +13,7 @@
</li><!-- End Dashboard Nav -->
<li class="nav-item">
<a class="nav-link collapsed" href="{{ asset('admin_backend/user-profile.html')}}">
<a class="nav-link collapsed" href="{{ route('adminQuestionnaire.index')}}">
<i class="bi bi-pencil"></i>
<span>Kuesioner</span>
</a>

View File

@ -163,6 +163,7 @@
<a href="#" class="back-to-top d-flex align-items-center justify-content-center"><i class="bi bi-arrow-up-short"></i></a>
<!-- Vendor JS Files -->
<script src="{{ asset('js/jquery.js')}}"></script>
<script src="{{ asset('admin_backend/assets/vendor/apexcharts/apexcharts.min.js')}}"></script>
<script src="{{ asset('admin_backend/assets/vendor/bootstrap/js/bootstrap.bundle.min.js')}}"></script>
<script src="{{ asset('admin_backend/assets/vendor/chart.js/chart.umd.js')}}"></script>
@ -172,8 +173,33 @@
<script src="{{ asset('admin_backend/assets/vendor/tinymce/tinymce.min.js')}}"></script>
<script src="{{ asset('admin_backend/assets/vendor/php-email-form/validate.js')}}"></script>
<!-- Template Main JS File -->
<script src="{{ asset('admin_backend/assets/js/main.js')}}"></script>
<script src="{{ asset('css/sweealert2.all.min.js')}}"></script>
@yield('script')
@if (session('success'))
<script>
const Toast = Swal.mixin({
toast: true,
position: 'top-end',
showConfirmButton: false,
timer: 3000,
timerProgressBar: true,
didOpen: (toast) => {
toast.addEventListener('mouseenter', Swal.stopTimer)
toast.addEventListener('mouseleave', Swal.resumeTimer)
}
});
Toast.fire({
icon: 'success',
title: '{{ session('success') }}'
});
</script>
@endif
</body>

View File

@ -17,7 +17,7 @@
</li><!-- End Dashboard Nav -->
<li class="nav-item">
<a class="nav-link collapsed" href="{{ asset('backend/user-profile.html')}}">
<a class="nav-link collapsed" href="{{ route('user.instruction')}}">
<i class="bi bi-pencil"></i>
<span>Kuesioner</span>
</a>

View File

@ -159,6 +159,7 @@
<a href="#" class="back-to-top d-flex align-items-center justify-content-center"><i class="bi bi-arrow-up-short"></i></a>
<!-- Vendor JS Files -->
<script src="{{ asset('js/jquery.js')}}"></script>
<script src="{{ asset('backend/assets/vendor/apexcharts/apexcharts.min.js')}}"></script>
<script src="{{ asset('backend/assets/vendor/bootstrap/js/bootstrap.bundle.min.js')}}"></script>
<script src="{{ asset('backend/assets/vendor/chart.js/chart.umd.js')}}"></script>

View File

@ -0,0 +1,55 @@
@extends('backend/layouts.template')
@section('content')
<main id="main" class="main">
<div class="pagetitle">
<h1>Instruksi</h1>
<nav>
<ol class="breadcrumb">
</ol>
</nav>
</div>
<div class="bg-white p-3">
<h4 class="font-bold">Petunjuk Pengisian Kuesioner</h4>
<h6 class="font-bold pt-4">Petunjuk Pengisian</h6>
<div class="pt-1">
<div class="d-flex flex-row text-secondary">
<p class="pe-2">1.</p>
<p>Pada kuisioner, tiap pernyataan diisi sesuai dengan keadaan sebenarnya, hal ini bertujuan untuk mengetahui kemampuan metakognitif pada diri Saudara</p>
</div>
<div class="d-flex flex-row text-secondary">
<p class="pe-2">2.</p>
<p>Baca dengan teliti tiap pernyataan agar tidak terjadi kesalahan pada saat pengisiian</p>
</div>
<div class="d-flex flex-row text-secondary">
<p class="pe-2">3.</p>
<p>Pilih radio button pada kolom nomor sesuai dengan keadaan Saudara</p>
</div>
<div class="d-flex flex-row text-secondary">
<p class="pe-2">4.</p>
<p>Apabila terdapat kesulitan dalam proses pengisian, tanyakan pada tim yang bertugas</p>
</div>
</div>
<div class="rounded mt-4 bg-light p-3">
<h6 class="font-bold">Makna Skor</h6>
<div class="mt-1">
<input type="radio" disabled><span class="ms-3 font-bold h6">0 = Tidak Pernah</span>
</div>
<div class="mt-1">
<input type="radio" disabled><span class="ms-3 font-bold h6">1 = Jarang</span>
</div>
<div class="mt-1">
<input type="radio" disabled><span class="ms-3 font-bold h6">2 = Kadang-kadang</span>
</div>
<div class="mt-1">
<input type="radio" disabled><span class="ms-3 font-bold h6">3 = Sering</span>
</div>
<div class="mt-1">
<input type="radio" disabled><span class="ms-3 font-bold h6">4 = Selalu</span>
</div>
</div>
<div class="mt-4 mb-1 text-center">
<a href="{{ route('userQuestionnaire.index') }}" class="btn btn-primary">Mulai Isi Kuesioner <i class="bi bi-arrow-right"></i></a>
</div>
</div>
</main>
@endsection

View File

@ -0,0 +1,52 @@
@extends('backend.layouts.template')
@section('content')
<main id="main" class="main bg-white">
<div class="pagetitle">
<h1>Isi Kuesioner</h1>
<nav>
<ol class="breadcrumb">
<li class="breadcrumb-item"><a href="{{ route('user.instruction') }}">Instruksi</a></li>
<li class="breadcrumb-item active">Isi Kuesioner</li>
</ol>
</nav>
</div>
{{--! start fill --}}
<form action="" class="needs-validation" novalidate>
<div class="bg-light rounded p-3 mt-3">
<div class="d-flex flex-row">
<p class="me-1">1.</p>
<div>
<p>Saya bertanya kepada diri sendiri, ”Apakah saya sudah mencapai tujuan saya?, ketika sedang berupaya mencapai tujuan secara intensif.</p>
<input type="radio" class="form-check-input" id="flexRadio1" name="optionsGroup" required>
<label class="form-check-label pe-1 pe-sm-5 ps-1" for="flexRadio1">1</label>
<input type="radio" class="form-check-input" id="flexRadio2" name="optionsGroup">
<label class="form-check-label pe-1 pe-sm-5 ps-1" for="flexRadio2">2</label>
<input type="radio" class="form-check-input" id="flexRadio3" name="optionsGroup">
<label class="form-check-label pe-1 pe-sm-5 ps-1" for="flexRadio3">3</label>
<input type="radio" class="form-check-input" id="flexRadio4" name="optionsGroup">
<label class="form-check-label pe-1 pe-sm-5 ps-1" for="flexRadio4">4</label>
<input type="radio" class="form-check-input" id="flexRadio5" name="optionsGroup">
<label class="form-check-label pe-1 pe-sm-5 ps-1" for="flexRadio5">5</label>
<div class="invalid-feedback mt-3 text-end">
<i class="bi bi-exclamation-circle-fill"></i> Pertanyaan belum dijawab!
</div>
</div>
</div>
</div>
<div class="pt-5">
<button type="submit" class="btn btn-primary px-5">Submit</button>
</div>
</form>
{{--! end fill --}}
</main>
@endsection

View File

@ -1,5 +1,6 @@
<?php
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Route;
@ -17,8 +18,7 @@
// Route::get('/', function () {
// return view('frontend.home');
// });
Route::group(['namespace'=>'Frontend'], function()
{
Route::group(['namespace' => 'Frontend'], function () {
Route::resource('/', 'HomeController');
});
@ -27,23 +27,26 @@
Route::middleware(['class:3'])->group(function () {
// Definisikan rute untuk mahasiswa di sini, misalnya dashboard.
// Route::get('/dashboard', [DashboardController::class, 'index'])->name('dashboard');
Route::group(['namespace'=>'Backend'], function()
{
Route::group(['namespace' => 'Backend'], function () {
Route::resource('dashboard', 'DashboardController');
Route::resource('profile', 'ProfileController');
Route::resource('questionnaire', 'QuestionnaireController')->names('userQuestionnaire');
Route::get('instruction', function () {
return view('backend.questionnaire_instructions');
})->name('user.instruction');
});
});
Route::middleware(['class:1,2'])->group(function () {
// Definisikan rute untuk dosen di sini, misalnya halaman admin.
// Route::get('/admin', [AdminController::class, 'index'])->name('admin');
Route::group(['namespace'=>'AdminBackend'], function()
{
Route::resource('admin', 'AdminDashboardController');
Route::resource('listuser', 'ListUserController');
Route::resource('listadmin', 'ListAdminController');
Route::group(['namespace' => 'AdminBackend'], function () {
Route::resource('admin', 'AdminDashboardController')->names('adminDashboard');
Route::resource('listuser', 'ListUserController')->names('adminListUser');
Route::resource('listadmin', 'ListAdminController')->names('adminListAdmin');
Route::resource('admin-questionnaire', 'AdminQuestionnaireController')->names('adminQuestionnaire');
// Route::post('listuser', [UserController::class, 'store']);
});
});
Auth::routes();