This commit is contained in:
JokoPrasetio 2025-12-04 09:49:27 +07:00
commit f77eb9aeb1
12 changed files with 1677 additions and 76 deletions

View File

@ -0,0 +1,29 @@
<?php
namespace App\Exports;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithMultipleSheets;
class DashboardAnalisisExport implements WithMultipleSheets
{
protected $data1;
protected $data2;
protected $data3;
public function __construct($data1, $data2, $data3)
{
$this->data1 = $data1;
$this->data2 = $data2;
$this->data3 = $data3;
}
public function sheets(): array
{
return [
new DashboardAnalisisSheetExport($this->data1, 'Nomor 12-25 & 40-46'),
new DashboardAnalisisSheetExport($this->data2, 'Nomor 35'),
new DashboardAnalisisSheetExport($this->data3, 'Nomor 26-39 (selain nomor 35)'),
];
}
}

View File

@ -0,0 +1,64 @@
<?php
namespace App\Exports;
use Generator;
use Maatwebsite\Excel\Concerns\FromGenerator;
use Maatwebsite\Excel\Concerns\WithStyles;
use Maatwebsite\Excel\Concerns\WithTitle;
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
use PhpOffice\PhpSpreadsheet\Style\Border;
class DashboardAnalisisSheetExport implements FromGenerator, WithStyles, WithTitle
{
protected $data;
protected $title;
public function __construct(array $data, string $title)
{
$this->data = $data;
$this->title = $title;
}
/** STREAMING ROW PER ROW */
public function generator(): Generator
{
foreach ($this->data as $row) {
yield $row;
}
}
/** STYLING */
public function styles(Worksheet $sheet)
{
$lastRow = $sheet->getHighestRow();
$lastColumn = $sheet->getHighestColumn();
$range = 'A1:' . $lastColumn . $lastRow;
// Border
$sheet->getStyle($range)->applyFromArray([
'borders' => [
'allBorders' => [
'borderStyle' => Border::BORDER_THIN,
],
],
]);
// Header style
$sheet->getStyle('A1:' . $lastColumn . '1')->applyFromArray([
'font' => ['bold' => true],
'fill' => [
'fillType' => 'solid',
'color' => ['rgb' => 'FFFF00'],
],
]);
return [];
}
public function title(): string
{
return $this->title;
}
}

View File

@ -0,0 +1,59 @@
<?php
namespace App\Exports;
use Maatwebsite\Excel\Concerns\FromArray;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithStyles;
use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
class DashboardExport implements FromArray, WithStyles
{
protected $data;
public function __construct($data)
{
$this->data = $data;
}
/**
* @return \Illuminate\Support\Collection
*/
public function array(): array
{
return $this->data;
}
public function styles(Worksheet $sheet)
{
// Hitung jumlah row yang dihasilkan
$lastRow = $sheet->getHighestRow();
$lastColumn = $sheet->getHighestColumn();
// Range seluruh data, misal A1:C20
$range = 'A1:' . $lastColumn . $lastRow;
// Terapkan border
$sheet->getStyle($range)->applyFromArray([
'borders' => [
'allBorders' => [
'borderStyle' => Border::BORDER_THIN,
'color' => ['rgb' => '000000'], // warna hitam
],
],
]);
// Optional: header kuning + bold
$sheet->getStyle('A1:' . $lastColumn . '1')->applyFromArray([
'font' => [
'bold' => true,
],
'fill' => [
'fillType' => 'solid',
'color' => ['rgb' => 'FFFF00'], // header kuning
],
]);
return [];
}
}

View File

@ -0,0 +1,61 @@
<?php
namespace App\Exports;
use Generator;
use Maatwebsite\Excel\Concerns\FromGenerator;
use Maatwebsite\Excel\Concerns\WithStyles;
use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
class DashboardJawabanExport implements FromGenerator, WithStyles
{
protected $header;
protected $rows;
public function __construct($header, $rows)
{
$this->header = $header; // row pertama (judul kolom)
$this->rows = $rows; // data lainnya
}
public function generator(): Generator
{
// 1. Row header
yield $this->header;
// 2. Row lain (streaming)
foreach ($this->rows as $row) {
yield $row;
}
}
public function styles(Worksheet $sheet)
{
$lastRow = $sheet->getHighestRow();
$lastColumn = $sheet->getHighestColumn();
$range = 'A1:' . $lastColumn . $lastRow;
// Border
$sheet->getStyle($range)->applyFromArray([
'borders' => [
'allBorders' => [
'borderStyle' => Border::BORDER_THIN,
],
],
]);
// Header style
$sheet->getStyle('A1:' . $lastColumn . '1')->applyFromArray([
'font' => [
'bold' => true,
],
'fill' => [
'fillType' => 'solid',
'color' => ['rgb' => 'FFFF00'],
],
]);
return [];
}
}

View File

