timer picker added, and code improvements

design_3.0_demo_module
Sikander Saleem 9 months ago
parent bcb54f6279
commit 62dd395a73

@ -168,9 +168,9 @@ class AllRequestsProvider extends ChangeNotifier {
stateCode = response.statusCode; stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
if (_allRequestsAndCount == null) { if (_allRequestsAndCount == null) {
_allRequestsAndCount = AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]); _allRequestsAndCount = (await AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]));
} else { } 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) { if (_allRequestsAndCount!.requestsDetails!.length >= pageItemNumber) {
nextPage = true; nextPage = true;
@ -266,7 +266,7 @@ class AllRequestsProvider extends ChangeNotifier {
stateCode = response.statusCode; stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) { 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(); notifyListeners();
} }
isCalendarLoading = false; isCalendarLoading = false;
@ -306,9 +306,9 @@ class AllRequestsProvider extends ChangeNotifier {
stateCode = response.statusCode; stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
if (_highPriorityRequests == null) { if (_highPriorityRequests == null) {
_highPriorityRequests = AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]); _highPriorityRequests = (await AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]));
} else { } 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) { if (_highPriorityRequests!.requestsDetails!.length >= pageItemNumber) {
nextPage = true; nextPage = true;
@ -357,9 +357,9 @@ class AllRequestsProvider extends ChangeNotifier {
stateCode = response.statusCode; stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
if (_overdueRequests == null) { if (_overdueRequests == null) {
_overdueRequests = AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]); _overdueRequests = (await AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]));
} else { } 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) { if (_overdueRequests!.requestsDetails!.length >= pageItemNumber) {
nextPage = true; nextPage = true;
@ -412,9 +412,9 @@ class AllRequestsProvider extends ChangeNotifier {
stateCode = response.statusCode; stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
if (openRequests == null) { if (openRequests == null) {
openRequests = AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]); openRequests = (await AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]));
} else { } 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) { if (openRequests!.requestsDetails!.length >= pageItemNumber) {
nextPage = true; nextPage = true;
@ -466,10 +466,10 @@ class AllRequestsProvider extends ChangeNotifier {
stateCode = response.statusCode; stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
if (inProgressRequests == null) { if (inProgressRequests == null) {
inProgressRequests = AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]); inProgressRequests = (await AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]));
notifyListeners(); notifyListeners();
} else { } 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(); notifyListeners();
} }
if (inProgressRequests!.requestsDetails!.length >= pageItemNumber) { if (inProgressRequests!.requestsDetails!.length >= pageItemNumber) {
@ -512,11 +512,11 @@ class AllRequestsProvider extends ChangeNotifier {
stateCode = response.statusCode; stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
if (filterRequest == null) { if (filterRequest == null) {
filterRequest = AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]); filterRequest = (await AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]));
isFilterRequestLoading = false; isFilterRequestLoading = false;
notifyListeners(); notifyListeners();
} else { } 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; isFilterRequestLoading = false;
notifyListeners(); notifyListeners();
} }
@ -548,11 +548,11 @@ class AllRequestsProvider extends ChangeNotifier {
stateCode = response.statusCode; stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
if (selectedRequestCategory == null) { if (selectedRequestCategory == null) {
selectedRequestCategory = AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]); selectedRequestCategory = (await AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]));
isRequestCategoryLoading = false; isRequestCategoryLoading = false;
notifyListeners(); notifyListeners();
} else { } 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; isRequestCategoryLoading = false;
notifyListeners(); notifyListeners();
} }
@ -600,9 +600,9 @@ class AllRequestsProvider extends ChangeNotifier {
stateCode = response.statusCode; stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
if (completedRequests == null) { if (completedRequests == null) {
completedRequests = AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]); completedRequests = (await AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]));
} else { } 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) { if (completedRequests!.requestsDetails!.length >= pageItemNumber) {
nextPage = true; nextPage = true;

@ -278,89 +278,89 @@ class ServiceRequestsProvider extends ChangeNotifier {
} }
} }
Future<int> updateRequest({required User user, required ServiceRequest request}) async { // Future<int> updateRequest({required User user, required ServiceRequest request}) async {
isLoading = true; // isLoading = true;
notifyListeners(); // notifyListeners();
Map<String, dynamic> serviceRequest = await getServiceRequestById(requestId: request.id!); // Map<String, dynamic> serviceRequest = await getServiceRequestById(requestId: request.id!);
final List callSiteContacts = (serviceRequest['callSiteContactPerson'] as List); // final List callSiteContacts = (serviceRequest['callSiteContactPerson'] as List);
final Map<String, dynamic> callSiteContactPerson = callSiteContacts.isEmpty ? {} : callSiteContacts[0]; // final Map<String, dynamic> callSiteContactPerson = callSiteContacts.isEmpty ? {} : callSiteContacts[0];
Response response; // Response response;
try { // try {
if ((request.audio ?? "").isNotEmpty) { // if ((request.audio ?? "").isNotEmpty) {
request.audio = request.audio!.substring(request.audio!.indexOf("=") + 1, request.audio!.length); // request.audio = request.audio!.substring(request.audio!.indexOf("=") + 1, request.audio!.length);
} // }
} catch (ex) {} // } catch (ex) {}
//
var body = { // var body = {
"id": request.id, // "id": request.id,
"callNo": serviceRequest['callNo'], // "callNo": serviceRequest['callNo'],
"callCreatedBy": serviceRequest['callCreatedBy'], // "callCreatedBy": serviceRequest['callCreatedBy'],
"requestedDate": request.date ?? "", // "requestedDate": request.date ?? "",
"requestedTime": request.date ?? "", // "requestedTime": request.date ?? "",
"priority": request.priority?.toJson(), // "priority": request.priority?.toJson(),
"defectType": request.defectType?.toJson(), // "defectType": request.defectType?.toJson(),
"typeofRequest": request.type?.toJson(), // "typeofRequest": request.type?.toJson(),
"requestedThrough": request.requestedThrough?.toJson(), // "requestedThrough": request.requestedThrough?.toJson(),
"voiceNote": request.audio, // "voiceNote": request.audio,
"assets": request.deviceId == null ? [] : [request.deviceId], // "assets": request.deviceId == null ? [] : [request.deviceId],
"attachmentsCallRequest": (request.devicePhotos?.isNotEmpty ?? false) ? request.devicePhotos?.map((e) => {"name": e.getFileName}).toList() : [], // "attachmentsCallRequest": (request.devicePhotos?.isNotEmpty ?? false) ? request.devicePhotos?.map((e) => {"name": e.getFileName}).toList() : [],
"assignedEmployee": { // "assignedEmployee": {
"id": request.engineerId, // "id": request.engineerId,
"name": request.engineerName, // "name": request.engineerName,
}, // },
"callSiteContactPerson": [ // "callSiteContactPerson": [
{ // {
"id": callSiteContactPerson['id'] ?? 0, // "id": callSiteContactPerson['id'] ?? 0,
"employeeCode": callSiteContactPerson['employeeCode'], // "employeeCode": callSiteContactPerson['employeeCode'],
"name": callSiteContactPerson['name'] ?? user.userName, // "name": callSiteContactPerson['name'] ?? user.userName,
"telephone": callSiteContactPerson['telephone'] ?? user.phoneNumber, // "telephone": callSiteContactPerson['telephone'] ?? user.phoneNumber,
"job": callSiteContactPerson['job'], // "job": callSiteContactPerson['job'],
"email": callSiteContactPerson['email'] ?? user.email, // "email": callSiteContactPerson['email'] ?? user.email,
"land": callSiteContactPerson['land'], // "land": callSiteContactPerson['land'],
"contactUserId": user.userID, // "contactUserId": user.userID,
}, // },
], // ],
"callComments": request.callComments, // "callComments": request.callComments,
"noofFollowup": 0, // "noofFollowup": 0,
"status": request.statusId == null // "status": request.statusId == null
? null // ? null
: { // : {
"id": request.statusId, // "id": request.statusId,
"name": request.statusLabel, // "name": request.statusLabel,
"value": request.statusValue, // "value": request.statusValue,
}, // },
"callLastSituation": null, // "callLastSituation": null,
"firstAction": request.firstAction?.toJson(), // "firstAction": request.firstAction?.toJson(),
"loanAvailablity": request.loanAvailability?.toJson(), // "loanAvailablity": request.loanAvailability?.toJson(),
"comments": request.comments, // "comments": request.comments,
"firstActionDate": request.visitDate, // "firstActionDate": request.visitDate,
"visitDate": request.visitDate, // "visitDate": request.visitDate,
"startDate": request.startDate, // "startDate": request.startDate,
"endDate": request.endDate, // "endDate": request.endDate,
"workingHours": request.workingHours, // "workingHours": request.workingHours,
"callReview": null, // "callReview": null,
"reviewComment": null, // "reviewComment": null,
//"reviewComment": request.reviewComment, // //"reviewComment": request.reviewComment,
}; // };
try { // try {
response = await ApiManager.instance.put( // response = await ApiManager.instance.put(
URLs.updateRequestDate, // URLs.updateRequestDate,
body: body, // body: body,
); // );
stateCode = response.statusCode; // stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) { // if (response.statusCode >= 200 && response.statusCode < 300) {
// request.engineerName = employee.name; // // request.engineerName = employee.name;
notifyListeners(); // notifyListeners();
} // }
isLoading = false; // isLoading = false;
notifyListeners(); // notifyListeners();
return response.statusCode; // return response.statusCode;
} catch (error) { // } catch (error) {
isLoading = false; // isLoading = false;
notifyListeners(); // notifyListeners();
return -1; // return -1;
} // }
} // }
Future<int> createServiceReport(BuildContext context, {required ServiceReport report, required User user, required ServiceRequest request}) async { Future<int> createServiceReport(BuildContext context, {required ServiceReport report, required User user, required ServiceRequest request}) async {
Response response; Response response;
@ -595,105 +595,105 @@ class ServiceRequestsProvider extends ChangeNotifier {
} }
} }
Future<ServiceReport> getSingleServiceReport(BuildContext context, {required int reportId}) async { // Future<ServiceReport> getSingleServiceReport(BuildContext context, {required int reportId}) async {
Response response; // Response response;
try { // try {
response = await ApiManager.instance.get(URLs.getServiceReport + "?workOrderId=$reportId"); // response = await ApiManager.instance.get(URLs.getServiceReport + "?workOrderId=$reportId");
} catch (error) { // } catch (error) {
throw (context.translation.failedToCompleteRequest); // throw (context.translation.failedToCompleteRequest);
} // }
//
// If the call to the server was successful, parse the JSON. // // If the call to the server was successful, parse the JSON.
if (response.statusCode >= 200 && response.statusCode < 300) { // if (response.statusCode >= 200 && response.statusCode < 300) {
// If the call to the server was successful, parse the JSON. // // If the call to the server was successful, parse the JSON.
return ServiceReport.fromJson(json.decode(response.body)["data"]); // return ServiceReport.fromJson(json.decode(response.body)["data"]);
} else { // } else {
throw (("${context.translation.failedToCompleteRequest} ${jsonDecode(response.body)["message"]}")); // throw (("${context.translation.failedToCompleteRequest} ${jsonDecode(response.body)["message"]}"));
} // }
} // }
//
Future<ServiceRequest?> getServiceRequestObjectById({required String requestId}) async { // Future<ServiceRequest?> getServiceRequestObjectById({required String requestId}) async {
try { // try {
isDetialLoading = true; // isDetialLoading = true;
Response response = await ApiManager.instance.get(URLs.getServiceRequestById + "?callRequestId=$requestId"); // Response response = await ApiManager.instance.get(URLs.getServiceRequestById + "?callRequestId=$requestId");
if (response.statusCode >= 200 && response.statusCode < 300) { // if (response.statusCode >= 200 && response.statusCode < 300) {
isDetialLoading = false; // isDetialLoading = false;
return ServiceRequest.fromJson(json.decode(response.body)["data"]); // return ServiceRequest.fromJson(json.decode(response.body)["data"]);
} else { // } else {
isDetialLoading = false; // isDetialLoading = false;
return null; // return null;
} // }
} catch (error) { // } catch (error) {
isDetialLoading = false; // isDetialLoading = false;
return null; // return null;
} // }
} // }
Future<Map<String, dynamic>> 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. // Future<Map<String, dynamic>> getServiceRequestById({required String requestId}) async {
if (response.statusCode >= 200 && response.statusCode < 300) { // Response response;
// If the call to the server was successful, parse the JSON. // try {
return { // response = await ApiManager.instance.get(URLs.getServiceRequestById + "?callRequestId=$requestId");
"callNo": json.decode(response.body)["data"]["callNo"], // } catch (error) {
"callCreatedBy": json.decode(response.body)["data"]["callCreatedBy"], // print(error);
"callSiteContactPerson": json.decode(response.body)["data"]["callSiteContactPerson"], // return {};
"firstActionDate": json.decode(response.body)["data"]["firstActionDate"], // }
}; //
} else { // // If the call to the server was successful, parse the JSON.
return {}; // 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<List<SearchWorkOrder>> searchForWorkOrders( // Future<List<SearchWorkOrder>> searchForWorkOrders(
SearchWorkOrder search, // SearchWorkOrder search,
String callerId, // String callerId,
Lookup dateOperator, // Lookup dateOperator,
String site, // String site,
) async { // ) async {
Response response; // Response response;
try { // try {
var body = { // var body = {
"pageSize": pageItemNumber, // "pageSize": pageItemNumber,
"pageNumber": ((workOrders.length ?? 0) ~/ pageItemNumber) + 1, // "pageNumber": ((workOrders.length ?? 0) ~/ pageItemNumber) + 1,
if (callerId.isNotEmpty ?? false) "callId": callerId, // if (callerId.isNotEmpty ?? false) "callId": callerId,
if (search.assetType != null) "assetSerialNo": search.assetType?.name, // if (search.assetType != null) "assetSerialNo": search.assetType?.name,
if (search.workOrderNo != null) "workOrderNo": search.workOrderNo, // if (search.workOrderNo != null) "workOrderNo": search.workOrderNo,
if (search.id != null) "workOrderNo": search.id.toString(), // if (search.id != null) "workOrderNo": search.id.toString(),
if (search.calllastSituation != null) "callslastSituationWO": search.calllastSituation!.toJson(), // if (search.calllastSituation != null) "callslastSituationWO": search.calllastSituation!.toJson(),
if (search.assignedEmployee != null) "assignedEmployees": [search.assignedEmployee!.id], // if (search.assignedEmployee != null) "assignedEmployees": [search.assignedEmployee!.id],
// "statusWO": [], // // "statusWO": [],
if (site.isNotEmpty ?? false) "site": site, // if (site.isNotEmpty ?? false) "site": site,
if (search.visitDate != null) "visitDateSymbol": dateOperator.toJson(), // if (search.visitDate != null) "visitDateSymbol": dateOperator.toJson(),
if (search.visitDate != null) "visitDateFrom": search.visitDate, // if (search.visitDate != null) "visitDateFrom": search.visitDate,
}; // };
print(body); // print(body);
response = await ApiManager.instance.post(URLs.searchWorkOrders, body: body); // response = await ApiManager.instance.post(URLs.searchWorkOrders, body: body);
stateCode = response.statusCode; // stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) { // if (response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received // // client's request was successfully received
List workOrdersJson = json.decode(response.body)["data"]; // List workOrdersJson = json.decode(response.body)["data"];
workOrders ??= []; // workOrders ??= [];
workOrders.addAll(workOrdersJson.map<SearchWorkOrder>((request) => SearchWorkOrder.fromJson(request)).toList()); // workOrders.addAll(workOrdersJson.map<SearchWorkOrder>((request) => SearchWorkOrder.fromJson(request)).toList());
if (workOrders.length == pageItemNumber) { // if (workOrders.length == pageItemNumber) {
nextPage = true; // nextPage = true;
} else { // } else {
nextPage = false; // nextPage = false;
} // }
} // }
return workOrders; // return workOrders;
} catch (e) { // } catch (e) {
print(e); // print(e);
return []; // return [];
} // }
} // }
Future<SuppEngineerWorkOrders?> addSupplierEngineer(SupplierEngineer supplierEngineer) async { Future<SuppEngineerWorkOrders?> addSupplierEngineer(SupplierEngineer supplierEngineer) async {
isLoading = true; isLoading = true;

@ -94,7 +94,7 @@ class UserProvider extends ChangeNotifier {
_loading = false; _loading = false;
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received // 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); _user!.profilePhotoName = URLs.getFileUrl(_user!.profilePhotoName);
ApiManager.instance.user = _user; ApiManager.instance.user = _user;
notifyListeners(); notifyListeners();

@ -149,7 +149,7 @@ class SettingProvider extends ChangeNotifier {
if (prefs.containsKey(ASettings.user)) { if (prefs.containsKey(ASettings.user)) {
String userJson = prefs.getString(ASettings.user)!; String userJson = prefs.getString(ASettings.user)!;
user = User.fromJson(json.decode(userJson)); user = await User.fromJson(json.decode(userJson));
selectAssetGroup(user!); selectAssetGroup(user!);
} }

@ -1,5 +1,7 @@
import 'dart:convert'; import 'dart:convert';
import 'package:flutter/foundation.dart';
class AllRequestsAndCount { class AllRequestsAndCount {
CountServiceRequest? countServiceRequest; CountServiceRequest? countServiceRequest;
CountServiceRequest? countGasRefill; CountServiceRequest? countGasRefill;
@ -19,7 +21,7 @@ class AllRequestsAndCount {
this.requestsDetails, this.requestsDetails,
}); });
AllRequestsAndCount.fromJson(Map<String, dynamic> json) { AllRequestsAndCount.fromJsonCons(Map<String, dynamic> json) {
countServiceRequest = json['countServiceRequest'] != null ? CountServiceRequest.fromJson(json['countServiceRequest']) : null; countServiceRequest = json['countServiceRequest'] != null ? CountServiceRequest.fromJson(json['countServiceRequest']) : null;
countGasRefill = json['countGasRefill'] != null ? CountServiceRequest.fromJson(json['countGasRefill']) : null; countGasRefill = json['countGasRefill'] != null ? CountServiceRequest.fromJson(json['countGasRefill']) : null;
countAssetTransfer = json['countAssetTransfer'] != null ? CountServiceRequest.fromJson(json['countAssetTransfer']) : null; countAssetTransfer = json['countAssetTransfer'] != null ? CountServiceRequest.fromJson(json['countAssetTransfer']) : null;
@ -34,6 +36,10 @@ class AllRequestsAndCount {
} }
} }
static Future<AllRequestsAndCount> fromJson(Map<String, dynamic> json) {
return compute(AllRequestsAndCount.fromJsonCons, json);
}
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{}; final Map<String, dynamic> data = <String, dynamic>{};
if (countServiceRequest != null) { if (countServiceRequest != null) {
@ -123,30 +129,29 @@ class RequestsDetails {
String? siteTransferTo; String? siteTransferTo;
int? transactionType; int? transactionType;
RequestsDetails({ RequestsDetails(
this.id, {this.id,
this.nameOfType, this.nameOfType,
this.priority, this.priority,
this.status, this.status,
this.assetName, this.assetName,
this.assetNo, this.assetNo,
this.assetSN, this.assetSN,
this.model, this.model,
this.supplier, this.supplier,
this.manufacturer, this.manufacturer,
this.requestType, this.requestType,
this.requestNo, this.requestNo,
this.gasType, this.gasType,
this.site, this.site,
this.statusReceiver, this.statusReceiver,
this.assetTransferFrom, this.assetTransferFrom,
this.assetTransferTo, this.assetTransferTo,
this.code, this.code,
this.siteTransferFrom, this.siteTransferFrom,
this.siteTransferTo, this.siteTransferTo,
this.date, this.date,
this.transactionType this.transactionType});
});
RequestsDetails.fromJson(Map<String, dynamic> json) { RequestsDetails.fromJson(Map<String, dynamic> json) {
id = json['id']; id = json['id'];

@ -1,3 +1,4 @@
import 'package:flutter/foundation.dart';
import 'package:test_sa/models/fault_description.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/spare_part/activity_spare_part_model.dart';
import 'package:test_sa/models/helper_data_models/workorder/work_order_helper_models.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 int? responseCode;
final bool? isSuccess; final bool? isSuccess;
factory WorkOrderDetail.fromJson(Map<String, dynamic> json) { factory WorkOrderDetail.fromJsonCons(Map<String, dynamic> json) {
return WorkOrderDetail( return WorkOrderDetail(
data: json["data"] == null ? null : WorkOrderData.fromJson(json["data"]), data: json["data"] == null ? null : WorkOrderData.fromJson(json["data"]),
message: json["message"], message: json["message"],
@ -31,6 +32,10 @@ class WorkOrderDetail {
); );
} }
static Future<WorkOrderDetail> fromJson(Map<String, dynamic> json) {
return compute(WorkOrderDetail.fromJsonCons, json);
}
Map<String, dynamic> toJson() => { Map<String, dynamic> toJson() => {
"data": data?.toJson(), "data": data?.toJson(),
"message": message, "message": message,
@ -465,7 +470,7 @@ class ActivitySparePart {
String? comment; String? comment;
List<SparePartAttachments>? acitiySparePartAttachments; List<SparePartAttachments>? 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<String, dynamic> json) { ActivitySparePart.fromJson(Map<String, dynamic> json) {
id = json['id']; id = json['id'];

@ -1,5 +1,6 @@
import 'dart:io'; import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:test_sa/controllers/notification/firebase_notification_manger.dart'; import 'package:test_sa/controllers/notification/firebase_notification_manger.dart';
import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/enums/user_types.dart';
@ -169,7 +170,11 @@ class User {
return map; return map;
} }
User.fromJson(dynamic json) { static Future<User> fromJson(Map<String, dynamic> json) {
return compute(User.fromJsonCons, json);
}
User.fromJsonCons(dynamic json) {
clientId = json['client_id']; clientId = json['client_id'];
clientName = json['client_name']; clientName = json['client_name'];
if (json['department_id'] != null) { if (json['department_id'] != null) {
@ -272,9 +277,9 @@ class AssetGroup {
int? id; int? id;
String? name; String? name;
String? code; 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<String, dynamic>? json) { AssetGroup.fromJson(Map<String, dynamic>? json) {
// Allow json to be null // Allow json to be null
@ -283,7 +288,7 @@ class AssetGroup {
id = json['id']; id = json['id'];
name = json['name']; name = json['name'];
code = json['code']; code = json['code'];
enabledEngineerTimer = json['enabledEngineerTimer']; enabledEngineerTimer = json['enabledEngineerTimer'] ?? false;
} }
} }

@ -236,7 +236,7 @@ class ServiceRequestDetailProvider extends ChangeNotifier {
final response = await ApiManager.instance.get(URLs.getWorkOrderByIdUrl + "?workOrderId=$id"); final response = await ApiManager.instance.get(URLs.getWorkOrderByIdUrl + "?workOrderId=$id");
stateCode = response.statusCode; stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) { 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. //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) { if (currentWorkOrder?.data?.status?.value == 3 || currentWorkOrder?.data?.status?.value == 5 || currentWorkOrder?.data?.status?.value == 6) {
isReadOnlyRequest = true; isReadOnlyRequest = true;
@ -270,7 +270,7 @@ class ServiceRequestDetailProvider extends ChangeNotifier {
final response = await ApiManager.instance.post(URLs.uploadWorkOrderAttachmentsUrl, body: WorkOrderHelperModel().toUploadAttachmentJson(woId, woAttachments)); final response = await ApiManager.instance.post(URLs.uploadWorkOrderAttachmentsUrl, body: WorkOrderHelperModel().toUploadAttachmentJson(woId, woAttachments));
stateCode = response.statusCode; stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body)); currentWorkOrder = await WorkOrderDetail.fromJson(json.decode(response.body));
} }
isLoading = false; isLoading = false;
notifyListeners(); notifyListeners();
@ -315,7 +315,7 @@ class ServiceRequestDetailProvider extends ChangeNotifier {
response = await ApiManager.instance.post(URLs.engineerAcceptUrl, body: body); response = await ApiManager.instance.post(URLs.engineerAcceptUrl, body: body);
stateCode = response.statusCode; stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body)); currentWorkOrder = await WorkOrderDetail.fromJson(json.decode(response.body));
} }
isLoading = false; isLoading = false;
notifyListeners(); notifyListeners();
@ -337,7 +337,7 @@ class ServiceRequestDetailProvider extends ChangeNotifier {
response = await ApiManager.instance.post(URLs.engineerAssignHimSelfUrl, body: body); response = await ApiManager.instance.post(URLs.engineerAssignHimSelfUrl, body: body);
stateCode = response.statusCode; stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body)); currentWorkOrder = await WorkOrderDetail.fromJson(json.decode(response.body));
} }
isLoading = false; isLoading = false;
notifyListeners(); notifyListeners();
@ -379,7 +379,7 @@ class ServiceRequestDetailProvider extends ChangeNotifier {
response = await ApiManager.instance.post(URLs.engineerRejectUrl, body: engineerRejectHelperModel!.toJson()); response = await ApiManager.instance.post(URLs.engineerRejectUrl, body: engineerRejectHelperModel!.toJson());
stateCode = response.statusCode; stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body)); currentWorkOrder = await WorkOrderDetail.fromJson(json.decode(response.body));
} }
isLoading = false; isLoading = false;
notifyListeners(); notifyListeners();
@ -401,7 +401,7 @@ class ServiceRequestDetailProvider extends ChangeNotifier {
response = await ApiManager.instance.post(URLs.engineerFixRemotlyUrl, body: fixRemotelyHelperModel!.toJson()); response = await ApiManager.instance.post(URLs.engineerFixRemotlyUrl, body: fixRemotelyHelperModel!.toJson());
stateCode = response.statusCode; stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body)); currentWorkOrder = await WorkOrderDetail.fromJson(json.decode(response.body));
} }
isLoading = false; isLoading = false;
notifyListeners(); notifyListeners();
@ -423,7 +423,7 @@ class ServiceRequestDetailProvider extends ChangeNotifier {
response = await ApiManager.instance.post(URLs.engineerNeedVisitUrl, body: needVisitHelperModel!.toJson()); response = await ApiManager.instance.post(URLs.engineerNeedVisitUrl, body: needVisitHelperModel!.toJson());
stateCode = response.statusCode; stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body)); currentWorkOrder = await WorkOrderDetail.fromJson(json.decode(response.body));
} }
isLoading = false; isLoading = false;
notifyListeners(); notifyListeners();
@ -445,7 +445,7 @@ class ServiceRequestDetailProvider extends ChangeNotifier {
response = await ApiManager.instance.post(URLs.engineerUpdateNeedVisitUrl, body: needVisitHelperModel!.toJson()); response = await ApiManager.instance.post(URLs.engineerUpdateNeedVisitUrl, body: needVisitHelperModel!.toJson());
stateCode = response.statusCode; stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body)); currentWorkOrder = await WorkOrderDetail.fromJson(json.decode(response.body));
notifyListeners(); notifyListeners();
} }
isLoading = false; isLoading = false;
@ -471,7 +471,7 @@ class ServiceRequestDetailProvider extends ChangeNotifier {
response = await ApiManager.instance.post(URLs.engineerMarkAsFixUrl, body: body); response = await ApiManager.instance.post(URLs.engineerMarkAsFixUrl, body: body);
stateCode = response.statusCode; stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body)); currentWorkOrder = await WorkOrderDetail.fromJson(json.decode(response.body));
markedAsFixed = true; markedAsFixed = true;
stopTimer(); stopTimer();
} }
@ -495,7 +495,7 @@ class ServiceRequestDetailProvider extends ChangeNotifier {
response = await ApiManager.instance.put(URLs.reOrderActivity, body: body); response = await ApiManager.instance.put(URLs.reOrderActivity, body: body);
stateCode = response.statusCode; stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body)); currentWorkOrder = await WorkOrderDetail.fromJson(json.decode(response.body));
} }
isLoading = false; isLoading = false;
notifyListeners(); notifyListeners();
@ -526,7 +526,7 @@ class ServiceRequestDetailProvider extends ChangeNotifier {
response = await ApiManager.instance.post(URLs.engineerConfirmArriveUrl, body: body); response = await ApiManager.instance.post(URLs.engineerConfirmArriveUrl, body: body);
stateCode = response.statusCode; stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) { 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) {} if (response.statusCode >= 200 && response.statusCode < 300) {}
isLoading = false; isLoading = false;
@ -554,7 +554,7 @@ class ServiceRequestDetailProvider extends ChangeNotifier {
response = await ApiManager.instance.post(URLs.engineerSetReminderUrl, body: body); response = await ApiManager.instance.post(URLs.engineerSetReminderUrl, body: body);
stateCode = response.statusCode; stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) { 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) {} if (response.statusCode >= 200 && response.statusCode < 300) {}
isLoading = false; isLoading = false;
@ -599,7 +599,7 @@ class ServiceRequestDetailProvider extends ChangeNotifier {
final response = await ApiManager.instance.post(URLs.engineerUpdateWorkOrderUrl, body: engineerUpdateWorkOrderHelperModel!.toJson()); final response = await ApiManager.instance.post(URLs.engineerUpdateWorkOrderUrl, body: engineerUpdateWorkOrderHelperModel!.toJson());
stateCode = response.statusCode; stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body)); currentWorkOrder = await WorkOrderDetail.fromJson(json.decode(response.body));
} }
isLoading = false; isLoading = false;
notifyListeners(); notifyListeners();
@ -618,7 +618,7 @@ class ServiceRequestDetailProvider extends ChangeNotifier {
final response = await ApiManager.instance.post(URLs.engineerUpdateCost, body: workOrderCostModel!.toJson()); final response = await ApiManager.instance.post(URLs.engineerUpdateCost, body: workOrderCostModel!.toJson());
stateCode = response.statusCode; stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body)); currentWorkOrder = await WorkOrderDetail.fromJson(json.decode(response.body));
} }
isLoading = false; isLoading = false;
notifyListeners(); notifyListeners();
@ -661,7 +661,7 @@ class ServiceRequestDetailProvider extends ChangeNotifier {
final response = await ApiManager.instance.post(URLs.nurseConfirmEngineerArrivalUrl, body: body); final response = await ApiManager.instance.post(URLs.nurseConfirmEngineerArrivalUrl, body: body);
stateCode = response.statusCode; stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body)); currentWorkOrder = await WorkOrderDetail.fromJson(json.decode(response.body));
} }
isLoading = false; isLoading = false;
notifyListeners(); notifyListeners();
@ -682,7 +682,7 @@ class ServiceRequestDetailProvider extends ChangeNotifier {
final response = await ApiManager.instance.post(URLs.nurseRejectEngineerArrivedUrl, body: body); final response = await ApiManager.instance.post(URLs.nurseRejectEngineerArrivedUrl, body: body);
stateCode = response.statusCode; stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body)); currentWorkOrder = await WorkOrderDetail.fromJson(json.decode(response.body));
} }
isLoading = false; isLoading = false;
notifyListeners(); notifyListeners();
@ -705,7 +705,7 @@ class ServiceRequestDetailProvider extends ChangeNotifier {
stateCode = response.statusCode; stateCode = response.statusCode;
WorkOrderDetail? workOrderDetail; WorkOrderDetail? workOrderDetail;
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
workOrderDetail = WorkOrderDetail.fromJson(json.decode(response.body)); workOrderDetail = await WorkOrderDetail.fromJson(json.decode(response.body));
} }
isLoading = false; isLoading = false;
notifyListeners(); notifyListeners();
@ -858,7 +858,7 @@ class ServiceRequestDetailProvider extends ChangeNotifier {
); );
stateCode = response.statusCode; stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
// currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body)); // currentWorkOrder = await WorkOrderDetail.fromJson(json.decode(response.body));
// // updateCurrentWorkOrder(currentWorkOrder); // // updateCurrentWorkOrder(currentWorkOrder);
// notifyListeners(); // notifyListeners();
} }
@ -882,7 +882,7 @@ class ServiceRequestDetailProvider extends ChangeNotifier {
); );
stateCode = response.statusCode; stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
// currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body)); // currentWorkOrder = await WorkOrderDetail.fromJson(json.decode(response.body));
// updateCurrentWorkOrder(currentWorkOrder); // updateCurrentWorkOrder(currentWorkOrder);
} }
isLoading = false; isLoading = false;
@ -906,7 +906,7 @@ class ServiceRequestDetailProvider extends ChangeNotifier {
); );
stateCode = response.statusCode; stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body)); currentWorkOrder = await WorkOrderDetail.fromJson(json.decode(response.body));
} }
isLoading = false; isLoading = false;
notifyListeners(); notifyListeners();

