feat : statistics page

This commit is contained in:
2025-07-27 09:26:48 +03:30
parent bafa24543d
commit d192419ac8
8 changed files with 138 additions and 71 deletions

View File

@@ -0,0 +1,6 @@
<svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="30" height="30" rx="8" fill="#00CC99"/>
<path d="M23.21 10.8204L15.51 15.2804C15.2 15.4604 14.81 15.4604 14.49 15.2804L6.78997 10.8204C6.23997 10.5004 6.09997 9.75043 6.51997 9.28043C6.80997 8.95043 7.13997 8.68043 7.48997 8.49043L12.91 5.49043C14.07 4.84043 15.95 4.84043 17.11 5.49043L22.53 8.49043C22.88 8.68043 23.21 8.96043 23.5 9.28043C23.9 9.75043 23.76 10.5004 23.21 10.8204Z" fill="white"/>
<path d="M14.43 17.1399V23.9599C14.43 24.7199 13.66 25.2199 12.98 24.8899C10.92 23.8799 7.44998 21.9899 7.44998 21.9899C6.22998 21.2999 5.22998 19.5599 5.22998 18.1299V12.9699C5.22998 12.1799 6.05998 11.6799 6.73998 12.0699L13.93 16.2399C14.23 16.4299 14.43 16.7699 14.43 17.1399Z" fill="white"/>
<path d="M15.5701 17.1399V23.9599C15.5701 24.7199 16.3401 25.2199 17.0201 24.8899C19.0801 23.8799 22.5501 21.9899 22.5501 21.9899C23.7701 21.2999 24.7701 19.5599 24.7701 18.1299V12.9699C24.7701 12.1799 23.9401 11.6799 23.2601 12.0699L16.0701 16.2399C15.7701 16.4299 15.5701 16.7699 15.5701 17.1399Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -100,6 +100,9 @@ class $AssetsIconsGen {
/// File path: assets/icons/cube_bottom_rotation.svg
SvgGenImage get cubeBottomRotation => const SvgGenImage('assets/icons/cube_bottom_rotation.svg');
/// File path: assets/icons/cube_card.svg
SvgGenImage get cubeCard => const SvgGenImage('assets/icons/cube_card.svg');
/// File path: assets/icons/cube_rotate.svg
SvgGenImage get cubeRotate => const SvgGenImage('assets/icons/cube_rotate.svg');
@@ -293,6 +296,7 @@ class $AssetsIconsGen {
cow,
cube,
cubeBottomRotation,
cubeCard,
cubeRotate,
cubeScan,
cubeSearch,
@@ -453,6 +457,9 @@ class $AssetsVecGen {
/// File path: assets/vec/cube_bottom_rotation.svg.vec
SvgGenImage get cubeBottomRotationSvg => const SvgGenImage.vec('assets/vec/cube_bottom_rotation.svg.vec');
/// File path: assets/vec/cube_card.svg.vec
SvgGenImage get cubeCardSvg => const SvgGenImage.vec('assets/vec/cube_card.svg.vec');
/// File path: assets/vec/cube_rotate.svg.vec
SvgGenImage get cubeRotateSvg => const SvgGenImage.vec('assets/vec/cube_rotate.svg.vec');
@@ -646,6 +653,7 @@ class $AssetsVecGen {
cowSvg,
cubeSvg,
cubeBottomRotationSvg,
cubeCardSvg,
cubeRotateSvg,
cubeScanSvg,
cubeSearchSvg,

View File

@@ -150,57 +150,102 @@ class StatisticsPage extends GetView<StatisticsLogic> {
),
SizedBox(height: 8.h),
Container(
height: 152.h,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8),
border: Border.all(color: AppColor.lightGreyNormalHover, width: 1),
),
child: Padding(
padding: const EdgeInsets.fromLTRB(0, 10, 0, 13),
child: Row(
spacing: 8,
children: [
Expanded(
child: ObxValue(
(data) => _informationLabelCard(
title: 'تعداد تراکنش ها',
titleColor: AppColor.blueNormal,
isLoading: data.value == null,
description: 25369654.separatedByComma,
iconPath: Assets.vec.cubeSearchSvg.path,
iconColor: AppColor.blueNormal,
bgDescriptionColor: Colors.white,
gradient: LinearGradient(
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
colors: [AppColor.blueLight, Colors.white],
padding: EdgeInsets.all(8),
child: Column(
spacing: 8,
children: [
Row(
spacing: 8,
children: [
Expanded(
child: ObxValue(
(data) => _informationLabelCard(
title: 'تعداد تراکنش ها',
titleColor: AppColor.blueNormal,
isLoading: data.value == null,
description: 25369654.separatedByComma,
iconPath: Assets.vec.cubeScanSvg.path,
bgDescriptionColor: Colors.white,
gradient: LinearGradient(
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
colors: [AppColor.blueLight, Colors.white],
),
),
controller.s1,
),
controller.s1,
),
),
Expanded(
child: ObxValue((data) {
return _informationLabelCard(
title: 'جمع تراکنش ها',
isLoading: data.value == null,
description: data.value.separatedByComma ?? '0',
unit: 'ريال',
iconPath: Assets.vec.cubeWattingSvg.path,
bgDescriptionColor: Colors.white,
gradient: LinearGradient(
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
colors: [const Color(0xFFFFE7BB), Colors.white],
),
);
}, controller.s2),
),
],
),
Expanded(
child: ObxValue((data) {
return _informationLabelCard(
title: 'جمع تراکنش ها',
isLoading: data.value == null,
description: data.value.separatedByComma ?? '0',
unit: 'ريال',
iconPath: Assets.vec.cubeCardSvg.path,
bgDescriptionColor: Colors.white,
titleColor: AppColor.greenDarkHover,
gradient: LinearGradient(
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
colors: [AppColor.greenLightHover, Colors.white],
),
);
}, controller.s2),
),
],
),
Row(
spacing: 16,
mainAxisAlignment: MainAxisAlignment.center,
children: [
RElevated(
width: 160.w,
height: 40.h,
backgroundColor: AppColor.greenNormal,
onPressed: () {},
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Assets.vec.excelDownloadSvg.svg(
width: 24.w,
height: 24.h,
colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn),
),
SizedBox(width: 4.w),
Text('EXCEL', style: AppFonts.yekan14.copyWith(color: Colors.white)),
],
),
),
ROutlinedElevated(
width: 160.w,
height: 40.h,
borderColor: AppColor.error,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Assets.vec.pdfDownloadSvg.svg(
width: 24.w,
height: 24.h,
colorFilter: const ColorFilter.mode(AppColor.error, BlendMode.srcIn),
),
SizedBox(width: 4.w),
Text('PDF', style: AppFonts.yekan14.copyWith(color: AppColor.error)),
],
),
),
],
),
],
),
),
SizedBox(height: 8.h),
],
),
);
@@ -239,7 +284,6 @@ class StatisticsPage extends GetView<StatisticsLogic> {
}) {
return Container(
height: 82.h,
margin: EdgeInsets.symmetric(horizontal: 12.w),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8),
border: Border.all(color: AppColor.lightGreyNormalHover, width: 1),
@@ -249,10 +293,10 @@ class StatisticsPage extends GetView<StatisticsLogic> {
children: [
// Left side with icon and title
Expanded(
flex: 2,
flex: 91,
child: Container(
height: 82.h,
padding: EdgeInsets.all(8),
padding: EdgeInsets.all(4),
decoration: BoxDecoration(
color: gradient == null ? bgLabelColor : null,
borderRadius: BorderRadius.only(
@@ -263,7 +307,7 @@ class StatisticsPage extends GetView<StatisticsLogic> {
),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
spacing: 4,
spacing: 8,
children: [
SvgGenImage.vec(iconPath).svg(
width: 24,
@@ -285,7 +329,7 @@ class StatisticsPage extends GetView<StatisticsLogic> {
),
// Right side with description and unit
Expanded(
flex: 3,
flex: 109,
child: Container(
decoration: BoxDecoration(
color: bgDescriptionColor,
@@ -302,13 +346,13 @@ class StatisticsPage extends GetView<StatisticsLogic> {
children: [
Text(
description,
textAlign: TextAlign.right,
style: AppFonts.yekan16.copyWith(color: AppColor.mediumGreyDarkActive),
textAlign: TextAlign.center,
style: AppFonts.yekan14.copyWith(color: AppColor.mediumGreyDarkActive),
),
Visibility(
visible: unit != null,
child: Text(
unit,
unit ?? '',
textAlign: TextAlign.center,
style: AppFonts.yekan12.copyWith(color: AppColor.mediumGreyDarkActive),
),