Merge remote-tracking branch 'origin/main_design2.0' into main_design2.0

main_design2.0
Sikander Saleem 2 years ago
commit f4afe5ca5a

@ -150,92 +150,11 @@ class AssetTransferProvider extends ChangeNotifier {
} }
Future<int> updateRequest({ Future<int> updateRequest({
@required String host, @required AssetTransfer assetTransfer,
@required User user,
@required bool isSender,
@required int requestId,
@required AssetTransfer oldModel,
@required AssetTransfer newModel,
}) async { }) async {
Map<String, dynamic> body = {
"id": oldModel.id,
// "assetId": oldModel.device.id ?? "",
// "senderSiteId": oldModel.sender.client.id,
// "destSiteId": oldModel.receiver.client.id,
// "destDepartmentId": oldModel.receiver.department.id,
};
if (isSender) {
body.addAll({
// "senderSiteId": newModel.client.id,
// "senderDepartmentId": newModel.department.id,
// "senderAssignedEmployeeId": newModel.userId,
// "senderMachineStatusId": newModel.status.id,
// "senderComment": newModel.comment,
// "senderWorkingHours": newModel.workingHours,
// "senderStartDate": newModel.timer?.startAt?.toIso8601String(),
// "senderEndDate": newModel.timer?.endAt?.toIso8601String(),
// "senderTravelingHours": newModel.travelingHours,
// "senderEngSignature": newModel.engSignature,
// if (newModel?.attachments?.isNotEmpty ?? false)
// "senderAttachments":
// newModel?.attachments?.map((file) => {"attachmentName": _isLocalUrl(file.path) ? ("${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}") : file.path})?.toList(),
// "destSiteId": oldModel.receiver.client?.id,
// "destDepartmentId": oldModel.receiver.department?.id,
// "destBuildingId": oldModel.device?.destBuildingId,
// "destFloorId": oldModel.device?.destFloorId,
// "destRoom": oldModel.device?.destRoom,
// "receiverAssignedEmployeeId": oldModel.receiver.userId,
// "receiverMachineStatusId": oldModel.receiver.status.id ?? "",
// "receiverComment": oldModel.receiver.comment,
// "receiverWorkingHours": oldModel.receiver.workingHours,
// "receiverStartDate": oldModel.receiver.timer?.startAt?.toIso8601String(),
// "receiverEndDate": oldModel.receiver.timer?.endAt?.toIso8601String(),
// "receiverTravelingHours": oldModel.receiver?.travelingHours,
// "receiverEngSignature": oldModel.receiver?.engSignature,
// if (oldModel.receiver?.attachments?.isNotEmpty ?? false)
// "receiverAttachments": oldModel.receiver?.attachments
// ?.map((file) => {"attachmentName": _isLocalUrl(file.path) ? ("${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}") : file.path})
// ?.toList(),
});
} else {
body.addAll({
// "senderSiteId": oldModel.sender.client.id,
// "senderDepartmentId": oldModel.sender.department.id,
// "senderAssignedEmployeeId": oldModel.sender.userId,
// "senderMachineStatusId": oldModel.sender.status.id,
// "senderComment": oldModel.sender.comment,
// "senderWorkingHours": oldModel.sender.workingHours,
// "senderStartDate": oldModel.sender.timer?.startAt?.toIso8601String(),
// "senderEndDate": oldModel.sender.timer?.endAt?.toIso8601String(),
// "senderTravelingHours": oldModel.sender?.travelingHours,
// "senderEngSignature": oldModel.sender?.engSignature,
// if (oldModel.sender?.attachments?.isNotEmpty ?? false)
// "senderAttachments":
// oldModel.sender?.attachments?.map((file) => {"attachmentName": _isLocalUrl(file.path) ? ("${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}") : file.path})?.toList(),
// "destSiteId": newModel.client?.id,
// "destDepartmentId": newModel.department?.id,
// "destBuildingId": oldModel.device?.destBuildingId,
// "destFloorId": oldModel.device?.destFloorId,
// "destRoom": oldModel.device?.destRoom,
// "receiverAssignedEmployeeId": newModel.userId,
// "receiverMachineStatusId": newModel.status?.id ?? "",
// "receiverComment": newModel.comment,
// "receiverWorkingHours": newModel.workingHours,
// "receiverStartDate": newModel.timer?.startAt?.toIso8601String(),
// "receiverEndDate": newModel.timer?.endAt?.toIso8601String(),
// "receiverTravelingHours": newModel.travelingHours,
// "receiverEngSignature": newModel.engSignature,
// if (newModel?.attachments?.isNotEmpty ?? false)
// "receiverAttachments":
// newModel?.attachments?.map((file) => {"attachmentName": _isLocalUrl(file.path) ? ("${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}") : file.path})?.toList(),
});
}
//body.addAll(newModel.toJson(isSender));
log(body?.toString());
Response response; Response response;
try { try {
response = await ApiManager.instance.put(URLs.updateDeviceTransfer, body: body); response = await ApiManager.instance.put(URLs.updateDeviceTransfer, body: assetTransfer.toJson());
print(response.body); print(response.body);
// print("${newModel.engSignature}.png"); // print("${newModel.engSignature}.png");

@ -232,10 +232,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
} }
} }
Future<int> updateRequest({ Future<int> updateRequest({@required User user, @required ServiceRequest request}) async {
@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) ?? "";
@ -464,42 +461,28 @@ class ServiceRequestsProvider extends ChangeNotifier {
} }
} }
Future<int> updateServiceReport({ Future<int> updateServiceReport(BuildContext context, {@required ServiceReport report}) async {
@required ServiceReport report,
String host,
User user,
ServiceRequest request,
}) async {
Response response; Response response;
//Map<String,dynamic> body = report.toMap(request); report.callRequest = CallRequest(id: report.callRequest.id);
// body["uid"] = user.id;
// body["token"] = user.token;
// body["job_id"] = request.id;
// body["report_id"] = request.reportID;
// try {
Map<String, dynamic> body = report.toJson(); Map<String, dynamic> body = report.toJson();
try {
/// todo [zaid] : don't forget to add [request] data to [body] showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
// Map<String, dynamic> body = report.toMap(request); response = await ApiManager.instance.put(URLs.updateServiceReport, body: body);
// body["uid"] = user.id; if (response.statusCode >= 200 && response.statusCode < 300) {
// body["token"] = user.token; reset();
response = await ApiManager.instance.put(URLs.updateServiceReport, body: body); notifyListeners();
// response = await post( Fluttertoast.showToast(msg: context.translation.successfulRequestMessage);
// Uri.parse( Navigator.of(context).pop();
// host+URLs.updateServiceReport), } else {
// body: body, Fluttertoast.showToast(msg: "${context.translation.failedToCompleteRequest}");
// ); }
// stateCode = response.statusCode; Navigator.of(context).pop();
return response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) { } catch (e) {
reset(); print(e);
notifyListeners(); Navigator.of(context).pop();
return -1;
} }
return response.statusCode;
// } catch (error) {
// print(error);
// return -1;
// }
} }
Future<int> updateWorkOrderDetails({@required SearchWorkOrder workOrder}) async { Future<int> updateWorkOrderDetails({@required SearchWorkOrder workOrder}) async {
@ -563,28 +546,20 @@ class ServiceRequestsProvider extends ChangeNotifier {
} }
} }
Future<ServiceReport> getSingleServiceReport({ Future<ServiceReport> getSingleServiceReport(BuildContext context, {@required int reportId}) async {
@required int reportId,
@required String host,
@required User user,
@required AppLocalizations subtitle,
}) async {
Response response; Response response;
try { try {
response = await ApiManager.instance.get( response = await ApiManager.instance.get(URLs.getServiceReport + "?workOrderId=$reportId");
URLs.getServiceReport + "?workOrderId=$reportId",
);
} catch (error) { } catch (error) {
throw (HttpStatusManger.getStatusMessage(status: -1, subtitle: subtitle)); 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.
/// todo [zaid]: check [reportId] below return ServiceReport.fromJson(json.decode(response.body)["data"]);
return ServiceReport.fromJson(json.decode(response.body)["data"] /*, reportId*/);
} else { } else {
throw (HttpStatusManger.getStatusMessage(status: response.statusCode, subtitle: subtitle)); throw (("${context.translation.failedToCompleteRequest} ${jsonDecode(response.body)["message"]}"));
} }
} }

@ -274,6 +274,13 @@
"requestedThrough" : "الطلب عبر", "requestedThrough" : "الطلب عبر",
"typeOfRequest" : "نوع الطلب", "typeOfRequest" : "نوع الطلب",
"assetDetails" : "تفاصيل الجهاز", "assetDetails" : "تفاصيل الجهاز",
"deviceTransfer" : "نقل جهاز ",
"deviceTransferRequest" : "طلب نقل جهاز ",
"deviceTransferDetails" : "تفاصيل نقل جهاز ",
"transferDetails" : "تفاصيل النقل" ,
"senderDetails" : "تفاصيل المرسل",
"receiverDetails" : "تفاصيل المستقبل",
"assetDetails" : "تفاصيل الجهاز",
"searchBy" : "إبحث بـ", "searchBy" : "إبحث بـ",
"searchByDesc" : "إبحث بأي من المعايير التالية", "searchByDesc" : "إبحث بأي من المعايير التالية",
"location" : "الموقع", "location" : "الموقع",
@ -295,5 +302,7 @@
"assistantEmployee" : "موظف مساعد", "assistantEmployee" : "موظف مساعد",
"assignAssistant" : "تعيين مساعد", "assignAssistant" : "تعيين مساعد",
"partNo" : "الجزء رقم", "partNo" : "الجزء رقم",
"engSign" : "توقيع المهندس" "engSign" : "توقيع المهندس",
"requesterName" : "اسم الطالب",
"updateWorkOrder" : "تعديل طلب العمل"
} }