@ -2,10 +2,15 @@
namespace App\Http\Controllers;
use App\Exports\DashboardAnalisisExport;
use App\Exports\DashboardExport;
use App\Exports\DashboardJawabanExport;
use App\Models\Jawaban;
use App\Models\JawabanDetail;
use App\Models\SoalDetail;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Maatwebsite\Excel\Facades\Excel;
use Yajra\DataTables\DataTables;
class AdminController extends Controller
@ -83,7 +88,35 @@ class AdminController extends Controller
$query->whereIn('unit', $request->unit_kerja);
}
return DataTables::of($query)->make(true);
return DataTables::of($query)
->addColumn('action', function ($row) {
return '
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#detail_jawaban" data-id="'. $row->id .'">
Detail
</button>
';
})
->make(true);
}
public function download_report_data_pegawai_sudah_survey(Request $request)
{
$query = Jawaban::query();
$query->select('nama', 'unit', 'tanggal_isi');
if ($request->nama_pegawai) {
$query->where('nama', 'ILIKE', '%' . $request->nama_pegawai . '%');
}
if ($request->select_unit_kerja) {
$query->whereIn('unit', $request->select_unit_kerja);
}
$data = $query->get()->toArray();
array_unshift($data, ['Nama Pegawai', 'Unit Kerja', 'Tanggal Isi']);
return Excel::download(new DashboardExport($data), 'data pegawai yang sudah survey.xlsx');
}
@ -147,15 +180,84 @@ class AdminController extends Controller
return view('admin.dashboard_analisis', $data);
}
public function dashboard_jawaban()
{
$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_jawaban', $data);
}
public function get_data_dashboard_analisis(Request $request)
{
try {
$soal = SoalDetail::all()->sortBy('id')->values()->toArray();
$data = [];
$data_option_setuju = [];
$data_option_selalu = [];
$data_option_other = [];
$total = 0;
foreach ($soal as $key => $value) {
$jawaban = [];
$soal_json = json_decode($value['soal'], true);
if($soal_json['is_analitic'] == 0){
continue;
}
$sub = DB::table('lms_mutu_jawaban_detail')
->select('lms_mutu_soal_detail_id', DB::raw('COUNT(*) AS total_semua'))
->join(
@ -194,6 +296,7 @@ class AdminController extends Controller
}
$result->orderBy('d.lms_mutu_soal_detail_id', 'asc');
if(is_array($soal_json['options'])){
if(count($soal_json['options']) > 0){
foreach ($soal_json['options'] as $v) {
@ -202,9 +305,12 @@ class AdminController extends Controller
->first();
if($row) {
if($total == 0){
$total = $row->total_semua;
}
$data_per_jawaban = [
'name' => $v,
'y' => (float) $row->percent,
'percent' => (float) $row->percent,
'value' => $row->total_jawaban,
'total' => $row->total_semua
];
@ -213,24 +319,55 @@ class AdminController extends Controller
} else {
$data_per_jawaban = [
'name' => $v,
'y' => 0
'percent' => 0
];
array_push($jawaban, $data_per_jawaban);
}
} else {
$get_data = (clone $result)->whereNotIn('d.jawaban', $soal_json['options'])
->get()
->toArray();
$get_data = 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,
STRING_AGG(d.jawaban, ', ') AS jawaban_gabungan,
t.total_semua,
COUNT(*) AS total_jawaban,
ROUND((COUNT(*)::numeric / t.total_semua::numeric) * 100) AS percent"
)
->where('d.lms_mutu_soal_detail_id', $value['id'])
->whereNotIn('d.jawaban', $soal_json['options'])
->groupBy('d.lms_mutu_soal_detail_id', 't.total_semua')->first();
foreach ($get_data as $val) {
// $get_data = (clone $result)->whereNotIn('d.jawaban', $soal_json['options'])
// ->get()
// ->toArray();
// foreach ($get_data as $val) {
if($get_data){
$data_per_jawaban = [
'name' => $val->jawaban,
'y' => (float) $val->percent,
'value' => $val->total_jawaban,
'total' => $val->total_semua
'name' => 'Lainnya',
'percent' => (float) $get_data->percent,
'value' => $get_data->total_jawaban,
'total' => $get_data->total_semua,
'jawaban' => $get_data->jawaban_gabungan
];
} else {
$data_per_jawaban = [
'name' => 'Lainnya',
'percent' => 0,
'value' => 0,
'jawaban' => '-'
];
array_push($jawaban, $data_per_jawaban);
}
// }
array_push($jawaban, $data_per_jawaban);
}
}
} else {
@ -239,7 +376,7 @@ class AdminController extends Controller
foreach ($get_data as $val) {
$data_per_jawaban = [
'name' => $val->jawaban,
'y' => (float) $val->percent,
'percent' => (float) $val->percent,
'value' => $val->total_jawaban,
'total' => $val->total_semua
];
@ -248,12 +385,295 @@ class AdminController extends Controller
}
$data_persoal = [
'no_soal' => $soal_json['no'],
'soal' => $soal_json['soal'],
'jawaban' => $jawaban
];
array_push($data, $data_persoal);
if(in_array('Sangat Tidak Setuju', $soal_json['options'])) {
array_push($data_option_setuju, $data_persoal);
} else if(in_array('Selalu', $soal_json['options'])) {
array_push($data_option_selalu, $data_persoal);
} else {
array_push($data_option_other, $data_persoal);
}
}
}
$data = [
'option_setuju' => $data_option_setuju,
'option_other' => $data_option_other,
'option_selalu' => $data_option_selalu,
'total' => $total
];
return response()->json([
'msg' => 'Berhasil',
'data' => $data
], 200);
} catch (\ErrorException $th) {
dd($th);
return response()->json([
'msg' => 'Oops something wrong!',
'data' => null,
'msg_dev' => $th
], 500);
}
}
public function report_data_dashboard_analisis(Request $request)
{
try {
$soal = SoalDetail::all()->sortBy('id')->values()->toArray();
$data_option_setuju = [];
$data_option_selalu = [];
$data_option_other = [];
$total = 0;
foreach ($soal as $key => $value) {
$jawaban = [];
$soal_json = json_decode($value['soal'], true);
if($soal_json['is_analitic'] == 0){
continue;
}
$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(is_array($soal_json['options'])){
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) {
if($total == 0){
$total = $row->total_semua;
}
$data_per_jawaban = [
'name' => $v,
'percent' => (float) $row->percent,
'value' => $row->total_jawaban,
'total' => $row->total_semua
];
array_push($jawaban, $data_per_jawaban);
} else {
$data_per_jawaban = [
'name' => $v,
'percent' => 0
];
array_push($jawaban, $data_per_jawaban);
}
} else {
$get_data = 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,
STRING_AGG(d.jawaban, ', ') AS jawaban_gabungan,
t.total_semua,
COUNT(*) AS total_jawaban,
ROUND((COUNT(*)::numeric / t.total_semua::numeric) * 100) AS percent"
)
->where('d.lms_mutu_soal_detail_id', $value['id'])
->whereNotIn('d.jawaban', $soal_json['options'])
->groupBy('d.lms_mutu_soal_detail_id', 't.total_semua')->first();
// $get_data = (clone $result)->whereNotIn('d.jawaban', $soal_json['options'])
// ->get()
// ->toArray();
// foreach ($get_data as $val) {
if($get_data){
$data_per_jawaban = [
'name' => 'Lainnya',
'percent' => (float) $get_data->percent,
'value' => $get_data->total_jawaban,
'total' => $get_data->total_semua,
'jawaban' => $get_data->jawaban_gabungan
];
} else {
$data_per_jawaban = [
'name' => 'Lainnya',
'percent' => 0,
'value' => 0,
'jawaban' => '-'
];
}
// }
array_push($jawaban, $data_per_jawaban);
}
}
} else {
$get_data = $result->get()
->toArray();
foreach ($get_data as $val) {
$data_per_jawaban = [
'name' => $val->jawaban,
'percent' => (float) $val->percent,
'value' => $val->total_jawaban,
'total' => $val->total_semua
];
array_push($jawaban, $data_per_jawaban);
}
}
$data_persoal = [
'no_soal' => $soal_json['no'],
'soal' => $soal_json['soal'],
'jawaban' => $jawaban
];
if(in_array('Sangat Tidak Setuju', $soal_json['options'])) {
array_push($data_option_setuju, $data_persoal);
} else if(in_array('Selalu', $soal_json['options'])) {
array_push($data_option_selalu, $data_persoal);
} else {
array_push($data_option_other, $data_persoal);
}
}
}
$data_setuju_report = [];
$data_setuju_header = ['No', 'Soal'];
foreach ($data_option_setuju as $key => $value) {
$data['no'] = $value['no_soal'];
$data['soal'] = $value['soal'];
foreach ($value['jawaban'] as $k => $v) {
if(!in_array($v['name'], $data_setuju_header)){
array_push($data_setuju_header, $v['name']);
}
if($v['percent'] > 0){
$data[$v['name']] = $v['percent'] . '%/ '. $v['value']. ' Orang';
} else {
$data[$v['name']] = '-';
}
if($v['name'] == 'Lainnya') {
$data['jawaban_lainnya'] = $v['jawaban'];
}
}
$data['total'] = $total;
array_push($data_setuju_report, $data);
}
array_push($data_setuju_header, 'Jawaban Lainnya');
array_push($data_setuju_header, 'Total Responden');
array_unshift($data_setuju_report, $data_setuju_header);
$data_other_report = [];
$data_other_header = ['No', 'Soal'];
foreach ($data_option_other as $key => $value) {
$data_other['no'] = $value['no_soal'];
$data_other['soal'] = $value['soal'];
foreach ($value['jawaban'] as $k => $v) {
if(!in_array($v['name'], $data_other_header)){
array_push($data_other_header, $v['name']);
}
if($v['percent'] > 0){
$data_other[$v['name']] = $v['percent'] . '%/ '. $v['value']. ' Orang';
} else {
$data_other[$v['name']] = '-';
}
}
$data_other['total'] = $total;
array_push($data_other_report, $data_other);
}
array_push($data_other_header, 'Total Responden');
array_unshift($data_other_report, $data_other_header);
$data_selalu_report = [];
$data_selalu_header = ['No', 'Soal'];
foreach ($data_option_selalu as $key => $value) {
$data_selalu['no'] = $value['no_soal'];
$data_selalu['soal'] = $value['soal'];
foreach ($value['jawaban'] as $k => $v) {
if(!in_array($v['name'], $data_selalu_header)){
array_push($data_selalu_header, $v['name']);
}
if($v['percent'] > 0){
$data_selalu[$v['name']] = $v['percent'] . '%/ '. $v['value']. ' Orang';
} else {
$data_selalu[$v['name']] = '-';
}
if($v['name'] == 'Lainnya') {
$data_selalu['jawaban_lainnya'] = $v['jawaban'];
}
}
$data_selalu['total'] = $total;
array_push($data_selalu_report, $data_selalu);
}
array_push($data_selalu_header, 'Jawaban Lainnya');
array_push($data_selalu_header, 'Total Responden');
array_unshift($data_selalu_report, $data_selalu_header);
// $data = [
// 'option_setuju' => $data_option_setuju,
// 'option_other' => $data_option_other,
// 'option_selalu' => $data_option_selalu,
// 'total' => $total
// ];
return Excel::download(new DashboardAnalisisExport($data_setuju_report, $data_other_report, $data_selalu_report), 'data analisis.xlsx');
} catch (\ErrorException $th) {
dd($th);
return response()->json([
'msg' => 'Oops something wrong!',
'data' => null,
'msg_dev' => $th
], 500);
}
}
public function get_jawaban($jawaban_id)
{
try {
$data = JawabanDetail::where('lms_mutu_jawaban_id', $jawaban_id)->join('lms_mutu_soal_detail', 'lms_mutu_soal_detail_id', '=', 'lms_mutu_soal_detail.id')->get()->toArray();
return response()->json([
'msg' => 'Berhasil',
@ -267,4 +687,44 @@ class AdminController extends Controller
], 500);
}
}
public function download_report_data_jawaban_pegawai(Request $request)
{
$query = Jawaban::query();
$query->select('id', 'nama', 'unit');
if ($request->nama_pegawai) {
$query->where('nama', 'ILIKE', '%' . $request->nama_pegawai . '%');
}
if ($request->select_unit_kerja) {
$query->whereIn('unit', $request->select_unit_kerja);
}
$data = $query->get()->toArray();
$data_header = ['Nama Pegawai', 'Unit Kerja'];
foreach ($data as $key => &$value) {
$data_jawaban = JawabanDetail::select(
'lms_mutu_jawaban_detail.*',
DB::raw("lms_mutu_soal_detail.soal->>'soal' as soal"),
DB::raw("lms_mutu_soal_detail.soal->>'no' as no")
)->where('lms_mutu_jawaban_id', $value['id'])->join('lms_mutu_soal_detail', 'lms_mutu_soal_detail_id', '=', 'lms_mutu_soal_detail.id')->orderBy('id', 'asc')->get()->toArray();
foreach ($data_jawaban as $k => $v) {
if(count($data_jawaban) > 10){
if(!in_array($v['soal'], $data_header)){
array_push($data_header, $v['soal']);
}
}
$data[$key][$v['soal']] = $v['jawaban'];
}
unset($value['id']);
unset($value['jawaban_detail']);
}
return Excel::download(new DashboardJawabanExport($data_header, $data), 'data jawaban pegawai.xlsx');
}
}

