ui(dashboard): show 3 distribution charts per row

This commit is contained in:
Arya Dwi Putra
2025-12-19 00:36:21 +07:00
parent 47580aeb54
commit 73875c3ab2
2 changed files with 47 additions and 5 deletions

View File

@@ -5,6 +5,7 @@ namespace App\Services\Dashboard;
use App\Models\Asset; use App\Models\Asset;
use App\Models\AssetApprovalRequest; use App\Models\AssetApprovalRequest;
use App\Models\AssetAudit; use App\Models\AssetAudit;
use App\Models\AssetCategory;
use App\Models\AssetDisposal; use App\Models\AssetDisposal;
use App\Models\AssetLocation; use App\Models\AssetLocation;
use App\Models\AssetMaintenance; use App\Models\AssetMaintenance;
@@ -102,6 +103,16 @@ class DashboardService
->take(10) ->take(10)
->values(); ->values();
$byCategory = AssetCategory::query()
->withCount(['assets as assets_count' => fn ($q) => $q->forUser($user)])
->orderByDesc('assets_count')
->orderBy('name')
->get()
->map(fn ($cat) => ['label' => $cat->name, 'value' => (int) $cat->assets_count])
->filter(fn ($row) => $row['value'] > 0)
->take(10)
->values();
$trendLabels = $this->buildTrendLabels($trendStart, $trendDays); $trendLabels = $this->buildTrendLabels($trendStart, $trendDays);
$movementTrend = $this->buildDailyTrend( $movementTrend = $this->buildDailyTrend(
AssetMovement::query() AssetMovement::query()
@@ -176,6 +187,7 @@ class DashboardService
'pendingApprovalsCount', 'pendingApprovalsCount',
'byStatus', 'byStatus',
'byLocation', 'byLocation',
'byCategory',
'trendLabels', 'trendLabels',
'movementTrend', 'movementTrend',
'disposalTrend', 'disposalTrend',
@@ -220,4 +232,3 @@ class DashboardService
->all(); ->all();
} }
} }

View File

@@ -216,23 +216,33 @@
</div> </div>
<div class="row g-3 mt-0"> <div class="row g-3 mt-0">
<div class="col-xl-6"> <div class="col-xl-4 col-md-6">
<div class="card custom-card h-100"> <div class="card custom-card h-100">
<div class="card-header"> <div class="card-header">
<div class="card-title mb-0">Distribusi Aset per Status</div> <div class="card-title mb-0">Distribusi Aset per Status</div>
</div> </div>
<div class="card-body"> <div class="card-body">
<canvas id="chartStatus" height="140"></canvas> <canvas id="chartStatus" height="110"></canvas>
</div> </div>
</div> </div>
</div> </div>
<div class="col-xl-6"> <div class="col-xl-4 col-md-6">
<div class="card custom-card h-100"> <div class="card custom-card h-100">
<div class="card-header"> <div class="card-header">
<div class="card-title mb-0">Top Lokasi (10)</div> <div class="card-title mb-0">Top Lokasi (10)</div>
</div> </div>
<div class="card-body"> <div class="card-body">
<canvas id="chartLocation" height="140"></canvas> <canvas id="chartLocation" height="110"></canvas>
</div>
</div>
</div>
<div class="col-xl-4 col-md-12">
<div class="card custom-card h-100">
<div class="card-header">
<div class="card-title mb-0">Top Kategori (10)</div>
</div>
<div class="card-body">
<canvas id="chartCategory" height="110"></canvas>
</div> </div>
</div> </div>
</div> </div>
@@ -489,5 +499,26 @@
} }
}); });
} }
const catCtx = document.getElementById('chartCategory');
const catData = @json($byCategory ?? []);
if (catCtx) {
new Chart(catCtx, {
type: 'bar',
data: {
labels: catData.map(i => i.label),
datasets: [{
label: 'Jumlah Aset',
data: catData.map(i => i.value),
backgroundColor: '#a78bfa'
}]
},
options: {
indexAxis: 'y',
plugins: { legend: { display: false } },
scales: { x: { beginAtZero: true, ticks: { precision: 0 } } }
}
});
}
</script> </script>
@endsection @endsection