@ -278,6 +278,13 @@
"receiverDetails" : "Receiver Details", "receiverDetails" : "Receiver Details",
"requestedThrough" : "Requested Through", "requestedThrough" : "Requested Through",
"typeOfRequest" : "Type of Request", "typeOfRequest" : "Type of Request",
"deviceTransfer" : "Device Transfer",
"deviceTransferRequest" : "Device Transfer Request",
"deviceTransferDetails" : "Device Transfer Details",
"transferDetails" : "Transfer Details" ,
"senderDetails" :"Sender Details",
"receiverDetails" :"Receiver Details",
"typeOfRequest" : "Type of Request",
"searchBy" : "Search by", "searchBy" : "Search by",
"searchByDesc" : "Search by any of the following criteria", "searchByDesc" : "Search by any of the following criteria",
"location" : "Location", "location" : "Location",
@ -299,5 +306,8 @@
"assistantEmployee" : "Assistant Employee", "assistantEmployee" : "Assistant Employee",
"assignAssistant" : "Assign Assistant", "assignAssistant" : "Assign Assistant",
"partNo" : "Part No.", "partNo" : "Part No.",
"engSign" : "Engineer Signature" "engSign" : "Engineer Signature",
"requesterName" : "Requester Name",
"updateWorkOrder" : "Update Work Order"
} }

