From 62dd395a73b74c79dda71012ed5434109f8ed1ee Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Sun, 22 Jun 2025 12:39:42 +0300 Subject: [PATCH] timer picker added, and code improvements --- .../providers/api/all_requests_provider.dart | 34 +- .../api/service_requests_provider.dart | 360 ++++---- .../providers/api/user_provider.dart | 2 +- .../providers/settings/setting_provider.dart | 2 +- lib/models/all_requests_and_count_model.dart | 55 +- .../new_models/work_order_detail_model.dart | 9 +- lib/models/user.dart | 13 +- .../service_request_detail_provider.dart | 40 +- .../service_request_detail_view.dart | 11 +- .../components/internal_request.dart | 1 - .../ppm_wo/update_ppm/wo_info_form.dart | 2 - .../components/task_info_widget.dart | 1 - .../tasks_wo/update_task_request_view.dart | 1 - .../update_device_transfer.dart | 1 - .../user/gas_refill/request_gas_refill.dart | 1 - .../gas_refill/update_gas_refill_request.dart | 1 - lib/views/pages/user/profile_page.dart | 222 ++--- .../requests/first_action_bottom_sheet.dart | 482 +++++------ .../work_order/edit_service_report.dart | 796 +++++++++--------- .../work_order/update_service_report.dart | 90 +- lib/views/widgets/timer/app_timer.dart | 7 +- 21 files changed, 1084 insertions(+), 1047 deletions(-) diff --git a/lib/controllers/providers/api/all_requests_provider.dart b/lib/controllers/providers/api/all_requests_provider.dart index 77e01375..f756b9ad 100644 --- a/lib/controllers/providers/api/all_requests_provider.dart +++ b/lib/controllers/providers/api/all_requests_provider.dart @@ -168,9 +168,9 @@ class AllRequestsProvider extends ChangeNotifier { stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { if (_allRequestsAndCount == null) { - _allRequestsAndCount = AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]); + _allRequestsAndCount = (await AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0])); } else { - _allRequestsAndCount!.requestsDetails!.addAll(AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]).requestsDetails!); + _allRequestsAndCount!.requestsDetails!.addAll((await AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0])).requestsDetails!); } if (_allRequestsAndCount!.requestsDetails!.length >= pageItemNumber) { nextPage = true; @@ -266,7 +266,7 @@ class AllRequestsProvider extends ChangeNotifier { stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { - calendarRequests = AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]); + calendarRequests = (await AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0])); notifyListeners(); } isCalendarLoading = false; @@ -306,9 +306,9 @@ class AllRequestsProvider extends ChangeNotifier { stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { if (_highPriorityRequests == null) { - _highPriorityRequests = AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]); + _highPriorityRequests = (await AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0])); } else { - _highPriorityRequests!.requestsDetails!.addAll(AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]).requestsDetails!); + _highPriorityRequests!.requestsDetails!.addAll((await AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0])).requestsDetails!); } if (_highPriorityRequests!.requestsDetails!.length >= pageItemNumber) { nextPage = true; @@ -357,9 +357,9 @@ class AllRequestsProvider extends ChangeNotifier { stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { if (_overdueRequests == null) { - _overdueRequests = AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]); + _overdueRequests = (await AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0])); } else { - _overdueRequests!.requestsDetails!.addAll(AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]).requestsDetails!); + _overdueRequests!.requestsDetails!.addAll((await AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0])).requestsDetails!); } if (_overdueRequests!.requestsDetails!.length >= pageItemNumber) { nextPage = true; @@ -412,9 +412,9 @@ class AllRequestsProvider extends ChangeNotifier { stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { if (openRequests == null) { - openRequests = AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]); + openRequests = (await AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0])); } else { - openRequests!.requestsDetails!.addAll(AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]).requestsDetails!); + openRequests!.requestsDetails!.addAll((await AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0])).requestsDetails!); } if (openRequests!.requestsDetails!.length >= pageItemNumber) { nextPage = true; @@ -466,10 +466,10 @@ class AllRequestsProvider extends ChangeNotifier { stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { if (inProgressRequests == null) { - inProgressRequests = AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]); + inProgressRequests = (await AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0])); notifyListeners(); } else { - inProgressRequests!.requestsDetails!.addAll(AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]).requestsDetails!); + inProgressRequests!.requestsDetails!.addAll((await AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0])).requestsDetails!); notifyListeners(); } if (inProgressRequests!.requestsDetails!.length >= pageItemNumber) { @@ -512,11 +512,11 @@ class AllRequestsProvider extends ChangeNotifier { stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { if (filterRequest == null) { - filterRequest = AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]); + filterRequest = (await AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0])); isFilterRequestLoading = false; notifyListeners(); } else { - filterRequest!.requestsDetails!.addAll(AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]).requestsDetails!); + filterRequest!.requestsDetails!.addAll((await AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0])).requestsDetails!); isFilterRequestLoading = false; notifyListeners(); } @@ -548,11 +548,11 @@ class AllRequestsProvider extends ChangeNotifier { stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { if (selectedRequestCategory == null) { - selectedRequestCategory = AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]); + selectedRequestCategory = (await AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0])); isRequestCategoryLoading = false; notifyListeners(); } else { - selectedRequestCategory!.requestsDetails!.addAll(AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]).requestsDetails!); + selectedRequestCategory!.requestsDetails!.addAll((await AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0])).requestsDetails!); isRequestCategoryLoading = false; notifyListeners(); } @@ -600,9 +600,9 @@ class AllRequestsProvider extends ChangeNotifier { stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { if (completedRequests == null) { - completedRequests = AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]); + completedRequests = (await AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0])); } else { - completedRequests!.requestsDetails!.addAll(AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]).requestsDetails!); + completedRequests!.requestsDetails!.addAll((await AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0])).requestsDetails!); } if (completedRequests!.requestsDetails!.length >= pageItemNumber) { nextPage = true; diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index 2063dad5..2ceeacf5 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -278,89 +278,89 @@ class ServiceRequestsProvider extends ChangeNotifier { } } - Future updateRequest({required User user, required ServiceRequest request}) async { - isLoading = true; - notifyListeners(); - Map serviceRequest = await getServiceRequestById(requestId: request.id!); - final List callSiteContacts = (serviceRequest['callSiteContactPerson'] as List); - final Map callSiteContactPerson = callSiteContacts.isEmpty ? {} : callSiteContacts[0]; - Response response; - try { - if ((request.audio ?? "").isNotEmpty) { - request.audio = request.audio!.substring(request.audio!.indexOf("=") + 1, request.audio!.length); - } - } catch (ex) {} - - var body = { - "id": request.id, - "callNo": serviceRequest['callNo'], - "callCreatedBy": serviceRequest['callCreatedBy'], - "requestedDate": request.date ?? "", - "requestedTime": request.date ?? "", - "priority": request.priority?.toJson(), - "defectType": request.defectType?.toJson(), - "typeofRequest": request.type?.toJson(), - "requestedThrough": request.requestedThrough?.toJson(), - "voiceNote": request.audio, - "assets": request.deviceId == null ? [] : [request.deviceId], - "attachmentsCallRequest": (request.devicePhotos?.isNotEmpty ?? false) ? request.devicePhotos?.map((e) => {"name": e.getFileName}).toList() : [], - "assignedEmployee": { - "id": request.engineerId, - "name": request.engineerName, - }, - "callSiteContactPerson": [ - { - "id": callSiteContactPerson['id'] ?? 0, - "employeeCode": callSiteContactPerson['employeeCode'], - "name": callSiteContactPerson['name'] ?? user.userName, - "telephone": callSiteContactPerson['telephone'] ?? user.phoneNumber, - "job": callSiteContactPerson['job'], - "email": callSiteContactPerson['email'] ?? user.email, - "land": callSiteContactPerson['land'], - "contactUserId": user.userID, - }, - ], - "callComments": request.callComments, - "noofFollowup": 0, - "status": request.statusId == null - ? null - : { - "id": request.statusId, - "name": request.statusLabel, - "value": request.statusValue, - }, - "callLastSituation": null, - "firstAction": request.firstAction?.toJson(), - "loanAvailablity": request.loanAvailability?.toJson(), - "comments": request.comments, - "firstActionDate": request.visitDate, - "visitDate": request.visitDate, - "startDate": request.startDate, - "endDate": request.endDate, - "workingHours": request.workingHours, - "callReview": null, - "reviewComment": null, - //"reviewComment": request.reviewComment, - }; - try { - response = await ApiManager.instance.put( - URLs.updateRequestDate, - body: body, - ); - stateCode = response.statusCode; - if (response.statusCode >= 200 && response.statusCode < 300) { - // request.engineerName = employee.name; - notifyListeners(); - } - isLoading = false; - notifyListeners(); - return response.statusCode; - } catch (error) { - isLoading = false; - notifyListeners(); - return -1; - } - } + // Future updateRequest({required User user, required ServiceRequest request}) async { + // isLoading = true; + // notifyListeners(); + // Map serviceRequest = await getServiceRequestById(requestId: request.id!); + // final List callSiteContacts = (serviceRequest['callSiteContactPerson'] as List); + // final Map callSiteContactPerson = callSiteContacts.isEmpty ? {} : callSiteContacts[0]; + // Response response; + // try { + // if ((request.audio ?? "").isNotEmpty) { + // request.audio = request.audio!.substring(request.audio!.indexOf("=") + 1, request.audio!.length); + // } + // } catch (ex) {} + // + // var body = { + // "id": request.id, + // "callNo": serviceRequest['callNo'], + // "callCreatedBy": serviceRequest['callCreatedBy'], + // "requestedDate": request.date ?? "", + // "requestedTime": request.date ?? "", + // "priority": request.priority?.toJson(), + // "defectType": request.defectType?.toJson(), + // "typeofRequest": request.type?.toJson(), + // "requestedThrough": request.requestedThrough?.toJson(), + // "voiceNote": request.audio, + // "assets": request.deviceId == null ? [] : [request.deviceId], + // "attachmentsCallRequest": (request.devicePhotos?.isNotEmpty ?? false) ? request.devicePhotos?.map((e) => {"name": e.getFileName}).toList() : [], + // "assignedEmployee": { + // "id": request.engineerId, + // "name": request.engineerName, + // }, + // "callSiteContactPerson": [ + // { + // "id": callSiteContactPerson['id'] ?? 0, + // "employeeCode": callSiteContactPerson['employeeCode'], + // "name": callSiteContactPerson['name'] ?? user.userName, + // "telephone": callSiteContactPerson['telephone'] ?? user.phoneNumber, + // "job": callSiteContactPerson['job'], + // "email": callSiteContactPerson['email'] ?? user.email, + // "land": callSiteContactPerson['land'], + // "contactUserId": user.userID, + // }, + // ], + // "callComments": request.callComments, + // "noofFollowup": 0, + // "status": request.statusId == null + // ? null + // : { + // "id": request.statusId, + // "name": request.statusLabel, + // "value": request.statusValue, + // }, + // "callLastSituation": null, + // "firstAction": request.firstAction?.toJson(), + // "loanAvailablity": request.loanAvailability?.toJson(), + // "comments": request.comments, + // "firstActionDate": request.visitDate, + // "visitDate": request.visitDate, + // "startDate": request.startDate, + // "endDate": request.endDate, + // "workingHours": request.workingHours, + // "callReview": null, + // "reviewComment": null, + // //"reviewComment": request.reviewComment, + // }; + // try { + // response = await ApiManager.instance.put( + // URLs.updateRequestDate, + // body: body, + // ); + // stateCode = response.statusCode; + // if (response.statusCode >= 200 && response.statusCode < 300) { + // // request.engineerName = employee.name; + // notifyListeners(); + // } + // isLoading = false; + // notifyListeners(); + // return response.statusCode; + // } catch (error) { + // isLoading = false; + // notifyListeners(); + // return -1; + // } + // } Future createServiceReport(BuildContext context, {required ServiceReport report, required User user, required ServiceRequest request}) async { Response response; @@ -595,105 +595,105 @@ class ServiceRequestsProvider extends ChangeNotifier { } } - Future getSingleServiceReport(BuildContext context, {required int reportId}) async { - Response response; - try { - response = await ApiManager.instance.get(URLs.getServiceReport + "?workOrderId=$reportId"); - } catch (error) { - throw (context.translation.failedToCompleteRequest); - } - - // If the call to the server was successful, parse the JSON. - if (response.statusCode >= 200 && response.statusCode < 300) { - // If the call to the server was successful, parse the JSON. - return ServiceReport.fromJson(json.decode(response.body)["data"]); - } else { - throw (("${context.translation.failedToCompleteRequest} ${jsonDecode(response.body)["message"]}")); - } - } - - Future getServiceRequestObjectById({required String requestId}) async { - try { - isDetialLoading = true; - Response response = await ApiManager.instance.get(URLs.getServiceRequestById + "?callRequestId=$requestId"); - if (response.statusCode >= 200 && response.statusCode < 300) { - isDetialLoading = false; - return ServiceRequest.fromJson(json.decode(response.body)["data"]); - } else { - isDetialLoading = false; - return null; - } - } catch (error) { - isDetialLoading = false; - return null; - } - } - - Future> getServiceRequestById({required String requestId}) async { - Response response; - try { - response = await ApiManager.instance.get(URLs.getServiceRequestById + "?callRequestId=$requestId"); - } catch (error) { - print(error); - return {}; - } + // Future getSingleServiceReport(BuildContext context, {required int reportId}) async { + // Response response; + // try { + // response = await ApiManager.instance.get(URLs.getServiceReport + "?workOrderId=$reportId"); + // } catch (error) { + // throw (context.translation.failedToCompleteRequest); + // } + // + // // If the call to the server was successful, parse the JSON. + // if (response.statusCode >= 200 && response.statusCode < 300) { + // // If the call to the server was successful, parse the JSON. + // return ServiceReport.fromJson(json.decode(response.body)["data"]); + // } else { + // throw (("${context.translation.failedToCompleteRequest} ${jsonDecode(response.body)["message"]}")); + // } + // } + // + // Future getServiceRequestObjectById({required String requestId}) async { + // try { + // isDetialLoading = true; + // Response response = await ApiManager.instance.get(URLs.getServiceRequestById + "?callRequestId=$requestId"); + // if (response.statusCode >= 200 && response.statusCode < 300) { + // isDetialLoading = false; + // return ServiceRequest.fromJson(json.decode(response.body)["data"]); + // } else { + // isDetialLoading = false; + // return null; + // } + // } catch (error) { + // isDetialLoading = false; + // return null; + // } + // } - // If the call to the server was successful, parse the JSON. - if (response.statusCode >= 200 && response.statusCode < 300) { - // If the call to the server was successful, parse the JSON. - return { - "callNo": json.decode(response.body)["data"]["callNo"], - "callCreatedBy": json.decode(response.body)["data"]["callCreatedBy"], - "callSiteContactPerson": json.decode(response.body)["data"]["callSiteContactPerson"], - "firstActionDate": json.decode(response.body)["data"]["firstActionDate"], - }; - } else { - return {}; - } - } + // Future> getServiceRequestById({required String requestId}) async { + // Response response; + // try { + // response = await ApiManager.instance.get(URLs.getServiceRequestById + "?callRequestId=$requestId"); + // } catch (error) { + // print(error); + // return {}; + // } + // + // // If the call to the server was successful, parse the JSON. + // if (response.statusCode >= 200 && response.statusCode < 300) { + // // If the call to the server was successful, parse the JSON. + // return { + // "callNo": json.decode(response.body)["data"]["callNo"], + // "callCreatedBy": json.decode(response.body)["data"]["callCreatedBy"], + // "callSiteContactPerson": json.decode(response.body)["data"]["callSiteContactPerson"], + // "firstActionDate": json.decode(response.body)["data"]["firstActionDate"], + // }; + // } else { + // return {}; + // } + // } - Future> searchForWorkOrders( - SearchWorkOrder search, - String callerId, - Lookup dateOperator, - String site, - ) async { - Response response; - try { - var body = { - "pageSize": pageItemNumber, - "pageNumber": ((workOrders.length ?? 0) ~/ pageItemNumber) + 1, - if (callerId.isNotEmpty ?? false) "callId": callerId, - if (search.assetType != null) "assetSerialNo": search.assetType?.name, - if (search.workOrderNo != null) "workOrderNo": search.workOrderNo, - if (search.id != null) "workOrderNo": search.id.toString(), - if (search.calllastSituation != null) "callslastSituationWO": search.calllastSituation!.toJson(), - if (search.assignedEmployee != null) "assignedEmployees": [search.assignedEmployee!.id], - // "statusWO": [], - if (site.isNotEmpty ?? false) "site": site, - if (search.visitDate != null) "visitDateSymbol": dateOperator.toJson(), - if (search.visitDate != null) "visitDateFrom": search.visitDate, - }; - print(body); - response = await ApiManager.instance.post(URLs.searchWorkOrders, body: body); - stateCode = response.statusCode; - if (response.statusCode >= 200 && response.statusCode < 300) { - // client's request was successfully received - List workOrdersJson = json.decode(response.body)["data"]; - workOrders ??= []; - workOrders.addAll(workOrdersJson.map((request) => SearchWorkOrder.fromJson(request)).toList()); - if (workOrders.length == pageItemNumber) { - nextPage = true; - } else { - nextPage = false; - } - } - return workOrders; - } catch (e) { - print(e); - return []; - } - } + // Future> searchForWorkOrders( + // SearchWorkOrder search, + // String callerId, + // Lookup dateOperator, + // String site, + // ) async { + // Response response; + // try { + // var body = { + // "pageSize": pageItemNumber, + // "pageNumber": ((workOrders.length ?? 0) ~/ pageItemNumber) + 1, + // if (callerId.isNotEmpty ?? false) "callId": callerId, + // if (search.assetType != null) "assetSerialNo": search.assetType?.name, + // if (search.workOrderNo != null) "workOrderNo": search.workOrderNo, + // if (search.id != null) "workOrderNo": search.id.toString(), + // if (search.calllastSituation != null) "callslastSituationWO": search.calllastSituation!.toJson(), + // if (search.assignedEmployee != null) "assignedEmployees": [search.assignedEmployee!.id], + // // "statusWO": [], + // if (site.isNotEmpty ?? false) "site": site, + // if (search.visitDate != null) "visitDateSymbol": dateOperator.toJson(), + // if (search.visitDate != null) "visitDateFrom": search.visitDate, + // }; + // print(body); + // response = await ApiManager.instance.post(URLs.searchWorkOrders, body: body); + // stateCode = response.statusCode; + // if (response.statusCode >= 200 && response.statusCode < 300) { + // // client's request was successfully received + // List workOrdersJson = json.decode(response.body)["data"]; + // workOrders ??= []; + // workOrders.addAll(workOrdersJson.map((request) => SearchWorkOrder.fromJson(request)).toList()); + // if (workOrders.length == pageItemNumber) { + // nextPage = true; + // } else { + // nextPage = false; + // } + // } + // return workOrders; + // } catch (e) { + // print(e); + // return []; + // } + // } Future addSupplierEngineer(SupplierEngineer supplierEngineer) async { isLoading = true; diff --git a/lib/controllers/providers/api/user_provider.dart b/lib/controllers/providers/api/user_provider.dart index 559ef226..5fd24da2 100644 --- a/lib/controllers/providers/api/user_provider.dart +++ b/lib/controllers/providers/api/user_provider.dart @@ -94,7 +94,7 @@ class UserProvider extends ChangeNotifier { _loading = false; if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - _user = User.fromJson(jsonDecode(response.body)); + _user = await User.fromJson(jsonDecode(response.body)); _user!.profilePhotoName = URLs.getFileUrl(_user!.profilePhotoName); ApiManager.instance.user = _user; notifyListeners(); diff --git a/lib/controllers/providers/settings/setting_provider.dart b/lib/controllers/providers/settings/setting_provider.dart index f9d007b4..a88736f3 100644 --- a/lib/controllers/providers/settings/setting_provider.dart +++ b/lib/controllers/providers/settings/setting_provider.dart @@ -149,7 +149,7 @@ class SettingProvider extends ChangeNotifier { if (prefs.containsKey(ASettings.user)) { String userJson = prefs.getString(ASettings.user)!; - user = User.fromJson(json.decode(userJson)); + user = await User.fromJson(json.decode(userJson)); selectAssetGroup(user!); } diff --git a/lib/models/all_requests_and_count_model.dart b/lib/models/all_requests_and_count_model.dart index 06b17864..511ece33 100644 --- a/lib/models/all_requests_and_count_model.dart +++ b/lib/models/all_requests_and_count_model.dart @@ -1,5 +1,7 @@ import 'dart:convert'; +import 'package:flutter/foundation.dart'; + class AllRequestsAndCount { CountServiceRequest? countServiceRequest; CountServiceRequest? countGasRefill; @@ -19,7 +21,7 @@ class AllRequestsAndCount { this.requestsDetails, }); - AllRequestsAndCount.fromJson(Map json) { + AllRequestsAndCount.fromJsonCons(Map json) { countServiceRequest = json['countServiceRequest'] != null ? CountServiceRequest.fromJson(json['countServiceRequest']) : null; countGasRefill = json['countGasRefill'] != null ? CountServiceRequest.fromJson(json['countGasRefill']) : null; countAssetTransfer = json['countAssetTransfer'] != null ? CountServiceRequest.fromJson(json['countAssetTransfer']) : null; @@ -34,6 +36,10 @@ class AllRequestsAndCount { } } + static Future fromJson(Map json) { + return compute(AllRequestsAndCount.fromJsonCons, json); + } + Map toJson() { final Map data = {}; if (countServiceRequest != null) { @@ -123,30 +129,29 @@ class RequestsDetails { String? siteTransferTo; int? transactionType; - RequestsDetails({ - this.id, - this.nameOfType, - this.priority, - this.status, - this.assetName, - this.assetNo, - this.assetSN, - this.model, - this.supplier, - this.manufacturer, - this.requestType, - this.requestNo, - this.gasType, - this.site, - this.statusReceiver, - this.assetTransferFrom, - this.assetTransferTo, - this.code, - this.siteTransferFrom, - this.siteTransferTo, - this.date, - this.transactionType - }); + RequestsDetails( + {this.id, + this.nameOfType, + this.priority, + this.status, + this.assetName, + this.assetNo, + this.assetSN, + this.model, + this.supplier, + this.manufacturer, + this.requestType, + this.requestNo, + this.gasType, + this.site, + this.statusReceiver, + this.assetTransferFrom, + this.assetTransferTo, + this.code, + this.siteTransferFrom, + this.siteTransferTo, + this.date, + this.transactionType}); RequestsDetails.fromJson(Map json) { id = json['id']; diff --git a/lib/models/new_models/work_order_detail_model.dart b/lib/models/new_models/work_order_detail_model.dart index faa2c75a..10be7e76 100644 --- a/lib/models/new_models/work_order_detail_model.dart +++ b/lib/models/new_models/work_order_detail_model.dart @@ -1,3 +1,4 @@ +import 'package:flutter/foundation.dart'; import 'package:test_sa/models/fault_description.dart'; import 'package:test_sa/models/helper_data_models/spare_part/activity_spare_part_model.dart'; import 'package:test_sa/models/helper_data_models/workorder/work_order_helper_models.dart'; @@ -20,7 +21,7 @@ class WorkOrderDetail { final int? responseCode; final bool? isSuccess; - factory WorkOrderDetail.fromJson(Map json) { + factory WorkOrderDetail.fromJsonCons(Map json) { return WorkOrderDetail( data: json["data"] == null ? null : WorkOrderData.fromJson(json["data"]), message: json["message"], @@ -31,6 +32,10 @@ class WorkOrderDetail { ); } + static Future fromJson(Map json) { + return compute(WorkOrderDetail.fromJsonCons, json); + } + Map toJson() => { "data": data?.toJson(), "message": message, @@ -465,7 +470,7 @@ class ActivitySparePart { String? comment; List? acitiySparePartAttachments; - ActivitySparePart({this.id, this.partCatalogItem, this.quantity,this.installQty,this.returnQty, this.comment, this.acitiySparePartAttachments}); + ActivitySparePart({this.id, this.partCatalogItem, this.quantity, this.installQty, this.returnQty, this.comment, this.acitiySparePartAttachments}); ActivitySparePart.fromJson(Map json) { id = json['id']; diff --git a/lib/models/user.dart b/lib/models/user.dart index f26ea2dc..dda5d765 100644 --- a/lib/models/user.dart +++ b/lib/models/user.dart @@ -1,5 +1,6 @@ import 'dart:io'; +import 'package:flutter/foundation.dart'; import 'package:test_sa/controllers/notification/firebase_notification_manger.dart'; import 'package:test_sa/models/enums/user_types.dart'; @@ -169,7 +170,11 @@ class User { return map; } - User.fromJson(dynamic json) { + static Future fromJson(Map json) { + return compute(User.fromJsonCons, json); + } + + User.fromJsonCons(dynamic json) { clientId = json['client_id']; clientName = json['client_name']; if (json['department_id'] != null) { @@ -272,9 +277,9 @@ class AssetGroup { int? id; String? name; String? code; - bool ? enabledEngineerTimer; + bool? enabledEngineerTimer; - AssetGroup({this.id, this.name, this.code,this.enabledEngineerTimer}); + AssetGroup({this.id, this.name, this.code, this.enabledEngineerTimer}); AssetGroup.fromJson(Map? json) { // Allow json to be null @@ -283,7 +288,7 @@ class AssetGroup { id = json['id']; name = json['name']; code = json['code']; - enabledEngineerTimer = json['enabledEngineerTimer']; + enabledEngineerTimer = json['enabledEngineerTimer'] ?? false; } } diff --git a/lib/modules/cm_module/service_request_detail_provider.dart b/lib/modules/cm_module/service_request_detail_provider.dart index 8d333177..732806e7 100644 --- a/lib/modules/cm_module/service_request_detail_provider.dart +++ b/lib/modules/cm_module/service_request_detail_provider.dart @@ -236,7 +236,7 @@ class ServiceRequestDetailProvider extends ChangeNotifier { final response = await ApiManager.instance.get(URLs.getWorkOrderByIdUrl + "?workOrderId=$id"); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { - currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body)); + currentWorkOrder = await WorkOrderDetail.fromJson(json.decode(response.body)); //need to check on value as id changed on different env. if (currentWorkOrder?.data?.status?.value == 3 || currentWorkOrder?.data?.status?.value == 5 || currentWorkOrder?.data?.status?.value == 6) { isReadOnlyRequest = true; @@ -270,7 +270,7 @@ class ServiceRequestDetailProvider extends ChangeNotifier { final response = await ApiManager.instance.post(URLs.uploadWorkOrderAttachmentsUrl, body: WorkOrderHelperModel().toUploadAttachmentJson(woId, woAttachments)); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { - currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body)); + currentWorkOrder = await WorkOrderDetail.fromJson(json.decode(response.body)); } isLoading = false; notifyListeners(); @@ -315,7 +315,7 @@ class ServiceRequestDetailProvider extends ChangeNotifier { response = await ApiManager.instance.post(URLs.engineerAcceptUrl, body: body); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { - currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body)); + currentWorkOrder = await WorkOrderDetail.fromJson(json.decode(response.body)); } isLoading = false; notifyListeners(); @@ -337,7 +337,7 @@ class ServiceRequestDetailProvider extends ChangeNotifier { response = await ApiManager.instance.post(URLs.engineerAssignHimSelfUrl, body: body); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { - currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body)); + currentWorkOrder = await WorkOrderDetail.fromJson(json.decode(response.body)); } isLoading = false; notifyListeners(); @@ -379,7 +379,7 @@ class ServiceRequestDetailProvider extends ChangeNotifier { response = await ApiManager.instance.post(URLs.engineerRejectUrl, body: engineerRejectHelperModel!.toJson()); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { - currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body)); + currentWorkOrder = await WorkOrderDetail.fromJson(json.decode(response.body)); } isLoading = false; notifyListeners(); @@ -401,7 +401,7 @@ class ServiceRequestDetailProvider extends ChangeNotifier { response = await ApiManager.instance.post(URLs.engineerFixRemotlyUrl, body: fixRemotelyHelperModel!.toJson()); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { - currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body)); + currentWorkOrder = await WorkOrderDetail.fromJson(json.decode(response.body)); } isLoading = false; notifyListeners(); @@ -423,7 +423,7 @@ class ServiceRequestDetailProvider extends ChangeNotifier { response = await ApiManager.instance.post(URLs.engineerNeedVisitUrl, body: needVisitHelperModel!.toJson()); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { - currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body)); + currentWorkOrder = await WorkOrderDetail.fromJson(json.decode(response.body)); } isLoading = false; notifyListeners(); @@ -445,7 +445,7 @@ class ServiceRequestDetailProvider extends ChangeNotifier { response = await ApiManager.instance.post(URLs.engineerUpdateNeedVisitUrl, body: needVisitHelperModel!.toJson()); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { - currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body)); + currentWorkOrder = await WorkOrderDetail.fromJson(json.decode(response.body)); notifyListeners(); } isLoading = false; @@ -471,7 +471,7 @@ class ServiceRequestDetailProvider extends ChangeNotifier { response = await ApiManager.instance.post(URLs.engineerMarkAsFixUrl, body: body); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { - currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body)); + currentWorkOrder = await WorkOrderDetail.fromJson(json.decode(response.body)); markedAsFixed = true; stopTimer(); } @@ -495,7 +495,7 @@ class ServiceRequestDetailProvider extends ChangeNotifier { response = await ApiManager.instance.put(URLs.reOrderActivity, body: body); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { - currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body)); + currentWorkOrder = await WorkOrderDetail.fromJson(json.decode(response.body)); } isLoading = false; notifyListeners(); @@ -526,7 +526,7 @@ class ServiceRequestDetailProvider extends ChangeNotifier { response = await ApiManager.instance.post(URLs.engineerConfirmArriveUrl, body: body); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { - currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body)); + currentWorkOrder = await WorkOrderDetail.fromJson(json.decode(response.body)); } if (response.statusCode >= 200 && response.statusCode < 300) {} isLoading = false; @@ -554,7 +554,7 @@ class ServiceRequestDetailProvider extends ChangeNotifier { response = await ApiManager.instance.post(URLs.engineerSetReminderUrl, body: body); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { - currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body)); + currentWorkOrder = await WorkOrderDetail.fromJson(json.decode(response.body)); } if (response.statusCode >= 200 && response.statusCode < 300) {} isLoading = false; @@ -599,7 +599,7 @@ class ServiceRequestDetailProvider extends ChangeNotifier { final response = await ApiManager.instance.post(URLs.engineerUpdateWorkOrderUrl, body: engineerUpdateWorkOrderHelperModel!.toJson()); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { - currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body)); + currentWorkOrder = await WorkOrderDetail.fromJson(json.decode(response.body)); } isLoading = false; notifyListeners(); @@ -618,7 +618,7 @@ class ServiceRequestDetailProvider extends ChangeNotifier { final response = await ApiManager.instance.post(URLs.engineerUpdateCost, body: workOrderCostModel!.toJson()); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { - currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body)); + currentWorkOrder = await WorkOrderDetail.fromJson(json.decode(response.body)); } isLoading = false; notifyListeners(); @@ -661,7 +661,7 @@ class ServiceRequestDetailProvider extends ChangeNotifier { final response = await ApiManager.instance.post(URLs.nurseConfirmEngineerArrivalUrl, body: body); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { - currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body)); + currentWorkOrder = await WorkOrderDetail.fromJson(json.decode(response.body)); } isLoading = false; notifyListeners(); @@ -682,7 +682,7 @@ class ServiceRequestDetailProvider extends ChangeNotifier { final response = await ApiManager.instance.post(URLs.nurseRejectEngineerArrivedUrl, body: body); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { - currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body)); + currentWorkOrder = await WorkOrderDetail.fromJson(json.decode(response.body)); } isLoading = false; notifyListeners(); @@ -705,7 +705,7 @@ class ServiceRequestDetailProvider extends ChangeNotifier { stateCode = response.statusCode; WorkOrderDetail? workOrderDetail; if (response.statusCode >= 200 && response.statusCode < 300) { - workOrderDetail = WorkOrderDetail.fromJson(json.decode(response.body)); + workOrderDetail = await WorkOrderDetail.fromJson(json.decode(response.body)); } isLoading = false; notifyListeners(); @@ -858,7 +858,7 @@ class ServiceRequestDetailProvider extends ChangeNotifier { ); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { - // currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body)); + // currentWorkOrder = await WorkOrderDetail.fromJson(json.decode(response.body)); // // updateCurrentWorkOrder(currentWorkOrder); // notifyListeners(); } @@ -882,7 +882,7 @@ class ServiceRequestDetailProvider extends ChangeNotifier { ); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { - // currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body)); + // currentWorkOrder = await WorkOrderDetail.fromJson(json.decode(response.body)); // updateCurrentWorkOrder(currentWorkOrder); } isLoading = false; @@ -906,7 +906,7 @@ class ServiceRequestDetailProvider extends ChangeNotifier { ); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { - currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body)); + currentWorkOrder = await WorkOrderDetail.fromJson(json.decode(response.body)); } isLoading = false; notifyListeners(); diff --git a/lib/modules/cm_module/views/components/service_request_detail_view.dart b/lib/modules/cm_module/views/components/service_request_detail_view.dart index d161e6df..2fb4ce2e 100644 --- a/lib/modules/cm_module/views/components/service_request_detail_view.dart +++ b/lib/modules/cm_module/views/components/service_request_detail_view.dart @@ -40,8 +40,8 @@ class _ServiceRequestDetailViewState extends State { @override void initState() { - ServiceRequestDetailProvider requestDetailProvider = Provider.of(context, listen: false); - _workOrderAttachments = requestDetailProvider.currentWorkOrder?.data?.workOrderAttachments.map((e) => File(e.name ?? '')).toList() ?? []; + // ServiceRequestDetailProvider requestDetailProvider = Provider.of(context, listen: false); + // _workOrderAttachments = requestDetailProvider.currentWorkOrder?.data?.workOrderAttachments.map((e) => File(e.name ?? '')).toList() ?? []; // _workOrderAttachments = requestDetailProvider.currentWorkOrder?.data?.workOrderAttachments.map((e) => AttachmentModel(e.id??0, File(e.name ?? ''))).toList() ?? []; super.initState(); } @@ -50,6 +50,7 @@ class _ServiceRequestDetailViewState extends State { Widget build(BuildContext context) { UserProvider _userProvider = Provider.of(context, listen: false); return Consumer(builder: (pContext, requestProvider, _) { + _workOrderAttachments = requestProvider.currentWorkOrder?.data?.workOrderAttachments.map((e) => File(e.name ?? '')).toList() ?? []; return requestProvider.isLoading ? const CircularProgressIndicator(color: AppColor.primary10).center : requestProvider.currentWorkOrder == null @@ -248,7 +249,11 @@ class _ServiceRequestDetailViewState extends State { '${context.translation.closedDate}: ${workOrder.closedDate != null ? workOrder.closedDate!.toString().toServiceRequestDetailsFormat : '-'}', style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral120), ), - + if (workOrder.problemDescription != null) + Text( + '${context.translation.problemDesc}: ${workOrder.problemDescription?.name ?? ""}', + style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120), + ), const Divider().defaultStyle(context), //... call response details starts here.... diff --git a/lib/modules/cm_module/views/forms/maintenance_request/components/internal_request.dart b/lib/modules/cm_module/views/forms/maintenance_request/components/internal_request.dart index f9385cbc..117c2a5d 100644 --- a/lib/modules/cm_module/views/forms/maintenance_request/components/internal_request.dart +++ b/lib/modules/cm_module/views/forms/maintenance_request/components/internal_request.dart @@ -115,7 +115,6 @@ class _InternalMaintenanceRequestState extends State timer: requestDetailProvider.activityMaintenanceHelperModel?.activityMaintenanceTimerModel, enabled: enableTimer, pickerTimer: requestDetailProvider.activityMaintenanceHelperModel?.activityTimePicker, - canPickTime: true, onPick: (time) { requestDetailProvider.activityMaintenanceHelperModel?.activityTimePicker = time; }, diff --git a/lib/modules/pm_module/ppm_wo/update_ppm/wo_info_form.dart b/lib/modules/pm_module/ppm_wo/update_ppm/wo_info_form.dart index fbbbd801..403ec7fa 100644 --- a/lib/modules/pm_module/ppm_wo/update_ppm/wo_info_form.dart +++ b/lib/modules/pm_module/ppm_wo/update_ppm/wo_info_form.dart @@ -354,9 +354,7 @@ class _WoInfoFormState extends State { decoration: BoxDecoration(color: AppColor.neutral100, borderRadius: BorderRadius.circular(10)), width: double.infinity, timer: widget.planPreventiveVisit.tbsTimer, - // enabled: widget.planPreventiveVisit.tbsTimer?.endAt == null, pickerTimer: widget.planPreventiveVisit.ppMTimePicker, - canPickTime: true, onPick: (time) { widget.planPreventiveVisit.ppMTimePicker = time; }, diff --git a/lib/modules/pm_module/recurrent_wo/components/task_info_widget.dart b/lib/modules/pm_module/recurrent_wo/components/task_info_widget.dart index 11b836dc..4e9f52e8 100644 --- a/lib/modules/pm_module/recurrent_wo/components/task_info_widget.dart +++ b/lib/modules/pm_module/recurrent_wo/components/task_info_widget.dart @@ -83,7 +83,6 @@ class RecurrentTaskInfoWidget extends StatelessWidget { borderRadius: BorderRadius.circular(10), ), pickerTimer: model?.recurrentWoTimePicker, - canPickTime: true, onPick: (time) { model?.recurrentWoTimePicker = time; }, diff --git a/lib/modules/tm_module/tasks_wo/update_task_request_view.dart b/lib/modules/tm_module/tasks_wo/update_task_request_view.dart index caae1644..a41d4e94 100644 --- a/lib/modules/tm_module/tasks_wo/update_task_request_view.dart +++ b/lib/modules/tm_module/tasks_wo/update_task_request_view.dart @@ -495,7 +495,6 @@ class _UpdateTaskRequestState extends State { borderRadius: BorderRadius.circular(10), ), pickerTimer: taskProvider.taskRequestModel?.taskTimePicker, - canPickTime: true, onPick: (time) { taskProvider.taskRequestModel?.taskTimePicker = time; }, diff --git a/lib/views/pages/device_transfer/update_device_transfer.dart b/lib/views/pages/device_transfer/update_device_transfer.dart index fd527b19..90254c4f 100644 --- a/lib/views/pages/device_transfer/update_device_transfer.dart +++ b/lib/views/pages/device_transfer/update_device_transfer.dart @@ -290,7 +290,6 @@ class _UpdateDeviceTransferState extends State { borderRadius: BorderRadius.circular(10), ), pickerTimer: _formModel.deviceTimePicker, - canPickTime: true, onPick: (time) { _formModel.deviceTimePicker = time; }, diff --git a/lib/views/pages/user/gas_refill/request_gas_refill.dart b/lib/views/pages/user/gas_refill/request_gas_refill.dart index 439abbf8..4e9f9c17 100644 --- a/lib/views/pages/user/gas_refill/request_gas_refill.dart +++ b/lib/views/pages/user/gas_refill/request_gas_refill.dart @@ -235,7 +235,6 @@ class _RequestGasRefillState extends State { timer: _formModel.timer, enabled: _formModel.endDate == null, pickerTimer: _formModel.gasRefillTimePicker, - canPickTime: true, onPick: (time) { _formModel.gasRefillTimePicker = time; }, diff --git a/lib/views/pages/user/gas_refill/update_gas_refill_request.dart b/lib/views/pages/user/gas_refill/update_gas_refill_request.dart index e19ff848..67b69981 100644 --- a/lib/views/pages/user/gas_refill/update_gas_refill_request.dart +++ b/lib/views/pages/user/gas_refill/update_gas_refill_request.dart @@ -287,7 +287,6 @@ class _UpdateGasRefillRequestState extends State { label: context.translation.workingHours, timer: _formModel.timer, pickerTimer: _formModel.gasRefillTimePicker, - canPickTime: true, onPick: (time) { _formModel.gasRefillTimePicker = time; }, diff --git a/lib/views/pages/user/profile_page.dart b/lib/views/pages/user/profile_page.dart index 8ecb6098..af9ab3fc 100644 --- a/lib/views/pages/user/profile_page.dart +++ b/lib/views/pages/user/profile_page.dart @@ -11,6 +11,7 @@ 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/user.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 '../../../new_views/app_style/app_color.dart'; @@ -42,7 +43,7 @@ class _ProfilePageState extends State { _height = MediaQuery.of(context).size.height; if (_firstTime) { - _user = User.fromJson(_userProvider.user!.toJson()); + _user = User.fromJsonCons(_userProvider.user!.toJson()); _firstTime = false; } Color color = context.isDark ? AppColor.neutral10 : AppColor.neutral50; @@ -50,111 +51,134 @@ class _ProfilePageState extends State { key: _scaffoldKey, appBar: DefaultAppBar(title: context.translation.myProfile), body: SafeArea( - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, + child: ListView( + padding: const EdgeInsets.all(16), children: [ - SizedBox( - width: double.infinity, - child: Column( - children: [ - Consumer(builder: (context, snapshot, _) { - return Stack( - alignment: Alignment.bottomRight, - children: [ - CircleAvatar( - radius: 45, - backgroundColor: const Color(0xFFE4E5E6), - child: Padding( - padding: const EdgeInsets.all(1), // Border radius - child: ClipOval( - child: snapshot.profileImage != null - ? Image.file(snapshot.profileImage!) - : (snapshot.user!.profilePhotoName?.isNotEmpty ?? false) - ? Image.network(snapshot.user!.profilePhotoName!) - : const Icon( - Icons.person, - size: 50, - color: Colors.white, - ), + Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + width: double.infinity, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Consumer(builder: (context, snapshot, _) { + return Stack( + alignment: Alignment.bottomRight, + children: [ + CircleAvatar( + radius: 45, + backgroundColor: const Color(0xFFE4E5E6), + child: Padding( + padding: const EdgeInsets.all(1), // Border radius + child: ClipOval( + child: snapshot.profileImage != null + ? Image.file(snapshot.profileImage!) + : (snapshot.user!.profilePhotoName?.isNotEmpty ?? false) + ? Image.network(snapshot.user!.profilePhotoName!) + : const Icon( + Icons.person, + size: 50, + color: Colors.white, + ), + ), + ), ), - ), - ), - CircleAvatar( - radius: 14, - backgroundColor: AppColor.primary70, - child: Padding( - padding: const EdgeInsets.all(1), // Border radius - child: snapshot.isLoading - ? const SizedBox(height: 16, width: 16, child: CircularProgressIndicator(color: Colors.white, strokeWidth: 2)) - : const Icon(Icons.upload, size: 16, color: Colors.white), - ), - ).onPress(snapshot.isLoading - ? null - : () async { - final pickedFile = await ImagePicker().pickImage(source: ImageSource.gallery, imageQuality: 70, maxWidth: 800, maxHeight: 800); + CircleAvatar( + radius: 14, + backgroundColor: AppColor.primary70, + child: Padding( + padding: const EdgeInsets.all(1), // Border radius + child: snapshot.isLoading + ? const SizedBox(height: 16, width: 16, child: CircularProgressIndicator(color: Colors.white, strokeWidth: 2)) + : const Icon(Icons.upload, size: 16, color: Colors.white), + ), + ).onPress(snapshot.isLoading + ? null + : () async { + final pickedFile = await ImagePicker().pickImage(source: ImageSource.gallery, imageQuality: 70, maxWidth: 800, maxHeight: 800); - if (pickedFile != null) { - CroppedFile? croppedFile = await ImageCropper().cropImage( - sourcePath: pickedFile.path, - aspectRatio: CropAspectRatio(ratioX: 1, ratioY: 1), - uiSettings: [ - AndroidUiSettings( - toolbarTitle: 'ATOMS', - toolbarColor: Colors.white, - toolbarWidgetColor: color, - initAspectRatio: CropAspectRatioPreset.square, - lockAspectRatio: false, - ), - IOSUiSettings(title: 'ATOMS'), - ], - ); + if (pickedFile != null) { + CroppedFile? croppedFile = await ImageCropper().cropImage( + sourcePath: pickedFile.path, + aspectRatio: CropAspectRatio(ratioX: 1, ratioY: 1), + uiSettings: [ + AndroidUiSettings( + toolbarTitle: 'ATOMS', + toolbarColor: Colors.white, + toolbarWidgetColor: color, + initAspectRatio: CropAspectRatioPreset.square, + lockAspectRatio: false, + ), + IOSUiSettings(title: 'ATOMS'), + ], + ); + if (croppedFile != null) { + await snapshot.uploadProfileImage(_user.userID!, File(croppedFile.path)); + Provider.of(context, listen: false).setUser(_userProvider.user!); + } + } + }), + ], + ); + }), + 8.height, + (_user.username ?? "").heading3(context).custom(fontWeight: FontWeight.w600, color: context.isDark ? AppColor.neutral10 : AppColor.neutral50), + ], + ), + ), + 16.height, + Text( + '${context.translation.email}: ${_user.email ?? "-"}', + style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120), + ), + Text( + '${context.translation.phoneNumber}: ${_user.phoneNumber ?? "-"}', + style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120), + ), + Text( + '${context.translation.extensionNo}: ${_user.extensionNo ?? "-"}', + style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120), + ), - if (croppedFile != null) { - await snapshot.uploadProfileImage(_user.userID!, File(croppedFile.path)); - Provider.of(context, listen: false).setUser(_userProvider.user!); - } - } - }), - ], - ); - }), + // if ((_user.phoneNumber ?? "").isNotEmpty) ...[ + // const Divider().defaultStyle(context), + // 8.height, + // (_user.phoneNumber??"").heading5(context), + // 8.height, + // ], + // if ((_user.extensionNo ?? "").isNotEmpty) ...[ + // const Divider().defaultStyle(context), + // 8.height, + // _user.extensionNo!.heading5(context), + // 8.height, + // ], + if ((_user.departmentName?.length ?? 0) > 0) const Divider().defaultStyle(context), + ListView.builder( + physics: const NeverScrollableScrollPhysics(), + itemCount: _user.departmentName?.length ?? 0, + shrinkWrap: true, + itemBuilder: (context, index) { + return (_user.departmentName![index] ?? "N/A").heading5(context).paddingOnly(top: 8, bottom: 8); + }, + ), + if ((_user.clientName ?? "").isNotEmpty) ...[ + const Divider().defaultStyle(context), + 8.height, + _user.clientName!.heading5(context).custom(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50), 8.height, - (_user.username)!.heading3(context).custom(fontWeight: FontWeight.w600, color: context.isDark ? AppColor.neutral10 : AppColor.neutral50), - if ((_user.email ?? "").isNotEmpty) (_user.email ?? "").heading6(context).custom(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), ], - ), - ), - 24.height, - if ((_user.phoneNumber ?? "").isNotEmpty) ...[ - const Divider().defaultStyle(context), - 8.height, - _user.phoneNumber!.heading5(context), - 8.height, - ], - if ((_user.extensionNo ?? "").isNotEmpty) ...[ - const Divider().defaultStyle(context), - 8.height, - _user.extensionNo!.heading5(context), - 8.height, - ], - if ((_user.departmentName?.length ?? 0) > 0) const Divider().defaultStyle(context), - ListView.builder( - physics: const NeverScrollableScrollPhysics(), - itemCount: _user.departmentName?.length ?? 0, - shrinkWrap: true, - itemBuilder: (context, index) { - return (_user.departmentName![index] ?? "N/A").heading5(context).paddingOnly(top: 8, bottom: 8); - }, - ), - if ((_user.clientName ?? "").isNotEmpty) ...[ - const Divider().defaultStyle(context), - 8.height, - _user.clientName!.heading5(context).custom(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50), - 8.height, - ], + ], + ).toShadowContainer(context), + 16.height, + AppFilledButton( + label: "Update Information", + buttonColor: AppColor.neutral50, + onPressed: () {}, + ) ], - ).toShadowContainer(context).paddingAll(16), + ), // child: Stack( // children: [ // Form( diff --git a/lib/views/pages/user/requests/first_action_bottom_sheet.dart b/lib/views/pages/user/requests/first_action_bottom_sheet.dart index efb7ebe4..5781500b 100644 --- a/lib/views/pages/user/requests/first_action_bottom_sheet.dart +++ b/lib/views/pages/user/requests/first_action_bottom_sheet.dart @@ -1,241 +1,241 @@ -import 'package:flutter/material.dart'; -import 'package:provider/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_request.dart'; - -import '../../../../controllers/providers/api/service_requests_provider.dart'; -import '../../../../models/lookup.dart'; -import '../../../../new_views/app_style/app_color.dart'; -import '../../../../new_views/common_widgets/app_filled_button.dart'; -import '../../../../new_views/common_widgets/app_text_form_field.dart'; -import '../../../../new_views/common_widgets/single_item_drop_down_menu.dart'; -import '../../../../providers/service_request_providers/first_action_provider.dart'; -import '../../../widgets/date_and_time/date_picker.dart'; - -class FirstActionBottomSheet extends StatefulWidget { - final ServiceRequest request; - - const FirstActionBottomSheet({Key? key, required this.request}) : super(key: key); - - @override - State createState() => _FirstActionBottomSheetState(); -} - -class _FirstActionBottomSheetState extends State { - late ServiceRequest _serviceRequest; - Asset? asset; - final GlobalKey _formKey = GlobalKey(); - - Lookup? firstAction; - - @override - void initState() { - super.initState(); - _serviceRequest = widget.request; - firstAction = _serviceRequest.firstAction; - } - - @override - Widget build(BuildContext context) { - final userProvider = Provider.of(context, listen: false); - return Wrap( - children: [ - Container( - clipBehavior: Clip.antiAlias, - margin: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom), - decoration: BoxDecoration( - color: Theme.of(context).scaffoldBackgroundColor, - borderRadius: const BorderRadius.only(topRight: Radius.circular(20), topLeft: Radius.circular(20)), - ), - padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight), - child: Form( - key: _formKey, - child: SingleChildScrollView( - child: Column( - children: [ - Container( - width: 40.toScreenWidth, - height: 5.toScreenHeight, - decoration: BoxDecoration(color: AppColor.neutral40, borderRadius: BorderRadius.circular(30)), - ), - Align( - alignment: AlignmentDirectional.centerStart, - child: context.translation.firstAction.heading3(context).custom(fontWeight: FontWeight.w600).paddingOnly(top: 16, bottom: 16), - ), - SingleItemDropDownMenu( - context: context, - title: context.translation.firstActionStatus, - initialValue: firstAction, //_serviceRequest.firstAction, - onSelect: (value) { - setState(() { - //_serviceRequest.firstAction = value; - firstAction = value; - if (firstAction?.value != 2) { - _serviceRequest.visitDate = null; - } - }); - }, - ), - if (firstAction?.value == 2) ...[ - 8.height, - ADatePicker( - label: context.translation.visitDate, - date: DateTime.tryParse(_serviceRequest.visitDate ?? ""), - formatDateWithTime: true, - onDatePicker: (selectedDate) { - showTimePicker( - context: context, - initialTime: TimeOfDay.now(), - ).then((selectedTime) { - // Handle the selected date and time here. - if (selectedTime != null) { - DateTime selectedDateTime = DateTime( - selectedDate.year, - selectedDate.month, - selectedDate.day, - selectedTime.hour, - selectedTime.minute, - ); - if (selectedDateTime.isBefore(DateTime.parse(_serviceRequest.date!))) { - "Visit Date time must be greater then request date".showToast; - return; - } - - setState(() { - _serviceRequest.visitDate = selectedDateTime.toIso8601String(); - }); - } - }); - }, - ), - ], - - if (firstAction?.id == 404 && Provider.of(context, listen: false).assetGroup!.id == 1) ...[ - 8.height, - Row( - children: [ - ADatePicker( - label: context.translation.startDate, - date: DateTime.tryParse(_serviceRequest.startDate ?? ""), - formatDateWithTime: true, - onDatePicker: (selectedDate) { - showTimePicker( - context: context, - initialTime: TimeOfDay.now(), - ).then((selectedTime) { - // Handle the selected date and time here. - if (selectedTime != null) { - DateTime selectedDateTime = DateTime( - selectedDate.year, - selectedDate.month, - selectedDate.day, - selectedTime.hour, - selectedTime.minute, - ); - setState(() { - _serviceRequest.startDate = selectedDateTime.toIso8601String(); - }); - } - }); - }, - ).expanded, - 8.width, - ADatePicker( - label: context.translation.endDate, - date: DateTime.tryParse(_serviceRequest.endDate ?? ""), - formatDateWithTime: true, - onDatePicker: (selectedDate) { - showTimePicker( - context: context, - initialTime: TimeOfDay.now(), - ).then((selectedTime) { - // Handle the selected date and time here. - if (selectedTime != null) { - DateTime selectedDateTime = DateTime( - selectedDate.year, - selectedDate.month, - selectedDate.day, - selectedTime.hour, - selectedTime.minute, - ); - setState(() { - _serviceRequest.endDate = selectedDateTime.toIso8601String(); - _serviceRequest.workingHours = - (((DateTime.parse(_serviceRequest.endDate!).difference(DateTime.parse(_serviceRequest.startDate!)).inSeconds ?? 0) / 60) / 60).toStringAsFixed(2); - }); - } - }); - }, - ).expanded, - ], - ) - ], - - /// Loan availability not required - // 8.height, - // SingleItemDropDownMenu( - // context: context, - // title: context.translation.loanAvailability, - // initialValue: _serviceRequest.loanAvailability, - // onSelect: (status) { - // setState(() { - // _serviceRequest.loanAvailability = status; - // if (_serviceRequest.loanAvailability.value != 1) { - // asset = null; - // } - // }); - // }, - // ), - // if (_serviceRequest?.loanAvailability?.value == 1) 8.height, - // if (_serviceRequest?.loanAvailability?.value == 1) - // PickAsset( - // device: asset ?? _serviceRequest.device, - // onPickAsset: (asset) { - // setState(() { - // this.asset = asset; - // }); - // }, - // ), - 8.height, - AppTextFormField( - labelText: context.translation.comments, - textInputType: TextInputType.multiline, - alignLabelWithHint: true, - onChange: (text) { - _serviceRequest.comments = text; - }, - onSaved: (text) { - _serviceRequest.comments = text; - }, - ), - 16.height, - Consumer( - builder: (context, snapshot, _) => AppFilledButton( - label: context.translation.save, - loading: snapshot.isLoading ?? false, - onPressed: () async { - _formKey.currentState!.save(); - _serviceRequest.device = asset; - _serviceRequest.firstAction = firstAction; - await snapshot.updateRequest(user: userProvider.user!, request: _serviceRequest); - Navigator.pop(context, true); - }, - ), - ), - 16.height, - ], - ), - ), - ), - ) - ], - ); - } -} +// import 'package:flutter/material.dart'; +// import 'package:provider/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_request.dart'; +// +// import '../../../../controllers/providers/api/service_requests_provider.dart'; +// import '../../../../models/lookup.dart'; +// import '../../../../new_views/app_style/app_color.dart'; +// import '../../../../new_views/common_widgets/app_filled_button.dart'; +// import '../../../../new_views/common_widgets/app_text_form_field.dart'; +// import '../../../../new_views/common_widgets/single_item_drop_down_menu.dart'; +// import '../../../../providers/service_request_providers/first_action_provider.dart'; +// import '../../../widgets/date_and_time/date_picker.dart'; +// +// class FirstActionBottomSheet extends StatefulWidget { +// final ServiceRequest request; +// todo @delete +// const FirstActionBottomSheet({Key? key, required this.request}) : super(key: key); +// +// @override +// State createState() => _FirstActionBottomSheetState(); +// } +// +// class _FirstActionBottomSheetState extends State { +// late ServiceRequest _serviceRequest; +// Asset? asset; +// final GlobalKey _formKey = GlobalKey(); +// +// Lookup? firstAction; +// +// @override +// void initState() { +// super.initState(); +// _serviceRequest = widget.request; +// firstAction = _serviceRequest.firstAction; +// } +// +// @override +// Widget build(BuildContext context) { +// final userProvider = Provider.of(context, listen: false); +// return Wrap( +// children: [ +// Container( +// clipBehavior: Clip.antiAlias, +// margin: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom), +// decoration: BoxDecoration( +// color: Theme.of(context).scaffoldBackgroundColor, +// borderRadius: const BorderRadius.only(topRight: Radius.circular(20), topLeft: Radius.circular(20)), +// ), +// padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight), +// child: Form( +// key: _formKey, +// child: SingleChildScrollView( +// child: Column( +// children: [ +// Container( +// width: 40.toScreenWidth, +// height: 5.toScreenHeight, +// decoration: BoxDecoration(color: AppColor.neutral40, borderRadius: BorderRadius.circular(30)), +// ), +// Align( +// alignment: AlignmentDirectional.centerStart, +// child: context.translation.firstAction.heading3(context).custom(fontWeight: FontWeight.w600).paddingOnly(top: 16, bottom: 16), +// ), +// SingleItemDropDownMenu( +// context: context, +// title: context.translation.firstActionStatus, +// initialValue: firstAction, //_serviceRequest.firstAction, +// onSelect: (value) { +// setState(() { +// //_serviceRequest.firstAction = value; +// firstAction = value; +// if (firstAction?.value != 2) { +// _serviceRequest.visitDate = null; +// } +// }); +// }, +// ), +// if (firstAction?.value == 2) ...[ +// 8.height, +// ADatePicker( +// label: context.translation.visitDate, +// date: DateTime.tryParse(_serviceRequest.visitDate ?? ""), +// formatDateWithTime: true, +// onDatePicker: (selectedDate) { +// showTimePicker( +// context: context, +// initialTime: TimeOfDay.now(), +// ).then((selectedTime) { +// // Handle the selected date and time here. +// if (selectedTime != null) { +// DateTime selectedDateTime = DateTime( +// selectedDate.year, +// selectedDate.month, +// selectedDate.day, +// selectedTime.hour, +// selectedTime.minute, +// ); +// if (selectedDateTime.isBefore(DateTime.parse(_serviceRequest.date!))) { +// "Visit Date time must be greater then request date".showToast; +// return; +// } +// +// setState(() { +// _serviceRequest.visitDate = selectedDateTime.toIso8601String(); +// }); +// } +// }); +// }, +// ), +// ], +// +// if (firstAction?.id == 404 && Provider.of(context, listen: false).assetGroup!.id == 1) ...[ +// 8.height, +// Row( +// children: [ +// ADatePicker( +// label: context.translation.startDate, +// date: DateTime.tryParse(_serviceRequest.startDate ?? ""), +// formatDateWithTime: true, +// onDatePicker: (selectedDate) { +// showTimePicker( +// context: context, +// initialTime: TimeOfDay.now(), +// ).then((selectedTime) { +// // Handle the selected date and time here. +// if (selectedTime != null) { +// DateTime selectedDateTime = DateTime( +// selectedDate.year, +// selectedDate.month, +// selectedDate.day, +// selectedTime.hour, +// selectedTime.minute, +// ); +// setState(() { +// _serviceRequest.startDate = selectedDateTime.toIso8601String(); +// }); +// } +// }); +// }, +// ).expanded, +// 8.width, +// ADatePicker( +// label: context.translation.endDate, +// date: DateTime.tryParse(_serviceRequest.endDate ?? ""), +// formatDateWithTime: true, +// onDatePicker: (selectedDate) { +// showTimePicker( +// context: context, +// initialTime: TimeOfDay.now(), +// ).then((selectedTime) { +// // Handle the selected date and time here. +// if (selectedTime != null) { +// DateTime selectedDateTime = DateTime( +// selectedDate.year, +// selectedDate.month, +// selectedDate.day, +// selectedTime.hour, +// selectedTime.minute, +// ); +// setState(() { +// _serviceRequest.endDate = selectedDateTime.toIso8601String(); +// _serviceRequest.workingHours = +// (((DateTime.parse(_serviceRequest.endDate!).difference(DateTime.parse(_serviceRequest.startDate!)).inSeconds ?? 0) / 60) / 60).toStringAsFixed(2); +// }); +// } +// }); +// }, +// ).expanded, +// ], +// ) +// ], +// +// /// Loan availability not required +// // 8.height, +// // SingleItemDropDownMenu( +// // context: context, +// // title: context.translation.loanAvailability, +// // initialValue: _serviceRequest.loanAvailability, +// // onSelect: (status) { +// // setState(() { +// // _serviceRequest.loanAvailability = status; +// // if (_serviceRequest.loanAvailability.value != 1) { +// // asset = null; +// // } +// // }); +// // }, +// // ), +// // if (_serviceRequest?.loanAvailability?.value == 1) 8.height, +// // if (_serviceRequest?.loanAvailability?.value == 1) +// // PickAsset( +// // device: asset ?? _serviceRequest.device, +// // onPickAsset: (asset) { +// // setState(() { +// // this.asset = asset; +// // }); +// // }, +// // ), +// 8.height, +// AppTextFormField( +// labelText: context.translation.comments, +// textInputType: TextInputType.multiline, +// alignLabelWithHint: true, +// onChange: (text) { +// _serviceRequest.comments = text; +// }, +// onSaved: (text) { +// _serviceRequest.comments = text; +// }, +// ), +// 16.height, +// Consumer( +// builder: (context, snapshot, _) => AppFilledButton( +// label: context.translation.save, +// loading: snapshot.isLoading ?? false, +// onPressed: () async { +// _formKey.currentState!.save(); +// _serviceRequest.device = asset; +// _serviceRequest.firstAction = firstAction; +// await snapshot.updateRequest(user: userProvider.user!, request: _serviceRequest); +// Navigator.pop(context, true); +// }, +// ), +// ), +// 16.height, +// ], +// ), +// ), +// ), +// ) +// ], +// ); +// } +// } diff --git a/lib/views/pages/user/requests/work_order/edit_service_report.dart b/lib/views/pages/user/requests/work_order/edit_service_report.dart index 79d3eb14..464b6059 100644 --- a/lib/views/pages/user/requests/work_order/edit_service_report.dart +++ b/lib/views/pages/user/requests/work_order/edit_service_report.dart @@ -1,398 +1,398 @@ -import 'dart:convert'; -import 'dart:io'; - -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_types_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/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/providers/service_request_providers/loan_availability_provider.dart'; -import 'package:test_sa/views/pages/user/requests/work_order/part_no_button.dart'; -import 'package:test_sa/views/widgets/equipment/pick_asset.dart'; -import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; -import 'package:test_sa/views/widgets/status/report/service_report_last_call.dart'; - -import '../../../../../attachment.dart'; -import '../../../../../models/lookup.dart'; -import '../../../../../models/service_request/spare_parts.dart'; -import '../../../../../models/service_request/wo_call_request.dart'; -import '../../../../../new_views/common_widgets/app_filled_button.dart'; -import '../../../../../new_views/common_widgets/app_text_form_field.dart'; -import '../../../../../new_views/common_widgets/default_app_bar.dart'; -import '../../../../../new_views/common_widgets/single_item_drop_down_menu.dart'; -import '../../../../../providers/service_request_providers/equipment_status_provider.dart'; -import '../../../../../providers/work_order/reason_provider.dart'; -import '../../../../../providers/work_order/service_type_provider.dart'; -import '../../../../widgets/date_and_time/date_picker.dart'; -import '../../../../widgets/e_signature/e_signature.dart'; -import '../../../../widgets/images/multi_image_picker.dart'; -import '../../../../widgets/status/report/service_report_assistant_employee_menu.dart'; -import '../../../../widgets/status/report/service_report_fault_description.dart'; -import '../../../../widgets/status/report/service_report_repair_location.dart'; -import '../../../../widgets/timer/app_timer.dart'; - -class EditServiceReport extends StatefulWidget { - static const String id = "/edit-service-report"; - final ServiceRequest request; - final ServiceReport report; - - const EditServiceReport({Key? key, required this.request, required this.report}) : super(key: key); - - @override - _EditServiceReportState createState() => _EditServiceReportState(); -} - -class _EditServiceReportState extends State with TickerProviderStateMixin { - late UserProvider _userProvider; - late SettingProvider _settingProvider; - late ServiceRequestsProvider _serviceRequestsProvider; - List _spareParts = []; - late ServiceReport _serviceReport; - bool _isLoading = false; - List _files = []; - final GlobalKey _formKey = GlobalKey(); - final GlobalKey _scaffoldKey = GlobalKey(); - final TextEditingController _faultController = TextEditingController(); - final TextEditingController _workPreformedController = TextEditingController(); - final TextEditingController _partQtyController = TextEditingController(); - late ServiceStatusProvider _assetTypeProvider; - late CallRequest _callRequestForWorkOrder; - - Asset? loanAvailabilityAsset; - - @override - void initState() { - _serviceReport = widget.report; - _files = widget.report.attachmentsWorkOrder?.map((e) => File(e.name!)).toList() ?? []; - _spareParts = _serviceReport.sparePartsWorkOrders?.map((e) => e.sparePart!).toList() ?? []; - super.initState(); - if (context.mounted) { - Provider.of(context, listen: false).reset(); - Provider.of(context, listen: false).serviceRequestId = _serviceReport.callRequest!.id.toString(); - } - } - - void getRequestForWorkOrder() async { - _isLoading = true; - setState(() {}); - _callRequestForWorkOrder = (await _serviceRequestsProvider.getCallRequestForWorkOrder(callId: widget.request.id!))!; - _serviceReport.assignedEmployee = _callRequestForWorkOrder.assignedEmployee; - await _assetTypeProvider.getTypes(); - _isLoading = false; - setState(() {}); - } - - @override - void dispose() { - _faultController.dispose(); - _workPreformedController.dispose(); - _partQtyController.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - _userProvider = Provider.of(context); - _settingProvider = Provider.of(context); - _serviceRequestsProvider = Provider.of(context); - _assetTypeProvider = Provider.of(context); - _serviceReport.assetType = _assetTypeProvider.statuses?.firstWhere((element) => element.value == _callRequestForWorkOrder.assetType, orElse: null); - return Scaffold( - key: _scaffoldKey, - appBar: DefaultAppBar(title: context.translation.updateWorkOrder), - body: SafeArea( - child: LoadingManager( - isLoading: _isLoading, - isFailedLoading: false, - stateCode: 200, - onRefresh: () async {}, - child: Form( - key: _formKey, - child: Column( - children: [ - SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Card( - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - widget.request.hospitalName!.heading5(context), - 8.height, - "${context.translation.assetNo}: ${widget.request.deviceNumber}".bodyText(context), - "${context.translation.callId}: ${widget.request.requestCode}".bodyText(context), - ], - ).paddingAll(16), - ), - 8.height, - ADatePicker( - label: context.translation.returnToService, - date: DateTime.tryParse(_serviceReport.visitDate ?? ""), - formatDateWithTime: true, - onDatePicker: (selectedDate) { - showTimePicker( - context: context, - initialTime: TimeOfDay.now(), - ).then((selectedTime) { - if (selectedTime != null) { - DateTime selectedDateTime = DateTime( - selectedDate.year, - selectedDate.month, - selectedDate.day, - selectedTime.hour, - selectedTime.minute, - ); - setState(() { - _serviceReport.visitDate = selectedDateTime.toIso8601String(); - }); - } - }); - }, - ), - 8.height, - AppTimer( - label: context.translation.workingHours, - timer: _serviceReport.timer, - enabled: _serviceReport.endofWorkTime == null, - onChange: (timer) async { - _serviceReport.timer = timer; - return true; - }, - onPick: (value) {}, - ), - 8.height, - LoadingManager( - isLoading: _assetTypeProvider.isLoading, - isFailedLoading: _assetTypeProvider.statuses == null, - stateCode: _assetTypeProvider.stateCode, - onRefresh: () async { - _assetTypeProvider.reset(); - await _assetTypeProvider.getTypes(); - _serviceReport.assetType = _assetTypeProvider.statuses?.firstWhere( - (element) => element.value == _serviceReport.callRequest?.assetType, - orElse: null, - ); - }, - child: AppTextFormField( - labelText: context.translation.assetType, - initialValue: _serviceReport.assetType?.name, - textAlign: TextAlign.center, - enable: false, - style: Theme.of(context).textTheme.titleMedium, - ), - ), - 8.height, - SingleItemDropDownMenu( - context: context, - title: context.translation.equipmentStatus, - initialValue: _serviceReport.equipmentStatus, - onSelect: (value) { - _serviceReport.equipmentStatus = value; - }, - ), - 8.height, - SingleItemDropDownMenu( - context: context, - title: context.translation.reason, - initialValue: _serviceReport.reason, - onSelect: (value) { - if (value != null) { - _serviceReport.reason = value; - } - }, - ), - 8.height, - SingleItemDropDownMenu( - context: context, - title: context.translation.serviceType, - initialValue: _serviceReport.serviceType, - onSelect: (value) { - _serviceReport.serviceType = value; - }, - ), - 8.height, - ServiceReportLastCallsMenu( - report: _serviceReport, - title: context.translation.callLastSituation, - parentId: widget.request.id, - onSelect: (status) { - _serviceReport.calllastSituation = status; - }, - ), - 8.height, - ServiceReportFaultDescription( - requestId: widget.request.id, - initialValue: _serviceReport.faultDescription, - onSelect: (status) { - _serviceReport.faultDescription = status; - _workPreformedController.text = _serviceReport.faultDescription?.workPerformed ?? ""; - }, - ), - 8.height, - AppTextFormField( - labelText: context.translation.solution, - initialValue: _serviceReport.faultDescription?.workPerformed, - textAlign: TextAlign.center, - enable: false, - controller: _workPreformedController, - ), - 8.height, - SingleItemDropDownMenu( - context: context, - title: context.translation.loanAvailability, - initialValue: _serviceReport.loanAvailablity, - onSelect: (status) { - if (status != null) { - setState(() { - _serviceReport.loanAvailablity = status; - if (_serviceReport.loanAvailablity?.value != 1) { - loanAvailabilityAsset = null; - _serviceReport.assetLoan = null; - } - }); - } - }, - ), - if (_serviceReport.loanAvailablity?.value == 1) 8.height, - if (_serviceReport.loanAvailablity?.value == 1) - PickAsset( - device: loanAvailabilityAsset, // ?? _serviceReport.device, - onPickAsset: (asset) { - _serviceReport.assetLoan = AssetInfo.fromJson(asset.toJson()); - setState(() { - loanAvailabilityAsset = asset; - }); - }, - ), - if (_serviceReport.assetLoan != null && loanAvailabilityAsset == null) - Card(child: "${context.translation.assetNumber}: ${_serviceReport.assetLoan?.assetNumber}".bodyText(context).paddingAll(16)), - 8.height, - ServiceReportAssistantEmployeeMenu( - title: context.translation.assignAssistant, - assetId: _serviceReport.callRequest!.asset!.id!, - initialValue: (_serviceReport.assistantEmployees?.isNotEmpty ?? false) ? _serviceReport.assistantEmployees?.first : null, - onSelect: (employee) { - if (employee == null) { - _serviceReport.assistantEmployees = []; - } else { - _serviceReport.assistantEmployees = [employee.copyWith(id: 0)]; - } - }, - ), - 8.height, - AppTextFormField( - labelText: context.translation.travelingExpense, - initialValue: _serviceReport.travelingExpenses?.toString(), - textInputType: TextInputType.number, - onSaved: (value) { - _serviceReport.travelingExpenses = double.tryParse(value) ?? 0.0; - }, - ), - 8.height, - AppTextFormField( - labelText: context.translation.travelingHours, - initialValue: _serviceReport.travelingHours?.toString(), - textInputType: TextInputType.number, - onSaved: (value) { - _serviceReport.travelingHours = double.tryParse(value) ?? 0.0; - }, - ), - 8.height, - AppTextFormField( - initialValue: _serviceReport.comment, - labelText: context.translation.technicalComment, - alignLabelWithHint: true, - textInputType: TextInputType.multiline, - onSaved: (value) { - _serviceReport.comment = value; - }, - ), - 8.height, - ServiceReportRepairLocation( - label: context.translation.repairLocation, - initialValue: _serviceReport.repairLocation, - onSelect: (status) { - _serviceReport.repairLocation = status; - }, - ), - 8.height, - PartNoButton( - controller: _partQtyController, - spareParts: _spareParts, - initialList: _serviceReport.sparePartsWorkOrders, - onChange: (parts) { - _serviceReport.sparePartsWorkOrders = parts; - }, - ), - 8.height, - MultiFilesPicker(label: context.translation.attachImage, files: _files), - 8.height, - ESignature( - title: context.translation.engSign, - oldSignature: _serviceReport.engSignature, - newSignature: _serviceReport.localEngSignature, - onSaved: (signature) { - if (signature == null || signature.isEmpty) { - setState(() {}); - return; - } - _serviceReport.localEngSignature = signature; - _serviceReport.engSignature = signature != null ? "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}" : null; - }, - ), - 8.height, - ESignature( - title: context.translation.nurseSignature, - oldSignature: _serviceReport.nurseSignature, - newSignature: _serviceReport.localNurseSignature, - onSaved: (signature) { - if (signature == null || signature.isEmpty) { - setState(() {}); - return; - } - _serviceReport.localNurseSignature = signature; - _serviceReport.nurseSignature = signature != null ? "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}" : null; - }, - ), - 24.height, - ], - ), - ).expanded, - AppFilledButton( - label: context.translation.updateRequest, - onPressed: () async { - if ((!_formKey.currentState!.validate()) || (!(await _serviceReport.validate(context)))) { - setState(() {}); - return; - } - _formKey.currentState!.save(); - _serviceReport.attachmentsWorkOrder ??= []; - if (_files.isEmpty) _serviceReport.attachmentsWorkOrder = []; - try { - for (var file in _files) { - _serviceReport.attachmentsWorkOrder!.add(Attachment(id: 0, name: "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}")); - } - } catch (error) { - print(error); - } - - await _serviceRequestsProvider.updateServiceReport(context, report: _serviceReport); - }, - ), - ], - ).paddingAll(16), - ), - ), - ), - ); - } -} +// import 'dart:convert'; +// import 'dart:io'; +// +// import 'package:flutter/material.dart'; +// import 'package:provider/provider.dart'; +// import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; +// import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_types_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/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/providers/service_request_providers/loan_availability_provider.dart'; +// import 'package:test_sa/views/pages/user/requests/work_order/part_no_button.dart'; +// import 'package:test_sa/views/widgets/equipment/pick_asset.dart'; +// import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +// import 'package:test_sa/views/widgets/status/report/service_report_last_call.dart'; +// +// import '../../../../../attachment.dart'; +// import '../../../../../models/lookup.dart'; +// import '../../../../../models/service_request/spare_parts.dart'; +// import '../../../../../models/service_request/wo_call_request.dart'; +// import '../../../../../new_views/common_widgets/app_filled_button.dart'; +// import '../../../../../new_views/common_widgets/app_text_form_field.dart'; +// import '../../../../../new_views/common_widgets/default_app_bar.dart'; +// import '../../../../../new_views/common_widgets/single_item_drop_down_menu.dart'; +// import '../../../../../providers/service_request_providers/equipment_status_provider.dart'; +// import '../../../../../providers/work_order/reason_provider.dart'; +// import '../../../../../providers/work_order/service_type_provider.dart'; +// import '../../../../widgets/date_and_time/date_picker.dart'; +// import '../../../../widgets/e_signature/e_signature.dart'; +// import '../../../../widgets/images/multi_image_picker.dart'; +// import '../../../../widgets/status/report/service_report_assistant_employee_menu.dart'; +// import '../../../../widgets/status/report/service_report_fault_description.dart'; +// import '../../../../widgets/status/report/service_report_repair_location.dart'; +// import '../../../../widgets/timer/app_timer.dart'; +// +// class EditServiceReport extends StatefulWidget { +// static const String id = "/edit-service-report"; +// final ServiceRequest request; +// final ServiceReport report; +// +// const EditServiceReport({Key? key, required this.request, required this.report}) : super(key: key); +// +// @override +// _EditServiceReportState createState() => _EditServiceReportState(); +// } +// // todo @delete +// class _EditServiceReportState extends State with TickerProviderStateMixin { +// late UserProvider _userProvider; +// late SettingProvider _settingProvider; +// late ServiceRequestsProvider _serviceRequestsProvider; +// List _spareParts = []; +// late ServiceReport _serviceReport; +// bool _isLoading = false; +// List _files = []; +// final GlobalKey _formKey = GlobalKey(); +// final GlobalKey _scaffoldKey = GlobalKey(); +// final TextEditingController _faultController = TextEditingController(); +// final TextEditingController _workPreformedController = TextEditingController(); +// final TextEditingController _partQtyController = TextEditingController(); +// late ServiceStatusProvider _assetTypeProvider; +// late CallRequest _callRequestForWorkOrder; +// +// Asset? loanAvailabilityAsset; +// +// @override +// void initState() { +// _serviceReport = widget.report; +// _files = widget.report.attachmentsWorkOrder?.map((e) => File(e.name!)).toList() ?? []; +// _spareParts = _serviceReport.sparePartsWorkOrders?.map((e) => e.sparePart!).toList() ?? []; +// super.initState(); +// if (context.mounted) { +// Provider.of(context, listen: false).reset(); +// Provider.of(context, listen: false).serviceRequestId = _serviceReport.callRequest!.id.toString(); +// } +// } +// +// void getRequestForWorkOrder() async { +// _isLoading = true; +// setState(() {}); +// _callRequestForWorkOrder = (await _serviceRequestsProvider.getCallRequestForWorkOrder(callId: widget.request.id!))!; +// _serviceReport.assignedEmployee = _callRequestForWorkOrder.assignedEmployee; +// await _assetTypeProvider.getTypes(); +// _isLoading = false; +// setState(() {}); +// } +// +// @override +// void dispose() { +// _faultController.dispose(); +// _workPreformedController.dispose(); +// _partQtyController.dispose(); +// super.dispose(); +// } +// +// @override +// Widget build(BuildContext context) { +// _userProvider = Provider.of(context); +// _settingProvider = Provider.of(context); +// _serviceRequestsProvider = Provider.of(context); +// _assetTypeProvider = Provider.of(context); +// _serviceReport.assetType = _assetTypeProvider.statuses?.firstWhere((element) => element.value == _callRequestForWorkOrder.assetType, orElse: null); +// return Scaffold( +// key: _scaffoldKey, +// appBar: DefaultAppBar(title: context.translation.updateWorkOrder), +// body: SafeArea( +// child: LoadingManager( +// isLoading: _isLoading, +// isFailedLoading: false, +// stateCode: 200, +// onRefresh: () async {}, +// child: Form( +// key: _formKey, +// child: Column( +// children: [ +// SingleChildScrollView( +// child: Column( +// crossAxisAlignment: CrossAxisAlignment.stretch, +// children: [ +// Card( +// child: Column( +// crossAxisAlignment: CrossAxisAlignment.stretch, +// children: [ +// widget.request.hospitalName!.heading5(context), +// 8.height, +// "${context.translation.assetNo}: ${widget.request.deviceNumber}".bodyText(context), +// "${context.translation.callId}: ${widget.request.requestCode}".bodyText(context), +// ], +// ).paddingAll(16), +// ), +// 8.height, +// ADatePicker( +// label: context.translation.returnToService, +// date: DateTime.tryParse(_serviceReport.visitDate ?? ""), +// formatDateWithTime: true, +// onDatePicker: (selectedDate) { +// showTimePicker( +// context: context, +// initialTime: TimeOfDay.now(), +// ).then((selectedTime) { +// if (selectedTime != null) { +// DateTime selectedDateTime = DateTime( +// selectedDate.year, +// selectedDate.month, +// selectedDate.day, +// selectedTime.hour, +// selectedTime.minute, +// ); +// setState(() { +// _serviceReport.visitDate = selectedDateTime.toIso8601String(); +// }); +// } +// }); +// }, +// ), +// 8.height, +// AppTimer( +// label: context.translation.workingHours, +// timer: _serviceReport.timer, +// enabled: _serviceReport.endofWorkTime == null, +// onChange: (timer) async { +// _serviceReport.timer = timer; +// return true; +// }, +// onPick: (value) {}, +// ), +// 8.height, +// LoadingManager( +// isLoading: _assetTypeProvider.isLoading, +// isFailedLoading: _assetTypeProvider.statuses == null, +// stateCode: _assetTypeProvider.stateCode, +// onRefresh: () async { +// _assetTypeProvider.reset(); +// await _assetTypeProvider.getTypes(); +// _serviceReport.assetType = _assetTypeProvider.statuses?.firstWhere( +// (element) => element.value == _serviceReport.callRequest?.assetType, +// orElse: null, +// ); +// }, +// child: AppTextFormField( +// labelText: context.translation.assetType, +// initialValue: _serviceReport.assetType?.name, +// textAlign: TextAlign.center, +// enable: false, +// style: Theme.of(context).textTheme.titleMedium, +// ), +// ), +// 8.height, +// SingleItemDropDownMenu( +// context: context, +// title: context.translation.equipmentStatus, +// initialValue: _serviceReport.equipmentStatus, +// onSelect: (value) { +// _serviceReport.equipmentStatus = value; +// }, +// ), +// 8.height, +// SingleItemDropDownMenu( +// context: context, +// title: context.translation.reason, +// initialValue: _serviceReport.reason, +// onSelect: (value) { +// if (value != null) { +// _serviceReport.reason = value; +// } +// }, +// ), +// 8.height, +// SingleItemDropDownMenu( +// context: context, +// title: context.translation.serviceType, +// initialValue: _serviceReport.serviceType, +// onSelect: (value) { +// _serviceReport.serviceType = value; +// }, +// ), +// 8.height, +// ServiceReportLastCallsMenu( +// report: _serviceReport, +// title: context.translation.callLastSituation, +// parentId: widget.request.id, +// onSelect: (status) { +// _serviceReport.calllastSituation = status; +// }, +// ), +// 8.height, +// ServiceReportFaultDescription( +// requestId: widget.request.id, +// initialValue: _serviceReport.faultDescription, +// onSelect: (status) { +// _serviceReport.faultDescription = status; +// _workPreformedController.text = _serviceReport.faultDescription?.workPerformed ?? ""; +// }, +// ), +// 8.height, +// AppTextFormField( +// labelText: context.translation.solution, +// initialValue: _serviceReport.faultDescription?.workPerformed, +// textAlign: TextAlign.center, +// enable: false, +// controller: _workPreformedController, +// ), +// 8.height, +// SingleItemDropDownMenu( +// context: context, +// title: context.translation.loanAvailability, +// initialValue: _serviceReport.loanAvailablity, +// onSelect: (status) { +// if (status != null) { +// setState(() { +// _serviceReport.loanAvailablity = status; +// if (_serviceReport.loanAvailablity?.value != 1) { +// loanAvailabilityAsset = null; +// _serviceReport.assetLoan = null; +// } +// }); +// } +// }, +// ), +// if (_serviceReport.loanAvailablity?.value == 1) 8.height, +// if (_serviceReport.loanAvailablity?.value == 1) +// PickAsset( +// device: loanAvailabilityAsset, // ?? _serviceReport.device, +// onPickAsset: (asset) { +// _serviceReport.assetLoan = AssetInfo.fromJson(asset.toJson()); +// setState(() { +// loanAvailabilityAsset = asset; +// }); +// }, +// ), +// if (_serviceReport.assetLoan != null && loanAvailabilityAsset == null) +// Card(child: "${context.translation.assetNumber}: ${_serviceReport.assetLoan?.assetNumber}".bodyText(context).paddingAll(16)), +// 8.height, +// ServiceReportAssistantEmployeeMenu( +// title: context.translation.assignAssistant, +// assetId: _serviceReport.callRequest!.asset!.id!, +// initialValue: (_serviceReport.assistantEmployees?.isNotEmpty ?? false) ? _serviceReport.assistantEmployees?.first : null, +// onSelect: (employee) { +// if (employee == null) { +// _serviceReport.assistantEmployees = []; +// } else { +// _serviceReport.assistantEmployees = [employee.copyWith(id: 0)]; +// } +// }, +// ), +// 8.height, +// AppTextFormField( +// labelText: context.translation.travelingExpense, +// initialValue: _serviceReport.travelingExpenses?.toString(), +// textInputType: TextInputType.number, +// onSaved: (value) { +// _serviceReport.travelingExpenses = double.tryParse(value) ?? 0.0; +// }, +// ), +// 8.height, +// AppTextFormField( +// labelText: context.translation.travelingHours, +// initialValue: _serviceReport.travelingHours?.toString(), +// textInputType: TextInputType.number, +// onSaved: (value) { +// _serviceReport.travelingHours = double.tryParse(value) ?? 0.0; +// }, +// ), +// 8.height, +// AppTextFormField( +// initialValue: _serviceReport.comment, +// labelText: context.translation.technicalComment, +// alignLabelWithHint: true, +// textInputType: TextInputType.multiline, +// onSaved: (value) { +// _serviceReport.comment = value; +// }, +// ), +// 8.height, +// ServiceReportRepairLocation( +// label: context.translation.repairLocation, +// initialValue: _serviceReport.repairLocation, +// onSelect: (status) { +// _serviceReport.repairLocation = status; +// }, +// ), +// 8.height, +// PartNoButton( +// controller: _partQtyController, +// spareParts: _spareParts, +// initialList: _serviceReport.sparePartsWorkOrders, +// onChange: (parts) { +// _serviceReport.sparePartsWorkOrders = parts; +// }, +// ), +// 8.height, +// MultiFilesPicker(label: context.translation.attachImage, files: _files), +// 8.height, +// ESignature( +// title: context.translation.engSign, +// oldSignature: _serviceReport.engSignature, +// newSignature: _serviceReport.localEngSignature, +// onSaved: (signature) { +// if (signature == null || signature.isEmpty) { +// setState(() {}); +// return; +// } +// _serviceReport.localEngSignature = signature; +// _serviceReport.engSignature = signature != null ? "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}" : null; +// }, +// ), +// 8.height, +// ESignature( +// title: context.translation.nurseSignature, +// oldSignature: _serviceReport.nurseSignature, +// newSignature: _serviceReport.localNurseSignature, +// onSaved: (signature) { +// if (signature == null || signature.isEmpty) { +// setState(() {}); +// return; +// } +// _serviceReport.localNurseSignature = signature; +// _serviceReport.nurseSignature = signature != null ? "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}" : null; +// }, +// ), +// 24.height, +// ], +// ), +// ).expanded, +// AppFilledButton( +// label: context.translation.updateRequest, +// onPressed: () async { +// if ((!_formKey.currentState!.validate()) || (!(await _serviceReport.validate(context)))) { +// setState(() {}); +// return; +// } +// _formKey.currentState!.save(); +// _serviceReport.attachmentsWorkOrder ??= []; +// if (_files.isEmpty) _serviceReport.attachmentsWorkOrder = []; +// try { +// for (var file in _files) { +// _serviceReport.attachmentsWorkOrder!.add(Attachment(id: 0, name: "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}")); +// } +// } catch (error) { +// print(error); +// } +// +// await _serviceRequestsProvider.updateServiceReport(context, report: _serviceReport); +// }, +// ), +// ], +// ).paddingAll(16), +// ), +// ), +// ), +// ); +// } +// } diff --git a/lib/views/pages/user/requests/work_order/update_service_report.dart b/lib/views/pages/user/requests/work_order/update_service_report.dart index 13a0d7ed..aa945fd5 100644 --- a/lib/views/pages/user/requests/work_order/update_service_report.dart +++ b/lib/views/pages/user/requests/work_order/update_service_report.dart @@ -1,45 +1,45 @@ -import 'package:flutter/material.dart'; -import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; -import 'package:test_sa/models/service_request/search_work_order.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/views/widgets/loaders/app_loading.dart'; -import 'package:test_sa/views/widgets/loaders/failed_loading.dart'; - -import 'edit_service_report.dart'; - -class UpdateServiceReport extends StatefulWidget { - final ServiceRequest request; - final SearchWorkOrder workOrder; - - const UpdateServiceReport({Key? key, required this.request, required this.workOrder}) : super(key: key); - - @override - _UpdateServiceReportState createState() => _UpdateServiceReportState(); -} - -class _UpdateServiceReportState extends State { - @override - Widget build(BuildContext context) { - ServiceRequestsProvider().getSingleServiceReport(context, reportId: widget.workOrder.id!.toInt()); - return Scaffold( - body: FutureBuilder( - future: ServiceRequestsProvider().getSingleServiceReport(context, reportId: widget.workOrder.id!.toInt()), - builder: (BuildContext context, AsyncSnapshot snapshot) { - if (snapshot.hasError) { - return FailedLoading( - message: snapshot.error.toString(), - onReload: () { - setState(() {}); - }, - ); - } - if (snapshot.connectionState == ConnectionState.done) { - return EditServiceReport(report: snapshot.data as ServiceReport, request: widget.request); - } - return const Center(child: ALoading()); - }, - ), - ); - } -} +// import 'package:flutter/material.dart'; +// import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; +// import 'package:test_sa/models/service_request/search_work_order.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/views/widgets/loaders/app_loading.dart'; +// import 'package:test_sa/views/widgets/loaders/failed_loading.dart'; +// +// import 'edit_service_report.dart'; +// todo @delete +// class UpdateServiceReport extends StatefulWidget { +// final ServiceRequest request; +// final SearchWorkOrder workOrder; +// +// const UpdateServiceReport({Key? key, required this.request, required this.workOrder}) : super(key: key); +// +// @override +// _UpdateServiceReportState createState() => _UpdateServiceReportState(); +// } +// +// class _UpdateServiceReportState extends State { +// @override +// Widget build(BuildContext context) { +// ServiceRequestsProvider().getSingleServiceReport(context, reportId: widget.workOrder.id!.toInt()); +// return Scaffold( +// body: FutureBuilder( +// future: ServiceRequestsProvider().getSingleServiceReport(context, reportId: widget.workOrder.id!.toInt()), +// builder: (BuildContext context, AsyncSnapshot snapshot) { +// if (snapshot.hasError) { +// return FailedLoading( +// message: snapshot.error.toString(), +// onReload: () { +// setState(() {}); +// }, +// ); +// } +// if (snapshot.connectionState == ConnectionState.done) { +// return EditServiceReport(report: snapshot.data as ServiceReport, request: widget.request); +// } +// return const Center(child: ALoading()); +// }, +// ), +// ); +// } +// } diff --git a/lib/views/widgets/timer/app_timer.dart b/lib/views/widgets/timer/app_timer.dart index 952b4955..a4e15fd7 100644 --- a/lib/views/widgets/timer/app_timer.dart +++ b/lib/views/widgets/timer/app_timer.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'package:flutter/material.dart'; +import 'package:test_sa/controllers/api_routes/api_manager.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'; @@ -22,7 +23,6 @@ class AppTimer extends StatefulWidget { final bool enabled; final String? label; final double? width; - final bool canPickTime; final Function(bool)? timerProgress; @@ -38,7 +38,6 @@ class AppTimer extends StatefulWidget { this.onPick, this.timerProgress, this.enabled = true, - this.canPickTime = false, }) : super(key: key); @override @@ -52,6 +51,7 @@ class _AppTimerState extends State { int _delay = 0; bool _running = false; bool _loading = false; + bool canPickTime = false; final ValueNotifier _period = ValueNotifier("0:00:00"); DateTime? _pickerStartAt; @@ -124,6 +124,7 @@ class _AppTimerState extends State { @override void initState() { + canPickTime = ApiManager.instance.assetGroup?.enabledEngineerTimer ?? false; _startAt = widget.timer?.startAt; _endAt = widget.timer?.endAt; _running = _startAt != null && _endAt == null; @@ -152,7 +153,7 @@ class _AppTimerState extends State { Widget build(BuildContext context) { return Column( children: [ - if (widget.canPickTime) ...[ + if (canPickTime) ...[ Row( mainAxisSize: MainAxisSize.min, children: [