View File

@ -9,6 +9,7 @@
"php": "^8.2",
"laravel/framework": "^11.31",
"laravel/tinker": "^2.9",
"maatwebsite/excel": "^3.1",
"yajra/laravel-datatables-oracle": "11.0"
},
"require-dev": {

591
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": "7ae784044cc087af521c6abbb3c6e2c8",
"content-hash": "42467f26d79bbcb1e4920c457fffa7b7",
"packages": [
{
"name": "brick/math",
@ -135,6 +135,162 @@
],
"time": "2024-02-09T16:56:22+00:00"
},
{
"name": "composer/pcre",
"version": "3.3.2",
"source": {
"type": "git",
"url": "https://github.com/composer/pcre.git",
"reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e",
"reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e",
"shasum": ""
},
"require": {
"php": "^7.4 || ^8.0"
},
"conflict": {
"phpstan/phpstan": "<1.11.10"
},
"require-dev": {
"phpstan/phpstan": "^1.12 || ^2",
"phpstan/phpstan-strict-rules": "^1 || ^2",
"phpunit/phpunit": "^8 || ^9"
},
"type": "library",
"extra": {
"phpstan": {
"includes": [
"extension.neon"
]
},
"branch-alias": {
"dev-main": "3.x-dev"
}
},
"autoload": {
"psr-4": {
"Composer\\Pcre\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Jordi Boggiano",
"email": "j.boggiano@seld.be",
"homepage": "http://seld.be"
}
],
"description": "PCRE wrapping library that offers type-safe preg_* replacements.",
"keywords": [
"PCRE",
"preg",
"regex",
"regular expression"
],
"support": {
"issues": "https://github.com/composer/pcre/issues",
"source": "https://github.com/composer/pcre/tree/3.3.2"
},
"funding": [
{
"url": "https://packagist.com",
"type": "custom"
},
{
"url": "https://github.com/composer",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/composer/composer",
"type": "tidelift"
}
],
"time": "2024-11-12T16:29:46+00:00"
},
{
"name": "composer/semver",
"version": "3.4.4",
"source": {
"type": "git",
"url": "https://github.com/composer/semver.git",
"reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95",
"reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95",
"shasum": ""
},
"require": {
"php": "^5.3.2 || ^7.0 || ^8.0"
},
"require-dev": {
"phpstan/phpstan": "^1.11",
"symfony/phpunit-bridge": "^3 || ^7"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "3.x-dev"
}
},
"autoload": {
"psr-4": {
"Composer\\Semver\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Nils Adermann",
"email": "naderman@naderman.de",
"homepage": "http://www.naderman.de"
},
{
"name": "Jordi Boggiano",
"email": "j.boggiano@seld.be",
"homepage": "http://seld.be"
},
{
"name": "Rob Bast",
"email": "rob.bast@gmail.com",
"homepage": "http://robbast.nl"
}
],
"description": "Semver library that offers utilities, version constraint parsing and validation.",
"keywords": [
"semantic",
"semver",
"validation",
"versioning"
],
"support": {
"irc": "ircs://irc.libera.chat:6697/composer",
"issues": "https://github.com/composer/semver/issues",
"source": "https://github.com/composer/semver/tree/3.4.4"
},
"funding": [
{
"url": "https://packagist.com",
"type": "custom"
},
{
"url": "https://github.com/composer",
"type": "github"
}
],
"time": "2025-08-20T19:15:30+00:00"
},
{
"name": "dflydev/dot-access-data",
"version": "v3.0.3",
@ -508,6 +664,67 @@
],
"time": "2025-03-06T22:45:56+00:00"
},
{
"name": "ezyang/htmlpurifier",
"version": "v4.19.0",
"source": {
"type": "git",
"url": "https://github.com/ezyang/htmlpurifier.git",
"reference": "b287d2a16aceffbf6e0295559b39662612b77fcf"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/b287d2a16aceffbf6e0295559b39662612b77fcf",
"reference": "b287d2a16aceffbf6e0295559b39662612b77fcf",
"shasum": ""
},
"require": {
"php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0"
},
"require-dev": {
"cerdic/css-tidy": "^1.7 || ^2.0",
"simpletest/simpletest": "dev-master"
},
"suggest": {
"cerdic/css-tidy": "If you want to use the filter 'Filter.ExtractStyleBlocks'.",
"ext-bcmath": "Used for unit conversion and imagecrash protection",
"ext-iconv": "Converts text to and from non-UTF-8 encodings",
"ext-tidy": "Used for pretty-printing HTML"
},
"type": "library",
"autoload": {
"files": [
"library/HTMLPurifier.composer.php"
],
"psr-0": {
"HTMLPurifier": "library/"
},
"exclude-from-classmap": [
"/library/HTMLPurifier/Language/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"LGPL-2.1-or-later"
],
"authors": [
{
"name": "Edward Z. Yang",
"email": "admin@htmlpurifier.org",
"homepage": "http://ezyang.com"
}
],
"description": "Standards compliant HTML filter written in PHP",
"homepage": "http://htmlpurifier.org/",
"keywords": [
"html"
],
"support": {
"issues": "https://github.com/ezyang/htmlpurifier/issues",
"source": "https://github.com/ezyang/htmlpurifier/tree/v4.19.0"
},
"time": "2025-10-17T16:34:55+00:00"
},
{
"name": "fruitcake/php-cors",
"version": "v1.3.0",
@ -2012,6 +2229,272 @@
],
"time": "2025-11-18T12:17:23+00:00"
},
{
"name": "maatwebsite/excel",
"version": "3.1.67",
"source": {
"type": "git",
"url": "https://github.com/SpartnerNL/Laravel-Excel.git",
"reference": "e508e34a502a3acc3329b464dad257378a7edb4d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/SpartnerNL/Laravel-Excel/zipball/e508e34a502a3acc3329b464dad257378a7edb4d",
"reference": "e508e34a502a3acc3329b464dad257378a7edb4d",
"shasum": ""
},
"require": {
"composer/semver": "^3.3",
"ext-json": "*",
"illuminate/support": "5.8.*||^6.0||^7.0||^8.0||^9.0||^10.0||^11.0||^12.0",
"php": "^7.0||^8.0",
"phpoffice/phpspreadsheet": "^1.30.0",
"psr/simple-cache": "^1.0||^2.0||^3.0"
},
"require-dev": {
"laravel/scout": "^7.0||^8.0||^9.0||^10.0",
"orchestra/testbench": "^6.0||^7.0||^8.0||^9.0||^10.0",
"predis/predis": "^1.1"
},
"type": "library",
"extra": {
"laravel": {
"aliases": {
"Excel": "Maatwebsite\\Excel\\Facades\\Excel"
},
"providers": [
"Maatwebsite\\Excel\\ExcelServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"Maatwebsite\\Excel\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Patrick Brouwers",
"email": "patrick@spartner.nl"
}
],
"description": "Supercharged Excel exports and imports in Laravel",
"keywords": [
"PHPExcel",
"batch",
"csv",
"excel",
"export",
"import",
"laravel",
"php",
"phpspreadsheet"
],
"support": {
"issues": "https://github.com/SpartnerNL/Laravel-Excel/issues",
"source": "https://github.com/SpartnerNL/Laravel-Excel/tree/3.1.67"
},
"funding": [
{
"url": "https://laravel-excel.com/commercial-support",
"type": "custom"
},
{
"url": "https://github.com/patrickbrouwers",
"type": "github"
}
],
"time": "2025-08-26T09:13:16+00:00"
},
{
"name": "maennchen/zipstream-php",
"version": "3.1.2",
"source": {
"type": "git",
"url": "https://github.com/maennchen/ZipStream-PHP.git",
"reference": "aeadcf5c412332eb426c0f9b4485f6accba2a99f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/aeadcf5c412332eb426c0f9b4485f6accba2a99f",
"reference": "aeadcf5c412332eb426c0f9b4485f6accba2a99f",
"shasum": ""
},
"require": {
"ext-mbstring": "*",
"ext-zlib": "*",
"php-64bit": "^8.2"
},
"require-dev": {
"brianium/paratest": "^7.7",
"ext-zip": "*",
"friendsofphp/php-cs-fixer": "^3.16",
"guzzlehttp/guzzle": "^7.5",
"mikey179/vfsstream": "^1.6",
"php-coveralls/php-coveralls": "^2.5",
"phpunit/phpunit": "^11.0",
"vimeo/psalm": "^6.0"
},
"suggest": {
"guzzlehttp/psr7": "^2.4",
"psr/http-message": "^2.0"
},
"type": "library",
"autoload": {
"psr-4": {
"ZipStream\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Paul Duncan",
"email": "pabs@pablotron.org"
},
{
"name": "Jonatan Männchen",
"email": "jonatan@maennchen.ch"
},
{
"name": "Jesse Donat",
"email": "donatj@gmail.com"
},
{
"name": "András Kolesár",
"email": "kolesar@kolesar.hu"
}
],
"description": "ZipStream is a library for dynamically streaming dynamic zip files from PHP without writing to the disk at all on the server.",
"keywords": [
"stream",
"zip"
],
"support": {
"issues": "https://github.com/maennchen/ZipStream-PHP/issues",
"source": "https://github.com/maennchen/ZipStream-PHP/tree/3.1.2"
},
"funding": [
{
"url": "https://github.com/maennchen",
"type": "github"
}
],
"time": "2025-01-27T12:07:53+00:00"
},
{
"name": "markbaker/complex",
"version": "3.0.2",
"source": {
"type": "git",
"url": "https://github.com/MarkBaker/PHPComplex.git",
"reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/95c56caa1cf5c766ad6d65b6344b807c1e8405b9",
"reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9",
"shasum": ""
},
"require": {
"php": "^7.2 || ^8.0"
},
"require-dev": {
"dealerdirect/phpcodesniffer-composer-installer": "dev-master",
"phpcompatibility/php-compatibility": "^9.3",
"phpunit/phpunit": "^7.0 || ^8.0 || ^9.0",
"squizlabs/php_codesniffer": "^3.7"
},
"type": "library",
"autoload": {
"psr-4": {
"Complex\\": "classes/src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Mark Baker",
"email": "mark@lange.demon.co.uk"
}
],
"description": "PHP Class for working with complex numbers",
"homepage": "https://github.com/MarkBaker/PHPComplex",
"keywords": [
"complex",
"mathematics"
],
"support": {
"issues": "https://github.com/MarkBaker/PHPComplex/issues",
"source": "https://github.com/MarkBaker/PHPComplex/tree/3.0.2"
},
"time": "2022-12-06T16:21:08+00:00"
},
{
"name": "markbaker/matrix",
"version": "3.0.1",
"source": {
"type": "git",
"url": "https://github.com/MarkBaker/PHPMatrix.git",
"reference": "728434227fe21be27ff6d86621a1b13107a2562c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/728434227fe21be27ff6d86621a1b13107a2562c",
"reference": "728434227fe21be27ff6d86621a1b13107a2562c",
"shasum": ""
},
"require": {
"php": "^7.1 || ^8.0"
},
"require-dev": {
"dealerdirect/phpcodesniffer-composer-installer": "dev-master",
"phpcompatibility/php-compatibility": "^9.3",
"phpdocumentor/phpdocumentor": "2.*",
"phploc/phploc": "^4.0",
"phpmd/phpmd": "2.*",
"phpunit/phpunit": "^7.0 || ^8.0 || ^9.0",
"sebastian/phpcpd": "^4.0",
"squizlabs/php_codesniffer": "^3.7"
},
"type": "library",
"autoload": {
"psr-4": {
"Matrix\\": "classes/src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Mark Baker",
"email": "mark@demon-angel.eu"
}
],
"description": "PHP Class for working with matrices",
"homepage": "https://github.com/MarkBaker/PHPMatrix",
"keywords": [
"mathematics",
"matrix",
"vector"
],
"support": {
"issues": "https://github.com/MarkBaker/PHPMatrix/issues",
"source": "https://github.com/MarkBaker/PHPMatrix/tree/3.0.1"
},
"time": "2022-12-02T22:17:43+00:00"
},
{
"name": "monolog/monolog",
"version": "3.9.0",
@ -2519,6 +3002,112 @@
],
"time": "2025-11-20T02:34:59+00:00"
},
{
"name": "phpoffice/phpspreadsheet",
"version": "1.30.1",
"source": {
"type": "git",
"url": "https://github.com/PHPOffice/PhpSpreadsheet.git",
"reference": "fa8257a579ec623473eabfe49731de5967306c4c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/fa8257a579ec623473eabfe49731de5967306c4c",
"reference": "fa8257a579ec623473eabfe49731de5967306c4c",
"shasum": ""
},
"require": {
"composer/pcre": "^1||^2||^3",
"ext-ctype": "*",
"ext-dom": "*",
"ext-fileinfo": "*",
"ext-gd": "*",
"ext-iconv": "*",
"ext-libxml": "*",
"ext-mbstring": "*",
"ext-simplexml": "*",
"ext-xml": "*",
"ext-xmlreader": "*",
"ext-xmlwriter": "*",
"ext-zip": "*",
"ext-zlib": "*",
"ezyang/htmlpurifier": "^4.15",
"maennchen/zipstream-php": "^2.1 || ^3.0",
"markbaker/complex": "^3.0",
"markbaker/matrix": "^3.0",
"php": ">=7.4.0 <8.5.0",
"psr/http-client": "^1.0",
"psr/http-factory": "^1.0",
"psr/simple-cache": "^1.0 || ^2.0 || ^3.0"
},
"require-dev": {
"dealerdirect/phpcodesniffer-composer-installer": "dev-main",
"dompdf/dompdf": "^1.0 || ^2.0 || ^3.0",
"friendsofphp/php-cs-fixer": "^3.2",
"mitoteam/jpgraph": "^10.3",
"mpdf/mpdf": "^8.1.1",
"phpcompatibility/php-compatibility": "^9.3",
"phpstan/phpstan": "^1.1",
"phpstan/phpstan-phpunit": "^1.0",
"phpunit/phpunit": "^8.5 || ^9.0",
"squizlabs/php_codesniffer": "^3.7",
"tecnickcom/tcpdf": "^6.5"
},
"suggest": {
"dompdf/dompdf": "Option for rendering PDF with PDF Writer",
"ext-intl": "PHP Internationalization Functions",
"mitoteam/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers",
"mpdf/mpdf": "Option for rendering PDF with PDF Writer",
"tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer"
},
"type": "library",
"autoload": {
"psr-4": {
"PhpOffice\\PhpSpreadsheet\\": "src/PhpSpreadsheet"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Maarten Balliauw",
"homepage": "https://blog.maartenballiauw.be"
},
{
"name": "Mark Baker",
"homepage": "https://markbakeruk.net"
},
{
"name": "Franck Lefevre",
"homepage": "https://rootslabs.net"
},
{
"name": "Erik Tilt"
},
{
"name": "Adrien Crivelli"
}
],
"description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine",
"homepage": "https://github.com/PHPOffice/PhpSpreadsheet",
"keywords": [
"OpenXML",
"excel",
"gnumeric",
"ods",
"php",
"spreadsheet",
"xls",
"xlsx"
],
"support": {
"issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues",
"source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.30.1"
},
"time": "2025-10-26T16:01:04+00:00"
},
{
"name": "phpoption/phpoption",
"version": "1.9.4",

View File

@ -2,6 +2,11 @@
@section('title', 'Dashboard | Mutu RSAB Harapan Kita')
@section('custom_css')
<style>
.table-responsive .row > * {
padding: 0 !important;
}
</style>
@endsection
@section('content')
@ -10,10 +15,6 @@
<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>
@ -22,10 +23,19 @@
@endforeach
</select>
</div>
<div class="w-100">
<div class="w-100 d-flex gap-2">
<div class="btn btn-primary" id="search_button">
Cari
</div>
<form id="export_form" action="{{ url('/admin/report') }}" method="POST">
@csrf
<select class="d-none" name="select_unit_kerja[]" multiple>
@foreach ($list_unit_kerja as $item)
<option value="{{ $item }}">{{ $item }}</option>
@endforeach
</select>
<div type="button" class="btn btn-primary" id="export_form_button">Download Excel</div>
</form>
</div>
</div>
<div class="mt-3">
@ -54,6 +64,14 @@
$('#search_button').click(function(){
$('#table').DataTable().ajax.reload();
});
$('#export_form_button').click(function() {
let select_unit_kerja = $('#select_unit_kerja').val();
$('[name="select_unit_kerja[]"]').val(select_unit_kerja);
$('#export_form').submit();
})
generateTable();
});