@ -39,6 +39,32 @@ class AssetTransfer {
this.receiverTravelingHours, this.receiverTravelingHours,
this.receiverEngSignature, this.receiverEngSignature,
this.receiverAttachments, this.receiverAttachments,
this.assetNumber,
this.assetName,
this.manufacturerName,
this.modelName,
this.assetSerialNo,
this.destDepartmentName,
this.destBuildingName,
this.applied,
this.createdOn,
this.destFloorName,
this.destSiteName,
this.manufacturerId,
this.modelId,
this.modifiedOn,
this.receiverAssignedEmployeeName,
this.receiverEngSignatureUrl,
this.receiverMachineStatusName,
this.senderAssignedEmployeeName,
this.senderBuildingName,
this.senderDepartmentName,
this.senderEngSignatureUrl,
this.senderFloorName,
this.senderMachineStatusName,
this.senderSiteName,
this.supplierId,
this.supplierName
}); });
AssetTransfer.fromJson(dynamic json) { AssetTransfer.fromJson(dynamic json) {
@ -84,11 +110,44 @@ class AssetTransfer {
receiverAttachments.add(AssetTransferAttachment.fromJson(v)); receiverAttachments.add(AssetTransferAttachment.fromJson(v));
}); });
} }
assetNumber= json['assetNumber'];
assetName= json['assetName'];
manufacturerName= json['manufacturerName'];
modelName= json['modelName'];
assetSerialNo= json['assetSerialNo'];
destDepartmentName= json['destDepartmentName'];
destBuildingName= json['destBuildingName'];
applied= json['applied'];
createdOn= json['createdOn'];
destFloorName= json['destFloorName'];
destSiteName= json['destSiteName'];
manufacturerId= json['manufacturerId'];
modelId= json['modelId'];
modifiedOn= json['modifiedOn'];
receiverAssignedEmployeeName= json['receiverAssignedEmployeeName'];
receiverEngSignatureUrl= json['receiverEngSignatureUrl'];
receiverMachineStatusName= json['receiverMachineStatusName'];
senderAssignedEmployeeName= json['senderAssignedEmployeeName'];
senderBuildingName= json['senderBuildingName'];
senderDepartmentName= json['senderDepartmentName'];
senderEngSignatureUrl= json['senderEngSignatureUrl'];
senderFloorName= json['senderFloorName'];
senderMachineStatusName= json['senderMachineStatusName'];
senderSiteName= json['senderSiteName'];
supplierId= json['supplierId'];
supplierName= json['supplierName'];
} }
num id; num id;
num transferNo; num transferNo;
String transferCode; String transferCode;
String assetSerialNo;
num assetId; num assetId;
String assetNumber;
String assetName;
int modelId;
String modelName;
int manufacturerId;
String manufacturerName;
num destSiteId; num destSiteId;
num destBuildingId; num destBuildingId;
num destFloorId; num destFloorId;
@ -117,6 +176,26 @@ class AssetTransfer {
String receiverTravelingHours; String receiverTravelingHours;
String receiverEngSignature; String receiverEngSignature;
List<AssetTransferAttachment> receiverAttachments; List<AssetTransferAttachment> receiverAttachments;
num supplierId;
String supplierName;
String destSiteName;
String destBuildingName;
String destFloorName;
String destDepartmentName;
String senderSiteName;
String senderBuildingName;
String senderFloorName;
String senderDepartmentName;
String senderAssignedEmployeeName;
String senderMachineStatusName;
String senderEngSignatureUrl;
String receiverAssignedEmployeeName;
String receiverMachineStatusName;
String receiverEngSignatureUrl;
bool applied;
String createdOn;
String modifiedOn;
AssetTransfer copyWith({ AssetTransfer copyWith({
num id, num id,
num transferNo, num transferNo,
@ -150,6 +229,33 @@ class AssetTransfer {
String receiverTravelingHours, String receiverTravelingHours,
String receiverEngSignature, String receiverEngSignature,
List<AssetTransferAttachment> receiverAttachments, List<AssetTransferAttachment> receiverAttachments,
num supplierId,
String supplierName,
String destSiteName,
String destBuildingName,
String destFloorName,
String destDepartmentNam,
String senderSiteName,
String senderBuildingName,
String senderFloorName,
String senderDepartmentName,
String senderAssignedEmployeeName,
String senderMachineStatusName,
String senderEngSignatureUrl,
String receiverAssignedEmployeeName,
String receiverMachineStatusName,
String receiverEngSignatureUrl,
bool applied,
String createdOn,
String modifiedOn,
String assetSerialNo,
String assetNumber,
String assetName,
int modelId,
String modelName,
int manufacturerId,
String manufacturerName,
String destDepartmentName
}) => }) =>
AssetTransfer( AssetTransfer(
id: id ?? this.id, id: id ?? this.id,
@ -184,6 +290,32 @@ class AssetTransfer {
receiverTravelingHours: receiverTravelingHours ?? this.receiverTravelingHours, receiverTravelingHours: receiverTravelingHours ?? this.receiverTravelingHours,
receiverEngSignature: receiverEngSignature ?? this.receiverEngSignature, receiverEngSignature: receiverEngSignature ?? this.receiverEngSignature,
receiverAttachments: receiverAttachments ?? this.receiverAttachments, receiverAttachments: receiverAttachments ?? this.receiverAttachments,
supplierId : supplierId?? this.supplierId,
supplierName: supplierName??this.supplierName,
destSiteName: destSiteName??this.destSiteName,
destBuildingName: destBuildingName?? this.destBuildingName,
destFloorName: destFloorName??this.destFloorName,
destDepartmentName: destDepartmentName?? this.destDepartmentName,
senderSiteName: senderSiteName??this.senderSiteName,
senderBuildingName: senderBuildingName??this.senderBuildingName,
senderFloorName: senderFloorName??this.senderFloorName,
senderDepartmentName: senderDepartmentName??this.senderDepartmentName,
senderAssignedEmployeeName: senderAssignedEmployeeName??this.senderAssignedEmployeeName,
senderMachineStatusName: senderMachineStatusName??this.senderMachineStatusName,
senderEngSignatureUrl: senderEngSignatureUrl??this.senderEngSignatureUrl,
receiverAssignedEmployeeName: receiverAssignedEmployeeName?? this.receiverAssignedEmployeeName,
receiverMachineStatusName: receiverMachineStatusName??this.receiverMachineStatusName,
receiverEngSignatureUrl: receiverEngSignatureUrl??this.receiverEngSignatureUrl,
applied: applied??this.applied,
createdOn: createdOn?? this.createdOn,
modifiedOn: modifiedOn??this.modifiedOn,
assetSerialNo:assetSerialNo??this.assetSerialNo,
assetNumber:assetNumber??this.assetNumber,
assetName:assetName??this.assetName,
modelId:modelId??this.modelId,
modelName:modelName??this.modelName,
manufacturerId:manufacturerId??this.manufacturerId,
manufacturerName:manufacturerName??this.manufacturerName
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
@ -223,6 +355,32 @@ class AssetTransfer {
if (receiverAttachments != null) { if (receiverAttachments != null) {
map['receiverAttachments'] = receiverAttachments.map((v) => v.toJson()).toList(); map['receiverAttachments'] = receiverAttachments.map((v) => v.toJson()).toList();
} }
map["supplierId"] = supplierId;
map["supplierName"] =supplierName;
map["destSiteName"] =destSiteName;
map["destBuildingName"] =destBuildingName;
map["destFloorName"] =destFloorName;
map["destDepartmentName"] =destDepartmentName;
map["senderSiteName"] =senderSiteName;
map["senderBuildingName"] = senderBuildingName;
map["senderFloorName"] = senderFloorName;
map["senderDepartmentName"] = senderDepartmentName;
map["senderAssignedEmployeeName"] = senderAssignedEmployeeName;
map["senderMachineStatusName"] = senderMachineStatusName;
map["senderEngSignatureUrl"] = senderEngSignatureUrl;
map["receiverAssignedEmployeeName"] = receiverAssignedEmployeeName;
map["receiverMachineStatusName"] = receiverMachineStatusName;
map["receiverEngSignatureUrl"] = receiverEngSignatureUrl;
map["applied"] = applied;
map["createdOn"] = createdOn;
map["modifiedOn"] = modifiedOn;
map["assetSerialNo"] =assetSerialNo;
map["assetNumber"] =assetNumber;
map["assetName"] =assetName;
map["modelId"] =modelId;
map["modelName"] =modelName;
map["manufacturerId"] =manufacturerId;
map["manufacturerName"] =manufacturerName;
return map; return map;
} }
@ -267,6 +425,71 @@ class AssetTransfer {
return map; return map;
} }
fromDetails(AssetTransfer assetTransfer){
id= assetTransfer.id;
transferNo=assetTransfer.transferNo;
transferCode= assetTransfer.transferCode;
assetId=assetTransfer.assetId;
destSiteId= assetTransfer.destSiteId;
destBuildingId=assetTransfer.destBuildingId;
destFloorId=assetTransfer.destFloorId;
destDepartmentId= assetTransfer.destDepartmentId;
destRoom=assetTransfer.destRoom;
senderSiteId=assetTransfer.senderSiteId;
senderBuildingId=assetTransfer.senderBuildingId;
senderFloorId=assetTransfer.senderFloorId;
senderDepartmentId=assetTransfer.senderDepartmentId;
senderRoom=assetTransfer.senderRoom;
senderAssignedEmployeeId= assetTransfer.senderAssignedEmployeeId;
senderMachineStatusId=assetTransfer.senderMachineStatusId;
senderComment=assetTransfer.senderComment;
senderStartDate= assetTransfer.senderStartDate;
senderEndDate= assetTransfer.senderEndDate;
senderWorkingHours= assetTransfer.senderWorkingHours;
senderTravelingHours= assetTransfer.senderTravelingHours;
senderEngSignature=assetTransfer.senderEngSignature;
senderAttachments=assetTransfer.senderAttachments;
receiverAssignedEmployeeId=assetTransfer.receiverAssignedEmployeeId;
receiverMachineStatusId= assetTransfer.receiverMachineStatusId;
receiverComment= assetTransfer.receiverComment;
receiverStartDate=assetTransfer.receiverStartDate;
receiverEndDate= assetTransfer.receiverEndDate;
receiverWorkingHours= assetTransfer.receiverWorkingHours;
receiverTravelingHours= assetTransfer.receiverTravelingHours;
receiverEngSignature= assetTransfer.receiverEngSignature;
receiverAttachments=assetTransfer.receiverAttachments;
supplierId =assetTransfer.supplierId;
supplierName=assetTransfer.supplierName;
destSiteName=assetTransfer.destSiteName;
destBuildingName=assetTransfer.destBuildingName;
destFloorName=assetTransfer.destFloorName;
destDepartmentName=assetTransfer.destDepartmentName;
senderSiteName=assetTransfer.senderSiteName;
senderBuildingName=assetTransfer.senderBuildingName;
senderFloorName=assetTransfer.senderFloorName;
senderDepartmentName=assetTransfer.senderDepartmentName;
senderAssignedEmployeeName=assetTransfer.senderAssignedEmployeeName;
senderMachineStatusName= assetTransfer.senderMachineStatusName;
senderEngSignatureUrl= assetTransfer.senderEngSignatureUrl;
receiverAssignedEmployeeName=assetTransfer.receiverAssignedEmployeeName;
receiverMachineStatusName=assetTransfer.receiverMachineStatusName;
receiverEngSignatureUrl=assetTransfer.receiverEngSignatureUrl;
applied=assetTransfer.applied;
createdOn= assetTransfer.createdOn;
modifiedOn= assetTransfer.modifiedOn;
assetSerialNo=assetTransfer.assetSerialNo;
assetNumber=assetTransfer.assetNumber;
assetName=assetTransfer.assetName;
modelId=assetTransfer.modelId;
modelName=assetTransfer.modelName;
manufacturerId=assetTransfer.manufacturerId;
manufacturerName=assetTransfer.manufacturerName;
}
Future<bool> validate(BuildContext context) async { Future<bool> validate(BuildContext context) async {
if (assetId == null) { if (assetId == null) {
await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.device}"); await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.device}");

@ -1,19 +1,28 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/controllers/providers/api/asset_transfer_provider.dart'; import 'package:test_sa/controllers/providers/api/asset_transfer_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/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/string_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/device/asset_transfer.dart'; import 'package:test_sa/models/device/asset_transfer.dart';
import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/colors.dart';
import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/app_style/sizing.dart';
import 'package:test_sa/views/pages/device_transfer/update_device_transfer.dart';
import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart';
import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; import 'package:test_sa/views/widgets/buttons/app_small_button.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/loading_manager.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import 'package:test_sa/views/widgets/requests/info_row.dart'; import 'package:test_sa/views/widgets/requests/info_row.dart';
import '../../../extensions/text_extensions.dart';
import '../../../models/enums/user_types.dart'; import '../../../models/enums/user_types.dart';
import '../../../new_views/app_style/app_color.dart';
import '../../../new_views/common_widgets/default_app_bar.dart';
import '../../widgets/requests/request_status.dart';
class DeviceTransferDetails extends StatefulWidget { class DeviceTransferDetails extends StatefulWidget {
final AssetTransfer model; final AssetTransfer model;
@ -26,8 +35,6 @@ class DeviceTransferDetails extends StatefulWidget {
class _DeviceTransferDetailsState extends State<DeviceTransferDetails> { class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
AssetTransfer _model; AssetTransfer _model;
bool _isSender = false;
bool _isReceiver = false;
UserProvider _userProvider; UserProvider _userProvider;
bool _isLoading = false; bool _isLoading = false;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
@ -46,6 +53,7 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
appBar: DefaultAppBar(title: context.translation.deviceTransferDetails),
key: _scaffoldKey, key: _scaffoldKey,
body: SafeArea( body: SafeArea(
child: FutureBuilder( child: FutureBuilder(
@ -55,8 +63,6 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
return const ALoading(); return const ALoading();
} else { } else {
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
// _isSender = _userProvider.user.userID == _model.sender?.userId;
// _isReceiver = _userProvider.user.userID == _model.receiver?.userId;
return Form( return Form(
key: _formKey, key: _formKey,
child: LoadingManager( child: LoadingManager(
@ -66,129 +72,74 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
onRefresh: () async {}, onRefresh: () async {},
child: Column( child: Column(
children: [ children: [
Container( _buildDetailsCard(
color: Theme.of(context).colorScheme.primary, Column(
padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4),
child: Row(
children: [
const ABackButton(),
Expanded(
child: Center(
child: Text(
context.translation.details,
style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic),
),
),
),
const SizedBox(width: 58),
],
),
),
Expanded(
child: SingleChildScrollView(
padding: EdgeInsets.all(16 * AppStyle.getScaleFactor(context)),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
RequestInfoRow(
title: "Transfer Id",
info: "_model.title?.toString()",
),
RequestInfoRow(
title: context.translation.assetName,
info: "_model.device.assetName",
),
RequestInfoRow(
title: context.translation.assetSN,
info: "_model.device.serialNumber",
),
RequestInfoRow(
title: context.translation.assetNumber,
info: "_model.device.number",
),
RequestInfoRow(
title: context.translation.destinationSite,
info: "_model.device.destSiteName",
),
RequestInfoRow(
title: context.translation.building,
info: " _model.device.destBuildingName",
),
RequestInfoRow(
title: context.translation.floor,
info: "_model.device.destFloor",
),
RequestInfoRow(
title: context.translation.department,
info: "_model.device.destDepartmentName",
),
RequestInfoRow(
title: context.translation.room,
info: "_model.device.destRoom",
),
RequestInfoRow(
title: context.translation.actions,
info: "",
),
const SizedBox(height: 8),
Row( Row(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Expanded( Row(
child: Text("Sender", style: Theme.of(context).textTheme.headline6), children: [
/// TBD
// StatusLabel(
// label: "",
// id: 0,
// textColor: AColors.getPriorityStatusTextColor(0),
// backgroundColor: AColors.getPriorityStatusColor(0)),
8.width,
/// TBD
//StatusLabel(label: '', textColor: AColors.getRequestStatusTextColor(0), backgroundColor: AColors.getRequestStatusColor(0)),
],
), ),
if (_userProvider.user?.type == UsersTypes.engineer) 1.width.expanded,
ASmallButton( Text(widget.model.createdOn != null ?widget.model.createdOn.toServiceRequestCardFormat:"", textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: const Color(0xFF3B3D4A))),
text: context.translation.edit,
// onPressed: (_isSender)
// ? (_model.sender.status?.name == "Closed"
// ? null
// : () {
// Navigator.of(context).push(MaterialPageRoute(
// builder: (_) => UpdateDeviceTransfer(
// model: _model,
// isSender: true,
// )));
// })
// : null,
),
], ],
), ),
const SizedBox(height: 12), 8.height,
// DeviceTransferInfoSection( Text(context.translation.transferDetails, style: AppTextStyles.heading5.copyWith(color: const Color(0xFF3B3D4A))),
// info: _model.sender, 8.height,
// isSender: true, Column(
// ), crossAxisAlignment: CrossAxisAlignment.start,
const SizedBox(height: 8),
Row(
children: [ children: [
Expanded( _buildTextWidget('${context.translation.assetName} : ${_model.assetName}'),
child: Text("Receiver", style: Theme.of(context).textTheme.headline6), _buildTextWidget('${context.translation.assetNumber} : ${_model.assetNumber}'),
), _buildTextWidget('${context.translation.model} : ${_model.modelName}'),
if (_userProvider.user?.type == UsersTypes.engineer) _buildTextWidget('${context.translation.sn} : ${_model.assetSerialNo}'),
ASmallButton(
text: context.translation.edit,
// onPressed: (_isReceiver)
// ? (_model.receiver.status?.name == "Closed"
// ? null
// : () {
// Navigator.of(context).push(MaterialPageRoute(
// builder: (_) => UpdateDeviceTransfer(
// model: _model,
// isSender: false,
// )));
// })
// : null,
),
], ],
), ),
const SizedBox(height: 12), 8.height,
// DeviceTransferInfoSection(
// info: _model.receiver,
// isSender: false,
// ),
], ],
), ).paddingAll(14)
), ),
// sender card
_buildCard(
isSender: true,
site: _model.senderSiteName??"",
/// TBD
unit: _model.senderDepartmentName??"",
comment: _model.senderComment??"",
/// TBD
statusLabel: _model.senderMachineStatusName != null? StatusLabel(
label: _model.senderMachineStatusName,
id: _model.senderMachineStatusId,
textColor: AColors.getRequestStatusTextColor(getIdstatus(_model.senderMachineStatusName)),
backgroundColor: AColors.getRequestStatusColor(getIdstatus(_model.senderMachineStatusName))):null,
),
// receiver card
_buildCard(
isSender: false,
site: _model.destSiteName??"",
/// TBD
unit: _model.destDepartmentName??"",
comment: _model.receiverComment??"",
/// TBD
statusLabel: _model.receiverMachineStatusName != null ? StatusLabel(
label: _model.receiverMachineStatusName??"",
id: _model.receiverMachineStatusId,
textColor: AColors.getRequestStatusTextColor(getIdstatus(_model.receiverMachineStatusName)),
backgroundColor: AColors.getRequestStatusColor(getIdstatus(_model.receiverMachineStatusName))):null,
), ),
], ],
), ),
@ -200,4 +151,107 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
), ),
); );
} }
_buildDetailsCard(Widget widget){
return Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)),
),
child: widget,
).paddingOnly(top: 14, start: 14, end: 14);
}
_buildTextWidget(String text){
return Text(
text, style: AppTextStyles.bodyText.copyWith(color: Color(0xFF757575)),
);
}
_buildCard({@required String site, @required String unit, @required String comment, @required bool isSender, StatusLabel statusLabel}){
return Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
statusLabel??Container(),
8.height,
Text(isSender?context.translation.senderDetails:context.translation.receiverDetails,
style: AppTextStyles.heading5.copyWith(color: const Color(0xFF3B3D4A))),
],
),
if (_userProvider.user?.type == UsersTypes.engineer)
CircleAvatar(
radius: 25,
backgroundColor: AppColor.neutral30,
child: CircleAvatar(
radius: 24,
backgroundColor: Colors.white,
child: Padding(
padding: const EdgeInsets.only(left: 3.0),
child: SvgPicture.asset('assets/images/update.svg'),
),
),
).onPress(
isSender ? _model.senderMachineStatusName == "Closed"
? null
: () {
Navigator.of(context).push(MaterialPageRoute(
builder: (_) => UpdateDeviceTransfer(
model: _model,
isSender: isSender,
)));
}
: _model.receiverMachineStatusName == "Closed"
? null
: () {
Navigator.of(context).push(MaterialPageRoute(
builder: (_) => UpdateDeviceTransfer(
model: _model,
isSender: isSender,
)));
}),
],
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_buildTextWidget('${context.translation.site} : $site'),
_buildTextWidget('${context.translation.unite} : $unit'),
8.height,
const Divider(color: Color(0xFFEAF1F4), height: 1, thickness: 1),
8.height,
_buildTextWidget(comment),
],
),
8.height,
],
).paddingAll(14),
).paddingOnly(top: 14, start: 14, end: 14);
}
int getIdstatus(String status){
switch(status){
case "Closed":
return 3 ;
break;
case "Open":
return 1 ;
break;
case "In Progress":
return 2;
break;
}
}
} }