@ -40,8 +40,8 @@ class _ServiceRequestDetailViewState extends State<ServiceRequestDetailView> {
@override @override
void initState() { void initState() {
ServiceRequestDetailProvider requestDetailProvider = Provider.of<ServiceRequestDetailProvider>(context, listen: false); // ServiceRequestDetailProvider requestDetailProvider = Provider.of<ServiceRequestDetailProvider>(context, listen: false);
_workOrderAttachments = requestDetailProvider.currentWorkOrder?.data?.workOrderAttachments.map((e) => File(e.name ?? '')).toList() ?? []; // _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() ?? []; // _workOrderAttachments = requestDetailProvider.currentWorkOrder?.data?.workOrderAttachments.map((e) => AttachmentModel(e.id??0, File(e.name ?? ''))).toList() ?? [];
super.initState(); super.initState();
} }
@ -50,6 +50,7 @@ class _ServiceRequestDetailViewState extends State<ServiceRequestDetailView> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
UserProvider _userProvider = Provider.of<UserProvider>(context, listen: false); UserProvider _userProvider = Provider.of<UserProvider>(context, listen: false);
return Consumer<ServiceRequestDetailProvider>(builder: (pContext, requestProvider, _) { return Consumer<ServiceRequestDetailProvider>(builder: (pContext, requestProvider, _) {
_workOrderAttachments = requestProvider.currentWorkOrder?.data?.workOrderAttachments.map((e) => File(e.name ?? '')).toList() ?? [];
return requestProvider.isLoading return requestProvider.isLoading
? const CircularProgressIndicator(color: AppColor.primary10).center ? const CircularProgressIndicator(color: AppColor.primary10).center
: requestProvider.currentWorkOrder == null : requestProvider.currentWorkOrder == null
@ -248,7 +249,11 @@ class _ServiceRequestDetailViewState extends State<ServiceRequestDetailView> {
'${context.translation.closedDate}: ${workOrder.closedDate != null ? workOrder.closedDate!.toString().toServiceRequestDetailsFormat : '-'}', '${context.translation.closedDate}: ${workOrder.closedDate != null ? workOrder.closedDate!.toString().toServiceRequestDetailsFormat : '-'}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral120), 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), const Divider().defaultStyle(context),
//... call response details starts here.... //... call response details starts here....

@ -115,7 +115,6 @@ class _InternalMaintenanceRequestState extends State<InternalMaintenanceRequest>
timer: requestDetailProvider.activityMaintenanceHelperModel?.activityMaintenanceTimerModel, timer: requestDetailProvider.activityMaintenanceHelperModel?.activityMaintenanceTimerModel,
enabled: enableTimer, enabled: enableTimer,
pickerTimer: requestDetailProvider.activityMaintenanceHelperModel?.activityTimePicker, pickerTimer: requestDetailProvider.activityMaintenanceHelperModel?.activityTimePicker,
canPickTime: true,
onPick: (time) { onPick: (time) {
requestDetailProvider.activityMaintenanceHelperModel?.activityTimePicker = time; requestDetailProvider.activityMaintenanceHelperModel?.activityTimePicker = time;
}, },

@ -354,9 +354,7 @@ class _WoInfoFormState extends State<WoInfoForm> {
decoration: BoxDecoration(color: AppColor.neutral100, borderRadius: BorderRadius.circular(10)), decoration: BoxDecoration(color: AppColor.neutral100, borderRadius: BorderRadius.circular(10)),
width: double.infinity, width: double.infinity,
timer: widget.planPreventiveVisit.tbsTimer, timer: widget.planPreventiveVisit.tbsTimer,
// enabled: widget.planPreventiveVisit.tbsTimer?.endAt == null,
pickerTimer: widget.planPreventiveVisit.ppMTimePicker, pickerTimer: widget.planPreventiveVisit.ppMTimePicker,
canPickTime: true,
onPick: (time) { onPick: (time) {
widget.planPreventiveVisit.ppMTimePicker = time; widget.planPreventiveVisit.ppMTimePicker = time;
}, },

@ -83,7 +83,6 @@ class RecurrentTaskInfoWidget extends StatelessWidget {
borderRadius: BorderRadius.circular(10), borderRadius: BorderRadius.circular(10),
), ),
pickerTimer: model?.recurrentWoTimePicker, pickerTimer: model?.recurrentWoTimePicker,
canPickTime: true,
onPick: (time) { onPick: (time) {
model?.recurrentWoTimePicker = time; model?.recurrentWoTimePicker = time;
}, },

@ -495,7 +495,6 @@ class _UpdateTaskRequestState extends State<UpdateTaskRequest> {
borderRadius: BorderRadius.circular(10), borderRadius: BorderRadius.circular(10),
), ),
pickerTimer: taskProvider.taskRequestModel?.taskTimePicker, pickerTimer: taskProvider.taskRequestModel?.taskTimePicker,
canPickTime: true,
onPick: (time) { onPick: (time) {
taskProvider.taskRequestModel?.taskTimePicker = time; taskProvider.taskRequestModel?.taskTimePicker = time;
}, },

@ -290,7 +290,6 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
borderRadius: BorderRadius.circular(10), borderRadius: BorderRadius.circular(10),
), ),
pickerTimer: _formModel.deviceTimePicker, pickerTimer: _formModel.deviceTimePicker,
canPickTime: true,
onPick: (time) { onPick: (time) {
_formModel.deviceTimePicker = time; _formModel.deviceTimePicker = time;
}, },

@ -235,7 +235,6 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
timer: _formModel.timer, timer: _formModel.timer,
enabled: _formModel.endDate == null, enabled: _formModel.endDate == null,
pickerTimer: _formModel.gasRefillTimePicker, pickerTimer: _formModel.gasRefillTimePicker,
canPickTime: true,
onPick: (time) { onPick: (time) {
_formModel.gasRefillTimePicker = time; _formModel.gasRefillTimePicker = time;
}, },

@ -287,7 +287,6 @@ class _UpdateGasRefillRequestState extends State<UpdateGasRefillRequest> {
label: context.translation.workingHours, label: context.translation.workingHours,
timer: _formModel.timer, timer: _formModel.timer,
pickerTimer: _formModel.gasRefillTimePicker, pickerTimer: _formModel.gasRefillTimePicker,
canPickTime: true,
onPick: (time) { onPick: (time) {
_formModel.gasRefillTimePicker = time; _formModel.gasRefillTimePicker = time;
}, },

@ -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/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/user.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 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
import '../../../new_views/app_style/app_color.dart'; import '../../../new_views/app_style/app_color.dart';
@ -42,7 +43,7 @@ class _ProfilePageState extends State<ProfilePage> {
_height = MediaQuery.of(context).size.height; _height = MediaQuery.of(context).size.height;
if (_firstTime) { if (_firstTime) {
_user = User.fromJson(_userProvider.user!.toJson()); _user = User.fromJsonCons(_userProvider.user!.toJson());
_firstTime = false; _firstTime = false;
} }
Color color = context.isDark ? AppColor.neutral10 : AppColor.neutral50; Color color = context.isDark ? AppColor.neutral10 : AppColor.neutral50;
@ -50,111 +51,134 @@ class _ProfilePageState extends State<ProfilePage> {
key: _scaffoldKey, key: _scaffoldKey,
appBar: DefaultAppBar(title: context.translation.myProfile), appBar: DefaultAppBar(title: context.translation.myProfile),
body: SafeArea( body: SafeArea(
child: Column( child: ListView(
mainAxisSize: MainAxisSize.min, padding: const EdgeInsets.all(16),
crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
SizedBox( Column(
width: double.infinity, mainAxisSize: MainAxisSize.min,
child: Column( crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Consumer<UserProvider>(builder: (context, snapshot, _) { SizedBox(
return Stack( width: double.infinity,
alignment: Alignment.bottomRight, child: Column(
children: [ mainAxisSize: MainAxisSize.min,
CircleAvatar( children: [
radius: 45, Consumer<UserProvider>(builder: (context, snapshot, _) {
backgroundColor: const Color(0xFFE4E5E6), return Stack(
child: Padding( alignment: Alignment.bottomRight,
padding: const EdgeInsets.all(1), // Border radius children: [
child: ClipOval( CircleAvatar(
child: snapshot.profileImage != null radius: 45,
? Image.file(snapshot.profileImage!) backgroundColor: const Color(0xFFE4E5E6),
: (snapshot.user!.profilePhotoName?.isNotEmpty ?? false) child: Padding(
? Image.network(snapshot.user!.profilePhotoName!) padding: const EdgeInsets.all(1), // Border radius
: const Icon( child: ClipOval(
Icons.person, child: snapshot.profileImage != null
size: 50, ? Image.file(snapshot.profileImage!)
color: Colors.white, : (snapshot.user!.profilePhotoName?.isNotEmpty ?? false)
), ? Image.network(snapshot.user!.profilePhotoName!)
: const Icon(
Icons.person,
size: 50,
color: Colors.white,
),
),
),
), ),
), CircleAvatar(
), radius: 14,
CircleAvatar( backgroundColor: AppColor.primary70,
radius: 14, child: Padding(
backgroundColor: AppColor.primary70, padding: const EdgeInsets.all(1), // Border radius
child: Padding( child: snapshot.isLoading
padding: const EdgeInsets.all(1), // Border radius ? const SizedBox(height: 16, width: 16, child: CircularProgressIndicator(color: Colors.white, strokeWidth: 2))
child: snapshot.isLoading : const Icon(Icons.upload, size: 16, color: Colors.white),
? 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
).onPress(snapshot.isLoading : () async {
? null final pickedFile = await ImagePicker().pickImage(source: ImageSource.gallery, imageQuality: 70, maxWidth: 800, maxHeight: 800);
: () async {
final pickedFile = await ImagePicker().pickImage(source: ImageSource.gallery, imageQuality: 70, maxWidth: 800, maxHeight: 800);
if (pickedFile != null) { if (pickedFile != null) {
CroppedFile? croppedFile = await ImageCropper().cropImage( CroppedFile? croppedFile = await ImageCropper().cropImage(
sourcePath: pickedFile.path, sourcePath: pickedFile.path,
aspectRatio: CropAspectRatio(ratioX: 1, ratioY: 1), aspectRatio: CropAspectRatio(ratioX: 1, ratioY: 1),
uiSettings: [ uiSettings: [
AndroidUiSettings( AndroidUiSettings(
toolbarTitle: 'ATOMS', toolbarTitle: 'ATOMS',
toolbarColor: Colors.white, toolbarColor: Colors.white,
toolbarWidgetColor: color, toolbarWidgetColor: color,
initAspectRatio: CropAspectRatioPreset.square, initAspectRatio: CropAspectRatioPreset.square,
lockAspectRatio: false, lockAspectRatio: false,
), ),
IOSUiSettings(title: 'ATOMS'), IOSUiSettings(title: 'ATOMS'),
], ],
); );
if (croppedFile != null) {
await snapshot.uploadProfileImage(_user.userID!, File(croppedFile.path));
Provider.of<SettingProvider>(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) { // if ((_user.phoneNumber ?? "").isNotEmpty) ...[
await snapshot.uploadProfileImage(_user.userID!, File(croppedFile.path)); // const Divider().defaultStyle(context),
Provider.of<SettingProvider>(context, listen: false).setUser(_userProvider.user!); // 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, 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),
], ],
), ],
), ).toShadowContainer(context),
24.height, 16.height,
if ((_user.phoneNumber ?? "").isNotEmpty) ...[ AppFilledButton(
const Divider().defaultStyle(context), label: "Update Information",
8.height, buttonColor: AppColor.neutral50,
_user.phoneNumber!.heading5(context), onPressed: () {},
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).paddingAll(16), ),
// child: Stack( // child: Stack(
// children: [ // children: [
// Form( // Form(

@ -1,241 +1,241 @@
import 'package:flutter/material.dart'; // import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; // import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/user_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/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/extensions/context_extension.dart'; // import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; // import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart'; // import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; // import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; // import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/device/asset.dart'; // import 'package:test_sa/models/device/asset.dart';
import 'package:test_sa/models/service_request/service_request.dart'; // import 'package:test_sa/models/service_request/service_request.dart';
//
import '../../../../controllers/providers/api/service_requests_provider.dart'; // import '../../../../controllers/providers/api/service_requests_provider.dart';
import '../../../../models/lookup.dart'; // import '../../../../models/lookup.dart';
import '../../../../new_views/app_style/app_color.dart'; // import '../../../../new_views/app_style/app_color.dart';
import '../../../../new_views/common_widgets/app_filled_button.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/app_text_form_field.dart';
import '../../../../new_views/common_widgets/single_item_drop_down_menu.dart'; // import '../../../../new_views/common_widgets/single_item_drop_down_menu.dart';
import '../../../../providers/service_request_providers/first_action_provider.dart'; // import '../../../../providers/service_request_providers/first_action_provider.dart';
import '../../../widgets/date_and_time/date_picker.dart'; // import '../../../widgets/date_and_time/date_picker.dart';
//
class FirstActionBottomSheet extends StatefulWidget { // class FirstActionBottomSheet extends StatefulWidget {
final ServiceRequest request; // final ServiceRequest request;
// todo @delete
const FirstActionBottomSheet({Key? key, required this.request}) : super(key: key); // const FirstActionBottomSheet({Key? key, required this.request}) : super(key: key);
//
@override // @override
State<FirstActionBottomSheet> createState() => _FirstActionBottomSheetState(); // State<FirstActionBottomSheet> createState() => _FirstActionBottomSheetState();
} // }
//
class _FirstActionBottomSheetState extends State<FirstActionBottomSheet> { // class _FirstActionBottomSheetState extends State<FirstActionBottomSheet> {
late ServiceRequest _serviceRequest; // late ServiceRequest _serviceRequest;
Asset? asset; // Asset? asset;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); // final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
//
Lookup? firstAction; // Lookup? firstAction;
//
@override // @override
void initState() { // void initState() {
super.initState(); // super.initState();
_serviceRequest = widget.request; // _serviceRequest = widget.request;
firstAction = _serviceRequest.firstAction; // firstAction = _serviceRequest.firstAction;
} // }
//
@override // @override
Widget build(BuildContext context) { // Widget build(BuildContext context) {
final userProvider = Provider.of<UserProvider>(context, listen: false); // final userProvider = Provider.of<UserProvider>(context, listen: false);
return Wrap( // return Wrap(
children: [ // children: [
Container( // Container(
clipBehavior: Clip.antiAlias, // clipBehavior: Clip.antiAlias,
margin: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom), // margin: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom),
decoration: BoxDecoration( // decoration: BoxDecoration(
color: Theme.of(context).scaffoldBackgroundColor, // color: Theme.of(context).scaffoldBackgroundColor,
borderRadius: const BorderRadius.only(topRight: Radius.circular(20), topLeft: Radius.circular(20)), // borderRadius: const BorderRadius.only(topRight: Radius.circular(20), topLeft: Radius.circular(20)),
), // ),
padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight), // padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight),
child: Form( // child: Form(
key: _formKey, // key: _formKey,
child: SingleChildScrollView( // child: SingleChildScrollView(
child: Column( // child: Column(
children: [ // children: [
Container( // Container(
width: 40.toScreenWidth, // width: 40.toScreenWidth,
height: 5.toScreenHeight, // height: 5.toScreenHeight,
decoration: BoxDecoration(color: AppColor.neutral40, borderRadius: BorderRadius.circular(30)), // decoration: BoxDecoration(color: AppColor.neutral40, borderRadius: BorderRadius.circular(30)),
), // ),
Align( // Align(
alignment: AlignmentDirectional.centerStart, // alignment: AlignmentDirectional.centerStart,
child: context.translation.firstAction.heading3(context).custom(fontWeight: FontWeight.w600).paddingOnly(top: 16, bottom: 16), // child: context.translation.firstAction.heading3(context).custom(fontWeight: FontWeight.w600).paddingOnly(top: 16, bottom: 16),
), // ),
SingleItemDropDownMenu<Lookup, FirstActionStatusProvider>( // SingleItemDropDownMenu<Lookup, FirstActionStatusProvider>(
context: context, // context: context,
title: context.translation.firstActionStatus, // title: context.translation.firstActionStatus,
initialValue: firstAction, //_serviceRequest.firstAction, // initialValue: firstAction, //_serviceRequest.firstAction,
onSelect: (value) { // onSelect: (value) {
setState(() { // setState(() {
//_serviceRequest.firstAction = value; // //_serviceRequest.firstAction = value;
firstAction = value; // firstAction = value;
if (firstAction?.value != 2) { // if (firstAction?.value != 2) {
_serviceRequest.visitDate = null; // _serviceRequest.visitDate = null;
} // }
}); // });
}, // },
), // ),
if (firstAction?.value == 2) ...[ // if (firstAction?.value == 2) ...[
8.height, // 8.height,
ADatePicker( // ADatePicker(
label: context.translation.visitDate, // label: context.translation.visitDate,
date: DateTime.tryParse(_serviceRequest.visitDate ?? ""), // date: DateTime.tryParse(_serviceRequest.visitDate ?? ""),
formatDateWithTime: true, // formatDateWithTime: true,
onDatePicker: (selectedDate) { // onDatePicker: (selectedDate) {
showTimePicker( // showTimePicker(
context: context, // context: context,
initialTime: TimeOfDay.now(), // initialTime: TimeOfDay.now(),
).then((selectedTime) { // ).then((selectedTime) {
// Handle the selected date and time here. // // Handle the selected date and time here.
if (selectedTime != null) { // if (selectedTime != null) {
DateTime selectedDateTime = DateTime( // DateTime selectedDateTime = DateTime(
selectedDate.year, // selectedDate.year,
selectedDate.month, // selectedDate.month,
selectedDate.day, // selectedDate.day,
selectedTime.hour, // selectedTime.hour,
selectedTime.minute, // selectedTime.minute,
); // );
if (selectedDateTime.isBefore(DateTime.parse(_serviceRequest.date!))) { // if (selectedDateTime.isBefore(DateTime.parse(_serviceRequest.date!))) {
"Visit Date time must be greater then request date".showToast; // "Visit Date time must be greater then request date".showToast;
return; // return;
} // }
//
setState(() { // setState(() {
_serviceRequest.visitDate = selectedDateTime.toIso8601String(); // _serviceRequest.visitDate = selectedDateTime.toIso8601String();
}); // });
} // }
}); // });
}, // },
), // ),
], // ],
//
if (firstAction?.id == 404 && Provider.of<SettingProvider>(context, listen: false).assetGroup!.id == 1) ...[ // if (firstAction?.id == 404 && Provider.of<SettingProvider>(context, listen: false).assetGroup!.id == 1) ...[
8.height, // 8.height,
Row( // Row(
children: [ // children: [
ADatePicker( // ADatePicker(
label: context.translation.startDate, // label: context.translation.startDate,
date: DateTime.tryParse(_serviceRequest.startDate ?? ""), // date: DateTime.tryParse(_serviceRequest.startDate ?? ""),
formatDateWithTime: true, // formatDateWithTime: true,
onDatePicker: (selectedDate) { // onDatePicker: (selectedDate) {
showTimePicker( // showTimePicker(
context: context, // context: context,
initialTime: TimeOfDay.now(), // initialTime: TimeOfDay.now(),
).then((selectedTime) { // ).then((selectedTime) {
// Handle the selected date and time here. // // Handle the selected date and time here.
if (selectedTime != null) { // if (selectedTime != null) {
DateTime selectedDateTime = DateTime( // DateTime selectedDateTime = DateTime(
selectedDate.year, // selectedDate.year,
selectedDate.month, // selectedDate.month,
selectedDate.day, // selectedDate.day,
selectedTime.hour, // selectedTime.hour,
selectedTime.minute, // selectedTime.minute,
); // );
setState(() { // setState(() {
_serviceRequest.startDate = selectedDateTime.toIso8601String(); // _serviceRequest.startDate = selectedDateTime.toIso8601String();
}); // });
} // }
}); // });
}, // },
).expanded, // ).expanded,
8.width, // 8.width,
ADatePicker( // ADatePicker(
label: context.translation.endDate, // label: context.translation.endDate,
date: DateTime.tryParse(_serviceRequest.endDate ?? ""), // date: DateTime.tryParse(_serviceRequest.endDate ?? ""),
formatDateWithTime: true, // formatDateWithTime: true,
onDatePicker: (selectedDate) { // onDatePicker: (selectedDate) {
showTimePicker( // showTimePicker(
context: context, // context: context,
initialTime: TimeOfDay.now(), // initialTime: TimeOfDay.now(),
).then((selectedTime) { // ).then((selectedTime) {
// Handle the selected date and time here. // // Handle the selected date and time here.
if (selectedTime != null) { // if (selectedTime != null) {
DateTime selectedDateTime = DateTime( // DateTime selectedDateTime = DateTime(
selectedDate.year, // selectedDate.year,
selectedDate.month, // selectedDate.month,
selectedDate.day, // selectedDate.day,
selectedTime.hour, // selectedTime.hour,
selectedTime.minute, // selectedTime.minute,
); // );
setState(() { // setState(() {
_serviceRequest.endDate = selectedDateTime.toIso8601String(); // _serviceRequest.endDate = selectedDateTime.toIso8601String();
_serviceRequest.workingHours = // _serviceRequest.workingHours =
(((DateTime.parse(_serviceRequest.endDate!).difference(DateTime.parse(_serviceRequest.startDate!)).inSeconds ?? 0) / 60) / 60).toStringAsFixed(2); // (((DateTime.parse(_serviceRequest.endDate!).difference(DateTime.parse(_serviceRequest.startDate!)).inSeconds ?? 0) / 60) / 60).toStringAsFixed(2);
}); // });
} // }
}); // });
}, // },
).expanded, // ).expanded,
], // ],
) // )
], // ],
//
/// Loan availability not required // /// Loan availability not required
// 8.height, // // 8.height,
// SingleItemDropDownMenu<Lookup, LoanAvailabilityProvider>( // // SingleItemDropDownMenu<Lookup, LoanAvailabilityProvider>(
// context: context, // // context: context,
// title: context.translation.loanAvailability, // // title: context.translation.loanAvailability,
// initialValue: _serviceRequest.loanAvailability, // // initialValue: _serviceRequest.loanAvailability,
// onSelect: (status) { // // onSelect: (status) {
// setState(() { // // setState(() {
// _serviceRequest.loanAvailability = status; // // _serviceRequest.loanAvailability = status;
// if (_serviceRequest.loanAvailability.value != 1) { // // if (_serviceRequest.loanAvailability.value != 1) {
// asset = null; // // asset = null;
// } // // }
// }); // // });
// }, // // },
// ), // // ),
// if (_serviceRequest?.loanAvailability?.value == 1) 8.height, // // if (_serviceRequest?.loanAvailability?.value == 1) 8.height,
// if (_serviceRequest?.loanAvailability?.value == 1) // // if (_serviceRequest?.loanAvailability?.value == 1)
// PickAsset( // // PickAsset(
// device: asset ?? _serviceRequest.device, // // device: asset ?? _serviceRequest.device,
// onPickAsset: (asset) { // // onPickAsset: (asset) {
// setState(() { // // setState(() {
// this.asset = asset; // // this.asset = asset;
// }); // // });
// }, // // },
// ), // // ),
8.height, // 8.height,
AppTextFormField( // AppTextFormField(
labelText: context.translation.comments, // labelText: context.translation.comments,
textInputType: TextInputType.multiline, // textInputType: TextInputType.multiline,
alignLabelWithHint: true, // alignLabelWithHint: true,
onChange: (text) { // onChange: (text) {
_serviceRequest.comments = text; // _serviceRequest.comments = text;
}, // },
onSaved: (text) { // onSaved: (text) {
_serviceRequest.comments = text; // _serviceRequest.comments = text;
}, // },
), // ),
16.height, // 16.height,
Consumer<ServiceRequestsProvider>( // Consumer<ServiceRequestsProvider>(
builder: (context, snapshot, _) => AppFilledButton( // builder: (context, snapshot, _) => AppFilledButton(
label: context.translation.save, // label: context.translation.save,
loading: snapshot.isLoading ?? false, // loading: snapshot.isLoading ?? false,
onPressed: () async { // onPressed: () async {
_formKey.currentState!.save(); // _formKey.currentState!.save();
_serviceRequest.device = asset; // _serviceRequest.device = asset;
_serviceRequest.firstAction = firstAction; // _serviceRequest.firstAction = firstAction;
await snapshot.updateRequest(user: userProvider.user!, request: _serviceRequest); // await snapshot.updateRequest(user: userProvider.user!, request: _serviceRequest);
Navigator.pop(context, true); // Navigator.pop(context, true);
}, // },
), // ),
), // ),
16.height, // 16.height,
], // ],
), // ),
), // ),
), // ),
) // )
], // ],
); // );
} // }
} // }

@ -1,398 +1,398 @@
import 'dart:convert'; // import 'dart:convert';
import 'dart:io'; // import 'dart:io';
//
import 'package:flutter/material.dart'; // import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; // import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/service_requests_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/status_drop_down/report/service_types_provider.dart';
import 'package:test_sa/controllers/providers/api/user_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/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/extensions/context_extension.dart'; // import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; // import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; // import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; // import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/device/asset.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_report.dart';
import 'package:test_sa/models/service_request/service_request.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/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/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/equipment/pick_asset.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.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 'package:test_sa/views/widgets/status/report/service_report_last_call.dart';
//
import '../../../../../attachment.dart'; // import '../../../../../attachment.dart';
import '../../../../../models/lookup.dart'; // import '../../../../../models/lookup.dart';
import '../../../../../models/service_request/spare_parts.dart'; // import '../../../../../models/service_request/spare_parts.dart';
import '../../../../../models/service_request/wo_call_request.dart'; // import '../../../../../models/service_request/wo_call_request.dart';
import '../../../../../new_views/common_widgets/app_filled_button.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/app_text_form_field.dart';
import '../../../../../new_views/common_widgets/default_app_bar.dart'; // import '../../../../../new_views/common_widgets/default_app_bar.dart';
import '../../../../../new_views/common_widgets/single_item_drop_down_menu.dart'; // import '../../../../../new_views/common_widgets/single_item_drop_down_menu.dart';
import '../../../../../providers/service_request_providers/equipment_status_provider.dart'; // import '../../../../../providers/service_request_providers/equipment_status_provider.dart';
import '../../../../../providers/work_order/reason_provider.dart'; // import '../../../../../providers/work_order/reason_provider.dart';
import '../../../../../providers/work_order/service_type_provider.dart'; // import '../../../../../providers/work_order/service_type_provider.dart';
import '../../../../widgets/date_and_time/date_picker.dart'; // import '../../../../widgets/date_and_time/date_picker.dart';
import '../../../../widgets/e_signature/e_signature.dart'; // import '../../../../widgets/e_signature/e_signature.dart';
import '../../../../widgets/images/multi_image_picker.dart'; // import '../../../../widgets/images/multi_image_picker.dart';
import '../../../../widgets/status/report/service_report_assistant_employee_menu.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_fault_description.dart';
import '../../../../widgets/status/report/service_report_repair_location.dart'; // import '../../../../widgets/status/report/service_report_repair_location.dart';
import '../../../../widgets/timer/app_timer.dart'; // import '../../../../widgets/timer/app_timer.dart';
//
class EditServiceReport extends StatefulWidget { // class EditServiceReport extends StatefulWidget {
static const String id = "/edit-service-report"; // static const String id = "/edit-service-report";
final ServiceRequest request; // final ServiceRequest request;
final ServiceReport report; // final ServiceReport report;
//
const EditServiceReport({Key? key, required this.request, required this.report}) : super(key: key); // const EditServiceReport({Key? key, required this.request, required this.report}) : super(key: key);
//
@override // @override
_EditServiceReportState createState() => _EditServiceReportState(); // _EditServiceReportState createState() => _EditServiceReportState();
} // }
// // todo @delete
class _EditServiceReportState extends State<EditServiceReport> with TickerProviderStateMixin { // class _EditServiceReportState extends State<EditServiceReport> with TickerProviderStateMixin {
late UserProvider _userProvider; // late UserProvider _userProvider;
late SettingProvider _settingProvider; // late SettingProvider _settingProvider;
late ServiceRequestsProvider _serviceRequestsProvider; // late ServiceRequestsProvider _serviceRequestsProvider;
List<SparePart> _spareParts = []; // List<SparePart> _spareParts = [];
late ServiceReport _serviceReport; // late ServiceReport _serviceReport;
bool _isLoading = false; // bool _isLoading = false;
List<File> _files = []; // List<File> _files = [];
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); // final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(); // final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
final TextEditingController _faultController = TextEditingController(); // final TextEditingController _faultController = TextEditingController();
final TextEditingController _workPreformedController = TextEditingController(); // final TextEditingController _workPreformedController = TextEditingController();
final TextEditingController _partQtyController = TextEditingController(); // final TextEditingController _partQtyController = TextEditingController();
late ServiceStatusProvider _assetTypeProvider; // late ServiceStatusProvider _assetTypeProvider;
late CallRequest _callRequestForWorkOrder; // late CallRequest _callRequestForWorkOrder;
//
Asset? loanAvailabilityAsset; // Asset? loanAvailabilityAsset;
//
@override // @override
void initState() { // void initState() {
_serviceReport = widget.report; // _serviceReport = widget.report;
_files = widget.report.attachmentsWorkOrder?.map((e) => File(e.name!)).toList() ?? []; // _files = widget.report.attachmentsWorkOrder?.map((e) => File(e.name!)).toList() ?? [];
_spareParts = _serviceReport.sparePartsWorkOrders?.map((e) => e.sparePart!).toList() ?? []; // _spareParts = _serviceReport.sparePartsWorkOrders?.map((e) => e.sparePart!).toList() ?? [];
super.initState(); // super.initState();
if (context.mounted) { // if (context.mounted) {
Provider.of<ReasonProvider>(context, listen: false).reset(); // Provider.of<ReasonProvider>(context, listen: false).reset();
Provider.of<ReasonProvider>(context, listen: false).serviceRequestId = _serviceReport.callRequest!.id.toString(); // Provider.of<ReasonProvider>(context, listen: false).serviceRequestId = _serviceReport.callRequest!.id.toString();
} // }
} // }
//
void getRequestForWorkOrder() async { // void getRequestForWorkOrder() async {
_isLoading = true; // _isLoading = true;
setState(() {}); // setState(() {});
_callRequestForWorkOrder = (await _serviceRequestsProvider.getCallRequestForWorkOrder(callId: widget.request.id!))!; // _callRequestForWorkOrder = (await _serviceRequestsProvider.getCallRequestForWorkOrder(callId: widget.request.id!))!;
_serviceReport.assignedEmployee = _callRequestForWorkOrder.assignedEmployee; // _serviceReport.assignedEmployee = _callRequestForWorkOrder.assignedEmployee;
await _assetTypeProvider.getTypes(); // await _assetTypeProvider.getTypes();
_isLoading = false; // _isLoading = false;
setState(() {}); // setState(() {});
} // }
//
@override // @override
void dispose() { // void dispose() {
_faultController.dispose(); // _faultController.dispose();
_workPreformedController.dispose(); // _workPreformedController.dispose();
_partQtyController.dispose(); // _partQtyController.dispose();
super.dispose(); // super.dispose();
} // }
//
@override // @override
Widget build(BuildContext context) { // Widget build(BuildContext context) {
_userProvider = Provider.of<UserProvider>(context); // _userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context); // _settingProvider = Provider.of<SettingProvider>(context);
_serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context); // _serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context);
_assetTypeProvider = Provider.of<ServiceStatusProvider>(context); // _assetTypeProvider = Provider.of<ServiceStatusProvider>(context);
_serviceReport.assetType = _assetTypeProvider.statuses?.firstWhere((element) => element.value == _callRequestForWorkOrder.assetType, orElse: null); // _serviceReport.assetType = _assetTypeProvider.statuses?.firstWhere((element) => element.value == _callRequestForWorkOrder.assetType, orElse: null);
return Scaffold( // return Scaffold(
key: _scaffoldKey, // key: _scaffoldKey,
appBar: DefaultAppBar(title: context.translation.updateWorkOrder), // appBar: DefaultAppBar(title: context.translation.updateWorkOrder),
body: SafeArea( // body: SafeArea(
child: LoadingManager( // child: LoadingManager(
isLoading: _isLoading, // isLoading: _isLoading,
isFailedLoading: false, // isFailedLoading: false,
stateCode: 200, // stateCode: 200,
onRefresh: () async {}, // onRefresh: () async {},
child: Form( // child: Form(
key: _formKey, // key: _formKey,
child: Column( // child: Column(
children: [ // children: [
SingleChildScrollView( // SingleChildScrollView(
child: Column( // child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch, // crossAxisAlignment: CrossAxisAlignment.stretch,
children: [ // children: [
Card( // Card(
child: Column( // child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch, // crossAxisAlignment: CrossAxisAlignment.stretch,
children: [ // children: [
widget.request.hospitalName!.heading5(context), // widget.request.hospitalName!.heading5(context),
8.height, // 8.height,
"${context.translation.assetNo}: ${widget.request.deviceNumber}".bodyText(context), // "${context.translation.assetNo}: ${widget.request.deviceNumber}".bodyText(context),
"${context.translation.callId}: ${widget.request.requestCode}".bodyText(context), // "${context.translation.callId}: ${widget.request.requestCode}".bodyText(context),
], // ],
).paddingAll(16), // ).paddingAll(16),
), // ),
8.height, // 8.height,
ADatePicker( // ADatePicker(
label: context.translation.returnToService, // label: context.translation.returnToService,
date: DateTime.tryParse(_serviceReport.visitDate ?? ""), // date: DateTime.tryParse(_serviceReport.visitDate ?? ""),
formatDateWithTime: true, // formatDateWithTime: true,
onDatePicker: (selectedDate) { // onDatePicker: (selectedDate) {
showTimePicker( // showTimePicker(
context: context, // context: context,
initialTime: TimeOfDay.now(), // initialTime: TimeOfDay.now(),
).then((selectedTime) { // ).then((selectedTime) {
if (selectedTime != null) { // if (selectedTime != null) {
DateTime selectedDateTime = DateTime( // DateTime selectedDateTime = DateTime(
selectedDate.year, // selectedDate.year,
selectedDate.month, // selectedDate.month,
selectedDate.day, // selectedDate.day,
selectedTime.hour, // selectedTime.hour,
selectedTime.minute, // selectedTime.minute,
); // );
setState(() { // setState(() {
_serviceReport.visitDate = selectedDateTime.toIso8601String(); // _serviceReport.visitDate = selectedDateTime.toIso8601String();
}); // });
} // }
}); // });
}, // },
), // ),
8.height, // 8.height,
AppTimer( // AppTimer(
label: context.translation.workingHours, // label: context.translation.workingHours,
timer: _serviceReport.timer, // timer: _serviceReport.timer,
enabled: _serviceReport.endofWorkTime == null, // enabled: _serviceReport.endofWorkTime == null,
onChange: (timer) async { // onChange: (timer) async {
_serviceReport.timer = timer; // _serviceReport.timer = timer;
return true; // return true;
}, // },
onPick: (value) {}, // onPick: (value) {},
), // ),
8.height, // 8.height,
LoadingManager( // LoadingManager(
isLoading: _assetTypeProvider.isLoading, // isLoading: _assetTypeProvider.isLoading,
isFailedLoading: _assetTypeProvider.statuses == null, // isFailedLoading: _assetTypeProvider.statuses == null,
stateCode: _assetTypeProvider.stateCode, // stateCode: _assetTypeProvider.stateCode,
onRefresh: () async { // onRefresh: () async {
_assetTypeProvider.reset(); // _assetTypeProvider.reset();
await _assetTypeProvider.getTypes(); // await _assetTypeProvider.getTypes();
_serviceReport.assetType = _assetTypeProvider.statuses?.firstWhere( // _serviceReport.assetType = _assetTypeProvider.statuses?.firstWhere(
(element) => element.value == _serviceReport.callRequest?.assetType, // (element) => element.value == _serviceReport.callRequest?.assetType,
orElse: null, // orElse: null,
); // );
}, // },
child: AppTextFormField( // child: AppTextFormField(
labelText: context.translation.assetType, // labelText: context.translation.assetType,
initialValue: _serviceReport.assetType?.name, // initialValue: _serviceReport.assetType?.name,
textAlign: TextAlign.center, // textAlign: TextAlign.center,
enable: false, // enable: false,
style: Theme.of(context).textTheme.titleMedium, // style: Theme.of(context).textTheme.titleMedium,
), // ),
), // ),
8.height, // 8.height,
SingleItemDropDownMenu<Lookup, EquipmentStatusProvider>( // SingleItemDropDownMenu<Lookup, EquipmentStatusProvider>(
context: context, // context: context,
title: context.translation.equipmentStatus, // title: context.translation.equipmentStatus,
initialValue: _serviceReport.equipmentStatus, // initialValue: _serviceReport.equipmentStatus,
onSelect: (value) { // onSelect: (value) {
_serviceReport.equipmentStatus = value; // _serviceReport.equipmentStatus = value;
}, // },
), // ),
8.height, // 8.height,
SingleItemDropDownMenu<Lookup, ReasonProvider>( // SingleItemDropDownMenu<Lookup, ReasonProvider>(
context: context, // context: context,
title: context.translation.reason, // title: context.translation.reason,
initialValue: _serviceReport.reason, // initialValue: _serviceReport.reason,
onSelect: (value) { // onSelect: (value) {
if (value != null) { // if (value != null) {
_serviceReport.reason = value; // _serviceReport.reason = value;
} // }
}, // },
), // ),
8.height, // 8.height,
SingleItemDropDownMenu<Lookup, ServiceTypeProvider>( // SingleItemDropDownMenu<Lookup, ServiceTypeProvider>(
context: context, // context: context,
title: context.translation.serviceType, // title: context.translation.serviceType,
initialValue: _serviceReport.serviceType, // initialValue: _serviceReport.serviceType,
onSelect: (value) { // onSelect: (value) {
_serviceReport.serviceType = value; // _serviceReport.serviceType = value;
}, // },
), // ),
8.height, // 8.height,
ServiceReportLastCallsMenu( // ServiceReportLastCallsMenu(
report: _serviceReport, // report: _serviceReport,
title: context.translation.callLastSituation, // title: context.translation.callLastSituation,
parentId: widget.request.id, // parentId: widget.request.id,
onSelect: (status) { // onSelect: (status) {
_serviceReport.calllastSituation = status; // _serviceReport.calllastSituation = status;
}, // },
), // ),
8.height, // 8.height,
ServiceReportFaultDescription( // ServiceReportFaultDescription(
requestId: widget.request.id, // requestId: widget.request.id,
initialValue: _serviceReport.faultDescription, // initialValue: _serviceReport.faultDescription,
onSelect: (status) { // onSelect: (status) {
_serviceReport.faultDescription = status; // _serviceReport.faultDescription = status;
_workPreformedController.text = _serviceReport.faultDescription?.workPerformed ?? ""; // _workPreformedController.text = _serviceReport.faultDescription?.workPerformed ?? "";
}, // },
), // ),
8.height, // 8.height,
AppTextFormField( // AppTextFormField(
labelText: context.translation.solution, // labelText: context.translation.solution,
initialValue: _serviceReport.faultDescription?.workPerformed, // initialValue: _serviceReport.faultDescription?.workPerformed,
textAlign: TextAlign.center, // textAlign: TextAlign.center,
enable: false, // enable: false,
controller: _workPreformedController, // controller: _workPreformedController,
), // ),
8.height, // 8.height,
SingleItemDropDownMenu<Lookup, LoanAvailabilityProvider>( // SingleItemDropDownMenu<Lookup, LoanAvailabilityProvider>(
context: context, // context: context,
title: context.translation.loanAvailability, // title: context.translation.loanAvailability,
initialValue: _serviceReport.loanAvailablity, // initialValue: _serviceReport.loanAvailablity,
onSelect: (status) { // onSelect: (status) {
if (status != null) { // if (status != null) {
setState(() { // setState(() {
_serviceReport.loanAvailablity = status; // _serviceReport.loanAvailablity = status;
if (_serviceReport.loanAvailablity?.value != 1) { // if (_serviceReport.loanAvailablity?.value != 1) {
loanAvailabilityAsset = null; // loanAvailabilityAsset = null;
_serviceReport.assetLoan = null; // _serviceReport.assetLoan = null;
} // }
}); // });
} // }
}, // },
), // ),
if (_serviceReport.loanAvailablity?.value == 1) 8.height, // if (_serviceReport.loanAvailablity?.value == 1) 8.height,
if (_serviceReport.loanAvailablity?.value == 1) // if (_serviceReport.loanAvailablity?.value == 1)
PickAsset( // PickAsset(
device: loanAvailabilityAsset, // ?? _serviceReport.device, // device: loanAvailabilityAsset, // ?? _serviceReport.device,
onPickAsset: (asset) { // onPickAsset: (asset) {
_serviceReport.assetLoan = AssetInfo.fromJson(asset.toJson()); // _serviceReport.assetLoan = AssetInfo.fromJson(asset.toJson());
setState(() { // setState(() {
loanAvailabilityAsset = asset; // loanAvailabilityAsset = asset;
}); // });
}, // },
), // ),
if (_serviceReport.assetLoan != null && loanAvailabilityAsset == null) // if (_serviceReport.assetLoan != null && loanAvailabilityAsset == null)
Card(child: "${context.translation.assetNumber}: ${_serviceReport.assetLoan?.assetNumber}".bodyText(context).paddingAll(16)), // Card(child: "${context.translation.assetNumber}: ${_serviceReport.assetLoan?.assetNumber}".bodyText(context).paddingAll(16)),
8.height, // 8.height,
ServiceReportAssistantEmployeeMenu( // ServiceReportAssistantEmployeeMenu(
title: context.translation.assignAssistant, // title: context.translation.assignAssistant,
assetId: _serviceReport.callRequest!.asset!.id!, // assetId: _serviceReport.callRequest!.asset!.id!,
initialValue: (_serviceReport.assistantEmployees?.isNotEmpty ?? false) ? _serviceReport.assistantEmployees?.first : null, // initialValue: (_serviceReport.assistantEmployees?.isNotEmpty ?? false) ? _serviceReport.assistantEmployees?.first : null,
onSelect: (employee) { // onSelect: (employee) {
if (employee == null) { // if (employee == null) {
_serviceReport.assistantEmployees = []; // _serviceReport.assistantEmployees = [];
} else { // } else {
_serviceReport.assistantEmployees = [employee.copyWith(id: 0)]; // _serviceReport.assistantEmployees = [employee.copyWith(id: 0)];
} // }
}, // },
), // ),
8.height, // 8.height,
AppTextFormField( // AppTextFormField(
labelText: context.translation.travelingExpense, // labelText: context.translation.travelingExpense,
initialValue: _serviceReport.travelingExpenses?.toString(), // initialValue: _serviceReport.travelingExpenses?.toString(),
textInputType: TextInputType.number, // textInputType: TextInputType.number,
onSaved: (value) { // onSaved: (value) {
_serviceReport.travelingExpenses = double.tryParse(value) ?? 0.0; // _serviceReport.travelingExpenses = double.tryParse(value) ?? 0.0;
}, // },
), // ),
8.height, // 8.height,
AppTextFormField( // AppTextFormField(
labelText: context.translation.travelingHours, // labelText: context.translation.travelingHours,
initialValue: _serviceReport.travelingHours?.toString(), // initialValue: _serviceReport.travelingHours?.toString(),
textInputType: TextInputType.number, // textInputType: TextInputType.number,
onSaved: (value) { // onSaved: (value) {
_serviceReport.travelingHours = double.tryParse(value) ?? 0.0; // _serviceReport.travelingHours = double.tryParse(value) ?? 0.0;
}, // },
), // ),
8.height, // 8.height,
AppTextFormField( // AppTextFormField(
initialValue: _serviceReport.comment, // initialValue: _serviceReport.comment,
labelText: context.translation.technicalComment, // labelText: context.translation.technicalComment,
alignLabelWithHint: true, // alignLabelWithHint: true,
textInputType: TextInputType.multiline, // textInputType: TextInputType.multiline,
onSaved: (value) { // onSaved: (value) {
_serviceReport.comment = value; // _serviceReport.comment = value;
}, // },
), // ),
8.height, // 8.height,
ServiceReportRepairLocation( // ServiceReportRepairLocation(
label: context.translation.repairLocation, // label: context.translation.repairLocation,
initialValue: _serviceReport.repairLocation, // initialValue: _serviceReport.repairLocation,
onSelect: (status) { // onSelect: (status) {
_serviceReport.repairLocation = status; // _serviceReport.repairLocation = status;
}, // },
), // ),
8.height, // 8.height,
PartNoButton( // PartNoButton(
controller: _partQtyController, // controller: _partQtyController,
spareParts: _spareParts, // spareParts: _spareParts,
initialList: _serviceReport.sparePartsWorkOrders, // initialList: _serviceReport.sparePartsWorkOrders,
onChange: (parts) { // onChange: (parts) {
_serviceReport.sparePartsWorkOrders = parts; // _serviceReport.sparePartsWorkOrders = parts;
}, // },
), // ),
8.height, // 8.height,
MultiFilesPicker(label: context.translation.attachImage, files: _files), // MultiFilesPicker(label: context.translation.attachImage, files: _files),
8.height, // 8.height,
ESignature( // ESignature(
title: context.translation.engSign, // title: context.translation.engSign,
oldSignature: _serviceReport.engSignature, // oldSignature: _serviceReport.engSignature,
newSignature: _serviceReport.localEngSignature, // newSignature: _serviceReport.localEngSignature,
onSaved: (signature) { // onSaved: (signature) {
if (signature == null || signature.isEmpty) { // if (signature == null || signature.isEmpty) {
setState(() {}); // setState(() {});
return; // return;
} // }
_serviceReport.localEngSignature = signature; // _serviceReport.localEngSignature = signature;
_serviceReport.engSignature = signature != null ? "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}" : null; // _serviceReport.engSignature = signature != null ? "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}" : null;
}, // },
), // ),
8.height, // 8.height,
ESignature( // ESignature(
title: context.translation.nurseSignature, // title: context.translation.nurseSignature,
oldSignature: _serviceReport.nurseSignature, // oldSignature: _serviceReport.nurseSignature,
newSignature: _serviceReport.localNurseSignature, // newSignature: _serviceReport.localNurseSignature,
onSaved: (signature) { // onSaved: (signature) {
if (signature == null || signature.isEmpty) { // if (signature == null || signature.isEmpty) {
setState(() {}); // setState(() {});
return; // return;
} // }
_serviceReport.localNurseSignature = signature; // _serviceReport.localNurseSignature = signature;
_serviceReport.nurseSignature = signature != null ? "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}" : null; // _serviceReport.nurseSignature = signature != null ? "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}" : null;
}, // },
), // ),
24.height, // 24.height,
], // ],
), // ),
).expanded, // ).expanded,
AppFilledButton( // AppFilledButton(
label: context.translation.updateRequest, // label: context.translation.updateRequest,
onPressed: () async { // onPressed: () async {
if ((!_formKey.currentState!.validate()) || (!(await _serviceReport.validate(context)))) { // if ((!_formKey.currentState!.validate()) || (!(await _serviceReport.validate(context)))) {
setState(() {}); // setState(() {});
return; // return;
} // }
_formKey.currentState!.save(); // _formKey.currentState!.save();
_serviceReport.attachmentsWorkOrder ??= []; // _serviceReport.attachmentsWorkOrder ??= [];
if (_files.isEmpty) _serviceReport.attachmentsWorkOrder = []; // if (_files.isEmpty) _serviceReport.attachmentsWorkOrder = [];
try { // try {
for (var file in _files) { // for (var file in _files) {
_serviceReport.attachmentsWorkOrder!.add(Attachment(id: 0, name: "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}")); // _serviceReport.attachmentsWorkOrder!.add(Attachment(id: 0, name: "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}"));
} // }
} catch (error) { // } catch (error) {
print(error); // print(error);
} // }
//
await _serviceRequestsProvider.updateServiceReport(context, report: _serviceReport); // await _serviceRequestsProvider.updateServiceReport(context, report: _serviceReport);
}, // },
), // ),
], // ],
).paddingAll(16), // ).paddingAll(16),
), // ),
), // ),
), // ),
); // );
} // }
} // }

@ -1,45 +1,45 @@
import 'package:flutter/material.dart'; // import 'package:flutter/material.dart';
import 'package:test_sa/controllers/providers/api/service_requests_provider.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/search_work_order.dart';
import 'package:test_sa/models/service_request/service_report.dart'; // import 'package:test_sa/models/service_request/service_report.dart';
import 'package:test_sa/models/service_request/service_request.dart'; // import 'package:test_sa/models/service_request/service_request.dart';
import 'package:test_sa/views/widgets/loaders/app_loading.dart'; // import 'package:test_sa/views/widgets/loaders/app_loading.dart';
import 'package:test_sa/views/widgets/loaders/failed_loading.dart'; // import 'package:test_sa/views/widgets/loaders/failed_loading.dart';
//
import 'edit_service_report.dart'; // import 'edit_service_report.dart';
// todo @delete
class UpdateServiceReport extends StatefulWidget { // class UpdateServiceReport extends StatefulWidget {
final ServiceRequest request; // final ServiceRequest request;
final SearchWorkOrder workOrder; // final SearchWorkOrder workOrder;
//
const UpdateServiceReport({Key? key, required this.request, required this.workOrder}) : super(key: key); // const UpdateServiceReport({Key? key, required this.request, required this.workOrder}) : super(key: key);
//
@override // @override
_UpdateServiceReportState createState() => _UpdateServiceReportState(); // _UpdateServiceReportState createState() => _UpdateServiceReportState();
} // }
//
class _UpdateServiceReportState extends State<UpdateServiceReport> { // class _UpdateServiceReportState extends State<UpdateServiceReport> {
@override // @override
Widget build(BuildContext context) { // Widget build(BuildContext context) {
ServiceRequestsProvider().getSingleServiceReport(context, reportId: widget.workOrder.id!.toInt()); // ServiceRequestsProvider().getSingleServiceReport(context, reportId: widget.workOrder.id!.toInt());
return Scaffold( // return Scaffold(
body: FutureBuilder<ServiceReport>( // body: FutureBuilder<ServiceReport>(
future: ServiceRequestsProvider().getSingleServiceReport(context, reportId: widget.workOrder.id!.toInt()), // future: ServiceRequestsProvider().getSingleServiceReport(context, reportId: widget.workOrder.id!.toInt()),
builder: (BuildContext context, AsyncSnapshot<ServiceReport> snapshot) { // builder: (BuildContext context, AsyncSnapshot<ServiceReport> snapshot) {
if (snapshot.hasError) { // if (snapshot.hasError) {
return FailedLoading( // return FailedLoading(
message: snapshot.error.toString(), // message: snapshot.error.toString(),
onReload: () { // onReload: () {
setState(() {}); // setState(() {});
}, // },
); // );
} // }
if (snapshot.connectionState == ConnectionState.done) { // if (snapshot.connectionState == ConnectionState.done) {
return EditServiceReport(report: snapshot.data as ServiceReport, request: widget.request); // return EditServiceReport(report: snapshot.data as ServiceReport, request: widget.request);
} // }
return const Center(child: ALoading()); // return const Center(child: ALoading());
}, // },
), // ),
); // );
} // }
} // }

@ -1,6 +1,7 @@
import 'dart:async'; import 'dart:async';
import 'package:flutter/material.dart'; 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/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/string_extensions.dart';
@ -22,7 +23,6 @@ class AppTimer extends StatefulWidget {
final bool enabled; final bool enabled;
final String? label; final String? label;
final double? width; final double? width;
final bool canPickTime;
final Function(bool)? timerProgress; final Function(bool)? timerProgress;
@ -38,7 +38,6 @@ class AppTimer extends StatefulWidget {
this.onPick, this.onPick,
this.timerProgress, this.timerProgress,
this.enabled = true, this.enabled = true,
this.canPickTime = false,
}) : super(key: key); }) : super(key: key);
@override @override
@ -52,6 +51,7 @@ class _AppTimerState extends State<AppTimer> {
int _delay = 0; int _delay = 0;
bool _running = false; bool _running = false;
bool _loading = false; bool _loading = false;
bool canPickTime = false;
final ValueNotifier<String> _period = ValueNotifier("0:00:00"); final ValueNotifier<String> _period = ValueNotifier("0:00:00");
DateTime? _pickerStartAt; DateTime? _pickerStartAt;
@ -124,6 +124,7 @@ class _AppTimerState extends State<AppTimer> {
@override @override
void initState() { void initState() {
canPickTime = ApiManager.instance.assetGroup?.enabledEngineerTimer ?? false;
_startAt = widget.timer?.startAt; _startAt = widget.timer?.startAt;
_endAt = widget.timer?.endAt; _endAt = widget.timer?.endAt;
_running = _startAt != null && _endAt == null; _running = _startAt != null && _endAt == null;
@ -152,7 +153,7 @@ class _AppTimerState extends State<AppTimer> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Column( return Column(
children: [ children: [
if (widget.canPickTime) ...[ if (canPickTime) ...[
Row( Row(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [

Loading…
Cancel
Save