View File

@ -18,13 +18,22 @@
@endforeach
</select>
</div>
<div class="w-100">
<div class="w-100 d-flex gap-2">
<div class="btn btn-primary" id="search_button">
Cari
</div>
<form id="export_form" action="{{ url('/admin/report_data_analisis') }}" method="POST">
@csrf
<select class="d-none" name="unit_kerja[]" multiple>
@foreach ($list_unit_kerja as $item)
<option value="{{ $item }}">{{ $item }}</option>
@endforeach
</select>
<div type="button" class="btn btn-primary" id="export_form_button">Download Excel</div>
</form>
</div>
</div>
<div class="mt-3" id="body_chart" style="max-height: 80vh; overflow-y: auto;">
<div class="mt-3" id="body_table" style="max-height: 80vh; overflow-y: auto;">
</div>
</div>
@ -39,10 +48,17 @@
$('#search_button').click(function(){
get_data_analisis();
})
$('#export_form_button').click(function() {
let select_unit_kerja = $('#select_unit_kerja').val();
$('[name="unit_kerja[]"]').val(select_unit_kerja);
$('#export_form').submit();
})
});
function get_data_analisis() {
$('#body_chart').html(`<div class="p-10 d-flex justify-content-center">
$('#body_table').html(`<div class="p-10 d-flex justify-content-center">
<div>
<!-- Fold -->
<div class="sk-fold">
@ -54,19 +70,138 @@
</div>
</div>`);
$.ajax({
url: "{{ url('/admin/get_data_dashboard_jawaban') }}",
url: "{{ url('/admin/get_data_dashboard_analisis') }}",
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);
const data = res.data;
$('#body_table').html("");
let stringTable = '';
//option setuju
if(data.option_setuju.length > 0){
stringTable += '<div class="table-responsive mb-8">';
stringTable += '<table id="table_detail" class="table table-bordered">';
stringTable += `<thead class="bg-primary" id="table_header">
<tr>
<th class="text-white">No</th>
<th class="text-white">Soal</th>
<th class="text-white">Sangat Tidak Setuju</th>
<th class="text-white">Tidak Setuju</th>
<th class="text-white">Netral</th>
<th class="text-white">Setuju</th>
<th class="text-white">Sangat Setuju</th>
<th class="text-white">Lainnya</th>
<th class="text-white">Jawaban Lainnya</th>
<th class="text-white">Total Responden</th>
</tr>
</thead>`;
stringTable += '<tbody>';
data.option_setuju.forEach((element, index) => {
stringTable += `
<tr>
<td>${element.no_soal}</td>
<td>${element.soal}</td>`;
element.jawaban.forEach(e => {
if(e.percent > 0){
stringTable += `<td class="fw-bold">${e.percent}%/${e.value} Orang</td>`;
} else {
stringTable += `<td class="fw-bold">-</td>`;
}
if(e.name == 'Lainnya') {
stringTable += `<td class="fw-bold">${e.jawaban}</td>`;
}
});
stringTable += `<td class="">${data.total}</td>`;
stringTable += `</tr>`;
});
stringTable += '</tbody>';
stringTable += '</table>';
stringTable += '</div>';
}
if(data.option_other.length > 0){
stringTable += '<div class="table-responsive mb-8">';
stringTable += '<table id="table_detail" class="table table-bordered">';
stringTable += `<thead class="bg-primary" id="table_header">
<tr>
<th class="text-white">No</th>
<th class="text-white">Soal</th>
<th class="text-white">Tidak Ada</th>
<th class="text-white">1 - 2 laporan</th>
<th class="text-white">3 - 5 laporan</th>
<th class="text-white">6 - 10 laporan</th>
<th class="text-white">> 10 laporan</th>
<th class="text-white">Total Responden</th>
</tr>
</thead>`;
stringTable += '<tbody>';
data.option_other.forEach((element, index) => {
stringTable += `
<tr>
<td>${element.no_soal}</td>
<td>${element.soal}</td>`;
element.jawaban.forEach(e => {
if(e.percent > 0){
stringTable += `<td class="fw-bold">${e.percent}%/${e.value} Orang</td>`;
} else {
stringTable += `<td class="fw-bold">-</td>`;
}
});
stringTable += `<td class="">${data.total}</td>`;
stringTable += `</tr>`;
});
stringTable += '</tbody>';
stringTable += '</table>';
stringTable += '</div>';
}
if(data.option_selalu.length > 0){
stringTable += '<div class="table-responsive mb-8">';
stringTable += '<table id="table_detail" class="table table-bordered">';
stringTable += `<thead class="bg-primary" id="table_header">
<tr>
<th class="text-white">No</th>
<th class="text-white">Soal</th>
<th class="text-white">Tidak Pernah</th>
<th class="text-white">Jarang</th>
<th class="text-white">Kadang-kadang</th>
<th class="text-white">Sering</th>
<th class="text-white">Selalu</th>
<th class="text-white">Lainnya</th>
<th class="text-white">Jawaban Lainnya</th>
<th class="text-white">Total Responden</th>
</tr>
</thead>`;
stringTable += '<tbody>';
data.option_selalu.forEach((element, index) => {
stringTable += `
<tr>
<td>${element.no_soal}</td>
<td>${element.soal}</td>`;
element.jawaban.forEach(e => {
if(e.percent > 0){
stringTable += `<td class="fw-bold">${e.percent}%/${e.value} Orang</td>`;
} else {
stringTable += `<td class="fw-bold">-</td>`;
}
if(e.name == 'Lainnya') {
stringTable += `<td class="fw-bold">${e.jawaban}</td>`;
}
});
stringTable += `<td class="">${data.total}</td>`;
stringTable += `</tr>`;
});
stringTable += '</tbody>';
stringTable += '</table>';
stringTable += '</div>';
}
$('#body_table').html(stringTable);
}
});
}

View File

@ -0,0 +1,176 @@
@extends('layouts.template_admin')
@section('title', 'Dashboard Jawaban | Mutu RSAB Harapan Kita')
@section('custom_css')
<style>
.table-responsive .row > * {
padding: 0 !important;
}
</style>
@endsection
@section('content')
<div class="card">
<div class="card-body">
<div class="card-title fs-4 fw-bold">Dashboard Jawaban</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 d-flex gap-2">
<div class="btn btn-primary" id="search_button">
Cari
</div>
<form id="export_form" action="{{ url('/admin/report_jawaban') }}" method="POST">
@csrf
<select class="d-none" name="select_unit_kerja[]" multiple>
@foreach ($list_unit_kerja as $item)
<option value="{{ $item }}">{{ $item }}</option>
@endforeach
</select>
<div type="button" class="btn btn-primary" id="export_form_button">Download Excel</div>
</form>
</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">Action</th>
</tr>
</thead>
</table>
</div>
</div>
</div>
</div>
</div>
<div class="modal fade" id="detail_jawaban" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="staticBackdropLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog-scrollable modal-xl">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="staticBackdropLabel">Detail Jawaban</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
@endsection
@section('custom_js')
<script>
let table = null;
$(document).ready(function(){
loadLoading();
$(".select2").select2();
$('#search_button').click(function(){
$('#table').DataTable().ajax.reload();
});
generateTable();
$('#detail_jawaban').on('shown.bs.modal', function (event) {
const button = $(event.relatedTarget);
const id = button.data('id');
getJawaban(id);
});
$('#detail_jawaban').on('hidden.bs.modal', function () {
loadLoading();
});
$('#export_form_button').click(function() {
let select_unit_kerja = $('#select_unit_kerja').val();
$('[name="select_unit_kerja[]"]').val(select_unit_kerja);
$('#export_form').submit();
})
});
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: 'action' }
]
});
}
function getJawaban(id) {
loadLoading();
$.ajax({
url: `{{ url('/admin/detail_jawaban') }}/${id}`,
type: 'GET',
success: function (res) {
const data = res.data;
let stringTable = '';
stringTable += '<table id="table_detail" class="table table-bordered">';
stringTable += `<thead class="bg-primary" id="table_header">
<tr>
<th class="text-white fs-5">No</th>
<th class="text-white fs-5">Soal</th>
<th class="text-white fs-5">Jawaban</th>
</tr>
</thead>`;
stringTable += '<tbody>';
data.forEach((element, index) => {
const dataSoal = JSON.parse(element.soal);
stringTable += `
<tr>
<td>${index + 1}</td>
<td>${dataSoal.soal}</td>
<td class="fw-bold">${element.jawaban}</td>
</tr>
`;
});
stringTable += '</tbody>';
stringTable += '</table>';
$('.modal-body').html(stringTable);
}
});
}
function loadLoading() {
$('.modal-body').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>
`);
}
</script>
@endsection

