Fix: Data inconsistency pada transisi tahun/bulan dan setup API lokal untuk testing

- Fix deteksi transisi bulan untuk semua bulan (tidak hanya 1 Januari)
- Perbaikan validasi data dengan threshold 20% untuk transisi bulan/tahun
- Auto-reset chart jika data hourly tidak valid
- Setup force local mode untuk testing API lokal
- Perbaikan normalisasi dan validasi tanggal
- Enhanced logging untuk debugging transisi
This commit is contained in:
BTekno Dev
2026-01-01 23:38:42 +07:00
parent fccda40d72
commit 5e330e931b
6 changed files with 655 additions and 48 deletions

View File

@@ -107,11 +107,41 @@ export function updateDailyChart({ labels, counts, amounts }) {
return;
}
dailyLineChart.data.labels = labels || [];
dailyLineChart.data.datasets[0].data = counts || [];
dailyLineChart.data.datasets[1].data = amounts || [];
dailyLineChart.update();
console.log('[Charts] Daily chart updated:', { labelsCount: labels?.length, countsCount: counts?.length, amountsCount: amounts?.length });
// Pastikan data arrays memiliki length yang sama
const safeLabels = labels || [];
const safeCounts = counts || [];
const safeAmounts = amounts || [];
// Pastikan semua array memiliki length yang sama (24 jam)
const maxLength = Math.max(safeLabels.length, safeCounts.length, safeAmounts.length, 24);
const finalLabels = Array.from({ length: maxLength }, (_, i) => {
if (i < safeLabels.length) return safeLabels[i];
return `${String(i).padStart(2, '0')}:00`;
});
const finalCounts = Array.from({ length: maxLength }, (_, i) => {
if (i < safeCounts.length) return Number(safeCounts[i]) || 0;
return 0;
});
const finalAmounts = Array.from({ length: maxLength }, (_, i) => {
if (i < safeAmounts.length) return Number(safeAmounts[i]) || 0;
return 0;
});
// Update chart data
dailyLineChart.data.labels = finalLabels;
dailyLineChart.data.datasets[0].data = finalCounts;
dailyLineChart.data.datasets[1].data = finalAmounts;
// Update chart dengan mode 'none' untuk menghindari animasi yang tidak perlu
dailyLineChart.update('none');
console.log('[Charts] Daily chart updated:', {
labelsCount: finalLabels.length,
countsCount: finalCounts.length,
amountsCount: finalAmounts.length,
totalCount: finalCounts.reduce((a, b) => a + b, 0),
totalAmount: finalAmounts.reduce((a, b) => a + b, 0)
});
}
export function initCategoryChart(ctx) {
@@ -169,18 +199,29 @@ export function updateCategoryChart({ labels, values }) {
}
// Pastikan labels dan values tidak kosong
const finalLabels = labels && labels.length > 0 ? labels : ['Orang', 'Motor', 'Mobil'];
const finalValues = values && values.length > 0 ? values : [0, 0, 0];
// Default categories: Orang, Motor, Mobil
const defaultLabels = ['Orang', 'Motor', 'Mobil'];
const defaultValues = [0, 0, 0];
// Pastikan length sama
const minLength = Math.min(finalLabels.length, finalValues.length);
const safeLabels = finalLabels.slice(0, minLength);
const safeValues = finalValues.slice(0, minLength);
const finalLabels = labels && labels.length > 0 ? labels : defaultLabels;
const finalValues = values && values.length > 0 ? values : defaultValues;
// Pastikan length sama (minimal 3 untuk 3 kategori)
const maxLength = Math.max(finalLabels.length, finalValues.length, 3);
const safeLabels = Array.from({ length: maxLength }, (_, i) => {
if (i < finalLabels.length) return finalLabels[i];
return defaultLabels[i] || `Kategori ${i + 1}`;
});
const safeValues = Array.from({ length: maxLength }, (_, i) => {
if (i < finalValues.length) return Number(finalValues[i]) || 0;
return 0;
});
// Update chart data
categoryChart.data.labels = safeLabels;
categoryChart.data.datasets[0].data = safeValues;
// Update chart dengan mode 'none' untuk animasi halus
// Update chart dengan mode 'none' untuk menghindari animasi yang tidak perlu
categoryChart.update('none');
console.log('[Charts] Category chart updated:', {