This commit is contained in:
Muhammad Thoriq 2025-12-01 13:22:55 +07:00
parent eba04dd44b
commit d30e407d8c
10 changed files with 710 additions and 149 deletions

View File

@ -0,0 +1,270 @@
<?php
namespace App\Http\Controllers;
use App\Models\Jawaban;
use App\Models\SoalDetail;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Yajra\DataTables\DataTables;
class AdminController extends Controller
{
//
public function index()
{
$data['list_unit_kerja'] = [
"Direktur Utama dan Direksi",
"Satuan Pengawas Internal",
"Komite Mutu",
"Komite Medik",
"Komite Keperawatan",
"Komite PPI & PRA",
"KTKL",
"KFT",
"KEH",
"ULP",
"Timker Yankep",
"Timker Yanjang",
"Timker Perencanaan, Evaluasi dan Program",
"Timker Hukum dan Humas",
"Timker Yanmed",
"Timker Perencanaan dan Evaluasi Anggaran",
"Timker Akutansi dan BMN",
"Timker Organisasi dan Sumber Daya Manusia",
"Timker TU & RT",
"Timker Diklat",
"Timker Penelitian",
"Timker Pelaksanan Keuangan",
"Instalasi Rawat Inap",
"Instalasi Rawat Jalan Reguler",
"Instalasi Rawat Intensif / ICU",
"Instalasi Rehabilitasi Medik",
"Instalasi Gizi",
"Instalasi Laboratorium Terpadu",
"Instalasi Sistem Informasi Manajemen Rumah Sakit (SIMRS)",
"Instalasi Bedah Sentral",
"Instalasi Radiologi",
"Instalasi Farmasi",
"Instalasi Rekam Medis",
"Instalasi Gawat Darurat",
"Instalasi Verifikasi dan Penjaminan Pasien",
"Instalasi KL & K3RS",
"ISSB",
"IPT",
"IPJNI",
"IPSPRS",
"IPPB",
"IPPISGB",
"Instalasi Rawat Jalan Eksekutif",
"Instalasi Teknologi Berbantu (TRB)",
"Klinik Utama Bintaro",
"KSM Anak",
"KSM Obstetri & Ginekologi",
"KSM Bedah",
"KSM Anestesi",
"KSM Gigi & Mulut",
"KSM Spesialis Lain",
"KSM Umum",
"Lainnya (Mahasiswa dan Outsourcing)"
];
return view('admin.dashboard', $data);
}
public function get_data_pegawai_sudah_survey(Request $request)
{
$query = Jawaban::query();
if ($request->nama_pegawai) {
$query->where('nama', 'ILIKE', '%' . $request->nama_pegawai . '%');
}
if ($request->unit_kerja) {
$query->whereIn('unit', $request->unit_kerja);
}
return DataTables::of($query)->make(true);
}
public function dashboard_analisis()
{
$data['list_unit_kerja'] = [
"Direktur Utama dan Direksi",
"Satuan Pengawas Internal",
"Komite Mutu",
"Komite Medik",
"Komite Keperawatan",
"Komite PPI & PRA",
"KTKL",
"KFT",
"KEH",
"ULP",
"Timker Yankep",
"Timker Yanjang",
"Timker Perencanaan, Evaluasi dan Program",
"Timker Hukum dan Humas",
"Timker Yanmed",
"Timker Perencanaan dan Evaluasi Anggaran",
"Timker Akutansi dan BMN",
"Timker Organisasi dan Sumber Daya Manusia",
"Timker TU & RT",
"Timker Diklat",
"Timker Penelitian",
"Timker Pelaksanan Keuangan",
"Instalasi Rawat Inap",
"Instalasi Rawat Jalan Reguler",
"Instalasi Rawat Intensif / ICU",
"Instalasi Rehabilitasi Medik",
"Instalasi Gizi",
"Instalasi Laboratorium Terpadu",
"Instalasi Sistem Informasi Manajemen Rumah Sakit (SIMRS)",
"Instalasi Bedah Sentral",
"Instalasi Radiologi",
"Instalasi Farmasi",
"Instalasi Rekam Medis",
"Instalasi Gawat Darurat",
"Instalasi Verifikasi dan Penjaminan Pasien",
"Instalasi KL & K3RS",
"ISSB",
"IPT",
"IPJNI",
"IPSPRS",
"IPPB",
"IPPISGB",
"Instalasi Rawat Jalan Eksekutif",
"Instalasi Teknologi Berbantu (TRB)",
"Klinik Utama Bintaro",
"KSM Anak",
"KSM Obstetri & Ginekologi",
"KSM Bedah",
"KSM Anestesi",
"KSM Gigi & Mulut",
"KSM Spesialis Lain",
"KSM Umum",
"Lainnya (Mahasiswa dan Outsourcing)"
];
return view('admin.dashboard_analisis', $data);
}
public function get_data_dashboard_analisis(Request $request)
{
try {
$soal = SoalDetail::all()->sortBy('id')->values()->toArray();
$data = [];
foreach ($soal as $key => $value) {
$jawaban = [];
$soal_json = json_decode($value['soal'], true);
$sub = DB::table('lms_mutu_jawaban_detail')
->select('lms_mutu_soal_detail_id', DB::raw('COUNT(*) AS total_semua'))
->join(
'lms_mutu_jawaban',
'lms_mutu_jawaban_detail.lms_mutu_jawaban_id',
'=',
'lms_mutu_jawaban.id'
)
->where('lms_mutu_soal_detail_id', $value['id']);
if($request->unit_kerja) {
$sub->whereIn('lms_mutu_jawaban.unit', $request->unit_kerja);
}
$sub->groupBy('lms_mutu_soal_detail_id');
$result = DB::table('lms_mutu_jawaban_detail AS d')
->joinSub($sub, 't', function($join) {
$join->on('t.lms_mutu_soal_detail_id', '=', 'd.lms_mutu_soal_detail_id');
})
->join(
'lms_mutu_jawaban',
'd.lms_mutu_jawaban_id',
'=',
'lms_mutu_jawaban.id'
)
->selectRaw(
'd.lms_mutu_soal_detail_id,
d.jawaban,
COUNT(*) AS total_jawaban,
t.total_semua,
ROUND((COUNT(*)::numeric / t.total_semua::numeric) * 100) AS percent'
)
->where('d.lms_mutu_soal_detail_id', $value['id'])
->groupBy('d.lms_mutu_soal_detail_id', 'd.jawaban', 't.total_semua');
if($request->unit_kerja) {
$result->whereIn('lms_mutu_jawaban.unit', $request->unit_kerja);
}
$result->orderBy('d.lms_mutu_soal_detail_id', 'asc');
if(count($soal_json['options']) > 0){
foreach ($soal_json['options'] as $v) {
if($v != 'Lainnya'){
$row = (clone $result)->where('d.jawaban', $v)
->first();
if($row) {
$data_per_jawaban = [
'name' => $v,
'y' => (float) $row->percent,
'value' => $row->total_jawaban,
'total' => $row->total_semua
];
array_push($jawaban, $data_per_jawaban);
} else {
$data_per_jawaban = [
'name' => $v,
'y' => 0
];
array_push($jawaban, $data_per_jawaban);
}
} else {
$get_data = (clone $result)->whereNotIn('d.jawaban', $soal_json['options'])
->get()
->toArray();
foreach ($get_data as $val) {
$data_per_jawaban = [
'name' => $val->jawaban,
'y' => (float) $val->percent,
'value' => $val->total_jawaban,
'total' => $val->total_semua
];
array_push($jawaban, $data_per_jawaban);
}
}
}
} else {
$get_data = $result->get()
->toArray();
foreach ($get_data as $val) {
$data_per_jawaban = [
'name' => $val->jawaban,
'y' => (float) $val->percent,
'value' => $val->total_jawaban,
'total' => $val->total_semua
];
array_push($jawaban, $data_per_jawaban);
}
}
$data_persoal = [
'soal' => $soal_json['soal'],
'jawaban' => $jawaban
];
array_push($data, $data_persoal);
}
return response()->json([
'msg' => 'Berhasil',
'data' => $data
], 200);
} catch (\ErrorException $th) {
return response()->json([
'msg' => 'Oops something wrong!',
'data' => null,
'msg_dev' => $th
], 500);
}
}
}