View File

@ -99,7 +99,7 @@
<i class="fa fa-list fs-4"></i>
</button>
</nav>
<div class="row pe-5">
<div class="row">
<!-- Sidebar desktop -->
<aside class="col-md-4 col-lg-3 d-none d-md-block sidebar vh-100">
<div class="card rounded-0 h-100">
@ -114,12 +114,18 @@
</div>
<i class="fa-solid fa-chevron-right"></i>
</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">
<a href="{{ url('/admin/dashboard_analisis') }}" 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 Analisis
</div>
<i class="fa-solid fa-chevron-right"></i>
</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-gauge-high"></i> Dashboard Jawaban
</div>
<i class="fa-solid fa-chevron-right"></i>
</a>
</nav>
</div>
</div>
@ -228,11 +234,7 @@
}
function setNameAccount() {
const decode = parseJwt();
if(decode){
$('#name_account').html(decode.nama_pegawai);
}
$('#name_account').html('Admin Survey');
}
</script>

View File

@ -14,3 +14,10 @@ Route::post('/admin/get_data_pegawai_sudah_survey', [AdminController::class, 'ge
Route::get('/admin/dashboard_jawaban', [AdminController::class, 'dashboard_analisis']);
Route::post('/admin/get_data_dashboard_jawaban', [AdminController::class, 'get_data_dashboard_analisis']);
Route::get('/redirect-smart', [SoalController::class, 'redirectSmart']);
Route::post('/admin/report', [AdminController::class, 'download_report_data_pegawai_sudah_survey']);
Route::get('/admin/dashboard_analisis', [AdminController::class, 'dashboard_analisis']);
Route::get('/admin/dashboard_jawaban', [AdminController::class, 'dashboard_jawaban']);
Route::get('/admin/detail_jawaban/{jawaban_id}', [AdminController::class, 'get_jawaban']);
Route::post('/admin/get_data_dashboard_analisis', [AdminController::class, 'get_data_dashboard_analisis']);
Route::post('/admin/report_data_analisis', [AdminController::class, 'report_data_dashboard_analisis']);
Route::post('/admin/report_jawaban', [AdminController::class, 'download_report_data_jawaban_pegawai']);