report dashboard

This commit is contained in:
efrilm
2025-11-03 16:24:11 +07:00
parent 069c2296de
commit b4a9cf31fc
30 changed files with 5779 additions and 5 deletions
@@ -0,0 +1,43 @@
import 'package:flutter/widgets.dart';
import '../../../common/data/report_menu.dart';
import '../../../domain/analytic/analytic.dart';
import '../card/error_card.dart';
class AnalyticErrorStateWidget extends StatelessWidget {
final AnalyticFailure failure;
final ReportMenu menu;
final Function() onRefresh;
const AnalyticErrorStateWidget({
super.key,
required this.failure,
required this.menu,
required this.onRefresh,
});
@override
Widget build(BuildContext context) {
return failure.maybeMap(
orElse: () => ErrorCard(
title: menu.title,
message: 'Terjadi kesalahan, Silakan coba lagi!',
onTap: onRefresh,
),
dynamicErrorMessage: (value) => ErrorCard(
title: menu.title,
message: value.erroMessage,
onTap: onRefresh,
),
serverError: (value) => ErrorCard(
title: menu.title,
message: 'Server Error, Silakan coba lagi!',
onTap: onRefresh,
),
unexpectedError: (value) => ErrorCard(
title: menu.title,
message: 'Terjadi kesalahan, Silakan coba lagi!',
onTap: onRefresh,
),
);
}
}
@@ -0,0 +1,68 @@
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import '../../../../common/data/report_menu.dart';
import '../../../../common/extension/extension.dart';
import '../../../../common/theme/theme.dart';
import '../../spaces/space.dart';
class ReportHeader extends StatelessWidget {
final ReportMenu menu;
final DateTime endDate;
final DateTime startDate;
const ReportHeader({
super.key,
required this.menu,
required this.endDate,
required this.startDate,
});
@override
Widget build(BuildContext context) {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
menu.title,
style: AppStyle.xl.copyWith(
fontWeight: FontWeight.bold,
color: AppColor.textPrimary,
),
),
SpaceHeight(4),
Text(
menu.subtitle,
style: AppStyle.md.copyWith(color: AppColor.textSecondary),
),
],
),
Container(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
decoration: BoxDecoration(
color: AppColor.primary,
borderRadius: BorderRadius.circular(8),
),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
const Icon(Icons.calendar_today, color: Colors.white, size: 16),
const SizedBox(width: 8),
Text(
startDate.toSimpleMonthDate() == endDate.toSimpleMonthDate()
? startDate.toSimpleMonthDate()
: '${startDate.toSimpleMonthDate()} - ${endDate.toSimpleMonthDate()}',
style: AppStyle.sm.copyWith(
color: Colors.white,
fontWeight: FontWeight.w500,
),
),
],
),
),
],
);
}
}
@@ -0,0 +1,66 @@
import 'package:flutter/material.dart';
import '../../../../common/theme/theme.dart';
import '../../spaces/space.dart';
class ReportSummaryCard extends StatelessWidget {
final Color color;
final IconData icon;
final String title;
final String value;
const ReportSummaryCard({
super.key,
required this.color,
required this.icon,
required this.title,
required this.value,
});
@override
Widget build(BuildContext context) {
return Container(
padding: const EdgeInsets.all(18),
decoration: BoxDecoration(
color: AppColor.white,
borderRadius: BorderRadius.circular(14),
border: Border.all(color: Colors.grey[200]!),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Container(
padding: const EdgeInsets.all(10),
decoration: BoxDecoration(
color: color.withOpacity(0.12),
borderRadius: BorderRadius.circular(10),
),
child: Icon(icon, color: color, size: 22),
),
SpaceWidth(12),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
value,
style: AppStyle.xxl.copyWith(
fontWeight: FontWeight.bold,
color: AppColor.textPrimary,
),
),
SpaceHeight(4),
Text(
title,
style: AppStyle.sm.copyWith(
fontWeight: FontWeight.w600,
color: AppColor.textPrimary,
),
),
],
),
),
],
),
);
}
}