timer picker added, and code improvements

design_3.0_task_module_new
Sikander Saleem 4 months ago
parent bcb54f6279
commit 62dd395a73

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

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

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

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

@ -1,5 +1,7 @@
import 'dart:convert';
import 'package:flutter/foundation.dart';
class AllRequestsAndCount {
CountServiceRequest? countServiceRequest;
CountServiceRequest? countGasRefill;
@ -19,7 +21,7 @@ class AllRequestsAndCount {
this.requestsDetails,
});
AllRequestsAndCount.fromJson(Map<String, dynamic> json) {
AllRequestsAndCount.fromJsonCons(Map<String, dynamic> json) {
countServiceRequest = json['countServiceRequest'] != null ? CountServiceRequest.fromJson(json['countServiceRequest']) : null;
countGasRefill = json['countGasRefill'] != null ? CountServiceRequest.fromJson(json['countGasRefill']) : null;
countAssetTransfer = json['countAssetTransfer'] != null ? CountServiceRequest.fromJson(json['countAssetTransfer']) : null;
@ -34,6 +36,10 @@ class AllRequestsAndCount {
}
}
static Future<AllRequestsAndCount> fromJson(Map<String, dynamic> json) {
return compute(AllRequestsAndCount.fromJsonCons, json);
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
if (countServiceRequest != null) {
@ -123,30 +129,29 @@ class RequestsDetails {
String? siteTransferTo;
int? transactionType;
RequestsDetails({
this.id,
this.nameOfType,
this.priority,
this.status,
this.assetName,
this.assetNo,
this.assetSN,
this.model,
this.supplier,
this.manufacturer,
this.requestType,
this.requestNo,
this.gasType,
this.site,
this.statusReceiver,
this.assetTransferFrom,
this.assetTransferTo,
this.code,
this.siteTransferFrom,
this.siteTransferTo,
this.date,
this.transactionType
});
RequestsDetails(
{this.id,
this.nameOfType,
this.priority,
this.status,
this.assetName,
this.assetNo,
this.assetSN,
this.model,
this.supplier,
this.manufacturer,
this.requestType,
this.requestNo,
this.gasType,
this.site,
this.statusReceiver,
this.assetTransferFrom,
this.assetTransferTo,
this.code,
this.siteTransferFrom,
this.siteTransferTo,
this.date,
this.transactionType});
RequestsDetails.fromJson(Map<String, dynamic> json) {
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/helper_data_models/spare_part/activity_spare_part_model.dart';
import 'package:test_sa/models/helper_data_models/workorder/work_order_helper_models.dart';
@ -20,7 +21,7 @@ class WorkOrderDetail {
final int? responseCode;
final bool? isSuccess;
factory WorkOrderDetail.fromJson(Map<String, dynamic> json) {
factory WorkOrderDetail.fromJsonCons(Map<String, dynamic> json) {
return WorkOrderDetail(
data: json["data"] == null ? null : WorkOrderData.fromJson(json["data"]),
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() => {
"data": data?.toJson(),
"message": message,
@ -465,7 +470,7 @@ class ActivitySparePart {
String? comment;
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) {
id = json['id'];

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Loading…
Cancel
Save