131 lines
3.1 KiB
Dart
131 lines
3.1 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:fl_chart/fl_chart.dart';
|
|
|
|
/// SHOW EXPORT PREVIEW DIALOG
|
|
/// Helper function untuk menampilkan preview export data
|
|
void showExportPreview(BuildContext context, String content, String title) {
|
|
showDialog(
|
|
context: context,
|
|
builder: (context) => AlertDialog(
|
|
title: Text("Preview Export - $title"),
|
|
content: SizedBox(
|
|
width: double.maxFinite,
|
|
child: SingleChildScrollView(
|
|
child: Text(
|
|
content,
|
|
style: const TextStyle(
|
|
fontFamily: 'monospace',
|
|
fontSize: 10,
|
|
),
|
|
),
|
|
),
|
|
),
|
|
actions: [
|
|
TextButton(
|
|
onPressed: () => Navigator.pop(context),
|
|
child: const Text("Tutup"),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
|
|
/// STAT CARD WIDGET
|
|
/// Reusable card untuk menampilkan statistik
|
|
class StatCard extends StatelessWidget {
|
|
final String title;
|
|
final String value;
|
|
final Color color;
|
|
final IconData icon;
|
|
|
|
const StatCard({
|
|
super.key,
|
|
required this.title,
|
|
required this.value,
|
|
required this.color,
|
|
required this.icon,
|
|
});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Container(
|
|
padding: const EdgeInsets.all(12),
|
|
decoration: BoxDecoration(
|
|
color: color.withOpacity(0.1),
|
|
borderRadius: BorderRadius.circular(12),
|
|
border: Border.all(color: color, width: 1),
|
|
),
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Icon(icon, color: color, size: 20),
|
|
const SizedBox(height: 8),
|
|
Text(
|
|
title,
|
|
style: const TextStyle(
|
|
fontSize: 11,
|
|
color: Colors.grey,
|
|
),
|
|
),
|
|
const SizedBox(height: 4),
|
|
Text(
|
|
value,
|
|
style: TextStyle(
|
|
fontSize: 16,
|
|
fontWeight: FontWeight.bold,
|
|
color: color,
|
|
),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
/// BUILD BAR GROUP FOR CHART
|
|
/// Helper untuk membuat bar group di BarChart
|
|
BarChartGroupData buildBarGroup(int x, double value) {
|
|
return BarChartGroupData(
|
|
x: x,
|
|
barRods: [
|
|
BarChartRodData(
|
|
toY: value.toDouble(),
|
|
color: Colors.blue,
|
|
width: 12,
|
|
borderRadius: const BorderRadius.vertical(top: Radius.circular(6)),
|
|
),
|
|
],
|
|
);
|
|
}
|
|
|
|
/// GET PERIOD INTERVAL
|
|
/// Menentukan spacing interval berdasarkan periode
|
|
double getPeriodInterval(String period) {
|
|
switch (period) {
|
|
case "Hari Ini":
|
|
return 3;
|
|
case "Minggu Ini":
|
|
return 1;
|
|
case "Bulan Ini":
|
|
return 2;
|
|
default:
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
/// GET PERIOD LABEL
|
|
/// Menentukan label untuk X-axis berdasarkan periode
|
|
String getPeriodLabel(String period, double value) {
|
|
switch (period) {
|
|
case "Hari Ini":
|
|
return '${value.toInt()}h';
|
|
case "Minggu Ini":
|
|
final days = ['Sen', 'Sel', 'Rab', 'Kam', 'Jum', 'Sab', 'Min'];
|
|
return days[value.toInt()];
|
|
case "Bulan Ini":
|
|
return 'M${value.toInt() + 1}';
|
|
default:
|
|
return '';
|
|
}
|
|
}
|