ui(dashboard): show 3 distribution charts per row
This commit is contained in:
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user