diff --git a/ios/Runner.plist/AppDelegate.swift b/ios/Runner.plist/AppDelegate.swift index 70693e4a..68214f3a 100644 --- a/ios/Runner.plist/AppDelegate.swift +++ b/ios/Runner.plist/AppDelegate.swift @@ -8,6 +8,7 @@ import Flutter didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) } } diff --git a/lib/app_strings/app_asset.dart b/lib/app_strings/app_asset.dart index fee17e85..139e8185 100644 --- a/lib/app_strings/app_asset.dart +++ b/lib/app_strings/app_asset.dart @@ -1,4 +1,4 @@ -class AppAsset{ +class AppAsset { static String loginTopBg = 'assets/images/login_top_bg.png'; static String askOtpIcon = 'ask_otp_icon'; static String askRequesterIcon = 'ask_requester_icon'; @@ -10,4 +10,4 @@ class AppAsset{ static String editIcon = 'assets/images/edit_icon.svg'; static String deleteIcon = 'assets/images/delete_icon.svg'; static String overDueIcon = 'assets/images/overdue.svg'; -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/all_requests_provider.dart b/lib/controllers/providers/api/all_requests_provider.dart index dea8054b..da938a3a 100644 --- a/lib/controllers/providers/api/all_requests_provider.dart +++ b/lib/controllers/providers/api/all_requests_provider.dart @@ -93,7 +93,6 @@ class AllRequestsProvider extends ChangeNotifier { } void resetRequestsApiData() { - print('reset api data called..'); _highPriorityRequests = null; _overdueRequests = null; openRequests = null; @@ -411,7 +410,6 @@ class AllRequestsProvider extends ChangeNotifier { _allRequestsAndCount = null; } isInProgressLoading = false; - print('value of inProgress loading in provider is $isInProgressLoading'); notifyListeners(); return response.statusCode; } catch (error) { @@ -534,7 +532,6 @@ class AllRequestsProvider extends ChangeNotifier { } else { completedRequests!.requestsDetails!.addAll(AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]).requestsDetails!); } - print('completed request length is ${completedRequests!.requestsDetails!.length}'); if (completedRequests!.requestsDetails!.length >= pageItemNumber) { nextPage = true; } else { diff --git a/lib/controllers/providers/api/parts_provider.dart b/lib/controllers/providers/api/parts_provider.dart index 87527d91..6705a4f9 100644 --- a/lib/controllers/providers/api/parts_provider.dart +++ b/lib/controllers/providers/api/parts_provider.dart @@ -92,7 +92,6 @@ class PartsProvider extends ChangeNotifier { } else { response = await ApiManager.instance.post(URLs.getPartNumber, body: {"partName": partName, "assetId": assetId}); } - print('response of get PartNo i got is ${response.body}'); List page = []; if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received diff --git a/lib/dashboard_latest/dashboard_provider.dart b/lib/dashboard_latest/dashboard_provider.dart index 2f4f6d62..b359da0c 100644 --- a/lib/dashboard_latest/dashboard_provider.dart +++ b/lib/dashboard_latest/dashboard_provider.dart @@ -8,6 +8,8 @@ import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/new_models/dashboard_count.dart'; import 'package:test_sa/models/new_models/dashboard_detail.dart' as DD; +import '../controllers/providers/api/user_provider.dart'; + class DashBoardProvider extends ChangeNotifier { bool isAllCountLoading = false; bool isLoading = false; @@ -160,7 +162,6 @@ class DashBoardProvider extends ChangeNotifier { notifyListeners(); } - print('i am called...${usersType}'); Response response; String url = ''; @@ -211,6 +212,13 @@ class DashBoardProvider extends ChangeNotifier { _isDetailLoading = value; notifyListeners(); } + void refreshDashboard({required UsersTypes userType,required BuildContext context}) { + setTabs(userType:userType,context: context); + getDashBoardCount(usersType: userType); + resetRequestDataList(); + getRequestDetail(usersType: userType, status: tabs[currentListIndex].tag); + // notifyListeners(); + } } class CategoryTabs { @@ -227,9 +235,9 @@ class CategoryTabs { tabs.add(CategoryTabs('Completed', 3)); return tabs; } + tabs.add(CategoryTabs('UpComing Request', 3)); tabs.add(CategoryTabs('Open Request', 1)); tabs.add(CategoryTabs('In Progress', 2)); - tabs.add(CategoryTabs('Acknowledged', 3)); tabs.add(CategoryTabs('Rejected', 6)); return tabs; } diff --git a/lib/dashboard_latest/dashboard_view.dart b/lib/dashboard_latest/dashboard_view.dart index 44eec765..c1d4c403 100644 --- a/lib/dashboard_latest/dashboard_view.dart +++ b/lib/dashboard_latest/dashboard_view.dart @@ -114,7 +114,6 @@ 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()}'); 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 9e265a7e..c8e7d4b1 100644 --- a/lib/dashboard_latest/widgets/request_category_fragment.dart +++ b/lib/dashboard_latest/widgets/request_category_fragment.dart @@ -1,3 +1,4 @@ +import 'package:date_picker_timeline/date_picker_widget.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; @@ -9,6 +10,7 @@ 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/new_models/dashboard_detail.dart'; +import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/common_widgets/tab_button.dart'; import 'package:test_sa/views/widgets/loaders/no_data_found.dart'; @@ -23,8 +25,30 @@ class RequestCategoryFragment extends StatelessWidget { getTabs( requestsProvider: dashboardProvider, context: context, - userType: Provider.of(context, listen: false).user!.type!, + userType: Provider.of(context, listen: false).user != null ? Provider.of(context, listen: false).user!.type! : UsersTypes.nurse, ), + // if (Provider.of(context, listen: false).user!.type == UsersTypes.engineer && dashboardProvider.currentListIndex == 0) ...[ + // Padding( + // padding: const EdgeInsets.all(8.0), + // child: Column( + // children: [ + // 8.height, + // DatePicker( + // DateTime.now().subtract(const Duration(days: 3)), + // width: 50.toScreenWidth, + // initialSelectedDate: DateTime.now(), + // selectionColor: AppColor.green70, + // selectedTextColor: Colors.white, + // daysCount: 7, + // dateTextStyle: const TextStyle(fontWeight: FontWeight.w600), + // onDateChange: (date) { + // print('date time i got is $date'); + // }, + // ).toShadowContainer(context, padding: 2), + // ], + // ), + // ), + // ], dashboardProvider.isDetailLoading || dashboardProvider.requestDetailList == null ? Column( mainAxisSize: MainAxisSize.max, diff --git a/lib/dashboard_latest/widgets/requests_fragment.dart b/lib/dashboard_latest/widgets/requests_fragment.dart index 16a8fac5..1562c49b 100644 --- a/lib/dashboard_latest/widgets/requests_fragment.dart +++ b/lib/dashboard_latest/widgets/requests_fragment.dart @@ -12,6 +12,7 @@ import 'package:test_sa/new_views/app_style/app_color.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'; import 'package:test_sa/controllers/providers/api/all_requests_provider.dart'; + class RequestsFragment extends StatelessWidget { const RequestsFragment({Key? key}) : super(key: key); @@ -19,7 +20,7 @@ class RequestsFragment extends StatelessWidget { Widget build(BuildContext context) { return Consumer( builder: (context, snapshot, _) => GridView( - padding: const EdgeInsets.only( left: 16, right: 16), + padding: const EdgeInsets.only(left: 16, right: 16), physics: const NeverScrollableScrollPhysics(), shrinkWrap: true, gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 4, childAspectRatio: 72 / 84, crossAxisSpacing: 2, mainAxisSpacing: 12), @@ -34,8 +35,8 @@ class RequestsFragment extends StatelessWidget { context.isDark ? AppColor.redStatus(context) : AppColor.red30, ), listItem(snapshot.dashboardCount?.data?.countOverdue ?? 0, "overdue", context.translation.overdue, context, snapshot.isAllCountLoading, 1, AppColor.yellowIcon(context)), - listItem(snapshot.dashboardCount?.data?.countOpen ?? 0, "new_request", ApiManager.instance.user!.type == UsersTypes.engineer ? context.translation.inProgress : context.translation.newR, - context, snapshot.isAllCountLoading, 2, AppColor.primary10), + listItem(ApiManager.instance.user?.type == UsersTypes.engineer ? snapshot.dashboardCount?.data?.countInprogress ?? 0 : snapshot.dashboardCount?.data?.countOpen ?? 0, "new_request", + ApiManager.instance.user?.type == UsersTypes.engineer ? context.translation.inProgress : context.translation.newR, context, snapshot.isAllCountLoading, 2, AppColor.primary10), listItem(snapshot.dashboardCount?.data?.countComplete ?? 0, "complete_request", context.translation.completed, context, snapshot.isAllCountLoading, 3, AppColor.greenStatus(context)), ], ), diff --git a/lib/extensions/enum_extensions.dart b/lib/extensions/enum_extensions.dart index 0862957f..83d940d1 100644 --- a/lib/extensions/enum_extensions.dart +++ b/lib/extensions/enum_extensions.dart @@ -1,3 +1,4 @@ +import 'package:test_sa/app_strings/app_asset.dart'; import 'package:test_sa/models/enums/work_order_next_step.dart'; extension EnumExtensionsWorkOrder on WorkOrderNextStepEnum { @@ -60,4 +61,18 @@ extension IntExtensionsWorkOrder on int { return WorkOrderNextStepEnum.onlyView; } } + String getVerificationIconByValue() { + switch (this) { + case 1: + return AppAsset.scanQrIcon; + case 2: + return AppAsset.askRequesterIcon; + case 3: + return AppAsset.askOtpIcon; + case 4: + return AppAsset.takeDevicePhotoIcon; + default: + return AppAsset.askRequesterIcon; + } + } } diff --git a/lib/extensions/int_extensions.dart b/lib/extensions/int_extensions.dart index a26bc794..c17e78e2 100644 --- a/lib/extensions/int_extensions.dart +++ b/lib/extensions/int_extensions.dart @@ -12,4 +12,5 @@ extension IntExtensions on int { double get toScreenHeight => (this / 932) * SizeConfig.screenHeight!; double get toScreenWidth => (this / 430) * SizeConfig.screenWidth!; + } diff --git a/lib/l10n/app_ar.arb b/lib/l10n/app_ar.arb index 62829ad2..ba24cb73 100644 --- a/lib/l10n/app_ar.arb +++ b/lib/l10n/app_ar.arb @@ -307,7 +307,7 @@ "up_and_running": "قيد التشغيل", "partially_down": "معطل جزئيًا", "fully_down": "معطل تمامًا", - "verify_asset_details": "تحقق من تفاصيل الأصل", + "updateAssetDetails": "تحديث تفاصيل الأصل", "equipment_status": "حالة المعدات", "failureReason": "سبب الفشل", "visitDateAndTime": "تاريخ ووقت الزيارة", diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 5c469d71..99d3dcb0 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -280,7 +280,7 @@ "needAVisit": "Need a Visit", "fixedRemotely": "Fixed Remotely", "iHaveArrived": "I have arrived", - "verify_asset_details": "Verify Asset Details", + "updateAssetDetails": "Update Asset Details", "equipment_status": "Equipment Status", "failureReason": "Failure Reason", "visitDateAndTime": "Visit Date & Time", diff --git a/lib/models/new_models/arrival_verification_type_model.dart b/lib/models/new_models/arrival_verification_type_model.dart index b2fb7031..e47a2809 100644 --- a/lib/models/new_models/arrival_verification_type_model.dart +++ b/lib/models/new_models/arrival_verification_type_model.dart @@ -1,5 +1,7 @@ +import 'package:test_sa/extensions/enum_extensions.dart'; + class ArrivalVerificationTypeModel { - List? data; + List? data; String? message; String? title; String? innerMessage; @@ -16,9 +18,9 @@ class ArrivalVerificationTypeModel { ArrivalVerificationTypeModel.fromJson(Map json) { if (json['data'] != null) { - data = []; + data = []; json['data'].forEach((v) { - data!.add(Data.fromJson(v)); + data!.add(ArrivalTypeData.fromJson(v)); }); } message = json['message']; @@ -30,38 +32,57 @@ class ArrivalVerificationTypeModel { } -class Data { +class ArrivalTypeData { int? assetGroupId; int? verificationTypeId; VerificationTypes? verificationTypes; int? id; + + String? description; String? createdBy; String? createdDate; dynamic modifiedBy; dynamic modifiedDate; - Data( + ArrivalTypeData( {this.assetGroupId, this.verificationTypeId, this.verificationTypes, this.id, + this.description, this.createdBy, + this.createdDate, this.modifiedBy, this.modifiedDate}); - Data.fromJson(Map json) { + ArrivalTypeData.fromJson(Map json) { assetGroupId = json['assetGroupId']; verificationTypeId = json['verificationTypeId']; verificationTypes = json['verificationTypes'] != null ? VerificationTypes.fromJson(json['verificationTypes']) : null; id = json['id']; + description = json['description']; createdBy = json['createdBy']; createdDate = json['createdDate']; modifiedBy = json['modifiedBy']; modifiedDate = json['modifiedDate']; } + Map toJson() { + return { + 'assetGroupId': assetGroupId, + 'verificationTypeId': verificationTypeId, + 'verificationTypes': verificationTypes?.toJson(), + 'id': id, + 'createdBy': createdBy, + 'createdDate': createdDate, + 'description': description, + 'modifiedBy': modifiedBy, + 'modifiedDate': modifiedDate, + }; + } + } @@ -69,13 +90,23 @@ class VerificationTypes { int? id; String? name; int? value; + String?icon; - VerificationTypes({this.id, this.name, this.value}); + VerificationTypes({this.id, this.name, this.value,this.icon}); VerificationTypes.fromJson(Map json) { id = json['id']; name = json['name']; value = json['value']; + icon = (json['value'] as int).getVerificationIconByValue(); + } + Map toJson() { + return { + 'id': id, + 'name': name, + 'value': value, + }; } + } diff --git a/lib/models/new_models/work_order_detail_model.dart b/lib/models/new_models/work_order_detail_model.dart index b003c57e..8fcbd3c5 100644 --- a/lib/models/new_models/work_order_detail_model.dart +++ b/lib/models/new_models/work_order_detail_model.dart @@ -112,7 +112,7 @@ class WorkOrderData { Lookup? requestedThrough; Lookup? typeofRequest; Lookup? loanAvailablity; - Lookup? assetLoan; + AssetLoan? assetLoan; Lookup? safety; Lookup? problemDescription; String? comments; @@ -157,7 +157,7 @@ class WorkOrderData { requestedThrough: json["requestedThrough"] == null ? null : Lookup.fromJson(json["requestedThrough"]), typeofRequest: json["typeofRequest"] == null ? null : Lookup.fromJson(json["typeofRequest"]), loanAvailablity: json["loanAvailablity"] == null ? null : Lookup.fromJson(json["loanAvailablity"]), - assetLoan: json["assetLoan"] == null ? null : Lookup.fromJson(json["assetLoan"]), + assetLoan: json["assetLoan"] == null ? null : AssetLoan.fromJson(json["assetLoan"]), safety: json["safety"] == null ? null : Lookup.fromJson(json["safety"]), problemDescription: json["problemDescription"] == null ? null : Lookup.fromJson(json["problemDescription"]), comments: json["comments"], @@ -332,6 +332,43 @@ class WorkOrderAssignedEmployee { "languageId": languageId, }; } +class AssetLoan { + AssetLoan({ + required this.id, + required this.assetSerialNo, + required this.tagCode, + required this.systemId, + required this.assetNumber, + required this.assetName, + }); + + dynamic id; + dynamic tagCode; + dynamic systemId; + String? assetSerialNo; + String? assetNumber; + String? assetName; + + factory AssetLoan.fromJson(Map json) { + return AssetLoan( + id: json["id"], + tagCode: json["tagCode"], + systemId: json["systemId"], + assetSerialNo: json["assetSerialNo"], + assetNumber: json["assetNumber"], + assetName: json["assetName"], + ); + } + + Map toJson() => { + "id": id, + "assetName": assetName, + "assetNumber": assetNumber, + "assetSerialNo": assetSerialNo, + "tagCode": tagCode, + "systemId": systemId, + }; +} class Activities { int? id; @@ -621,7 +658,6 @@ class ActivityMaintenance { this.assistantEmployees}); ActivityMaintenance.fromJson(Map json) { - print('activity status i got is ${json['activityStatus']}'); id = json['id']; activityStatus = json['activityStatus'] != null ? ActivityStatus.fromJson(json['activityStatus']) : null; startTime = json['startTime']; diff --git a/lib/new_views/common_widgets/single_item_drop_down_menu.dart b/lib/new_views/common_widgets/single_item_drop_down_menu.dart index 8672818a..879865da 100644 --- a/lib/new_views/common_widgets/single_item_drop_down_menu.dart +++ b/lib/new_views/common_widgets/single_item_drop_down_menu.dart @@ -53,16 +53,6 @@ class _SingleItemDropDownMenuState(widget.context); } - print('initial value i got is ${widget.initialValue?.identifier}'); - print('condition value ${X == NullableLoadingProvider}'); - if(widget.staticData!=null){ - - - for(int i = 0;i element.identifier == widget.initialValue?.identifier); if (result?.isNotEmpty ?? false) _selectedItem = result!.first as T?; 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 f352d944..927f1ead 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 @@ -1,5 +1,8 @@ //service request item page import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; +import 'package:test_sa/dashboard_latest/dashboard_provider.dart'; import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/string_extensions.dart'; @@ -69,8 +72,9 @@ class ServiceRequestItemView extends StatelessWidget { ], ), ], - ).toShadowContainer(context, withShadow: showShadow).onPress(() { - Navigator.of(context).push(MaterialPageRoute(builder: (_) => RequestDetailMain(requestId: requestData!.id!))); + ).toShadowContainer(context, withShadow: showShadow).onPress(() async{ + await Navigator.of(context).push(MaterialPageRoute(builder: (_) => RequestDetailMain(requestId: requestData!.id!))); + Provider.of(context, listen: false).refreshDashboard(userType: Provider.of(context, listen: false).user!.type!, context: context); }); } if (requestDetails != null) { diff --git a/lib/providers/service_request_providers/equipment_status_provider.dart b/lib/providers/service_request_providers/equipment_status_provider.dart index e92251c6..d3280398 100644 --- a/lib/providers/service_request_providers/equipment_status_provider.dart +++ b/lib/providers/service_request_providers/equipment_status_provider.dart @@ -16,7 +16,6 @@ class EquipmentStatusProvider extends LoadingListNotifier { try { Response response = await ApiManager.instance.get(URLs.equipmentStatus); stateCode = response.statusCode; - print('response of get status value is ${response.body}'); if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(response.body)["data"]; diff --git a/lib/service_request_latest/request_detail_provider.dart b/lib/service_request_latest/request_detail_provider.dart index b7d65286..fc15ca13 100644 --- a/lib/service_request_latest/request_detail_provider.dart +++ b/lib/service_request_latest/request_detail_provider.dart @@ -29,6 +29,7 @@ class RequestDetailProvider extends ChangeNotifier { void startTimer() { if (isTimerRunning) return; + resetTimer(); timer = Timer.periodic(const Duration(seconds: 1), (Timer t) { timerStartTime = timerStartTime.add(const Duration(seconds: 1)); notifyListeners(); // Notify UI when time is updated @@ -38,10 +39,7 @@ class RequestDetailProvider extends ChangeNotifier { } void stopTimer() { - Timer.periodic(const Duration(seconds: 1), (Timer t) { - timerStartTime = timerStartTime.add(const Duration(seconds: 1)); - notifyListeners(); // Notify UI when time is updated - }); + resetTimer(); timer?.cancel(); isTimerRunning = false; engineerStopTimer(); @@ -57,6 +55,15 @@ class RequestDetailProvider extends ChangeNotifier { DateTime get currentTime => timerStartTime; bool _isLoading = false; + bool _isArrivalLoading = false; + + + bool get isArrivalLoading => _isArrivalLoading; + + set isArrivalLoading(bool value) { + _isArrivalLoading = value; + notifyListeners(); + } bool get isLoading => _isLoading; @@ -76,7 +83,7 @@ class RequestDetailProvider extends ChangeNotifier { EngineerRejectHelperModel? engineerRejectHelperModel = EngineerRejectHelperModel(); EngineerUpdateWorkOrderHelperModel? engineerUpdateWorkOrderHelperModel = EngineerUpdateWorkOrderHelperModel(); WorkOrderHelperModel? workOrderHelperModel; - + List ?arrivalTypeList =[]; void updateAssetRetiredHelperModel(AssetRetiredHelperModel? value) { assetRetiredHelperModel = value; notifyListeners(); @@ -159,7 +166,6 @@ class RequestDetailProvider extends ChangeNotifier { body: workOrderHelperModel!.toJson(), ); stateCode = response.statusCode; - print('response of create request is ${response.body}'); if (response.statusCode >= 200 && response.statusCode < 300) { // request.engineerName = employee.name; } @@ -222,7 +228,6 @@ class RequestDetailProvider extends ChangeNotifier { isLoading = true; notifyListeners(); response = await ApiManager.instance.post(URLs.engineerStopTimer, body: body); - print('response of stop timer is ${response.body}'); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { @@ -312,8 +317,6 @@ class RequestDetailProvider extends ChangeNotifier { notifyListeners(); response = await ApiManager.instance.post(URLs.engineerUpdateNeedVisitUrl, body: needVisitHelperModel!.toJson()); stateCode = response.statusCode; - print('body i got is ${needVisitHelperModel?.toJson()}'); - print('response i got is ${response.body}'); if (response.statusCode >= 200 && response.statusCode < 300) { currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body)); } @@ -338,7 +341,6 @@ class RequestDetailProvider extends ChangeNotifier { response = await ApiManager.instance.post(URLs.engineerMarkAsFixUrl, body: body); stateCode = response.statusCode; - print('engineer mark as fixed response is ${response.body}'); if (response.statusCode >= 200 && response.statusCode < 300) { currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body)); } @@ -385,7 +387,7 @@ class RequestDetailProvider extends ChangeNotifier { response = await ApiManager.instance.post(URLs.engineerConfirmArriveUrl, body: body); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { - // print('response of Engineer confirm arrival ${response.body}'); + currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body)); } isLoading = false; notifyListeners(); @@ -453,7 +455,7 @@ class RequestDetailProvider extends ChangeNotifier { if (response.statusCode >= 200 && response.statusCode < 300) { - commonResponseModel = CommonResponseModel.fromJson(json.decode(response.body)); + // commonResponseModel = CommonResponseModel.fromJson(json.decode(response.body)); } isLoading = false; notifyListeners(); @@ -476,7 +478,7 @@ class RequestDetailProvider extends ChangeNotifier { stateCode = response.statusCode; CommonResponseModel commonResponseModel = CommonResponseModel(); if (response.statusCode >= 200 && response.statusCode < 300) { - commonResponseModel = CommonResponseModel.fromJson(json.decode(response.body)); + // commonResponseModel = CommonResponseModel.fromJson(json.decode(response.body)); } isLoading = false; notifyListeners(); @@ -495,7 +497,6 @@ class RequestDetailProvider extends ChangeNotifier { try { final response = await ApiManager.instance.post(URLs.updateActivitySparePartUrl, body: sparePartHelperModel!.toJson()); stateCode = response.statusCode; - print('update response i got is ${response.body}'); if (response.statusCode >= 200 && response.statusCode < 300) { // request.engineerName = employee.name; } @@ -533,7 +534,6 @@ class RequestDetailProvider extends ChangeNotifier { try { Response response = await ApiManager.instance.get("${URLs.getSuppliersAutoComplete}?searchText=$supplierName"); stateCode = response.statusCode; - print('response i got is ${json.decode(response.body)["data"]}'); List persons = []; if (response.statusCode >= 200 && response.statusCode < 300) { List categoriesListJson = json.decode(response.body)["data"][0]['suppPersons']; @@ -555,7 +555,6 @@ class RequestDetailProvider extends ChangeNotifier { try { final response = await ApiManager.instance.post(URLs.deleteActivitySparePartUrl, body: body); stateCode = response.statusCode; - print('response of delete activity spare part is ${response.statusCode}'); if (response.statusCode >= 200 && response.statusCode < 300) { //map to the model... @@ -604,7 +603,6 @@ class RequestDetailProvider extends ChangeNotifier { body: sparePartHelperModel!.toJson(), ); stateCode = response.statusCode; - print('add sparepart activity response i got is ${response.body}'); if (response.statusCode >= 200 && response.statusCode < 300) { // currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body)); // // updateCurrentWorkOrder(currentWorkOrder); @@ -629,7 +627,6 @@ class RequestDetailProvider extends ChangeNotifier { body: activityMaintenanceHelperModel!.toJson(), ); stateCode = response.statusCode; - print('add maintenance activity response i got is ${response.body}'); if (response.statusCode >= 200 && response.statusCode < 300) { // currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body)); // updateCurrentWorkOrder(currentWorkOrder); @@ -668,24 +665,25 @@ class RequestDetailProvider extends ChangeNotifier { } //get Arrival type...... - Future getArrivalVerificationType() async { - ArrivalVerificationTypeModel arrivalVerificationTypeModel = ArrivalVerificationTypeModel(); + Future getArrivalVerificationType() async { + try { - isLoading = true; + isArrivalLoading = true; notifyListeners(); final response = await ApiManager.instance.get(URLs.getArrivalVerificationTypeUrl); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { - arrivalVerificationTypeModel = ArrivalVerificationTypeModel.fromJson(json.decode(response.body)); + ArrivalVerificationTypeModel arrivalVerificationTypeModel = ArrivalVerificationTypeModel.fromJson(json.decode(response.body)); + arrivalTypeList = arrivalVerificationTypeModel.data; } - isLoading = false; + isArrivalLoading = false; notifyListeners(); - return arrivalVerificationTypeModel; + return response.statusCode; } catch (e) { log("getArrivalVerifaction [error] : $e"); - isLoading = false; + isArrivalLoading = false; notifyListeners(); - return arrivalVerificationTypeModel; + return -1; } } @@ -697,10 +695,7 @@ class RequestDetailProvider extends ChangeNotifier { final response = await ApiManager.instance.postWithOutBody( URLs.sendOtpUrl + "$workOrderId", ); - print('url for send otp is ${URLs.sendOtpUrl + "$workOrderId"}'); stateCode = response.statusCode; - print('response i got is ${response.body}'); - if (response.statusCode >= 200 && response.statusCode < 300) {} isLoading = false; notifyListeners(); diff --git a/lib/service_request_latest/utilities/service_request_utils.dart b/lib/service_request_latest/utilities/service_request_utils.dart new file mode 100644 index 00000000..5acb4a51 --- /dev/null +++ b/lib/service_request_latest/utilities/service_request_utils.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; + +class ServiceRequestUtils{ + static int calculateAndAssignWorkingHours({ + required DateTime? startTime, + required DateTime? endTime, + required TextEditingController workingHoursController, + required Function(int) updateModel, // A callback to update the model + }) { + print('end date i got is ${endTime}'); + if (startTime != null && endTime != null) { + + Duration difference = endTime.difference(startTime); + int hours = difference.inHours; + + // Update the controller and model + workingHoursController.text = hours.toString(); + updateModel(hours); // Call the function to update the model + + return hours; + } else { + return -1; // Indicating invalid input + } + } +} \ No newline at end of file diff --git a/lib/service_request_latest/views/components/action_button/footer_action_button.dart b/lib/service_request_latest/views/components/action_button/footer_action_button.dart index 693f1f9d..7eb30a5c 100644 --- a/lib/service_request_latest/views/components/action_button/footer_action_button.dart +++ b/lib/service_request_latest/views/components/action_button/footer_action_button.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; +import 'package:test_sa/dashboard_latest/dashboard_provider.dart'; import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart'; @@ -45,7 +46,6 @@ class FooterActionButton { break; // TODO: Handle this case. case WorkOrderNextStepEnum.nTakeAction: - print('i am here take action ..'); // const SizedBox().flushBar(context: context, title: context.translation.youMarkedThisIssueAsFixedWaitingForTheRequesterToConfirm, message: ''); return footerContainer( child: AppFilledButton( @@ -134,7 +134,7 @@ class FooterActionButton { case WorkOrderNextStepEnum.verifyAssetDetail: return footerContainer( child: AppFilledButton( - label: context.translation.verify_asset_details, + label: context.translation.updateAssetDetails, // maxWidth: true, buttonColor: AppColor.primary10, onPressed: () async { @@ -162,6 +162,7 @@ class FooterActionButton { buttonColor: AppColor.green70, onPressed: () async { ServiceRequestBottomSheet.feedBackBottomSheet(context: context); + }, ), ] @@ -181,10 +182,7 @@ class FooterActionButton { } } else { - print('value is ${workOrderNextStepStatus}'); if (workOrderNextStepStatus == WorkOrderNextStepEnum.nTakeAction) { - print('i am here take action ..'); - return footerContainer( child: AppFilledButton( label: context.translation.takeAction, diff --git a/lib/service_request_latest/views/components/bottom_sheets/service_request_bottomsheet.dart b/lib/service_request_latest/views/components/bottom_sheets/service_request_bottomsheet.dart index 5989533d..7b4735f3 100644 --- a/lib/service_request_latest/views/components/bottom_sheets/service_request_bottomsheet.dart +++ b/lib/service_request_latest/views/components/bottom_sheets/service_request_bottomsheet.dart @@ -4,7 +4,8 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/app_strings/app_asset.dart'; -import 'package:test_sa/dashboard_latest/widgets/request_category_list.dart'; +import 'package:test_sa/controllers/providers/api/user_provider.dart'; +import 'package:test_sa/dashboard_latest/dashboard_provider.dart'; import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/string_extensions.dart'; @@ -18,6 +19,7 @@ import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/new_views/common_widgets/single_item_drop_down_menu.dart'; import 'package:test_sa/providers/service_request_providers/reject_reason_provider.dart'; import 'package:test_sa/service_request_latest/request_detail_provider.dart'; +import 'package:test_sa/service_request_latest/utilities/service_request_utils.dart'; import 'package:test_sa/service_request_latest/views/forms/maintenance_request/maintenance_request_main.dart'; import 'package:test_sa/service_request_latest/views/forms/spare_part/spare_part_request.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; @@ -43,23 +45,6 @@ class ServiceRequestBottomSheet { static Future fixRemotelyBottomSheet({required BuildContext context}) { TextEditingController _workingHoursController = TextEditingController(); - int calculateWorkingHours(DateTime? startTime, DateTime? endTime) { - if (startTime != null && endTime != null) { - Duration difference = endTime.difference(startTime); - int hours = difference.inHours; - return hours; - } else { - return -1; - } - } - - assignWorkingHours({required RequestDetailProvider requestDetailProvider}) { - int hours = calculateWorkingHours(requestDetailProvider.fixRemotelyHelperModel?.startDate, requestDetailProvider.fixRemotelyHelperModel?.endDate); - if (hours != -1) { - _workingHoursController.text = hours.toString(); - requestDetailProvider.fixRemotelyHelperModel?.workingHour = hours; - } - } return buildBottomSheetParent( context: context, @@ -97,8 +82,17 @@ class ServiceRequestBottomSheet { ); requestDetailProvider.fixRemotelyHelperModel?.startDate = selectedDateTime; + requestDetailProvider.fixRemotelyHelperModel?.endDate = null; requestDetailProvider.updateFixRemotelyHelperModel(requestDetailProvider.fixRemotelyHelperModel); - assignWorkingHours(requestDetailProvider: requestDetailProvider); + _workingHoursController.clear(); + ServiceRequestUtils.calculateAndAssignWorkingHours( + startTime: requestDetailProvider.fixRemotelyHelperModel?.startDate, + endTime: requestDetailProvider.fixRemotelyHelperModel?.endDate, + workingHoursController: _workingHoursController, + updateModel: (hours) { + requestDetailProvider.fixRemotelyHelperModel?.workingHour = hours; + }, + ); // serviceRequestProvider.updateCurrentSelectedRequest(serviceRequestProvider.currentSelectedRequest); } }); @@ -131,12 +125,16 @@ class ServiceRequestBottomSheet { "End Date time must be greater then start date".showToast; return; } - requestDetailProvider.fixRemotelyHelperModel?.endDate = selectedDateTime; requestDetailProvider.updateFixRemotelyHelperModel(requestDetailProvider.fixRemotelyHelperModel); - assignWorkingHours(requestDetailProvider: requestDetailProvider); - - // serviceRequestProvider.updateCurrentSelectedRequest(serviceRequestProvider.currentSelectedRequest); + ServiceRequestUtils.calculateAndAssignWorkingHours( + startTime: requestDetailProvider.fixRemotelyHelperModel?.startDate, + endTime: requestDetailProvider.fixRemotelyHelperModel?.endDate, + workingHoursController: _workingHoursController, + updateModel: (hours) { + requestDetailProvider.fixRemotelyHelperModel?.workingHour = hours; + }, + ); } }); }, @@ -203,6 +201,7 @@ class ServiceRequestBottomSheet { onPressed: () async { requestDetailProvider.fixRemotelyHelperModel?.workOrderId = requestDetailProvider.currentWorkOrder?.data?.requestId; requestDetailProvider.engineerFixRemotely(); + //TODO context issue to show message.. Navigator.pop(context); // const SizedBox().flushBar(context: context, title: '', message: context.translation.youMarkedThisIssueAsFixedWaitingForTheRequesterToConfirm); @@ -606,6 +605,10 @@ class ServiceRequestBottomSheet { onPressed: () { Navigator.pop(context); requestDetailProvider.engineerMarkAsFixed(workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!, feedback: feedback); + //TODO dashobard refresh.. + // DashBoardProvider dashboardProvider = Provider.of(context,listen: false); + // UserProvider userProvider = Provider.of(context,listen: false); + // dashboardProvider.refreshDashboard(userType:userProvider.user!.type!,context: context); }, ), ], @@ -728,7 +731,6 @@ class ServiceRequestBottomSheet { if (signature == null || signature.isEmpty) return; newSignature = signature; nurseSignature = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; - print('signature i got is ${newSignature}'); }); }, onSaved: (signature) { @@ -737,7 +739,6 @@ class ServiceRequestBottomSheet { if (signature == null || signature.isEmpty) return; newSignature = signature; nurseSignature = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; - print('signature i got is ${newSignature}'); }); }, ), @@ -775,9 +776,7 @@ class ServiceRequestBottomSheet { signatureNurse: nurseSignature, ); requestDetailProvider.nurseConfirm(); - if(requestDetailProvider.currentWorkOrder!.data!.requestId!=null){ requestDetailProvider.getWorkOrderById(id: requestDetailProvider.currentWorkOrder!.data!.requestId!); - } Navigator.pop(context); }else{ //show some toast... 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 3f9af524..5fdd5b06 100644 --- a/lib/service_request_latest/views/components/request_detail_view.dart +++ b/lib/service_request_latest/views/components/request_detail_view.dart @@ -1,3 +1,5 @@ +import 'dart:developer'; + import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; @@ -30,7 +32,6 @@ class WorkOrderDetailView extends StatelessWidget { Widget build(BuildContext context) { UserProvider _userProvider = Provider.of(context, listen: false); return Consumer(builder: (pContext, requestProvider, _) { - return requestProvider.isLoading ? const CircularProgressIndicator(color: AppColor.primary10).center : requestProvider.currentWorkOrder == null @@ -67,7 +68,6 @@ class WorkOrderDetailView extends StatelessWidget { } Widget workOrderDetailCard(BuildContext context, WorkOrderData workOrder, UserProvider userProvider) { - return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -102,10 +102,11 @@ class WorkOrderDetailView extends StatelessWidget { Column( crossAxisAlignment: CrossAxisAlignment.end, children: [ - if (userProvider.user!.type == UsersTypes.normal_user) - context.translation.code.toSvgAsset(width: 48).onPress(() { - // Navigator.push(context, MaterialPageRoute(builder: (context) => UpdateServiceRequestPage(serviceRequest: serviceRequest))); - }), + //TODO need to check + // if (userProvider.user!.type == UsersTypes.normal_user) + // context.translation.code.toSvgAsset(width: 48).onPress(() { + // // Navigator.push(context, MaterialPageRoute(builder: (context) => UpdateServiceRequestPage(serviceRequest: serviceRequest))); + // }), if (userProvider.user!.type == UsersTypes.engineer) 16.height, Text( workOrder.requestedDate!.toString().toServiceRequestCardFormat, diff --git a/lib/service_request_latest/views/components/timer_widget.dart b/lib/service_request_latest/views/components/timer_widget.dart index 82955002..ed3a5155 100644 --- a/lib/service_request_latest/views/components/timer_widget.dart +++ b/lib/service_request_latest/views/components/timer_widget.dart @@ -58,30 +58,23 @@ class _TimerWidgetState extends State { } Widget buildTimerWidget(RequestDetailProvider provider) { - return GestureDetector( - onTap: () { - if (provider.isTimerRunning) { - provider.stopTimer(); - } - }, - child: Container( - padding: EdgeInsets.all(8.toScreenHeight), - width: 80.toScreenWidth, - decoration: BoxDecoration( - color: AppColor.black10, - borderRadius: BorderRadius.circular(10), - ), - child: - Column( - children: [ - 'drag_icon'.toSvgAsset(), - 12.height, - provider.currentTime.toString().toDragAbleTimerFormat.tinyFont(context).custom(color: AppColor.white10, fontWeight: FontWeight.w600), - 2.height, - context.translation.hours.tinyFont(context).custom(color: AppColor.white10, fontWeight: FontWeight.w600), - ], - ), + return Container( + padding: EdgeInsets.all(8.toScreenHeight), + width: 80.toScreenWidth, + decoration: BoxDecoration( + color: AppColor.black10, + borderRadius: BorderRadius.circular(10), ), + child: + Column( + children: [ + 'drag_icon'.toSvgAsset(), + 12.height, + provider.currentTime.toString().toDragAbleTimerFormat.tinyFont(context).custom(color: AppColor.white10, fontWeight: FontWeight.w600), + 2.height, + context.translation.hours.tinyFont(context).custom(color: AppColor.white10, fontWeight: FontWeight.w600), + ], + ), ); } } diff --git a/lib/service_request_latest/views/components/verify_arrival_view.dart b/lib/service_request_latest/views/components/verify_arrival_view.dart index a4132de0..ebdb1b6e 100644 --- a/lib/service_request_latest/views/components/verify_arrival_view.dart +++ b/lib/service_request_latest/views/components/verify_arrival_view.dart @@ -1,30 +1,21 @@ import 'dart:convert'; import 'dart:io'; - import 'package:flutter/material.dart'; -import 'package:flutter_svg/svg.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:image_picker/image_picker.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/app_strings/app_asset.dart'; -import 'package:test_sa/controllers/providers/api/service_requests_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/new_models/arrival_verification_type_model.dart'; -import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; +import 'package:test_sa/new_views/common_widgets/app_lazy_loading.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/verify_otp_view.dart'; -import 'package:test_sa/service_request_latest/views/forms/asset_retired/asset_retired.dart'; -import 'package:test_sa/service_request_latest/views/forms/asset_retired/verify_asset_detail.dart'; -import 'package:test_sa/service_request_latest/views/request_detail_main_view.dart'; +import 'package:test_sa/views/widgets/loaders/no_data_found.dart'; import 'package:test_sa/views/widgets/qr/scan_qr.dart'; -import 'activities_list_view.dart'; - class VerifyArrivalView extends StatefulWidget { const VerifyArrivalView({Key? key}) : super(key: key); @@ -33,12 +24,8 @@ class VerifyArrivalView extends StatefulWidget { } class _VerifyArrivalViewState extends State { - ArrivalVerificationTypeModel? arrivalVerificationTypeModel; - @override void initState() { - //TODO call this when all data is confirmed - // getInitialData(); WidgetsBinding.instance.addPostFrameCallback((_) { getInitialData(); }); @@ -47,46 +34,40 @@ class _VerifyArrivalViewState extends State { Future getInitialData() async { RequestDetailProvider requestDetailProvider = Provider.of(context, listen: false); - arrivalVerificationTypeModel = await requestDetailProvider.getArrivalVerificationType(); - print('data i got is${arrivalVerificationTypeModel?.data?.first?.verificationTypeId}'); + await requestDetailProvider.getArrivalVerificationType(); } @override Widget build(BuildContext context) { - //TODO replace the list with Api... - final List> items = [ - {'heading': context.translation.scanQr, 'subHeading': context.translation.scanQrDetail, 'icon': AppAsset.scanQrIcon, 'id': 1}, - {'heading': context.translation.askRequester, 'subHeading': context.translation.askRequesterDetail, 'icon': AppAsset.askRequesterIcon, 'id': 2}, - {'heading': context.translation.askOtp, 'subHeading': context.translation.askOtpDetail, 'icon': AppAsset.askOtpIcon, 'id': 3}, - {'heading': context.translation.takeDevicePhoto, 'subHeading': context.translation.takeDevicePhotoDetail, 'icon': AppAsset.takeDevicePhotoIcon, 'id': 4}, - ]; return Scaffold( appBar: DefaultAppBar(title: context.translation.verifyArrival), //backgroundColor: const Color(0xfff8f9fb), body: Consumer(builder: (context, RequestDetailProvider requestDetailProvider, child) { return SafeArea( - child: ListView.builder( - padding: EdgeInsets.zero, - itemCount: items.length, - itemBuilder: (context, index) { - final item = items[index]; - return customListItem( - icon: item['icon']!, - heading: item['heading']!, - subHeading: item['subHeading']!, - context: context, - onTap: () { - onItemTap(requestDetailProvider: requestDetailProvider, index: index, context: context); - }); - }, - ).paddingOnly(start: 16, end: 16, top: 12, bottom: 12), + child: requestDetailProvider.isArrivalLoading + ? const CircularProgressIndicator(color: AppColor.primary10).center + : requestDetailProvider.arrivalTypeList!.isEmpty + ? const NoDataFound().center + : ListView.builder( + padding: EdgeInsets.zero, + itemCount: requestDetailProvider.arrivalTypeList!.length, + itemBuilder: (builderContext, index) { + final item = requestDetailProvider.arrivalTypeList?[index]; + return customListItem( + icon: item?.verificationTypes!.icon ?? '', + heading: item?.verificationTypes!.name ?? '', + subHeading: item?.description ?? '', + onTap: () { + onItemTap(requestDetailProvider: requestDetailProvider, index: index, context: context); + }); + }, + ).paddingOnly(start: 16, end: 16, top: 12, bottom: 12), ); }), ); } Widget customListItem({ - required BuildContext context, required String icon, required String heading, required String subHeading, @@ -143,21 +124,20 @@ class _VerifyArrivalViewState extends State { if (result != null) { try { //TODO show loader. - // showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); - + showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); status = await requestDetailProvider.engineerConfirmArrival( workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!, verificationTypeId: 1, photoInfo: '', otp: '', assetNo: result); if (status == 200) { requestDetailProvider.getWorkOrderById(id: requestDetailProvider.currentWorkOrder!.data!.requestId!); - //Navigator.pop(context); + Navigator.pop(context); requestDetailProvider.startTimer(); - Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => RequestDetailMain(requestId: requestDetailProvider.currentWorkOrder!.data!.requestId!))); + Navigator.pop(context); } else { - // Navigator.pop(context); + Navigator.pop(context); //show some message. } } catch (e) { - // Navigator.pop(context); + Navigator.pop(context); print('error i got is $e'); } } @@ -166,15 +146,11 @@ class _VerifyArrivalViewState extends State { Fluttertoast.showToast(msg: 'Under process...' ?? "", toastLength: Toast.LENGTH_LONG); break; case 2: - //TODO add loader. - // showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); - - requestDetailProvider.sendOtp(workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!); - //Navigator.pop(context); - Navigator.pushReplacement( - context, - MaterialPageRoute(builder: (context) => const VerifyOtpView()), - ); + requestDetailProvider.sendOtp(workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!); + Navigator.pushReplacement( + context, + MaterialPageRoute(builder: (context) => const VerifyOtpView()), + ); break; case 3: File? pickedFile = await onFilePicker(); @@ -183,88 +159,26 @@ class _VerifyArrivalViewState extends State { int? status; try { //TODO add loader - // showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); + showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); status = await requestDetailProvider.engineerConfirmArrival(workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!, verificationTypeId: 4, photoInfo: fileObj, otp: ''); - if (status == 200) { + Navigator.pop(context); requestDetailProvider.getWorkOrderById(id: requestDetailProvider.currentWorkOrder!.data!.requestId!); - // Navigator.pop(context); + Navigator.pop(context); requestDetailProvider.startTimer(); - Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => RequestDetailMain(requestId: requestDetailProvider.currentWorkOrder!.data!.requestId!))); } else { - //show some message. - // Navigator.pop(context); + Navigator.pop(context); } } catch (e) { - print('error i got is $e'); - // Navigator.pop(context); + Navigator.pop(context); } } - - // Navigator.push( - // context, - // MaterialPageRoute(builder: (context) => const VerifyAssetDetails()), - // ); - //push to specific screen... - // Navigator.push( - // context, - // MaterialPageRoute(builder: (context) => const ScanQrView()), - // ); break; } // ScanQr } Future onFilePicker() async { - // ImageSource? source = await showModalBottomSheet( - // context: context, - // builder: (BuildContext context) { - // Widget listCard({required String icon, required String label, required VoidCallback onTap}) { - // return GestureDetector( - // onTap: onTap, - // child: Container( - // constraints: BoxConstraints(minWidth: 111.toScreenWidth, minHeight: 111.toScreenHeight), - // padding: EdgeInsets.symmetric(horizontal: 12.toScreenWidth, vertical: 12.toScreenHeight), - // decoration: BoxDecoration(borderRadius: BorderRadius.circular(12), border: Border.all(width: 1, color: AppColor.white70)), - // child: Column( - // mainAxisSize: MainAxisSize.min, - // crossAxisAlignment: CrossAxisAlignment.start, - // children: [ - // icon.toSvgAsset(), - // 24.height, - // label.bodyText2(context).custom(color: AppColor.black20), - // ], - // ), - // ), - // ); - // } - // - // return Container( - // padding: const EdgeInsets.all(16.0), - // child: Row( - // // mainAxisAlignment: MainAxisAlignment.spaceBetween, - // children: [ - // listCard( - // icon: 'camera_icon', - // label: '${context.translation.open}\n${context.translation.camera}', - // onTap: () { - // Navigator.of(context).pop(ImageSource.camera); - // }, - // ), - // 20.width, - // listCard( - // icon: 'gallery_icon', - // label: '${context.translation.open}\n${context.translation.gallery}', - // onTap: () { - // Navigator.of(context).pop(ImageSource.gallery); - // }, - // ), - // ], - // ), - // ); - // }, - // ); - // if (source == null) return null; File? fileImage; final pickedFile = await ImagePicker().pickImage(source: ImageSource.camera, imageQuality: 70, maxWidth: 800, maxHeight: 800); diff --git a/lib/service_request_latest/views/components/verify_otp_view.dart b/lib/service_request_latest/views/components/verify_otp_view.dart index 9c178ed8..bbd2d8f9 100644 --- a/lib/service_request_latest/views/components/verify_otp_view.dart +++ b/lib/service_request_latest/views/components/verify_otp_view.dart @@ -6,9 +6,9 @@ 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/new_views/common_widgets/app_lazy_loading.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/request_detail_main_view.dart'; class VerifyOtpView extends StatelessWidget { const VerifyOtpView({Key? key}) : super(key: key); @@ -54,16 +54,18 @@ class VerifyOtpView extends StatelessWidget { RequestDetailProvider requestDetailProvider = Provider.of(context, listen: false); int? status; //TODO add loader.. - // showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); + showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); status = await requestDetailProvider.verifyOtp(workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!, otpCode: pin); - print('status i got is $status'); if (status == 200) { await requestDetailProvider.getWorkOrderById(id: requestDetailProvider.currentWorkOrder!.data!.requestId!); await requestDetailProvider.engineerConfirmArrival( workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!, verificationTypeId: 3, photoInfo: '', otp: pin, assetNo: ''); - // Navigator.pop(context); + Navigator.pop(context); requestDetailProvider.startTimer(); - Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => RequestDetailMain(requestId: requestDetailProvider.currentWorkOrder!.data!.requestId!))); + Navigator.pop(context); + } + else{ + Navigator.pop(context); } }, ), diff --git a/lib/service_request_latest/views/forms/asset_retired/asset_retired.dart b/lib/service_request_latest/views/forms/asset_retired/asset_retired.dart index ee16a089..c93f2ad8 100644 --- a/lib/service_request_latest/views/forms/asset_retired/asset_retired.dart +++ b/lib/service_request_latest/views/forms/asset_retired/asset_retired.dart @@ -129,7 +129,6 @@ class _AssetRetiredState extends State with TickerProviderStateMix requestDetailProvider.assetRetiredHelperModel?.activityAssetToBeRetiredAttachments ?.add(ActivityAssetToBeRetiredAttachments(id: 0, name: "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}")); } - print('data i got is ${requestDetailProvider.assetRetiredHelperModel?.toJson()}'); int status= await requestDetailProvider.createActivityAssetToBeRetired(); if(status==200){ Navigator.pop(context); diff --git a/lib/service_request_latest/views/forms/asset_retired/verify_asset_detail.dart b/lib/service_request_latest/views/forms/asset_retired/verify_asset_detail.dart index b1cbcad0..58047cc0 100644 --- a/lib/service_request_latest/views/forms/asset_retired/verify_asset_detail.dart +++ b/lib/service_request_latest/views/forms/asset_retired/verify_asset_detail.dart @@ -27,6 +27,7 @@ import 'package:test_sa/views/widgets/equipment/pick_asset.dart'; import '../../../../../../models/lookup.dart'; import '../../../../../../new_views/common_widgets/default_app_bar.dart'; +import '../../../../controllers/providers/api/devices_provider.dart'; //TODO Have some details need to confirm from backend failure reason, fault description, solutions... class VerifyAssetDetails extends StatefulWidget { @@ -55,6 +56,7 @@ class _VerifyAssetDetailsState extends State with TickerProv super.initState(); } + Future getFaultDescription() async { Provider.of(context, listen: false).getFaultDescriptionList(assetId: _requestDetailProvider?.currentWorkOrder?.data?.asset?.id).then((List? data) { if (data?.isNotEmpty ?? false) { @@ -63,6 +65,17 @@ class _VerifyAssetDetailsState extends State with TickerProv } }); } + Future getLoanAsset() async { + WorkOrderData currentWorkOrderData = _requestDetailProvider!.currentWorkOrder!.data!; + if (currentWorkOrderData.assetLoan != null) { + loanAvailabilityAsset = Asset( + id: currentWorkOrderData.assetLoan?.id, + assetNumber: currentWorkOrderData.assetLoan?.assetNumber, + ); + Provider.of(context,listen: false).getAssets(); + print('devices i got is ${Provider.of(context,listen: false).devices.length }'); + } + } @override Widget build(BuildContext context) { @@ -75,26 +88,32 @@ class _VerifyAssetDetailsState extends State with TickerProv _faultDescriptionProvider = Provider.of(context, listen: false); _equipmentStatusProvider = Provider.of(context, listen: false); _equipmentStatusProvider!.reset(); - _equipmentStatusProvider!.getDate(); + WidgetsBinding.instance.addPostFrameCallback((_) { + _equipmentStatusProvider!.getDate(); + }); _reasonProvider?.serviceRequestId = _requestDetailProvider?.currentWorkOrder!.data!.requestId.toString(); WorkOrderData currentWorkOrderData = _requestDetailProvider!.currentWorkOrder!.data!; + print('asset detail i got is ${currentWorkOrderData.asset?.toJson()}'); _requestDetailProvider?.engineerUpdateWorkOrderHelperModel = EngineerUpdateWorkOrderHelperModel( workOrderId: currentWorkOrderData.requestId, equipmentStatus: currentWorkOrderData.equipmentStatus, loanAvailability: currentWorkOrderData.loanAvailablity, failureReason: currentWorkOrderData.failureReasone, - // faultDescription: currentWorkOrderData.fa, + loanAssetId:currentWorkOrderData.assetLoan?.id, + // faultDescription: currentWorkOrderData.fa, solution: currentWorkOrderData.solution?.name, returnToService: currentWorkOrderData.returnToService, serviceType: currentWorkOrderData.serviceType, ); + + // _requestDetailProvider?.updateEngineerUpdateWorkOrderHelperModel(_requestDetailProvider?.engineerUpdateWorkOrderHelperModel); getFaultDescription(); } return Scaffold( key: _scaffoldKey, - appBar: DefaultAppBar(title: context.translation.verify_asset_details), + appBar: DefaultAppBar(title: context.translation.updateAssetDetails), body: Consumer(builder: (context, RequestDetailProvider requestDetailProvider, child) { return Column( mainAxisAlignment: MainAxisAlignment.spaceBetween, @@ -163,6 +182,7 @@ class _VerifyAssetDetailsState extends State with TickerProv cardColor: AppColor.neutral100, onPickAsset: (asset) { requestDetailProvider.engineerUpdateWorkOrderHelperModel?.loanAssetId = asset.id; + print('asset id i got is ${requestDetailProvider.engineerUpdateWorkOrderHelperModel?.loanAssetId}'); //setState(() { loanAvailabilityAsset = asset; // }); @@ -210,11 +230,11 @@ class _VerifyAssetDetailsState extends State with TickerProv padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 16.toScreenHeight), color: AppColor.white10, child: AppFilledButton( - label: context.translation.verify_asset_details, + label: context.translation.updateAssetDetails, buttonColor: AppColor.primary10, onPressed: () async { //TODO add loader.. - showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); + showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); await requestDetailProvider.engineerUpdateWorkOrder(); Navigator.pop(context); Navigator.pop(context); diff --git a/lib/service_request_latest/views/forms/maintenance_request/components/external_request.dart b/lib/service_request_latest/views/forms/maintenance_request/components/external_request.dart index 18ca109f..0743a773 100644 --- a/lib/service_request_latest/views/forms/maintenance_request/components/external_request.dart +++ b/lib/service_request_latest/views/forms/maintenance_request/components/external_request.dart @@ -1,33 +1,20 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/providers/api/parts_provider.dart'; -import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; -import 'package:test_sa/controllers/providers/api/user_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/string_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; -import 'package:test_sa/models/device/asset.dart'; import 'package:test_sa/models/service_request/service_report.dart'; -import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/service_request/supp_engineer_work_orders.dart'; import 'package:test_sa/models/service_request/supplier_details.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/providers/loading_list_notifier.dart'; -import 'package:test_sa/providers/work_order/reason_provider.dart'; import 'package:test_sa/providers/work_order/vendor_provider.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/utilities/service_request_utils.dart'; import 'package:test_sa/views/pages/user/requests/add_supplier_engineer_bottom_sheet.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; -import 'package:test_sa/views/widgets/date_and_time/time_picker.dart'; -import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; -import '../../../../../controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart'; -import '../../../../../controllers/providers/api/status_drop_down/report/service_types_provider.dart'; -import '../../../../../models/lookup.dart'; import '../../../../../new_views/common_widgets/app_text_form_field.dart'; import '../../../../../new_views/common_widgets/single_item_drop_down_menu.dart'; @@ -97,18 +84,9 @@ class _ExternalMaintenanceRequestState extends State ? null : SuppPersons.fromJson(requestDetailProvider.activityMaintenanceHelperModel?.supEngineer?.toJson()), onSelect: (suppPerson) { - print(suppPerson?.toJson()); if (suppPerson != null) { requestDetailProvider.activityMaintenanceHelperModel?.supEngineer = SuppEngineerWorkOrders.fromJson(suppPerson.toJson()); requestDetailProvider.updateActivityMaintenanceHelperModel(requestDetailProvider.activityMaintenanceHelperModel); - // engineer = SuppEngineerWorkOrders( - // id: suppPerson?.supplierId, - // supplierContactId: suppPerson?.id, - // personName: suppPerson?.personName, - // contact: suppPerson?.contact, - // externalEngCode: suppPerson?.externalEngCode, - // email: suppPerson?.email, - // ); setState(() {}); } }, @@ -168,8 +146,18 @@ class _ExternalMaintenanceRequestState extends State selectedTime.minute, ); requestDetailProvider.activityMaintenanceHelperModel?.supplierStartTime = selectedDateTime; + requestDetailProvider.activityMaintenanceHelperModel?.supplierEndTime = null; requestDetailProvider.updateActivityMaintenanceHelperModel(requestDetailProvider.activityMaintenanceHelperModel); - assignWorkingHours(requestDetailProvider: requestDetailProvider); + _workingHoursController.clear(); + ServiceRequestUtils.calculateAndAssignWorkingHours( + startTime: requestDetailProvider.activityMaintenanceHelperModel!.supplierStartTime, + endTime: requestDetailProvider.activityMaintenanceHelperModel!.supplierStartTime, + workingHoursController: _workingHoursController, + updateModel: (hours) { + requestDetailProvider.activityMaintenanceHelperModel?.supplierWorkingHour = hours; + }, + ); + // assignWorkingHours(requestDetailProvider: requestDetailProvider); } }); }, @@ -202,7 +190,14 @@ class _ExternalMaintenanceRequestState extends State } requestDetailProvider.activityMaintenanceHelperModel?.supplierEndTime = selectedDateTime; requestDetailProvider.updateActivityMaintenanceHelperModel(requestDetailProvider.activityMaintenanceHelperModel); - assignWorkingHours(requestDetailProvider: requestDetailProvider); + ServiceRequestUtils.calculateAndAssignWorkingHours( + startTime: requestDetailProvider.activityMaintenanceHelperModel!.supplierStartTime, + endTime: requestDetailProvider.activityMaintenanceHelperModel!.supplierStartTime, + workingHoursController: _workingHoursController, + updateModel: (hours) { + requestDetailProvider.activityMaintenanceHelperModel?.supplierWorkingHour = hours; + }, + ); } }); }, diff --git a/lib/service_request_latest/views/forms/maintenance_request/components/internal_request.dart b/lib/service_request_latest/views/forms/maintenance_request/components/internal_request.dart index a6805804..ed4bc6f1 100644 --- a/lib/service_request_latest/views/forms/maintenance_request/components/internal_request.dart +++ b/lib/service_request_latest/views/forms/maintenance_request/components/internal_request.dart @@ -13,6 +13,7 @@ import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/providers/service_request_providers/last_situation_provider.dart'; import 'package:test_sa/providers/work_order/activity_status_provider.dart'; import 'package:test_sa/service_request_latest/request_detail_provider.dart'; +import 'package:test_sa/service_request_latest/utilities/service_request_utils.dart'; import 'package:test_sa/service_request_latest/views/forms/maintenance_request/components/assistant_employee_card.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; @@ -140,8 +141,17 @@ class _InternalMaintenanceRequestState extends State selectedTime.minute, ); requestDetailProvider.activityMaintenanceHelperModel?.startTime = selectedDateTime; + requestDetailProvider.activityMaintenanceHelperModel?.endTime = null; requestDetailProvider.updateActivityMaintenanceHelperModel(requestDetailProvider.activityMaintenanceHelperModel); - assignWorkingHours(requestDetailProvider: requestDetailProvider); + _workingHoursController.clear(); + ServiceRequestUtils.calculateAndAssignWorkingHours( + startTime: requestDetailProvider.activityMaintenanceHelperModel!.startTime, + endTime: requestDetailProvider.activityMaintenanceHelperModel!.endTime, + workingHoursController: _workingHoursController, + updateModel: (hours) { + requestDetailProvider.activityMaintenanceHelperModel?.workingHour = hours; + }, + ); } }); }, @@ -168,7 +178,14 @@ class _InternalMaintenanceRequestState extends State } requestDetailProvider.activityMaintenanceHelperModel?.endTime = selectedDateTime; requestDetailProvider.updateActivityMaintenanceHelperModel(requestDetailProvider.activityMaintenanceHelperModel); - assignWorkingHours(requestDetailProvider: requestDetailProvider); + ServiceRequestUtils.calculateAndAssignWorkingHours( + startTime: requestDetailProvider.activityMaintenanceHelperModel!.startTime, + endTime: requestDetailProvider.activityMaintenanceHelperModel!.endTime, + workingHoursController: _workingHoursController, + updateModel: (hours) { + requestDetailProvider.activityMaintenanceHelperModel?.workingHour = hours; + }, + ); } }); }, @@ -296,22 +313,4 @@ class _InternalMaintenanceRequestState extends State }); } - int calculateWorkingHours(DateTime? startTime, DateTime? endTime) { - if (startTime != null && endTime != null) { - Duration difference = endTime.difference(startTime); - int hours = difference.inHours; - int minutes = difference.inMinutes % 60; - return hours; - } else { - return -1; - } - } - - assignWorkingHours({required RequestDetailProvider requestDetailProvider}) { - int hours = calculateWorkingHours(requestDetailProvider.activityMaintenanceHelperModel!.startTime, requestDetailProvider.activityMaintenanceHelperModel!.endTime); - if (hours != -1) { - _workingHoursController.text = hours.toString(); - requestDetailProvider.activityMaintenanceHelperModel!.workingHour = hours; - } - } } diff --git a/lib/service_request_latest/views/forms/spare_part/spare_part_request.dart b/lib/service_request_latest/views/forms/spare_part/spare_part_request.dart index e4bffbae..8ccee786 100644 --- a/lib/service_request_latest/views/forms/spare_part/spare_part_request.dart +++ b/lib/service_request_latest/views/forms/spare_part/spare_part_request.dart @@ -56,7 +56,6 @@ class _SparePartRequestState extends State with TickerProvider super.initState(); _partsProvider = Provider.of(context, listen: false); _requestDetailProvider = Provider.of(context, listen: false); - _requestDetailProvider?.sparePartHelperModel = SparePartHelperModel( id: _requestDetailProvider?.sparePartHelperModel?.id ?? 0, workOrderId: _requestDetailProvider?.sparePartHelperModel?.workOrderId ?? _requestDetailProvider?.currentWorkOrder?.data?.requestId, diff --git a/lib/service_request_latest/views/request_detail_main_view.dart b/lib/service_request_latest/views/request_detail_main_view.dart index 5904d482..728b4ac4 100644 --- a/lib/service_request_latest/views/request_detail_main_view.dart +++ b/lib/service_request_latest/views/request_detail_main_view.dart @@ -28,6 +28,7 @@ class _RequestDetailMainState extends State { @override void initState() { super.initState(); + print("final id:${widget.requestId}"); WidgetsBinding.instance.addPostFrameCallback((_) { _requestProvider = Provider.of(context, listen: false); _requestProvider.getWorkOrderById(id: widget.requestId); @@ -63,7 +64,6 @@ class _RequestDetailMainState extends State { requestDetailProvider.stopTimer(); } Navigator.pop(context); - }), 10.width, Text( diff --git a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart index db409258..5b013604 100644 --- a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart +++ b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart @@ -335,7 +335,6 @@ class _CreateSubWorkOrderPageState extends State { showAsBottomSheet: true, initialValue: engineer == null ? null : SuppPersons.fromJson(engineer!.toJson()), onSelect: (suppPerson) { - print(suppPerson?.toJson()); if (suppPerson != null) { engineer = SuppEngineerWorkOrders.fromJson(suppPerson.toJson()); // engineer = SuppEngineerWorkOrders( diff --git a/lib/views/pages/user/requests/service_request_details.dart b/lib/views/pages/user/requests/service_request_details.dart index ce3ad62c..6e642c8f 100644 --- a/lib/views/pages/user/requests/service_request_details.dart +++ b/lib/views/pages/user/requests/service_request_details.dart @@ -49,7 +49,6 @@ class _ServiceRequestDetailsPageState extends State { WidgetsFlutterBinding.ensureInitialized().addPostFrameCallback((timeStamp) async { Provider.of(context, listen: false).reset(); serviceRequest = await Provider.of(context, listen: false).getServiceRequestObjectById(requestId: widget.serviceRequest.id!); - print('service request i got is ${serviceRequest?.id}'); loading = false; setState(() {}); }); diff --git a/pubspec.lock b/pubspec.lock index 530a0f50..97c7f9fb 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -209,6 +209,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.8" + date_picker_timeline: + dependency: "direct main" + description: + name: date_picker_timeline + sha256: c05e6540fa3055c9036e6f99e758972e14be0e1010d5a6e7a1261d4a6f3292df + url: "https://pub.dev" + source: hosted + version: "1.2.6" dbus: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 07a1a8f6..83887c84 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -73,6 +73,7 @@ dependencies: dotted_border: ^2.1.0 lottie: ^3.1.2 shimmer: ^3.0.0 + date_picker_timeline: ^1.2.6 flutter_advanced_switch: ^3.0.1 table_calendar: ^3.0.8 image_cropper: ^8.0.2