diff --git a/lib/controllers/providers/api/all_requests_provider.dart b/lib/controllers/providers/api/all_requests_provider.dart index 002350ec..e7f58c52 100644 --- a/lib/controllers/providers/api/all_requests_provider.dart +++ b/lib/controllers/providers/api/all_requests_provider.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'dart:developer'; import 'package:flutter/widgets.dart'; import 'package:http/http.dart'; @@ -18,9 +19,18 @@ class AllRequestsProvider extends ChangeNotifier { bool isHighPriorityLoading = false; bool isCalendarLoading = false; bool _isFilterRequestLoading = false; + bool _isRequestCategoryLoading = false; + int _status =0; + int get status => _status; + + set status(int value) { + _status = value; + notifyListeners(); + } + int _currentListIndex = 0; int get currentListIndex => _currentListIndex; @@ -37,6 +47,23 @@ class AllRequestsProvider extends ChangeNotifier { AllRequestsAndCount _inProgressRequests; AllRequestsAndCount _completedRequests; AllRequestsAndCount _filterRequest; + AllRequestsAndCount _requestDetailList; + + AllRequestsAndCount get requestDetailList => _requestDetailList; + + set requestDetailList(AllRequestsAndCount value) { + _requestDetailList = value; + notifyListeners(); + } + + AllRequestsAndCount _selectedRequestCategory; + + bool get isRequestCategoryLoading => _isRequestCategoryLoading; + + set isRequestCategoryLoading(bool value) { + _isRequestCategoryLoading = value; + notifyListeners(); + } // overdue,high priority, new , completed AllRequestsAndCount overdueRequests; AllRequestsAndCount highPriorityRequests; @@ -73,13 +100,13 @@ class AllRequestsProvider extends ChangeNotifier { stateCode = null; } - Future getRequests() async { + Future getRequests() { resetRequestsApiData(); - await getHighPriorityRequests(pagination: true); - await getOverdueRequests(pagination: true); - await getOpenRequests(pagination: true); - await getInProgressRequests(pagination: true); - await getCompletedRequests(pagination: true); + getOpenRequests(pagination: true); + getInProgressRequests(pagination: true); + getCompletedRequests(pagination: true); + getHighPriorityRequests(pagination: true); + getOverdueRequests(pagination: true); } SearchAllRequestsModel searchedModel; @@ -184,7 +211,7 @@ class AllRequestsProvider extends ChangeNotifier { if (highPriorityRequests == null || pagination) { isHighPriorityLoading = true; - notifyListeners(); + // notifyListeners(); } Response response; try { @@ -336,7 +363,7 @@ class AllRequestsProvider extends ChangeNotifier { } Future getInProgressRequests({bool pagination = false, bool reset = false}) async { - print('get inprogress request called..'); + if (isInProgressLoading == true) return -2; if (reset) { inProgressRequests = null; @@ -354,6 +381,7 @@ class AllRequestsProvider extends ChangeNotifier { "priority": [], "displayData": [] }; + if (pagination) { body["pageNumber"] = 0; body["pageSize"] = 0; @@ -362,18 +390,14 @@ class AllRequestsProvider extends ChangeNotifier { body["pageSize"] = pageItemNumber; } response = await ApiManager.instance.post(URLs.getAllRequestsAndCount, body: body); - print('response body of inprogress is ${response.body}'); stateCode = response.statusCode; print('state code is $stateCode'); if (response.statusCode >= 200 && response.statusCode < 300) { if (inProgressRequests == null) { - print('in in null check...'); inProgressRequests = AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]); notifyListeners(); - print('data in null check is ${inProgressRequests.requestsDetails.length}'); } else { inProgressRequests.requestsDetails.addAll(AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]).requestsDetails); - print('data i have in provider is ${inProgressRequests.requestsDetails.length}'); notifyListeners(); } if (inProgressRequests.requestsDetails.length >= pageItemNumber) { @@ -386,6 +410,7 @@ class AllRequestsProvider extends ChangeNotifier { allRequestsAndCount = null; } isInProgressLoading = false; + print('value of inProgress loading in provider is $isInProgressLoading'); notifyListeners(); return response.statusCode; } catch (error) { @@ -395,36 +420,30 @@ class AllRequestsProvider extends ChangeNotifier { return -1; } } - Future getFilterRequests({bool pagination = false, int status}) async { + + Future getFilterRequests({bool showLoader = true, int status}) async { // if (filterRequest == null || pagination) { // isFilterRequestLoading = true; // notifyListeners(); // } - isFilterRequestLoading = true; + isFilterRequestLoading =showLoader; Response response; try { Map body = { "typeTransaction": [1, 2, 3, 4], "statusTransaction": [status], "priority": [], - "displayData": [] + "displayData": [], + "pageNumber": pageNum, + "pageSize" : pageItemNumber, }; - if (pagination) { - body["pageNumber"] = 0; - body["pageSize"] = 0; - } else { - body["pageNumber"] = pageNum++; - body["pageSize"] = pageItemNumber; - } response = await ApiManager.instance.post(URLs.getAllRequestsAndCount, body: body); - print('response body is ${response.body}'); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { if (filterRequest == null) { filterRequest = AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]); isFilterRequestLoading = false; notifyListeners(); - print('filter list data in provider is ${filterRequest.requestsDetails.length}'); } else { filterRequest.requestsDetails.addAll(AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]).requestsDetails); isFilterRequestLoading = false; @@ -449,6 +468,35 @@ class AllRequestsProvider extends ChangeNotifier { return -1; } } + Future getSelectedRequestCategory({RequestQueryModel requestQueryModel}) async { + isRequestCategoryLoading =requestQueryModel.showLoader; + Response response; + try { + response = await ApiManager.instance.post(URLs.getAllRequestsAndCount, body: requestQueryModel.toJson()); + stateCode = response.statusCode; + if (response.statusCode >= 200 && response.statusCode < 300) { + if (selectedRequestCategory == null) { + selectedRequestCategory = AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]); + isRequestCategoryLoading = false; + notifyListeners(); + } else { + selectedRequestCategory.requestsDetails.addAll(AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]).requestsDetails); + isRequestCategoryLoading = false; + notifyListeners(); + } + } else { + filterRequest = null; + } + isRequestCategoryLoading = false; + notifyListeners(); + return response.statusCode; + } catch (error) { + isRequestCategoryLoading = false; + stateCode = -1; + notifyListeners(); + return -1; + } + } Future getCompletedRequests({bool pagination = false, bool reset = false}) async { if (isCompleteLoading == true) return -2; @@ -540,6 +588,13 @@ class AllRequestsProvider extends ChangeNotifier { notifyListeners(); } + AllRequestsAndCount get selectedRequestCategory => _selectedRequestCategory; + + set selectedRequestCategory(AllRequestsAndCount value) { + _selectedRequestCategory = value; + notifyListeners(); + } + // Future getCloseRequests() async { // if (isCloseLoading == true) return -2; // isCloseLoading = true; diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index e3890ddc..aa865b04 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -30,6 +30,7 @@ class ServiceRequestsProvider extends ChangeNotifier { // number of items call in each request final pageItemNumber = 10; + //reset provider data void reset() { workOrders = []; diff --git a/lib/dashboard_latest/dashboard_view.dart b/lib/dashboard_latest/dashboard_view.dart index b5bf1cf6..1a544913 100644 --- a/lib/dashboard_latest/dashboard_view.dart +++ b/lib/dashboard_latest/dashboard_view.dart @@ -42,10 +42,12 @@ class _DashboardViewState extends State { AllRequestsProvider allRequestsProvider; NotificationsProvider notificationsProvider; + ScrollController _scrollController; @override void initState() { super.initState(); + handleScroll(); getInitialData(); } @@ -54,6 +56,7 @@ class _DashboardViewState extends State { userProvider = Provider.of(context, listen: false); settingProvider = Provider.of(context, listen: false); allRequestsProvider = Provider.of(context, listen: false); + notificationsProvider = Provider.of(context, listen: false); user = userProvider.user; await getAllRequests(); @@ -74,20 +77,32 @@ class _DashboardViewState extends State { allRequestsProvider.currentListIndex = 0; allRequestsProvider.filterRequest = null; var tabs = RequestUtils.getTabs(userType: userProvider.user.type, context: context); - Future.wait([ - allRequestsProvider.getRequests(), - allRequestsProvider.getFilterRequests(pagination: false, status: tabs[0]['status']), - ]).whenComplete(() { + allRequestsProvider.status = tabs[0]['status']; + allRequestsProvider.getRequests(); + allRequestsProvider.pageNum = 1; + allRequestsProvider.getFilterRequests(showLoader: true, status: tabs[0]['status']).whenComplete(() { + allRequestsProvider.requestDetailList = allRequestsProvider.filterRequest; + }); allRequestsProvider.isAllLoading = false; - }); + notificationsProvider.getSystemNotifications(user: userProvider.user, resetProvider: true); + } - print('user provider user data is ${userProvider.user.type}'); - await notificationsProvider.getSystemNotifications(user: userProvider.user, resetProvider: true); + void handleScroll() async{ + _scrollController = ScrollController(); + _scrollController.addListener(() async { + if (_scrollController?.position?.pixels == + _scrollController?.position?.maxScrollExtent && + !allRequestsProvider.isFilterRequestLoading) { + allRequestsProvider.pageNum = allRequestsProvider.pageNum + 1; + await allRequestsProvider.getFilterRequests(showLoader:false,status: allRequestsProvider.status); + } + }); } @override void dispose() { + _scrollController.dispose(); super.dispose(); } @@ -102,35 +117,27 @@ class _DashboardViewState extends State { )), body: RefreshIndicator( onRefresh: () async { - await getInitialData(); + getInitialData(); return Future.delayed(const Duration(milliseconds: 250)); }, - child: SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - Text( - context.translation.welcome, - style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), - ), - Text( - user == null ? "" : (user?.username ?? ""), - style: AppTextStyles.heading2.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50, fontWeight: FontWeight.w600), - ), - // 24.height, - - ProgressFragment(), - 35.height, - SizedBox(height: 105.toScreenHeight, child: const RequestsFragment()), - const RequestCategoryFragment() - ], - ).paddingOnly(start: 16, end: 16, top: 0, bottom: 8), - ], + child: Scrollbar( + controller: _scrollController, + child: SingleChildScrollView( + // physics: AlwaysScrollableScrollPhysics(), + controller: _scrollController, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + 14.height, + ProgressFragment(), + 25.height, + SizedBox( + height: 110.toScreenHeight, child: const RequestsFragment()), + 16.height, + const RequestCategoryFragment() + ], + ).paddingOnly(start: 16, end: 16, top: 0, bottom: 8), ), ), ), diff --git a/lib/dashboard_latest/widgets/app_bar_widget.dart b/lib/dashboard_latest/widgets/app_bar_widget.dart index 451436d7..09500dac 100644 --- a/lib/dashboard_latest/widgets/app_bar_widget.dart +++ b/lib/dashboard_latest/widgets/app_bar_widget.dart @@ -5,6 +5,7 @@ import 'package:test_sa/controllers/providers/api/notifications_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_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:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/views/pages/user/notifications/notifications_page.dart'; @@ -14,20 +15,21 @@ import '../../models/user.dart'; class AppBarWidget extends StatelessWidget { final VoidCallback onDrawerPress; + const AppBarWidget({Key key, this.onDrawerPress}) : super(key: key); @override Widget build(BuildContext context) { - return AppBar( + return AppBar( automaticallyImplyLeading: false, backgroundColor: Theme.of(context).scaffoldBackgroundColor, titleSpacing: 0, - title: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Consumer(builder: (context, snapshot, _) { - return CircleAvatar( + title: Consumer(builder: (context, snapshot, _) { + return Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + CircleAvatar( radius: 24, backgroundColor: context.isDark ? AppColor.neutral50 : AppColor.neutral40, child: Padding( @@ -36,15 +38,27 @@ class AppBarWidget extends StatelessWidget { child: snapshot.profileImage != null ? Image.file(snapshot.profileImage) : (snapshot.user.profilePhotoName?.isNotEmpty ?? false) - ? Image.network(snapshot.user.profilePhotoName) - : const Icon(Icons.person, size: 24, color: Colors.white), + ? Image.network(snapshot.user.profilePhotoName) + : const Icon(Icons.person, size: 24, color: Colors.white), ), ), - ); - }).onPress(onDrawerPress), - const Spacer(), - Consumer( - builder: (context, settingProvider,child) { + ).onPress(onDrawerPress), + 8.width, + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + snapshot.user == null ? "" : (snapshot.user?.username ?? ""), + style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50, fontWeight: FontWeight.w600), + ), + Text( + snapshot.user == null ? "" : snapshot.user?.type?.name?.toCamelCase ?? "", + style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), + ), + ], + ), + const Spacer(), + Consumer(builder: (context, settingProvider, child) { return Container( padding: const EdgeInsets.fromLTRB(12, 6, 6, 6), decoration: BoxDecoration( @@ -71,11 +85,11 @@ class AppBarWidget extends StatelessWidget { underline: const SizedBox.shrink(), onChanged: (newValue) { if (settingProvider.assetGroup != newValue) { - settingProvider.setAssetGroup(newValue); - WidgetsBinding.instance.addPostFrameCallback((_) { - Provider.of(context, listen: false).getRequests(); - Provider.of(context, listen: false).getSystemNotifications(user: Provider.of(context, listen: false).user, resetProvider: true); - }); + settingProvider.setAssetGroup(newValue); + WidgetsBinding.instance.addPostFrameCallback((_) { + Provider.of(context, listen: false).getRequests(); + Provider.of(context, listen: false).getSystemNotifications(user: Provider.of(context, listen: false).user, resetProvider: true); + }); } }, items: Provider.of(context, listen: false).user.assetGroups.map>((value) { @@ -89,32 +103,32 @@ class AppBarWidget extends StatelessWidget { })?.toList(), ), ); - } - ), - 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 - // Positioned( - // top: 0, - // right: 0, - // child: Container( - // padding: const EdgeInsets.all(4), - // decoration: const ShapeDecoration( - // color: Color(0xFFD02127), - // shape: CircleBorder(), - // ), - // child: Text("", style: AppTextStyles.bodyText), - // ), - // ) - ], - ).onPress(() { - Navigator.of(context).pushNamed(NotificationsPage.id); - }), - ], - ).paddingOnly(start: 16, end: 16), + }), + 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 + // Positioned( + // top: 0, + // right: 0, + // child: Container( + // padding: const EdgeInsets.all(4), + // decoration: const ShapeDecoration( + // color: Color(0xFFD02127), + // shape: CircleBorder(), + // ), + // child: Text("", style: AppTextStyles.bodyText), + // ), + // ) + ], + ).onPress(() { + Navigator.of(context).pushNamed(NotificationsPage.id); + }), + ], + ).paddingOnly(start: 16, end: 16); + }), ); } } diff --git a/lib/extensions/widget_extensions.dart b/lib/extensions/widget_extensions.dart index 75b08f86..9d5bb524 100644 --- a/lib/extensions/widget_extensions.dart +++ b/lib/extensions/widget_extensions.dart @@ -12,7 +12,7 @@ extension WidgetExtensions on Widget { Widget get center => Center(child: this); - BoxShadow get boxShadowR14 => BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 14, offset: const Offset(0, 0), spreadRadius: 0); + BoxShadow get boxShadowR14 => BoxShadow(color: Colors.black.withOpacity(0.03), blurRadius: 14, offset: const Offset(0, 0), spreadRadius: 0); Widget circle(double value) => ClipRRect(borderRadius: BorderRadius.circular(value), child: this); @@ -56,7 +56,7 @@ extension WidgetExtensions on Widget { width: double.infinity, decoration: ShapeDecoration( color: AppColor.background(context), - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(14)), shadows: [boxShadowR14], ), child: this, diff --git a/lib/models/all_requests_and_count_model.dart b/lib/models/all_requests_and_count_model.dart index aa04552a..62032ca6 100644 --- a/lib/models/all_requests_and_count_model.dart +++ b/lib/models/all_requests_and_count_model.dart @@ -1,3 +1,5 @@ +import 'dart:convert'; + class AllRequestsAndCount { CountServiceRequest countServiceRequest; CountServiceRequest countGasRefill; @@ -187,3 +189,56 @@ class RequestsDetails { return data; } } + + +class RequestQueryModel { + List typeTransaction; + List statusTransaction; + List priority; + List displayData; + int pageNumber; + int pageSize; + bool showLoader; + + RequestQueryModel({ + this.typeTransaction, + this.statusTransaction, + this.priority, + this.displayData, + this.pageNumber=1, + this.pageSize=10, + this.showLoader = true, + }); + + // Factory method to create an instance from a JSON map + factory RequestQueryModel.fromJson(Map json) { + return RequestQueryModel( + typeTransaction: List.from(json['typeTransaction']), + statusTransaction: List.from(json['statusTransaction']), + priority: List.from(json['priority']), + displayData: List.from(json['displayData']), + pageNumber: json['pageNumber'], + pageSize: json['pageSize'], + ); + } + + // Method to convert an instance to a JSON map + Map toJson() { + return { + 'typeTransaction': typeTransaction, + 'statusTransaction': statusTransaction, + 'priority': priority, + 'displayData': displayData, + 'pageNumber': pageNumber, + 'pageSize': pageSize, + }; + } + + // Method to encode the model to a JSON string + String encodeToJson() => json.encode(toJson()); + + // Method to decode the model from a JSON string + static RequestQueryModel decodeFromJson(String jsonString) => + RequestQueryModel.fromJson(json.decode(jsonString)); +} + diff --git a/lib/new_views/app_style/app_color.dart b/lib/new_views/app_style/app_color.dart index f8968378..7dccad98 100644 --- a/lib/new_views/app_style/app_color.dart +++ b/lib/new_views/app_style/app_color.dart @@ -25,20 +25,23 @@ class AppColor { static const Color neutral90 = Color(0xffF7F9FB); static const Color neutral100 = Color(0xffF4F6FC); + //background static const Color backgroundLight = Color(0xfff7f9fb); static const Color backgroundDark = Color(0xff111427); //white + static const Color white10 = Color(0xffFFFFFF); static const Color white20 = Color(0xffF7F9FB); static const Color white30 = Color(0xffE7EBF2); + static const Color white40 = Color(0xffE4EBEE); //black static const Color balck10 = Color(0xff3B3D4A); //red + static const Color red30 = Color(0xffF63939); static const Color red40 = Color(0xffFFDBDC); - static const Color red50 = Color(0xffD02127); static const Color red60 = Color(0xff8C050A); @@ -49,9 +52,11 @@ class AppColor { static const Color green70 = Color(0xff54C166); //orange + static const Color orange30 = Color(0xffFDE19B); static const Color orange40 = Color(0xffFFEDBC); static const Color orange50 = Color(0xffCC9B14); static const Color orange60 = Color(0xff886400); + static const Color orange70 = Color(0xffFFC945); // static Color greenStatus(BuildContext context) => context.isDark ? const Color(0xff1FA269) : green50; static Color greenStatus(BuildContext context) => context.isDark ? const Color(0xff54C166) : green50; @@ -59,10 +64,11 @@ class AppColor { // static Color blueStatus(BuildContext context) => context.isDark ? primary40 : primary50; static Color blueStatus(BuildContext context) => context.isDark ? primary40 : primary50; - static Color redStatus(BuildContext context) => context.isDark ? const Color(0xffFFB6B8) : red40; + static Color redStatus(BuildContext context) => context.isDark ? const Color(0xffFFB6B8) : red30; // static Color yellowStatus(BuildContext context) => context.isDark ? const Color(0xffFFDA76) : orange40; - static Color yellowStatus(BuildContext context) => context.isDark ? const Color(0xffFFC945) : 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 background(BuildContext context) => context.isDark ? neutral60 : Colors.white; @@ -77,7 +83,7 @@ class AppColor { case "in progress": return orange60; case "high priority": - return red60; + return white10; default: return Colors.white; } @@ -142,10 +148,12 @@ class AppColor { static Color getPriorityStatusTextColor(BuildContext context, int id) { switch (id) { + //low priority case 81: return Colors.white; case 82: - return red60; + //high priority + return white10; default: return blueStatus(context); } @@ -153,8 +161,10 @@ class AppColor { static Color getPriorityStatusColor(BuildContext context, int id) { switch (id) { + //low priority case 81: return greenStatus(context); + //high priority case 82: return redStatus(context); default: diff --git a/lib/new_views/common_widgets/custom_badge.dart b/lib/new_views/common_widgets/custom_badge.dart new file mode 100644 index 00000000..0ca7b9ea --- /dev/null +++ b/lib/new_views/common_widgets/custom_badge.dart @@ -0,0 +1,45 @@ +import 'package:flutter/material.dart'; +import 'package:test_sa/new_views/app_style/app_color.dart'; + +class CustomBadge extends StatelessWidget { + final Widget child; // The widget that the badge will be overlaid on. + final String value; // The value or text to be displayed in the badge. + final Color color; // The background color of the badge. + + const CustomBadge({ + Key key, + @required this.child, + @required this.value, + this.color =AppColor.red30, // Default color is red + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Stack( + clipBehavior: Clip.none, // Allows the badge to overflow its container. + children: [ + child, // The main widget + Positioned( + right: -6, + top: -6, + child: Container( + padding: const EdgeInsets.all(6), + decoration: BoxDecoration( + color: color, + shape: BoxShape.circle, // Makes the badge circular + ), + child: Text( + value, + style: const TextStyle( + color: AppColor.white10, + fontFamily: 'Poppins', + fontSize: 10, + fontWeight: FontWeight.w700, + ), + ), + ), + ), + ], + ); + } +} \ No newline at end of file diff --git a/lib/new_views/common_widgets/tab_button.dart b/lib/new_views/common_widgets/tab_button.dart index 505f941a..75bd44e4 100644 --- a/lib/new_views/common_widgets/tab_button.dart +++ b/lib/new_views/common_widgets/tab_button.dart @@ -3,6 +3,7 @@ import 'package:badges/badges.dart' as badges; 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'; +import 'package:test_sa/new_views/common_widgets/custom_badge.dart'; class TabButton extends StatelessWidget { final String label; @@ -25,15 +26,8 @@ class TabButton extends StatelessWidget { return InkWell( onTap: onPressed, child: count != null && count > 0 && isSelected && !loading - ? badges.Badge( - badgeContent: Text( - count.toString(), - style: const TextStyle( - color: AppColor.white20, - fontWeight: FontWeight.normal, - ), - ), - badgeStyle: const badges.BadgeStyle(padding: EdgeInsets.symmetric(horizontal: 5, vertical: 3), badgeColor: AppColor.red50), + ? CustomBadge( + value: count.toString(), child: Container( padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 8), decoration: BoxDecoration( @@ -48,8 +42,7 @@ class TabButton extends StatelessWidget { color: isSelected ? Colors.white : Colors.black, ), )), - ).toShimmer(isShow: loading, radius: 7), - ) + )) : Container( padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 8), decoration: BoxDecoration( @@ -64,7 +57,7 @@ class TabButton extends StatelessWidget { color: isSelected ? Colors.white : Colors.black, ), )), - ).toShimmer(isShow: loading, radius: 7), + ), ); } } diff --git a/lib/new_views/pages/land_page/dashboard_fragments/progress_fragment.dart b/lib/new_views/pages/land_page/dashboard_fragments/progress_fragment.dart index 3015288c..409d9714 100644 --- a/lib/new_views/pages/land_page/dashboard_fragments/progress_fragment.dart +++ b/lib/new_views/pages/land_page/dashboard_fragments/progress_fragment.dart @@ -175,29 +175,24 @@ class ProgressFragment extends StatelessWidget { bool isCurrentUserNotEngineer = (_userProvider.user.type != UsersTypes.engineer); return Consumer( builder: (context, snapshot, _) { - // WidgetsBinding.instance.addPostFrameCallback((_) { - // if (_provider == null) { - // _provider = snapshot; - // if (isCurrentUserNotEngineer) { - // _provider.getOpenRequests(reset: true); - // } - // _provider.getInProgressRequests(reset:true); - // _provider.getCompletedRequests(reset:true); - // } - // - // }); - int total = (snapshot.completedRequests?.total?.count ?? 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.greenStatus(context)), + ChartData('Completed', snapshot.completedRequests?.total?.count?.toDouble() ?? 0.0, AppColor.green50), // 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.yellowStatus(context)), + ChartData('In Progress', snapshot.inProgressRequests?.total?.count?.toDouble() ?? 0.0, AppColor.orange70), ]; if (isCurrentUserNotEngineer) { chartData.insert(1, ChartData('Open', snapshot.openRequests?.total?.count?.toDouble() ?? 0.0, AppColor.blueStatus(context))); } + print('conditon value is ${ + snapshot.isInProgressLoading + }');print('conditon value is ${ + snapshot.isCompleteLoading + }');print('conditon value is ${ + snapshot.isOpenLoading + }'); return Column( children: [ @@ -214,8 +209,8 @@ class ProgressFragment extends StatelessWidget { textStyle: context.isDark ? null : const TextStyle(color: Colors.black87, fontSize: 12), ), legend: Legend( - //isVisible: true, - ), + //isVisible: true, + ), series: [ DoughnutSeries( dataSource: chartData, @@ -232,7 +227,7 @@ class ProgressFragment extends StatelessWidget { //useSeriesColor: true, ), ) - ]).toShimmer(isShow: snapshot.isAllLoading, radius: 300).paddingAll(12).toShadowContainer(context), + ]).toShimmer(isShow: snapshot.isInProgressLoading || snapshot.isCompleteLoading || snapshot.isOpenLoading, radius: 250).paddingAll(12).toShadowContainer(context), Column( mainAxisSize: MainAxisSize.min, children: [ @@ -263,4 +258,3 @@ class ChartData { final double y; final Color color; } - diff --git a/lib/new_views/pages/land_page/dashboard_fragments/request_category_fragment.dart b/lib/new_views/pages/land_page/dashboard_fragments/request_category_fragment.dart index 16e35b66..fad13590 100644 --- a/lib/new_views/pages/land_page/dashboard_fragments/request_category_fragment.dart +++ b/lib/new_views/pages/land_page/dashboard_fragments/request_category_fragment.dart @@ -87,67 +87,33 @@ import 'package:test_sa/new_views/pages/land_page/dashboard_fragments/request_ca import 'package:test_sa/utilities/request_utils.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; -class RequestCategoryFragment extends StatefulWidget { - // final AllRequestsAndCount allRequestsAndCount; - - // const RequestCategoryFragment({Key key, this.allRequestsAndCount}) : super(key: key); +class RequestCategoryFragment extends StatelessWidget { const RequestCategoryFragment({ Key key, }) : super(key: key); - @override - State createState() => _RequestCategoryFragmentState(); -} - -class _RequestCategoryFragmentState extends State { - @override - void initState() { - // TODO: implement initState - // getInitialList(); - print('init state called...'); - super.initState(); - } - - // Future getInitialList() async { - // UserProvider userProvider = Provider.of(context, listen: false); - // - // AllRequestsProvider allRequestsProvider = Provider.of(context, listen: false); - // UsersTypes usersType = userProvider.user.type; - // var tabs = RequestUtils.getTabs(userType: usersType, context: context); - // allRequestsProvider.currentListIndex = 0; - // allRequestsProvider.filterRequest = null; - // await allRequestsProvider.getFilterRequests(pagination: false, status: tabs[0]['status']); - // - // print('tabs lenght is ${tabs.length}'); - // } - @override Widget build(BuildContext context) { return Consumer(builder: (context, allRequestProvider, child) { return Column(mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ - context.translation.allRequests.heading4(context).paddingOnly(top: 16, bottom: 16), + context.translation.allRequests.heading4(context), + 16.height, getTabs( requestsProvider: allRequestProvider, context: context, userType: Provider.of(context, listen: false).user.type, ), - // Row( - // children: _buildTabButtons(isEngineer: Provider.of(context, listen: false).user.type == UsersTypes.engineer, allRequestsProvider: allRequestProvider), - // ), - 10.height, - allRequestProvider.isFilterRequestLoading||allRequestProvider.filterRequest==null?Column( - mainAxisSize: MainAxisSize.max, - children: List.generate( 3 , (index) { - return Padding( - padding: EdgeInsets.symmetric(vertical: 10.toScreenHeight,horizontal: 0), - child: const SizedBox().toRequestShimmer(context, allRequestProvider.isFilterRequestLoading), - ); - })): RequestCategoryList(allRequestProvider.filterRequest.requestsDetails ?? [], allRequestProvider.isFilterRequestLoading), - // if (allRequestProvider.isLoadingList) ...[ - // const Center(child: CircularProgressIndicator()), - // ] else ...[ - // RequestCategoryList(allRequestProvider.dashBoardFilterList?.requestsDetails ?? [], allRequestProvider.dashBoardFilterListLoading), - // ] + 16.height, + allRequestProvider.isFilterRequestLoading || allRequestProvider.filterRequest == null + ? Column( + mainAxisSize: MainAxisSize.max, + children: List.generate(3, (index) { + return Padding( + padding: EdgeInsets.symmetric(vertical: 10.toScreenHeight, horizontal: 0), + child: const SizedBox().toRequestShimmer(context, allRequestProvider.isFilterRequestLoading), + ); + })) + : RequestCategoryList(allRequestProvider.filterRequest.requestsDetails ?? [], allRequestProvider.isFilterRequestLoading, allRequestProvider.filterRequest.total.count), ]); }); } @@ -194,7 +160,9 @@ class _RequestCategoryFragmentState extends State { count: requestsProvider.filterRequest != null ? requestsProvider.filterRequest.total.count : 0, onPressed: () async { requestsProvider.currentListIndex = selectedTab; - requestsProvider.filterRequest = null; + requestsProvider.filterRequest = null; + requestsProvider.pageNum = 1; + requestsProvider.status = status; await requestsProvider.getFilterRequests(status: status); requestsProvider.isInProgressLoading = false; requestsProvider.pageNum = 1; diff --git a/lib/new_views/pages/land_page/dashboard_fragments/request_category_list.dart b/lib/new_views/pages/land_page/dashboard_fragments/request_category_list.dart index 099cc983..d461bd22 100644 --- a/lib/new_views/pages/land_page/dashboard_fragments/request_category_list.dart +++ b/lib/new_views/pages/land_page/dashboard_fragments/request_category_list.dart @@ -1,6 +1,9 @@ import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/all_requests_provider.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/models/all_requests_and_count_model.dart'; +import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/pages/land_page/requests/asset_item_view.dart'; import 'package:test_sa/new_views/pages/land_page/requests/gas_refill_item_view.dart'; import 'package:test_sa/new_views/pages/land_page/requests/ppm_item_view.dart'; @@ -8,25 +11,33 @@ import 'package:test_sa/new_views/pages/land_page/requests/service_request_item_ class RequestCategoryList extends StatelessWidget { final List list; + final int totalCount; final bool isLoading; - - const RequestCategoryList(this.list, this.isLoading, {Key key}) - : super(key: key); + const RequestCategoryList(this.list, this.isLoading, this.totalCount, {Key key}) : super(key: key); @override Widget build(BuildContext context) { - return Column( - mainAxisSize: MainAxisSize.min, - children: List.generate(isLoading ? 6 : list.length, (index) { - // if (isLoading) { - // return const SizedBox().toRequestShimmer(context, isLoading); - // } - // else { - return Padding( - padding: EdgeInsets.symmetric(vertical: 10.toScreenHeight), - child: _buildRequestItem(list[index])); - // } - })); + return ListView.builder( + itemCount: list.length < totalCount ? list.length + 1 : list.length, + shrinkWrap: true, + physics:const NeverScrollableScrollPhysics(), + itemBuilder: (context, index) { + if (index == list.length) { + return ListTile( + title: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: const [ + CircularProgressIndicator( + color: AppColor.primary10, + strokeWidth: 1, + ), + ], + ), + ); + } + return Padding(padding: EdgeInsets.symmetric(vertical: 10.toScreenHeight), child: _buildRequestItem(list[index])); + }, + ); } Widget _buildRequestItem(RequestsDetails request) { @@ -52,3 +63,16 @@ class RequestCategoryList extends StatelessWidget { } } } + +// return Column( +// mainAxisSize: MainAxisSize.min, +// children: List.generate(isLoading ? 6 : list.length, (index) { +// // if (isLoading) { +// // return const SizedBox().toRequestShimmer(context, isLoading); +// // } +// // else { +// return Padding( +// padding: EdgeInsets.symmetric(vertical: 10.toScreenHeight), +// child: _buildRequestItem(list[index])); +// // } +// })); diff --git a/lib/new_views/pages/land_page/dashboard_fragments/requests_fragment.dart b/lib/new_views/pages/land_page/dashboard_fragments/requests_fragment.dart index c3d4ddac..0885c3fe 100644 --- a/lib/new_views/pages/land_page/dashboard_fragments/requests_fragment.dart +++ b/lib/new_views/pages/land_page/dashboard_fragments/requests_fragment.dart @@ -1,121 +1,15 @@ -//older code.... -// 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: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: GridView( -// padding: const EdgeInsets.only(left: 16, right: 16, bottom: 16), -// gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2, childAspectRatio: 191 / 237, crossAxisSpacing: 16, mainAxisSpacing: 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 Column( -// crossAxisAlignment: CrossAxisAlignment.start, -// children: [ -// Row( -// crossAxisAlignment: CrossAxisAlignment.start, -// children: [ -// 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), -// ], -// ).expanded, -// 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(); -// }); -// } -// } - - - +// older code.... 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/common_widgets/custom_badge.dart'; import 'package:test_sa/new_views/pages/land_page/requests_list_page.dart'; class RequestsFragment extends StatelessWidget { @@ -124,123 +18,68 @@ class RequestsFragment extends StatelessWidget { @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), - ), + builder: (context, snapshot, _) => GridView( + // padding: const EdgeInsets.only( bottom: 16), + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 4, childAspectRatio: 75 / 84, crossAxisSpacing: 2, mainAxisSpacing: 13), + 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.yellowIcon(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)), + ], ), ); } - 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, - ) { + 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(); - }, + : () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => RequestsListPage(index,title), + ), + ); + }, child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, 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.red50 - ), - child: Container( - child: (icon ?? "") - .toSvgAsset(height: 26, width: 26, color: iconColor) - ?.toShimmer(isShow: isLoading), - ).toShadowCircleContainer(context,padding: 18), - ) + value != null && value > 0 && !isLoading + ? CustomBadge( + value: value.toString(), + 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), + child: (icon ?? "").toSvgAsset(height: 26, width: 26, color: iconColor)?.toShimmer(isShow: isLoading), + ).toShadowCircleContainer(context, padding: 18), 10.height, Text( title, - style: AppTextStyles.bodyText.copyWith( + style: AppTextStyles.tinyFont.copyWith( color: context.isDark ? AppColor.neutral30 : AppColor.neutral50, ), ), @@ -250,6 +89,145 @@ class RequestsFragment extends StatelessWidget { } } +// +// 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'; @@ -500,3 +478,48 @@ class RequestsFragment extends StatelessWidget { // // }); // // } // } +// 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/new_views/pages/land_page/my_request/my_requests_page.dart b/lib/new_views/pages/land_page/my_request/my_requests_page.dart index 4cc643f0..7ee0e6f7 100644 --- a/lib/new_views/pages/land_page/my_request/my_requests_page.dart +++ b/lib/new_views/pages/land_page/my_request/my_requests_page.dart @@ -14,7 +14,6 @@ import 'package:test_sa/new_views/pages/land_page/my_request/all_requests_search import 'package:test_sa/new_views/pages/land_page/widgets/request_item_view_list.dart'; import 'package:test_sa/views/widgets/loaders/lazy_loading.dart'; - class MyRequestsPage extends StatefulWidget { const MyRequestsPage({Key key}) : super(key: key); @@ -31,7 +30,6 @@ class _MyRequestsPageState extends State { @override Widget build(BuildContext context) { - if (_provider == null) { requestsList = [ context.translation.allRequests, @@ -143,7 +141,7 @@ class _MyRequestsPageState extends State { child: RequestItemViewList(snapshot.allRequestsAndCount?.requestsDetails ?? [], snapshot.isAllLoading), nextPage: snapshot.nextPage, onLazyLoad: () { - snapshot.getAllRequests(context, typeTransaction: selectedRequest == 0 ? null : selectedRequest,search: _search); + snapshot.getAllRequests(context, typeTransaction: selectedRequest == 0 ? null : selectedRequest, search: _search); }, ).expanded, ], diff --git a/lib/new_views/pages/land_page/requests/request_paginated_listview.dart b/lib/new_views/pages/land_page/requests/request_paginated_listview.dart new file mode 100644 index 00000000..6856bb94 --- /dev/null +++ b/lib/new_views/pages/land_page/requests/request_paginated_listview.dart @@ -0,0 +1,80 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/all_requests_provider.dart'; +import 'package:test_sa/extensions/int_extensions.dart'; +import 'package:test_sa/models/all_requests_and_count_model.dart'; +import 'package:test_sa/new_views/app_style/app_color.dart'; +import 'package:test_sa/new_views/pages/land_page/requests/asset_item_view.dart'; +import 'package:test_sa/new_views/pages/land_page/requests/gas_refill_item_view.dart'; +import 'package:test_sa/new_views/pages/land_page/requests/ppm_item_view.dart'; +import 'package:test_sa/new_views/pages/land_page/requests/service_request_item_view.dart'; + +class RequestPaginatedList extends StatelessWidget { + final List list; + final int totalCount; + final bool isLoading; + ScrollController scrollController; + RequestPaginatedList(this.list, this.isLoading, this.totalCount,this.scrollController, {Key key}) : super(key: key); + + @override + Widget build(BuildContext context) { + print('count i got is $totalCount'); + return ListView.builder( + itemCount: list.length < totalCount ? list.length + 1 : list.length, + controller: scrollController, + shrinkWrap: true, + itemBuilder: (context, index) { + if (index == list.length) { + return ListTile( + title: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: const [ + CircularProgressIndicator( + color: AppColor.primary10, + strokeWidth: 1, + ), + ], + ), + ); + } + return Padding(padding: EdgeInsets.symmetric(vertical: 10.toScreenHeight), child: _buildRequestItem(list[index])); + }, + ); + } + + Widget _buildRequestItem(RequestsDetails request) { + bool isServiceRequest = request.nameOfType == "ServiceRequest"; + bool isGasRefill = request.nameOfType == "GasRefill"; + bool isAssetTransfer = request.nameOfType == "AssetTransfer"; + bool isPPMs = request.nameOfType == "PPMs"; + + if (isServiceRequest) { + return ServiceRequestItemView(request); + } else if (isGasRefill) { + return GasRefillItemView(request); + } else if (isPPMs) { + return PpmItemView(request); + } else if (isAssetTransfer) { + return AssetItemView(request); + } else { + return Container( + height: 100, + width: double.infinity, + color: Colors.grey, + ); + } + } +} + +// return Column( +// mainAxisSize: MainAxisSize.min, +// children: List.generate(isLoading ? 6 : list.length, (index) { +// // if (isLoading) { +// // return const SizedBox().toRequestShimmer(context, isLoading); +// // } +// // else { +// return Padding( +// padding: EdgeInsets.symmetric(vertical: 10.toScreenHeight), +// child: _buildRequestItem(list[index])); +// // } +// })); diff --git a/lib/new_views/pages/land_page/requests/service_request_item_view.dart b/lib/new_views/pages/land_page/requests/service_request_item_view.dart index 28a5c5ff..3fe215b4 100644 --- a/lib/new_views/pages/land_page/requests/service_request_item_view.dart +++ b/lib/new_views/pages/land_page/requests/service_request_item_view.dart @@ -7,9 +7,7 @@ import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/all_requests_and_count_model.dart'; import 'package:test_sa/models/service_request/service_request.dart'; -import 'package:test_sa/service_request_latest/views/components/history_log_view.dart'; import 'package:test_sa/service_request_latest/views/request_detail_view.dart'; -import 'package:test_sa/views/pages/user/requests/service_request_details.dart'; import '../../../../views/widgets/requests/request_status.dart'; import '../../../app_style/app_color.dart'; @@ -18,10 +16,11 @@ class ServiceRequestItemView extends StatelessWidget { final RequestsDetails request; final bool showShadow; - ServiceRequestItemView(this.request, {Key key, this.showShadow = true}) : super(key: key); + const ServiceRequestItemView(this.request, {Key key, this.showShadow = true}) : super(key: key); @override Widget build(BuildContext context) { + return Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, @@ -52,7 +51,8 @@ class ServiceRequestItemView extends StatelessWidget { '${context.translation.requestNo}: ${request.requestNo}'.bodyText(context), 8.height, Row( - mainAxisSize: MainAxisSize.min, + // mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( context.translation.viewDetails, @@ -74,6 +74,8 @@ class ServiceRequestItemView extends StatelessWidget { builder: (_) => ServiceRequestDetailView( serviceRequest: ServiceRequest(id: request.id.toString()), ))); + // Navigator.of(context).push(MaterialPageRoute( + // builder: (_) => const HistoryLogView())); }); } } diff --git a/lib/new_views/pages/land_page/requests_list_page.dart b/lib/new_views/pages/land_page/requests_list_page.dart index d6e33f08..105b246a 100644 --- a/lib/new_views/pages/land_page/requests_list_page.dart +++ b/lib/new_views/pages/land_page/requests_list_page.dart @@ -2,82 +2,171 @@ 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/user_provider.dart'; import 'package:test_sa/extensions/context_extension.dart'; +import 'package:test_sa/extensions/int_extensions.dart'; +import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/all_requests_and_count_model.dart'; 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/default_app_bar.dart'; +import 'package:test_sa/new_views/pages/land_page/dashboard_fragments/request_category_list.dart'; +import 'package:test_sa/new_views/pages/land_page/requests/request_paginated_listview.dart'; import 'package:test_sa/new_views/pages/land_page/widgets/request_item_view_list.dart'; import 'package:test_sa/views/widgets/loaders/lazy_loading.dart'; -class RequestsListPage extends StatelessWidget { +class RequestsListPage extends StatefulWidget { static const String routeName = "/requests-list-page"; final int index; + final String title; - RequestsListPage(this.index, {Key key}) : super(key: key); + const RequestsListPage(this.index, this.title, {Key key}) : super(key: key); + @override + State createState() => _RequestsListPageState(); +} + +class _RequestsListPageState extends State { AllRequestsProvider _provider; + ScrollController _scrollController; @override - Widget build(BuildContext context) { - bool isEngineer = ApiManager.instance.user.type == UsersTypes.engineer; - if (_provider == null) { - _provider = Provider.of(context, listen: false); - _provider.resetRequestsApiData(); - callRequestApis(); - } - String title = index == 0 - ? context.translation.highPriority - : index == 1 - ? context.translation.overdue - : index == 2 - ? (isEngineer ? context.translation.inProgress : context.translation.newR) - : index == 3 - ? context.translation.completed - : ""; + void initState() { + // TODO: implement initState + _provider = Provider.of(context, listen: false); + _provider.pageNum = 1; + _provider.selectedRequestCategory = null; + _provider.isRequestCategoryLoading = true; + callRequestApis(); + handleScroll(); + super.initState(); + } + + @override + void dispose() { + // TODO: implement dispose + _scrollController.dispose(); + super.dispose(); + } + + void handleScroll() async { + _scrollController = ScrollController(); + int pageNo =1; + _scrollController.addListener(() async { + if (_scrollController?.position?.pixels == _scrollController?.position?.maxScrollExtent && !_provider.isRequestCategoryLoading) { + pageNo = pageNo + 1; + callRequestApis(showLoader: false,pageNo: pageNo); + } + }); + } + + @override + Widget build(BuildContext context) { return Scaffold( - appBar: DefaultAppBar(title: "$title ${context.translation.requests}"), + appBar: DefaultAppBar(title: "${widget.title} ${context.translation.requests}"), body: Consumer(builder: (context, snapshot, _) { - bool isLoading = index == 0 + if (snapshot.isRequestCategoryLoading || snapshot.selectedRequestCategory == null) { + return ListView.builder( + itemCount: 6, + itemBuilder: (context, index) { + return Padding( + padding: EdgeInsets.symmetric(vertical: 10.toScreenHeight, horizontal: 0), + child: const SizedBox().toRequestShimmer(context, snapshot.isRequestCategoryLoading), + ); + }, + ); + } else { + snapshot.requestDetailList = snapshot.selectedRequestCategory; + return RequestPaginatedList(snapshot.selectedRequestCategory.requestsDetails ?? [], snapshot.isRequestCategoryLoading, snapshot.selectedRequestCategory.total.count, _scrollController); + } + bool isLoading = widget.index == 0 ? snapshot.isHighPriorityLoading - : index == 1 + : widget.index == 1 ? snapshot.isOverdueLoading - : index == 2 + : widget.index == 2 ? snapshot.isOpenLoading - : index == 3 + : widget.index == 3 ? snapshot.isCompleteLoading : false; - List list = index == 0 + List list = widget.index == 0 ? snapshot.highPriorityRequests?.requestsDetails ?? [] - : index == 1 - ? snapshot.overdueRequests?.requestsDetails?? [] - : index == 2 - ? snapshot.openRequests?.requestsDetails?? [] - : index == 3 - ? snapshot.completedRequests?.requestsDetails?? [] + : widget.index == 1 + ? snapshot.overdueRequests?.requestsDetails ?? [] + : widget.index == 2 + ? snapshot.openRequests?.requestsDetails ?? [] + : widget.index == 3 + ? snapshot.completedRequests?.requestsDetails ?? [] : []; - return LazyLoading( - child: RequestItemViewList(list, isLoading), - nextPage: snapshot.nextPage, - onLazyLoad: () { - callRequestApis(); - }, - ); - - RequestItemViewList(list, isLoading); })); } - void callRequestApis() { - if (index == 0) { - _provider.getHighPriorityRequests(); - } else if (index == 1) { - _provider.getOverdueRequests(); - } else if (index == 2) { - _provider.getOpenRequests(); - } else { - _provider.getCompletedRequests(); + Future callRequestApis({ + bool showLoader = true, + int pageNo = 1, + int pageSize = 10, + }) async { + UsersTypes usersTypes = Provider.of(context, listen: false).user.type; + print('i am here at ${widget.index}'); + + if (widget.index == 0) { + await _provider.getSelectedRequestCategory( + requestQueryModel: RequestQueryModel( + typeTransaction: [1], + statusTransaction: [1, 2, 4], + priority: [1], + displayData: [], + pageNumber: pageNo, + pageSize: pageSize, + showLoader: showLoader, + )); + return; + } + if (widget.index == 1) { + await _provider.getSelectedRequestCategory( + requestQueryModel: RequestQueryModel( + typeTransaction: [1, 2, 3, 4], + statusTransaction: [1, 2, 4], + displayData: [1], + pageNumber: pageNo, + pageSize: pageSize, + priority: [], + showLoader: showLoader, + )); + return; + // _provider.overdueRequests = null; + // _provider.getOverdueRequests(); + } + if (widget.index == 2) { + await _provider.getSelectedRequestCategory( + requestQueryModel: RequestQueryModel( + typeTransaction: [1, 2, 3, 4], + statusTransaction: [usersTypes == UsersTypes.engineer ? 2 : 1], + displayData: [], + pageNumber: pageNo, + pageSize: pageSize, + priority: [], + showLoader: showLoader, + )); + return; + // _provider.openRequests = null; + // _provider.getOpenRequests(); + } + if (widget.index == 3) { + await _provider.getSelectedRequestCategory( + requestQueryModel: RequestQueryModel( + typeTransaction: [1, 2, 3, 4], + statusTransaction: [4], + displayData: [], + pageNumber: pageNo, + pageSize: pageSize, + priority: [], + showLoader: showLoader, + )); + return; + // _provider.completedRequests = null; + // _provider.getCompletedRequests(); } } } diff --git a/lib/new_views/pages/land_page/widgets/request_item_view_list.dart b/lib/new_views/pages/land_page/widgets/request_item_view_list.dart index 0f2a2e21..132915ac 100644 --- a/lib/new_views/pages/land_page/widgets/request_item_view_list.dart +++ b/lib/new_views/pages/land_page/widgets/request_item_view_list.dart @@ -1,5 +1,7 @@ //request tab page import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/all_requests_provider.dart'; import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; @@ -29,7 +31,6 @@ class RequestItemViewList extends StatelessWidget { bool isGasRefill = list[index].nameOfType == "GasRefill"; bool isAssetTransfer = list[index].nameOfType == "AssetTransfer"; bool isPPMs = list[index].nameOfType == "PPMs"; - return isServiceRequest ? ServiceRequestItemView(list[index]) : isGasRefill diff --git a/lib/service_request_latest/views/components/history_log_view.dart b/lib/service_request_latest/views/components/history_log_view.dart index 188464fb..d1e4633a 100644 --- a/lib/service_request_latest/views/components/history_log_view.dart +++ b/lib/service_request_latest/views/components/history_log_view.dart @@ -6,55 +6,105 @@ 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'; import 'package:test_sa/new_views/common_widgets/default_app_bar.dart'; +import 'package:test_sa/views/widgets/requests/request_status.dart'; class HistoryLogView extends StatelessWidget { const HistoryLogView({Key key}) : super(key: key); @override Widget build(BuildContext context) { + List dummyList = [ + HistoryLogModel(message: 'Requester acknowledged adc dld a', date: DateTime.now(), status: null), + HistoryLogModel(message: 'Requester acknowledged adc dld a', date: DateTime.now(), status: null), + HistoryLogModel(message: 'Requester acknowledged adc dld a', date: DateTime.now(), status: 'Status update to In Progress'), + HistoryLogModel(message: 'Requester acknowledged adc dld a', date: DateTime.now(), status: null), + HistoryLogModel(message: 'Requester acknowledged adc dld a', date: DateTime.now(), status: 'Status updated to Closed'), + HistoryLogModel(message: 'Requester acknowledged adc dld a', date: DateTime.now(), status: null), + HistoryLogModel(message: 'Requester acknowledged adc dld a', date: DateTime.now(), status: null), + HistoryLogModel(message: 'Requester acknowledged adc dld a', date: DateTime.now(), status: null), + HistoryLogModel(message: 'Requester acknowledged adc dld a', date: DateTime.now(), status: null), + ]; return Scaffold( backgroundColor: AppColor.neutral100, body: Padding( - padding: EdgeInsets.symmetric(vertical: 50.toScreenHeight), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.spaceBetween, + padding: EdgeInsets.only(top: 50.toScreenHeight, bottom: 20.toScreenHeight), + child: Stack( children: [ - historyLogCard(context: context,date: DateTime.now()), - historyLogCard(context: context,date: DateTime.now()), - historyLogCard(context: context,date: DateTime.now()), - historyLogCard(context: context,date: DateTime.now()), + Padding( + padding: EdgeInsets.only(left: 122.toScreenWidth), + child: const VerticalDivider( + color: AppColor.white40, + thickness: 2, + width: 20, + indent: 10, + endIndent: 10, + ), + ), + + // Container( + // color: Colors.red, + // ), + ListView.builder( + itemCount: dummyList.length, + padding: EdgeInsets.all(16), + itemBuilder: (context, index) { + return historyLogCard(context: context, historyLogModel: dummyList[index]); + }, + ), ], ), ), ); } - Widget historyLogCard({@required BuildContext context, @required DateTime date}) { - return SizedBox( - width: double.infinity, - child: Padding( - padding: EdgeInsets.only(left: 16.toScreenWidth, bottom: 16.toScreenHeight, top: 12.toScreenHeight), - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Column( - children: [ - Text( - date.toString().toServiceRequestCardFormat, - textAlign: TextAlign.end, - style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral20), + Widget historyLogCard({@required BuildContext context, @required HistoryLogModel historyLogModel}) { + return Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + historyLogModel.status != null + ? Padding( + padding: EdgeInsets.only(top: 16.toScreenHeight, bottom: 16.toScreenHeight, right: 89.toScreenWidth), + child: StatusLabel( + radius: 4, + label: historyLogModel.status, + textColor: AppColor.getRequestStatusTextColorByName(context, historyLogModel.status), + backgroundColor: AppColor.getRequestStatusColorByName(context, historyLogModel.status), ), - ], - ), - 50.width, - Expanded( - child: 'Requester acknowledged adc dld a'.heading6(context), - ), - ], - ), - ), - ).toShadowContainer(context).paddingOnly(start: 16, end: 16); + ) + : 12.height, + Container( + width: double.infinity, + padding: EdgeInsets.only(left: 12.toScreenWidth, bottom: 16.toScreenHeight, top: 12.toScreenHeight), + child: Column( + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + historyLogModel.date.toString().toServiceRequestCardFormat, + textAlign: TextAlign.end, + style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral20), + ), + 50.width, + Expanded( + child: historyLogModel.message.heading6(context), + ), + ], + ), + ], + ), + ).toShadowContainer(context), + ], + ); } } + +class HistoryLogModel { + String message; + DateTime date; + String status; + Color statusColor; + + HistoryLogModel({@required this.message, @required this.date, this.status, this.statusColor}); +} diff --git a/lib/service_request_latest/views/request_detail_view.dart b/lib/service_request_latest/views/request_detail_view.dart index dd0f041d..83be1193 100644 --- a/lib/service_request_latest/views/request_detail_view.dart +++ b/lib/service_request_latest/views/request_detail_view.dart @@ -85,11 +85,13 @@ class _ServiceRequestDetailViewState extends State { StatusLabel( label: serviceRequest.priority.name, id: serviceRequest.priority.id, + radius: 4, textColor: AppColor.getPriorityStatusTextColor(context, serviceRequest.priority.id), backgroundColor: AppColor.getPriorityStatusColor(context, serviceRequest.priority.id), ), 8.width, StatusLabel( + radius: 4, label: serviceRequest.statusLabel, textColor: AppColor.getRequestStatusTextColor(context, serviceRequest.statusValue), backgroundColor: AppColor.getRequestStatusColor(context, serviceRequest.statusValue), @@ -286,13 +288,15 @@ class _ServiceRequestDetailViewState extends State { Center( child: InkWell( onTap: () async { - AllRequestsProvider allRequestProvider = Provider.of(context, listen: false); - int index = allRequestProvider.filterRequest.requestsDetails.indexWhere((element) => element.id.toString() == serviceRequestsProvider.currentSelectedRequest.id); - print('index i got is $index'); - if (index != -1 && index != allRequestProvider.filterRequest.requestsDetails.length) { - print('loading value is $loading'); - getServiceRequest(requestId: allRequestProvider.filterRequest.requestsDetails[index + 1].id.toString()); - print('call the api with next id ...${allRequestProvider.filterRequest.requestsDetails[index + 1].id.toString()}'); + try{ + //use a common list + AllRequestsProvider allRequestProvider = Provider.of(context, listen: false); + int index = allRequestProvider.requestDetailList.requestsDetails.indexWhere((element) => element.id.toString() == serviceRequestsProvider.currentSelectedRequest.id); + if (index != -1 && index != allRequestProvider.requestDetailList.requestsDetails.length) { + getServiceRequest(requestId: allRequestProvider.requestDetailList.requestsDetails[index + 1].id.toString()); + } + }catch(e){ + print(e); } }, child: Text( @@ -316,7 +320,6 @@ class _ServiceRequestDetailViewState extends State { textColor: AppColor.red50, showBorder: true, onPressed: () async { - print('service request value is ${serviceRequestsProvider.currentSelectedRequest.type}'); ServiceRequestBottomSheet.rejectRequestBottomSheet(context: context); // bool shouldReloadData = (await showModalBottomSheet( // context: context, diff --git a/lib/views/widgets/requests/request_status.dart b/lib/views/widgets/requests/request_status.dart index 52553270..b10bec3e 100644 --- a/lib/views/widgets/requests/request_status.dart +++ b/lib/views/widgets/requests/request_status.dart @@ -8,8 +8,9 @@ class StatusLabel extends StatelessWidget { final Color backgroundColor; final Color textColor; final bool isPriority; + final double radius; - StatusLabel({Key key, this.id = 0, this.label, this.backgroundColor, this.textColor, this.isPriority = false}) : super(key: key); + StatusLabel({Key key, this.id = 0, this.label, this.backgroundColor, this.textColor, this.isPriority = false, this.radius = 4}) : super(key: key); @override Widget build(BuildContext context) { @@ -26,7 +27,7 @@ class StatusLabel extends StatelessWidget { decoration: ShapeDecoration( color: backgroundColor, shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(50), + borderRadius: BorderRadius.circular(radius), ), ), child: Text(label ?? "", style: AppTextStyles.overline.copyWith(color: textColor)),