some changes

ai_enhancement_fcm_grouping
nextwo 3 years ago
commit be636bb18b

@ -73,7 +73,7 @@
"deviceImages": "Asset Images", "deviceImages": "Asset Images",
"deviceModel": "Asset Model", "deviceModel": "Asset Model",
"deviceRequired": "Asset Required", "deviceRequired": "Asset Required",
"deviceSN": "Asset SN", "deviceSN": "Asset Serial Number",
"engineerName": "Engineer Name", "engineerName": "Engineer Name",
"engineerPhone": "Engineer Phone", "engineerPhone": "Engineer Phone",
"facebook": "facebook", "facebook": "facebook",

@ -1,5 +1,7 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:developer';
import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:fluttertoast/fluttertoast.dart'; import 'package:fluttertoast/fluttertoast.dart';
import 'package:http/http.dart' as http; import 'package:http/http.dart' as http;
@ -21,7 +23,6 @@ class ApiManager {
Future<http.Response> get( Future<http.Response> get(
String url, { String url, {
Map<String, String> headers, Map<String, String> headers,
enableToastMessage = true,
}) async { }) async {
headers ??= {}; headers ??= {};
@ -33,7 +34,7 @@ class ApiManager {
http.Response response = await http.get(_url, headers: headers); http.Response response = await http.get(_url, headers: headers);
if (jsonDecode(response.body) is Map<String, dynamic>) { if (jsonDecode(response.body) is Map<String, dynamic>) {
final message = jsonDecode(response.body)["message"]; final message = jsonDecode(response.body)["message"];
if (message != null && message.toString().isNotEmpty && enableToastMessage) { if (message != null && message.toString().isNotEmpty) {
Fluttertoast.showToast(msg: message ?? "", toastLength: Toast.LENGTH_LONG); Fluttertoast.showToast(msg: message ?? "", toastLength: Toast.LENGTH_LONG);
} }
} }

@ -87,7 +87,6 @@ class URLs {
static get requestDeviceTransfer => "$_baseUrl/AssetTransfer/AddAssetTransfer"; // get static get requestDeviceTransfer => "$_baseUrl/AssetTransfer/AddAssetTransfer"; // get
static get updateDeviceTransfer => "$_baseUrl/AssetTransfer/UpdateAssetTransfer"; // get static get updateDeviceTransfer => "$_baseUrl/AssetTransfer/UpdateAssetTransfer"; // get
static get getDeviceTransfer => "$_baseUrl/AssetTransfer/GetAssetTransfers"; // get static get getDeviceTransfer => "$_baseUrl/AssetTransfer/GetAssetTransfers"; // get
static get getAssetTransferById => "$_baseUrl/AssetTransfer/GetAssetTransferById"; // get
// employee // employee
static get getEmployees => "$_baseUrl/Lookups/GetLookup?lookupEnum=33"; // get static get getEmployees => "$_baseUrl/Lookups/GetLookup?lookupEnum=33"; // get

@ -60,11 +60,9 @@ class DeviceTransferProvider extends ChangeNotifier {
Future<int> getRequests({ Future<int> getRequests({
@required String host, @required String host,
@required User user, @required User user,
bool mostRecent,
}) async { }) async {
if (isLoading == true) return -2; if (isLoading == true) return -2;
isLoading = true; isLoading = true;
notifyListeners();
Response response; Response response;
try { try {
Map<String, dynamic> body = {}; Map<String, dynamic> body = {};
@ -83,7 +81,6 @@ class DeviceTransferProvider extends ChangeNotifier {
List<DeviceTransfer> itemsPage = listJson.map((request) => DeviceTransfer.fromJson(request)).toList(); List<DeviceTransfer> itemsPage = listJson.map((request) => DeviceTransfer.fromJson(request)).toList();
items ??= []; items ??= [];
items.addAll(itemsPage); items.addAll(itemsPage);
sortMostRecent(items, mostRecent);
print(listJson); print(listJson);
if (itemsPage.length == pageItemNumber) { if (itemsPage.length == pageItemNumber) {
nextPage = true; nextPage = true;
@ -102,30 +99,6 @@ class DeviceTransferProvider extends ChangeNotifier {
} }
} }
void sortMostRecent(List<DeviceTransfer> transfer, bool mostRecent) {
if (mostRecent != null) {
transfer.sort((prev, next) =>
(mostRecent ?? false) ? DateTime.tryParse(next.createdOn).compareTo(DateTime.tryParse(prev.createdOn)) : DateTime.tryParse(prev.createdOn).compareTo(DateTime.tryParse(next.createdOn)));
}
}
Future<DeviceTransfer> getRequestById({int assetTransferId}) async {
Response response;
try {
response = await ApiManager.instance.get(
URLs.getAssetTransferById + "?assetTransferId=$assetTransferId",
enableToastMessage: false,
);
if (response.statusCode >= 200 && response.statusCode < 300) {
return DeviceTransfer.fromJson(json.decode(response.body)["data"]);
}
return null;
} catch (error) {
print(error);
return null;
}
}
Future<int> createRequest({ Future<int> createRequest({
@required String host, @required String host,
@required User user, @required User user,

@ -17,20 +17,25 @@ class DevicesProvider extends ChangeNotifier {
final pageItemNumber = 10; final pageItemNumber = 10;
bool nextPage = true; bool nextPage = true;
// state code of current request to defied error message // state code of current request to defied error message
// like 400 customer request failed // like 400 customer request failed
// 500 service not available // 500 service not available
int _stateCode; int _stateCode;
int get stateCode => _stateCode; int get stateCode => _stateCode;
List<Device> _devices = []; List<Device> _devices = [];
List<Device> get devices => _devices; List<Device> get devices => _devices;
// when categories in-process _loading = true // when categories in-process _loading = true
// done _loading = true // done _loading = true
// failed _loading = false // failed _loading = false
bool _loading; bool _loading;
bool get isLoading => _loading; bool get isLoading => _loading;
set isLoading(bool isLoading) { set isLoading(bool isLoading) {
_loading = isLoading; _loading = isLoading;
notifyListeners(); notifyListeners();
@ -70,7 +75,7 @@ class DevicesProvider extends ChangeNotifier {
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received // client's request was successfully received
List equipmentListJson = json.decode(response.body)["data"]; List equipmentListJson = json.decode(response.body)["data"];
_devices.addAll(equipmentListJson.map<Device>((device) => Device.fromJson(device, startKeyWithDest: false)).toList()); _devices.addAll(equipmentListJson.map<Device>((device) => Device.fromJson(device)).toList());
nextPage = true; nextPage = true;
} else { } else {
nextPage = false; nextPage = false;
@ -111,8 +116,8 @@ class DevicesProvider extends ChangeNotifier {
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received // client's request was successfully received
List equipmentListJson = json.decode(response.body)["data"]; List equipmentListJson = json.decode(response.body)["data"];
page = equipmentListJson.map((device) => Device.fromJson(device, startKeyWithDest: false)).toList(); page = equipmentListJson.map((device) => Device.fromJson(device)).toList();
_devices.addAll(equipmentListJson.map<Device>((device) => Device.fromJson(device, startKeyWithDest: false)).toList()); _devices.addAll(equipmentListJson.map<Device>((device) => Device.fromJson(device)).toList());
notifyListeners(); notifyListeners();
} }
return page; return page;
@ -147,31 +152,31 @@ class DevicesProvider extends ChangeNotifier {
} }
} }
// /// return -2 if request in progress // /// return -2 if request in progress
// /// return -1 if error happen when sending request // /// return -1 if error happen when sending request
// /// return state code if request complete may be 200, 404 or 403 // /// return state code if request complete may be 200, 404 or 403
// /// for more details check http state manager // /// for more details check http state manager
// /// lib\controllers\http_status_manger\http_status_manger.dart // /// lib\controllers\http_status_manger\http_status_manger.dart
// Future<List<Device>> getDevicesListBySN({@required String host, @required User user, @required int hospitalId, @required String sn}) async { // Future<List<Device>> getDevicesListBySN({@required String host, @required User user, @required int hospitalId, @required String sn}) async {
// Response response; // Response response;
// try { // try {
// response = await get( // response = await get(
// Uri.parse(URLs.getEquipment + "?client=$hospitalId" + (sn == null || sn.isEmpty ? "" : "&serial_qr=$sn")), // Uri.parse(URLs.getEquipment + "?client=$hospitalId" + (sn == null || sn.isEmpty ? "" : "&serial_qr=$sn")),
// ); // );
// //
// _stateCode = response.statusCode; // _stateCode = response.statusCode;
// List<Device> _page = []; // List<Device> _page = [];
// if (response.statusCode >= 200 && response.statusCode < 300) { // if (response.statusCode >= 200 && response.statusCode < 300) {
// // client's request was successfully received // // client's request was successfully received
// List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); // List categoriesListJson = json.decode(utf8.decode(response.bodyBytes));
// _page = categoriesListJson.map((device) => Device.fromJson(device)).toList(); // _page = categoriesListJson.map((device) => Device.fromJson(device)).toList();
// } // }
// return _page; // return _page;
// } catch (error) { // } catch (error) {
// _loading = false; // _loading = false;
// _stateCode = -1; // _stateCode = -1;
// notifyListeners(); // notifyListeners();
// return []; // return [];
// } // }
// } // }
} }

@ -6,7 +6,6 @@ import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/gas_refill/gas_refill_model.dart'; import 'package:test_sa/models/gas_refill/gas_refill_model.dart';
import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/hospital.dart';
import 'package:test_sa/models/timer_model.dart';
import 'package:test_sa/models/user.dart'; import 'package:test_sa/models/user.dart';
class GasRefillProvider extends ChangeNotifier { class GasRefillProvider extends ChangeNotifier {
@ -48,11 +47,9 @@ class GasRefillProvider extends ChangeNotifier {
Future<int> getRequests({ Future<int> getRequests({
@required String host, @required String host,
@required User user, @required User user,
bool mostRecent,
}) async { }) async {
if (isLoading == true) return -2; if (isLoading == true) return -2;
isLoading = true; isLoading = true;
notifyListeners();
Response response; Response response;
Map<String, dynamic> body = {}; Map<String, dynamic> body = {};
@ -69,13 +66,8 @@ class GasRefillProvider extends ChangeNotifier {
// client's request was successfully received // client's request was successfully received
List requestsListJson = json.decode(response.body)["data"]; List requestsListJson = json.decode(response.body)["data"];
List<GasRefillModel> itemsPage = requestsListJson.map((request) => GasRefillModel.fromJson(request)).toList(); List<GasRefillModel> itemsPage = requestsListJson.map((request) => GasRefillModel.fromJson(request)).toList();
if (mostRecent != null) { items ??= [];
items = [];
} else {
items ??= [];
}
items.addAll(itemsPage); items.addAll(itemsPage);
sortMostRecent(items, mostRecent);
if (itemsPage.length == pageItemNumber) { if (itemsPage.length == pageItemNumber) {
nextPage = true; nextPage = true;
} else { } else {
@ -94,17 +86,12 @@ class GasRefillProvider extends ChangeNotifier {
} }
} }
void sortMostRecent(List<GasRefillModel> models, bool mostRecent) {
if (mostRecent != null) {
models.sort((prev, next) => (mostRecent ?? false) ? next.title.compareTo(prev.title) : prev.title.compareTo(next.title));
}
}
Future<int> createModel({ Future<int> createModel({
@required String host, @required String host,
@required User user, @required User user,
@required GasRefillModel model, @required GasRefillModel model,
}) async { }) async {
print("ss");
Map<String, dynamic> body = { Map<String, dynamic> body = {
"uid": user.id.toString(), "uid": user.id.toString(),
"token": user.token ?? "", "token": user.token ?? "",
@ -121,6 +108,7 @@ class GasRefillProvider extends ChangeNotifier {
"GazRefillNo": "GR-${DateTime.now().toString().split(" ").first}", "GazRefillNo": "GR-${DateTime.now().toString().split(" ").first}",
"status": model.status.toMap(), "status": model.status.toMap(),
}; };
print("ss1");
body["gazRefillDetails"] = model.details body["gazRefillDetails"] = model.details
.map((model) => { .map((model) => {
"gasType": model.type.toMap(), "gasType": model.type.toMap(),
@ -133,6 +121,7 @@ class GasRefillProvider extends ChangeNotifier {
Response response; Response response;
try { try {
response = await ApiManager.instance.post(URLs.requestGasRefill, body: body); response = await ApiManager.instance.post(URLs.requestGasRefill, body: body);
print("ss2");
stateCode = response.statusCode; stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
if (items != null) { if (items != null) {
@ -157,14 +146,13 @@ class GasRefillProvider extends ChangeNotifier {
"id": newModel.id, "id": newModel.id,
"gazRefillNo": newModel.title ?? "", "gazRefillNo": newModel.title ?? "",
"status": newModel.status.toMap(), "status": newModel.status.toMap(),
"expectedDate": newModel.expectedDate?.toIso8601String(), "expectedDate": oldModel.expectedDate?.toIso8601String(),
"expectedTime": newModel.expectedDate?.toIso8601String(), "expectedTime": oldModel.expectedDate?.toIso8601String(),
"startDate": newModel.startDate?.toIso8601String(), "startDate": startDate?.toIso8601String(),
"startTime": newModel.startDate?.toIso8601String(), "startTime": startDate?.toIso8601String(),
"endDate": newModel.endDate?.toIso8601String(), "endDate": endDate?.toIso8601String(),
"endTime": newModel.endDate?.toIso8601String(), "endTime": endDate?.toIso8601String(),
// "workingHours": ((endDate?.difference(startDate)?.inMinutes ?? 0) / 60), "workingHours": ((endDate?.difference(startDate)?.inMinutes ?? 0) / 60),
'workingHours': newModel.workingHours,
"assignedEmployee": oldModel?.assignedEmployee?.id == null ? null : oldModel?.assignedEmployee?.toJson(), "assignedEmployee": oldModel?.assignedEmployee?.id == null ? null : oldModel?.assignedEmployee?.toJson(),
"site": hospital?.toMap(), "site": hospital?.toMap(),
"building": building?.toJson(includeFloors: false), "building": building?.toJson(includeFloors: false),
@ -210,5 +198,4 @@ class GasRefillProvider extends ChangeNotifier {
DateTime expectedDateTime; DateTime expectedDateTime;
DateTime startDate; DateTime startDate;
DateTime endDate; DateTime endDate;
TimerModel timer;
} }

@ -22,22 +22,27 @@ class HospitalsProvider extends ChangeNotifier {
// like 400 customer request failed // like 400 customer request failed
// 500 service not available // 500 service not available
int _stateCode; int _stateCode;
int get stateCode => _stateCode; int get stateCode => _stateCode;
// true if there is next page in product list and false if not // true if there is next page in product list and false if not
bool _nextPage = true; bool _nextPage = true;
bool get nextPage => _nextPage; bool get nextPage => _nextPage;
// contain user data // contain user data
// when user not login or register _user = null // when user not login or register _user = null
List<Hospital> _hospitals; List<Hospital> _hospitals;
List<Hospital> get hospitals => _hospitals; List<Hospital> get hospitals => _hospitals;
// when categories in-process _loading = true // when categories in-process _loading = true
// done _loading = true // done _loading = true
// failed _loading = false // failed _loading = false
bool _loading; bool _loading;
bool get isLoading => _loading; bool get isLoading => _loading;
set isLoading(bool isLoading) { set isLoading(bool isLoading) {
_loading = isLoading; _loading = isLoading;
notifyListeners(); notifyListeners();

@ -22,22 +22,27 @@ class PartsProvider extends ChangeNotifier {
// like 400 customer request failed // like 400 customer request failed
// 500 service not available // 500 service not available
int _stateCode; int _stateCode;
int get stateCode => _stateCode; int get stateCode => _stateCode;
// true if there is next page in product list and false if not // true if there is next page in product list and false if not
bool _nextPage = true; bool _nextPage = true;
bool get nextPage => _nextPage; bool get nextPage => _nextPage;
// contain user data // contain user data
// when user not login or register _user = null // when user not login or register _user = null
List<Part> _parts; List<Part> _parts;
List<Part> get parts => _parts; List<Part> get parts => _parts;
// when categories in-process _loading = true // when categories in-process _loading = true
// done _loading = true // done _loading = true
// failed _loading = false // failed _loading = false
bool _loading; bool _loading;
bool get isLoading => _loading; bool get isLoading => _loading;
set isLoading(bool isLoading) { set isLoading(bool isLoading) {
_loading = isLoading; _loading = isLoading;
notifyListeners(); notifyListeners();
@ -88,7 +93,10 @@ class PartsProvider extends ChangeNotifier {
Future<List<Part>> getPartsList({String host, User user, String title}) async { Future<List<Part>> getPartsList({String host, User user, String title}) async {
Response response; Response response;
try { try {
response = await ApiManager.instance.post(URLs.getPartNumber, body: {if (title != null && title.isNotEmpty) "partName": title}); if (int.tryParse(title) != null)
response = await ApiManager.instance.post(URLs.getPartNumber, body: {if (title != null && title.isNotEmpty) "partNo": title});
else
response = await ApiManager.instance.post(URLs.getPartNumber, body: {if (title != null && title.isNotEmpty) "partName": title});
List<Part> _page = []; List<Part> _page = [];
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received // client's request was successfully received

@ -79,7 +79,6 @@ class RegularVisitsProvider extends ChangeNotifier {
List requestsListJson = json.decode(response.body)["data"]; List requestsListJson = json.decode(response.body)["data"];
List<Visit> _visits = requestsListJson.map((request) => Visit.fromJson(request)).toList(); List<Visit> _visits = requestsListJson.map((request) => Visit.fromJson(request)).toList();
visits ??= []; visits ??= [];
sortMostRecent(_visits);
visits.addAll(_visits); visits.addAll(_visits);
if (_visits.length == pageItemNumber) { if (_visits.length == pageItemNumber) {
nextPage = true; nextPage = true;
@ -99,12 +98,6 @@ class RegularVisitsProvider extends ChangeNotifier {
return response.statusCode; return response.statusCode;
} }
void sortMostRecent(List<Visit> visits) {
visits.sort((prev, next) => (visitsSearch.mostRecent ?? false)
? DateTime.tryParse(next.createdOn).compareTo(DateTime.tryParse(prev.createdOn))
: DateTime.tryParse(prev.createdOn).compareTo(DateTime.tryParse(next.createdOn)));
}
/// return -2 if request in progress /// return -2 if request in progress
/// return -1 if error happen when sending request /// return -1 if error happen when sending request
/// return state code if request complete may be 200, 404 or 403 /// return state code if request complete may be 200, 404 or 403

@ -76,7 +76,6 @@ class ServiceRequestsProvider extends ChangeNotifier {
List requestsListJson = json.decode(response.body)["data"]; List requestsListJson = json.decode(response.body)["data"];
List<ServiceRequest> serviceRequestsPage = requestsListJson.map((request) => ServiceRequest.fromJson(request)).toList(); List<ServiceRequest> serviceRequestsPage = requestsListJson.map((request) => ServiceRequest.fromJson(request)).toList();
serviceRequests ??= []; serviceRequests ??= [];
sortMostRecent(serviceRequestsPage);
serviceRequests.addAll(serviceRequestsPage); serviceRequests.addAll(serviceRequestsPage);
if (serviceRequestsPage.length == pageItemNumber) { if (serviceRequestsPage.length == pageItemNumber) {
nextPage = true; nextPage = true;
@ -95,12 +94,6 @@ class ServiceRequestsProvider extends ChangeNotifier {
} }
} }
void sortMostRecent(List<ServiceRequest> requests) {
requests.sort(
(prev, next) => (search.mostRecent ?? false) ? DateTime.tryParse(next.date).compareTo(DateTime.tryParse(prev.date)) : DateTime.tryParse(prev.date).compareTo(DateTime.tryParse(next.date)),
);
}
Future<ServiceRequest> getSingleServiceRequest({ Future<ServiceRequest> getSingleServiceRequest({
@required String requestId, @required String requestId,
@required String host, @required String host,

@ -13,6 +13,7 @@ class Device {
String destRoom; String destRoom;
String destFloor; String destFloor;
String destSiteName; String destSiteName;
// String brand; // String brand;
// String model; // String model;
ModelDefinition modelDefinition; ModelDefinition modelDefinition;
@ -34,7 +35,7 @@ class Device {
this.modelDefinition, this.modelDefinition,
}); });
factory Device.fromJson(Map<String, dynamic> parsedJson, {bool startKeyWithDest = true}) { factory Device.fromJson(Map<String, dynamic> parsedJson) {
print("parsedJson:$parsedJson"); print("parsedJson:$parsedJson");
return Device( return Device(
id: parsedJson["id"], id: parsedJson["id"],
@ -43,10 +44,10 @@ class Device {
assetName: parsedJson["assetName"], assetName: parsedJson["assetName"],
modelDefinition: ModelDefinition.fromJson(parsedJson["modelDefinition"]), modelDefinition: ModelDefinition.fromJson(parsedJson["modelDefinition"]),
hospital: Hospital.fromJson(parsedJson["site"]), hospital: Hospital.fromJson(parsedJson["site"]),
destBuildingName: startKeyWithDest ? parsedJson["destBuildingName"] : parsedJson['building']['name'], destBuildingName: parsedJson["destBuildingName"],
destDepartmentName: startKeyWithDest ? parsedJson["destDepartmentName"] : parsedJson['department']['departmentName'], destDepartmentName: parsedJson["destDepartmentName"],
destRoom: startKeyWithDest ? parsedJson["destRoom"] : parsedJson['room'], destRoom: parsedJson["destRoom"],
destFloor: startKeyWithDest ? parsedJson["destFloor"] : parsedJson['floor']['name'], destFloor: parsedJson["destFloor"],
destSiteName: parsedJson['destSiteName'] destSiteName: parsedJson['destSiteName']
// parsedJson["modelDefinition"] == null ? "" : // parsedJson["modelDefinition"] == null ? "" :
// parsedJson["modelDefinition"]["manufacturerName"], // parsedJson["modelDefinition"]["manufacturerName"],

@ -14,7 +14,6 @@ class DeviceTransfer {
Device device; Device device;
DeviceTransferInfo sender; DeviceTransferInfo sender;
DeviceTransferInfo receiver; DeviceTransferInfo receiver;
String createdOn;
DeviceTransfer({ DeviceTransfer({
this.id, this.id,
@ -23,7 +22,6 @@ class DeviceTransfer {
this.userId, this.userId,
this.sender, this.sender,
this.receiver, this.receiver,
this.createdOn,
}); });
bool validate() { bool validate() {
@ -42,7 +40,6 @@ class DeviceTransfer {
final receiver = DeviceTransferInfo(); final receiver = DeviceTransferInfo();
receiver.fromDetails(old.receiver); receiver.fromDetails(old.receiver);
this.receiver = receiver; this.receiver = receiver;
createdOn = old.createdOn;
} }
factory DeviceTransfer.fromJson(Map<String, dynamic> parsedJson) { factory DeviceTransfer.fromJson(Map<String, dynamic> parsedJson) {
@ -50,7 +47,6 @@ class DeviceTransfer {
id: parsedJson["id"], id: parsedJson["id"],
title: parsedJson["transferCode"], title: parsedJson["transferCode"],
userId: parsedJson["uid"], userId: parsedJson["uid"],
createdOn: parsedJson['createdOn'],
device: Device( device: Device(
id: parsedJson["assetId"], id: parsedJson["assetId"],
number: parsedJson["assetNumber"], number: parsedJson["assetNumber"],

@ -10,6 +10,7 @@ class DeviceTransferInfo {
Hospital client; Hospital client;
Department department; Department department;
String workingHours; String workingHours;
// DateTime startDate; // DateTime startDate;
// DateTime endDate; // DateTime endDate;
String travelingHours; String travelingHours;

@ -8,6 +8,7 @@ import '../call_request_for_work_order_model.dart';
class GasRefillModel { class GasRefillModel {
int id; int id;
//String userId; //String userId;
String clientName; String clientName;
String title; String title;
@ -21,7 +22,7 @@ class GasRefillModel {
String signatureEngineer; String signatureEngineer;
Uint8List localNurseSignature; Uint8List localNurseSignature;
Uint8List localEngineerSignature; Uint8List localEngineerSignature;
num workingHours;
DateTime startDate, endDate, expectedDate; DateTime startDate, endDate, expectedDate;
GasRefillModel({ GasRefillModel({
@ -42,7 +43,6 @@ class GasRefillModel {
this.signatureEngineer, this.signatureEngineer,
this.localEngineerSignature, this.localEngineerSignature,
this.localNurseSignature, this.localNurseSignature,
this.workingHours,
}); });
bool validate() { bool validate() {
@ -75,7 +75,6 @@ class GasRefillModel {
localNurseSignature = model.localNurseSignature; localNurseSignature = model.localNurseSignature;
signatureEngineer = model.signatureEngineer; signatureEngineer = model.signatureEngineer;
signatureNurse = model.signatureNurse; signatureNurse = model.signatureNurse;
workingHours = model.workingHours;
} }
factory GasRefillModel.fromJson(Map<String, dynamic> parsedJson) { factory GasRefillModel.fromJson(Map<String, dynamic> parsedJson) {
@ -100,7 +99,6 @@ class GasRefillModel {
assignedEmployee: AssignedEmployee.fromJson(parsedJson['assignedEmployee'] ?? {}), assignedEmployee: AssignedEmployee.fromJson(parsedJson['assignedEmployee'] ?? {}),
signatureEngineer: URLs.getFileUrl(parsedJson["engSignature"]), signatureEngineer: URLs.getFileUrl(parsedJson["engSignature"]),
signatureNurse: URLs.getFileUrl(parsedJson["nurseSignature"]), signatureNurse: URLs.getFileUrl(parsedJson["nurseSignature"]),
workingHours: parsedJson["workingHours"],
); );
} }
} }

@ -19,6 +19,7 @@ class Pentry {
String travelingHours; String travelingHours;
String image; String image;
File imageFile; File imageFile;
// List<Contact> contacts; // List<Contact> contacts;
List<PPMCheckList> ppmCheckLists; List<PPMCheckList> ppmCheckLists;
List<CalibrationTool> calibrationTools; List<CalibrationTool> calibrationTools;
@ -101,8 +102,8 @@ class Pentry {
map["vChecklists"] = ppmCheckLists.map((e) => e.toMap(visitId)).toList(); map["vChecklists"] = ppmCheckLists.map((e) => e.toMap(visitId)).toList();
map["vCalibrationTools"] = calibrationTools.map((e) => e.toMap(visitId)).toList(); map["vCalibrationTools"] = calibrationTools.map((e) => e.toMap(visitId)).toList();
map["vKits"] = pmKits.map((e) => e.toMap(visitId)).toList(); map["vKits"] = pmKits.map((e) => e.toMap(visitId)).toList();
map["nurseSignature"] = signatureNurse;//"${DateTime.now().toIso8601String()}.png|$signatureNurse"; map["nurseSignature"] = signatureNurse; //"${DateTime.now().toIso8601String()}.png|$signatureNurse";
map["engSignature"] = signatureEngineer;//"${DateTime.now().toIso8601String()}.png|$signatureEngineer"; map["engSignature"] = signatureEngineer; //"${DateTime.now().toIso8601String()}.png|$signatureEngineer";
return map; return map;
} }

@ -14,6 +14,8 @@ class ServiceReport {
int id; int id;
double operatingHours; double operatingHours;
DateTime visitDate; DateTime visitDate;
DateTime returnToService;
// DateTime endDate; // DateTime endDate;
// DateTime startDate; // DateTime startDate;
Lookup assetType; Lookup assetType;
@ -32,7 +34,7 @@ class ServiceReport {
String invoiceNumber; String invoiceNumber;
String invoiceCode; String invoiceCode;
List<Part> parts; List<Part> parts;
String image; List<String> image;
Device device; Device device;
String quantity; String quantity;
String jobSheetNumber; String jobSheetNumber;
@ -80,12 +82,15 @@ class ServiceReport {
// this.startDate, // this.startDate,
this.reviewComment, this.reviewComment,
this.faultDescription, this.faultDescription,
this.returnToService
}); });
Map<String, dynamic> toMap(ServiceRequest request) { Map<String, dynamic> toMap(ServiceRequest request) {
Map<String, dynamic> _map = {}; Map<String, dynamic> _map = {};
if (id != null) _map["id"] = id; if (id != null) _map["id"] = id;
if (visitDate != null) _map["visitDate"] = visitDate.toIso8601String(); if (visitDate != null) _map["visitDate"] = visitDate.toIso8601String();
if (returnToService != null) _map["replacementDate"] = returnToService.toIso8601String();
//if(serviceType != null) _map["service_type"] = serviceType.id.toString(); //if(serviceType != null) _map["service_type"] = serviceType.id.toString();
if (equipmentStatus != null) _map["equipmentStatus"] = equipmentStatus?.toMap(); if (equipmentStatus != null) _map["equipmentStatus"] = equipmentStatus?.toMap();
if (type != null) _map["typeOfWO"] = type?.toMap(); if (type != null) _map["typeOfWO"] = type?.toMap();
@ -133,9 +138,8 @@ class ServiceReport {
//if(invoiceCode != null) _map["invoice_no"] = invoiceCode; //if(invoiceCode != null) _map["invoice_no"] = invoiceCode;
//if(invoiceNumber != null) _map["invoice_code"] = invoiceNumber; //if(invoiceNumber != null) _map["invoice_code"] = invoiceNumber;
if (image != null) { if (image != null) {
_map["attachmentsWorkOrder"] = [ _map["attachmentsWorkOrder"] = image.map((e) => {"name": e}).toList();
{"name": image} print(_map["attachmentsWorkOrder"]);
];
} }
_map["nurseSignature"] = signatureNurse; _map["nurseSignature"] = signatureNurse;
_map["engSignature"] = signatureEngineer; _map["engSignature"] = signatureEngineer;
@ -161,6 +165,10 @@ class ServiceReport {
await Fluttertoast.showToast(msg: "Visit Date Required"); await Fluttertoast.showToast(msg: "Visit Date Required");
return false; return false;
} }
if (returnToService == null) {
await Fluttertoast.showToast(msg: "return To Service Date Required");
return false;
}
if (timer?.startAt == null) { if (timer?.startAt == null) {
await Fluttertoast.showToast(msg: "Working Hours Required"); await Fluttertoast.showToast(msg: "Working Hours Required");
return false; return false;
@ -220,6 +228,7 @@ class ServiceReport {
travelingHours: parsedJson["travelingHours"], travelingHours: parsedJson["travelingHours"],
travelingExpense: parsedJson["travelingExpenses"], travelingExpense: parsedJson["travelingExpenses"],
visitDate: DateTime.tryParse(parsedJson["visitDate"]), visitDate: DateTime.tryParse(parsedJson["visitDate"]),
returnToService: DateTime.tryParse(parsedJson["replacementDate"]??""),
workingHours: parsedJson["workingHours"], workingHours: parsedJson["workingHours"],
timer: TimerModel( timer: TimerModel(
startAt: DateTime.tryParse(parsedJson["startofWorkTime"] ?? ""), startAt: DateTime.tryParse(parsedJson["startofWorkTime"] ?? ""),

@ -163,6 +163,7 @@ class SearchWorkOrder {
Lookup currentSituation; Lookup currentSituation;
Lookup repairLocation; Lookup repairLocation;
Lookup reason; Lookup reason;
// String startofWorkTime; // String startofWorkTime;
// String endofWorkTime; // String endofWorkTime;
num workingHours; num workingHours;
@ -250,6 +251,7 @@ class SearchWorkOrder {
woParentDto: woParentDto ?? this.woParentDto, woParentDto: woParentDto ?? this.woParentDto,
timer: timer ?? this.timer, timer: timer ?? this.timer,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id ?? 0; map['id'] = id ?? 0;
@ -352,6 +354,7 @@ class WoParentDto {
equipmentStatus = json['equipmentStatus'] != null ? Lookup.fromJson(json['equipmentStatus']) : null; equipmentStatus = json['equipmentStatus'] != null ? Lookup.fromJson(json['equipmentStatus']) : null;
currentSituation = json['currentSituation'] != null ? Lookup.fromJson(json['currentSituation']) : null; currentSituation = json['currentSituation'] != null ? Lookup.fromJson(json['currentSituation']) : null;
} }
Lookup callLastSituation; Lookup callLastSituation;
SupplierModel supplier; SupplierModel supplier;
Lookup assetType; Lookup assetType;
@ -362,6 +365,7 @@ class WoParentDto {
List<SuppEngineerWorkOrders> suppEngineerWorkOrders; List<SuppEngineerWorkOrders> suppEngineerWorkOrders;
Lookup equipmentStatus; Lookup equipmentStatus;
Lookup currentSituation; Lookup currentSituation;
WoParentDto copyWith({ WoParentDto copyWith({
Lookup callLastSituation, Lookup callLastSituation,
SupplierModel supplier, SupplierModel supplier,
@ -386,6 +390,7 @@ class WoParentDto {
equipmentStatus: equipmentStatus ?? this.equipmentStatus, equipmentStatus: equipmentStatus ?? this.equipmentStatus,
currentSituation: currentSituation ?? this.currentSituation, currentSituation: currentSituation ?? this.currentSituation,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
if (callLastSituation != null) { if (callLastSituation != null) {
@ -436,6 +441,7 @@ class SuppEngineerWorkOrders {
externalEngCode = json['externalEngCode']; externalEngCode = json['externalEngCode'];
email = json['email']; email = json['email'];
} }
num id; num id;
num supplierContactId; num supplierContactId;
String personName; String personName;
@ -443,6 +449,7 @@ class SuppEngineerWorkOrders {
String contact; String contact;
String externalEngCode; String externalEngCode;
String email; String email;
SuppEngineerWorkOrders copyWith({ SuppEngineerWorkOrders copyWith({
num id, num id,
num supplierContactId, num supplierContactId,
@ -461,6 +468,7 @@ class SuppEngineerWorkOrders {
externalEngCode: externalEngCode ?? this.externalEngCode, externalEngCode: externalEngCode ?? this.externalEngCode,
email: email ?? this.email, email: email ?? this.email,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id ?? 0; map['id'] = id ?? 0;
@ -496,6 +504,7 @@ class StepsWorkOrderDto {
parentWOId = json['parentWOId']; parentWOId = json['parentWOId'];
callId = json['callId']; callId = json['callId'];
} }
num sequence; num sequence;
num id; num id;
String name; String name;
@ -504,6 +513,7 @@ class StepsWorkOrderDto {
bool processed; bool processed;
num parentWOId; num parentWOId;
num callId; num callId;
StepsWorkOrderDto copyWith({ StepsWorkOrderDto copyWith({
num sequence, num sequence,
num id, num id,
@ -524,6 +534,7 @@ class StepsWorkOrderDto {
parentWOId: parentWOId ?? this.parentWOId, parentWOId: parentWOId ?? this.parentWOId,
callId: callId ?? this.callId, callId: callId ?? this.callId,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['sequence'] = sequence; map['sequence'] = sequence;
@ -612,6 +623,7 @@ class SupplierModel {
}); });
} }
} }
num id; num id;
String suppliername; String suppliername;
String name; String name;
@ -631,6 +643,7 @@ class SupplierModel {
List<Attachments> attachments; List<Attachments> attachments;
List<SuppPersons> suppPersons; List<SuppPersons> suppPersons;
List<SuppTCodes> suppTCodes; List<SuppTCodes> suppTCodes;
SupplierModel copyWith({ SupplierModel copyWith({
num id, num id,
String suppliername, String suppliername,
@ -673,6 +686,7 @@ class SupplierModel {
suppPersons: suppPersons ?? this.suppPersons, suppPersons: suppPersons ?? this.suppPersons,
suppTCodes: suppTCodes ?? this.suppTCodes, suppTCodes: suppTCodes ?? this.suppTCodes,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id ?? 0; map['id'] = id ?? 0;
@ -724,10 +738,12 @@ class SuppTCodes {
codeTypeId = json['codeTypeId']; codeTypeId = json['codeTypeId'];
codeValue = json['codeValue']; codeValue = json['codeValue'];
} }
num id; num id;
num supplierId; num supplierId;
num codeTypeId; num codeTypeId;
String codeValue; String codeValue;
SuppTCodes copyWith({ SuppTCodes copyWith({
num id, num id,
num supplierId, num supplierId,
@ -740,6 +756,7 @@ class SuppTCodes {
codeTypeId: codeTypeId ?? this.codeTypeId, codeTypeId: codeTypeId ?? this.codeTypeId,
codeValue: codeValue ?? this.codeValue, codeValue: codeValue ?? this.codeValue,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id ?? 0; map['id'] = id ?? 0;
@ -770,6 +787,7 @@ class SuppPersons {
externalEngCode = json['externalEngCode']; externalEngCode = json['externalEngCode'];
email = json['email']; email = json['email'];
} }
num id; num id;
num supplierId; num supplierId;
String personName; String personName;
@ -777,6 +795,7 @@ class SuppPersons {
String contact; String contact;
String externalEngCode; String externalEngCode;
String email; String email;
SuppPersons copyWith({ SuppPersons copyWith({
num id, num id,
num supplierId, num supplierId,
@ -795,6 +814,7 @@ class SuppPersons {
externalEngCode: externalEngCode ?? this.externalEngCode, externalEngCode: externalEngCode ?? this.externalEngCode,
email: email ?? this.email, email: email ?? this.email,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id ?? 0; map['id'] = id ?? 0;
@ -822,10 +842,12 @@ class Attachments {
attachmentName = json['attachmentName']; attachmentName = json['attachmentName'];
attachmentURL = json['attachmentURL']; attachmentURL = json['attachmentURL'];
} }
num id; num id;
num supplierId; num supplierId;
String attachmentName; String attachmentName;
String attachmentURL; String attachmentURL;
Attachments copyWith({ Attachments copyWith({
num id, num id,
num supplierId, num supplierId,
@ -838,6 +860,7 @@ class Attachments {
attachmentName: attachmentName ?? this.attachmentName, attachmentName: attachmentName ?? this.attachmentName,
attachmentURL: attachmentURL ?? this.attachmentURL, attachmentURL: attachmentURL ?? this.attachmentURL,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id ?? 0; map['id'] = id ?? 0;
@ -860,9 +883,11 @@ class Addresses {
supplierId = json['supplierId']; supplierId = json['supplierId'];
address = json['address']; address = json['address'];
} }
num id; num id;
num supplierId; num supplierId;
String address; String address;
Addresses copyWith({ Addresses copyWith({
num id, num id,
num supplierId, num supplierId,
@ -873,6 +898,7 @@ class Addresses {
supplierId: supplierId ?? this.supplierId, supplierId: supplierId ?? this.supplierId,
address: address ?? this.address, address: address ?? this.address,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id ?? 0; map['id'] = id ?? 0;
@ -894,9 +920,11 @@ class Faxes {
supplierId = json['supplierId']; supplierId = json['supplierId'];
fax = json['fax']; fax = json['fax'];
} }
num id; num id;
num supplierId; num supplierId;
String fax; String fax;
Faxes copyWith({ Faxes copyWith({
num id, num id,
num supplierId, num supplierId,
@ -907,6 +935,7 @@ class Faxes {
supplierId: supplierId ?? this.supplierId, supplierId: supplierId ?? this.supplierId,
fax: fax ?? this.fax, fax: fax ?? this.fax,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id ?? 0; map['id'] = id ?? 0;
@ -928,9 +957,11 @@ class Telephones {
supplierId = json['supplierId']; supplierId = json['supplierId'];
telephone = json['telephone']; telephone = json['telephone'];
} }
num id; num id;
num supplierId; num supplierId;
String telephone; String telephone;
Telephones copyWith({ Telephones copyWith({
num id, num id,
num supplierId, num supplierId,
@ -941,6 +972,7 @@ class Telephones {
supplierId: supplierId ?? this.supplierId, supplierId: supplierId ?? this.supplierId,
telephone: telephone ?? this.telephone, telephone: telephone ?? this.telephone,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id ?? 0; map['id'] = id ?? 0;
@ -960,8 +992,10 @@ class AttachmentsWorkOrder {
id = json['id']; id = json['id'];
name = json['name']; name = json['name'];
} }
num id; num id;
String name; String name;
AttachmentsWorkOrder copyWith({ AttachmentsWorkOrder copyWith({
num id, num id,
String name, String name,
@ -970,6 +1004,7 @@ class AttachmentsWorkOrder {
id: id ?? this.id, id: id ?? this.id,
name: name ?? this.name, name: name ?? this.name,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id ?? 0; map['id'] = id ?? 0;
@ -994,11 +1029,13 @@ class SparePartsWorkOrders {
returnQty = json['returnQty']; returnQty = json['returnQty'];
installQty = json['installQty']; installQty = json['installQty'];
} }
num id; num id;
SparePart sparePart; SparePart sparePart;
num qty; num qty;
num returnQty; num returnQty;
num installQty; num installQty;
SparePartsWorkOrders copyWith({ SparePartsWorkOrders copyWith({
num id, num id,
SparePart sparePart, SparePart sparePart,
@ -1013,6 +1050,7 @@ class SparePartsWorkOrders {
returnQty: returnQty ?? this.returnQty, returnQty: returnQty ?? this.returnQty,
installQty: installQty ?? this.installQty, installQty: installQty ?? this.installQty,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id ?? 0; map['id'] = id ?? 0;
@ -1038,9 +1076,11 @@ class SparePart {
partNo = json['partNo']; partNo = json['partNo'];
partName = json['partName']; partName = json['partName'];
} }
num id; num id;
String partNo; String partNo;
String partName; String partName;
SparePart copyWith({ SparePart copyWith({
num id, num id,
String partNo, String partNo,
@ -1051,6 +1091,7 @@ class SparePart {
partNo: partNo ?? this.partNo, partNo: partNo ?? this.partNo,
partName: partName ?? this.partName, partName: partName ?? this.partName,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id ?? 0; map['id'] = id ?? 0;
@ -1082,6 +1123,7 @@ class ContactPersonWorkOrders {
land = json['land']; land = json['land'];
contactUserId = json['contactUserId']; contactUserId = json['contactUserId'];
} }
num id; num id;
String employeeCode; String employeeCode;
String name; String name;
@ -1090,6 +1132,7 @@ class ContactPersonWorkOrders {
String email; String email;
String land; String land;
String contactUserId; String contactUserId;
ContactPersonWorkOrders copyWith({ ContactPersonWorkOrders copyWith({
num id, num id,
String employeeCode, String employeeCode,
@ -1110,6 +1153,7 @@ class ContactPersonWorkOrders {
land: land ?? this.land, land: land ?? this.land,
contactUserId: contactUserId ?? this.contactUserId, contactUserId: contactUserId ?? this.contactUserId,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id ?? 0; map['id'] = id ?? 0;
@ -1134,8 +1178,10 @@ class AssistantEmployees {
id = json['id']; id = json['id'];
user = json['user'] != null ? UserModel.fromJson(json['user']) : UserModel(name: json['userName'], id: json['userId']); user = json['user'] != null ? UserModel.fromJson(json['user']) : UserModel(name: json['userName'], id: json['userId']);
} }
num id; num id;
UserModel user; UserModel user;
AssistantEmployees copyWith({ AssistantEmployees copyWith({
num id, num id,
UserModel user, UserModel user,
@ -1144,6 +1190,7 @@ class AssistantEmployees {
id: id ?? this.id, id: id ?? this.id,
user: user ?? this.user, user: user ?? this.user,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id ?? 0; map['id'] = id ?? 0;
@ -1164,8 +1211,10 @@ class UserModel {
id = json['id']; id = json['id'];
name = json['name']; name = json['name'];
} }
String id; String id;
String name; String name;
UserModel copyWith({ UserModel copyWith({
String id, String id,
String name, String name,
@ -1174,6 +1223,7 @@ class UserModel {
id: id ?? this.id, id: id ?? this.id,
name: name ?? this.name, name: name ?? this.name,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id ?? 0; map['id'] = id ?? 0;
@ -1192,8 +1242,10 @@ class AssignedEmployee {
id = json['id']; id = json['id'];
name = json['name']; name = json['name'];
} }
String id; String id;
String name; String name;
AssignedEmployee copyWith({ AssignedEmployee copyWith({
String id, String id,
String name, String name,
@ -1202,6 +1254,7 @@ class AssignedEmployee {
id: id ?? this.id, id: id ?? this.id,
name: name ?? this.name, name: name ?? this.name,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id ?? 0; map['id'] = id ?? 0;
@ -1243,6 +1296,7 @@ class CallRequest {
firstAction = json['firstAction'] != null ? FirstAction.fromJson(json['firstAction']) : null; firstAction = json['firstAction'] != null ? FirstAction.fromJson(json['firstAction']) : null;
assetType = json['assetType']; assetType = json['assetType'];
} }
num id; num id;
String callNo; String callNo;
String callComments; String callComments;
@ -1254,6 +1308,7 @@ class CallRequest {
DefectType defectType; DefectType defectType;
FirstAction firstAction; FirstAction firstAction;
num assetType; num assetType;
CallRequest copyWith({ CallRequest copyWith({
num id, num id,
String callNo, String callNo,
@ -1280,6 +1335,7 @@ class CallRequest {
firstAction: firstAction ?? this.firstAction, firstAction: firstAction ?? this.firstAction,
assetType: assetType ?? this.assetType, assetType: assetType ?? this.assetType,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id ?? 0; map['id'] = id ?? 0;
@ -1323,9 +1379,11 @@ class FirstAction {
name = json['name']; name = json['name'];
value = json['value']; value = json['value'];
} }
num id; num id;
String name; String name;
num value; num value;
FirstAction copyWith({ FirstAction copyWith({
num id, num id,
String name, String name,
@ -1336,6 +1394,7 @@ class FirstAction {
name: name ?? this.name, name: name ?? this.name,
value: value ?? this.value, value: value ?? this.value,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id ?? 0; map['id'] = id ?? 0;
@ -1357,9 +1416,11 @@ class DefectType {
name = json['name']; name = json['name'];
value = json['value']; value = json['value'];
} }
num id; num id;
String name; String name;
num value; num value;
DefectType copyWith({ DefectType copyWith({
num id, num id,
String name, String name,
@ -1370,6 +1431,7 @@ class DefectType {
name: name ?? this.name, name: name ?? this.name,
value: value ?? this.value, value: value ?? this.value,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id ?? 0; map['id'] = id ?? 0;
@ -1391,9 +1453,11 @@ class Status {
name = json['name']; name = json['name'];
value = json['value']; value = json['value'];
} }
num id; num id;
String name; String name;
num value; num value;
Status copyWith({ Status copyWith({
num id, num id,
String name, String name,
@ -1404,6 +1468,7 @@ class Status {
name: name ?? this.name, name: name ?? this.name,
value: value ?? this.value, value: value ?? this.value,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id ?? 0; map['id'] = id ?? 0;
@ -1435,6 +1500,7 @@ class CallSiteContactPerson {
land = json['land']; land = json['land'];
contactUserId = json['contactUserId']; contactUserId = json['contactUserId'];
} }
num id; num id;
String employeeCode; String employeeCode;
String name; String name;
@ -1443,6 +1509,7 @@ class CallSiteContactPerson {
String email; String email;
String land; String land;
String contactUserId; String contactUserId;
CallSiteContactPerson copyWith({ CallSiteContactPerson copyWith({
num id, num id,
String employeeCode, String employeeCode,
@ -1463,6 +1530,7 @@ class CallSiteContactPerson {
land: land ?? this.land, land: land ?? this.land,
contactUserId: contactUserId ?? this.contactUserId, contactUserId: contactUserId ?? this.contactUserId,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id ?? 0; map['id'] = id ?? 0;
@ -1584,6 +1652,7 @@ class Asset {
comment = json['comment']; comment = json['comment'];
tagCode = json['tagCode']; tagCode = json['tagCode'];
} }
num id; num id;
String assetSerialNo; String assetSerialNo;
String systemID; String systemID;
@ -1632,6 +1701,7 @@ class Asset {
List<TechnicalGuidanceBooks> technicalGuidanceBooks; List<TechnicalGuidanceBooks> technicalGuidanceBooks;
String comment; String comment;
String tagCode; String tagCode;
Asset copyWith({ Asset copyWith({
num id, num id,
String assetSerialNo, String assetSerialNo,
@ -1732,6 +1802,7 @@ class Asset {
comment: comment ?? this.comment, comment: comment ?? this.comment,
tagCode: tagCode ?? this.tagCode, tagCode: tagCode ?? this.tagCode,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id ?? 0; map['id'] = id ?? 0;
@ -1836,8 +1907,10 @@ class TechnicalGuidanceBooks {
id = json['id']; id = json['id'];
guidanceBook = json['guidanceBook'] != null ? GuidanceBook.fromJson(json['guidanceBook']) : null; guidanceBook = json['guidanceBook'] != null ? GuidanceBook.fromJson(json['guidanceBook']) : null;
} }
num id; num id;
GuidanceBook guidanceBook; GuidanceBook guidanceBook;
TechnicalGuidanceBooks copyWith({ TechnicalGuidanceBooks copyWith({
num id, num id,
GuidanceBook guidanceBook, GuidanceBook guidanceBook,
@ -1846,6 +1919,7 @@ class TechnicalGuidanceBooks {
id: id ?? this.id, id: id ?? this.id,
guidanceBook: guidanceBook ?? this.guidanceBook, guidanceBook: guidanceBook ?? this.guidanceBook,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id ?? 0; map['id'] = id ?? 0;
@ -1868,9 +1942,11 @@ class GuidanceBook {
name = json['name']; name = json['name'];
value = json['value']; value = json['value'];
} }
num id; num id;
String name; String name;
num value; num value;
GuidanceBook copyWith({ GuidanceBook copyWith({
num id, num id,
String name, String name,
@ -1881,6 +1957,7 @@ class GuidanceBook {
name: name ?? this.name, name: name ?? this.name,
value: value ?? this.value, value: value ?? this.value,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id ?? 0; map['id'] = id ?? 0;
@ -1902,9 +1979,11 @@ class RemainderWarrantyMonths {
name = json['name']; name = json['name'];
value = json['value']; value = json['value'];
} }
num id; num id;
String name; String name;
num value; num value;
RemainderWarrantyMonths copyWith({ RemainderWarrantyMonths copyWith({
num id, num id,
String name, String name,
@ -1915,6 +1994,7 @@ class RemainderWarrantyMonths {
name: name ?? this.name, name: name ?? this.name,
value: value ?? this.value, value: value ?? this.value,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id ?? 0; map['id'] = id ?? 0;
@ -1936,9 +2016,11 @@ class ExtendedWarrantyMonths {
name = json['name']; name = json['name'];
value = json['value']; value = json['value'];
} }
num id; num id;
String name; String name;
num value; num value;
ExtendedWarrantyMonths copyWith({ ExtendedWarrantyMonths copyWith({
num id, num id,
String name, String name,
@ -1949,6 +2031,7 @@ class ExtendedWarrantyMonths {
name: name ?? this.name, name: name ?? this.name,
value: value ?? this.value, value: value ?? this.value,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id ?? 0; map['id'] = id ?? 0;
@ -1970,9 +2053,11 @@ class SiteWarrantyMonths {
name = json['name']; name = json['name'];
value = json['value']; value = json['value'];
} }
num id; num id;
String name; String name;
num value; num value;
SiteWarrantyMonths copyWith({ SiteWarrantyMonths copyWith({
num id, num id,
String name, String name,
@ -1983,6 +2068,7 @@ class SiteWarrantyMonths {
name: name ?? this.name, name: name ?? this.name,
value: value ?? this.value, value: value ?? this.value,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id ?? 0; map['id'] = id ?? 0;
@ -2004,9 +2090,11 @@ class CommissioningStatus {
name = json['name']; name = json['name'];
value = json['value']; value = json['value'];
} }
num id; num id;
String name; String name;
num value; num value;
CommissioningStatus copyWith({ CommissioningStatus copyWith({
num id, num id,
String name, String name,
@ -2017,6 +2105,7 @@ class CommissioningStatus {
name: name ?? this.name, name: name ?? this.name,
value: value ?? this.value, value: value ?? this.value,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id ?? 0; map['id'] = id ?? 0;
@ -2045,10 +2134,12 @@ class OriginSite {
}); });
} }
} }
num id; num id;
num customerCode; num customerCode;
String custName; String custName;
List<Buildings> buildings; List<Buildings> buildings;
OriginSite copyWith({ OriginSite copyWith({
num id, num id,
num customerCode, num customerCode,
@ -2061,6 +2152,7 @@ class OriginSite {
custName: custName ?? this.custName, custName: custName ?? this.custName,
buildings: buildings ?? this.buildings, buildings: buildings ?? this.buildings,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id ?? 0; map['id'] = id ?? 0;
@ -2092,10 +2184,12 @@ class Buildings {
}); });
} }
} }
num id; num id;
String name; String name;
num value; num value;
List<Floors> floors; List<Floors> floors;
Buildings copyWith({ Buildings copyWith({
num id, num id,
String name, String name,
@ -2108,6 +2202,7 @@ class Buildings {
value: value ?? this.value, value: value ?? this.value,
floors: floors ?? this.floors, floors: floors ?? this.floors,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id ?? 0; map['id'] = id ?? 0;
@ -2139,10 +2234,12 @@ class Floors {
}); });
} }
} }
num id; num id;
String name; String name;
num value; num value;
List<Departments> departments; List<Departments> departments;
Floors copyWith({ Floors copyWith({
num id, num id,
String name, String name,
@ -2155,6 +2252,7 @@ class Floors {
value: value ?? this.value, value: value ?? this.value,
departments: departments ?? this.departments, departments: departments ?? this.departments,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id ?? 0; map['id'] = id ?? 0;
@ -2177,8 +2275,10 @@ class Departments {
id = json['id']; id = json['id'];
name = json['name']; name = json['name'];
} }
num id; num id;
String name; String name;
Departments copyWith({ Departments copyWith({
num id, num id,
String name, String name,
@ -2187,6 +2287,7 @@ class Departments {
id: id ?? this.id, id: id ?? this.id,
name: name ?? this.name, name: name ?? this.name,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id ?? 0; map['id'] = id ?? 0;
@ -2209,10 +2310,12 @@ class OriginDepartment {
departmentCode = json['departmentCode']; departmentCode = json['departmentCode'];
ntCode = json['ntCode']; ntCode = json['ntCode'];
} }
num id; num id;
String departmentName; String departmentName;
String departmentCode; String departmentCode;
String ntCode; String ntCode;
OriginDepartment copyWith({ OriginDepartment copyWith({
num id, num id,
String departmentName, String departmentName,
@ -2225,6 +2328,7 @@ class OriginDepartment {
departmentCode: departmentCode ?? this.departmentCode, departmentCode: departmentCode ?? this.departmentCode,
ntCode: ntCode ?? this.ntCode, ntCode: ntCode ?? this.ntCode,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id; map['id'] = id;
@ -2247,9 +2351,11 @@ class Currency {
name = json['name']; name = json['name'];
value = json['value']; value = json['value'];
} }
num id; num id;
String name; String name;
num value; num value;
Currency copyWith({ Currency copyWith({
num id, num id,
String name, String name,
@ -2260,6 +2366,7 @@ class Currency {
name: name ?? this.name, name: name ?? this.name,
value: value ?? this.value, value: value ?? this.value,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id ?? 0; map['id'] = id ?? 0;
@ -2283,10 +2390,12 @@ class Department {
departmentCode = json['departmentCode']; departmentCode = json['departmentCode'];
ntCode = json['ntCode']; ntCode = json['ntCode'];
} }
num id; num id;
String departmentName; String departmentName;
String departmentCode; String departmentCode;
String ntCode; String ntCode;
Department copyWith({ Department copyWith({
num id, num id,
String departmentName, String departmentName,
@ -2299,6 +2408,7 @@ class Department {
departmentCode: departmentCode ?? this.departmentCode, departmentCode: departmentCode ?? this.departmentCode,
ntCode: ntCode ?? this.ntCode, ntCode: ntCode ?? this.ntCode,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id ?? 0; map['id'] = id ?? 0;
@ -2321,9 +2431,11 @@ class Floor {
name = json['name']; name = json['name'];
value = json['value']; value = json['value'];
} }
num id; num id;
String name; String name;
num value; num value;
Floor copyWith({ Floor copyWith({
num id, num id,
String name, String name,
@ -2334,6 +2446,7 @@ class Floor {
name: name ?? this.name, name: name ?? this.name,
value: value ?? this.value, value: value ?? this.value,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id ?? 0; map['id'] = id ?? 0;
@ -2355,9 +2468,11 @@ class Building {
name = json['name']; name = json['name'];
value = json['value']; value = json['value'];
} }
num id; num id;
String name; String name;
num value; num value;
Building copyWith({ Building copyWith({
num id, num id,
String name, String name,
@ -2368,6 +2483,7 @@ class Building {
name: name ?? this.name, name: name ?? this.name,
value: value ?? this.value, value: value ?? this.value,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id ?? 0; map['id'] = id ?? 0;
@ -2396,10 +2512,12 @@ class Site {
}); });
} }
} }
num id; num id;
num customerCode; num customerCode;
String custName; String custName;
List<Buildings> buildings; List<Buildings> buildings;
Site copyWith({ Site copyWith({
num id, num id,
num customerCode, num customerCode,
@ -2412,6 +2530,7 @@ class Site {
custName: custName ?? this.custName, custName: custName ?? this.custName,
buildings: buildings ?? this.buildings, buildings: buildings ?? this.buildings,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id ?? 0; map['id'] = id ?? 0;
@ -2440,11 +2559,13 @@ class ParentAsset {
tagCode = json['tagCode']; tagCode = json['tagCode'];
systemId = json['systemId']; systemId = json['systemId'];
} }
num id; num id;
String assetSerialNo; String assetSerialNo;
String assetNumber; String assetNumber;
String tagCode; String tagCode;
String systemId; String systemId;
ParentAsset copyWith({ ParentAsset copyWith({
num id, num id,
String assetSerialNo, String assetSerialNo,
@ -2459,6 +2580,7 @@ class ParentAsset {
tagCode: tagCode ?? this.tagCode, tagCode: tagCode ?? this.tagCode,
systemId: systemId ?? this.systemId, systemId: systemId ?? this.systemId,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id ?? 0; map['id'] = id ?? 0;
@ -2482,9 +2604,11 @@ class IsParent {
name = json['name']; name = json['name'];
value = json['value']; value = json['value'];
} }
num id; num id;
String name; String name;
num value; num value;
IsParent copyWith({ IsParent copyWith({
num id, num id,
String name, String name,
@ -2495,6 +2619,7 @@ class IsParent {
name: name ?? this.name, name: name ?? this.name,
value: value ?? this.value, value: value ?? this.value,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id ?? 0; map['id'] = id ?? 0;
@ -2520,11 +2645,13 @@ class OldAsset {
tagCode = json['tagCode']; tagCode = json['tagCode'];
systemId = json['systemId']; systemId = json['systemId'];
} }
num id; num id;
String assetSerialNo; String assetSerialNo;
String assetNumber; String assetNumber;
String tagCode; String tagCode;
String systemId; String systemId;
OldAsset copyWith({ OldAsset copyWith({
num id, num id,
String assetSerialNo, String assetSerialNo,
@ -2539,6 +2666,7 @@ class OldAsset {
tagCode: tagCode ?? this.tagCode, tagCode: tagCode ?? this.tagCode,
systemId: systemId ?? this.systemId, systemId: systemId ?? this.systemId,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id; map['id'] = id;
@ -2562,9 +2690,11 @@ class AssetReplace {
name = json['name']; name = json['name'];
value = json['value']; value = json['value'];
} }
num id; num id;
String name; String name;
num value; num value;
AssetReplace copyWith({ AssetReplace copyWith({
num id, num id,
String name, String name,
@ -2575,6 +2705,7 @@ class AssetReplace {
name: name ?? this.name, name: name ?? this.name,
value: value ?? this.value, value: value ?? this.value,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id ?? 0; map['id'] = id ?? 0;
@ -2594,8 +2725,10 @@ class Supplier {
id = json['id']; id = json['id'];
suppliername = json['suppliername']; suppliername = json['suppliername'];
} }
num id; num id;
String suppliername; String suppliername;
SupplierModel copyWith({ SupplierModel copyWith({
num id, num id,
String suppliername, String suppliername,
@ -2604,6 +2737,7 @@ class Supplier {
id: id ?? this.id, id: id ?? this.id,
suppliername: suppliername ?? this.suppliername, suppliername: suppliername ?? this.suppliername,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id ?? 0; map['id'] = id ?? 0;
@ -2654,6 +2788,7 @@ class ModelDefinition {
}); });
} }
} }
num id; num id;
String assetName; String assetName;
String modelDefCode; String modelDefCode;
@ -2667,6 +2802,7 @@ class ModelDefinition {
num lifeSpan; num lifeSpan;
List<ModelDefRelatedDefects> modelDefRelatedDefects; List<ModelDefRelatedDefects> modelDefRelatedDefects;
List<Suppliers> suppliers; List<Suppliers> suppliers;
ModelDefinition copyWith({ ModelDefinition copyWith({
num id, num id,
String assetName, String assetName,
@ -2697,6 +2833,7 @@ class ModelDefinition {
modelDefRelatedDefects: modelDefRelatedDefects ?? this.modelDefRelatedDefects, modelDefRelatedDefects: modelDefRelatedDefects ?? this.modelDefRelatedDefects,
suppliers: suppliers ?? this.suppliers, suppliers: suppliers ?? this.suppliers,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id ?? 0; map['id'] = id ?? 0;
@ -2730,8 +2867,10 @@ class Suppliers {
id = json['id']; id = json['id'];
suppliername = json['suppliername']; suppliername = json['suppliername'];
} }
num id; num id;
String suppliername; String suppliername;
Suppliers copyWith({ Suppliers copyWith({
num id, num id,
String suppliername, String suppliername,
@ -2740,6 +2879,7 @@ class Suppliers {
id: id ?? this.id, id: id ?? this.id,
suppliername: suppliername ?? this.suppliername, suppliername: suppliername ?? this.suppliername,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id ?? 0; map['id'] = id ?? 0;
@ -2762,10 +2902,12 @@ class ModelDefRelatedDefects {
workPerformed = json['workPerformed']; workPerformed = json['workPerformed'];
estimatedTime = json['estimatedTime']; estimatedTime = json['estimatedTime'];
} }
num id; num id;
String defectName; String defectName;
String workPerformed; String workPerformed;
String estimatedTime; String estimatedTime;
ModelDefRelatedDefects copyWith({ ModelDefRelatedDefects copyWith({
num id, num id,
String defectName, String defectName,
@ -2778,6 +2920,7 @@ class ModelDefRelatedDefects {
workPerformed: workPerformed ?? this.workPerformed, workPerformed: workPerformed ?? this.workPerformed,
estimatedTime: estimatedTime ?? this.estimatedTime, estimatedTime: estimatedTime ?? this.estimatedTime,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id; map['id'] = id;

@ -2,6 +2,7 @@ class TimerModel {
DateTime startAt; DateTime startAt;
DateTime endAt; DateTime endAt;
int durationInSecond; int durationInSecond;
// bool stopped; // bool stopped;
TimerModel({this.startAt, this.endAt, this.durationInSecond}); TimerModel({this.startAt, this.endAt, this.durationInSecond});

@ -3,6 +3,8 @@ import 'package:test_sa/models/lookup.dart';
class VisitsSearch { class VisitsSearch {
String deviceSerialNumber; String deviceSerialNumber;
String deviceName;
String deviceNumber;
Hospital hospital; Hospital hospital;
String brand; String brand;
Lookup model; Lookup model;
@ -12,7 +14,6 @@ class VisitsSearch {
DateTime actualDateFrom; DateTime actualDateFrom;
DateTime actualDateTo; DateTime actualDateTo;
Lookup statusValue; Lookup statusValue;
bool mostRecent;
VisitsSearch({ VisitsSearch({
this.deviceSerialNumber, this.deviceSerialNumber,
@ -25,7 +26,8 @@ class VisitsSearch {
this.contactStatus, this.contactStatus,
this.expectedDateFrom, this.expectedDateFrom,
this.expectedDateTo, this.expectedDateTo,
this.mostRecent, this.deviceNumber,
this.deviceName
}); });
fromSearch(VisitsSearch newSearch) { fromSearch(VisitsSearch newSearch) {
@ -39,7 +41,8 @@ class VisitsSearch {
expectedDateFrom = newSearch.expectedDateFrom; expectedDateFrom = newSearch.expectedDateFrom;
expectedDateTo = newSearch.expectedDateTo; expectedDateTo = newSearch.expectedDateTo;
statusValue = newSearch.statusValue; statusValue = newSearch.statusValue;
mostRecent = newSearch.mostRecent; deviceNumber=newSearch.deviceNumber;
deviceName=newSearch.deviceName;
} }
Map<String, dynamic> toMap() { Map<String, dynamic> toMap() {

@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
class AColors { class AColors {
AColors._(); AColors._();
static const Color white = Color(0xffffffff); static const Color white = Color(0xffffffff);
static const Color black = Color(0xff000000); static const Color black = Color(0xff000000);
static const Color grey3A = Color(0xff2e303a); static const Color grey3A = Color(0xff2e303a);

@ -5,6 +5,7 @@ import 'package:test_sa/controllers/providers/api/device_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/models/device/device_transfer.dart'; import 'package:test_sa/models/device/device_transfer.dart';
import 'package:test_sa/models/device/device_transfer_info.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.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';
@ -12,12 +13,9 @@ 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/device_trancfer/device_transfer_info_section.dart'; import 'package:test_sa/views/widgets/device_trancfer/device_transfer_info_section.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 '../../../models/enums/user_types.dart';
class DeviceTransferDetails extends StatefulWidget { class DeviceTransferDetails extends StatefulWidget {
final DeviceTransfer model; final DeviceTransfer model;
@ -28,7 +26,7 @@ class DeviceTransferDetails extends StatefulWidget {
} }
class _DeviceTransferDetailsState extends State<DeviceTransferDetails> { class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
DeviceTransfer _model; final DeviceTransferInfo _model = DeviceTransferInfo();
bool _isSender = false; bool _isSender = false;
bool _isReceiver = false; bool _isReceiver = false;
UserProvider _userProvider; UserProvider _userProvider;
@ -41,167 +39,151 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
@override @override
void initState() { void initState() {
_model = widget.model;
super.initState(); super.initState();
} }
Future<void> _getDeviceTransfer() async {
print("====== object");
_model = await Provider.of<DeviceTransferProvider>(context).getRequestById(assetTransferId: widget.model.id);
print("====== object2");
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_subtitle = AppLocalization.of(context).subtitle;
_userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context);
_deviceTransferProvider = Provider.of<DeviceTransferProvider>(context);
_isSender = _userProvider.user.userID == widget.model.sender?.userId;
_isReceiver = _userProvider.user.userID == widget.model.receiver?.userId;
return Scaffold( return Scaffold(
key: _scaffoldKey, key: _scaffoldKey,
body: SafeArea( body: SafeArea(
child: FutureBuilder( child: Form(
future: _getDeviceTransfer(), key: _formKey,
builder: (context, snapshot) { child: LoadingManager(
if (snapshot.connectionState == ConnectionState.waiting) { isLoading: _isLoading,
return const ALoading(); isFailedLoading: false,
} else { stateCode: 200,
_subtitle = AppLocalization.of(context).subtitle; onRefresh: () async {},
_userProvider = Provider.of<UserProvider>(context); child: Column(
_settingProvider = Provider.of<SettingProvider>(context); children: [
_deviceTransferProvider = Provider.of<DeviceTransferProvider>(context); Container(
_isSender = _userProvider.user.userID == _model.sender?.userId; color: Theme.of(context).colorScheme.primary,
_isReceiver = _userProvider.user.userID == _model.receiver?.userId; padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4),
return Form( child: Row(
key: _formKey, children: [
child: LoadingManager( const ABackButton(),
isLoading: _isLoading, Expanded(
isFailedLoading: false, child: Center(
stateCode: 200, child: Text(
onRefresh: () async {}, _subtitle.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( child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Container( RequestInfoRow(
color: Theme.of(context).colorScheme.primary, title: "Id",
padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4), info: widget.model.id?.toString(),
child: Row( ),
children: [ RequestInfoRow(
const ABackButton(), title: _subtitle.assetName,
Expanded( info: widget.model.title,
child: Center( ),
child: Text( RequestInfoRow(
_subtitle.details, title: _subtitle.assetSN,
style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic), info: widget.model.device.serialNumber,
), ),
), RequestInfoRow(
), title: _subtitle.assetNumber,
const SizedBox(width: 58), info: widget.model.device.number,
], ),
), RequestInfoRow(
title: _subtitle.destinationSite,
info: widget.model.device.destSiteName,
),
RequestInfoRow(
title: _subtitle.building,
info: widget.model.device.destBuildingName,
), ),
Expanded( RequestInfoRow(
child: SingleChildScrollView( title: _subtitle.floor,
padding: EdgeInsets.all(16 * AppStyle.getScaleFactor(context)), info: widget.model.device.destFloor,
child: Column( ),
crossAxisAlignment: CrossAxisAlignment.start, RequestInfoRow(
children: [ title: _subtitle.department,
RequestInfoRow( info: widget.model.device.destDepartmentName,
title: "Transfer Id", ),
info: _model.title?.toString(), RequestInfoRow(
), title: _subtitle.room,
RequestInfoRow( info: widget.model.device.destRoom,
title: _subtitle.assetName, ),
info: _model.device.assetName, RequestInfoRow(
), title: _subtitle.actions,
RequestInfoRow( info: "",
title: _subtitle.assetSN, ),
info: _model.device.serialNumber, const SizedBox(height: 8),
), Row(
RequestInfoRow( children: [
title: _subtitle.assetNumber, Expanded(
info: _model.device.number, child: Text("Sender", style: Theme.of(context).textTheme.headline6),
),
RequestInfoRow(
title: _subtitle.destinationSite,
info: _model.device.destSiteName,
),
RequestInfoRow(
title: _subtitle.building,
info: _model.device.destBuildingName,
),
RequestInfoRow(
title: _subtitle.floor,
info: _model.device.destFloor,
),
RequestInfoRow(
title: _subtitle.department,
info: _model.device.destDepartmentName,
),
RequestInfoRow(
title: _subtitle.room,
info: _model.device.destRoom,
),
RequestInfoRow(
title: _subtitle.actions,
info: "",
),
const SizedBox(height: 8),
Row(
children: [
Expanded(
child: Text("Sender", style: Theme.of(context).textTheme.headline6),
),
if (_userProvider.user?.type == UsersTypes.engineer)
ASmallButton(
text: _subtitle.edit,
onPressed: (_isSender || _isReceiver || false)
? () {
Navigator.of(context).push(MaterialPageRoute(
builder: (_) => UpdateDeviceTransfer(
model: _model,
isSender: true,
)));
}
: null,
),
],
),
const SizedBox(height: 12),
DeviceTransferInfoSection(
info: _model.sender,
),
const SizedBox(height: 8),
Row(
children: [
Expanded(
child: Text("Receiver", style: Theme.of(context).textTheme.headline6),
),
if (_userProvider.user?.type == UsersTypes.engineer)
ASmallButton(
text: _subtitle.edit,
onPressed: (_isReceiver || false)
? () async {
Navigator.of(context).push(
MaterialPageRoute(
builder: (_) => UpdateDeviceTransfer(
model: _model,
isSender: false,
),
),
);
}
: null,
),
],
),
const SizedBox(height: 12),
DeviceTransferInfoSection(info: _model.receiver),
],
), ),
), ASmallButton(
text: _subtitle.edit,
onPressed: (_isSender || false)
? () {
Navigator.of(context).push(MaterialPageRoute(
builder: (_) => UpdateDeviceTransfer(
model: widget.model,
isSender: true,
)));
}
: null,
),
],
),
const SizedBox(height: 12),
DeviceTransferInfoSection(
info: widget.model.sender,
isSender: true,
),
const SizedBox(height: 8),
Row(
children: [
Expanded(
child: Text("Receiver", style: Theme.of(context).textTheme.headline6),
),
ASmallButton(
text: _subtitle.edit,
onPressed: (_isReceiver || false)
? () {
Navigator.of(context).push(MaterialPageRoute(
builder: (_) => UpdateDeviceTransfer(
model: widget.model,
isSender: false,
)));
}
: null,
),
],
),
const SizedBox(height: 12),
DeviceTransferInfoSection(
info: widget.model.receiver,
isSender: false,
), ),
], ],
), ),
), ),
); ),
} ],
}), ),
),
),
), ),
); );
} }

@ -1,5 +1,7 @@
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/api_routes/http_status_manger.dart';
import 'package:test_sa/controllers/providers/api/device_transfer_provider.dart'; import 'package:test_sa/controllers/providers/api/device_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';
@ -10,13 +12,14 @@ import 'package:test_sa/models/device/device_transfer_info.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.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/departments/department_button.dart';
import 'package:test_sa/views/widgets/equipment/device_button.dart'; import 'package:test_sa/views/widgets/equipment/device_button.dart';
import 'package:test_sa/views/widgets/hospitals/hospital_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 '../../../controllers/validator/validator.dart';
import '../../app_style/colors.dart';
import '../../widgets/app_text_form_field.dart'; import '../../widgets/app_text_form_field.dart';
import '../../widgets/gas_refill/building_type_menu.dart'; import '../../widgets/gas_refill/building_type_menu.dart';
import '../../widgets/gas_refill/department_type_menu.dart'; import '../../widgets/gas_refill/department_type_menu.dart';
@ -25,6 +28,7 @@ import '../../widgets/hospitals/hospital_auto_complete_field_new.dart';
class RequestDeviceTransfer extends StatefulWidget { class RequestDeviceTransfer extends StatefulWidget {
static const String id = "/request-device-transfer"; static const String id = "/request-device-transfer";
const RequestDeviceTransfer({Key key}) : super(key: key); const RequestDeviceTransfer({Key key}) : super(key: key);
@override @override
@ -42,6 +46,7 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
final DeviceTransfer _formModel = DeviceTransfer(receiver: DeviceTransferInfo(), sender: DeviceTransferInfo()); final DeviceTransfer _formModel = DeviceTransfer(receiver: DeviceTransferInfo(), sender: DeviceTransferInfo());
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(); final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
@override @override
void setState(VoidCallback fn) { void setState(VoidCallback fn) {
if (mounted) super.setState(() {}); if (mounted) super.setState(() {});
@ -116,7 +121,7 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
child: Padding( child: Padding(
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
child: Text( child: Text(
"Transfer Asset", "Transfer Device",
style: Theme.of(context).textTheme.headline5.copyWith(color: Theme.of(context).primaryColor, fontSize: 28, fontWeight: FontWeight.bold), style: Theme.of(context).textTheme.headline5.copyWith(color: Theme.of(context).primaryColor, fontSize: 28, fontWeight: FontWeight.bold),
), ),
), ),
@ -136,7 +141,7 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
// }, // },
// ), // ),
12.height, 12.height,
const ASubTitle("Asset"), const ASubTitle("Device"),
if (_validate && _formModel.device == null) if (_validate && _formModel.device == null)
ASubTitle( ASubTitle(
_subtitle.requiredWord, _subtitle.requiredWord,
@ -150,45 +155,6 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
setState(() {}); setState(() {});
}, },
), ),
if (_formModel.device != null) 8.height,
if (_formModel.device != null) const ASubTitle("Asset Site"),
if (_formModel.device != null)
Container(
width: double.infinity,
alignment: Alignment.center,
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 16),
decoration: BoxDecoration(
color: AColors.inputFieldBackgroundColor,
border: Border.all(
color: const Color(0xffefefef),
),
borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)),
// boxShadow: const [
// AppStyle.boxShadow
// ]
),
child: ASubTitle(_formModel.device?.hospital?.name),
),
if (_formModel.device != null) 4.height,
if (_formModel.device != null && _formModel.device.destDepartmentName != null) const ASubTitle("Asset Department"),
if (_formModel.device != null && _formModel.device.destDepartmentName != null)
Container(
width: double.infinity,
alignment: Alignment.center,
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 16),
decoration: BoxDecoration(
color: AColors.inputFieldBackgroundColor,
border: Border.all(
color: const Color(0xffefefef),
),
borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)),
// boxShadow: const [
// AppStyle.boxShadow
// ]
),
child: ASubTitle(_formModel.device.destDepartmentName.toString()),
),
if (_formModel.device != null) 8.height,
// const SizedBox(height: 8,), // const SizedBox(height: 8,),
// const ASubTitle("Sender Department"), // const ASubTitle("Sender Department"),
// if(_validate && _formModel.senderDepartment == null) // if(_validate && _formModel.senderDepartment == null)
@ -237,8 +203,6 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
Divider( Divider(
color: Theme.of(context).colorScheme.primary, color: Theme.of(context).colorScheme.primary,
), ),
const SizedBox(height: 8),
const ASubTitle("Destination"),
const SizedBox( const SizedBox(
height: 4, height: 4,
), ),
@ -287,8 +251,8 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
}, },
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
const ASubTitle("Room"), ASubTitle("Room"),
const SizedBox( SizedBox(
height: 4, height: 4,
), ),
ATextFormField( ATextFormField(

@ -9,7 +9,6 @@ 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 'package:test_sa/views/widgets/switch_button.dart';
class TrackDeviceTransferPage extends StatefulWidget { class TrackDeviceTransferPage extends StatefulWidget {
static const String id = "/track-device-transfer"; static const String id = "/track-device-transfer";
@ -24,7 +23,7 @@ class _TrackDeviceTransferPageState extends State<TrackDeviceTransferPage> with
DeviceTransferProvider _deviceTransferProvider; DeviceTransferProvider _deviceTransferProvider;
UserProvider _userProvider; UserProvider _userProvider;
SettingProvider _settingProvider; SettingProvider _settingProvider;
bool mostRecent = false;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_deviceTransferProvider = Provider.of<DeviceTransferProvider>(context); _deviceTransferProvider = Provider.of<DeviceTransferProvider>(context);
@ -73,21 +72,6 @@ class _TrackDeviceTransferPageState extends State<TrackDeviceTransferPage> with
], ],
), ),
), ),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: ASwitchButton(
title: "Most Recent",
value: mostRecent,
onChange: (value) async {
mostRecent = value;
await _deviceTransferProvider.getRequests(
user: _userProvider.user,
host: _settingProvider.host,
mostRecent: mostRecent,
);
},
),
),
Expanded( Expanded(
child: DeviceTransferList( child: DeviceTransferList(
nextPage: _deviceTransferProvider.nextPage, nextPage: _deviceTransferProvider.nextPage,

@ -72,6 +72,7 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
); );
_validate = false; _validate = false;
Navigator.of(context).pop(); Navigator.of(context).pop();
Navigator.of(context).pop();
} }
} }

@ -24,6 +24,7 @@ import '../../widgets/titles/app_sub_title.dart';
class SearchSubWorkOrderPage extends StatefulWidget { class SearchSubWorkOrderPage extends StatefulWidget {
static String id = "/SubWorkOrderPage"; static String id = "/SubWorkOrderPage";
const SearchSubWorkOrderPage({Key key}) : super(key: key); const SearchSubWorkOrderPage({Key key}) : super(key: key);
@override @override

@ -13,6 +13,7 @@ import '../../widgets/titles/app_sub_title.dart';
class SparePartsBottomSheet extends StatefulWidget { class SparePartsBottomSheet extends StatefulWidget {
final SearchWorkOrder subWorkOrder; final SearchWorkOrder subWorkOrder;
const SparePartsBottomSheet({this.subWorkOrder, Key key}) : super(key: key); const SparePartsBottomSheet({this.subWorkOrder, Key key}) : super(key: key);
@override @override

@ -11,6 +11,7 @@ class WorkOrderItem extends StatelessWidget {
final int index; final int index;
final SearchWorkOrder item; final SearchWorkOrder item;
final Function(SearchWorkOrder) onPressed; final Function(SearchWorkOrder) onPressed;
const WorkOrderItem({Key key, this.item, this.onPressed, this.index}) : super(key: key); const WorkOrderItem({Key key, this.item, this.onPressed, this.index}) : super(key: key);
@override @override

@ -17,6 +17,7 @@ import 'create_sub_workorder_page.dart';
class WorkOrderList extends StatefulWidget { class WorkOrderList extends StatefulWidget {
List<SearchWorkOrder> items; List<SearchWorkOrder> items;
final Future<List<SearchWorkOrder>> Function() onLazyLoading; final Future<List<SearchWorkOrder>> Function() onLazyLoading;
WorkOrderList({Key key, this.items, this.onLazyLoading}) : super(key: key); WorkOrderList({Key key, this.items, this.onLazyLoading}) : super(key: key);
@override @override
@ -25,6 +26,7 @@ class WorkOrderList extends StatefulWidget {
class _WorkOrderListState extends State<WorkOrderList> { class _WorkOrderListState extends State<WorkOrderList> {
List<SearchWorkOrder> _items; List<SearchWorkOrder> _items;
@override @override
void initState() { void initState() {
super.initState(); super.initState();

@ -26,6 +26,7 @@ import '../../../app_style/colors.dart';
class GasRefillDetails extends StatefulWidget { class GasRefillDetails extends StatefulWidget {
final GasRefillModel model; final GasRefillModel model;
const GasRefillDetails({Key key, this.model}) : super(key: key); const GasRefillDetails({Key key, this.model}) : super(key: key);
@override @override
@ -43,6 +44,7 @@ class _GasRefillDetailsState extends State<GasRefillDetails> {
Subtitle _subtitle; Subtitle _subtitle;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(); final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
_update() async { _update() async {
_validate = true; _validate = true;
if (!_formKey.currentState.validate()) { if (!_formKey.currentState.validate()) {

@ -32,11 +32,11 @@ import '../../../../controllers/localization/localization.dart';
import '../../../../controllers/providers/api/hospitals_provider.dart'; import '../../../../controllers/providers/api/hospitals_provider.dart';
import '../../../../models/enums/user_types.dart'; import '../../../../models/enums/user_types.dart';
import '../../../widgets/e_signature/e_signature.dart'; import '../../../widgets/e_signature/e_signature.dart';
import '../../../widgets/timer/app_timer.dart';
class RequestGasRefill extends StatefulWidget { class RequestGasRefill extends StatefulWidget {
static const String id = "/request-gas-refill"; static const String id = "/request-gas-refill";
final GasRefillModel gasRefillModel; final GasRefillModel gasRefillModel;
const RequestGasRefill({this.gasRefillModel, Key key}) : super(key: key); const RequestGasRefill({this.gasRefillModel, Key key}) : super(key: key);
@override @override
@ -152,13 +152,13 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
_gasRefillProvider = Provider.of<GasRefillProvider>(context, listen: false); _gasRefillProvider = Provider.of<GasRefillProvider>(context, listen: false);
_gasRefillProvider.reset(); _gasRefillProvider.reset();
} }
if (_firstTime) { if (widget.gasRefillModel != null && _firstTime) {
if (widget.gasRefillModel != null) { _formModel = widget.gasRefillModel;
_formModel.status = const Lookup(value: 0); _formModel.status = const Lookup(value: 0);
_gasRefillProvider.expectedDateTime = _formModel.expectedDate; HospitalsProvider().getHospitalsListByVal(searchVal: widget.gasRefillModel.clientName).then((value) {
} _gasRefillProvider.hospital = value?.firstWhere((element) => element.name == widget.gasRefillModel.clientName, orElse: () => null);
HospitalsProvider().getHospitalsListByVal(searchVal: _userProvider.user?.clientName).then((value) { print(_gasRefillProvider.hospital?.buildings?.length);
_gasRefillProvider.hospital = value?.firstWhere((element) => element.name == _userProvider.user?.clientName, orElse: () => null); print(widget.gasRefillModel?.building?.name);
_gasRefillProvider.building = _gasRefillProvider.hospital?.buildings?.firstWhere((element) => element.name == widget.gasRefillModel?.building?.name, orElse: () => null); _gasRefillProvider.building = _gasRefillProvider.hospital?.buildings?.firstWhere((element) => element.name == widget.gasRefillModel?.building?.name, orElse: () => null);
_gasRefillProvider.floor = _gasRefillProvider.building?.floors?.firstWhere((element) => element.name == widget.gasRefillModel?.floor?.name, orElse: () => null); _gasRefillProvider.floor = _gasRefillProvider.building?.floors?.firstWhere((element) => element.name == widget.gasRefillModel?.floor?.name, orElse: () => null);
_gasRefillProvider.department = _gasRefillProvider.floor?.departments?.firstWhere((element) => element.name == widget.gasRefillModel?.department?.departmentName, orElse: () => null); _gasRefillProvider.department = _gasRefillProvider.floor?.departments?.firstWhere((element) => element.name == widget.gasRefillModel?.department?.departmentName, orElse: () => null);
@ -218,7 +218,7 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
), ),
GasStatusMenu( GasStatusMenu(
initialValue: _formModel.status ?? const Lookup(value: 0), initialValue: _formModel.status ?? const Lookup(value: 0),
enabled: widget.gasRefillModel != null, enabled: false,
onSelect: (status) { onSelect: (status) {
_formModel.status = status; _formModel.status = status;
}, },
@ -233,7 +233,6 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
height: 4, height: 4,
), ),
HospitalAutoCompleteField( HospitalAutoCompleteField(
enabled: false,
initialValue: _gasRefillProvider.hospital?.name, initialValue: _gasRefillProvider.hospital?.name,
// onSave: (value){ // onSave: (value){
// _search.hospital = value; // _search.hospital = value;
@ -276,31 +275,11 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
}, },
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
ASubTitle(_subtitle.workingHours), if (_userProvider.user?.type == UsersTypes.normal_user)
if (widget.gasRefillModel != null) const SizedBox(height: 8),
if (widget.gasRefillModel != null)
Row(
children: [
Expanded(
child: AppTimer(
timer: _gasRefillProvider.timer,
onChange: (timer) async {
_gasRefillProvider.timer = timer;
_formModel.startDate ??= timer.startAt;
_gasRefillProvider.endDate = timer.endAt;
_formModel.workingHours = num.tryParse((((timer?.durationInSecond ?? 0) / 60) / 60)?.toStringAsFixed(2) ?? "0");
return true;
},
),
),
],
),
const SizedBox(height: 8),
if (_userProvider.user?.type == UsersTypes.normal_user || widget.gasRefillModel != null)
Column( Column(
crossAxisAlignment: CrossAxisAlignment.stretch, crossAxisAlignment: CrossAxisAlignment.stretch,
children: [ children: [
const ASubTitle("Expected Date"), const ASubTitle("Expected Date Time"),
SizedBox( SizedBox(
height: 8 * AppStyle.getScaleFactor(context), height: 8 * AppStyle.getScaleFactor(context),
), ),
@ -310,7 +289,6 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
to: DateTime.now().add(const Duration(days: 365)), to: DateTime.now().add(const Duration(days: 365)),
onDateTimePicker: (date) { onDateTimePicker: (date) {
_gasRefillProvider.expectedDateTime = date; _gasRefillProvider.expectedDateTime = date;
_formModel.expectedDate = _gasRefillProvider.expectedDateTime;
setState(() {}); setState(() {});
}, },
), ),
@ -390,7 +368,7 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
const SizedBox(height: 8), const SizedBox(height: 8),
Divider(color: Theme.of(context).colorScheme.primary), Divider(color: Theme.of(context).colorScheme.primary),
const SizedBox(height: 4), const SizedBox(height: 4),
const ASubTitle("Gas Type"), const ASubTitle("Type"),
if (_validate && _currentDetails.type == null) ASubTitle(_subtitle.requiredWord, color: Colors.red), if (_validate && _currentDetails.type == null) ASubTitle(_subtitle.requiredWord, color: Colors.red),
const SizedBox(height: 4), const SizedBox(height: 4),
GasTypeMenu( GasTypeMenu(
@ -418,6 +396,9 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
const SizedBox( const SizedBox(
height: 8, height: 8,
), ),
const SizedBox(
height: 8,
),
const ASubTitle("Cylinder Type"), const ASubTitle("Cylinder Type"),
if (_validate && _currentDetails.cylinderSize == null) if (_validate && _currentDetails.cylinderSize == null)
ASubTitle( ASubTitle(

@ -10,8 +10,6 @@ import 'package:test_sa/views/widgets/buttons/app_back_button.dart';
import 'package:test_sa/views/widgets/gas_refill/gas_refill_list.dart'; import 'package:test_sa/views/widgets/gas_refill/gas_refill_list.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import '../../../widgets/switch_button.dart';
class TrackGasRefillPage extends StatefulWidget { class TrackGasRefillPage extends StatefulWidget {
static const String id = "/track-gas-refill"; static const String id = "/track-gas-refill";
@ -25,7 +23,6 @@ class _TrackGasRefillPageState extends State<TrackGasRefillPage> with TickerProv
GasRefillProvider _gasRefillProvider; GasRefillProvider _gasRefillProvider;
UserProvider _userProvider; UserProvider _userProvider;
SettingProvider _settingProvider; SettingProvider _settingProvider;
bool mostRecent = false;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -62,11 +59,11 @@ class _TrackGasRefillPageState extends State<TrackGasRefillPage> with TickerProv
children: [ children: [
Row( Row(
children: [ children: [
const ABackButton(), ABackButton(),
Expanded( Expanded(
child: Center( child: Center(
child: Text( child: Text(
"Gas Refill Requests", _subtitle.serviceRequests,
style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.grey3A, fontStyle: FontStyle.italic), style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.grey3A, fontStyle: FontStyle.italic),
), ),
), ),
@ -79,21 +76,6 @@ class _TrackGasRefillPageState extends State<TrackGasRefillPage> with TickerProv
], ],
), ),
), ),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: ASwitchButton(
title: "Most Recent",
value: mostRecent,
onChange: (value) async {
mostRecent = value;
await _gasRefillProvider.getRequests(
user: _userProvider.user,
host: _settingProvider.host,
mostRecent: mostRecent,
);
},
),
),
Expanded( Expanded(
child: GasRefillList( child: GasRefillList(
nextPage: _gasRefillProvider.nextPage, nextPage: _gasRefillProvider.nextPage,

@ -23,6 +23,7 @@ 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/request_device_transfer.dart'; import 'package:test_sa/views/pages/device_transfer/request_device_transfer.dart';
import 'package:test_sa/views/pages/device_transfer/track_device_transfer.dart'; import 'package:test_sa/views/pages/device_transfer/track_device_transfer.dart';
import 'package:test_sa/views/pages/sub_workorder/search_sub_workorder_page.dart';
import 'package:test_sa/views/pages/user/gas_refill/request_gas_refill.dart'; import 'package:test_sa/views/pages/user/gas_refill/request_gas_refill.dart';
import 'package:test_sa/views/pages/user/gas_refill/track_gas_refill.dart'; import 'package:test_sa/views/pages/user/gas_refill/track_gas_refill.dart';
import 'package:test_sa/views/pages/user/requests/create_request.dart'; import 'package:test_sa/views/pages/user/requests/create_request.dart';
@ -198,7 +199,7 @@ class _LandPageState extends State<LandPage> {
}, },
), ),
LandPageItem( LandPageItem(
text: "Transfer Asset", text: "transfer Device",
icon: FontAwesomeIcons.rightLeft, icon: FontAwesomeIcons.rightLeft,
onPressed: () { onPressed: () {
Navigator.of(context).pushNamed(RequestDeviceTransfer.id); Navigator.of(context).pushNamed(RequestDeviceTransfer.id);
@ -211,14 +212,14 @@ class _LandPageState extends State<LandPage> {
Navigator.of(context).pushNamed(TrackDeviceTransferPage.id); Navigator.of(context).pushNamed(TrackDeviceTransferPage.id);
}, },
), ),
// if (_userProvider?.user != null && _userProvider?.user?.type != UsersTypes.normal_user) if (_userProvider?.user != null && _userProvider?.user?.type != UsersTypes.normal_user)
// LandPageItem( LandPageItem(
// text: "Search Work Order", text: "Search Work Order",
// svgPath: "assets/images/sub_workorder_icon.svg", svgPath: "assets/images/sub_workorder_icon.svg",
// onPressed: () { onPressed: () {
// Navigator.of(context).pushNamed(SearchSubWorkOrderPage.id); Navigator.of(context).pushNamed(SearchSubWorkOrderPage.id);
// }, },
// ), ),
], ],
), ),
], ],

@ -12,6 +12,7 @@ import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
class NotificationsPage extends StatefulWidget { class NotificationsPage extends StatefulWidget {
static final String id = "/notifications"; static final String id = "/notifications";
@override @override
_NotificationsPageState createState() => _NotificationsPageState(); _NotificationsPageState createState() => _NotificationsPageState();
} }
@ -21,6 +22,7 @@ class _NotificationsPageState extends State<NotificationsPage> with TickerProvid
UserProvider _userProvider; UserProvider _userProvider;
SettingProvider _settingProvider; SettingProvider _settingProvider;
Subtitle _subtitle; Subtitle _subtitle;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_notificationsProvider = Provider.of<NotificationsProvider>(context); _notificationsProvider = Provider.of<NotificationsProvider>(context);

@ -20,6 +20,7 @@ import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
class ProfilePage extends StatefulWidget { class ProfilePage extends StatefulWidget {
static final String id = "/user/profile"; static final String id = "/user/profile";
@override @override
_ProfilePageState createState() => _ProfilePageState(); _ProfilePageState createState() => _ProfilePageState();
} }
@ -33,6 +34,7 @@ class _ProfilePageState extends State<ProfilePage> {
bool _firstTime = true; bool _firstTime = true;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(); final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);

@ -22,6 +22,7 @@ class ReportIssuesPage extends StatefulWidget {
final ServiceRequest serviceRequest; final ServiceRequest serviceRequest;
const ReportIssuesPage({Key key, this.serviceRequest}) : super(key: key); const ReportIssuesPage({Key key, this.serviceRequest}) : super(key: key);
@override @override
_ReportIssuesPageState createState() => _ReportIssuesPageState(); _ReportIssuesPageState createState() => _ReportIssuesPageState();
} }
@ -35,6 +36,7 @@ class _ReportIssuesPageState extends State<ReportIssuesPage> {
UserProvider _userProvider; UserProvider _userProvider;
SettingProvider _settingProvider; SettingProvider _settingProvider;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Subtitle _subtitle = AppLocalization.of(context).subtitle; Subtitle _subtitle = AppLocalization.of(context).subtitle;

@ -31,8 +31,6 @@ import 'package:test_sa/views/widgets/status/service_request/service_request_thr
import 'package:test_sa/views/widgets/status/service_request/service_request_types_mune.dart'; import 'package:test_sa/views/widgets/status/service_request/service_request_types_mune.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/providers/api/status_drop_down/service_reqest/service_request_through_provider.dart';
import '../../../../controllers/providers/api/status_drop_down/service_reqest/service_request_type_provider.dart';
import '../../../widgets/date_and_time/date_picker.dart'; import '../../../widgets/date_and_time/date_picker.dart';
import '../../../widgets/status/service_request/service_request_first_action.dart'; import '../../../widgets/status/service_request/service_request_first_action.dart';
import '../../../widgets/status/service_request/service_request_loan_availability.dart'; import '../../../widgets/status/service_request/service_request_loan_availability.dart';
@ -40,6 +38,7 @@ import '../../../widgets/status/service_request/service_request_loan_availabilit
class CreateRequestPage extends StatefulWidget { class CreateRequestPage extends StatefulWidget {
static const String id = "/create-request"; static const String id = "/create-request";
final ServiceRequest serviceRequest; final ServiceRequest serviceRequest;
const CreateRequestPage({this.serviceRequest, Key key}) : super(key: key); const CreateRequestPage({this.serviceRequest, Key key}) : super(key: key);
@override @override
@ -59,7 +58,7 @@ class CreateRequestPageState extends State<CreateRequestPage> {
Subtitle _subtitle; Subtitle _subtitle;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(); final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
TextEditingController _maintenanceController, _commentController; TextEditingController _maintenanceController, _commentController, _reviewCommentController;
DateTime _dateTime; DateTime _dateTime;
@override @override
@ -166,11 +165,12 @@ class CreateRequestPageState extends State<CreateRequestPage> {
onSelect: (status) { onSelect: (status) {
_serviceRequest.priority = status; _serviceRequest.priority = status;
}, },
enabled: widget.serviceRequest == null ? true : false,
), ),
const SizedBox( const SizedBox(
height: 8, height: 8,
), ),
const ASubTitle("Defect Type"), const ASubTitle("Equipment Status"),
const SizedBox( const SizedBox(
height: 4, height: 4,
), ),
@ -179,21 +179,22 @@ class CreateRequestPageState extends State<CreateRequestPage> {
onSelect: (status) { onSelect: (status) {
_serviceRequest.defectType = status; _serviceRequest.defectType = status;
}, },
enabled: widget.serviceRequest == null ? true : false,
), ),
12.height, 12.height,
const SizedBox( const SizedBox(
height: 8, height: 8,
), ),
const ASubTitle("Type"), const ASubTitle("Type of Request"),
const SizedBox( const SizedBox(
height: 4, height: 4,
), ),
ServiceRequestTypesMenu( ServiceRequestTypesMenu(
initialValue: _serviceRequest.type, initialValue: _serviceRequest.type,
enabled: widget.serviceRequest != null,
onSelect: (status) { onSelect: (status) {
_serviceRequest.type = status; _serviceRequest.type = status;
}, },
enabled: widget.serviceRequest == null ? true : false,
), ),
const SizedBox( const SizedBox(
height: 8, height: 8,
@ -204,7 +205,10 @@ class CreateRequestPageState extends State<CreateRequestPage> {
), ),
ServiceRequestedThroughMenu( ServiceRequestedThroughMenu(
initialValue: _serviceRequest.requestedThrough, initialValue: _serviceRequest.requestedThrough,
enabled: false, onSelect: (status) {
_serviceRequest.requestedThrough = status;
},
enabled: widget.serviceRequest == null ? true : false,
), ),
if (widget.serviceRequest != null) 12.height, if (widget.serviceRequest != null) 12.height,
if (widget.serviceRequest != null) const ASubTitle("First Action"), if (widget.serviceRequest != null) const ASubTitle("First Action"),
@ -250,7 +254,7 @@ class CreateRequestPageState extends State<CreateRequestPage> {
), ),
if (widget.serviceRequest != null) if (widget.serviceRequest != null)
ATextFormField( ATextFormField(
controller: _commentController, controller: _reviewCommentController,
initialValue: _serviceRequest.reviewComment, initialValue: _serviceRequest.reviewComment,
hintText: _subtitle.comment, hintText: _subtitle.comment,
style: Theme.of(context).textTheme.titleMedium, style: Theme.of(context).textTheme.titleMedium,
@ -258,14 +262,19 @@ class CreateRequestPageState extends State<CreateRequestPage> {
onSaved: (value) { onSaved: (value) {
_serviceRequest.reviewComment = value; _serviceRequest.reviewComment = value;
}, },
enable: widget.serviceRequest != null ? false : true,
), ),
12.height, 12.height,
MultiImagesPicker( MultiImagesPicker(
label: _subtitle.deviceImages, label: _subtitle.deviceImages,
images: _deviceImages, images: _deviceImages,
enabled: widget.serviceRequest == null ? true : false,
), ),
12.height, 12.height,
SpeechToTextButton(controller: _maintenanceController), SpeechToTextButton(
controller: _maintenanceController,
enabled: widget.serviceRequest == null ? true : false,
),
12.height, 12.height,
ATextFormField( ATextFormField(
controller: _maintenanceController, controller: _maintenanceController,
@ -278,11 +287,15 @@ class CreateRequestPageState extends State<CreateRequestPage> {
onSaved: (value) { onSaved: (value) {
_serviceRequest.callComments = value; _serviceRequest.callComments = value;
}, },
enable: widget.serviceRequest == null ? true : false,
), ),
12.height, 12.height,
RecordSound(onRecord: (audio) { RecordSound(
_serviceRequest.audio = audio; onRecord: (audio) {
}), _serviceRequest.audio = audio;
},
enabled: widget.serviceRequest == null ? true : false,
),
12.height, 12.height,
if (widget.serviceRequest != null) if (widget.serviceRequest != null)
ATextFormField( ATextFormField(
@ -317,10 +330,6 @@ class CreateRequestPageState extends State<CreateRequestPage> {
} }
_formKey.currentState.save(); _formKey.currentState.save();
_serviceRequest.deviceId = _device?.id; _serviceRequest.deviceId = _device?.id;
if (widget.serviceRequest == null) {
_serviceRequest.type = Provider.of<ServiceRequestTypeProvider>(context, listen: false).getDefaultItem();
}
_serviceRequest.requestedThrough = Provider.of<ServiceRequestedThroughProvider>(context, listen: false).getDefaultItem();
_isLoading = true; _isLoading = true;
setState(() {}); setState(() {});
_serviceRequest.devicePhotos = _deviceImages.map((e) => "${e.path.split("/").last}|${base64Encode(e.readAsBytesSync())}").toList(); _serviceRequest.devicePhotos = _deviceImages.map((e) => "${e.path.split("/").last}|${base64Encode(e.readAsBytesSync())}").toList();

@ -20,6 +20,7 @@ class FutureRequestServiceDetails extends StatefulWidget {
class _FutureRequestServiceDetailsState extends State<FutureRequestServiceDetails> { class _FutureRequestServiceDetailsState extends State<FutureRequestServiceDetails> {
UserProvider _userProvider; UserProvider _userProvider;
SettingProvider _settingProvider; SettingProvider _settingProvider;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);

@ -155,12 +155,17 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
) )
]), ]),
child: Wrap( child: Wrap(
direction: Axis.vertical,
spacing: 10, spacing: 10,
children: [ children: [
ASubTitle( ASubTitle(
"${_subtitle.callId}: ${widget.request.requestCode}", "${_subtitle.callId}: ${widget.request.requestCode}",
font: 14, font: 14,
), ),
ASubTitle(
"${_subtitle.assetNumber}: ${widget.request.deviceNumber}",
font: 14,
),
widget.request.deviceSerialNumber == null widget.request.deviceSerialNumber == null
? const SizedBox() ? const SizedBox()
: ASubTitle( : ASubTitle(
@ -281,7 +286,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
const SizedBox( const SizedBox(
height: 8, height: 8,
), ),
ASubTitle(_subtitle.assetType ??""), ASubTitle(_subtitle.assetType ?? ""),
_validate && _serviceReport.assetType == null _validate && _serviceReport.assetType == null
? ASubTitle( ? ASubTitle(
_subtitle.requiredWord, _subtitle.requiredWord,
@ -632,7 +637,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
image: _image, image: _image,
onPick: (image) { onPick: (image) {
_image = image; _image = image;
_serviceReport.image = "${image.path.split("/").last}|${base64Encode(image.readAsBytesSync())}"; _serviceReport.image[0] = "${image.path.split("/").last}|${base64Encode(image.readAsBytesSync())}";
}, },
), ),
], ],

@ -38,6 +38,8 @@ import 'package:test_sa/views/widgets/status/report/service_report_repair_locati
import 'package:test_sa/views/widgets/timer/app_timer.dart'; import 'package:test_sa/views/widgets/timer/app_timer.dart';
import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart';
import '../../../../widgets/images/multi_image_picker.dart';
class EditServiceReport extends StatefulWidget { class EditServiceReport extends StatefulWidget {
static final String id = "/edit-service-report"; static final String id = "/edit-service-report";
final ServiceRequest request; final ServiceRequest request;
@ -60,7 +62,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
bool _showCommentField = false; bool _showCommentField = false;
Subtitle _subtitle; Subtitle _subtitle;
File _image; final List<File> _images = [];
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(); final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
TextEditingController _faultController = TextEditingController(); TextEditingController _faultController = TextEditingController();
@ -149,12 +151,17 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
) )
]), ]),
child: Wrap( child: Wrap(
direction: Axis.vertical,
spacing: 10, spacing: 10,
children: [ children: [
ASubTitle( ASubTitle(
"${_subtitle.callId}: ${widget.request.requestCode}", "${_subtitle.callId}: ${widget.request.requestCode}",
font: 14, font: 14,
), ),
ASubTitle(
"${_subtitle.assetNumber}: ${widget.request.deviceNumber}",
font: 14,
),
widget.request.deviceSerialNumber == null widget.request.deviceSerialNumber == null
? const SizedBox() ? const SizedBox()
: ASubTitle( : ASubTitle(
@ -380,6 +387,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
setState(() {}); setState(() {});
} else { } else {
_serviceReport.callLastSituation = status; _serviceReport.callLastSituation = status;
setState(() {});
} }
}, },
), ),
@ -390,6 +398,56 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
), ),
], ],
), ),
const SizedBox(
height: 8,
),
ASubTitle("Return to Service"),
Row(
children: [
Expanded(
child: ADatePicker(
date: _serviceReport.returnToService,
from: DateTime.now().subtract(const Duration(days: 365)),
to: DateTime.now().add(const Duration(days: 365)),
onDatePicker: (date) {
_serviceReport.returnToService = date;
setState(() {});
},
),
),
],
),
if (_serviceReport.callLastSituation.value == 2)
Column(
children: [
const SizedBox(
height: 8,
),
ATextFormField(
initialValue: _serviceReport?.reviewComment,
hintText: "Vendor Name",
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.titleMedium,
textInputType: TextInputType.multiline,
onSaved: (value) {
_serviceReport.reviewComment = value;
},
),
const SizedBox(
height: 8,
),
ATextFormField(
initialValue: _serviceReport?.reviewComment,
hintText: "Vendor Engineer",
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.titleMedium,
textInputType: TextInputType.multiline,
onSaved: (value) {
_serviceReport.reviewComment = value;
},
),
],
),
if (_showCommentField) if (_showCommentField)
const SizedBox( const SizedBox(
height: 8, height: 8,
@ -664,7 +722,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
}, },
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
ASubTitle(_subtitle.workPreformed), ASubTitle("Solutions"),
const SizedBox(height: 4), const SizedBox(height: 4),
ATextFormField( ATextFormField(
initialValue: _serviceReport?.workPreformed, initialValue: _serviceReport?.workPreformed,
@ -680,50 +738,38 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
}, },
), ),
const SizedBox(height: 4), const SizedBox(height: 4),
Row( ASubTitle("Failure Reason"),
children: [ const SizedBox(
// reasons height: 4,
Expanded( ),
child: Column( ServiceReportReasonsMenu(
crossAxisAlignment: CrossAxisAlignment.start, initialValue: _serviceReport.reason,
children: [ onSelect: (status) {
ASubTitle(_subtitle.reasons), _serviceReport.reason = status;
const SizedBox( },
height: 4,
),
ServiceReportReasonsMenu(
initialValue: _serviceReport.reason,
onSelect: (status) {
_serviceReport.reason = status;
},
),
],
),
),
const SizedBox(
width: 8,
),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ASubTitle(_subtitle.attachImage),
AMiniOneImagePicker(
//error: _validate && _serviceReport.image == null,
image: _image,
onPick: (image) {
_image = image;
_serviceReport.image = base64Encode(image.readAsBytesSync());
},
),
],
),
),
],
), ),
const SizedBox( const SizedBox(
height: 8, height: 8,
), ),
ASubTitle(_subtitle.attachImage),
const SizedBox(
height: 4,
),
MultiImagesPicker(
label: "",
images: _images,
),
// AMiniOneImagePicker(
// //error: _validate && _serviceReport.image == null,
// image: _image,
// onPick: (image) {
// _image = image;
// _serviceReport.image = base64Encode(image.readAsBytesSync());
// },
// ),
const SizedBox(
height: 8,
),
const SizedBox(height: 8), const SizedBox(height: 8),
ASubTitle(_subtitle.repairLocation), ASubTitle(_subtitle.repairLocation),
const SizedBox(height: 4), const SizedBox(height: 4),
@ -734,7 +780,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
}, },
), ),
const SizedBox(height: 16), const SizedBox(height: 16),
ASubTitle(_subtitle.travelingExpense), ASubTitle("Travel Expenses"),
const SizedBox( const SizedBox(
height: 4, height: 4,
), ),
@ -885,7 +931,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
//const SizedBox(height: 8,), //const SizedBox(height: 8,),
const SizedBox(height: 8), const SizedBox(height: 8),
ASubTitle(_subtitle.comment), ASubTitle("technical comment"),
const SizedBox(height: 4), const SizedBox(height: 4),
ATextFormField( ATextFormField(
initialValue: _serviceReport?.comment, initialValue: _serviceReport?.comment,
@ -1026,7 +1072,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
_isLoading = true; _isLoading = true;
setState(() {}); setState(() {});
_serviceReport.image = _images.map((e) => base64Encode(e.readAsBytesSync())).toList();
int status = await _serviceRequestsProvider.updateServiceReport(user: _userProvider.user, host: _settingProvider.host, report: _serviceReport, request: widget.request); int status = await _serviceRequestsProvider.updateServiceReport(user: _userProvider.user, host: _settingProvider.host, report: _serviceReport, request: widget.request);
_isLoading = false; _isLoading = false;
setState(() {}); setState(() {});

@ -26,6 +26,7 @@ class FutureServiceReport extends StatefulWidget {
class _FutureServiceReportState extends State<FutureServiceReport> { class _FutureServiceReportState extends State<FutureServiceReport> {
UserProvider _userProvider; UserProvider _userProvider;
SettingProvider _settingProvider; SettingProvider _settingProvider;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);

@ -186,7 +186,7 @@ class RequestDetailsPage extends StatelessWidget {
padding: EdgeInsets.symmetric(horizontal: 16), padding: EdgeInsets.symmetric(horizontal: 16),
children: [ children: [
RequestInfoRow( RequestInfoRow(
title: _subtitle.code, title: _subtitle.callId,
info: serviceRequest.requestCode, info: serviceRequest.requestCode,
), ),
RequestInfoRow( RequestInfoRow(
@ -246,10 +246,10 @@ class RequestDetailsPage extends StatelessWidget {
// title: _subtitle.deviceArName, // title: _subtitle.deviceArName,
// content: serviceRequest.deviceArName, // content: serviceRequest.deviceArName,
// ), // ),
RequestInfoRow( // RequestInfoRow(
title: _subtitle.deviceName, // title: _subtitle.deviceName,
content: serviceRequest.deviceEnName, // content: serviceRequest.deviceEnName,
), // ),
RequestInfoRow( RequestInfoRow(
title: _subtitle.maintenanceIssue, title: _subtitle.maintenanceIssue,
content: serviceRequest.callComments, content: serviceRequest.callComments,
@ -354,6 +354,10 @@ class RequestDetailsPage extends StatelessWidget {
title: _subtitle.assetName, title: _subtitle.assetName,
info: workOrders[index].callRequest.asset.modelDefinition.assetName, info: workOrders[index].callRequest.asset.modelDefinition.assetName,
), ),
RequestInfoRow(
title: _subtitle.assetNumber,
info: workOrders[index].callRequest.asset.assetNumber,
),
RequestInfoRow( RequestInfoRow(
title: _subtitle.model, title: _subtitle.model,
info: workOrders[index].callRequest.asset.modelDefinition.modelName, info: workOrders[index].callRequest.asset.modelDefinition.modelName,
@ -363,11 +367,7 @@ class RequestDetailsPage extends StatelessWidget {
info: workOrders[index].callRequest.asset.site.custName, info: workOrders[index].callRequest.asset.site.custName,
), ),
RequestInfoRow( RequestInfoRow(
title: _subtitle.maintenanceSituation, title: "Call last Situation",
info: workOrders[index].calllastSituation.name ?? '',
),
RequestInfoRow(
title: _subtitle.currentSituation,
info: workOrders[index].currentSituation.name ?? '', info: workOrders[index].currentSituation.name ?? '',
), ),
_userProvider.user.type == UsersTypes.engineer && workOrders[index].workOrderNo != null _userProvider.user.type == UsersTypes.engineer && workOrders[index].workOrderNo != null

@ -15,6 +15,7 @@ import 'package:test_sa/views/widgets/search/service_request_search_bar.dart';
class ServiceRequestsPage extends StatefulWidget { class ServiceRequestsPage extends StatefulWidget {
static final String id = "/service-requests"; static final String id = "/service-requests";
@override @override
_ServiceRequestsPageState createState() => _ServiceRequestsPageState(); _ServiceRequestsPageState createState() => _ServiceRequestsPageState();
} }
@ -25,6 +26,7 @@ class _ServiceRequestsPageState extends State<ServiceRequestsPage> with TickerPr
SettingProvider _settingProvider; SettingProvider _settingProvider;
bool _expandedSearch = false; bool _expandedSearch = false;
bool _firstTime = true; bool _firstTime = true;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context); _serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context);

@ -22,6 +22,7 @@ import '../../../../widgets/pentry/pentry_info_form.dart';
class EditPentry extends StatefulWidget { class EditPentry extends StatefulWidget {
final Pentry pentry; final Pentry pentry;
final Visit visit; final Visit visit;
const EditPentry({Key key, this.pentry, this.visit}) : super(key: key); const EditPentry({Key key, this.pentry, this.visit}) : super(key: key);
@override @override
@ -39,6 +40,7 @@ class _EditPentryState extends State<EditPentry> with SingleTickerProviderStateM
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(); final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
TabController _tabController; TabController _tabController;
_onSubmit() async { _onSubmit() async {
_validate = true; _validate = true;

@ -21,6 +21,7 @@ import 'package:test_sa/views/widgets/visits/visits_list.dart';
class PreventiveMaintenanceVisitsPage extends StatefulWidget { class PreventiveMaintenanceVisitsPage extends StatefulWidget {
static final String id = "/preventive-maintenance-visits"; static final String id = "/preventive-maintenance-visits";
@override @override
_PreventiveMaintenanceVisitsPageState createState() => _PreventiveMaintenanceVisitsPageState(); _PreventiveMaintenanceVisitsPageState createState() => _PreventiveMaintenanceVisitsPageState();
} }

@ -21,6 +21,7 @@ import 'package:test_sa/views/widgets/visits/visits_list.dart';
class RegularVisitsPage extends StatefulWidget { class RegularVisitsPage extends StatefulWidget {
static final String id = "/Regular-visits"; static final String id = "/Regular-visits";
@override @override
_RegularVisitsPageState createState() => _RegularVisitsPageState(); _RegularVisitsPageState createState() => _RegularVisitsPageState();
} }
@ -31,6 +32,7 @@ class _RegularVisitsPageState extends State<RegularVisitsPage> with TickerProvid
SettingProvider _settingProvider; SettingProvider _settingProvider;
bool _expandedSearch = false; bool _expandedSearch = false;
Subtitle _subtitle; Subtitle _subtitle;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_visitsProvider = Provider.of<RegularVisitsProvider>(context); _visitsProvider = Provider.of<RegularVisitsProvider>(context);

@ -18,6 +18,7 @@ import 'package:test_sa/views/widgets/visits/visit_status.dart';
class UpdateVisitsGroupSheet extends StatefulWidget { class UpdateVisitsGroupSheet extends StatefulWidget {
final List<Visit> visits; final List<Visit> visits;
final String title; final String title;
const UpdateVisitsGroupSheet({Key key, this.visits, this.title}) : super(key: key); const UpdateVisitsGroupSheet({Key key, this.visits, this.title}) : super(key: key);
@override @override
@ -36,6 +37,7 @@ class _UpdateVisitsGroupSheetState extends State<UpdateVisitsGroupSheet> {
// Lookup(name: "Failed", id: 1), // Lookup(name: "Failed", id: 1),
// ]; // ];
VisitsGroup _group = VisitsGroup(); VisitsGroup _group = VisitsGroup();
// File _image; // File _image;
Subtitle _subtitle; Subtitle _subtitle;

@ -73,21 +73,20 @@ class VisitDetailsPage extends StatelessWidget {
), ),
MaterialButton( MaterialButton(
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
onPressed: visit.images.isEmpty || (visit.images?.first?.isEmpty ?? false) onPressed: () {
? () {} if(visit.images.first != null)
: () { Navigator.of(context).push(MaterialPageRoute(
Navigator.of(context).push(MaterialPageRoute( builder: (_) => Scaffold(
builder: (_) => Scaffold( body: InteractiveViewer(
body: InteractiveViewer( child: Center(
child: Center( child: ImageLoader(
child: ImageLoader( url: visit.images.first,
url: visit.images.first, boxFit: BoxFit.contain,
boxFit: BoxFit.contain, ),
), ),
), ),
), )));
))); },
},
child: SizedBox( child: SizedBox(
height: 140 * AppStyle.getScaleFactor(context), height: 140 * AppStyle.getScaleFactor(context),
width: MediaQuery.of(context).size.width, width: MediaQuery.of(context).size.width,
@ -117,6 +116,10 @@ class VisitDetailsPage extends StatelessWidget {
title: "Asset Number", title: "Asset Number",
info: visit.deviceNumber, info: visit.deviceNumber,
), ),
RequestInfoRow(
title: _subtitle.deviceName,
content: visit.deviceEnglishName,
),
RequestInfoRow( RequestInfoRow(
title: _subtitle.deviceSN, title: _subtitle.deviceSN,
info: visit.deviceSerialNumber, info: visit.deviceSerialNumber,
@ -158,10 +161,6 @@ class VisitDetailsPage extends StatelessWidget {
title: _subtitle.hospital, title: _subtitle.hospital,
content: visit.hospitalName, content: visit.hospitalName,
), ),
RequestInfoRow(
title: _subtitle.deviceName,
content: visit.deviceEnglishName,
),
], ],
), ),
), ),

@ -9,6 +9,7 @@ class AFlatButton extends StatelessWidget {
final VoidCallback onPressed; final VoidCallback onPressed;
const AFlatButton({Key key, this.text, this.textColor, this.style, this.onPressed, this.padding}) : super(key: key); const AFlatButton({Key key, this.text, this.textColor, this.style, this.onPressed, this.padding}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return TextButton( return TextButton(

@ -9,6 +9,7 @@ class ASmallButton extends StatelessWidget {
final VoidCallback onPressed; final VoidCallback onPressed;
const ASmallButton({Key key, this.text, this.style, this.onPressed, this.padding, this.color}) : super(key: key); const ASmallButton({Key key, this.text, this.style, this.onPressed, this.padding, this.color}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return ElevatedButton( return ElevatedButton(

@ -12,6 +12,7 @@ class FromToDateBar extends StatefulWidget {
final Function(DateTime) onPickTo; final Function(DateTime) onPickTo;
const FromToDateBar({Key key, this.from, this.to, this.onPickFrom, this.onPickTo}) : super(key: key); const FromToDateBar({Key key, this.from, this.to, this.onPickFrom, this.onPickTo}) : super(key: key);
@override @override
_FromToDateBarState createState() => _FromToDateBarState(); _FromToDateBarState createState() => _FromToDateBarState();
} }

@ -8,6 +8,7 @@ class DepartmentItem extends StatelessWidget {
final Function(Department) onPressed; final Function(Department) onPressed;
const DepartmentItem({Key key, this.department, this.onPressed}) : super(key: key); const DepartmentItem({Key key, this.department, this.onPressed}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Padding( return Padding(

@ -13,6 +13,7 @@ import '../app_text_form_field.dart';
class SingleDepartmentPicker extends StatefulWidget { class SingleDepartmentPicker extends StatefulWidget {
static final String id = "/single-Department-Picker"; static final String id = "/single-Department-Picker";
@override @override
_SingleDepartmentPickerState createState() => _SingleDepartmentPickerState(); _SingleDepartmentPickerState createState() => _SingleDepartmentPickerState();
} }
@ -22,6 +23,7 @@ class _SingleDepartmentPickerState extends State<SingleDepartmentPicker> {
SettingProvider _settingProvider; SettingProvider _settingProvider;
List<Department> _searchableList = []; List<Department> _searchableList = [];
bool _firstTime = true; bool _firstTime = true;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_departmentsProvider = Provider.of<DepartmentsProvider>(context); _departmentsProvider = Provider.of<DepartmentsProvider>(context);

@ -11,8 +11,10 @@ import '../../../controllers/providers/api/user_provider.dart';
class DeviceTransferInfoSection extends StatelessWidget { class DeviceTransferInfoSection extends StatelessWidget {
final DeviceTransferInfo info; final DeviceTransferInfo info;
final bool isSender;
final VoidCallback onEdit; final VoidCallback onEdit;
const DeviceTransferInfoSection({Key key, this.info, this.onEdit}) : super(key: key);
const DeviceTransferInfoSection({Key key, this.info, this.onEdit, this.isSender}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -30,7 +32,7 @@ class DeviceTransferInfoSection extends StatelessWidget {
info: info.department.name, info: info.department.name,
), ),
RequestInfoRow( RequestInfoRow(
title: subtitle.engineerName, title: isSender ? "Sender Name " : "Receiver Name",
info: info.userName, info: info.userName,
), ),
RequestInfoRow( RequestInfoRow(
@ -46,7 +48,7 @@ class DeviceTransferInfoSection extends StatelessWidget {
info: info.comment, info: info.comment,
), ),
RequestInfoRow( RequestInfoRow(
title: "Assigned FE", title: "Assigned Engineer",
info: info.assignedEmployeeName, info: info.assignedEmployeeName,
), ),
RequestInfoRow( RequestInfoRow(

@ -56,20 +56,6 @@ class DeviceButton extends StatelessWidget {
subtitle: Column( subtitle: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Divider(
color: Theme.of(context).textTheme.subtitle1.color,
),
Text(
"${_subtitle.assetNumber} : ${device.number}",
style: Theme.of(context).textTheme.subtitle2,
),
Divider(
color: Theme.of(context).textTheme.subtitle1.color,
),
Text(
"${_subtitle.assetName} : ${device.modelDefinition.assetName}",
style: Theme.of(context).textTheme.subtitle2,
),
Divider( Divider(
color: Theme.of(context).textTheme.subtitle1.color, color: Theme.of(context).textTheme.subtitle1.color,
), ),

@ -10,6 +10,7 @@ class DeviceItem extends StatelessWidget {
final Function(Device) onPressed; final Function(Device) onPressed;
const DeviceItem({Key key, this.device, this.onPressed}) : super(key: key); const DeviceItem({Key key, this.device, this.onPressed}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Subtitle _subtitle = AppLocalization.of(context).subtitle; Subtitle _subtitle = AppLocalization.of(context).subtitle;

@ -1,4 +1,5 @@
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/localization/localization.dart'; import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/controllers/providers/api/devices_provider.dart'; import 'package:test_sa/controllers/providers/api/devices_provider.dart';
@ -17,6 +18,7 @@ import '../qr/scan_qr.dart';
class SingleDevicePicker extends StatefulWidget { class SingleDevicePicker extends StatefulWidget {
static final String id = "/single-device-Picker"; static final String id = "/single-device-Picker";
final bool sandraChoice = true; final bool sandraChoice = true;
@override @override
_SingleDevicePickerState createState() => _SingleDevicePickerState(); _SingleDevicePickerState createState() => _SingleDevicePickerState();
} }
@ -32,6 +34,7 @@ class _SingleDevicePickerState extends State<SingleDevicePicker> {
TextEditingController numberController = TextEditingController(); TextEditingController numberController = TextEditingController();
TextEditingController snController = TextEditingController(); TextEditingController snController = TextEditingController();
_getDevice(String result) async { _getDevice(String result) async {
print(result); print(result);
if (result == null) return; if (result == null) return;

@ -80,7 +80,7 @@ class _BuildingTypeMenuState extends State<BuildingTypeMenu> {
return DropdownMenuItem<Buildings>( return DropdownMenuItem<Buildings>(
value: value, value: value,
child: Text( child: Text(
value.name ?? "", value.name,
style: Theme.of(context).textTheme.subtitle1.copyWith( style: Theme.of(context).textTheme.subtitle1.copyWith(
color: Theme.of(context).primaryColor, color: Theme.of(context).primaryColor,
fontSize: 11, fontSize: 11,

@ -80,7 +80,7 @@ class _FloorTypeMenuState extends State<FloorTypeMenu> {
return DropdownMenuItem<Floors>( return DropdownMenuItem<Floors>(
value: value, value: value,
child: Text( child: Text(
value.name ?? "", value.name,
style: Theme.of(context).textTheme.subtitle1.copyWith( style: Theme.of(context).textTheme.subtitle1.copyWith(
color: Theme.of(context).primaryColor, color: Theme.of(context).primaryColor,
fontSize: 11, fontSize: 11,

@ -1,7 +1,11 @@
import 'package:flutter/cupertino.dart';
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/localization/localization.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/models/gas_refill/gas_refill_model.dart'; import 'package:test_sa/models/gas_refill/gas_refill_model.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/models/user.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/widgets/requests/request_status.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart';
@ -10,11 +14,13 @@ class GasRefillItem extends StatelessWidget {
final int index; final int index;
final GasRefillModel item; final GasRefillModel item;
final Function(GasRefillModel) onPressed; final Function(GasRefillModel) onPressed;
const GasRefillItem({Key key, this.item, this.onPressed, this.index}) : super(key: key); const GasRefillItem({Key key, this.item, this.onPressed, this.index}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Subtitle subtitle = AppLocalization.of(context).subtitle; Subtitle _subtitle = AppLocalization.of(context).subtitle;
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 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; Color onItemColor = index % 2 != 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary;
@ -22,7 +28,7 @@ class GasRefillItem extends StatelessWidget {
padding: const EdgeInsets.symmetric(vertical: 4), padding: const EdgeInsets.symmetric(vertical: 4),
child: ElevatedButton( child: ElevatedButton(
style: ElevatedButton.styleFrom( style: ElevatedButton.styleFrom(
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 8), padding: EdgeInsets.symmetric(vertical: 8, horizontal: 8),
backgroundColor: itemColor, backgroundColor: itemColor,
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)),
@ -43,14 +49,14 @@ class GasRefillItem extends StatelessWidget {
children: [ children: [
Text( Text(
item.title ?? "-----", item.title ?? "-----",
style: Theme.of(context).textTheme.titleLarge.copyWith(color: onItemColor, fontSize: 16, fontWeight: FontWeight.bold), style: Theme.of(context).textTheme.headline6.copyWith(color: onItemColor, fontSize: 16, fontWeight: FontWeight.bold),
), ),
Row( Row(
children: [ children: [
Expanded( Expanded(
child: Text( child: Text(
subtitle.hospital, _subtitle.hospital,
style: Theme.of(context).textTheme.titleSmall.copyWith( style: Theme.of(context).textTheme.subtitle2.copyWith(
color: onItemColor, color: onItemColor,
), ),
), ),
@ -58,48 +64,29 @@ class GasRefillItem extends StatelessWidget {
if (item.clientName != null) if (item.clientName != null)
Text( Text(
item.clientName, item.clientName,
style: Theme.of(context).textTheme.titleSmall.copyWith( style: Theme.of(context).textTheme.subtitle2.copyWith(
color: onItemColor, color: onItemColor,
), ),
), ),
], ],
), ),
Divider(color: onItemColor), Divider(
color: onItemColor,
),
Row( Row(
children: [ children: [
Expanded( Expanded(
child: Text(subtitle.status, style: Theme.of(context).textTheme.titleSmall.copyWith(color: onItemColor)), child: Text(
_subtitle.status,
style: Theme.of(context).textTheme.subtitle2.copyWith(
color: onItemColor,
),
),
), ),
if (item.status?.id != null) StatusLabel(label: item.status.name, color: AColors.getGasStatusColor(item.status.id)), if (item.status?.id != null) StatusLabel(label: item.status.name, color: AColors.getGasStatusColor(item.status.id)),
], ],
), ),
if (item?.expectedDate != null) Divider(color: onItemColor), //Divider(color: onItemColor,),
if (item?.expectedDate != null)
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text("Visit Date", style: Theme.of(context).textTheme.titleSmall.copyWith(color: onItemColor)),
Text(item.expectedDate.toIso8601String().split("T").first, style: Theme.of(context).textTheme.titleSmall.copyWith(color: onItemColor)),
],
),
if (item?.details?.isNotEmpty ?? false) Divider(color: onItemColor),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (item?.details?.isNotEmpty ?? false) Text("Gas Type", style: Theme.of(context).textTheme.titleSmall.copyWith(color: onItemColor)),
Column(
crossAxisAlignment: CrossAxisAlignment.end,
children: item.details
.map(
(gas) => gas?.type?.name?.isNotEmpty ?? false
? Text(gas?.type?.name, style: Theme.of(context).textTheme.titleSmall.copyWith(color: onItemColor))
: const SizedBox.shrink(),
)
.toList(),
)
],
),
], ],
), ),
), ),

@ -12,6 +12,7 @@ import 'package:test_sa/views/app_style/sizing.dart';
class HospitalAutoCompleteField extends StatefulWidget { class HospitalAutoCompleteField extends StatefulWidget {
final String initialValue; final String initialValue;
final Function(Hospital) onSearch; final Function(Hospital) onSearch;
//final Function(Hospital) onSave; //final Function(Hospital) onSave;
const HospitalAutoCompleteField({ const HospitalAutoCompleteField({

@ -8,12 +8,10 @@ import 'package:test_sa/models/hospital.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.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/widgets/loaders/app_loading.dart';
class HospitalAutoCompleteField extends StatefulWidget { class HospitalAutoCompleteField extends StatefulWidget {
final String initialValue; final String initialValue;
final Function(Hospital) onSearch; final Function(Hospital) onSearch;
final bool enabled;
//final Function(Hospital) onSave; //final Function(Hospital) onSave;
@ -21,7 +19,6 @@ class HospitalAutoCompleteField extends StatefulWidget {
Key key, Key key,
this.onSearch, this.onSearch,
this.initialValue, this.initialValue,
this.enabled = true,
}) : super(key: key); }) : super(key: key);
@override @override
@ -69,41 +66,32 @@ class _HospitalAutoCompleteFieldState extends State<HospitalAutoCompleteField> {
// AppStyle.boxShadow // AppStyle.boxShadow
// ] // ]
), ),
child: widget.enabled child: TypeAheadField<Hospital>(
? TypeAheadField<Hospital>( textFieldConfiguration: TextFieldConfiguration(
textFieldConfiguration: TextFieldConfiguration( style: Theme.of(context).textTheme.headline6,
style: Theme.of(context).textTheme.headline6, controller: _controller,
controller: _controller, textAlign: TextAlign.center,
textAlign: TextAlign.center, decoration: InputDecoration(
decoration: InputDecoration( hintText: _subtitle.hospital,
hintText: _subtitle.hospital, border: InputBorder.none,
border: InputBorder.none, disabledBorder: InputBorder.none,
disabledBorder: InputBorder.none, focusedBorder: InputBorder.none,
focusedBorder: InputBorder.none, enabledBorder: InputBorder.none,
enabledBorder: InputBorder.none, ),
), textInputAction: TextInputAction.search,
textInputAction: TextInputAction.search, ),
), suggestionsCallback: (vale) async {
suggestionsCallback: (vale) async { return await HospitalsProvider().getHospitalsListByVal(searchVal: _controller.text);
return await HospitalsProvider().getHospitalsListByVal(searchVal: _controller.text); },
}, itemBuilder: (context, hospital) {
itemBuilder: (context, hospital) { return ListTile(
return ListTile( title: Text(hospital.name),
title: Text(hospital.name), );
); },
}, onSuggestionSelected: (hospital) {
onSuggestionSelected: (hospital) { widget.onSearch(hospital);
widget.onSearch(hospital); },
}, ),
)
: widget.initialValue == null
? const Padding(
padding: EdgeInsets.all(8.0),
child: ALoading(),
)
: ListTile(
title: Center(child: Text(widget.initialValue)),
),
); );
} }
} }

@ -8,6 +8,7 @@ class HospitalItem extends StatelessWidget {
final Function(Hospital) onPressed; final Function(Hospital) onPressed;
const HospitalItem({Key key, this.hospital, this.onPressed}) : super(key: key); const HospitalItem({Key key, this.hospital, this.onPressed}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Padding( return Padding(

@ -14,6 +14,7 @@ import '../app_text_form_field.dart';
class SingleHospitalPicker extends StatefulWidget { class SingleHospitalPicker extends StatefulWidget {
static final String id = "/single-Hospital-Picker"; static final String id = "/single-Hospital-Picker";
final bool sandraChoice = true; final bool sandraChoice = true;
@override @override
_SingleHospitalPickerState createState() => _SingleHospitalPickerState(); _SingleHospitalPickerState createState() => _SingleHospitalPickerState();
} }
@ -23,6 +24,7 @@ class _SingleHospitalPickerState extends State<SingleHospitalPicker> {
SettingProvider _settingProvider; SettingProvider _settingProvider;
List<Hospital> _searchableList = []; List<Hospital> _searchableList = [];
bool _firstTime = true; bool _firstTime = true;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_hospitalsProvider = Provider.of<HospitalsProvider>(context); _hospitalsProvider = Provider.of<HospitalsProvider>(context);

@ -5,6 +5,7 @@ import 'package:test_sa/views/widgets/loaders/image_loader.dart';
class ImagesViewer extends StatelessWidget { class ImagesViewer extends StatelessWidget {
final List<String> images; final List<String> images;
final int initialIndex; final int initialIndex;
const ImagesViewer({ const ImagesViewer({
Key key, Key key,
this.images, this.images,

@ -12,6 +12,7 @@ class AMiniOneImagePicker extends StatefulWidget {
final File image; final File image;
final String label; final String label;
final bool error; final bool error;
const AMiniOneImagePicker({Key key, this.label, this.error, this.image, this.onPick}) : super(key: key); const AMiniOneImagePicker({Key key, this.label, this.error, this.image, this.onPick}) : super(key: key);
@override @override
@ -21,6 +22,7 @@ class AMiniOneImagePicker extends StatefulWidget {
class _AMiniOneImagePickerState extends State<AMiniOneImagePicker> { class _AMiniOneImagePickerState extends State<AMiniOneImagePicker> {
File _image; File _image;
Subtitle _subtitle; Subtitle _subtitle;
@override @override
void initState() { void initState() {
super.initState(); super.initState();

@ -17,8 +17,9 @@ class MultiImagesPicker extends StatefulWidget {
final String label; final String label;
final bool error; final bool error;
final List<File> images; final List<File> images;
final bool enabled;
const MultiImagesPicker({Key key, this.images, this.label, this.error = false}) : super(key: key); const MultiImagesPicker({Key key, this.images, this.label, this.error = false, this.enabled = true}) : super(key: key);
@override @override
_MultiImagesPickerState createState() => _MultiImagesPickerState(); _MultiImagesPickerState createState() => _MultiImagesPickerState();
@ -57,9 +58,11 @@ class _MultiImagesPickerState extends State<MultiImagesPicker> with TickerProvid
), ),
AFlatButton( AFlatButton(
text: _subtitle.add, text: _subtitle.add,
onPressed: () { onPressed: widget.enabled
onImagePick(_subtitle); ? () {
}, onImagePick(_subtitle);
}
: null,
), ),
], ],
), ),
@ -101,9 +104,11 @@ class _MultiImagesPickerState extends State<MultiImagesPicker> with TickerProvid
), ),
child: widget.images.isEmpty child: widget.images.isEmpty
? MaterialButton( ? MaterialButton(
onPressed: () { onPressed: widget.enabled
onImagePick(_subtitle); ? () {
}, onImagePick(_subtitle);
}
: null,
child: Center( child: Center(
child: Icon( child: Icon(
Icons.add_a_photo_outlined, Icons.add_a_photo_outlined,

@ -12,6 +12,7 @@ class AOneImagePicker extends StatefulWidget {
final File image; final File image;
final String label; final String label;
final bool error; final bool error;
const AOneImagePicker({Key key, this.label, this.error, this.image, this.onPick}) : super(key: key); const AOneImagePicker({Key key, this.label, this.error, this.image, this.onPick}) : super(key: key);
@override @override
@ -21,6 +22,7 @@ class AOneImagePicker extends StatefulWidget {
class _AOneImagePickerState extends State<AOneImagePicker> { class _AOneImagePickerState extends State<AOneImagePicker> {
File _image; File _image;
Subtitle _subtitle; Subtitle _subtitle;
@override @override
void initState() { void initState() {
super.initState(); super.initState();

@ -6,6 +6,7 @@ class FailedLoading extends StatelessWidget {
final VoidCallback onReload; final VoidCallback onReload;
const FailedLoading({Key key, this.message, this.onReload}) : super(key: key); const FailedLoading({Key key, this.message, this.onReload}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Center( return Center(

@ -7,6 +7,7 @@ import 'package:test_sa/views/app_style/sizing.dart';
class NotificationItem extends StatelessWidget { class NotificationItem extends StatelessWidget {
final AppNotification notification; final AppNotification notification;
final Function(AppNotification) onPressed; final Function(AppNotification) onPressed;
const NotificationItem({Key key, this.notification, this.onPressed}) : super(key: key); const NotificationItem({Key key, this.notification, this.onPressed}) : super(key: key);
@override @override

@ -19,6 +19,7 @@ import '../status/pentry/pentry_status_mune.dart';
class PentryInfoForm extends StatefulWidget { class PentryInfoForm extends StatefulWidget {
final Pentry model; final Pentry model;
final bool enableValidate; final bool enableValidate;
const PentryInfoForm({ const PentryInfoForm({
Key key, Key key,
this.model, this.model,

@ -11,6 +11,7 @@ import 'package:test_sa/views/widgets/titles/app_sub_title.dart';
class PentryPPMCheckListForm extends StatefulWidget { class PentryPPMCheckListForm extends StatefulWidget {
final List<PPMCheckList> models; final List<PPMCheckList> models;
final bool enableValidate; final bool enableValidate;
const PentryPPMCheckListForm({ const PentryPPMCheckListForm({
Key key, Key key,
this.models, this.models,

@ -9,6 +9,7 @@ class RequestInfoRow extends StatelessWidget {
final Widget infoWidget; final Widget infoWidget;
const RequestInfoRow({Key key, this.title, this.info, this.content, this.contentWidget, this.infoWidget}) : super(key: key); const RequestInfoRow({Key key, this.title, this.info, this.content, this.contentWidget, this.infoWidget}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (info != null && info.isEmpty) { if (info != null && info.isEmpty) {

@ -20,6 +20,7 @@ class ServiceRequestItem extends StatelessWidget {
final int index; final int index;
final ServiceRequest request; final ServiceRequest request;
final Function(ServiceRequest) onPressed; final Function(ServiceRequest) onPressed;
const ServiceRequestItem({Key key, this.request, this.onPressed, this.index}) : super(key: key); const ServiceRequestItem({Key key, this.request, this.onPressed, this.index}) : super(key: key);
@override @override
@ -133,6 +134,13 @@ class ServiceRequestItem extends StatelessWidget {
Divider( Divider(
color: onItemColor, color: onItemColor,
), ),
Text(
request.deviceNumber,
style: Theme.of(context).textTheme.subtitle2.copyWith(color: onItemColor, fontSize: 12, fontWeight: FontWeight.normal),
),
Divider(
color: onItemColor,
),
Row( Row(
children: [ children: [
Expanded( Expanded(

@ -1,3 +1,4 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
@ -8,15 +9,9 @@ import 'package:test_sa/views/widgets/buttons/app_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/hospitals/hospital_auto_complete_field.dart'; import 'package:test_sa/views/widgets/hospitals/hospital_auto_complete_field.dart';
import 'package:test_sa/views/widgets/status/service_request/service_request_status_mune.dart'; import 'package:test_sa/views/widgets/status/service_request/service_request_status_mune.dart';
import 'package:test_sa/views/widgets/switch_button.dart';
import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart';
import '../../../models/call_request_for_work_order_model.dart';
import '../../../models/engineer.dart';
import '../app_text_form_field.dart'; import '../app_text_form_field.dart';
import '../date_and_time/date_picker.dart';
import '../status/report/service_report_all_users.dart';
import '../status/report/service_report_visit_date_operator.dart';
class ServiceRequestsSearchDialog extends StatefulWidget { class ServiceRequestsSearchDialog extends StatefulWidget {
final ServiceRequestSearch initialSearchValue; final ServiceRequestSearch initialSearchValue;
@ -68,239 +63,176 @@ class _ServiceRequestsSearchDialogState extends State<ServiceRequestsSearchDialo
key: _formKey, key: _formKey,
child: Padding( child: Padding(
padding: const EdgeInsets.all(16.0), padding: const EdgeInsets.all(16.0),
child: SingleChildScrollView( child: Column(
child: Column( crossAxisAlignment: CrossAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start, children: [
children: [ Row(
Row( mainAxisAlignment: MainAxisAlignment.spaceBetween,
mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [
children: [ ASmallButton(
ASmallButton( text: _subtitle.cancel,
text: _subtitle.cancel, onPressed: () {
onPressed: () { Navigator.of(context).pop();
Navigator.of(context).pop(); },
}, ),
), ASmallButton(
ASmallButton( text: _subtitle.search,
text: _subtitle.search, onPressed: () {
onPressed: () { if (!_formKey.currentState.validate()) {
if (!_formKey.currentState.validate()) { return;
return; }
} _formKey.currentState.save();
_formKey.currentState.save(); Navigator.of(context).pop(_search);
Navigator.of(context).pop(_search); },
}, )
) ],
], ),
), SizedBox(
SizedBox( height: 8.0 * AppStyle.getScaleFactor(context),
height: 8.0 * AppStyle.getScaleFactor(context), ),
), ATextFormField(
ASwitchButton( initialValue: _search.deviceNumber,
title: "Most Recent", hintText: _subtitle.assetNumber,
value: _search.mostRecent ?? false, style: Theme.of(context).textTheme.headline6,
onChange: (value) { textInputAction: TextInputAction.search,
_search.mostRecent = value; onAction: () {
setState(() {}); if (!_formKey.currentState.validate()) {
}, return;
), }
SizedBox( _formKey.currentState.save();
height: 8.0 * AppStyle.getScaleFactor(context), Navigator.of(context).pop(_search);
), },
ATextFormField( onSaved: (value) {
labelText: "Call ID", _search.deviceNumber = value;
onSaved: (value) { },
_search.callId = value; ),
}, SizedBox(
), height: 8.0 * AppStyle.getScaleFactor(context),
SizedBox( ),
height: 8.0 * AppStyle.getScaleFactor(context), ATextFormField(
), initialValue: _search.deviceSerialNumber,
ATextFormField( hintText: _subtitle.serialNumber,
initialValue: _search.deviceSerialNumber, style: Theme.of(context).textTheme.headline6,
hintText: _subtitle.serialNumber, textInputAction: TextInputAction.search,
style: Theme.of(context).textTheme.headline6, onAction: () {
textInputAction: TextInputAction.search, if (!_formKey.currentState.validate()) {
onAction: () { return;
if (!_formKey.currentState.validate()) { }
return; _formKey.currentState.save();
} Navigator.of(context).pop(_search);
_formKey.currentState.save(); },
Navigator.of(context).pop(_search); onSaved: (value) {
}, _search.deviceSerialNumber = value;
onSaved: (value) { },
_search.deviceSerialNumber = value; ),
}, SizedBox(
), height: 8.0 * AppStyle.getScaleFactor(context),
SizedBox( ),
height: 8.0 * AppStyle.getScaleFactor(context), HospitalAutoCompleteField(
), initialValue: _search.hospital?.name,
HospitalAutoCompleteField( // onSave: (value){
initialValue: _search.hospital?.name, // _search.hospital = value;
// onSave: (value){ // },
// _search.hospital = value; onSearch: (value) {
// }, _search.hospital = value;
onSearch: (value) { Navigator.of(context).pop(_search);
_search.hospital = value; },
Navigator.of(context).pop(_search); ),
}, SizedBox(
), height: 8.0 * AppStyle.getScaleFactor(context),
SizedBox( ),
height: 8.0 * AppStyle.getScaleFactor(context), ATextFormField(
), initialValue: _search.deviceName,
ATextFormField( hintText: _subtitle.deviceName,
initialValue: _search.deviceName, style: Theme.of(context).textTheme.headline6,
hintText: _subtitle.deviceName, textInputAction: TextInputAction.search,
style: Theme.of(context).textTheme.headline6, onAction: () {
textInputAction: TextInputAction.search, if (!_formKey.currentState.validate()) {
onAction: () { return;
if (!_formKey.currentState.validate()) { }
return; _formKey.currentState.save();
} Navigator.of(context).pop(_search);
_formKey.currentState.save(); },
Navigator.of(context).pop(_search); onSaved: (value) {
}, _search.deviceName = value;
onSaved: (value) { },
_search.deviceName = value; ),
}, SizedBox(
), height: 8.0 * AppStyle.getScaleFactor(context),
SizedBox( ),
height: 8.0 * AppStyle.getScaleFactor(context), ATextFormField(
), initialValue: _search.model,
ATextFormField( hintText: _subtitle.model,
initialValue: _search.model, style: Theme.of(context).textTheme.headline6,
hintText: _subtitle.model, textInputAction: TextInputAction.search,
style: Theme.of(context).textTheme.headline6, onAction: () {
textInputAction: TextInputAction.search, if (!_formKey.currentState.validate()) {
onAction: () { return;
if (!_formKey.currentState.validate()) { }
return; _formKey.currentState.save();
} Navigator.of(context).pop(_search);
_formKey.currentState.save(); },
Navigator.of(context).pop(_search); onSaved: (value) {
}, _search.model = value;
onSaved: (value) { },
_search.model = value; ),
}, SizedBox(
), height: 16 * AppStyle.getScaleFactor(context),
SizedBox( ),
height: 16 * AppStyle.getScaleFactor(context), const ASubTitle("Status"),
), const SizedBox(
const ASubTitle("Status"), height: 4,
const SizedBox(height: 4), ),
ServiceRequestStatusMenu( ServiceRequestStatusMenu(
initialValue: _search.statusValue, initialValue: _search.statusValue,
onSelect: (status) { onSelect: (status) {
_search.statusValue = status; _search.statusValue = status;
}, },
), ),
SizedBox( // Padding(
height: 16 * AppStyle.getScaleFactor(context), // padding: const EdgeInsets.symmetric(horizontal: 12),
), // child: Wrap(
ASubTitle(_subtitle.assignedEmployee), // spacing: 10,
const SizedBox(height: 4), // runSpacing: 10,
ServiceReportAllUsers( // alignment: WrapAlignment.spaceEvenly,
initialValue: _search.assignedEmployee == null ? null : Engineer(id: _search.assignedEmployee.id, name: _search.assignedEmployee.name), // children: List.generate(
onSelect: (engineer) { // status.length,
_search.assignedEmployee = AssignedEmployee(id: engineer.id, name: engineer.name); // (index) {
}, // bool isSelected = _search.statusValue == status[index];
), // return FilterItem(
SizedBox( // isSelected: isSelected,
height: 16 * AppStyle.getScaleFactor(context), // onSelected: (){
), // if(isSelected) {
const ASubTitle("Request Date"), // _search.statusValue = null;
const SizedBox(height: 4), // } else {
ServiceReportVisitDateOperator( // _search.statusValue = status[index];
initialValue: _search.dateOperator, // }
onSelect: (status) { //
_search.dateOperator = status; // setState(() {});
setState(() {}); // },
}, // status: status[index],
), // );
Row( // }
children: [ //
Expanded( // ),
child: Column( // ),
crossAxisAlignment: CrossAxisAlignment.stretch, // ),
children: [
const ASubTitle("From"),
ADatePicker(
date: DateTime.tryParse(_search.from ?? ""),
from: DateTime(1950),
onDatePicker: (date) {
_search.from = date?.toIso8601String();
setState(() {});
},
),
],
),
),
if (_search?.dateOperator?.name?.toLowerCase()?.contains("between") ?? false) const SizedBox(width: 16),
if (_search?.dateOperator?.name?.toLowerCase()?.contains("between") ?? false)
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
const ASubTitle("To"),
ADatePicker(
date: DateTime.tryParse(_search.to ?? ""),
from: DateTime(1950),
onDatePicker: (date) {
_search.to = date?.toIso8601String();
setState(() {});
},
),
],
),
),
],
),
const SizedBox(width: 16),
// Padding(
// padding: const EdgeInsets.symmetric(horizontal: 12),
// child: Wrap(
// spacing: 10,
// runSpacing: 10,
// alignment: WrapAlignment.spaceEvenly,
// children: List.generate(
// status.length,
// (index) {
// bool isSelected = _search.statusValue == status[index];
// return FilterItem(
// isSelected: isSelected,
// onSelected: (){
// if(isSelected) {
// _search.statusValue = null;
// } else {
// _search.statusValue = status[index];
// }
//
// setState(() {});
// },
// status: status[index],
// );
// }
//
// ),
// ),
// ),
Visibility( Visibility(
visible: widget.initialSearchValue.toMap().isNotEmpty, visible: widget.initialSearchValue.toMap().isNotEmpty,
child: Padding( child: Padding(
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16),
child: AButton( child: AButton(
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
text: _subtitle.clearSearch, text: _subtitle.clearSearch,
onPressed: () { onPressed: () {
_search = ServiceRequestSearch(); _search = ServiceRequestSearch();
Navigator.of(context).pop(_search); Navigator.of(context).pop(_search);
}, },
),
), ),
), ),
], ),
), ],
), ),
), ),
), ),

@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
@ -11,10 +12,10 @@ import 'package:test_sa/views/widgets/equipment/auto_complete_models_field.dart'
import 'package:test_sa/views/widgets/hospitals/hospital_auto_complete_field.dart'; import 'package:test_sa/views/widgets/hospitals/hospital_auto_complete_field.dart';
import 'package:test_sa/views/widgets/status/employee/assigned_to_mune.dart'; import 'package:test_sa/views/widgets/status/employee/assigned_to_mune.dart';
import 'package:test_sa/views/widgets/status/pentry/pentry_visit_status_mune.dart'; import 'package:test_sa/views/widgets/status/pentry/pentry_visit_status_mune.dart';
import 'package:test_sa/views/widgets/hospitals/hospital_auto_complete_field.dart';
import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart';
import '../app_text_form_field.dart'; import '../app_text_form_field.dart';
import '../switch_button.dart';
class VisitsSearchDialog extends StatefulWidget { class VisitsSearchDialog extends StatefulWidget {
final VisitsSearch initialSearchValue; final VisitsSearch initialSearchValue;
@ -89,14 +90,47 @@ class _VisitsSearchDialogState extends State<VisitsSearchDialog> with TickerProv
) )
], ],
), ),
ASwitchButton( SizedBox(
title: "Most Recent", height: 8.0 * AppStyle.getScaleFactor(context),
value: _search.mostRecent ?? false, ),
onChange: (value) { ATextFormField(
_search.mostRecent = value; initialValue: _search.deviceNumber,
setState(() {}); hintText: _subtitle.assetNumber,
style: Theme.of(context).textTheme.headline6,
textInputAction: TextInputAction.search,
onAction: () {
if (!_formKey.currentState.validate()) {
return;
}
_formKey.currentState.save();
Navigator.of(context).pop(_search);
},
onSaved: (value) {
_search.deviceNumber = value;
},
),
SizedBox(
height: 8.0 * AppStyle.getScaleFactor(context),
),
ATextFormField(
initialValue: _search.deviceName,
hintText: _subtitle.assetName,
style: Theme.of(context).textTheme.headline6,
textInputAction: TextInputAction.search,
onAction: () {
if (!_formKey.currentState.validate()) {
return;
}
_formKey.currentState.save();
Navigator.of(context).pop(_search);
},
onSaved: (value) {
_search.deviceName = value;
}, },
), ),
SizedBox(
height: 8.0 * AppStyle.getScaleFactor(context),
),
ATextFormField( ATextFormField(
initialValue: _search.deviceSerialNumber, initialValue: _search.deviceSerialNumber,
hintText: _subtitle.serialNumber, hintText: _subtitle.serialNumber,

@ -1,7 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_sound/flutter_sound.dart'; import 'package:flutter_sound/flutter_sound.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:permission_handler/permission_handler.dart'; import 'package:permission_handler/permission_handler.dart';
import 'package:rive/rive.dart'; import 'package:rive/rive.dart';
import 'package:test_sa/views/widgets/buttons/app_icon_button2.dart'; import 'package:test_sa/views/widgets/buttons/app_icon_button2.dart';
@ -12,8 +11,9 @@ import '../../app_style/sizing.dart';
class RecordSound extends StatefulWidget { class RecordSound extends StatefulWidget {
final Function(String) onRecord; final Function(String) onRecord;
final bool enabled;
const RecordSound({Key key, @required this.onRecord}) : super(key: key); const RecordSound({Key key, @required this.onRecord, this.enabled = true}) : super(key: key);
@override @override
State<RecordSound> createState() => _RecordSoundState(); State<RecordSound> createState() => _RecordSoundState();
@ -72,8 +72,6 @@ class _RecordSoundState extends State<RecordSound> {
// await Permission.camera // await Permission.camera
PermissionStatus status = await Permission.microphone.request(); PermissionStatus status = await Permission.microphone.request();
if (!status.isGranted) { if (!status.isGranted) {
PermissionStatus status = await Permission.microphone.request();
Fluttertoast.showToast(msg: "Permission Denied");
return; return;
} }
_rive.addController(SimpleAnimation('recording')); _rive.addController(SimpleAnimation('recording'));
@ -117,11 +115,11 @@ class _RecordSoundState extends State<RecordSound> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Container( return Container(
padding: const EdgeInsets.only(left: 12, right: 0), padding: EdgeInsets.only(left: 12, right: 0),
decoration: BoxDecoration( decoration: BoxDecoration(
color: const Color(0xfff5f5f5), color: Color(0xfff5f5f5),
border: Border.all( border: Border.all(
color: const Color(0xffefefef), color: Color(0xffefefef),
), ),
borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)),
), ),
@ -186,15 +184,21 @@ class _RecordSoundState extends State<RecordSound> {
child: Icon(Icons.mic), child: Icon(Icons.mic),
), ),
onTapDown: (TapDownDetails details) async { onTapDown: widget.enabled
_startRecording(); ? (TapDownDetails details) async {
}, _startRecording();
onTapUp: (TapUpDetails details) async { }
_stopRecording(); : null,
}, onTapUp: widget.enabled
onTapCancel: () async { ? (TapUpDetails details) async {
_cancelRecording(); _stopRecording();
}, }
: null,
onTapCancel: widget.enabled
? () async {
_cancelRecording();
}
: null,
), ),
), ),
], ],

@ -5,24 +5,25 @@ import 'package:speech_to_text/speech_recognition_error.dart';
import 'package:speech_to_text/speech_recognition_result.dart'; import 'package:speech_to_text/speech_recognition_result.dart';
import 'package:speech_to_text/speech_to_text.dart'; import 'package:speech_to_text/speech_to_text.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/views/app_style/sizing.dart';
import 'package:test_sa/views/widgets/buttons/app_icon_button2.dart'; import 'package:test_sa/views/widgets/buttons/app_icon_button2.dart';
import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart';
import 'package:test_sa/views/app_style/sizing.dart';
class SpeechToTextButton extends StatefulWidget { class SpeechToTextButton extends StatefulWidget {
final TextEditingController controller; final TextEditingController controller;
final bool mini; final bool mini;
final bool enabled;
const SpeechToTextButton({Key key, this.controller, this.mini = false}) : super(key: key); const SpeechToTextButton({Key key, this.controller, this.mini = false, this.enabled = true}) : super(key: key);
@override @override
SpeechToTextButtonState createState() => SpeechToTextButtonState(); _SpeechToTextButtonState createState() => _SpeechToTextButtonState();
} }
class SpeechToTextButtonState extends State<SpeechToTextButton> { class _SpeechToTextButtonState extends State<SpeechToTextButton> {
bool _speechEnabled = false; bool _speechEnabled = false;
SettingProvider _settingProvider; SettingProvider _settingProvider;
final SpeechToText _speechToText = SpeechToText(); SpeechToText _speechToText = SpeechToText();
/// This has to happen only once per app /// This has to happen only once per app
void _initSpeech() async { void _initSpeech() async {
@ -63,15 +64,12 @@ class SpeechToTextButtonState extends State<SpeechToTextButton> {
@override @override
void initState() { void initState() {
_initSpeech(); _initSpeech();
widget.controller.addListener(() {
setState(() {});
});
super.initState(); super.initState();
} }
@override @override
void setState(VoidCallback fn) { void setState(VoidCallback fn) {
if (!mounted) return; if (!this.mounted) return;
super.setState(fn); super.setState(fn);
} }
@ -79,18 +77,18 @@ class SpeechToTextButtonState extends State<SpeechToTextButton> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
return Container( return Container(
padding: const EdgeInsets.only(left: 12, right: 12), padding: EdgeInsets.only(left: 12, right: 12),
decoration: BoxDecoration( decoration: BoxDecoration(
color: const Color(0xfff5f5f5), color: Color(0xfff5f5f5),
border: Border.all( border: Border.all(
color: const Color(0xffefefef), color: Color(0xffefefef),
), ),
borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)),
), ),
child: Row( child: Row(
children: [ children: [
widget.mini ? const SizedBox.shrink() : const ASubTitle("Speech To Text"), widget.mini ? SizedBox.shrink() : ASubTitle("Text To Speech"),
widget.controller.text.isNotEmpty widget.controller.text.isNotEmpty && widget.enabled
? AIconButton2( ? AIconButton2(
iconData: Icons.delete, iconData: Icons.delete,
onPressed: () { onPressed: () {
@ -98,22 +96,24 @@ class SpeechToTextButtonState extends State<SpeechToTextButton> {
setState(() {}); setState(() {});
}, },
) )
: const SizedBox.shrink(), : SizedBox.shrink(),
const Spacer(), Spacer(),
TextButton( TextButton(
onPressed: () { onPressed: widget.enabled
if (_speechToText.isListening) return; ? () {
if (_speechToText.isListening) return;
if (_settingProvider.speechToText == "ar") { if (_settingProvider.speechToText == "ar") {
_settingProvider.setSpeechToText("en"); _settingProvider.setSpeechToText("en");
} else { } else {
_settingProvider.setSpeechToText("ar"); _settingProvider.setSpeechToText("ar");
} }
}, }
: null,
child: Text(_settingProvider.speechToText)), child: Text(_settingProvider.speechToText)),
GestureDetector( GestureDetector(
child: _speechToText.isListening child: _speechToText.isListening
? const Icon( ? Icon(
Icons.fiber_manual_record, Icons.fiber_manual_record,
color: Colors.red, color: Colors.red,
) )
@ -121,17 +121,15 @@ class SpeechToTextButtonState extends State<SpeechToTextButton> {
Icons.mic, Icons.mic,
color: Theme.of(context).colorScheme.primary, color: Theme.of(context).colorScheme.primary,
), ),
onTap: () async { onTap: widget.enabled
if (!_speechEnabled) { ? () async {
Fluttertoast.showToast(msg: "microphone not available"); if (!_speechEnabled) {
return; Fluttertoast.showToast(msg: "microphone not available");
} return;
if (_speechToText.isListening) { }
_stopListening(); _startListening();
} else { }
_startListening(); : null,
}
},
), ),
], ],
), ),

@ -9,6 +9,7 @@ class SingleEngineerMenu extends StatefulWidget {
final Function(Engineer) onSelect; final Function(Engineer) onSelect;
const SingleEngineerMenu({Key key, this.engineers, this.onSelect, this.initialStatus}) : super(key: key); const SingleEngineerMenu({Key key, this.engineers, this.onSelect, this.initialStatus}) : super(key: key);
@override @override
_SingleEngineerMenuState createState() => _SingleEngineerMenuState(); _SingleEngineerMenuState createState() => _SingleEngineerMenuState();
} }

@ -11,6 +11,7 @@ class MultiStatusMenu extends StatefulWidget {
final Function(List<Lookup>) onSelect; final Function(List<Lookup>) onSelect;
const MultiStatusMenu({Key key, this.statuses, this.onSelect, this.initialSelectedStatus}) : super(key: key); const MultiStatusMenu({Key key, this.statuses, this.onSelect, this.initialSelectedStatus}) : super(key: key);
@override @override
_MultiStatusMenuState createState() => _MultiStatusMenuState(); _MultiStatusMenuState createState() => _MultiStatusMenuState();
} }

@ -11,6 +11,7 @@ class ServiceReportLastCallsMenu extends StatelessWidget {
final ServiceReport report; final ServiceReport report;
const ServiceReportLastCallsMenu({Key key, @required this.onSelect, @required this.report}) : super(key: key); const ServiceReportLastCallsMenu({Key key, @required this.onSelect, @required this.report}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
ServiceReportLastCallsProvider _menuProvider = Provider.of<ServiceReportLastCallsProvider>(context); ServiceReportLastCallsProvider _menuProvider = Provider.of<ServiceReportLastCallsProvider>(context);

@ -12,6 +12,7 @@ class ServiceReportReasonsMenu extends StatelessWidget {
final Function(Lookup) onSelect; final Function(Lookup) onSelect;
const ServiceReportReasonsMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); const ServiceReportReasonsMenu({Key key, this.onSelect, this.initialValue}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
SettingProvider _settingProvider = Provider.of<SettingProvider>(context); SettingProvider _settingProvider = Provider.of<SettingProvider>(context);

@ -12,6 +12,7 @@ class ServiceReportRepairLocation extends StatelessWidget {
final Function(Lookup) onSelect; final Function(Lookup) onSelect;
const ServiceReportRepairLocation({Key key, this.onSelect, this.initialValue}) : super(key: key); const ServiceReportRepairLocation({Key key, this.onSelect, this.initialValue}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
SettingProvider _settingProvider = Provider.of<SettingProvider>(context); SettingProvider _settingProvider = Provider.of<SettingProvider>(context);

@ -12,6 +12,7 @@ class ServiceAssetTypeMenu extends StatelessWidget {
final Lookup initialValue; final Lookup initialValue;
const ServiceAssetTypeMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); const ServiceAssetTypeMenu({Key key, this.onSelect, this.initialValue}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
SettingProvider _settingProvider = Provider.of<SettingProvider>(context); SettingProvider _settingProvider = Provider.of<SettingProvider>(context);

@ -10,8 +10,10 @@ import 'package:test_sa/views/widgets/status/single_status_menu.dart';
class ServiceRequestDefectTypesMenu extends StatelessWidget { class ServiceRequestDefectTypesMenu extends StatelessWidget {
final Function(Lookup) onSelect; final Function(Lookup) onSelect;
final Lookup initialValue; final Lookup initialValue;
final bool enabled;
const ServiceRequestDefectTypesMenu({Key key, this.onSelect, this.initialValue, this.enabled = true}) : super(key: key);
const ServiceRequestDefectTypesMenu({Key key, this.onSelect, this.initialValue}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final settingProvider = Provider.of<SettingProvider>(context); final settingProvider = Provider.of<SettingProvider>(context);
@ -29,6 +31,7 @@ class ServiceRequestDefectTypesMenu extends StatelessWidget {
initialStatus: initialValue, initialStatus: initialValue,
statuses: menuProvider.items, statuses: menuProvider.items,
onSelect: onSelect, onSelect: onSelect,
enabled: enabled,
)); ));
} }
} }

@ -10,8 +10,10 @@ import 'package:test_sa/views/widgets/status/single_status_menu.dart';
class ServiceRequestPriorityMenu extends StatelessWidget { class ServiceRequestPriorityMenu extends StatelessWidget {
final Function(Lookup) onSelect; final Function(Lookup) onSelect;
final Lookup initialValue; final Lookup initialValue;
final bool enabled;
const ServiceRequestPriorityMenu({Key key, this.onSelect, this.initialValue}) : super(key: key);
const ServiceRequestPriorityMenu({Key key, this.onSelect, this.initialValue, this.enabled}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final settingProvider = Provider.of<SettingProvider>(context); final settingProvider = Provider.of<SettingProvider>(context);
@ -30,6 +32,7 @@ class ServiceRequestPriorityMenu extends StatelessWidget {
initialStatus: initialValue, initialStatus: initialValue,
statuses: menuProvider.items, statuses: menuProvider.items,
onSelect: onSelect, onSelect: onSelect,
enabled: enabled,
)); ));
} }
} }

@ -13,6 +13,7 @@ class ServiceRequestedThroughMenu extends StatelessWidget {
final bool enabled; final bool enabled;
const ServiceRequestedThroughMenu({Key key, this.onSelect, this.initialValue, this.enabled = true}) : super(key: key); const ServiceRequestedThroughMenu({Key key, this.onSelect, this.initialValue, this.enabled = true}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final settingProvider = Provider.of<SettingProvider>(context); final settingProvider = Provider.of<SettingProvider>(context);
@ -27,7 +28,7 @@ class ServiceRequestedThroughMenu extends StatelessWidget {
await menuProvider.getData(user: userProvider.user, host: settingProvider.host); await menuProvider.getData(user: userProvider.user, host: settingProvider.host);
}, },
child: SingleStatusMenu( child: SingleStatusMenu(
initialStatus: enabled ? initialValue : menuProvider.getDefaultItem(), initialStatus: initialValue,
statuses: menuProvider.items, statuses: menuProvider.items,
onSelect: onSelect, onSelect: onSelect,
enabled: enabled, enabled: enabled,

@ -1,44 +0,0 @@
import 'package:flutter/material.dart';
import 'package:test_sa/views/widgets/titles/app_sub_title.dart';
import '../app_style/colors.dart';
import '../app_style/sizing.dart';
class ASwitchButton extends StatelessWidget {
final String title;
final bool value;
final void Function(bool) onChange;
const ASwitchButton({
@required this.title,
@required this.value,
@required this.onChange,
Key key,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
padding: const EdgeInsets.symmetric(horizontal: 16),
margin: const EdgeInsets.symmetric(vertical: 8),
decoration: BoxDecoration(
color: AColors.inputFieldBackgroundColor,
border: Border.all(
color: const Color(0xffefefef),
),
borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
ASubTitle(title),
Switch.adaptive(
value: value,
activeColor: AColors.primaryColor,
onChanged: onChange,
),
],
),
);
}
}

@ -10,6 +10,7 @@ class AppTimer extends StatefulWidget {
final Future<bool> Function(TimerModel) onChange; final Future<bool> Function(TimerModel) onChange;
final TextStyle style; final TextStyle style;
final bool enabled; final bool enabled;
const AppTimer({ const AppTimer({
Key key, Key key,
this.timer, this.timer,

@ -6,7 +6,9 @@ class ASubTitle extends StatelessWidget {
final EdgeInsets padding; final EdgeInsets padding;
final Color color; final Color color;
final double font; final double font;
const ASubTitle(this.text, {Key key, this.padding, this.color, this.font}) : super(key: key); const ASubTitle(this.text, {Key key, this.padding, this.color, this.font}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Padding( return Padding(

@ -5,7 +5,9 @@ class ATitle extends StatelessWidget {
final String text; final String text;
final EdgeInsets padding; final EdgeInsets padding;
final bool center; final bool center;
const ATitle(this.text, {Key key, this.padding, this.center = false}) : super(key: key); const ATitle(this.text, {Key key, this.padding, this.center = false}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Padding( return Padding(

@ -15,6 +15,7 @@ class ExpandableInfoRow extends StatefulWidget {
class _ExpandableInfoRowState extends State<ExpandableInfoRow> with TickerProviderStateMixin { class _ExpandableInfoRowState extends State<ExpandableInfoRow> with TickerProviderStateMixin {
bool _isExpanded = false; bool _isExpanded = false;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return InkWell( return InkWell(

@ -82,6 +82,16 @@ class VisitItem extends StatelessWidget {
Divider( Divider(
color: onItemColor, color: onItemColor,
), ),
Text(
visit.deviceNumber ?? "",
style: Theme.of(context).textTheme.subtitle1.copyWith(
color: onItemColor,
fontSize: 14,
),
),
Divider(
color: onItemColor,
),
Row( Row(
children: [ children: [
Expanded( Expanded(

@ -22,6 +22,7 @@ class VisitsList extends StatefulWidget {
class _VisitsListState extends State<VisitsList> { class _VisitsListState extends State<VisitsList> {
List<Visit> _selectedVisits = []; List<Visit> _selectedVisits = [];
@override @override
void initState() { void initState() {
_selectedVisits.clear(); _selectedVisits.clear();

Loading…
Cancel
Save