@ -3,11 +3,13 @@ import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/asset_transfer_provider.dart'; import 'package:test_sa/controllers/providers/api/asset_transfer_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/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/colors.dart';
import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart';
import 'package:test_sa/views/widgets/device_trancfer/device_transfer_list.dart'; import 'package:test_sa/views/widgets/device_trancfer/device_transfer_list.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import '../../../new_views/common_widgets/default_app_bar.dart';
import '../../widgets/buttons/app_icon_button.dart'; import '../../widgets/buttons/app_icon_button.dart';
class TrackDeviceTransferPage extends StatefulWidget { class TrackDeviceTransferPage extends StatefulWidget {
@ -31,6 +33,7 @@ class _TrackDeviceTransferPageState extends State<TrackDeviceTransferPage> with
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
return Scaffold( return Scaffold(
appBar: DefaultAppBar(title: context.translation.deviceTransfer),
body: SafeArea( body: SafeArea(
child: LoadingManager( child: LoadingManager(
isLoading: _deviceTransferProvider.isLoading, isLoading: _deviceTransferProvider.isLoading,
@ -47,52 +50,6 @@ class _TrackDeviceTransferPageState extends State<TrackDeviceTransferPage> with
children: [ children: [
Column( Column(
children: [ children: [
Container(
color: AColors.primaryColor,
padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4),
child: Column(
children: [
Row(
children: [
const ABackButton(),
Expanded(
child: Center(
child: Text(
"Asset Transfer",
style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic),
),
),
),
AIconButton(
iconData: Icons.search,
color: AColors.secondaryColor,
buttonSize: 42,
backgroundColor: AColors.white,
onPressed: () async {
// DeviceTransferSearch temp = await showModalBottomSheet(
// context: context,
// isScrollControlled: true,
// builder: (context) {
// return AssetTransferSearchDialog(initialSearchValue: _deviceTransferProvider.deviceTransferSearch);
// },
// );
// if (temp != null) {
// _deviceTransferProvider.deviceTransferSearch = temp;
// _deviceTransferProvider.reset();
// setState(() {});
// await _deviceTransferProvider.getRequests(
// user: _userProvider.user,
// host: _settingProvider.host,
// );
// }
},
),
const SizedBox(width: 16),
],
),
],
),
),
Expanded( Expanded(
child: DeviceTransferList( child: DeviceTransferList(
nextPage: _deviceTransferProvider.nextPage, nextPage: _deviceTransferProvider.nextPage,

@ -1,18 +1,32 @@
import 'dart:convert';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/asset_transfer_provider.dart'; import 'package:test_sa/controllers/providers/api/asset_transfer_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/widget_extensions.dart';
import 'package:test_sa/models/device/asset_transfer.dart'; import 'package:test_sa/models/device/asset_transfer.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/app_style/sizing.dart';
import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/buttons/app_button.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/titles/app_sub_title.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart';
import '../../../../controllers/localization/localization.dart'; import '../../../../controllers/localization/localization.dart';
import '../../../controllers/validator/validator.dart';
import '../../../extensions/text_extensions.dart';
import '../../../models/lookup.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/gas_request_providers/gas_status_provider.dart';
import '../../widgets/e_signature/e_signature.dart';
class UpdateDeviceTransfer extends StatefulWidget { class UpdateDeviceTransfer extends StatefulWidget {
final AssetTransfer model; final AssetTransfer model;
@ -32,7 +46,7 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
Uint8List _signature; Uint8List _signature;
AssetTransferProvider _deviceTransferProvider; AssetTransferProvider _deviceTransferProvider;
final TextEditingController _requestedQuantityController = TextEditingController(); final TextEditingController _requestedQuantityController = TextEditingController();
// final DeviceTransferInfo _formModel = DeviceTransferInfo(attachments: []); final AssetTransfer _formModel = AssetTransfer();
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(); final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
@ -46,7 +60,7 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
// return false; // return false;
// } // }
_validate = true; _validate = true;
if (!_formKey.currentState.validate()) { if (!(_formKey.currentState.validate())) {
setState(() {}); setState(() {});
return false; return false;
} }
@ -54,17 +68,17 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
_isLoading = true; _isLoading = true;
setState(() {}); setState(() {});
// int status = await _deviceTransferProvider.updateRequest( int status = await _deviceTransferProvider.updateRequest(
// user: _userProvider.user, host: _settingProvider.host, requestId: widget.model.id, isSender: widget.isSender, newModel: _formModel, oldModel: widget.model); assetTransfer: _formModel);
// _isLoading = false; _isLoading = false;
// setState(() {}); setState(() {});
// if (status >= 200 && status < 300) { if (status >= 200 && status < 300) {
// Fluttertoast.showToast( Fluttertoast.showToast(
// msg: context.translation.successfulRequestMessage, msg: context.translation.successfulRequestMessage,
// ); );
// _validate = false; _validate = false;
// Navigator.of(context).pop(); Navigator.of(context).pop();
// } }
} }
// @override // @override
@ -74,7 +88,7 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
@override @override
void initState() { void initState() {
// _formModel.fromDetails(widget.isSender ? widget.model.sender : widget.model.receiver, withSignature: false); _formModel.fromDetails(widget.model);
super.initState(); super.initState();
} }
@ -90,136 +104,139 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
_deviceTransferProvider = Provider.of<AssetTransferProvider>(context, listen: false); _deviceTransferProvider = Provider.of<AssetTransferProvider>(context, listen: false);
return Scaffold( return Scaffold(
appBar: DefaultAppBar(title: context.translation.updateRequest),
key: _scaffoldKey, key: _scaffoldKey,
body: Form( body: SafeArea(
key: _formKey, child: LoadingManager(
child: SafeArea( isLoading: _isLoading,
child: LoadingManager( isFailedLoading: false,
isLoading: _isLoading, stateCode: 200,
isFailedLoading: false, onRefresh: () async {},
stateCode: 200, child: Form(
onRefresh: () async {}, key: _formKey,
child: SingleChildScrollView( child: Column(
padding: EdgeInsets.all(12 * AppStyle.getScaleFactor(context)), children: [
child: Column( SingleChildScrollView(
crossAxisAlignment: CrossAxisAlignment.start, padding: EdgeInsets.all(12 * AppStyle.getScaleFactor(context)),
children: [ child: Column(
Center( crossAxisAlignment: CrossAxisAlignment.start,
child: Padding( children: [
padding: const EdgeInsets.all(8.0), _buildCard(),
child: Text( 8.height,
"Edit Transfer Asset", AppTextFormField(
style: Theme.of(context).textTheme.headline5.copyWith(color: Theme.of(context).primaryColor, fontSize: 28, fontWeight: FontWeight.bold), initialValue: widget.isSender? _formModel.senderTravelingHours:_formModel.receiverTravelingHours,
labelText: context.translation.travelingHours,
onSaved:(value){
widget.isSender? _formModel.senderTravelingHours
: _formModel.receiverTravelingHours= value;
//_formModel?.workingHours = double.tryParse(value);
// _formModel.travelingHours = value;
},
textInputType: TextInputType.number,
validator: (value) => Validator.isNumeric(value) ? null : "allow numbers only",
), ),
), 8.height,
), AppTextFormField(
const SizedBox( labelText: context.translation.workingHours,
height: 8, initialValue: widget.isSender?_formModel.senderWorkingHours:_formModel.receiverWorkingHours,
), onSaved:(value){
ASubTitle("Comment"), widget.isSender?
_formModel?.senderWorkingHours = value:_formModel?.receiverWorkingHours = value;
// _formModel.timer = timer;
// _formModel.workingHours = (((timer?.durationInSecond ?? 0) / 60) / 60)?.toStringAsFixed(2) ?? "0";
},
textInputType: TextInputType.number,
validator: (value) => Validator.isNumeric(value) ? null : "allow numbers only",
),
8.height,
///TBD
Consumer<GasStatusProvider>(builder: (context, snapshot, _){
return SingleItemDropDownMenu<Lookup,GasStatusProvider >(
context: context,
title: context.translation.reportStatus,
initialValue: snapshot.items?.firstWhere((element) => element.name == (widget.isSender?_formModel.senderMachineStatusName:_formModel.receiverMachineStatusName), orElse: () => null),
onSelect: (value) {
if(widget.isSender) {
_formModel.senderMachineStatusName=value.name;
_formModel.senderMachineStatusId=value.id;
print("${value.id}");
}else{
_formModel.receiverMachineStatusName=value.name;
_formModel.receiverMachineStatusId=value.id;
}
setState(() {});
},
);
}),
8.height,
AppTextFormField(
initialValue: widget.isSender?_formModel.senderComment:_formModel.receiverComment,
labelText: context.translation.comments,
textInputType: TextInputType.multiline,
alignLabelWithHint: true,
onSaved: (value){
widget.isSender?
_formModel.senderComment = value:_formModel.receiverComment=value;
},
),
8.height,
ESignature(
title: "Signature",
oldSignature: widget.isSender ? widget.model.senderEngSignature : widget.model.receiverEngSignature,
newSignature: _signature,
onSaved: (signature) {
_signature = signature;
if (signature == null || signature.isEmpty) return;
widget.isSender? _formModel.senderEngSignature = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}":
_formModel.receiverEngSignature = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}";
const SizedBox( base64Encode(signature);
height: 4, },
), ),
// ATextFormField(
// initialValue: _formModel?.comment,
// textAlign: TextAlign.center,
// style: Theme.of(context).textTheme.subtitle1,
// textInputType: TextInputType.text,
// onSaved: (value) {
// _formModel.comment = value;
// },
// ),
const SizedBox(
height: 8,
),
ASubTitle(context.translation.travelingHours),
const SizedBox(
height: 4,
),
// ATextFormField(
// initialValue: _formModel?.travelingHours,
// textAlign: TextAlign.center,
// style: Theme.of(context).textTheme.subtitle1,
// textInputType: TextInputType.number,
// onSaved: (value) {
// _formModel.travelingHours = value;
// },
// ),
const SizedBox(
height: 16,
),
ASubTitle(context.translation.workingHours),
const SizedBox(height: 8),
Row(
children: [
// Expanded(
// child: AppTimer(
// timer: _formModel.timer,
// onChange: (timer) async {
// _formModel.timer = timer;
// _formModel.workingHours = (((timer?.durationInSecond ?? 0) / 60) / 60)?.toStringAsFixed(2) ?? "0";
// return true;
// },
// ),
// ),
], ],
), ),
const SizedBox(height: 16), ).expanded,
ASubTitle(context.translation.status), Padding(
const SizedBox( padding: const EdgeInsets.all(16.0),
height: 4, child: AppFilledButton(
), label: context.translation.update,
// AssetStatusMenu( onPressed: _update,
// initialValue: _formModel.status,
// onSelect: (status) {
// if (status == null) return;
// _formModel.status = status;
// setState(() {});
// },
// ),
const SizedBox(
height: 16,
),
// MultiFilesPicker(
// label: "Attachments",
// files: _formModel.attachments,
// ),
const SizedBox(
height: 16,
), ),
const ASubTitle("Signature"), ),
// if(_validate && _formModel.signature == null) ],
// ASubTitle(_subtitle.requiredWord,color: Colors.red,),
const SizedBox(
height: 4,
),
// ESignature(
// oldSignature: widget.isSender ? widget.model.sender.engSignature : widget.model.receiver.engSignature,
// newSignature: _signature,
// onSaved: (signature) {
// _signature = signature;
// if (signature == null || signature.isEmpty) return;
// _formModel.engSignature = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}";
// // base64Encode(signature);
// },
// ),
Padding(
padding: const EdgeInsets.all(16.0),
child: AButton(
text: context.translation.update,
onPressed: _update,
),
),
const SizedBox(
height: 100,
)
],
),
), ),
), ),
), ),
), ),
); );
} }
_buildCard(){
return Container(
width: MediaQuery.of(context).size.width,
decoration: ShapeDecoration(
color: Colors.white,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(15),
),
shadows: const [BoxShadow(color: Color(0x07000000), blurRadius: 14, offset: Offset(0, 0), spreadRadius: 0)],
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(context.translation.transferDetails, style: AppTextStyles.heading5.copyWith(color: const Color(0xFF3B3D4A))),
8.height,
Text(
'${context.translation.assetName}: ${_formModel.assetName}',
style: AppTextStyles.bodyText.copyWith(color: Color(0xFF757575)),
),
///TBD
Text(
'${context.translation.requesterName}: ',
style: AppTextStyles.bodyText.copyWith(color: Color(0xFF757575)),
),
],
).paddingAll(16),
);
}
} }

@ -1,4 +1,3 @@
import 'dart:convert';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart'; import 'package:fluttertoast/fluttertoast.dart';
@ -13,20 +12,9 @@ import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/timer_model.dart'; import 'package:test_sa/models/timer_model.dart';
import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
import 'package:test_sa/views/widgets/app_text_form_field.dart';
import 'package:test_sa/views/widgets/buttons/app_button.dart';
import 'package:test_sa/views/widgets/gas_refill/building_type_menu.dart';
import 'package:test_sa/views/widgets/gas_refill/department_type_menu.dart';
import 'package:test_sa/views/widgets/gas_refill/floor_type_menu.dart';
import 'package:test_sa/views/widgets/gas_refill/gas_refill_create_details_item.dart';
import 'package:test_sa/views/widgets/hospitals/hospital_auto_complete_field_new.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/gas_refill/gas_cylinder_size.dart';
import 'package:test_sa/views/widgets/status/gas_refill/gas_cylinder_type.dart';
import 'package:test_sa/views/widgets/status/gas_refill/gas_status.dart';
import 'package:test_sa/views/widgets/status/gas_refill/gas_type.dart';
import 'package:test_sa/views/widgets/titles/app_sub_title.dart';
import '../../../../controllers/providers/api/hospitals_provider.dart'; import '../../../../controllers/providers/api/hospitals_provider.dart';
import '../../../../extensions/text_extensions.dart'; import '../../../../extensions/text_extensions.dart';
@ -69,7 +57,7 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
void initState() { void initState() {
super.initState(); super.initState();
if (widget.gasRefillModel != null) { if (widget.gasRefillModel != null) {
_formModel = widget.gasRefillModel; _formModel.fromGasRefillModel(widget.gasRefillModel);
} }
} }
@ -83,22 +71,7 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
if (!(await _addNewModel(context))) return; if (!(await _addNewModel(context))) return;
} }
//_isLoading = true;
setState(() {}); setState(() {});
// if (widget.gasRefillModel != null) {
// if (!(await _formModel.validate(context))) {
// _isLoading = false;
// setState(() {});
// return;
// }
// }
//if(!(_formKey.currentState.validate())) return;
// if (_gasRefillProvider.department?.name == null) {
// ScaffoldMessenger.of(context).showSnackBar(const SnackBar(content: Text("Select department")));
// _isLoading = false;
// setState(() {});
// return;
// }
int status = widget.gasRefillModel == null int status = widget.gasRefillModel == null
? null /*await _gasRefillProvider.createModel( ? null /*await _gasRefillProvider.createModel(
@ -199,11 +172,10 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
isFailedLoading: false, isFailedLoading: false,
stateCode: 200, stateCode: 200,
onRefresh: () async {}, onRefresh: () async {},
child: SingleChildScrollView( child: Column(
child: Column( children: [
mainAxisAlignment: MainAxisAlignment.spaceBetween, SingleChildScrollView(
children: [ child: Column(
Column(
children: [ children: [
Container( Container(
width: MediaQuery.of(context).size.width, width: MediaQuery.of(context).size.width,
@ -219,6 +191,7 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
children: [ children: [
Text(context.translation.gasRefill, style: AppTextStyles.heading5.copyWith(color: const Color(0xFF3B3D4A))), Text(context.translation.gasRefill, style: AppTextStyles.heading5.copyWith(color: const Color(0xFF3B3D4A))),
8.height, 8.height,
/// TBD
Text( Text(
'Gas Request:', 'Gas Request:',
style: AppTextStyles.bodyText.copyWith(color: Color(0xFF757575)), style: AppTextStyles.bodyText.copyWith(color: Color(0xFF757575)),
@ -252,7 +225,7 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
SingleItemDropDownMenu<Lookup,GasStatusProvider >( SingleItemDropDownMenu<Lookup,GasStatusProvider >(
context: context, context: context,
title: context.translation.reportStatus, title: context.translation.reportStatus,
initialValue: _formModel.status, initialValue: widget.gasRefillModel.status,
onSelect: (value) { onSelect: (value) {
_formModel.status=value; _formModel.status=value;
}, },
@ -278,13 +251,13 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
}, },
), ),
], ],
).paddingAll(16), ).paddingAll(16)
AButton( ).expanded,
text: widget.gasRefillModel == null ? context.translation.submit : context.translation.update, AppFilledButton(
onPressed:()async{_onSubmit.call(context);}, label: widget.gasRefillModel == null ? context.translation.submit : context.translation.update,
).paddingAll(16), onPressed:()async{_onSubmit.call(context);},
], ).paddingAll(16),
), ],
) )
), ),
), ),

@ -171,11 +171,7 @@ class CreateServiceRequestPageState extends State<CreateServiceRequestPage> {
}, },
), ),
8.height, 8.height,
MultiFilesPicker( MultiFilesPicker(label: context.translation.attachImage, files: _deviceImages),
label: context.translation.attachImage,
onlyImages: true,
files: _deviceImages,
),
((_serviceRequest.devicePhotos?.isNotEmpty ?? false) ? 16 : 8).height, ((_serviceRequest.devicePhotos?.isNotEmpty ?? false) ? 16 : 8).height,
Align( Align(
alignment: AlignmentDirectional.centerStart, alignment: AlignmentDirectional.centerStart,
@ -186,6 +182,10 @@ class CreateServiceRequestPageState extends State<CreateServiceRequestPage> {
controller: _commentController, controller: _commentController,
labelText: context.translation.comments, labelText: context.translation.comments,
suffixIcon: "warning".toSvgAsset(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20, width: 24).paddingOnly(end: 16), suffixIcon: "warning".toSvgAsset(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20, width: 24).paddingOnly(end: 16),
initialValue: _serviceRequest.callComments,
onSaved: (text) {
_serviceRequest.callComments = text;
},
), ),
8.height, 8.height,
RecordSound( RecordSound(

@ -93,9 +93,9 @@ class ServiceRequestDetailsPage extends StatelessWidget {
Column( Column(
crossAxisAlignment: CrossAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end,
children: [ children: [
if (_userProvider.user.type == UsersTypes.engineer) if (_userProvider.user.type == UsersTypes.normal_user)
"edit".toSvgAsset(width: 48).onPress(() { "edit".toSvgAsset(width: 48).onPress(() {
Navigator.push(context, MaterialPageRoute(builder: (context) => const UpdateServiceRequestPage())); Navigator.push(context, MaterialPageRoute(builder: (context) => UpdateServiceRequestPage(serviceRequest: serviceRequest)));
}), }),
if (_userProvider.user.type == UsersTypes.engineer) 16.height, if (_userProvider.user.type == UsersTypes.engineer) 16.height,
Text(serviceRequest.date.toServiceRequestCardFormat, textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: const Color(0xFF3B3D4A))), Text(serviceRequest.date.toServiceRequestCardFormat, textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: const Color(0xFF3B3D4A))),

@ -1,20 +1,172 @@
import 'dart:convert';
import 'dart:io';
import 'package:flutter/material.dart'; 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/user_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/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/service_request/service_request.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';
class UpdateServiceRequestPage extends StatelessWidget { 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_lazy_loading.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/equipment_status_provider.dart';
import '../../../../providers/service_request_providers/priority_provider.dart';
import '../../../../providers/service_request_providers/requested_through_provider.dart';
import '../../../../providers/service_request_providers/type_of_request_provider.dart';
import '../../../widgets/equipment/pick_asset.dart';
import '../../../widgets/images/multi_image_picker.dart';
import '../../../widgets/sound/record_sound.dart';
class UpdateServiceRequestPage extends StatefulWidget {
static const String id = "/update_service_request_page"; static const String id = "/update_service_request_page";
const UpdateServiceRequestPage({Key key}) : super(key: key); final ServiceRequest serviceRequest;
const UpdateServiceRequestPage({Key key, this.serviceRequest}) : super(key: key);
@override
State<UpdateServiceRequestPage> createState() => _UpdateServiceRequestPageState();
}
class _UpdateServiceRequestPageState extends State<UpdateServiceRequestPage> {
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
TextEditingController _commentController;
List<File> _deviceImages = [];
UserProvider _userProvider;
@override
void initState() {
super.initState();
_deviceImages = widget.serviceRequest.devicePhotos.map((e) => File(e)).toList();
_commentController = TextEditingController(text: widget.serviceRequest.callComments ?? "");
}
@override
void dispose() {
_commentController.dispose();
super.dispose();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_userProvider = Provider.of<UserProvider>(context, listen: false);
return Scaffold( return Scaffold(
appBar: DefaultAppBar(title: context.translation.updateServiceRequest), appBar: DefaultAppBar(title: context.translation.updateServiceRequest),
body: SafeArea( body: SafeArea(
child: Column( child: Form(
children: [], key: _formKey,
), child: Column(
children: [
SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
PickAsset(
editable: false,
device: widget.serviceRequest.device,
onPickAsset: (asset) {
widget.serviceRequest.device = asset;
setState(() {});
},
),
8.height,
SingleItemDropDownMenu<Lookup, PriorityProvider>(
context: context,
title: context.translation.priority,
initialValue: widget.serviceRequest?.priority,
onSelect: (value) {
widget.serviceRequest.priority = value;
},
),
8.height,
SingleItemDropDownMenu<Lookup, EquipmentStatusProvider>(
context: context,
title: context.translation.equipmentStatus,
initialValue: widget.serviceRequest?.defectType,
onSelect: (value) {
widget.serviceRequest.defectType = value;
},
),
8.height,
Consumer<RequestedThroughProvider>(builder: (context, snapshot, _) {
return SingleItemDropDownMenu<Lookup, RequestedThroughProvider>(
context: context,
enabled: false,
title: context.translation.requestedThrough,
initialValue: snapshot.items?.firstWhere((element) => element.value == 3, orElse: () => null),
);
}),
8.height,
SingleItemDropDownMenu<Lookup, TypeOfRequestProvider>(
context: context,
title: context.translation.typeOfRequest,
initialValue: widget.serviceRequest?.type,
onSelect: (value) {
widget.serviceRequest.type = value;
},
),
8.height,
MultiFilesPicker(label: context.translation.attachImage, files: _deviceImages),
((widget.serviceRequest.devicePhotos?.isNotEmpty ?? false) ? 16 : 8).height,
Align(
alignment: AlignmentDirectional.centerStart,
child: context.translation.callComments.heading5(context),
),
8.height,
AppTextFormField(
controller: _commentController,
labelText: context.translation.comments,
initialValue: widget.serviceRequest.callComments,
suffixIcon: "warning".toSvgAsset(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20, width: 24).paddingOnly(end: 16),
onSaved: (text) {
widget.serviceRequest.callComments = text;
},
),
8.height,
RecordSound(
onRecord: (audio) {
widget.serviceRequest.audio = audio;
},
enabled: widget.serviceRequest == null ? true : false,
),
16.height,
],
),
).expanded,
AppFilledButton(onPressed: _submit, label: context.translation.updateRequest),
],
),
).paddingOnly(start: 16, end: 16, bottom: 24, top: 16),
), ),
); );
} }
Future<void> _submit() async {
widget.serviceRequest?.requestedThrough = Provider.of<RequestedThroughProvider>(context, listen: false).items?.firstWhere((element) => element.value == 3, orElse: () => null);
if (_formKey.currentState.validate() && await widget.serviceRequest.validateNewRequest(context)) {
_formKey.currentState.save();
widget.serviceRequest.devicePhotos = _deviceImages.map((e) => _isLocalUrl(e.path) ? "${e.path.split("/").last}|${base64Encode(e.readAsBytesSync())}" : e.path).toList();
if (widget.serviceRequest.audio != null) {
if (_isLocalUrl(widget.serviceRequest.audio)) {
final File file = File(widget.serviceRequest.audio);
widget.serviceRequest.audio = "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}";
}
}
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
await Provider.of<ServiceRequestsProvider>(context, listen: false).updateRequest(user: _userProvider.user, request: widget.serviceRequest);
Navigator.of(context).pop();
}
}
bool _isLocalUrl(String url) {
if (url?.isEmpty != false) return false;
return url.startsWith("/") || url.startsWith("file://") || url.substring(1).startsWith(':\\');
}
} }

@ -208,6 +208,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
), ),
8.height, 8.height,
MultiFilesPicker(label: context.translation.attachImage, files: _files), MultiFilesPicker(label: context.translation.attachImage, files: _files),
8.height,
ESignature( ESignature(
title: context.translation.engSign, title: context.translation.engSign,
oldSignature: _serviceReport.engSignature, oldSignature: _serviceReport.engSignature,

@ -1,9 +1,5 @@
import 'package:flutter/material.dart'; 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/service_requests_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/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';
@ -12,29 +8,23 @@ import 'package:test_sa/views/widgets/loaders/failed_loading.dart';
import 'edit_service_report.dart'; import 'edit_service_report.dart';
class FutureServiceReport extends StatefulWidget { class UpdateServiceReport extends StatefulWidget {
final ServiceRequest request; final ServiceRequest request;
final SearchWorkOrder workOrder; final SearchWorkOrder workOrder;
const FutureServiceReport({Key key, this.request, this.workOrder}) : super(key: key); const UpdateServiceReport({Key key, this.request, this.workOrder}) : super(key: key);
@override @override
_FutureServiceReportState createState() => _FutureServiceReportState(); _UpdateServiceReportState createState() => _UpdateServiceReportState();
} }
class _FutureServiceReportState extends State<FutureServiceReport> { class _UpdateServiceReportState extends State<UpdateServiceReport> {
UserProvider _userProvider;
SettingProvider _settingProvider;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_userProvider = Provider.of<UserProvider>(context); ServiceRequestsProvider().getSingleServiceReport(context, reportId: widget.workOrder.id);
_settingProvider = Provider.of<SettingProvider>(context);
ServiceRequestsProvider().getSingleServiceReport(reportId: widget.workOrder.id, user: _userProvider.user, host: _settingProvider.host, subtitle: context.translation);
return Scaffold( return Scaffold(
body: FutureBuilder<ServiceReport>( body: FutureBuilder<ServiceReport>(
future: ServiceRequestsProvider().getSingleServiceReport(reportId: widget.workOrder.id, user: _userProvider.user, host: _settingProvider.host, subtitle: context.translation), future: ServiceRequestsProvider().getSingleServiceReport(context, reportId: widget.workOrder.id),
builder: (BuildContext context, AsyncSnapshot<ServiceReport> snapshot) { builder: (BuildContext context, AsyncSnapshot<ServiceReport> snapshot) {
if (snapshot.hasError) { if (snapshot.hasError) {
return FailedLoading( return FailedLoading(
@ -45,10 +35,7 @@ class _FutureServiceReportState extends State<FutureServiceReport> {
); );
} }
if (snapshot.connectionState == ConnectionState.done) { if (snapshot.connectionState == ConnectionState.done) {
return EditServiceReport( return EditServiceReport(report: snapshot.data, request: widget.request);
report: snapshot.data,
request: widget.request,
);
} }
return const Center(child: ALoading()); return const Center(child: ALoading());
}, },

@ -14,7 +14,7 @@ import '../../../../../controllers/providers/api/user_provider.dart';
import '../../../../../models/enums/user_types.dart'; import '../../../../../models/enums/user_types.dart';
import '../../../../../models/service_request/search_work_order.dart'; import '../../../../../models/service_request/search_work_order.dart';
import '../../../../widgets/requests/request_status.dart'; import '../../../../widgets/requests/request_status.dart';
import 'future_service_report.dart'; import 'update_service_report.dart';
class WorkOrderDetailsPage extends StatelessWidget { class WorkOrderDetailsPage extends StatelessWidget {
static const String id = "/work_order_details_page"; static const String id = "/work_order_details_page";
@ -79,7 +79,7 @@ class WorkOrderDetailsPage extends StatelessWidget {
AppFilledButton( AppFilledButton(
onPressed: () { onPressed: () {
Navigator.of(context).push( Navigator.of(context).push(
MaterialPageRoute(builder: (_) => FutureServiceReport(request: serviceRequest, workOrder: workOrder)), MaterialPageRoute(builder: (_) => UpdateServiceReport(request: serviceRequest, workOrder: workOrder)),
); );
}, },
label: context.translation.updateRequest, label: context.translation.updateRequest,

@ -14,7 +14,7 @@ import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; import 'package:test_sa/new_views/common_widgets/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 'package:test_sa/views/pages/user/requests/work_order/create_service_report.dart'; import 'package:test_sa/views/pages/user/requests/work_order/create_service_report.dart';
import 'package:test_sa/views/pages/user/requests/work_order/future_service_report.dart'; import 'package:test_sa/views/pages/user/requests/work_order/update_service_report.dart';
import 'package:test_sa/views/pages/user/requests/work_order/work_order_details_page.dart'; import 'package:test_sa/views/pages/user/requests/work_order/work_order_details_page.dart';
import 'package:test_sa/views/widgets/requests/request_status.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart';
@ -86,7 +86,7 @@ class WorkOrderListPage extends StatelessWidget {
if (_userProvider.user.type == UsersTypes.engineer && serviceRequest.statusValue != 5 && serviceRequest.statusValue != 3) if (_userProvider.user.type == UsersTypes.engineer && serviceRequest.statusValue != 5 && serviceRequest.statusValue != 3)
"edit".toSvgAsset(height: 48, width: 48).onPress(() { "edit".toSvgAsset(height: 48, width: 48).onPress(() {
Navigator.of(context).push( Navigator.of(context).push(
MaterialPageRoute(builder: (_) => FutureServiceReport(request: serviceRequest, workOrder: workOrders[index])), MaterialPageRoute(builder: (_) => UpdateServiceReport(request: serviceRequest, workOrder: workOrders[index])),
); );
}) })
], ],

@ -1,13 +1,15 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/controllers/providers/api/user_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/string_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/device/asset_transfer.dart'; import 'package:test_sa/models/device/asset_transfer.dart';
import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/models/user.dart';
import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/app_style/sizing.dart';
import '../../../extensions/text_extensions.dart';
import '../../app_style/colors.dart';
import '../requests/request_status.dart';
class DeviceTransferItem extends StatelessWidget { class DeviceTransferItem extends StatelessWidget {
final int index; final int index;
final AssetTransfer item; final AssetTransfer item;
@ -17,21 +19,18 @@ class DeviceTransferItem extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
User _user = Provider.of<UserProvider>(context, listen: false).user;
Color itemColor = index % 2 == 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary;
Color onItemColor = index % 2 != 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary;
return Padding( return Padding(
padding: const EdgeInsets.symmetric(vertical: 4), padding: const EdgeInsets.symmetric(vertical: 4),
child: ElevatedButton( child: ElevatedButton(
style: ElevatedButton.styleFrom( style: ElevatedButton.styleFrom(
padding: EdgeInsets.symmetric(vertical: 8, horizontal: 8), elevation: 0,
backgroundColor: itemColor, padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 8),
shape: RoundedRectangleBorder( backgroundColor: Colors.white,
borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)),
),
), ),
),
//padding: EdgeInsets.symmetric(vertical: 8,horizontal: 8),
onPressed: () { onPressed: () {
onPressed(item); onPressed(item);
}, },
@ -39,115 +38,49 @@ class DeviceTransferItem extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Row( Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
/// TBD
// StatusLabel(
// label: '',
// id: 0,
// textColor: AColors.getPriorityStatusTextColor(0),
// backgroundColor: AColors.getPriorityStatusColor(0)),
8.width,
/// TBD
//StatusLabel(label: '', textColor: AColors.getRequestStatusTextColor(0), backgroundColor: AColors.getRequestStatusColor(0)),
1.width.expanded,
Text(item.createdOn != null ?item.createdOn.toServiceRequestCardFormat:"", textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: const Color(0xFF3B3D4A))),
],
),
8.height,
Text(context.translation.deviceTransferRequest, style: AppTextStyles.heading5.copyWith(color: const Color(0xFF3B3D4A))),
Text(
'${context.translation.from} : ${item.senderAssignedEmployeeName}',
style: AppTextStyles.bodyText.copyWith(color: Color(0xFF757575)),
),
Text(
'${context.translation.to} : ${item.receiverAssignedEmployeeName}',
style: AppTextStyles.bodyText.copyWith(color: Color(0xFF757575)),
),
8.height,
Row(
mainAxisSize: MainAxisSize.min,
children: [ children: [
Expanded( Text(
child: Column( 'View Details',
crossAxisAlignment: CrossAxisAlignment.start, style: AppTextStyles.bodyText.copyWith(color: const Color(0xFF4A8DB7)),
children: [
Text(
/*item.title ??*/ "-----",
style: Theme.of(context).textTheme.headline6.copyWith(color: onItemColor, fontSize: 16, fontWeight: FontWeight.bold),
),
Divider(
color: onItemColor,
),
Text(
/*item.asset?.number ??*/ "-----",
style: Theme.of(context).textTheme.headline6.copyWith(color: onItemColor, fontSize: 16, fontWeight: FontWeight.bold),
),
Divider(
color: onItemColor,
),
Text(
/*item.asset.assetName ??*/ "",
style: Theme.of(context).textTheme.headline6.copyWith(color: onItemColor, fontSize: 16, fontWeight: FontWeight.bold),
),
Divider(
color: onItemColor,
),
Row(
children: [
Expanded(
child: Text(
context.translation.from,
style: Theme.of(context).textTheme.subtitle2.copyWith(
color: onItemColor,
),
),
),
// StatusLabel(
// backgroundColor: AColors.getRequestStatusColor(item.sender.status?.id),
// label: item.sender.status?.name,
// )
],
),
//const SizedBox(height: 8,),
// Row(
// children: [
// Expanded(
// child: Text(
// item.sender.client.name,
// style: Theme.of(context).textTheme.subtitle2.copyWith(
// color: onItemColor,
// ),
// ),
// ),
// ],
// ),
// if (item.sender.department.id != null)
// Text(
// item.sender.department.name,
// style: Theme.of(context).textTheme.bodySmall.copyWith(
// color: onItemColor,
// ),
// ),
Divider(
color: onItemColor,
),
// Row(
// children: [
// Expanded(
// child: Text(
// context.translation.to,
// style: Theme.of(context).textTheme.subtitle2.copyWith(
// color: onItemColor,
// ),
// ),
// ),
// StatusLabel(
// backgroundColor: AColors.getRequestStatusColor(item.receiver.status?.id),
// label: item.receiver.status?.name,
// )
// ],
// ),
// //const SizedBox(height: 8,),
// Row(
// children: [
// Expanded(
// child: Text(
// item.receiver.client.name,
// style: Theme.of(context).textTheme.subtitle2.copyWith(
// color: onItemColor,
// ),
// ),
// ),
// ],
// ),
// if (item.receiver.department.id != null)
// Text(
// item.receiver.department.name,
// style: Theme.of(context).textTheme.bodySmall.copyWith(
// color: onItemColor,
// ),
// ),
//Divider(color: onItemColor,),
],
),
), ),
4.width,
const Icon(
Icons.arrow_forward,
color: Color(0xFF4A8DB7),
size: 14,
)
], ],
), ),
], ],
), )
), ),
); );
} }

