From 839f878d351afdb3dec6b8ec563d6fed90b42a3c Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Sun, 3 May 2026 11:28:34 +0300 Subject: [PATCH] ui changes --- assets/images/dashboard/chat.svg | 5 + assets/images/dashboard/completed_icon.svg | 3 + assets/images/dashboard/inprogress_icon.svg | 4 + assets/images/dashboard/notification.svg | 4 + assets/images/dashboard/open_icon.svg | 3 + lib/dashboard_latest/dashboard_view.dart | 7 +- .../widgets/app_bar_widget.dart | 126 ++++++++++++-- .../widgets/progress_fragment.dart | 156 ++++++++++++------ .../widgets/requests_fragment.dart | 50 +++--- lib/extensions/text_extensions.dart | 9 + lib/extensions/widget_extensions.dart | 2 +- .../tm_module/tasks/create_task_view.dart | 4 +- lib/new_views/app_style/app_color.dart | 30 +++- lib/new_views/app_style/app_themes.dart | 4 +- .../common_widgets/app_bottom_nav_bar.dart | 11 +- .../common_widgets/app_text_form_field.dart | 8 +- .../common_widgets/custom_badge.dart | 3 +- .../single_item_drop_down_menu.dart | 9 +- lib/new_views/pages/land_page/land_page.dart | 13 +- lib/new_views/pages/splash_page.dart | 4 +- .../selection_fullscreen_dialog.dart | 2 +- pubspec.yaml | 1 + 22 files changed, 325 insertions(+), 133 deletions(-) create mode 100644 assets/images/dashboard/chat.svg create mode 100644 assets/images/dashboard/completed_icon.svg create mode 100644 assets/images/dashboard/inprogress_icon.svg create mode 100644 assets/images/dashboard/notification.svg create mode 100644 assets/images/dashboard/open_icon.svg diff --git a/assets/images/dashboard/chat.svg b/assets/images/dashboard/chat.svg new file mode 100644 index 00000000..8fbebec0 --- /dev/null +++ b/assets/images/dashboard/chat.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/dashboard/completed_icon.svg b/assets/images/dashboard/completed_icon.svg new file mode 100644 index 00000000..516d8f3f --- /dev/null +++ b/assets/images/dashboard/completed_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/dashboard/inprogress_icon.svg b/assets/images/dashboard/inprogress_icon.svg new file mode 100644 index 00000000..79b4f642 --- /dev/null +++ b/assets/images/dashboard/inprogress_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/dashboard/notification.svg b/assets/images/dashboard/notification.svg new file mode 100644 index 00000000..3a9181b1 --- /dev/null +++ b/assets/images/dashboard/notification.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/dashboard/open_icon.svg b/assets/images/dashboard/open_icon.svg new file mode 100644 index 00000000..5bbeeabd --- /dev/null +++ b/assets/images/dashboard/open_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/lib/dashboard_latest/dashboard_view.dart b/lib/dashboard_latest/dashboard_view.dart index 8d7fce09..8e898fb4 100644 --- a/lib/dashboard_latest/dashboard_view.dart +++ b/lib/dashboard_latest/dashboard_view.dart @@ -105,17 +105,14 @@ class _DashboardViewState extends State { Widget build(BuildContext context) { final user = Provider.of(context, listen: false).user; bool isEngineer = (user?.type) == UsersTypes.engineer; + ///Need to check which info need to show on dashboard for quality user. bool isQualityUser = (user?.type) == UsersTypes.qualityUser; return Stack( children: [ Scaffold( - appBar: PreferredSize( - preferredSize: const Size.fromHeight(kToolbarHeight), - child: AppBarWidget( - onDrawerPress: widget.onDrawerPress, - )), + appBar: PreferredSize(preferredSize: const Size.fromHeight(kToolbarHeight), child: AppBarWidget(onDrawerPress: widget.onDrawerPress)), body: RefreshIndicator( onRefresh: () async { getRequests(); diff --git a/lib/dashboard_latest/widgets/app_bar_widget.dart b/lib/dashboard_latest/widgets/app_bar_widget.dart index 0621065f..261318dc 100644 --- a/lib/dashboard_latest/widgets/app_bar_widget.dart +++ b/lib/dashboard_latest/widgets/app_bar_widget.dart @@ -1,3 +1,5 @@ +import 'dart:io'; + import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -50,19 +52,118 @@ class AppBarWidget extends StatelessWidget { 8.width, Column( crossAxisAlignment: CrossAxisAlignment.start, + spacing: 4, children: [ Text( - snapshot.user?.username ?? "", // Simplified null check - style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50, fontWeight: FontWeight.w600, fontSize: context.isTablet() ? 14 : null), + snapshot.user?.username ?? "", + style: AppTextStyles.heading6.copyWith(color: AppColor.headingTextColor(context), fontSize: context.isTablet() ? 14 : null), ), Text( - snapshot.user?.type?.name.toCamelCase ?? "", // Simplified null check - style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20, fontSize: context.isTablet() ? 12 : null), + snapshot.user?.type?.name.toCamelCase ?? "", + style: AppTextStyles.bodyText.copyWith(color: AppColor.black92, fontSize: context.isTablet() ? 12 : null), ), ], ).expanded, const Spacer(), Consumer(builder: (context, settingProvider, child) { + return MenuAnchor( + style: MenuStyle( + backgroundColor: WidgetStateProperty.all(AppColor.background(context)), + shape: WidgetStateProperty.all( + RoundedRectangleBorder( + borderRadius: const BorderRadius.all(Radius.circular(20.0)), + side: BorderSide(color: AppColor.borderColor(context), width: 1), + ), + ), + padding: WidgetStateProperty.all( + EdgeInsets.symmetric( + horizontal: 0.toScreenWidth, + vertical: 8.toScreenHeight, + ), + ), + elevation: WidgetStateProperty.all(0), + ), + menuChildren: Provider.of(context, listen: false).user?.assetGroups?.map((value) { + return MenuItemButton( + onPressed: () async { + if (settingProvider.assetGroup != value) { + AssetGroup? tempGroup = ApiManager.instance.assetGroup; + ApiManager.instance.assetGroup = value; + + Utils.showLoading(context); + bool isSuccess = await context.userProvider.userChangeAssetGroup(); + Utils.hideLoading(context); + if (isSuccess) { + await context.userProvider.getMobilePermissionByUser(); + settingProvider.setAssetGroup(value); + WidgetsBinding.instance.addPostFrameCallback((_) { + context.settingProvider.setUser(ApiManager.instance.user!); + context.userProvider.setUser(ApiManager.instance.user!); + DashBoardProvider dashBoardProvider = Provider.of(context, listen: false); + dashBoardProvider.setTabs(userType: settingProvider.user!.type!, context: context); + dashBoardProvider.getDashBoardCount(usersType: settingProvider.user!.type!); + dashBoardProvider.resetRequestDataList(); + dashBoardProvider.getRequestDetail(usersType: settingProvider.user!.type!, status: dashBoardProvider.tabs[dashBoardProvider.currentListIndex].tag); + }); + } else { + ApiManager.instance.assetGroup = tempGroup; + context.showConfirmDialog("Failed, Please Try again"); + } + } + }, + child: Text(value.name ?? "", style: AppTextStyles.bodyText2.copyWith(color: AppColor.headingTextColor(context))), + ); + }).toList() ?? + [], + builder: (_, MenuController controller, Widget? child) { + return Container( + padding: const EdgeInsets.all(10), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + color: AppColor.assetGroupBackground(context), + border: Border.all(color: AppColor.white936.withValues(alpha: .03), width: 1), + boxShadow: [ + BoxShadow(color: Colors.black.withValues(alpha: 0.03), blurRadius: 4, offset: const Offset(0, 0), spreadRadius: 0), + ], + ), + child: Row( + mainAxisSize: MainAxisSize.min, + spacing: 16, + children: [ + Text(settingProvider.assetGroup?.name ?? "", style: AppTextStyles.bodyText2.copyWith(color: AppColor.headingTextColor(context))), + Icon(Icons.keyboard_arrow_down, color: AppColor.headingTextColor(context)), + ], + ), + ).onPress(() { + if (controller.isOpen) { + controller.close(); + } else { + controller.open(); + } + }); + }, + ); + + return Container( + padding: const EdgeInsets.all(10), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + color: AppColor.assetGroupBackground(context), + border: Border.all(color: AppColor.white936.withValues(alpha: .03), width: 1), + boxShadow: [ + BoxShadow(color: Colors.black.withValues(alpha: 0.03), blurRadius: 4, offset: const Offset(0, 0), spreadRadius: 0), + ], + ), + child: Row( + mainAxisSize: MainAxisSize.min, + spacing: 16, + children: [ + Text(settingProvider.assetGroup?.name ?? "", style: AppTextStyles.bodyText2.copyWith(color: AppColor.headingTextColor(context))), + Icon(Icons.keyboard_arrow_down, color: AppColor.headingTextColor(context)), + ], + ), + ); + return Container( padding: const EdgeInsets.fromLTRB(12, 6, 6, 6), decoration: BoxDecoration( @@ -82,11 +183,11 @@ class AppBarWidget extends StatelessWidget { value: settingProvider.assetGroup, //iconSize: 24, isDense: true, - icon: const Icon(Icons.keyboard_arrow_down), + icon: Icon(Icons.keyboard_arrow_down, color: AppColor.headingTextColor(context)), elevation: 8, // dropdownColor: Colors.amber, borderRadius: BorderRadius.circular(8), - style: TextStyle(color: Theme.of(context).primaryColor), + style: AppTextStyles.tinyFont.copyWith(color: AppColor.headingTextColor(context)), underline: const SizedBox.shrink(), onChanged: (newValue) async { if (settingProvider.assetGroup != newValue) { @@ -130,19 +231,12 @@ class AppBarWidget extends StatelessWidget { }), 16.width, if (context.settingProvider.isUserFlowMedical) ...[ - Icon(Icons.mark_unread_chat_alt_outlined, color: context.isDark ? AppColor.neutral30 : AppColor.neutral20, size: 30).paddingOnly(top: 6, end: 0).onPress(() { + ("dashboard/chat").toSvgAsset(height: 24, width: 24, color: AppColor.icon2Color(context)).paddingOnly(top: 0, end: 0).onPress(() { Navigator.of(context).push(CupertinoPageRoute(builder: (_) => UnReadChatList())); }), - 8.width, + 16.width, ], - Stack( - alignment: Alignment.topRight, - children: [ - Icon(Icons.notifications, color: context.isDark ? AppColor.neutral30 : AppColor.neutral20, size: 30).paddingOnly(top: 6, end: 0), - // todo @sikander will add count for unread notifications - // ... (rest of the code remains the same) - ], - ).onPress(() { + ("dashboard/notification").toSvgAsset(height: 24, width: 24, color: AppColor.icon2Color(context)).paddingOnly(top: 0, end: 0).onPress(() { Navigator.of(context).pushNamed(NotificationsPage.id); }), ], diff --git a/lib/dashboard_latest/widgets/progress_fragment.dart b/lib/dashboard_latest/widgets/progress_fragment.dart index e7340f8a..a7606f20 100644 --- a/lib/dashboard_latest/widgets/progress_fragment.dart +++ b/lib/dashboard_latest/widgets/progress_fragment.dart @@ -155,6 +155,8 @@ import 'package:pie_chart/pie_chart.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/dashboard_latest/dashboard_provider.dart'; import 'package:test_sa/extensions/context_extension.dart'; +import 'package:test_sa/extensions/int_extensions.dart'; +import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; @@ -178,73 +180,124 @@ class ProgressFragment extends StatelessWidget { if (isCurrentUserIsNurse) { total = (snapshot.dashboardCount?.data?.countComplete ?? 0) + (snapshot.dashboardCount?.data?.countInprogress ?? 0) + (snapshot.dashboardCount?.data?.countOpen ?? 0); chartData = [ - ChartData('Open', snapshot.dashboardCount?.data?.countOpen?.toDouble() ?? 0.0, AppColor.openColor), - ChartData('In Progress', snapshot.dashboardCount?.data?.countInprogress?.toDouble() ?? 0.0, AppColor.inProgressColor), - ChartData('Acknowledged', snapshot.dashboardCount?.data?.countComplete?.toDouble() ?? 0.0, AppColor.completeColor), + ChartData('Open', snapshot.dashboardCount?.data?.countOpen?.toDouble() ?? 0.0, AppColor.openColor, "dashboard/open_icon"), + ChartData('In Progress', snapshot.dashboardCount?.data?.countInprogress?.toDouble() ?? 0.0, AppColor.inProgressColor, "dashboard/inprogress_icon"), + ChartData('Acknowledged', snapshot.dashboardCount?.data?.countComplete?.toDouble() ?? 0.0, AppColor.completeColor, "dashboard/completed_icon"), ]; } else if (_userProvider.isQualityUser) { total = (snapshot.dashboardCount?.data?.countComplete ?? 0) + (snapshot.dashboardCount?.data?.countInprogress ?? 0) + (snapshot.dashboardCount?.data?.countOpen ?? 0); chartData = [ - ChartData('Open', snapshot.dashboardCount?.data?.countOpen?.toDouble() ?? 0.0, AppColor.openColor), - ChartData('In Progress', snapshot.dashboardCount?.data?.countInprogress?.toDouble() ?? 0.0, AppColor.inProgressColor), - ChartData('Closed', snapshot.dashboardCount?.data?.countComplete?.toDouble() ?? 0.0, AppColor.completeColor), + ChartData('Open', snapshot.dashboardCount?.data?.countOpen?.toDouble() ?? 0.0, AppColor.openColor, "dashboard/open_icon"), + ChartData('In Progress', snapshot.dashboardCount?.data?.countInprogress?.toDouble() ?? 0.0, AppColor.inProgressColor, "dashboard/inprogress_icon"), + ChartData('Closed', snapshot.dashboardCount?.data?.countComplete?.toDouble() ?? 0.0, AppColor.completeColor, "dashboard/completed_icon"), ]; } else { total = (snapshot.dashboardCount?.data?.countComplete ?? 0) + (snapshot.dashboardCount?.data?.countInprogress ?? 0) + (snapshot.dashboardCount?.data?.countOpen ?? 0); chartData = [ - ChartData('Open', snapshot.dashboardCount?.data?.countOpen?.toDouble() ?? 0.0, AppColor.openColor), - ChartData('In Progress', snapshot.dashboardCount?.data?.countInprogress?.toDouble() ?? 0.0, AppColor.inProgressColor), - ChartData('Completed', snapshot.dashboardCount?.data?.countComplete?.toDouble() ?? 0.0, AppColor.completeColor), + ChartData('Open', snapshot.dashboardCount?.data?.countOpen?.toDouble() ?? 0.0, AppColor.openColor, "dashboard/open_icon"), + ChartData('In Progress', snapshot.dashboardCount?.data?.countInprogress?.toDouble() ?? 0.0, AppColor.inProgressColor, "dashboard/inprogress_icon"), + ChartData('Completed', snapshot.dashboardCount?.data?.countComplete?.toDouble() ?? 0.0, AppColor.completeColor, "dashboard/completed_icon"), ]; } - // - // int total = - // (snapshot.dashboardCount?.data?.countComplete ?? 0) + (snapshot.inProgressRequests?.total?.count ?? 0) + (isCurrentUserNotEngineer ? (snapshot.openRequests?.total?.count ?? 0) : 0); - // - // final List chartData = [ - // ChartData('Completed', snapshot.completedRequests?.total?.count?.toDouble() ?? 0.0, AppColor.green70), - // // snapshot.openRequests?.total?.count!=0? ChartData('Open', snapshot.openRequests?.total?.count?.toDouble() ?? 0.0, AppColor.blueStatus(context)), - // ChartData('In Progress', snapshot.inProgressRequests?.total?.count?.toDouble() ?? 0.0, AppColor.orange70), - // ]; - // - // if (isCurrentUserIsNurse) { - // chartData.insert(1, ChartData('Open', snapshot.openRequests?.total?.count?.toDouble() ?? 0.0, AppColor.blueStatus(context))); - // } return Column( children: [ AspectRatio( - aspectRatio: 359 / 214, - child: Stack( - alignment: Alignment.center, + aspectRatio: (359.toScreenWidth / 214.toScreenWidth), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - PieChart( - dataMap: {for (var v in chartData) v.x: v.y}, - animationDuration: const Duration(milliseconds: 750), - chartLegendSpacing: 32, - chartRadius: MediaQuery.of(context).size.width / 3.2, - colorList: chartData.map((element) => element.color).toList(), - initialAngleInDegree: 270, - chartType: ChartType.ring, - ringStrokeWidth: 40, - legendOptions: const LegendOptions( - showLegendsInRow: true, - legendPosition: LegendPosition.top, - showLegends: true, - legendTextStyle: TextStyle( - fontWeight: FontWeight.w500, + Text( + "Work Order Status".addTranslation, + style: AppTextStyles.heading4.copyWith(color: AppColor.headingTextColor(context)), + ), + Wrap( + spacing: 8, + runSpacing: 8, + children: [ + for (int i = 0; i < chartData.length; i++) + Row( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + height: 6, + width: 6, + decoration: BoxDecoration(color: chartData[i].color, borderRadius: BorderRadius.circular(1)), + ), + 4.width, + Text(chartData[i].x, style: AppTextStyles.textStyle9.copyWith(color: AppColor.text9Color(context))), + ], + ) + ], + ), + 8.height, + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + spacing: 60.toScreenWidth, + children: [ + SizedBox( + height: 124.toScreenWidth, + width: 124.toScreenWidth, + child: PieChart( + dataMap: {for (var v in chartData) v.x: v.y}, + animationDuration: const Duration(milliseconds: 750), + chartLegendSpacing: 0, + chartRadius: 124, + colorList: chartData.map((element) => element.color).toList(), + initialAngleInDegree: 270, + chartType: ChartType.ring, + ringStrokeWidth: 32, + legendOptions: LegendOptions( + showLegendsInRow: true, + legendPosition: LegendPosition.top, + showLegends: false, + legendTextStyle: AppTextStyles.textStyle9, + ), + chartValuesOptions: ChartValuesOptions( + showChartValueBackground: true, + chartValueBackgroundColor: const Color(0xff226187).withValues(alpha: .75), + chartValueStyle: AppTextStyles.textStyle9.copyWith(height: 1.5, color: Colors.white), + showChartValues: true, + showChartValuesInPercentage: true, + showChartValuesOutside: true, + decimalPlaces: 0, + ), + ).toShimmer(isShow: snapshot.isAllCountLoading, radius: 250, context: context).paddingAll(0), ), - ), - chartValuesOptions: const ChartValuesOptions( - showChartValueBackground: false, - showChartValues: false, - showChartValuesInPercentage: false, - showChartValuesOutside: false, - decimalPlaces: 1, - ), - ).toShimmer(isShow: snapshot.isAllCountLoading, radius: 250, context: context).paddingAll(0).toShadowContainer(context, borderRadius: 20), + Column( + mainAxisAlignment: MainAxisAlignment.end, + spacing: 8, + children: [ + for (int i = 0; i < chartData.length; i++) + Row( + spacing: 16, + children: [ + chartData[i].icon.toSvgAsset(height: 26, width: 26, color: chartData[i].color).toShimmer(isShow: snapshot.isAllCountLoading, context: context), + Column( + spacing: 4, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(chartData[i].x, style: AppTextStyles.textStyle9.copyWith(color: AppColor.text9Color(context))).toShimmer(isShow: snapshot.isAllCountLoading, context: context), + RichText( + text: TextSpan( + text: "${chartData[i].y.toInt()}", + style: AppTextStyles.bodyText.copyWith(color: AppColor.headingTextColor(context)), + children: [ + TextSpan(text: " | ", style: AppTextStyles.bodyText.copyWith(color: AppColor.headingTextColor(context))), + TextSpan(text: "${chartData[i].y}", style: AppTextStyles.bodyText.copyWith(color: AppColor.headingTextColor(context))), + ], + ), + ), + ], + ) + ], + ) + ], + ) + ], + ).expanded, ], - ), + ).toShadowContainer(context, borderRadius: 20, paddingObject: const EdgeInsets.symmetric(horizontal: 24, vertical: 16)), ), ], ).paddingOnly(start: 16, end: 16); @@ -254,9 +307,10 @@ class ProgressFragment extends StatelessWidget { } class ChartData { - ChartData(this.x, this.y, this.color); + ChartData(this.x, this.y, this.color, this.icon); final String x; final double y; final Color color; + final String icon; } diff --git a/lib/dashboard_latest/widgets/requests_fragment.dart b/lib/dashboard_latest/widgets/requests_fragment.dart index e517b472..fafe5477 100644 --- a/lib/dashboard_latest/widgets/requests_fragment.dart +++ b/lib/dashboard_latest/widgets/requests_fragment.dart @@ -28,11 +28,7 @@ class _DashboardCountData { @override bool operator ==(Object other) => - identical(this, other) || - other is _DashboardCountData && - runtimeType == other.runtimeType && - dashboardCount == other.dashboardCount && - isLoading == other.isLoading; + identical(this, other) || other is _DashboardCountData && runtimeType == other.runtimeType && dashboardCount == other.dashboardCount && isLoading == other.isLoading; @override int get hashCode => Object.hash(dashboardCount, isLoading); @@ -52,10 +48,10 @@ class RequestsFragment extends StatelessWidget { isLoading: provider.isAllCountLoading, ), builder: (context, data, _) => GridView( - padding: const EdgeInsets.only(left: 16, right: 16), + padding: const EdgeInsets.only(left: 16, right: 16, bottom: 16), physics: const NeverScrollableScrollPhysics(), shrinkWrap: true, - gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 4, childAspectRatio: 72 / 84, crossAxisSpacing: 2, mainAxisSpacing: 12), + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 4, childAspectRatio: 85 / 85, crossAxisSpacing: 8, mainAxisSpacing: 8), children: [ listItem( data.dashboardCount?.data?.countHighPriority ?? 0, @@ -76,35 +72,31 @@ class RequestsFragment extends StatelessWidget { } Widget listItem(int value, String icon, String title, BuildContext context, bool isLoading, int index, Color iconColor) { - return GestureDetector( - onTap: isLoading - ? null - : () async { - await Navigator.push(context, MaterialPageRoute(builder: (context) => RequestsListPage(index, title))); - Provider.of(context, listen: false).refreshDashboard(userType: Provider.of(context, listen: false).user!.type!, context: context); - }, + return CustomBadge( + value: isLoading ? 0 : value, + positionR: -4, + positionT: -4, child: Column( crossAxisAlignment: CrossAxisAlignment.center, - mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.end, + spacing: 16, children: [ - 8.height, - CustomBadge( - value: isLoading ? 0 : value, - child: Container( - child: (icon ?? "").toSvgAsset(height: 26, width: 26, color: iconColor).toShimmer(isShow: isLoading,context: context), - ).toShadowCircleContainer(context, padding: 17), - ), - 10.height, + (icon ?? "").toSvgAsset(height: 26, width: 26, color: iconColor).toShimmer(isShow: isLoading, context: context), Text( title, textAlign: TextAlign.center, - style: AppTextStyles.tinyFont.copyWith( - color: context.isDark ? AppColor.neutral30 : AppColor.black20, - ), - ).toShimmer(isShow: isLoading,context: context), + style: AppTextStyles.tinyFont2.copyWith(color: AppColor.headingTextColor(context)), + ).toShimmer(isShow: isLoading, context: context), ], - ), - ); + ).toShadowContainer(context, borderRadius: 16, paddingObject: const EdgeInsets.symmetric(horizontal: 12, vertical: 16)), + ) + .onPress(isLoading + ? null + : () async { + await Navigator.push(context, MaterialPageRoute(builder: (context) => RequestsListPage(index, title))); + Provider.of(context, listen: false).refreshDashboard(userType: Provider.of(context, listen: false).user!.type!, context: context); + }) + .paddingOnly(end: 4, top: 4); } } diff --git a/lib/extensions/text_extensions.dart b/lib/extensions/text_extensions.dart index 5ec00e5b..da73be78 100644 --- a/lib/extensions/text_extensions.dart +++ b/lib/extensions/text_extensions.dart @@ -79,6 +79,7 @@ abstract class AppTextStyles { fontSize: 21.toScreenWidth, fontWeight: FontWeight.w500, fontStyle: FontStyle.normal, + letterSpacing: -0.04, decoration: TextDecoration.none, ); @@ -155,6 +156,14 @@ abstract class AppTextStyles { fontStyle: FontStyle.normal, decoration: TextDecoration.none, ); + + static final TextStyle textStyle9 = TextStyle( + fontSize: 9.toScreenWidth, + fontWeight: FontWeight.w500, + letterSpacing: 0, + fontStyle: FontStyle.normal, + decoration: TextDecoration.none, + ); } extension CapExtension on String { diff --git a/lib/extensions/widget_extensions.dart b/lib/extensions/widget_extensions.dart index 252971f7..8261cf34 100644 --- a/lib/extensions/widget_extensions.dart +++ b/lib/extensions/widget_extensions.dart @@ -128,7 +128,7 @@ extension WidgetExtensions on Widget { width: double.infinity, decoration: ShapeDecoration( color: backgroundColor ?? AppColor.background(context), - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(borderRadius), side: BorderSide(color: borderColor)), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(borderRadius), side: BorderSide(color: AppColor.borderColor(context))), shadows: showShadow ? [boxShadowR14] : null, ), child: this, diff --git a/lib/modules/tm_module/tasks/create_task_view.dart b/lib/modules/tm_module/tasks/create_task_view.dart index c4c14366..8644ec0e 100644 --- a/lib/modules/tm_module/tasks/create_task_view.dart +++ b/lib/modules/tm_module/tasks/create_task_view.dart @@ -78,7 +78,7 @@ class _CreateTaskViewState extends State with TickerProviderStat height: 56.toScreenHeight, title: context.translation.taskType, showShadow: false, - backgroundColor: AppColor.fieldBgColor(context), + // backgroundColor: AppColor.fieldBgColor(context), showAsBottomSheet: true, initialValue: selectedType, onSelect: (type) { @@ -102,9 +102,9 @@ class _CreateTaskViewState extends State with TickerProviderStat initialValue: _addTaskModel?.callComment, controller: commentController, labelText: context.translation.callComments, - backgroundColor: AppColor.fieldBgColor(context), labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)), showShadow: false, + showBorder: true, alignLabelWithHint: true, textInputType: TextInputType.multiline, onChange: (value) { diff --git a/lib/new_views/app_style/app_color.dart b/lib/new_views/app_style/app_color.dart index 5cba9266..67b993be 100644 --- a/lib/new_views/app_style/app_color.dart +++ b/lib/new_views/app_style/app_color.dart @@ -37,8 +37,12 @@ class AppColor { static const Color neutral170 = Color(0xff6E6E6E); //background - static const Color backgroundLight = Color(0xfff7f9fb); - static const Color backgroundDark = Color(0xff111427); + static const Color backgroundLight = Color(0xfff5f6fc); + static const Color backgroundDark = Color(0xff080a14); + static const Color backgroundTabBarDark = Color(0xff111427); + static const Color containerDark = Color(0xff161A2D); + static const Color containerBorderDark = Color(0xff3B3F56); + static const Color containerBorderLight = Color(0xffEFEFEF); //white static const Color white10 = Color(0xffFFFFFF); @@ -57,6 +61,7 @@ class AppColor { static const Color black20 = Color(0xff212936); static const Color black35 = Color(0xff222A36); static const Color black1E = Color(0xff1E1F20); + static const Color black92 = Color(0xff929292); //red static const Color red20 = Color(0xfff2c5ca); @@ -84,7 +89,6 @@ class AppColor { static const Color orange70 = Color(0xffFFC945); static const Color orange80 = Color(0xff65531B); - // new UI colors static const Color openColor = Color(0xff226187); @@ -104,16 +108,30 @@ class AppColor { static Color yellowIcon(BuildContext context) => context.isDark ? const Color(0xffFFC945) : orange70; - static Color background(BuildContext context) => context.isDark ? neutral60 : Colors.white; + static Color background(BuildContext context) => context.isDark ? containerDark : Colors.white; + static Color scaffoldBackground(BuildContext context) => context.isDark ? backgroundDark : backgroundLight; + static Color assetGroupBackground(BuildContext context) => context.isDark ? containerDark : Colors.white30; + + static Color backgroundTabBarColor(BuildContext context) => context.isDark ? backgroundTabBarDark : Colors.white; + + static Color loadingColor(BuildContext context) => context.isDarkNotListen ? Colors.white : primary10; + + static Color bottomSheetColor(BuildContext context) => context.isDarkNotListen ? containerDark : Colors.white; + + static Color borderColor(BuildContext context) => context.isDark ? containerBorderDark : containerBorderLight; static Color textColor(BuildContext context) => context.isDark ? neutral30 : neutral50; - static Color headingTextColor(BuildContext context) => context.isDark ? neutral30 : black10; + static Color headingTextColor(BuildContext context) => context.isDark ? white10 : white936; + + static Color text9Color(BuildContext context) => context.isDark ? white10 : neutral120; - static Color lightTextColor(BuildContext context) => neutral120; + static Color lightTextColor(BuildContext context) => context.isDark ? white10 : neutral120; static Color iconColor(BuildContext context) => context.isDark ? neutral30 : neutral50; + static Color icon2Color(BuildContext context) => context.isDark ? white10 : neutral50; + static Color fieldBgColor(BuildContext context) => context.isDark ? neutral20 : neutral100; static Color selectedButtonColor(BuildContext context) => context.isDark ? neutral60 : neutral30; diff --git a/lib/new_views/app_style/app_themes.dart b/lib/new_views/app_style/app_themes.dart index 9e82c8a3..4b1834ee 100644 --- a/lib/new_views/app_style/app_themes.dart +++ b/lib/new_views/app_style/app_themes.dart @@ -51,9 +51,9 @@ class AppThemes { selectedLabelStyle: ThemeData.dark().textTheme.bodySmall?.copyWith(fontWeight: FontWeight.w500), selectedItemColor: AppColor.primary40, unselectedItemColor: AppColor.neutral10, - backgroundColor: AppColor.neutral60, + backgroundColor: AppColor.backgroundTabBarDark, ), - appBarTheme: AppBarTheme(elevation: 0, backgroundColor: AppColor.neutral60, iconTheme: ThemeData.dark().iconTheme.copyWith(color: AppColor.primary40)), + appBarTheme: AppBarTheme(elevation: 0, backgroundColor: AppColor.backgroundTabBarDark, iconTheme: ThemeData.dark().iconTheme.copyWith(color: AppColor.white10)), cardTheme: ThemeData.dark().cardTheme.copyWith( elevation: 3, color: AppColor.neutral60, diff --git a/lib/new_views/common_widgets/app_bottom_nav_bar.dart b/lib/new_views/common_widgets/app_bottom_nav_bar.dart index 4195d6e4..d2274958 100644 --- a/lib/new_views/common_widgets/app_bottom_nav_bar.dart +++ b/lib/new_views/common_widgets/app_bottom_nav_bar.dart @@ -34,8 +34,7 @@ class AppBottomNavigationBar extends StatelessWidget { boxShadow: [boxShadowR14], ), child: BottomNavigationBar( - // backgroundColor: Colors.white, - backgroundColor: AppColor.background(context), + backgroundColor: AppColor.backgroundTabBarColor(context), items: [ for (int i = 0; i < navItems.length; i++) navBarItem(context, index: navItems[i].index, iconName: navItems[i].iconName, label: navItems[i].label, showLabel: navItems[i].showLabel), ], @@ -45,8 +44,8 @@ class AppBottomNavigationBar extends StatelessWidget { }, selectedLabelStyle: AppTextStyles.tinyFont2, unselectedLabelStyle: AppTextStyles.tinyFont2, - selectedItemColor: Theme.of(context).bottomNavigationBarTheme.selectedItemColor, - unselectedItemColor: Theme.of(context).bottomNavigationBarTheme.unselectedItemColor, + selectedItemColor: AppColor.primary90, + unselectedItemColor: AppColor.text9Color(context), ), ); } @@ -59,8 +58,8 @@ class AppBottomNavigationBar extends StatelessWidget { height: showLabel ? 26 : 38, color: showLabel || (showLabel && selectedIndex != 2) ? selectedIndex == index - ? Theme.of(context).bottomNavigationBarTheme.selectedItemColor - : Theme.of(context).bottomNavigationBarTheme.unselectedItemColor + ? AppColor.primary90 + : AppColor.text9Color(context) : null, ) .paddingOnly(top: showLabel ? 0 : 12, bottom: showLabel ? 6 : 0), diff --git a/lib/new_views/common_widgets/app_text_form_field.dart b/lib/new_views/common_widgets/app_text_form_field.dart index 7600bc72..8b301d11 100644 --- a/lib/new_views/common_widgets/app_text_form_field.dart +++ b/lib/new_views/common_widgets/app_text_form_field.dart @@ -147,7 +147,7 @@ class _AppTextFormFieldState extends State { _settingProvider ??= Provider.of(context, listen: false); final border = UnderlineInputBorder( borderSide: BorderSide.none, - borderRadius: BorderRadius.circular(10), + borderRadius: BorderRadius.circular(16), ); Widget speechToTextWidget = PopupMenuButton( @@ -212,7 +212,7 @@ class _AppTextFormFieldState extends State { ? AppColor.neutral50 : !widget.enable ? (widget.enableColor ?? AppColor.neutral40) - : AppColor.background(context)), + : AppColor.scaffoldBackground(context)), errorStyle: AppTextStyle.tiny.copyWith(color: context.isDark ? AppColor.red50 : AppColor.red30), floatingLabelStyle: widget.floatingLabelStyle ?? AppTextStyle.body1.copyWith(fontWeight: FontWeight.w500, color: context.isDark ? AppColor.white10 : AppColor.neutral20), hintText: widget.hintText ?? "", @@ -252,8 +252,8 @@ class _AppTextFormFieldState extends State { if (widget.showWithoutDecoration) return textField; return Container( decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10), - border: widget.showBorder ? Border.all(color: AppColor.white10, width: 1) : null, + borderRadius: BorderRadius.circular(16), + border: widget.showBorder ? Border.all(color: AppColor.borderColor(context), width: 1) : null, boxShadow: widget.showShadow ? [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)] : null, ), child: textField); diff --git a/lib/new_views/common_widgets/custom_badge.dart b/lib/new_views/common_widgets/custom_badge.dart index a048877f..20f14dd3 100644 --- a/lib/new_views/common_widgets/custom_badge.dart +++ b/lib/new_views/common_widgets/custom_badge.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:test_sa/animations/number_incremental_animation.dart'; +import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; class CustomBadge extends StatelessWidget { @@ -43,7 +44,7 @@ class CustomBadge extends StatelessWidget { decoration: BoxDecoration(color: color, borderRadius: BorderRadius.circular(30)), child: CounterAnimatedText( value: value, - style: const TextStyle(color: AppColor.white10, fontFamily: 'Poppins', fontSize: 10, fontWeight: FontWeight.w700), + style: AppTextStyles.tinyFont2.copyWith(color: AppColor.white10, fontWeight: FontWeight.w700), ), ), ), diff --git a/lib/new_views/common_widgets/single_item_drop_down_menu.dart b/lib/new_views/common_widgets/single_item_drop_down_menu.dart index a6c5214f..94383f67 100644 --- a/lib/new_views/common_widgets/single_item_drop_down_menu.dart +++ b/lib/new_views/common_widgets/single_item_drop_down_menu.dart @@ -232,8 +232,13 @@ class _SingleItemDropDownMenuState { bool showAppbar = true; late List _pages; UserProvider? _userProvider; - bool isFCM = true; + bool isFCM = true; + @override void initState() { _pages = []; @@ -65,7 +66,7 @@ class _LandPageState extends State { child: Container( clipBehavior: Clip.antiAlias, decoration: BoxDecoration( - color: Theme.of(context).scaffoldBackgroundColor, + color: AppColor.bottomSheetColor(context), borderRadius: const BorderRadius.only(topRight: Radius.circular(20), topLeft: Radius.circular(20)), ), padding: EdgeInsets.symmetric(horizontal: 24.toScreenWidth, vertical: 24.toScreenHeight), @@ -86,9 +87,11 @@ class _LandPageState extends State { (Platform.isAndroid ? "fingerprint" : "faceid").toLottieAsset(height: 180), 16.height, Align( - alignment: AlignmentDirectional.centerStart, - child: "Let's set up Face ID/Fingerprint for quick and secure logins in the future".bodyText(context).custom(fontWeight: FontWeight.w500), - ), + alignment: AlignmentDirectional.centerStart, + child: Text( + "Let's set up Face ID/Fingerprint for quick and secure logins in the future".addTranslation, + style: AppTextStyles.bodyText, + )), 24.height, AppFilledButton( onPressed: () { diff --git a/lib/new_views/pages/splash_page.dart b/lib/new_views/pages/splash_page.dart index 392ccb74..2b619ac4 100644 --- a/lib/new_views/pages/splash_page.dart +++ b/lib/new_views/pages/splash_page.dart @@ -189,12 +189,12 @@ class _SplashPageState extends State { alignment: Alignment.center, children: [ if (loading) - const Positioned( + Positioned( bottom: 100, child: SizedBox( width: 36, height: 36, - child: CircularProgressIndicator(color: AppColor.primary10, strokeWidth: 3), + child: CircularProgressIndicator(color: AppColor.loadingColor(context), strokeWidth: 3), )), SizedBox( width: MediaQuery.of(context).size.width / 1.1, diff --git a/lib/views/widgets/fullscreen_dialogs/selection_fullscreen_dialog.dart b/lib/views/widgets/fullscreen_dialogs/selection_fullscreen_dialog.dart index 8e3b9262..d6f15741 100644 --- a/lib/views/widgets/fullscreen_dialogs/selection_fullscreen_dialog.dart +++ b/lib/views/widgets/fullscreen_dialogs/selection_fullscreen_dialog.dart @@ -87,7 +87,7 @@ class _SelectionBottomSheetState extends State(0), - backgroundColor: WidgetStateProperty.all(context.isDark ? AppColor.neutral120 : null), + backgroundColor: WidgetStateProperty.all(AppColor.background(context)), leading: Icon(Icons.search, color: AppColor.iconColor(context)), textStyle: WidgetStateProperty.all( TextStyle(color: AppColor.textColor(context), fontSize: 16.0), diff --git a/pubspec.yaml b/pubspec.yaml index 44bc1e86..8fde8f23 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -138,6 +138,7 @@ flutter: - assets/ - assets/audio/ - assets/images/ + - assets/images/dashboard/ - assets/lottie/ - assets/subtitles/ - assets/rives/