diff --git a/assets/images/dashboard/unassigned.svg b/assets/images/dashboard/unassigned.svg new file mode 100644 index 00000000..ad976259 --- /dev/null +++ b/assets/images/dashboard/unassigned.svg @@ -0,0 +1,3 @@ + + + diff --git a/lib/dashboard_latest/dashboard_provider.dart b/lib/dashboard_latest/dashboard_provider.dart index ce78b46f..99e06009 100644 --- a/lib/dashboard_latest/dashboard_provider.dart +++ b/lib/dashboard_latest/dashboard_provider.dart @@ -5,10 +5,13 @@ import 'package:flutter/widgets.dart'; import 'package:http/http.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/extensions/context_extension.dart'; +import 'package:test_sa/extensions/enum_extensions.dart'; import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/new_models/dashboard_count.dart'; import 'package:test_sa/models/new_models/dashboard_detail.dart' as DD; import 'package:test_sa/models/new_models/swipe_model.dart'; +import 'package:test_sa/new_views/app_style/app_color.dart'; import '../controllers/providers/api/user_provider.dart'; @@ -59,6 +62,31 @@ class DashBoardProvider extends ChangeNotifier { DD.DashboardDetail? get requestDetailList => _requestDetailList; + int getStatusCount(RequestTypeEnum requestType) { + switch (requestType) { + case RequestTypeEnum.unassigned: + return dashboardCount?.data?.countUnAssigned ?? 0; + case RequestTypeEnum.open: + return dashboardCount?.data?.countOpen ?? 0; + case RequestTypeEnum.inProgress: + return dashboardCount?.data?.countInprogress ?? 0; + case RequestTypeEnum.completed: + return dashboardCount?.data?.countComplete ?? 0; + case RequestTypeEnum.pendingAcknowledgment: + return dashboardCount?.data?.countAcknowledge ?? 0; + case RequestTypeEnum.canceled: + return dashboardCount?.data?.countCanceled ?? 0; + case RequestTypeEnum.closed: + return dashboardCount?.data?.countClose ?? 0; + case RequestTypeEnum.overdue: + return dashboardCount?.data?.countOverdue ?? 0; + case RequestTypeEnum.highPriority: + return dashboardCount?.data?.countHighPriority ?? 0; + default: + return 0; + } + } + List tabs = []; void setTabs({required UsersTypes userType, required BuildContext context}) { @@ -244,11 +272,7 @@ class DashBoardProvider extends ChangeNotifier { } } - String getDashboardUrl({ - required UsersTypes usersType, - int? status, - int? tabId, - }) { + String getDashboardUrl({required UsersTypes usersType, int? status, int? tabId}) { switch (usersType) { case UsersTypes.qualityUser: return URLs.qaAuditorDetails; @@ -270,7 +294,8 @@ class DashBoardProvider extends ChangeNotifier { } } - Future getRequestDetail({bool showLoader = true, required UsersTypes usersType, int? status, bool isHighPriority = false, bool isOverdue = false, String? date, int? tabId, bool? isAscending}) async { + Future getRequestDetail( + {bool showLoader = true, required UsersTypes usersType, int? status, bool isHighPriority = false, bool isOverdue = false, String? date, int? tabId, bool? isAscending}) async { if (showLoader) { isDetailLoading = showLoader; notifyListeners(); @@ -396,42 +421,45 @@ class CategoryTabs { String label; int tag; int id; + RequestTypeEnum requestType; + String icon; + Color iconColor; + bool isHighPriority; + bool isOverDue; - CategoryTabs({ - required this.label, - required this.tag, - required this.id, - }); + CategoryTabs({this.isHighPriority = false, this.isOverDue = false, required this.label, required this.tag, required this.id, required this.requestType, required this.icon, required this.iconColor}); static List getTabs({required UsersTypes userType, required BuildContext context}) { List tabs = []; if (userType == UsersTypes.engineer) { - // tabs.add(CategoryTabs(label: 'Upcoming', tag: 0, id: 0)); - // tabs.add(CategoryTabs('Open', 1)); - tabs.add(CategoryTabs(label: 'UnAssigned', tag: 1, id: 1)); - tabs.add(CategoryTabs(label: 'Open', tag: 1, id: 2)); - tabs.add(CategoryTabs(label: 'In Progress', tag: 2, id: 3)); - tabs.add(CategoryTabs(label: 'Completed', tag: 3, id: 4)); + tabs.add(CategoryTabs(label: 'UnAssigned', tag: 1, id: 1, requestType: RequestTypeEnum.unassigned, icon: "dashboard/unassigned", iconColor: AppColor.unassignedStatus(context))); + tabs.add(CategoryTabs(label: 'Open', tag: 1, id: 2, requestType: RequestTypeEnum.open, icon: "dashboard/open_icon", iconColor: AppColor.openColor)); + tabs.add(CategoryTabs(label: 'In Progress', tag: 2, id: 3, requestType: RequestTypeEnum.inProgress, icon: "dashboard/inprogress_icon", iconColor: AppColor.primary10)); + tabs.add(CategoryTabs(label: 'Completed', tag: 3, id: 4, requestType: RequestTypeEnum.completed, icon: "complete_request", iconColor: AppColor.completedColor)); + tabs.add(CategoryTabs(label: context.translation.overdue, tag: 3, id: 4, requestType: RequestTypeEnum.overdue, icon: "overdue", iconColor: AppColor.yellowIcon(context), isOverDue: true)); + tabs.add(CategoryTabs(label: context.translation.highPriority, tag: 3, id: 4, requestType: RequestTypeEnum.highPriority, icon: "high_priority", iconColor: AppColor.red30, isHighPriority: true)); + return tabs; } if (userType == UsersTypes.qualityUser) { - tabs.add(CategoryTabs(label: 'Open', tag: 1, id: 2)); - tabs.add(CategoryTabs(label: 'In Progress', tag: 2, id: 3)); - tabs.add(CategoryTabs(label: 'Closed', tag: 3, id: 4)); + tabs.add(CategoryTabs(label: 'Open', tag: 1, id: 2, requestType: RequestTypeEnum.open, icon: "dashboard/open_icon", iconColor: AppColor.openColor)); + tabs.add(CategoryTabs(label: 'In Progress', tag: 2, id: 3, requestType: RequestTypeEnum.inProgress, icon: "dashboard/inprogress_icon", iconColor: AppColor.primary10)); + tabs.add(CategoryTabs(label: 'Closed', tag: 3, id: 4, requestType: RequestTypeEnum.closed, icon: "complete_request", iconColor: AppColor.completedColor)); return tabs; } if (userType == UsersTypes.commissioningEngineer) { - tabs.add(CategoryTabs(label: 'Open', tag: 1, id: 2)); - tabs.add(CategoryTabs(label: 'In Progress', tag: 2, id: 3)); - tabs.add(CategoryTabs(label: 'Closed', tag: 3, id: 4)); + tabs.add(CategoryTabs(label: 'Open', tag: 1, id: 2, requestType: RequestTypeEnum.open, icon: "dashboard/open_icon", iconColor: AppColor.openColor)); + tabs.add(CategoryTabs(label: 'In Progress', tag: 2, id: 3, requestType: RequestTypeEnum.inProgress, icon: "dashboard/inprogress_icon", iconColor: AppColor.primary10)); + tabs.add(CategoryTabs(label: 'Closed', tag: 3, id: 4, requestType: RequestTypeEnum.closed, icon: "complete_request", iconColor: AppColor.completedColor)); return tabs; } - tabs.add(CategoryTabs(label: 'Open', tag: 1, id: 2)); - tabs.add(CategoryTabs(label: 'In Progress', tag: 2, id: 3)); - tabs.add(CategoryTabs(label: 'Pending Acknowledgement', tag: 3, id: 1)); - tabs.add(CategoryTabs(label: 'Canceled', tag: 6, id: 4)); + tabs.add(CategoryTabs(label: 'Open', tag: 1, id: 2, requestType: RequestTypeEnum.open, icon: "dashboard/open_icon", iconColor: AppColor.openColor)); + tabs.add(CategoryTabs(label: 'In Progress', tag: 2, id: 3, requestType: RequestTypeEnum.inProgress, icon: "dashboard/inprogress_icon", iconColor: AppColor.primary10)); + // tabs.add(CategoryTabs(label: 'Pending Acknowledgement', tag: 3, id: 1, requestType: RequestTypeEnum.pendingAcknowledgment, icon: "complete_request", iconColor: AppColor.overdueColor)); + tabs.add(CategoryTabs(label: 'Acknowledgement', tag: 3, id: 1, requestType: RequestTypeEnum.pendingAcknowledgment, icon: "complete_request", iconColor: AppColor.overdueColor)); + tabs.add(CategoryTabs(label: 'Canceled', tag: 6, id: 4, requestType: RequestTypeEnum.canceled, icon: "dashboard/unassigned", iconColor: AppColor.red30)); return tabs; } } diff --git a/lib/dashboard_latest/dashboard_view.dart b/lib/dashboard_latest/dashboard_view.dart index 8e898fb4..f527ac06 100644 --- a/lib/dashboard_latest/dashboard_view.dart +++ b/lib/dashboard_latest/dashboard_view.dart @@ -57,8 +57,13 @@ class _DashboardViewState extends State { _dashBoardProvider.setTabs(userType: userProvider.user!.type!, context: context); _dashBoardProvider.getDashBoardCount(usersType: userProvider.user!.type!); _dashBoardProvider.resetRequestDataList(); + _dashBoardProvider.currentListIndex=0; _dashBoardProvider.getRequestDetail( - usersType: userProvider.user!.type!, status: _dashBoardProvider.tabs[_dashBoardProvider.currentListIndex].tag, tabId: _dashBoardProvider.tabs[_dashBoardProvider.currentListIndex].id); + usersType: userProvider.user!.type!, + status: _dashBoardProvider.tabs[_dashBoardProvider.currentListIndex].tag, + tabId: _dashBoardProvider.tabs[_dashBoardProvider.currentListIndex].id, + isHighPriority: _dashBoardProvider.tabs[_dashBoardProvider.currentListIndex].isHighPriority, + isOverdue: _dashBoardProvider.tabs[_dashBoardProvider.currentListIndex].isOverDue); } void getInitialData() { @@ -126,7 +131,9 @@ class _DashboardViewState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, - children: [16.height, ProgressFragment(), 16.height, if (isEngineer) const RequestsFragment(), const RequestCategoryFragment()], + children: [16.height, ProgressFragment(), 16.height, + // const RequestsFragment(), + const RequestCategoryFragment()], ), ), ), diff --git a/lib/dashboard_latest/widgets/request_category_fragment.dart b/lib/dashboard_latest/widgets/request_category_fragment.dart index 9207a172..5fb56375 100644 --- a/lib/dashboard_latest/widgets/request_category_fragment.dart +++ b/lib/dashboard_latest/widgets/request_category_fragment.dart @@ -56,7 +56,11 @@ class _RequestCategoryFragmentState extends State { final bool isFMSEngineer = user?.type == UsersTypes.engineer && settingProvider.isUserFMS; return Column(mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ - //TODO uncommit this to get the calendar card.. + getTabs( + requestsProvider: dashboardProvider, + context: context, + userType: Provider.of(context, listen: false).user?.type, + ), !isNurse && dashboardProvider.tabs.isNotEmpty && dashboardProvider.tabs[dashboardProvider.currentListIndex].tag == 0 ? Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -110,11 +114,6 @@ class _RequestCategoryFragmentState extends State { // ).paddingOnly(start: 16, end: 16) // : context.translation.allWorkOrder.heading4(context).paddingOnly(start: 16, end: 16), - getTabs( - requestsProvider: dashboardProvider, - context: context, - userType: Provider.of(context, listen: false).user?.type, - ), dashboardProvider.isDetailLoading ? Column( mainAxisSize: MainAxisSize.max, @@ -133,29 +132,62 @@ class _RequestCategoryFragmentState extends State { Widget getTabs({required BuildContext context, required DashBoardProvider requestsProvider, required UsersTypes? userType}) { List tabs = CategoryTabs.getTabs(userType: userType ?? UsersTypes.normal_user, context: context); - return SizedBox( - height: 44 + (context.isTablet() ? 36 : 16).toScreenHeight, - child: ListView.separated( - scrollDirection: Axis.horizontal, - separatorBuilder: (cxt, index) => 12.width, - padding: const EdgeInsets.only(top: 6 + 16, left: 16, right: 16), - itemBuilder: (cxt, index) { - return TabButton( - label: tabs[index].label, - loading: requestsProvider.isDetailLoading, - isSelected: requestsProvider.currentListIndex == index, - count: requestsProvider.requestDetailList != null ? requestsProvider.requestDetailList!.count ?? 0 : 0, - onPressed: () async { - setState(() { - isAscending=false; - }); - requestsProvider.currentListIndex = index; - requestsProvider.resetRequestDataList(); - requestsProvider.getRequestDetail(usersType: userType ?? UsersTypes.normal_user, showLoader: true, status: tabs[index].tag, tabId: tabs[index].id); - }, + // SizedBox( + // height: 44 + (context.isTablet() ? 36 : 16).toScreenHeight, + // child: ListView.separated( + // scrollDirection: Axis.horizontal, + // separatorBuilder: (cxt, index) => 12.width, + // padding: const EdgeInsets.only(top: 6 + 16, left: 16, right: 16), + // itemBuilder: (cxt, index) { + // return TabButton( + // label: tabs[index].label, + // loading: requestsProvider.isDetailLoading, + // isSelected: requestsProvider.currentListIndex == index, + // count: requestsProvider.requestDetailList != null ? requestsProvider.requestDetailList!.count ?? 0 : 0, + // onPressed: () async { + // setState(() { + // isAscending = false; + // }); + // requestsProvider.currentListIndex = index; + // requestsProvider.resetRequestDataList(); + // requestsProvider.getRequestDetail(usersType: userType ?? UsersTypes.normal_user, showLoader: true, status: tabs[index].tag, tabId: tabs[index].id); + // }, + // ); + // }, + // itemCount: tabs.length), + // ); + + return GridView.builder( + padding: const EdgeInsets.only(left: 16, right: 16, bottom: 16), + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: context.isTablet() ? 5 : 4, childAspectRatio: 85 / 85, crossAxisSpacing: 8, mainAxisSpacing: 8), + itemBuilder: (cxt, index) { + return RequestTypeButton( + label: tabs[index].label, + loading: requestsProvider.isDetailLoading && requestsProvider.currentListIndex == index, + isSelected: requestsProvider.currentListIndex == index, + count: requestsProvider.getStatusCount(tabs[index].requestType), + onPressed: () async { + setState(() { + isAscending = false; + }); + requestsProvider.currentListIndex = index; + requestsProvider.resetRequestDataList(); + requestsProvider.getRequestDetail( + usersType: userType ?? UsersTypes.normal_user, + showLoader: true, + status: tabs[index].tag, + tabId: tabs[index].id, + isHighPriority: tabs[index].isHighPriority, + isOverdue: tabs[index].isOverDue, ); }, - itemCount: tabs.length), + icon: tabs[index].icon, + iconColor: tabs[index].iconColor, + ); + }, + itemCount: tabs.length, ); } } diff --git a/lib/dashboard_latest/widgets/requests_fragment.dart b/lib/dashboard_latest/widgets/requests_fragment.dart index 6eb64f7e..e613d0eb 100644 --- a/lib/dashboard_latest/widgets/requests_fragment.dart +++ b/lib/dashboard_latest/widgets/requests_fragment.dart @@ -5,6 +5,7 @@ import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/dashboard_latest/dashboard_provider.dart'; import 'package:test_sa/extensions/context_extension.dart'; +import 'package:test_sa/extensions/enum_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; @@ -39,39 +40,44 @@ class RequestsFragment extends StatelessWidget { @override Widget build(BuildContext context) { - // OPTIMIZATION: Using Selector instead of Consumer - // This reduces rebuilds by 70% - only rebuilds when dashboardCount or isLoading changes - // Previously rebuilt on ANY provider change (tabs, filters, navigation, etc.) return Selector( - selector: (_, provider) => _DashboardCountData( - dashboardCount: provider.dashboardCount, - isLoading: provider.isAllCountLoading, - ), - builder: (context, data, _) => GridView( - padding: const EdgeInsets.only(left: 16, right: 16, bottom: 16), - physics: const NeverScrollableScrollPhysics(), - shrinkWrap: true, - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: context.isTablet() ? 5 : 4, childAspectRatio: 85 / 85, crossAxisSpacing: 8, mainAxisSpacing: 8), - children: [ - listItem( - data.dashboardCount?.data?.countHighPriority ?? 0, - "high_priority", - context.translation.highPriority, - context, - data.isLoading, - 0, - context.isDark ? AppColor.redStatus(context) : AppColor.red30, - ), - listItem(data.dashboardCount?.data?.countOverdue ?? 0, "overdue", context.translation.overdue, context, data.isLoading, 1, AppColor.yellowIcon(context)), - listItem(data.dashboardCount?.data?.countInprogress ?? 0, "new_request", ApiManager.instance.user?.type == UsersTypes.engineer ? context.translation.inProgress : context.translation.newR, - context, data.isLoading, 2, AppColor.primary10), - listItem(data.dashboardCount?.data?.countComplete ?? 0, "complete_request", context.translation.completed, context, data.isLoading, 3, AppColor.greenStatus(context)), - ], - ), - ); + selector: (_, provider) => _DashboardCountData(dashboardCount: provider.dashboardCount, isLoading: provider.isAllCountLoading), + builder: (context, data, _) { + List listItems = []; + if (context.userProvider.isNurse) { + listItems = [ + requestType(data.dashboardCount?.data?.countOpen ?? 0, "dashboard/open_icon", context.translation.open, context, data.isLoading, RequestTypeEnum.open, AppColor.openColor), + requestType(data.dashboardCount?.data?.countInprogress ?? 0, "dashboard/inprogress_icon", context.translation.inProgress, context, data.isLoading, RequestTypeEnum.inProgress, + AppColor.primary10), + requestType( + data.dashboardCount?.data?.countAcknowledge ?? 0, "complete_request", "Acknowledgement", context, data.isLoading, RequestTypeEnum.pendingAcknowledgment, AppColor.overdueColor), + requestType(data.dashboardCount?.data?.countCanceled ?? 0, "dashboard/unassigned", "Canceled", context, data.isLoading, RequestTypeEnum.canceled, AppColor.red30), + ]; + } else { + listItems = [ + requestType( + data.dashboardCount?.data?.countUnAssigned ?? 0, "dashboard/unassigned", "UnAssigned", context, data.isLoading, RequestTypeEnum.unassigned, AppColor.unassignedStatus(context)), + requestType(data.dashboardCount?.data?.countOpen ?? 0, "dashboard/open_icon", context.translation.open, context, data.isLoading, RequestTypeEnum.open, AppColor.openColor), + requestType(data.dashboardCount?.data?.countInprogress ?? 0, "dashboard/inprogress_icon", context.translation.inProgress, context, data.isLoading, RequestTypeEnum.inProgress, + AppColor.primary10), + requestType( + data.dashboardCount?.data?.countComplete ?? 0, "complete_request", context.translation.completed, context, data.isLoading, RequestTypeEnum.completed, AppColor.completedColor), + requestType(data.dashboardCount?.data?.countOverdue ?? 0, "overdue", context.translation.overdue, context, data.isLoading, RequestTypeEnum.overdue, AppColor.yellowIcon(context)), + requestType(data.dashboardCount?.data?.countHighPriority ?? 0, "high_priority", context.translation.highPriority, context, data.isLoading, RequestTypeEnum.highPriority, AppColor.red30), + ]; + } + + return GridView( + padding: const EdgeInsets.only(left: 16, right: 16, bottom: 16), + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: context.isTablet() ? 5 : 4, childAspectRatio: 85 / 85, crossAxisSpacing: 8, mainAxisSpacing: 8), + children: listItems, + ); + }); } - Widget listItem(int value, String icon, String title, BuildContext context, bool isLoading, int index, Color iconColor) { + Widget requestType(int value, String icon, String title, BuildContext context, bool isLoading, RequestTypeEnum requestType, Color iconColor) { return CustomBadge( value: isLoading ? 0 : value, positionR: -4, @@ -93,748 +99,9 @@ class RequestsFragment extends StatelessWidget { .onPress(isLoading ? null : () async { - await Navigator.push(context, MaterialPageRoute(builder: (context) => RequestsListPage(index, title))); + await Navigator.push(context, MaterialPageRoute(builder: (context) => RequestsListPage(1, title))); Provider.of(context, listen: false).refreshDashboard(userType: Provider.of(context, listen: false).user!.type!, context: context); }) .paddingOnly(end: 4, top: 4); } } - -// -// import 'package:flutter/material.dart'; -// import 'package:provider/provider.dart'; -// import 'package:test_sa/controllers/api_routes/api_manager.dart'; -// import 'package:test_sa/controllers/providers/api/all_requests_provider.dart'; -// import 'package:test_sa/controllers/providers/api/notifications_provider.dart'; -// import 'package:test_sa/controllers/providers/api/user_provider.dart'; -// import 'package:test_sa/extensions/context_extension.dart'; -// import 'package:test_sa/extensions/int_extensions.dart'; -// import 'package:test_sa/extensions/text_extensions.dart'; -// import 'package:test_sa/extensions/widget_extensions.dart'; -// import 'package:badges/badges.dart' as badges; -// import 'package:test_sa/models/enums/user_types.dart'; -// import 'package:test_sa/new_views/app_style/app_color.dart'; -// import 'package:test_sa/new_views/common_widgets/app_floating_action_button.dart'; -// import 'package:test_sa/new_views/pages/land_page/requests_list_page.dart'; -// -// class RequestsFragment extends StatelessWidget { -// const RequestsFragment({Key? key}) : super(key: key); -// -// @override -// Widget build(BuildContext context) { -// return Consumer( -// builder: (context, snapshot, _) => RefreshIndicator( -// onRefresh: () async { -// snapshot.getRequests(); -// await Provider.of(context, listen: false).getSystemNotifications( -// user: Provider.of(context, listen: false).user, -// resetProvider: true, -// ); -// return Future.delayed(const Duration(milliseconds: 250)); -// }, -// child: Row( -// mainAxisAlignment: MainAxisAlignment.spaceBetween, -// children: _buildListItems(context, snapshot), -// ), -// ), -// ); -// } -// -// List _buildListItems(BuildContext context, AllRequestsProvider snapshot) { -// final Map requestItems = { -// 'high_priority': { -// 'count': snapshot.highPriorityRequests?.total?.count, -// 'translation': context.translation.highPriority, -// 'isLoading': snapshot.isAllLoading, -// 'color': context.isDark ? AppColor.redStatus(context) : AppColor.red50, -// }, -// 'overdue': { -// 'count': snapshot.overdueRequests?.total?.count, -// 'translation': context.translation.overdue, -// 'isLoading': snapshot.isAllLoading, -// 'color': AppColor.yellowStatus(context), -// }, -// 'new_request': { -// 'count': snapshot.openRequests?.total?.count, -// 'translation': ApiManager.instance.user.type == UsersTypes.engineer ? context.translation.inProgress : context.translation.newR, -// 'isLoading': snapshot.isAllLoading, -// 'color': AppColor.primary40, -// }, -// 'complete_request': { -// 'count': snapshot.completedRequests?.total?.count, -// 'translation': context.translation.completed, -// 'isLoading': snapshot.isAllLoading, -// 'color': AppColor.greenStatus(context), -// }, -// }; -// -// return requestItems.entries.map((entry) { -// final key = entry.key; -// final value = entry.value; -// -// return listItem( -// value['count'], -// key, -// value['translation'], -// context, -// value['isLoading'], -// requestItems.keys.toList().indexOf(key), -// value['color'], -// ); -// }).toList(); -// } -// -// Widget listItem( -// int value, -// String icon, -// String title, -// BuildContext context, -// bool isLoading, -// int index, -// Color iconColor, -// ) { -// return GestureDetector( -// onTap: isLoading -// ? null -// : () { -// Navigator.push( -// context, -// MaterialPageRoute( -// builder: (context) => RequestsListPage(index), -// ), -// ); -// // Provider.of(context, listen: false).isAllLoading = true; -// // Provider.of(context, listen: false) -// // .getRequests(); -// }, -// child: Column( -// crossAxisAlignment: CrossAxisAlignment.start, -// children: [ -// value != null && value > 0 && !isLoading -// ? badges.Badge( -// badgeContent: Text( -// value.toString(), -// style: const TextStyle( -// color: AppColor.white20, -// fontWeight: FontWeight.normal, -// ), -// ), -// badgeStyle: const badges.BadgeStyle(padding: EdgeInsets.all(4), badgeColor: AppColor.red30), -// child: Container( -// child: (icon ?? "").toSvgAsset(height: 26, width: 26, color: iconColor)?.toShimmer(isShow: isLoading), -// ).toShadowCircleContainer(context, padding: 18), -// ) -// : Container( -// child: (icon ?? "").toSvgAsset(height: 26, width: 26, color: iconColor)?.toShimmer(isShow: isLoading), -// ).toShadowCircleContainer(context, padding: 18), -// 10.height, -// Text( -// title, -// style: AppTextStyles.bodyText.copyWith( -// color: context.isDark ? AppColor.neutral30 : AppColor.neutral50, -// ), -// ), -// ], -// ), -// ); -// } -// } - -// import 'package:flutter/material.dart'; -// import 'package:provider/provider.dart'; -// import 'package:test_sa/controllers/api_routes/api_manager.dart'; -// import 'package:test_sa/controllers/providers/api/all_requests_provider.dart'; -// import 'package:test_sa/controllers/providers/api/notifications_provider.dart'; -// import 'package:test_sa/controllers/providers/api/user_provider.dart'; -// import 'package:test_sa/extensions/context_extension.dart'; -// import 'package:test_sa/extensions/int_extensions.dart'; -// import 'package:test_sa/extensions/text_extensions.dart'; -// import 'package:test_sa/extensions/widget_extensions.dart'; -// import 'package:badges/badges.dart' as badges; -// import 'package:test_sa/models/enums/user_types.dart'; -// import 'package:test_sa/new_views/app_style/app_color.dart'; -// import 'package:test_sa/new_views/common_widgets/app_floating_action_button.dart'; -// import 'package:test_sa/new_views/pages/land_page/requests_list_page.dart'; -// -// class RequestsFragment extends StatelessWidget { -// const RequestsFragment({Key? key}) : super(key: key); -// -// @override -// Widget build(BuildContext context) { -// return Scaffold( -// // todo check here, nurse can add request not engineer -// floatingActionButton: const AppFloatingActionButton(), -// body: Consumer( -// builder: (context, snapshot, _) => RefreshIndicator( -// onRefresh: () { -// snapshot.getRequests(); -// Provider.of(context, listen: false) -// .getSystemNotifications( -// user: Provider.of(context, listen: false) -// .user, -// resetProvider: true); -// return Future.delayed(const Duration(microseconds: 250)); -// }, -// child: Container( -// height: 200.toScreenHeight, -// color: Colors.blue, -// child: Wrap( -// children: [ -// listItem( -// snapshot.highPriorityRequests?.total?.count, -// "high_priority", -// context.translation.highPriority, -// context, -// snapshot.isHighPriorityLoading, -// 0, -// context.isDark ? AppColor.redStatus(context) : AppColor.red50, -// ), -// ], -// ), -// // child: ListView( -// // // padding: const EdgeInsets.only(left: 16, right: 16, bottom: 16), -// // children: [ -// // listItem( -// // snapshot.highPriorityRequests?.total?.count, -// // "high_priority", -// // context.translation.highPriority, -// // context, -// // snapshot.isHighPriorityLoading, -// // 0, -// // context.isDark ? AppColor.redStatus(context) : AppColor.red50, -// // ), -// // listItem( -// // snapshot.overdueRequests?.total?.count, -// // "overdue", -// // context.translation.overdue, -// // context, -// // snapshot.isOverdueLoading, -// // 1, -// // AppColor.yellowStatus(context), -// // ), -// // listItem( -// // snapshot.openRequests?.total?.count, -// // "new_request", -// // ApiManager.instance.user.type == UsersTypes.engineer -// // ? context.translation.inProgress -// // : context.translation.newR, -// // context, -// // snapshot.isOpenLoading, -// // 2, -// // AppColor.primary40, -// // ), -// // listItem( -// // snapshot.completedRequests?.total?.count, -// // "complete_request", -// // context.translation.completed, -// // context, -// // snapshot.isCompleteLoading, -// // 3, -// // AppColor.greenStatus(context), -// // ), -// // ], -// // ), -// )), -// ), -// ); -// } -// -// 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))); -// Provider.of(context, listen: false) -// .getRequests(); -// }, -// child: Column( -// crossAxisAlignment: CrossAxisAlignment.start, -// children: [ -// value != null && value > 0 && !isLoading -// ? badges.Badge( -// badgeContent: Text( -// value.toString(), -// style: const TextStyle( -// color: AppColor.white20, -// fontWeight: FontWeight.normal, -// ), -// ), -// badgeStyle: const badges.BadgeStyle(padding: EdgeInsets.all(4), badgeColor: AppColor.red30), -// child: Container( -// child: (icon ?? "").toSvgAsset(height: 26, width: 26, color: iconColor)?.toShimmer(isShow: isLoading), -// ).toShadowCircleContainer(context, padding: 18), -// ) -// : Container( -// child: (icon ?? "").toSvgAsset(height: 26, width: 26, color: iconColor)?.toShimmer(isShow: isLoading), -// ).toShadowCircleContainer(context, padding: 18), -// 10.height, -// Text( -// title, -// style: AppTextStyles.bodyText.copyWith( -// color: context.isDark ? AppColor.neutral30 : AppColor.neutral50, -// ), -// ), -// ], -// ), -// ); -// } -// } - -// import 'package:flutter/material.dart'; -// import 'package:provider/provider.dart'; -// import 'package:test_sa/controllers/api_routes/api_manager.dart'; -// import 'package:test_sa/controllers/providers/api/all_requests_provider.dart'; -// import 'package:test_sa/controllers/providers/api/notifications_provider.dart'; -// import 'package:test_sa/controllers/providers/api/user_provider.dart'; -// import 'package:test_sa/extensions/context_extension.dart'; -// import 'package:test_sa/extensions/int_extensions.dart'; -// import 'package:test_sa/extensions/text_extensions.dart'; -// import 'package:test_sa/extensions/widget_extensions.dart'; -// import 'package:badges/badges.dart' as badges; -// import 'package:test_sa/models/enums/user_types.dart'; -// import 'package:test_sa/new_views/app_style/app_color.dart'; -// import 'package:test_sa/new_views/common_widgets/app_floating_action_button.dart'; -// import 'package:test_sa/new_views/pages/land_page/requests_list_page.dart'; -// -// class RequestsFragment extends StatelessWidget { -// const RequestsFragment({Key? key}) : super(key: key); -// -// @override -// Widget build(BuildContext context) { -// return Scaffold( -// // todo check here, nurse can add request not engineer -// floatingActionButton: const AppFloatingActionButton(), -// body: Consumer( -// builder: (context, snapshot, _) => RefreshIndicator( -// onRefresh: () { -// snapshot.getRequests(); -// Provider.of(context, listen: false) -// .getSystemNotifications( -// user: Provider.of(context, listen: false) -// .user, -// resetProvider: true); -// return Future.delayed(const Duration(microseconds: 250)); -// }, -// child: Container( -// height: 200.toScreenHeight, -// color: Colors.blue, -// child: Wrap( -// children: [ -// listItem( -// snapshot.highPriorityRequests?.total?.count, -// "high_priority", -// context.translation.highPriority, -// context, -// snapshot.isHighPriorityLoading, -// 0, -// context.isDark ? AppColor.redStatus(context) : AppColor.red50, -// ), -// ], -// ), -// // child: ListView( -// // // padding: const EdgeInsets.only(left: 16, right: 16, bottom: 16), -// // children: [ -// // listItem( -// // snapshot.highPriorityRequests?.total?.count, -// // "high_priority", -// // context.translation.highPriority, -// // context, -// // snapshot.isHighPriorityLoading, -// // 0, -// // context.isDark ? AppColor.redStatus(context) : AppColor.red50, -// // ), -// // listItem( -// // snapshot.overdueRequests?.total?.count, -// // "overdue", -// // context.translation.overdue, -// // context, -// // snapshot.isOverdueLoading, -// // 1, -// // AppColor.yellowStatus(context), -// // ), -// // listItem( -// // snapshot.openRequests?.total?.count, -// // "new_request", -// // ApiManager.instance.user.type == UsersTypes.engineer -// // ? context.translation.inProgress -// // : context.translation.newR, -// // context, -// // snapshot.isOpenLoading, -// // 2, -// // AppColor.primary40, -// // ), -// // listItem( -// // snapshot.completedRequests?.total?.count, -// // "complete_request", -// // context.translation.completed, -// // context, -// // snapshot.isCompleteLoading, -// // 3, -// // AppColor.greenStatus(context), -// // ), -// // ], -// // ), -// )), -// ), -// ); -// } -// -// 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))); -// Provider.of(context, listen: false) -// .getRequests(); -// }, -// child: Column( -// crossAxisAlignment: CrossAxisAlignment.start, -// children: [ -// value != null && value > 0 && !isLoading -// ? badges.Badge( -// badgeContent: Text( -// value.toString(), -// style: const TextStyle( -// color: AppColor.white20, -// fontWeight: FontWeight.normal, -// ), -// ), -// badgeStyle: const badges.BadgeStyle(padding: EdgeInsets.all(4), badgeColor: AppColor.red30), -// child: Container( -// child: (icon ?? "").toSvgAsset(height: 26, width: 26, color: iconColor)?.toShimmer(isShow: isLoading), -// ).toShadowCircleContainer(context, padding: 18), -// ) -// : Container( -// child: (icon ?? "").toSvgAsset(height: 26, width: 26, color: iconColor)?.toShimmer(isShow: isLoading), -// ).toShadowCircleContainer(context, padding: 18), -// 10.height, -// Text( -// title, -// style: AppTextStyles.bodyText.copyWith( -// color: context.isDark ? AppColor.neutral30 : AppColor.neutral50, -// ), -// ), -// ], -// ), -// ); -// } -// } - -// import 'package:flutter/material.dart'; -// import 'package:provider/provider.dart'; -// import 'package:test_sa/controllers/api_routes/api_manager.dart'; -// import 'package:test_sa/controllers/providers/api/all_requests_provider.dart'; -// import 'package:test_sa/controllers/providers/api/notifications_provider.dart'; -// import 'package:test_sa/controllers/providers/api/user_provider.dart'; -// import 'package:test_sa/extensions/context_extension.dart'; -// import 'package:test_sa/extensions/int_extensions.dart'; -// import 'package:test_sa/extensions/text_extensions.dart'; -// import 'package:test_sa/extensions/widget_extensions.dart'; -// import 'package:badges/badges.dart' as badges; -// import 'package:test_sa/models/enums/user_types.dart'; -// import 'package:test_sa/new_views/app_style/app_color.dart'; -// import 'package:test_sa/new_views/common_widgets/app_floating_action_button.dart'; -// import 'package:test_sa/new_views/pages/land_page/requests_list_page.dart'; -// -// class RequestsFragment extends StatelessWidget { -// const RequestsFragment({Key? key}) : super(key: key); -// -// @override -// Widget build(BuildContext context) { -// return Scaffold( -// // todo check here, nurse can add request not engineer -// floatingActionButton: const AppFloatingActionButton(), -// body: Consumer( -// builder: (context, snapshot, _) => RefreshIndicator( -// onRefresh: () { -// snapshot.getRequests(); -// Provider.of(context, listen: false) -// .getSystemNotifications( -// user: Provider.of(context, listen: false) -// .user, -// resetProvider: true); -// return Future.delayed(const Duration(microseconds: 250)); -// }, -// child: Container( -// height: 200.toScreenHeight, -// color: Colors.blue, -// child: Wrap( -// children: [ -// listItem( -// snapshot.highPriorityRequests?.total?.count, -// "high_priority", -// context.translation.highPriority, -// context, -// snapshot.isHighPriorityLoading, -// 0, -// context.isDark ? AppColor.redStatus(context) : AppColor.red50, -// ), -// ], -// ), -// // child: ListView( -// // // padding: const EdgeInsets.only(left: 16, right: 16, bottom: 16), -// // children: [ -// // listItem( -// // snapshot.highPriorityRequests?.total?.count, -// // "high_priority", -// // context.translation.highPriority, -// // context, -// // snapshot.isHighPriorityLoading, -// // 0, -// // context.isDark ? AppColor.redStatus(context) : AppColor.red50, -// // ), -// // listItem( -// // snapshot.overdueRequests?.total?.count, -// // "overdue", -// // context.translation.overdue, -// // context, -// // snapshot.isOverdueLoading, -// // 1, -// // AppColor.yellowStatus(context), -// // ), -// // listItem( -// // snapshot.openRequests?.total?.count, -// // "new_request", -// // ApiManager.instance.user.type == UsersTypes.engineer -// // ? context.translation.inProgress -// // : context.translation.newR, -// // context, -// // snapshot.isOpenLoading, -// // 2, -// // AppColor.primary40, -// // ), -// // listItem( -// // snapshot.completedRequests?.total?.count, -// // "complete_request", -// // context.translation.completed, -// // context, -// // snapshot.isCompleteLoading, -// // 3, -// // AppColor.greenStatus(context), -// // ), -// // ], -// // ), -// )), -// ), -// ); -// } -// -// Widget listItem( -// int value, -// String icon, -// String title, -// BuildContext context, -// bool isLoading, -// int index, -// Color iconColor, -// ) { -// value = 4; -// return GestureDetector( -// onTap: isLoading -// ? null -// : () async { -// await Navigator.push( -// context, -// MaterialPageRoute( -// builder: (context) => RequestsListPage(index))); -// Provider.of(context, listen: false) -// .getRequests(); -// }, -// child: Column( -// crossAxisAlignment: CrossAxisAlignment.start, -// children: [ -// value!=null&&value > 0 -// ? badges.Badge( -// badgeContent: Text( -// value.toString(), -// style: const TextStyle( -// color: AppColor.white20, -// // fontSize: 1.3.h, -// fontWeight: FontWeight.normal), -// ), -// badgeStyle: badges.BadgeStyle( -// padding: EdgeInsets.all(9), -// ), -// child: Container( -// padding: const EdgeInsets.all(20), -// decoration: const BoxDecoration( -// shape: BoxShape.circle, -// //TODO add color according to theme... -// color: AppColor.white20, // Background color of the circle -// ), -// child: (icon ?? "") -// .toSvgAsset(height: 40, width: 40, color: iconColor) -// ?.toShimmer(isShow: isLoading), -// )) -// : Container( -// padding: const EdgeInsets.all(20), -// decoration: const BoxDecoration( -// shape: BoxShape.circle, -// //TODO add color according to theme... -// color: AppColor.white20, // Background color of the circle -// ), -// child: (icon ?? "") -// .toSvgAsset(height: 48, width: 48, color: iconColor) -// ?.toShimmer(isShow: isLoading), -// ), -// // Container( -// // padding: const EdgeInsets.all(20), -// // decoration: const BoxDecoration( -// // shape: BoxShape.circle, -// // //TODO add color according to theme... -// // color: AppColor.white20, // Background color of the circle -// // ), -// // child: (icon ?? "") -// // .toSvgAsset(height: 48, width: 48, color: iconColor) -// // ?.toShimmer(isShow: isLoading), -// // ), -// 20.height, -// Text( -// title, -// style: AppTextStyles.heading5.copyWith( -// color: context.isDark ? AppColor.neutral30 : AppColor.neutral50, -// ), -// ), -// // Text( -// // "$title\n${context.translation.requests}", -// // style: AppTextStyles.heading5.copyWith( -// // color: context.isDark ? AppColor.neutral30 : AppColor.neutral50, -// // ), -// // ).toShimmer(isShow: isLoading), -// // 8.height, -// // Row( -// // mainAxisSize: MainAxisSize.min, -// // children: [ -// // Text( -// // context.translation.viewDetails, -// // style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.primary40 : AppColor.primary50), -// // ), -// // 4.width, -// // Icon( -// // Icons.arrow_forward, -// // color: context.isDark ? AppColor.primary40 : AppColor.primary50, -// // size: 14, -// // ) -// // ], -// // ).toShimmer(isShow: isLoading), -// ], -// ), -// ); -// } -// -// // Widget listItem(int value, String icon, String title, BuildContext context, bool isLoading, int index, Color iconColor) { -// // return Column( -// // crossAxisAlignment: CrossAxisAlignment.start, -// // children: [ -// // Row( -// // crossAxisAlignment: CrossAxisAlignment.start, -// // children: [ -// // //TODO add this to badges -// // // Text( -// // // value?.toString() ?? "-", -// // // style: AppTextStyles.heading1.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50, height: 1), -// // // ).toShimmer(isShow: isLoading).expanded, -// // // 8.width, -// // (icon ?? "").toSvgAsset(height: 48, width: 48, color: iconColor)?.toShimmer(isShow: isLoading), -// // ], -// // ), -// // // Text( -// // // "$title\n${context.translation.requests}", -// // // style: AppTextStyles.heading5.copyWith( -// // // color: context.isDark ? AppColor.neutral30 : AppColor.neutral50, -// // // ), -// // // ).toShimmer(isShow: isLoading), -// // // 8.height, -// // // Row( -// // // mainAxisSize: MainAxisSize.min, -// // // children: [ -// // // Text( -// // // context.translation.viewDetails, -// // // style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.primary40 : AppColor.primary50), -// // // ), -// // // 4.width, -// // // Icon( -// // // Icons.arrow_forward, -// // // color: context.isDark ? AppColor.primary40 : AppColor.primary50, -// // // size: 14, -// // // ) -// // // ], -// // // ).toShimmer(isShow: isLoading), -// // ], -// // ).toShadowContainer(context).onPress(isLoading -// // ? null -// // : () async { -// // await Navigator.push(context, MaterialPageRoute(builder: (context) => RequestsListPage(index))); -// // Provider.of(context, listen: false).getRequests(); -// // }); -// // } -// } -// Widget listItem(int value, String icon, String title, BuildContext context, bool isLoading, int index, Color iconColor) { -// return Column( -// crossAxisAlignment: CrossAxisAlignment.start, -// children: [ -// Row( -// crossAxisAlignment: CrossAxisAlignment.start, -// children: [ -// Text( -// value?.toString() ?? "-", -// style: AppTextStyles.bodyText2.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50, height: 1), -// ).toShimmer(isShow: isLoading).expanded, -// 8.width, -// (icon ?? "").toSvgAsset(height: 48, width: 48, color: iconColor)?.toShimmer(isShow: isLoading), -// ], -// ).expanded, -// Text( -// "$title\n${context.translation.requests}", -// style: AppTextStyles.bodyText2.copyWith( -// color: context.isDark ? AppColor.neutral30 : AppColor.neutral50, -// ), -// ).toShimmer(isShow: isLoading), -// // 8.height, -// // Row( -// // mainAxisSize: MainAxisSize.min, -// // children: [ -// // Text( -// // context.translation.viewDetails, -// // style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.primary40 : AppColor.primary50), -// // ), -// // 4.width, -// // Icon( -// // Icons.arrow_forward, -// // color: context.isDark ? AppColor.primary40 : AppColor.primary50, -// // size: 14, -// // ) -// // ], -// // ).toShimmer(isShow: isLoading), -// ], -// ).toShadowContainer(context, padding: 0).onPress(isLoading -// ? null -// : () async { -// await Navigator.push(context, MaterialPageRoute(builder: (context) => RequestsListPage(index))); -// Provider.of(context, listen: false).getRequests(); -// }); -// } diff --git a/lib/extensions/enum_extensions.dart b/lib/extensions/enum_extensions.dart index 3dd98eef..5039329c 100644 --- a/lib/extensions/enum_extensions.dart +++ b/lib/extensions/enum_extensions.dart @@ -196,3 +196,15 @@ enum AssetDeliveryStageEnum { endUserAcceptance, other, } + +enum RequestTypeEnum { + unassigned, + open, + inProgress, + completed, + closed, + canceled, + overdue, + highPriority, + pendingAcknowledgment, +} diff --git a/lib/extensions/widget_extensions.dart b/lib/extensions/widget_extensions.dart index bc5f3c8a..2dc5cf00 100644 --- a/lib/extensions/widget_extensions.dart +++ b/lib/extensions/widget_extensions.dart @@ -140,7 +140,7 @@ extension WidgetExtensions on Widget { margin: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom), decoration: BoxDecoration( // color: AppColor.background(context), - color: Theme.of(context).scaffoldBackgroundColor, + color: AppColor.bottomSheetColor(context), borderRadius: const BorderRadius.only(topRight: Radius.circular(20), topLeft: Radius.circular(20)), ), padding: padding ?? EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight), @@ -151,7 +151,7 @@ extension WidgetExtensions on Widget { clipBehavior: Clip.antiAlias, margin: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom), decoration: BoxDecoration( - color: AppColor.background(context), + color: AppColor.bottomSheetColor(context), borderRadius: const BorderRadius.only(topRight: Radius.circular(30), topLeft: Radius.circular(30)), ), padding: padding ?? EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 12.toScreenHeight), diff --git a/lib/models/new_models/dashboard_count.dart b/lib/models/new_models/dashboard_count.dart index 55bafffa..0f1f59db 100644 --- a/lib/models/new_models/dashboard_count.dart +++ b/lib/models/new_models/dashboard_count.dart @@ -35,19 +35,25 @@ class Data { int? countOpen; int? countInprogress; int? countComplete; + int? countClose; + int? countCanceled; int? countAcknowledge; int? countHighPriority; int? countOverdue; + int? countUnAssigned; - Data({this.countOpen, this.countInprogress, this.countComplete, this.countAcknowledge, this.countHighPriority, this.countOverdue}); + Data({this.countOpen, this.countInprogress,this.countCanceled, this.countComplete, this.countAcknowledge, this.countHighPriority, this.countOverdue, this.countClose, this.countUnAssigned}); Data.fromJson(Map json) { countOpen = json['countOpen'] ?? 0; countInprogress = json['countInprogress'] ?? 0; countComplete = json['countComplete'] ?? 0; + countCanceled = json['countCanceled'] ?? 0; + countClose = json['countClose'] ?? 0; countAcknowledge = json['countAcknowledge'] ?? 0; countHighPriority = json['countHighPriority'] ?? 0; countOverdue = json['countOverdue'] ?? 0; + countUnAssigned = json['countUnAssigned'] ?? 0; } Map toJson() { @@ -55,9 +61,12 @@ class Data { data['countOpen'] = countOpen; data['countInprogress'] = countInprogress; data['countComplete'] = countComplete; + data['countCanceled'] = countCanceled; + data['countClose'] = countClose; data['countAcknowledge'] = countAcknowledge; data['countHighPriority'] = countHighPriority; data['countOverdue'] = countOverdue; + data['countUnAssigned'] = countUnAssigned; return data; } } diff --git a/lib/modules/cm_module/views/components/bottom_sheets/service_request_bottomsheet.dart b/lib/modules/cm_module/views/components/bottom_sheets/service_request_bottomsheet.dart index 90060402..ebf38029 100644 --- a/lib/modules/cm_module/views/components/bottom_sheets/service_request_bottomsheet.dart +++ b/lib/modules/cm_module/views/components/bottom_sheets/service_request_bottomsheet.dart @@ -640,13 +640,7 @@ class ServiceRequestBottomSheet { Widget customListItem({required BuildContext context, required String icon, required String heading, required String subHeading, required VoidCallback onTap}) { return GestureDetector( - onTap: onTap, // Handles the tap - child: Card( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(14), // Circular border radius - ), - // color: AppColor.neutral80, - color: AppColor.background(context), + onTap: onTap, // Handles the tap child: Row( crossAxisAlignment: CrossAxisAlignment.start, // Align items at the top children: [ @@ -670,9 +664,7 @@ class ServiceRequestBottomSheet { ).paddingOnly(end: 50), ), ], - ).paddingAll(12), - ), - ); + ).toShadowContainer(context)); } void onItemTap({required int index, required BuildContext context}) { @@ -711,12 +703,13 @@ class ServiceRequestBottomSheet { alignment: AlignmentDirectional.centerStart, child: context.translation.selectAction.bottomSheetHeadingTextStyle(context), ), - 16.height, - ListView.builder( + // 16.height, + ListView.separated( shrinkWrap: true, - padding: EdgeInsets.zero, + padding: const EdgeInsets.only(top: 16, bottom: 16), itemCount: items.length, physics: const NeverScrollableScrollPhysics(), + separatorBuilder: (cxt, index) => 12.height, itemBuilder: (context, index) { final item = items[index]; return customListItem( diff --git a/lib/modules/cm_module/views/components/service_request_detail_view.dart b/lib/modules/cm_module/views/components/service_request_detail_view.dart index 01a5ac5c..749fccc4 100644 --- a/lib/modules/cm_module/views/components/service_request_detail_view.dart +++ b/lib/modules/cm_module/views/components/service_request_detail_view.dart @@ -22,6 +22,7 @@ import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; import 'package:test_sa/views/widgets/images/files_list.dart'; import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; +import 'package:test_sa/views/widgets/item_views/info_header_widget.dart'; import 'package:test_sa/views/widgets/item_views/info_text_widget.dart'; import 'package:test_sa/views/widgets/loaders/no_data_found.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart'; @@ -193,9 +194,11 @@ class _ServiceRequestDetailViewState extends State { 8.height, Text( context.translation.assetInformation, - style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), + style: AppTextStyles.heading5.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), ), + // InfoHeader16Widget(context.translation.assetInformation), 8.height, + InfoTextWidget(label: context.translation.assetName,value: workOrder.assetNdModel!.name?.cleanupWhitespace?.capitalizeFirstOfEach), Text( '${context.translation.assetName}: ${workOrder.assetNdModel!.name?.cleanupWhitespace?.capitalizeFirstOfEach}', style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120), diff --git a/lib/modules/cm_module/views/forms/spare_part/spare_part_request.dart b/lib/modules/cm_module/views/forms/spare_part/spare_part_request.dart index de312a41..32f3b88c 100644 --- a/lib/modules/cm_module/views/forms/spare_part/spare_part_request.dart +++ b/lib/modules/cm_module/views/forms/spare_part/spare_part_request.dart @@ -127,83 +127,104 @@ class _SparePartRequestState extends State with TickerProvider child: Column( children: [ SingleChildScrollView( - padding: const EdgeInsets.all(12), + padding: const EdgeInsets.all(16), child: IgnorePointer( ignoring: _requestDetailProvider!.isReadOnlyRequest, child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - Card( - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - context.translation.sparePartDetails.heading5(context).custom(color: AppColor.textStyleColor(context)), - // 12.height, - // SingleItemDropDownMenu( - // context: context, - // height: 56.toScreenHeight, - // title: context.translation.activityStatus, - // showShadow: false, - // backgroundColor: AppColor.neutral100, - // initialValue: requestDetailProvider.sparePartHelperModel?.activityStatus, - // onSelect: (status) { - // requestDetailProvider.sparePartHelperModel?.activityStatus = status; - // }, - // ), - 12.height, - SingleItemDropDownMenu( - context: context, - title: context.translation.part, - staticData: _spareParts, - showShadow: false, - showAsBottomSheet: true, - loading: _isLoading, - initialValue: requestDetailProvider.sparePartHelperModel?.sparePart, - backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90, - onSelect: (part) async { - if (part != null) { - requestDetailProvider.sparePartHelperModel?.sparePart = part; - _oracleNoController.text = part.oracleCode ?? ''; - requestDetailProvider.updateSparePartHelperModel(_requestDetailProvider?.sparePartHelperModel); - } - }, - ), + Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + context.translation.sparePartDetails.heading5(context).custom(color: AppColor.textStyleColor(context)), + // 12.height, + // SingleItemDropDownMenu( + // context: context, + // height: 56.toScreenHeight, + // title: context.translation.activityStatus, + // showShadow: false, + // backgroundColor: AppColor.neutral100, + // initialValue: requestDetailProvider.sparePartHelperModel?.activityStatus, + // onSelect: (status) { + // requestDetailProvider.sparePartHelperModel?.activityStatus = status; + // }, + // ), + 12.height, + SingleItemDropDownMenu( + context: context, + title: context.translation.part, + staticData: _spareParts, + showShadow: false, + showAsBottomSheet: true, + loading: _isLoading, + initialValue: requestDetailProvider.sparePartHelperModel?.sparePart, + backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90, + onSelect: (part) async { + if (part != null) { + requestDetailProvider.sparePartHelperModel?.sparePart = part; + _oracleNoController.text = part.oracleCode ?? ''; + requestDetailProvider.updateSparePartHelperModel(_requestDetailProvider?.sparePartHelperModel); + } + }, + ), - if (requestDetailProvider.sparePartHelperModel?.sparePart?.id != null) ...[ - 12.height, - SizedBox( - height: 30.toScreenHeight, - child: Text('View Parts Availability', - style: TextStyle( - fontSize: 12.toScreenWidth, - fontWeight: FontWeight.w500, - fontStyle: FontStyle.normal, - color: AppColor.primary10, - decorationColor: AppColor.primary10, - decoration: TextDecoration.underline, - )).onPress( - () async { - requestDetailProvider.getStoreAvailabilityById(partId: requestDetailProvider.sparePartHelperModel?.sparePart?.id); - showModalBottomSheet( - context: context, - isScrollControlled: true, - shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.vertical( - top: Radius.circular(20), - ), + if (requestDetailProvider.sparePartHelperModel?.sparePart?.id != null) ...[ + 12.height, + SizedBox( + height: 30.toScreenHeight, + child: Text('View Parts Availability', + style: TextStyle( + fontSize: 12.toScreenWidth, + fontWeight: FontWeight.w500, + fontStyle: FontStyle.normal, + color: AppColor.primary10, + decorationColor: AppColor.primary10, + decoration: TextDecoration.underline, + )).onPress( + () async { + requestDetailProvider.getStoreAvailabilityById(partId: requestDetailProvider.sparePartHelperModel?.sparePart?.id); + showModalBottomSheet( + context: context, + isScrollControlled: true, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.vertical( + top: Radius.circular(20), ), - clipBehavior: Clip.antiAliasWithSaveLayer, - builder: (BuildContext context) => PartDetailBottomSheetSheet(), - ); - }, - ), + ), + clipBehavior: Clip.antiAliasWithSaveLayer, + builder: (BuildContext context) => PartDetailBottomSheetSheet(), + ); + }, ), - ], - 12.height, + ), + ], + 12.height, + AppTextFormField( + controller: _partQtyController, + labelText: context.translation.quantity, + textInputType: TextInputType.number, + labelStyle: AppTextStyles.textFieldLabelStyle, + showWithoutDecoration: true, + backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90, + enable: requestDetailProvider.sparePartHelperModel?.sparePart?.id != null, + validator: (value) => value == null || value.isEmpty + ? context.translation.requiredField + : Validator.isNumeric(value) + ? null + : context.translation.onlyNumbers, + onChange: (value) { + requestDetailProvider.sparePartHelperModel?.quantity = num.tryParse(value ?? ""); + }, + onSaved: (text) { + requestDetailProvider.sparePartHelperModel?.quantity = num.tryParse(text ?? ""); + }, + ), + 12.height, + if (showInstallAndReturnQty) ...[ AppTextFormField( - controller: _partQtyController, - labelText: context.translation.quantity, - textInputType: TextInputType.number, + controller: _installQtyController, + labelText: context.translation.installedQty, + textInputType: const TextInputType.numberWithOptions(decimal: true), labelStyle: AppTextStyles.textFieldLabelStyle, showWithoutDecoration: true, backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90, @@ -211,97 +232,74 @@ class _SparePartRequestState extends State with TickerProvider validator: (value) => value == null || value.isEmpty ? context.translation.requiredField : Validator.isNumeric(value) - ? null - : context.translation.onlyNumbers, + ? null + : context.translation.onlyNumbers, onChange: (value) { - requestDetailProvider.sparePartHelperModel?.quantity = num.tryParse(value ?? ""); + requestDetailProvider.sparePartHelperModel?.installQty = num.tryParse(value ?? ""); }, onSaved: (text) { - requestDetailProvider.sparePartHelperModel?.quantity = num.tryParse(text ?? ""); + requestDetailProvider.sparePartHelperModel?.installQty = num.tryParse(text ?? ""); }, ), 12.height, - if (showInstallAndReturnQty) ...[ - AppTextFormField( - controller: _installQtyController, - labelText: context.translation.installedQty, - textInputType: const TextInputType.numberWithOptions(decimal: true), - labelStyle: AppTextStyles.textFieldLabelStyle, - showWithoutDecoration: true, - backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90, - enable: requestDetailProvider.sparePartHelperModel?.sparePart?.id != null, - validator: (value) => value == null || value.isEmpty - ? context.translation.requiredField - : Validator.isNumeric(value) - ? null - : context.translation.onlyNumbers, - onChange: (value) { - requestDetailProvider.sparePartHelperModel?.installQty = num.tryParse(value ?? ""); - }, - onSaved: (text) { - requestDetailProvider.sparePartHelperModel?.installQty = num.tryParse(text ?? ""); - }, - ), - 12.height, - AppTextFormField( - controller: _returnQtyController, - labelText: context.translation.returnQty, - textInputType: TextInputType.number, - labelStyle: AppTextStyles.textFieldLabelStyle, - showWithoutDecoration: true, - backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90, - enable: requestDetailProvider.sparePartHelperModel?.sparePart?.id != null, - validator: (value) => value == null || value.isEmpty - ? context.translation.requiredField - : Validator.isNumeric(value) - ? null - : context.translation.onlyNumbers, - onChange: (value) { - requestDetailProvider.sparePartHelperModel?.returnQty = num.tryParse(value ?? ""); - }, - onSaved: (text) { - requestDetailProvider.sparePartHelperModel?.returnQty = num.tryParse(text ?? ""); - }, - ), - 12.height, - ], AppTextFormField( - labelStyle: AppTextStyles.textFieldLabelStyle, - controller: _oracleNoController, - labelText: context.translation.oracleNo, + controller: _returnQtyController, + labelText: context.translation.returnQty, textInputType: TextInputType.number, - showWithoutDecoration: true, - backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90, - enable: false, - ), - 12.height, - AppTextFormField( - initialValue: requestDetailProvider.sparePartHelperModel?.comment, labelStyle: AppTextStyles.textFieldLabelStyle, - controller: _descriptionController, - showSpeechToText: true, - backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90, - labelText: "Engineer Comment", - alignLabelWithHint: true, showWithoutDecoration: true, - textInputType: TextInputType.multiline, + backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90, + enable: requestDetailProvider.sparePartHelperModel?.sparePart?.id != null, + validator: (value) => value == null || value.isEmpty + ? context.translation.requiredField + : Validator.isNumeric(value) + ? null + : context.translation.onlyNumbers, onChange: (value) { - requestDetailProvider.sparePartHelperModel?.comment = value; + requestDetailProvider.sparePartHelperModel?.returnQty = num.tryParse(value ?? ""); }, - onSaved: (value) { - requestDetailProvider.sparePartHelperModel?.comment = value; + onSaved: (text) { + requestDetailProvider.sparePartHelperModel?.returnQty = num.tryParse(text ?? ""); }, ), 12.height, - AttachmentPicker( - label: context.translation.attachQuotation, - attachment: attachments, - buttonIcon: 'quotation_icon'.toSvgAsset(color: AppColor.primary10), - buttonColor: AppColor.primary10, - ), ], - ).paddingAll(16), - ), + AppTextFormField( + labelStyle: AppTextStyles.textFieldLabelStyle, + controller: _oracleNoController, + labelText: context.translation.oracleNo, + textInputType: TextInputType.number, + showWithoutDecoration: true, + backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90, + enable: false, + ), + 12.height, + AppTextFormField( + initialValue: requestDetailProvider.sparePartHelperModel?.comment, + labelStyle: AppTextStyles.textFieldLabelStyle, + controller: _descriptionController, + showSpeechToText: true, + backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90, + labelText: "Engineer Comment", + alignLabelWithHint: true, + showWithoutDecoration: true, + textInputType: TextInputType.multiline, + onChange: (value) { + requestDetailProvider.sparePartHelperModel?.comment = value; + }, + onSaved: (value) { + requestDetailProvider.sparePartHelperModel?.comment = value; + }, + ), + 12.height, + AttachmentPicker( + label: context.translation.attachQuotation, + attachment: attachments, + buttonIcon: 'quotation_icon'.toSvgAsset(color: AppColor.primary10), + buttonColor: AppColor.primary10, + ), + ], + ).toShadowContainer(context), 8.height, ], ), diff --git a/lib/new_views/app_style/app_color.dart b/lib/new_views/app_style/app_color.dart index 1a021c19..1e85d065 100644 --- a/lib/new_views/app_style/app_color.dart +++ b/lib/new_views/app_style/app_color.dart @@ -57,6 +57,7 @@ class AppColor { static const Color white80 = Color(0xffF2F4FA); static const Color white90 = Color(0xffBFD1E4); static const Color white936 = Color(0xff212936); + static const Color whiteF3 = Color(0xffF1F1F3); //black static const Color black10 = Color(0xff3B3D4A); @@ -107,7 +108,9 @@ class AppColor { static const Color lowPriorityColor = Color(0xff54C166); // static Color greenStatus(BuildContext context) => context.isDark ? const Color(0xff1FA269) : green50; - static Color greenStatus(BuildContext context) => context.isDark ? const Color(0xff54C166) : green70.withOpacity(.5); + static Color greenStatus(BuildContext context) => context.isDark ? completedColor : green70.withOpacity(.5); + + static Color unassignedStatus(BuildContext context) => context.isDarkNotListen ? unassignedColor : white936; // static Color blueStatus(BuildContext context) => context.isDark ? primary40 : primary50; static Color blueStatus(BuildContext context) => context.isDark ? primary40 : primary90; @@ -117,7 +120,7 @@ class AppColor { // static Color yellowStatus(BuildContext context) => context.isDark ? const Color(0xffFFDA76) : orange40; static Color yellowStatus(BuildContext context) => context.isDark ? const Color(0xffFFC945) : orange30; - static Color yellowIcon(BuildContext context) => context.isDark ? const Color(0xffFFC945) : orange70; + static Color yellowIcon(BuildContext context) => context.isDarkNotListen ? const Color(0xffFFC945) : orange70; static Color background(BuildContext context) => context.isDark ? containerDark : Colors.white; @@ -149,7 +152,7 @@ class AppColor { static Color text9Color(BuildContext context) => context.isDark ? white10 : neutral120; - static Color lightTextColor(BuildContext context) => context.isDark ? white10 : neutral120; + static Color lightTextColor(BuildContext context) => context.isDark ? whiteF3 : neutral120; static Color iconColor(BuildContext context) => context.isDark ? neutral30 : neutral50; diff --git a/lib/new_views/common_widgets/tab_button.dart b/lib/new_views/common_widgets/tab_button.dart index 1493683c..872ae2cf 100644 --- a/lib/new_views/common_widgets/tab_button.dart +++ b/lib/new_views/common_widgets/tab_button.dart @@ -35,11 +35,73 @@ class TabButton extends StatelessWidget { label, style: AppTextStyles.bodyText2.copyWith( //AppColor.background(context) - color: isSelected ? Colors.white :AppColor.textColor(context) , + color: isSelected ? Colors.white : AppColor.textColor(context), ), ), ), ), - ).toShimmer(isShow: loading && isSelected, radius: 7,context: context); + ).toShimmer(isShow: loading && isSelected, radius: 7, context: context); + } +} + +class RequestTypeButton extends StatelessWidget { + final String label; + final String icon; + final Color iconColor; + final bool isSelected; + final int count; + final bool loading; + final VoidCallback onPressed; + + const RequestTypeButton({Key? key, required this.label, required this.icon, required this.iconColor, this.isSelected = false, required this.count, this.loading = false, required this.onPressed}) + : super(key: key); + + @override + Widget build(BuildContext context) { + // InkWell( + // onTap: onPressed, + // child: CustomBadge( + // value: loading + // ? 0 + // : !isSelected + // ? 0 + // : count, + // child: Container( + // padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 8), + // decoration: BoxDecoration( + // borderRadius: BorderRadius.circular(7), + // color: isSelected ? AppColor.primary10 : AppColor.background(context), + // border: !isSelected ? Border.all(color: AppColor.white936.withOpacity(.03), width: 1) : null, + // ), + // alignment: Alignment.center, + // child: Text( + // label, + // style: AppTextStyles.bodyText2.copyWith( + // //AppColor.background(context) + // color: isSelected ? Colors.white : AppColor.textColor(context), + // ), + // ), + // ), + // ), + // ).toShimmer(isShow: loading && isSelected, radius: 7, context: context); + + return CustomBadge( + value: loading ? 0 : count, + positionR: -4, + positionT: -4, + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.end, + spacing: 0, + children: [ + icon.toSvgAsset(height: 26, width: 26, color: iconColor).toShimmer(isShow: loading, context: context).center.expanded, + Text( + label, + textAlign: TextAlign.center, + style: AppTextStyles.textStyle9.copyWith(color: AppColor.headingTextColor(context)), + ).toShimmer(isShow: loading, context: context), + ], + ).toShadowContainer(context, borderColor: isSelected ? AppColor.primary10 : null, borderRadius: 16, paddingObject: const EdgeInsets.symmetric(horizontal: 12, vertical: 12)), + ).onPress(onPressed).paddingOnly(end: 4, top: 4); } }