@ -6,6 +6,8 @@ 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/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/app_style/app_color.dart';
import '../loaders/image_loader.dart';
class ESignature extends StatefulWidget { class ESignature extends StatefulWidget {
final String oldSignature; final String oldSignature;
final Uint8List newSignature; final Uint8List newSignature;
@ -34,8 +36,6 @@ class _ESignatureState extends State<ESignature> {
void initState() { void initState() {
if (widget.newSignature != null) { if (widget.newSignature != null) {
signature = widget.newSignature; signature = widget.newSignature;
} else if (widget.oldSignature != null || signature != null) {
signature = widget.oldSignature.codeUnits;
} }
super.initState(); super.initState();
} }
@ -48,114 +48,111 @@ class _ESignatureState extends State<ESignature> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Column( return FormField<String>(onSaved: (_) async {
children: [ widget.onSaved(signature);
// if (widget.oldSignature != null || signature != null) }, builder: (FormFieldState<String> state) {
// Container( return Column(
// width: MediaQuery.of(context).size.width, children: [
// padding: const EdgeInsets.only(bottom: 8), Container(
// height: 90 * AppStyle.getScaleFactor(context), width: MediaQuery.of(context).size.width,
// child: signature != null ? Image.memory(signature) : ImageLoader(boxFit: BoxFit.contain, url: widget.oldSignature)), padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight),
FormField<String>(onSaved: (_) async { decoration: BoxDecoration(
widget.onSaved(signature); color: Colors.white,
}, builder: (FormFieldState<String> state) { borderRadius: _editable ? const BorderRadius.only(topLeft: Radius.circular(10), topRight: Radius.circular(10)) : BorderRadius.circular(10),
return Column( boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)],
children: [ ),
Container( child: Column(
width: MediaQuery.of(context).size.width, crossAxisAlignment: CrossAxisAlignment.center,
padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight), children: [
decoration: BoxDecoration( Row(
color: Colors.white, crossAxisAlignment: CrossAxisAlignment.start,
borderRadius: _editable ? const BorderRadius.only(topLeft: Radius.circular(10), topRight: Radius.circular(10)) : BorderRadius.circular(10), mainAxisAlignment: MainAxisAlignment.spaceBetween,
boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)],
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
Row( widget.title.tinyFont(context).paddingOnly(top: 8),
crossAxisAlignment: CrossAxisAlignment.start, (!_editable
mainAxisAlignment: MainAxisAlignment.spaceBetween, ? "edit".toSvgAsset(width: 48).paddingOnly(top: 8)
children: [ : Container(
widget.title.tinyFont(context).paddingOnly(top: 8), width: 48.toScreenWidth,
(!_editable height: 48.toScreenWidth,
? "edit".toSvgAsset(width: 48).paddingOnly(top: 8) decoration: BoxDecoration(borderRadius: BorderRadius.circular(100), border: Border.all(color: AppColor.neutral30)),
: Container( padding: const EdgeInsets.all(11),
width: 48.toScreenWidth, margin: const EdgeInsets.only(top: 8),
height: 48.toScreenWidth, child: "done".toSvgAsset(width: 26),
decoration: BoxDecoration(borderRadius: BorderRadius.circular(100), border: Border.all(color: AppColor.neutral30)), ))
padding: const EdgeInsets.all(11), .onPress(() async {
margin: const EdgeInsets.only(top: 8), if (_editable) {
child: "done".toSvgAsset(width: 26), signature = await _controller.toPngBytes();
)) if (widget.onChange != null) {
.onPress(() async { widget.onChange(signature);
if (_editable) { }
signature = await _controller.toPngBytes(); }
if (widget.onChange != null) { _editable = !_editable;
widget.onChange(signature); setState(() {});
} }),
}
_editable = !_editable;
setState(() {});
}),
],
),
AbsorbPointer(
absorbing: !_editable,
child: Signature(
controller: _controller,
height: 135.toScreenHeight,
width: MediaQuery.of(context).size.width - 64.toScreenWidth,
backgroundColor: Colors.transparent,
),
),
], ],
), ),
(widget.oldSignature != null || signature != null || !_editable)
? Container(
height: 135.toScreenHeight,
width: MediaQuery.of(context).size.width,
padding: const EdgeInsets.only(bottom: 8),
child: signature != null ? Image.memory(signature) : ImageLoader(boxFit: BoxFit.contain, url: widget.oldSignature),
)
: AbsorbPointer(
absorbing: !_editable,
child: Signature(
controller: _controller,
height: 135.toScreenHeight,
width: MediaQuery.of(context).size.width - 64.toScreenWidth,
backgroundColor: Colors.transparent,
),
),
],
),
),
if (_editable)
Container(
decoration: const BoxDecoration(
color: AppColor.neutral30,
borderRadius: BorderRadius.only(bottomLeft: Radius.circular(10), bottomRight: Radius.circular(10)),
), ),
if (_editable) child: Row(
Container( children: [
decoration: const BoxDecoration( "clear".toSvgAsset(width: 14).paddingOnly(start: 16).onPress(() {
color: AppColor.neutral30, _controller.clear();
borderRadius: BorderRadius.only(bottomLeft: Radius.circular(10), bottomRight: Radius.circular(10)), }),
), 35.width,
child: Row( "back".toSvgAsset(width: 17).onPress(() {
children: [ _controller.undo();
"clear".toSvgAsset(width: 14).paddingOnly(start: 16).onPress(() { }),
_controller.clear(); 27.width,
}), "redo".toSvgAsset(width: 17).onPress(() {
35.width, _controller.redo();
"back".toSvgAsset(width: 17).onPress(() { }),
_controller.undo(); // IconButton(
}), // onPressed: () {
27.width, // _unpaint = !_unpaint;
"redo".toSvgAsset(width: 17).onPress(() { // setState(() {});
_controller.redo(); // },
}), // icon: Icon(
// IconButton( // _unpaint ? Icons.draw : Icons.ac_unit,
// onPressed: () { // color: _unpaint ? AColors.orange : null,
// _unpaint = !_unpaint; // )),
// setState(() {}); // const Spacer(),
// }, // IconButton(
// icon: Icon( // onPressed: () async {
// _unpaint ? Icons.draw : Icons.ac_unit, // signature = await _controller.toPngBytes();
// color: _unpaint ? AColors.orange : null, // if (widget.onChange != null) {
// )), // widget.onChange(signature);
// const Spacer(), // }
// IconButton( // setState(() {});
// onPressed: () async { // },
// signature = await _controller.toPngBytes(); // icon: const Icon(Icons.check)),
// if (widget.onChange != null) { ],
// widget.onChange(signature); ).paddingOnly(top: 12, bottom: 12),
// } )
// setState(() {}); ],
// }, );
// icon: const Icon(Icons.check)), });
],
).paddingOnly(top: 12, bottom: 12),
)
],
);
}),
],
);
} }
} }

