From 658f3f26e03d067686394f97c8b22a78a9e40c97 Mon Sep 17 00:00:00 2001 From: Vaibhav Surve Date: Thu, 12 Jun 2025 23:59:13 +0530 Subject: [PATCH] feat: Enhance dashboard stats display with project selection validation and user feedback --- lib/view/dashboard/dashboard_screen.dart | 124 +++++++++++++++++------ 1 file changed, 91 insertions(+), 33 deletions(-) diff --git a/lib/view/dashboard/dashboard_screen.dart b/lib/view/dashboard/dashboard_screen.dart index 6d948de..5227333 100644 --- a/lib/view/dashboard/dashboard_screen.dart +++ b/lib/view/dashboard/dashboard_screen.dart @@ -10,6 +10,7 @@ import 'package:marco/helpers/widgets/my_text.dart'; import 'package:marco/view/layouts/layout.dart'; import 'package:marco/helpers/services/storage/local_storage.dart'; import 'package:marco/helpers/widgets/my_button.dart'; +import 'package:marco/controller/project_controller.dart'; class DashboardScreen extends StatefulWidget { const DashboardScreen({super.key}); @@ -129,46 +130,103 @@ class _DashboardScreenState extends State with UIMixin { DashboardScreen.dailyTasksProgressRoute), ]; - return LayoutBuilder( - builder: (context, constraints) { - double maxWidth = constraints.maxWidth; - int crossAxisCount = (maxWidth / 100).floor().clamp(2, 4); - double cardWidth = - (maxWidth - (crossAxisCount - 1) * 10) / crossAxisCount; + return GetBuilder( + id: 'dashboard_controller', + builder: (controller) { + final bool isProjectSelected = controller.selectedProject != null; - return Wrap( - spacing: 10, - runSpacing: 10, - children: - stats.map((stat) => _buildStatCard(stat, cardWidth)).toList(), + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (!isProjectSelected) + Padding( + padding: const EdgeInsets.symmetric(vertical: 12), + child: MyCard( + color: Colors.orange.withOpacity(0.1), + paddingAll: 12, + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Icon(Icons.info_outline, color: Colors.orange), + MySpacing.width(8), + Expanded( + child: MyText.bodySmall( + "No projects assigned yet. Please contact your manager to get started.", + color: Colors.orange.shade800, + maxLines: 3, + overflow: TextOverflow.ellipsis, + ), + ), + ], + ), + ), + ), + LayoutBuilder( + builder: (context, constraints) { + double maxWidth = constraints.maxWidth; + int crossAxisCount = (maxWidth / 100).floor().clamp(2, 4); + double cardWidth = + (maxWidth - (crossAxisCount - 1) * 10) / crossAxisCount; + + return Wrap( + spacing: 10, + runSpacing: 10, + children: stats + .map((stat) => + _buildStatCard(stat, cardWidth, isProjectSelected)) + .toList(), + ); + }, + ), + ], ); }, ); } - Widget _buildStatCard(_StatItem statItem, double width) { - return InkWell( - onTap: () => Get.toNamed(statItem.route), - borderRadius: BorderRadius.circular(10), - child: MyCard.bordered( - width: width, - height: 100, - paddingAll: 5, - borderRadiusAll: 10, - border: Border.all(color: Colors.grey.withOpacity(0.15)), - shadow: MyShadow(elevation: 1.5, position: MyShadowPosition.bottom), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - _buildStatCardIcon(statItem), - MySpacing.height(8), - MyText.labelSmall( - statItem.title, - maxLines: 2, - overflow: TextOverflow.visible, - textAlign: TextAlign.center, + Widget _buildStatCard(_StatItem statItem, double width, bool isEnabled) { + return Opacity( + opacity: isEnabled ? 1.0 : 0.4, + child: IgnorePointer( + ignoring: !isEnabled, + child: InkWell( + onTap: () { + if (!isEnabled) { + Get.defaultDialog( + title: "No Project Selected", + middleText: + "You need to select a project before accessing this section.", + confirm: ElevatedButton( + onPressed: () => Get.back(), + child: const Text("OK"), + ), + ); + } else { + Get.toNamed(statItem.route); + } + }, + borderRadius: BorderRadius.circular(10), + child: MyCard.bordered( + width: width, + height: 100, + paddingAll: 5, + borderRadiusAll: 10, + border: Border.all(color: Colors.grey.withOpacity(0.15)), + shadow: MyShadow(elevation: 1.5, position: MyShadowPosition.bottom), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + _buildStatCardIcon(statItem), + MySpacing.height(8), + MyText.labelSmall( + statItem.title, + maxLines: 2, + overflow: TextOverflow.visible, + textAlign: TextAlign.center, + ), + ], ), - ], + ), ), ), );