184 lines
6.9 KiB
PHP
184 lines
6.9 KiB
PHP
@extends('dashboard.layouts.main')
|
|
@section('body_main')
|
|
<div class="container-xxl flex-grow-1 container-p-y">
|
|
<h4 class="fw-bold py-3 mb-4">
|
|
<span class="text-muted fw-light">Dashboard /</span> Survei
|
|
</h4>
|
|
|
|
<div class="row mb-4">
|
|
<div class="col-md-6 mb-3">
|
|
<div class="card border-0 shadow-sm h-100" style="border-left: 5px solid #00a99d !important;">
|
|
<div class="card-header pb-0">
|
|
<h6 class=" fw-normal mb-0">Statistik Pengguna Baru Total <b id="confirm_pb_total"></b></h6>
|
|
</div>
|
|
<div class="card-body">
|
|
<canvas id="barChartBaru" style="max-height: 150px;"></canvas>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-md-6 mb-3">
|
|
<div class="card border-0 shadow-sm h-100" style="border-left: 5px solid #005eb8 !important;">
|
|
<div class="card-header pb-0">
|
|
<h6 class=" fw-normal mb-0">Statistik Pelanggan Setia Total <b id="confirm_ps_total"></b></h6>
|
|
</div>
|
|
<div class="card-body">
|
|
<canvas id="barChartLama" style="max-height: 150px;"></canvas>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="card">
|
|
<div class="card-header d-flex justify-content-between align-items-center">
|
|
<h5 class="mb-0">Data Detail Survei <strong id="confirm_date_survey"></strong></h5>
|
|
<div class="d-flex align-items-center gap-2">
|
|
<button type="button" class="btn btn-sm btn-outline-secondary" onclick="exportSurvei()">
|
|
<i class="fa fa-download me-1"></i> Export
|
|
</button>
|
|
<div class="input-group input-group-sm" style="width: 240px;">
|
|
<span class="input-group-text bg-white"><i class="fa fa-calendar-alt"></i></span>
|
|
<input type="text" class="form-control tanggal-input" id="tanggal" placeholder="Pilih tanggal" readonly>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="card-body">
|
|
<table class="table" id="datatableSurvey"></table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
@include('dashboard.survey.modal.export')
|
|
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
|
|
|
|
<script>
|
|
const datatable = $("#datatableSurvey");
|
|
const modalExport = document.getElementById('modalExportSurvei');
|
|
// Inisialisasi variabel Chart agar bisa di-destroy saat update
|
|
let chartBaruObj, chartLamaObj;
|
|
|
|
function initDt(selectDate = []) {
|
|
datatable.bootstrapTable('destroy');
|
|
datatable.bootstrapTable({
|
|
url: "/dashboard/datatable/survey",
|
|
method: 'get',
|
|
queryParams: function(params) {
|
|
params.tanggal = selectDate;
|
|
return params;
|
|
},
|
|
showColumns: true,
|
|
pagination: true,
|
|
serverSide: true,
|
|
pageSize: 10,
|
|
columns: [
|
|
{ title: "Nama Pelanggan", field: 'order.nama_pemesan' },
|
|
{
|
|
title: "Type Survei",
|
|
field: 'type',
|
|
formatter: (v, row) => row?.type === "pengguna_baru" ? "Pengguna Baru" : "Pelanggan Setia"
|
|
},
|
|
{ title: "Kepuasan", field: 'kepuasan' },
|
|
{ title: "Kritik dan Saran", field: 'keterangan' },
|
|
],
|
|
});
|
|
}
|
|
|
|
// Fungsi perbaikan untuk Bar Chart Horizontal
|
|
function updateBarChart(chartId, puas, tidakPuas) {
|
|
const ctx = document.getElementById(chartId).getContext('2d');
|
|
|
|
// Hancurkan instance lama agar tidak tumpang tindih saat hover
|
|
if (chartId === 'barChartBaru' && chartBaruObj) chartBaruObj.destroy();
|
|
if (chartId === 'barChartLama' && chartLamaObj) chartLamaObj.destroy();
|
|
|
|
const config = {
|
|
type: 'bar',
|
|
data: {
|
|
labels: ['Puas', 'Tidak Puas'],
|
|
datasets: [{
|
|
data: [puas, tidakPuas],
|
|
backgroundColor: [
|
|
chartId === 'barChartBaru' ? '#00a99d' : '#005eb8',
|
|
'#dc3545'
|
|
],
|
|
borderRadius: 5,
|
|
barThickness: 20
|
|
}]
|
|
},
|
|
options: {
|
|
indexAxis: 'y',
|
|
responsive: true,
|
|
maintainAspectRatio: false,
|
|
plugins: {
|
|
legend: { display: false },
|
|
tooltip: { enabled: true }
|
|
},
|
|
scales: {
|
|
x: {
|
|
beginAtZero: true,
|
|
grid: { display: false },
|
|
ticks: { stepSize: 1, precision: 0 }
|
|
},
|
|
y: { grid: { display: false } }
|
|
}
|
|
}
|
|
};
|
|
|
|
if (chartId === 'barChartBaru') chartBaruObj = new Chart(ctx, config);
|
|
else chartLamaObj = new Chart(ctx, config);
|
|
}
|
|
|
|
async function loadCharts(selectDate = []) {
|
|
try {
|
|
const dateParam = encodeURIComponent(JSON.stringify(selectDate));
|
|
const response = await fetch(`/dashboard/chart/survey?tanggal=${dateParam}`);
|
|
const data = await response.json();
|
|
console.log(data);
|
|
|
|
// 1. Update Statistik Bar Chart Pengguna Baru
|
|
if(data.kepuasan_baru) {
|
|
updateBarChart('barChartBaru', data.kepuasan_baru.puas, data.kepuasan_baru.tidak_puas);
|
|
$("#confirm_pb_total").text(data.kepuasan_baru.total);
|
|
}
|
|
|
|
// 2. Update Statistik Bar Chart Pelanggan Setia
|
|
if(data.kepuasan_lama) {
|
|
updateBarChart('barChartLama', data.kepuasan_lama.puas, data.kepuasan_lama.tidak_puas);
|
|
$("#confirm_ps_total").text(data.kepuasan_lama.total);
|
|
}
|
|
|
|
} catch (error) {
|
|
console.error("Error load chart:", error);
|
|
}
|
|
}
|
|
|
|
document.addEventListener('DOMContentLoaded', function() {
|
|
flatpickr('#tanggal', {
|
|
dateFormat: "Y-m-d",
|
|
mode: "multiple",
|
|
locale: "id",
|
|
onValueUpdate: function(selectedDates) {
|
|
const formatted = selectedDates.map(d => {
|
|
const year = d.getFullYear();
|
|
const month = String(d.getMonth() + 1).padStart(2, '0');
|
|
const day = String(d.getDate()).padStart(2, '0');
|
|
return `${year}-${month}-${day}`;
|
|
});
|
|
|
|
initDt(formatted);
|
|
loadCharts(formatted);
|
|
|
|
let text = formatted.length > 0 ? ': ' + formatted.join(', ') : 'Hari Ini';
|
|
$("#confirm_date_survey").text(text);
|
|
}
|
|
});
|
|
|
|
$("#confirm_date_survey").text('Hari Ini');
|
|
initDt();
|
|
loadCharts();
|
|
});
|
|
|
|
function exportSurvei(){
|
|
new bootstrap.Modal(modalExport).show()
|
|
}
|
|
</script>
|
|
@endsection
|