diff --git a/lib/dashboard_latest/dashboard_provider.dart b/lib/dashboard_latest/dashboard_provider.dart index 090a8e6e..617a0dc4 100644 --- a/lib/dashboard_latest/dashboard_provider.dart +++ b/lib/dashboard_latest/dashboard_provider.dart @@ -107,9 +107,7 @@ class DashBoardProvider extends ChangeNotifier { notifyListeners(); Response response; try { - response = await ApiManager.instance.get( - URLs.getWorkOrderByIdUrl + "?workOrderId=$id", - ); + response = await ApiManager.instance.get(URLs.getWorkOrderByIdUrl + "?workOrderId=$id"); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { @@ -178,19 +176,14 @@ class DashBoardProvider extends ChangeNotifier { if (response.statusCode >= 200 && response.statusCode < 300) { if (_requestDetailList == null) { _requestDetailList = DD.DashboardDetail.fromJson(json.decode(response.body)); - - //notifyListeners(); } else { - _requestDetailList!.data!.addAll(DD.DashboardDetail.fromJson(json.decode(response.body)["data"][0]).data ?? []); - - //notifyListeners(); + _requestDetailList!.data!.addAll(DD.DashboardDetail.fromJson(json.decode(response.body)).data ?? []); } if (_requestDetailList!.data!.length >= pageItemNumber) { nextPage = true; } else { nextPage = false; } - //notifyListeners(); } else { requestDetailList = null; } diff --git a/lib/dashboard_latest/dashboard_view.dart b/lib/dashboard_latest/dashboard_view.dart index cae90ec8..3e4ff381 100644 --- a/lib/dashboard_latest/dashboard_view.dart +++ b/lib/dashboard_latest/dashboard_view.dart @@ -5,7 +5,6 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/notification/firebase_notification_manger.dart'; import 'package:test_sa/controllers/notification/notification_manger.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/controllers/providers/settings/setting_provider.dart'; @@ -36,8 +35,8 @@ class _DashboardViewState extends State { late SettingProvider settingProvider; late UserProvider userProvider; - late AllRequestsProvider allRequestsProvider; - late DashBoardProvider dashBoardProvider; + + // late AllRequestsProvider allRequestsProvider; late NotificationsProvider notificationsProvider; late ScrollController _scrollController; late DashBoardProvider _dashBoardProvider; @@ -51,6 +50,7 @@ class _DashboardViewState extends State { void getRequests() { _dashBoardProvider.getDashBoardCount(usersType: userProvider.user!.type!); + _dashBoardProvider.resetRequestDataList(); _dashBoardProvider.getRequestDetail(usersType: userProvider.user!.type!, status: _dashBoardProvider.tabs[_dashBoardProvider.currentListIndex].tag); } @@ -59,7 +59,7 @@ class _DashboardViewState extends State { userProvider = Provider.of(context, listen: false); settingProvider = Provider.of(context, listen: false); RequestDetailProvider requestDetailProvider = Provider.of(context, listen: false); - allRequestsProvider = Provider.of(context, listen: false); + //allRequestsProvider = Provider.of(context, listen: false); _dashBoardProvider = Provider.of(context, listen: false); _dashBoardProvider.setTabs(userProvider.user!.type!, context); notificationsProvider = Provider.of(context, listen: false); @@ -99,9 +99,9 @@ class _DashboardViewState extends State { 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); + if (_scrollController.position.pixels == _scrollController.position.maxScrollExtent && !_dashBoardProvider.isDetailLoading) { + _dashBoardProvider.pageNum = _dashBoardProvider.pageNum + 1; + _dashBoardProvider.getRequestDetail(usersType: user.type!, showLoader: false, status: _dashBoardProvider.currentListIndex); } }); } @@ -115,7 +115,7 @@ class _DashboardViewState extends State { @override Widget build(BuildContext context) { bool isNurse = (Provider.of(context, listen: false).user!.type) == UsersTypes.normal_user; - print('user data is ${Provider.of(context, listen: false).user?.toJson()}'); + print('user data is ${Provider.of(context, listen: false).user?.toJson()}'); return Scaffold( // backgroundColor: AppColor.background(context), appBar: PreferredSize( diff --git a/lib/dashboard_latest/widgets/request_category_fragment.dart b/lib/dashboard_latest/widgets/request_category_fragment.dart index 4f3ffe72..84e73f81 100644 --- a/lib/dashboard_latest/widgets/request_category_fragment.dart +++ b/lib/dashboard_latest/widgets/request_category_fragment.dart @@ -10,6 +10,7 @@ import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/new_models/dashboard_detail.dart'; import 'package:test_sa/new_views/common_widgets/tab_button.dart'; +import 'package:test_sa/views/widgets/loaders/no_data_found.dart'; class RequestCategoryFragment extends StatelessWidget { const RequestCategoryFragment({Key? key}) : super(key: key); @@ -33,7 +34,9 @@ class RequestCategoryFragment extends StatelessWidget { child: const SizedBox().toRequestShimmer(context, dashboardProvider.isDetailLoading), ); })).paddingOnly(start: 16, end: 16, top: 16) - : RequestCategoryList(dashboardProvider.requestDetailList?.data ?? [], dashboardProvider.isDetailLoading, dashboardProvider.requestDetailList?.totalRows ?? 0), + : (dashboardProvider.requestDetailList?.data?.isEmpty ?? true) + ? const NoDataFound().paddingOnly(top: 50).center + : RequestCategoryList(dashboardProvider.requestDetailList?.data ?? [], dashboardProvider.isDetailLoading, dashboardProvider.requestDetailList?.totalRows ?? 0), ]); }); } diff --git a/lib/dashboard_latest/widgets/request_category_list.dart b/lib/dashboard_latest/widgets/request_category_list.dart index b42d2290..022e785f 100644 --- a/lib/dashboard_latest/widgets/request_category_list.dart +++ b/lib/dashboard_latest/widgets/request_category_list.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart'; +import 'package:test_sa/dashboard_latest/widgets/app_bar_widget.dart'; import 'package:test_sa/extensions/int_extensions.dart'; +import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/new_models/dashboard_detail.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'; @@ -23,14 +25,7 @@ class RequestCategoryList extends StatelessWidget { physics: const NeverScrollableScrollPhysics(), itemBuilder: (context, index) { if (index == list.length) { - return const ListTile( - title: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - CircularProgressIndicator(color: AppColor.primary10, strokeWidth: 1), - ], - ), - ); + return const CircularProgressIndicator(color: AppColor.primary10, strokeWidth: 1).center; } return Padding(padding: EdgeInsets.symmetric(vertical: 10.toScreenHeight), child: _buildRequestItem(list[index])); }, diff --git a/lib/models/helper_data_models/workorder/work_order_helper_models.dart b/lib/models/helper_data_models/workorder/work_order_helper_models.dart index ba6296f1..1a2960e2 100644 --- a/lib/models/helper_data_models/workorder/work_order_helper_models.dart +++ b/lib/models/helper_data_models/workorder/work_order_helper_models.dart @@ -1,14 +1,15 @@ - import 'package:test_sa/models/fault_description.dart'; import 'package:test_sa/models/lookup.dart'; import '../../new_models/work_order_detail_model.dart'; + class FixRemotelyHelperModel { int? workOrderId; DateTime? startDate; DateTime? endDate; int? workingHour; String? comment; + FixRemotelyHelperModel({this.workOrderId, this.startDate, this.endDate, this.workingHour, this.comment}); Map toJson() { @@ -25,17 +26,10 @@ class WorkOrderHelperModel { String? voiceNote; List? workOrderAttachments; - WorkOrderHelperModel( - {this.assetId, - this.equipmentStatusId, - this.priorityId, - this.problemDescriptionId, - this.comments, - this.voiceNote, - this.workOrderAttachments}); + WorkOrderHelperModel({this.assetId, this.equipmentStatusId, this.priorityId, this.problemDescriptionId, this.comments, this.voiceNote, this.workOrderAttachments}); Map toJson() { - final Map data = {}; + final Map data = {}; data['assetId'] = assetId; data['equipmentStatusId'] = equipmentStatusId; data['priorityId'] = priorityId; @@ -43,54 +37,58 @@ class WorkOrderHelperModel { data['comments'] = comments; data['voiceNote'] = voiceNote; if (workOrderAttachments != null) { - data['workOrderAttachments'] = - workOrderAttachments!.map((v) => v.toJson()).toList(); + data['workOrderAttachments'] = workOrderAttachments!.map((v) => v.toJson()).toList(); } return data; } } class WorkOrderAttachments { + WorkOrderAttachments({this.id, this.name}); + int? id; String? name; - WorkOrderAttachments({this.id, this.name}); - + WorkOrderAttachments.fromJson(Map json) { + id = json['id']; + name = json['name']; + } Map toJson() { - final Map data = {}; + final Map data = {}; data['id'] = id; data['name'] = name; return data; } } + class EngineerUpdateWorkOrderHelperModel { int? workOrderId; - Lookup?equipmentStatus; + Lookup? equipmentStatus; String? returnToService; Lookup? serviceType; Lookup? loanAvailability; - num?loanAssetId; + num? loanAssetId; WorkOrderAsset? loanAsset; Lookup? failureReason; FaultDescription? faultDescription; String? solution; - EngineerUpdateWorkOrderHelperModel( - {this.workOrderId, - this.equipmentStatus, - this.failureReason, - this.faultDescription, - this.loanAvailability, - this.loanAssetId, - this.loanAsset, - this.serviceType, - this.solution, - this.returnToService, - }); + EngineerUpdateWorkOrderHelperModel({ + this.workOrderId, + this.equipmentStatus, + this.failureReason, + this.faultDescription, + this.loanAvailability, + this.loanAssetId, + this.loanAsset, + this.serviceType, + this.solution, + this.returnToService, + }); Map toJson() { - final Map data = {}; + final Map data = {}; data['workOrderId'] = workOrderId; data['equipmentStatusId'] = equipmentStatus?.id; data['returnToService'] = returnToService; @@ -118,6 +116,7 @@ class NurseActionHelperModel { return {'workOrderId': workOrderId, 'feedback': feedback, 'signatureNurse': signatureNurse}; } } + class NeedVisitHelperModel { int? workOrderId; DateTime? visitDate; @@ -125,7 +124,6 @@ class NeedVisitHelperModel { NeedVisitHelperModel({this.workOrderId, this.visitDate, this.comment}); - Map toJson() { return {'workOrderId': workOrderId, 'visitDate': visitDate?.toIso8601String(), 'comment': comment}; } @@ -136,9 +134,9 @@ class EngineerRejectHelperModel { String? feedback; Lookup? rejectionReason; - EngineerRejectHelperModel({this.workOrderId, this.feedback,this.rejectionReason}); + EngineerRejectHelperModel({this.workOrderId, this.feedback, this.rejectionReason}); Map toJson() { return {'workOrderId': workOrderId, 'feedback': feedback, 'rejectReasonId': rejectionReason?.id}; } -} \ No newline at end of file +} diff --git a/lib/models/new_models/work_order_detail_model.dart b/lib/models/new_models/work_order_detail_model.dart index d96c897f..f7e5eb73 100644 --- a/lib/models/new_models/work_order_detail_model.dart +++ b/lib/models/new_models/work_order_detail_model.dart @@ -117,7 +117,7 @@ class WorkOrderData { Lookup? problemDescription; String? comments; String? voiceNote; - List workOrderAttachments; + List workOrderAttachments; String? returnToService; Lookup? serviceType; Lookup? failureReasone; @@ -164,7 +164,7 @@ class WorkOrderData { problemDescription: json["problemDescription"] == null ? null : Lookup.fromJson(json["problemDescription"]), comments: json["comments"], voiceNote: json["voiceNote"], - workOrderAttachments: json["workOrderAttachments"] == null ? [] : List.from(json["workOrderAttachments"]!.map((x) => x)), + workOrderAttachments: json["workOrderAttachments"] == null ? [] : List.from(json['workOrderAttachments']).map((e)=>WorkOrderAttachments.fromJson(e)).toList(), returnToService: json["returnToService"], serviceType: json["serviceType"] == null ? null : Lookup.fromJson(json["serviceType"]), failureReasone: json["failureReasone"] == null ? null : Lookup.fromJson(json["failureReasone"]), @@ -212,7 +212,7 @@ class WorkOrderData { "problemDescription": problemDescription?.toJson(), "comments": comments, "voiceNote": voiceNote, - "workOrderAttachments": workOrderAttachments.map((x) => x).toList(), + "workOrderAttachments": workOrderAttachments.map((e)=>e.toJson()).toList(), "returnToService": returnToService, "serviceType": serviceType?.toJson(), "failureReasone": failureReasone?.toJson(), diff --git a/lib/new_views/common_widgets/app_bottom_nav_bar.dart b/lib/new_views/common_widgets/app_bottom_nav_bar.dart index 086b0b32..e12734c3 100644 --- a/lib/new_views/common_widgets/app_bottom_nav_bar.dart +++ b/lib/new_views/common_widgets/app_bottom_nav_bar.dart @@ -46,15 +46,15 @@ class AppBottomNavigationBar extends StatelessWidget { return BottomNavigationBarItem( icon: iconName .toSvgAsset( - width: showLabel ? 28 : 38, - height: showLabel ? 26 : 37, + width: showLabel ? 26 : 38, + height: showLabel ? 26 : 38, color: showLabel || (showLabel && selectedIndex != 2) ? selectedIndex == index ? Theme.of(context).bottomNavigationBarTheme.selectedItemColor : Theme.of(context).bottomNavigationBarTheme.unselectedItemColor : null, ) - .paddingOnly(top: 21, bottom: showLabel ? 4 : 0), + .paddingOnly(top: showLabel ? 0 : 12, bottom: showLabel ? 6 : 0), label: showLabel ? label : '', ); } diff --git a/lib/new_views/pages/land_page/create_request-type_bottomsheet.dart b/lib/new_views/pages/land_page/create_request-type_bottomsheet.dart index 5944ba2f..f2668411 100644 --- a/lib/new_views/pages/land_page/create_request-type_bottomsheet.dart +++ b/lib/new_views/pages/land_page/create_request-type_bottomsheet.dart @@ -9,40 +9,52 @@ import 'package:test_sa/views/pages/device_transfer/request_device_transfer.dart class CreateRequestTypeBottomSheet extends StatelessWidget { const CreateRequestTypeBottomSheet({super.key}); + @override Widget build(BuildContext context) { //TODO replace all the icons with new icons... return Container( padding: const EdgeInsets.all(16.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - listCard( - context: context, - icon: 'add_icon', - label: '${context.translation.create}\n${context.translation.serviceRequest}', - onTap: () { - Navigator.pushReplacementNamed(context, CreateNewRequest.id); - - }, - ), - listCard( - context: context, - icon: 'add_icon', - label: '${context.translation.create}\n${context.translation.gasRefill}', - onTap: () { - //NewGasRefillRequestPage.routeName) - Navigator.pushReplacementNamed(context, NewGasRefillRequestPage.routeName); - }, - ), - listCard( - context: context, - icon: 'add_icon', - label: '${context.translation.create}\n${context.translation.deviceTransfer}', - onTap: () async { - Navigator.pushReplacementNamed(context, RequestDeviceTransfer.id); - }, + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Select Request".heading4(context), + 16.height, + GridView( + padding: EdgeInsets.all(0), + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 3, childAspectRatio: 1, crossAxisSpacing: 16, mainAxisSpacing: 16), + children: [ + listCard( + context: context, + icon: 'add_icon', + label: '${context.translation.create}\n${context.translation.serviceRequest}', + onTap: () { + Navigator.pushReplacementNamed(context, CreateNewRequest.id); + }, + ), + listCard( + context: context, + icon: 'add_icon', + label: '${context.translation.create}\n${context.translation.gasRefill}', + onTap: () { + //NewGasRefillRequestPage.routeName) + Navigator.pushReplacementNamed(context, NewGasRefillRequestPage.routeName); + }, + ), + listCard( + context: context, + icon: 'add_icon', + label: '${context.translation.create}\n${context.translation.deviceTransfer}', + onTap: () async { + Navigator.pushReplacementNamed(context, RequestDeviceTransfer.id); + }, + ), + ], ), + 16.height, ], ), ); @@ -59,9 +71,14 @@ class CreateRequestTypeBottomSheet extends StatelessWidget { child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - icon.toSvgAsset(), - 24.height, + const Icon( + Icons.add_circle, + color: AppColor.neutral120, + size: 32, + ), + //24.height, label.bodyText2(context).custom(color: AppColor.black20), ], ), 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 9f06dace..eb58aff8 100644 --- a/lib/new_views/pages/land_page/requests_list_page.dart +++ b/lib/new_views/pages/land_page/requests_list_page.dart @@ -9,6 +9,7 @@ import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/new_models/dashboard_detail.dart'; import 'package:test_sa/new_views/common_widgets/default_app_bar.dart'; import 'package:test_sa/new_views/pages/land_page/requests/request_paginated_listview.dart'; +import 'package:test_sa/views/widgets/loaders/no_data_found.dart'; class RequestsListPage extends StatefulWidget { static const String routeName = "/requests-list-page"; @@ -67,6 +68,8 @@ class _RequestsListPageState extends State { ); }, ); + } else if (snapshot.requestDetailList?.data?.isEmpty ?? true) { + return const NoDataFound().center; } else { return RequestPaginatedListview(snapshot.requestDetailList?.data ?? [], snapshot.isDetailLoading, snapshot.requestDetailList?.totalRows ?? 0, _scrollController); } diff --git a/lib/service_request_latest/views/components/request_detail_view.dart b/lib/service_request_latest/views/components/request_detail_view.dart index a56e96e7..0b56dec7 100644 --- a/lib/service_request_latest/views/components/request_detail_view.dart +++ b/lib/service_request_latest/views/components/request_detail_view.dart @@ -1,8 +1,6 @@ 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/controllers/providers/api/comments_provider.dart'; -import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; +import 'package:test_sa/controllers/api_routes/urls.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'; @@ -11,24 +9,15 @@ 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/models/enums/work_order_next_step.dart'; -import 'package:test_sa/models/helper_data_models/asset_retired/asset_retired_model.dart'; import 'package:test_sa/models/helper_data_models/workorder/work_order_helper_models.dart'; import 'package:test_sa/models/new_models/work_order_detail_model.dart'; -import 'package:test_sa/models/service_request/service_request.dart'; -import 'package:test_sa/models/user.dart'; 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/new_views/common_widgets/default_app_bar.dart'; import 'package:test_sa/service_request_latest/request_detail_provider.dart'; import 'package:test_sa/service_request_latest/views/components/action_button/footer_action_button.dart'; import 'package:test_sa/service_request_latest/views/components/initial_visit_card.dart'; -import 'package:test_sa/service_request_latest/views/components/timer_widget.dart'; import 'package:test_sa/service_request_latest/views/forms/asset_retired/asset_retired.dart'; -import 'package:test_sa/service_request_latest/views/nurse/create_new_request_view.dart'; -import 'package:test_sa/views/pages/user/requests/comments_bottom_sheet.dart'; -import 'package:test_sa/views/pages/user/requests/update_service_request_page.dart'; import 'package:test_sa/views/widgets/images/files_list.dart'; -import 'package:test_sa/views/widgets/loaders/app_loading.dart'; import 'package:test_sa/views/widgets/loaders/no_data_found.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart'; import 'package:test_sa/views/widgets/sound/sound_player.dart'; @@ -210,12 +199,12 @@ class WorkOrderDetailView extends StatelessWidget { if (workOrder.workOrderAttachments.isNotEmpty ?? false) ...[ 8.height, const Divider().defaultStyle(context), - FilesList(images: workOrder.workOrderAttachments), + FilesList(images: workOrder.workOrderAttachments.map((toElement) => URLs.getFileUrl(toElement.name!)!).toList()), ], if (workOrder.voiceNote?.isNotEmpty ?? false) ...[ const Divider().defaultStyle(context), 16.height, - ASoundPlayer(audio: workOrder.voiceNote!), + ASoundPlayer(audio: URLs.getFileUrl(workOrder.voiceNote!)!), 8.height, ], ],