Merge branch 'main' of https://git.rsabhk.co.id/muhammad_thoriq/mutu-rsab
This commit is contained in:
commit
f77eb9aeb1
29
app/Exports/DashboardAnalisisExport.php
Normal file
29
app/Exports/DashboardAnalisisExport.php
Normal 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)'),
|
||||
];
|
||||
}
|
||||
}
|
||||
64
app/Exports/DashboardAnalisisSheetExport.php
Normal file
64
app/Exports/DashboardAnalisisSheetExport.php
Normal 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;
|
||||
}
|
||||
}
|
||||
59
app/Exports/DashboardExport.php
Normal file
59
app/Exports/DashboardExport.php
Normal 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 [];
|
||||
}
|
||||
}
|
||||
61
app/Exports/DashboardJawabanExport.php
Normal file
61
app/Exports/DashboardJawabanExport.php
Normal 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 [];
|
||||
}
|
||||
}
|
||||
@ -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(
|
||||
@ -193,68 +295,386 @@ class AdminController extends Controller
|
||||
$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(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
|
||||
];
|
||||
|
||||
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);
|
||||
array_push($jawaban, $data_per_jawaban);
|
||||
} else {
|
||||
$data_per_jawaban = [
|
||||
'name' => $v,
|
||||
'percent' => 0
|
||||
];
|
||||
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
|
||||
];
|
||||
$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);
|
||||
}
|
||||
}
|
||||
} 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 = [
|
||||
'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_persoal = [
|
||||
'soal' => $soal_json['soal'],
|
||||
'jawaban' => $jawaban
|
||||
];
|
||||
|
||||
array_push($data, $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',
|
||||
'data' => $data
|
||||
@ -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');
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
591
composer.lock
generated
@ -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",
|
||||
|
||||
@ -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();
|
||||
});
|
||||
|
||||
|
||||
@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
176
resources/views/admin/dashboard_jawaban.blade.php
Normal file
176
resources/views/admin/dashboard_jawaban.blade.php
Normal 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
|
||||
@ -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>
|
||||
|
||||
|
||||
@ -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']);
|
||||
Loading…
x
Reference in New Issue
Block a user