View File

@ -8,7 +8,8 @@
"require": {
"php": "^8.2",
"laravel/framework": "^11.31",
"laravel/tinker": "^2.9"
"laravel/tinker": "^2.9",
"yajra/laravel-datatables-oracle": "11.0"
},
"require-dev": {
"fakerphp/faker": "^1.23",

91
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "626b9e7ddd47fb7eff9aaa53cce0c9ad",
"content-hash": "7ae784044cc087af521c6abbb3c6e2c8",
"packages": [
{
"name": "brick/math",
@ -5916,6 +5916,95 @@
}
],
"time": "2024-11-21T01:49:47+00:00"
},
{
"name": "yajra/laravel-datatables-oracle",
"version": "v11.0.0",
"source": {
"type": "git",
"url": "https://github.com/yajra/laravel-datatables.git",
"reference": "f4d8a8df5fd2ac26fb6384f9caa41596bd79c305"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/yajra/laravel-datatables/zipball/f4d8a8df5fd2ac26fb6384f9caa41596bd79c305",
"reference": "f4d8a8df5fd2ac26fb6384f9caa41596bd79c305",
"shasum": ""
},
"require": {
"illuminate/database": "^11",
"illuminate/filesystem": "^11",
"illuminate/http": "^11",
"illuminate/support": "^11",
"illuminate/view": "^11",
"php": "^8.2"
},
"require-dev": {
"algolia/algoliasearch-client-php": "^3.4.1",
"larastan/larastan": "^2.9.1",
"laravel/pint": "^1.14",
"laravel/scout": "^10.8.3",
"meilisearch/meilisearch-php": "^1.6.1",
"orchestra/testbench": "^9",
"rector/rector": "^1.0"
},
"suggest": {
"yajra/laravel-datatables-buttons": "Plugin for server-side exporting of dataTables.",
"yajra/laravel-datatables-editor": "Plugin to use DataTables Editor (requires a license).",
"yajra/laravel-datatables-export": "Plugin for server-side exporting using livewire and queue worker.",
"yajra/laravel-datatables-fractal": "Plugin for server-side response using Fractal.",
"yajra/laravel-datatables-html": "Plugin for server-side HTML builder of dataTables."
},
"type": "library",
"extra": {
"laravel": {
"aliases": {
"DataTables": "Yajra\\DataTables\\Facades\\DataTables"
},
"providers": [
"Yajra\\DataTables\\DataTablesServiceProvider"
]
},
"branch-alias": {
"dev-master": "11.x-dev"
}
},
"autoload": {
"files": [
"src/helper.php"
],
"psr-4": {
"Yajra\\DataTables\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Arjay Angeles",
"email": "aqangeles@gmail.com"
}
],
"description": "jQuery DataTables API for Laravel",
"keywords": [
"datatables",
"jquery",
"laravel",
"yajra"
],
"support": {
"issues": "https://github.com/yajra/laravel-datatables/issues",
"source": "https://github.com/yajra/laravel-datatables/tree/v11.0.0"
},
"funding": [
{
"url": "https://github.com/sponsors/yajra",
"type": "github"
}
],
"time": "2024-03-14T04:05:21+00:00"
}
],
"packages-dev": [

127
config/datatables.php Normal file
View File

@ -0,0 +1,127 @@
<?php
return [
/*
* DataTables search options.
*/
'search' => [
/*
* Smart search will enclose search keyword with wildcard string "%keyword%".
* SQL: column LIKE "%keyword%"
*/
'smart' => true,
/*
* Multi-term search will explode search keyword using spaces resulting into multiple term search.
*/
'multi_term' => true,
/*
* Case insensitive will search the keyword in lower case format.
* SQL: LOWER(column) LIKE LOWER(keyword)
*/
'case_insensitive' => true,
/*
* Wild card will add "%" in between every characters of the keyword.
* SQL: column LIKE "%k%e%y%w%o%r%d%"
*/
'use_wildcards' => false,
/*
* Perform a search which starts with the given keyword.
* SQL: column LIKE "keyword%"
*/
'starts_with' => false,
],
/*
* DataTables internal index id response column name.
*/
'index_column' => 'DT_RowIndex',
/*
* List of available builders for DataTables.
* This is where you can register your custom dataTables builder.
*/
'engines' => [
'eloquent' => Yajra\DataTables\EloquentDataTable::class,
'query' => Yajra\DataTables\QueryDataTable::class,
'collection' => Yajra\DataTables\CollectionDataTable::class,
'resource' => Yajra\DataTables\ApiResourceDataTable::class,
],
/*
* DataTables accepted builder to engine mapping.
* This is where you can override which engine a builder should use
* Note, only change this if you know what you are doing!
*/
'builders' => [
//Illuminate\Database\Eloquent\Relations\Relation::class => 'eloquent',
//Illuminate\Database\Eloquent\Builder::class => 'eloquent',
//Illuminate\Database\Query\Builder::class => 'query',
//Illuminate\Support\Collection::class => 'collection',
],
/*
* Nulls last sql pattern for PostgreSQL & Oracle.
* For MySQL, use 'CASE WHEN :column IS NULL THEN 1 ELSE 0 END, :column :direction'
*/
'nulls_last_sql' => ':column :direction NULLS LAST',
/*
* User friendly message to be displayed on user if error occurs.
* Possible values:
* null - The exception message will be used on error response.
* 'throw' - Throws a \Yajra\DataTables\Exceptions\Exception. Use your custom error handler if needed.
* 'custom message' - Any friendly message to be displayed to the user. You can also use translation key.
*/
'error' => env('DATATABLES_ERROR', null),
/*
* Default columns definition of dataTable utility functions.
*/
'columns' => [
/*
* List of columns hidden/removed on json response.
*/
'excess' => ['rn', 'row_num'],
/*
* List of columns to be escaped. If set to *, all columns are escape.
* Note: You can set the value to empty array to disable XSS protection.
*/
'escape' => '*',
/*
* List of columns that are allowed to display html content.
* Note: Adding columns to list will make us available to XSS attacks.
*/
'raw' => ['action'],
/*
* List of columns are forbidden from being searched/sorted.
*/
'blacklist' => ['password', 'remember_token'],
/*
* List of columns that are only allowed fo search/sort.
* If set to *, all columns are allowed.
*/
'whitelist' => '*',
],
/*
* JsonResponse header and options config.
*/
'json' => [
'header' => [],
'options' => 0,
],
/*
* Default condition to determine if a parameter is a callback or not.
* Callbacks needs to start by those terms, or they will be cast to string.
*/
'callback' => ['$', '$.', 'function'],
];

View File

@ -0,0 +1,81 @@
@extends('layouts.template_admin')
@section('title', 'Dashboard | Mutu RSAB Harapan Kita')
@section('custom_css')
@endsection
@section('content')
<div class="card">
<div class="card-body">
<div class="card-title fs-4 fw-bold">Dashboard</div>
<div class="mt-5">
<div class="d-flex gap-2 align-items-end">
<div class="form-group w-50">
<label for="nama_pegawai" class="form-label">Nama Pegawai</label>
<input type="text" class="form-control" id="nama_pegawai" placeholder="John Doe" />
</div>
<div class="form-group w-75">
<label for="select_unit_kerja" class="form-label">Unit Kerja</label>
<select id="select_unit_kerja" class="select2 form-select" multiple>
@foreach ($list_unit_kerja as $item)
<option value="{{ $item }}">{{ $item }}</option>
@endforeach
</select>
</div>
<div class="w-100">
<div class="btn btn-primary" id="search_button">
Cari
</div>
</div>
</div>
<div class="mt-3">
<div class="table-responsive">
<table id="table" class="dt-complex-header table table-bordered">
<thead class="bg-primary" id="table_header">
<tr>
<th class="text-white fs-5">Nama Pegawai</th>
<th class="text-white fs-5">Unit Kerja</th>
<th class="text-white fs-5">Tanggal Isi</th>
</tr>
</thead>
</table>
</div>
</div>
</div>
</div>
</div>
@endsection
@section('custom_js')
<script>
let table = null;
$(document).ready(function(){
$(".select2").select2();
$('#search_button').click(function(){
$('#table').DataTable().ajax.reload();
});
generateTable();
});
function generateTable() {
$('#table').DataTable({
processing: true,
serverSide: true,
ajax: {
url: `{{ url('/admin/get_data_pegawai_sudah_survey') }}`,
type: 'POST',
data: function (d) {
d.nama_pegawai = $('#nama_pegawai').val();
d.unit_kerja = $('#select_unit_kerja').val();
d._token = '{{ csrf_token() }}';
}
},
columns: [
{ data: 'nama' },
{ data: 'unit' },
{ data: 'tanggal_isi' }
]
});
}
</script>
@endsection

View File

@ -0,0 +1,117 @@
@extends('layouts.template_admin')
@section('title', 'Dashboard | Mutu RSAB Harapan Kita')
@section('custom_css')
@endsection
@section('content')
<div class="card">
<div class="card-body">
<div class="card-title fs-4 fw-bold">Dashboard Analisis</div>
<div class="mt-5">
<div class="d-flex gap-2 align-items-end">
<div class="form-group w-75">
<label for="select_unit_kerja" class="form-label">Unit Kerja</label>
<select id="select_unit_kerja" class="select2 form-select" multiple>
@foreach ($list_unit_kerja as $item)
<option value="{{ $item }}">{{ $item }}</option>
@endforeach
</select>
</div>
<div class="w-100">
<div class="btn btn-primary" id="search_button">
Cari
</div>
</div>
</div>
<div class="mt-3" id="body_chart" style="max-height: 80vh; overflow-y: auto;">
</div>
</div>
</div>
</div>
@endsection
@section('custom_js')
<script>
$(document).ready(function(){
$(".select2").select2();
$('#search_button').click(function(){
get_data_analisis();
})
});
function get_data_analisis() {
$('#body_chart').html(`<div class="p-10 d-flex justify-content-center">
<div>
<!-- Fold -->
<div class="sk-fold">
<div class="sk-fold-cube"></div>
<div class="sk-fold-cube"></div>
<div class="sk-fold-cube"></div>
<div class="sk-fold-cube"></div>
</div>
</div>
</div>`);
$.ajax({
url: "{{ url('/admin/get_data_dashboard_jawaban') }}",
type: "POST",
data: {
unit_kerja: $('#select_unit_kerja').val(),
_token: "{{ csrf_token() }}"
},
success: function(res) {
$('#body_chart').html("");
res.data.forEach((element, index) => {
const id = `chart_analisis_${index}`;
$('#body_chart').append(`<div id="${id}" class="my-3"></div>`);
generateChart(element.jawaban, id, element.soal);
});
}
});
}
function generateChart(data, id, soal) {
Highcharts.chart(id, {
chart: { type: 'column' },
title: { text: soal },
xAxis: {
categories: [soal] // cuma 1 kategori (soal)
},
yAxis: {
min: 0,
max: 100
},
credits: { enabled: false },
tooltip: {
useHTML: true,
formatter: function() {
console.log(this.point);
const totalUser = this.point.total_user ?? 0;
const totalSemua = this.point.total_semua ?? 0;
return `
<b>${this.series.name}</b><br>
Nilai: ${this.y}%<br>
Total Jawaban: ${totalUser}<br>
Total Semua: ${totalSemua}
`;
}
},
series: data.map(j => ({
name: j.name,
type: 'column',
data: [{y: j.y, total_user: j.value, total_semua: j.total}]
})),
dataLabels: {
enabled: true,
formatter: function() {
return this.y + '%'; // ⬅️ Tampilkan angka + %
}
}
});
}
</script>
@endsection

View File

@ -1,6 +1,6 @@
@extends('layouts.template_auth')
@section('title', 'Login | SIMPATIK RSAB Harapan Kita')
@section('title', 'Login | Survey Mutu RSAB Harapan Kita')
@section('custom_css')
<style>
@media (min-width: 768px) {
@ -57,89 +57,9 @@
$('#button_login').attr('disabled', 'true');
const username = $('#user_name').val();
if(username == 'admin_pembelajaran'){
$.ajax({
url: "{{ url('admin/login/action') }}",
type: "GET",
success: function(res) {
$.cookie("token", res.data, { expires: 7, path: "/" });
Swal.fire({
position: "top-end",
icon: "success",
text: "Berhasil Login",
showConfirmButton: false,
timer: 1500
}).then((result) => {
window.location.href = '{{ url("/admin") }}';
}).catch((err) => {
});
},
error: function(err) {
console.log(err.responseJSON);
$('#button_login').removeAttr('disabled');
Swal.fire({
position: "top-end",
icon: "error",
text: err?.responseJSON?.message ?? 'oops something wrong!',
showConfirmButton: false,
timer: 1500
});
if(err.status == 422){
const dataErrors = err.responseJSON.errors;
for (let field in dataErrors) {
$(`#${field}_error`).html(dataErrors[field].join(", "));
}
}
}
});
} else {
$.ajax({
url: "{{ getenv('URL_BE') }}publik/login/pegawai",
type: "POST",
data: formData,
processData: false,
contentType: false,
headers: {
"x-klien": 1
},
success: function(res) {
$.cookie("token", res.response.access_token, { expires: 7, path: "/" });
Swal.fire({
position: "top-end",
icon: "success",
text: "Berhasil Login",
showConfirmButton: false,
timer: 1500
}).then((result) => {
window.location.href = '{{ url("/") }}';
// window.location.href = '{{ url("/admin") }}';
}).catch((err) => {
});
},
error: function(err) {
console.log(err.responseJSON);
$('#button_login').removeAttr('disabled');
Swal.fire({
position: "top-end",
icon: "error",
text: err?.responseJSON?.message ?? 'oops something wrong!',
showConfirmButton: false,
timer: 1500
});
if(err.status == 422){
const dataErrors = err.responseJSON.errors;
for (let field in dataErrors) {
$(`#${field}_error`).html(dataErrors[field].join(", "));
}
}
}
});
const password = $('#password').val();
if(username == 'admin' && password == 'admin'){
window.location.href = '{{ url("/admin") }}';
}
}

View File

@ -5,7 +5,7 @@
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>@yield('title', 'SIMPATIK RSAB Harapan Kita')</title>
<title>@yield('title', 'Survey Mutu RSAB Harapan Kita')</title>
<!-- Favicon -->
<link rel="icon" type="image/png" href="{{ asset('vuexy/assets/img/favicon/favicon.png') }}" />
@ -51,23 +51,6 @@
<a class="navbar-brand" href="{{ url('/') }}">
<img src="{{ asset('assets/img/logo-fullname-negatif.png') }}" alt="Logo" height="40" class="d-inline-block align-text-top">
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon" style="filter: invert(1);"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<div class="navbar-nav me-auto">
</div>
<div class="dropdown-center">
<button type="button" class="btn btn-primary d-flex gap-3" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span id="name_account"></span>
<i class="fa fa-user"></i>
</button>
<ul class="dropdown-menu">
<li id="btn_logout"><div class="dropdown-item">Logout</div></li>
</ul>
</div>
</div>
</div>
</nav>
<div class="container-fluid">

View File

@ -5,7 +5,7 @@
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>@yield('title', 'SIMPATIK RSAB Harapan Kita')</title>
<title>@yield('title', 'Mutu RSAB Harapan Kita')</title>
<!-- Favicon -->
<link rel="icon" type="image/png" href="{{ asset('vuexy/assets/img/favicon/favicon.png') }}" />
@ -33,6 +33,7 @@
href="{{ asset('vuexy/assets/vendor/libs/datatables-responsive-bs5/responsive.bootstrap5.css') }}" />
<link rel="stylesheet" href="{{ asset('vuexy/assets/vendor/libs/sweetalert2/sweetalert2.css') }}" />
<link rel="stylesheet" href="{{ asset('vuexy/assets/vendor/libs/select2/select2.css') }} " />
<link rel="stylesheet" href="{{ asset('vuexy/assets/vendor/libs/spinkit/spinkit.css') }}" />
<!-- Helpers -->
<script src="{{ asset('vuexy/assets/vendor/js/helpers.js') }}"></script>
@ -100,7 +101,7 @@
</nav>
<div class="row pe-5">
<!-- Sidebar desktop -->
<aside class="col-md-4 col-lg-3 d-none d-md-block sidebar">
<aside class="col-md-4 col-lg-3 d-none d-md-block sidebar vh-100">
<div class="card rounded-0 h-100">
<div class="card-body px-0">
<div class="text-center mb-5">
@ -113,30 +114,12 @@
</div>
<i class="fa-solid fa-chevron-right"></i>
</a>
<a href="{{ url('/admin/kategori_soal') }}" class="nav-link px-0 list-materi-hover px-3 d-flex justify-content-between align-items-center fs-5">
<a href="{{ url('/admin/dashboard_jawaban') }}" class="nav-link px-0 list-materi-hover px-3 d-flex justify-content-between align-items-center fs-5">
<div class="d-flex gap-2 align-items-center">
<i class="fa-solid fa-circle-question"></i> Kategori Soal
<i class="fa-solid fa-gauge-high"></i> Dashboard Analisis
</div>
<i class="fa-solid fa-chevron-right"></i>
</a>
<a href="{{ url('/admin/kategori_jawaban') }}" class="nav-link px-0 list-materi-hover px-3 d-flex justify-content-between align-items-center fs-5">
<div class="d-flex gap-2 align-items-center">
<i class="fa-solid fa-chalkboard"></i> Kategori Pembelajaran
</div>
<i class="fa-solid fa-chevron-right"></i>
</a>
<a href="{{ url('/admin/bank_soal') }}" class="nav-link px-0 list-materi-hover px-3 d-flex justify-content-between align-items-center fs-5">
<div class="d-flex gap-2 align-items-center">
<i class="fa-solid fa-file-circle-question"></i> Bank Soal
</div>
<i class="fa-solid fa-chevron-right"></i>
</a>
<div class="nav-link px-0 list-materi-hover px-3 d-flex justify-content-between align-items-center fs-5">
<div class="d-flex gap-2 align-items-center">
<i class="fa-solid fa-graduation-cap"></i> Pembelajaran
</div>
<i class="fa-solid fa-chevron-right"></i>
</div>
</nav>
</div>
</div>
@ -154,36 +137,18 @@
<div class="sidebar">
<div class="px-3">
<nav class="nav flex-column list-materi">
<div class="nav-link px-0 list-materi-hover px-3 d-flex justify-content-between align-items-center fs-5">
<a href="{{ url('/admin') }}" class="nav-link px-0 list-materi-hover px-3 d-flex justify-content-between align-items-center fs-5">
<div class="d-flex gap-2 align-items-center">
<i class="fa-solid fa-gauge-high"></i> Dashboard
</div>
<i class="fa-solid fa-chevron-right"></i>
</div>
<div class="nav-link px-0 list-materi-hover px-3 d-flex justify-content-between align-items-center fs-5">
</a>
<a href="{{ url('/admin/dashboard_jawaban') }}" class="nav-link px-0 list-materi-hover px-3 d-flex justify-content-between align-items-center fs-5">
<div class="d-flex gap-2 align-items-center">
<i class="fa-solid fa-circle-question"></i> Kategori Soal
<i class="fa-solid fa-gauge-high"></i> Dashboard
</div>
<i class="fa-solid fa-chevron-right"></i>
</div>
<div class="nav-link px-0 list-materi-hover px-3 d-flex justify-content-between align-items-center fs-5">
<div class="d-flex gap-2 align-items-center">
<i class="fa-solid fa-chalkboard"></i> Kategori Pembelajaran
</div>
<i class="fa-solid fa-chevron-right"></i>
</div>
<div class="nav-link px-0 list-materi-hover px-3 d-flex justify-content-between align-items-center fs-5">
<div class="d-flex gap-2 align-items-center">
<i class="fa-solid fa-file-circle-question"></i> Bank Soal
</div>
<i class="fa-solid fa-chevron-right"></i>
</div>
<div class="nav-link px-0 list-materi-hover px-3 d-flex justify-content-between align-items-center fs-5">
<div class="d-flex gap-2 align-items-center">
<i class="fa-solid fa-graduation-cap"></i> Pembelajaran
</div>
<i class="fa-solid fa-chevron-right"></i>
</div>
</a>
</nav>
</div>
</div>
@ -213,6 +178,7 @@
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.min.js"></script>
<script src="{{ asset('vuexy/assets/vendor/libs/datatables-bs5/datatables-bootstrap5.js') }}"></script>
<script src="{{ asset('vuexy/assets/vendor/libs/select2/select2.js') }}"></script>
<script src="https://code.highcharts.com/highcharts.js"></script>
<script>
const token = $.cookie('token');

View File

@ -1,7 +1,14 @@
<?php
use App\Http\Controllers\AdminController;
use App\Http\Controllers\AuthController;
use App\Http\Controllers\SoalController;
use Illuminate\Support\Facades\Route;
Route::get('/login', [AuthController::class, 'login']);
Route::get('/', [SoalController::class, 'index'])->name('soal.index');
Route::post('/jawaban', [SoalController::class, 'store'])->name('soal.store');
Route::get('/admin', [AdminController::class, 'index']);
Route::post('/admin/get_data_pegawai_sudah_survey', [AdminController::class, 'get_data_pegawai_sudah_survey']);
Route::get('/admin/dashboard_jawaban', [AdminController::class, 'dashboard_analisis']);
Route::post('/admin/get_data_dashboard_jawaban', [AdminController::class, 'get_data_dashboard_analisis']);