@ -12,36 +12,38 @@ import '../../../new_views/common_widgets/asset_info_card.dart';
class PickAsset extends StatelessWidget { class PickAsset extends StatelessWidget {
final Function(Asset) onPickAsset; final Function(Asset) onPickAsset;
final Asset device; final Asset device;
final bool editable;
const PickAsset({Key key, this.device, this.onPickAsset}) : super(key: key); const PickAsset({Key key, this.editable = true, this.device, this.onPickAsset}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Column( return Column(
children: [ children: [
Container( if (editable)
decoration: BoxDecoration( Container(
color: Theme.of(context).cardColor, decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10), color: Theme.of(context).cardColor,
boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.03), blurRadius: 14)], borderRadius: BorderRadius.circular(10),
boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.03), blurRadius: 14)],
),
padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight),
child: Row(
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
context.translation.device.tinyFont(context).custom(color: context.isDark ? AppColor.neutral40 : AppColor.neutral50),
context.translation.pickAsset.bodyText(context).custom(color: context.isDark ? AppColor.neutral40 : AppColor.neutral50),
],
).onPress(() async {
Asset device = await Navigator.of(context).pushNamed(SingleDevicePicker.id) as Asset;
onPickAsset(device);
}).expanded,
"qr".toSvgAsset(height: 24, fit: BoxFit.fitHeight, color: context.isDark ? AppColor.primary40 : AppColor.primary70),
],
),
), ),
padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight),
child: Row(
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
context.translation.device.tinyFont(context).custom(color: context.isDark ? AppColor.neutral40 : AppColor.neutral50),
context.translation.pickAsset.bodyText(context).custom(color: context.isDark ? AppColor.neutral40 : AppColor.neutral50),
],
).onPress(() async {
Asset device = await Navigator.of(context).pushNamed(SingleDevicePicker.id) as Asset;
onPickAsset(device);
}).expanded,
"qr".toSvgAsset(height: 24, fit: BoxFit.fitHeight, color: context.isDark ? AppColor.primary40 : AppColor.primary70),
],
),
),
if (device != null) AssetInfoCard(asset: device).paddingOnly(top: 8), if (device != null) AssetInfoCard(asset: device).paddingOnly(top: 8),
], ],
); );

Loading…
Cancel
Save