Fixing bugs

merge-requests/22/head
zaid_daoud 3 years ago
parent e4c37ec052
commit 1bf9d612ad

@ -8,13 +8,12 @@ import 'package:test_sa/models/device/device_transfer.dart';
import 'package:test_sa/models/device/device_transfer_info.dart'; import 'package:test_sa/models/device/device_transfer_info.dart';
import 'package:test_sa/models/user.dart'; import 'package:test_sa/models/user.dart';
class DeviceTransferProvider extends ChangeNotifier{ class DeviceTransferProvider extends ChangeNotifier {
// number of items call in each request // number of items call in each request
final pageItemNumber = 50; final pageItemNumber = 50;
//reset provider data //reset provider data
void reset(){ void reset() {
items = null; items = null;
nextPage = true; nextPage = true;
stateCode = null; stateCode = null;
@ -41,12 +40,11 @@ class DeviceTransferProvider extends ChangeNotifier{
/// 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<int> getRequests ({ Future<int> getRequests({
@required String host, @required String host,
@required User user, @required User user,
}) async { }) async {
if(isLoading == true) if (isLoading == true) return -2;
return -2;
isLoading = true; isLoading = true;
// isLoading = false; // isLoading = false;
@ -64,9 +62,9 @@ class DeviceTransferProvider extends ChangeNotifier{
// notifyListeners(); // notifyListeners();
// return 200; // return 200;
Response response; Response response;
try{ try {
Map<String,dynamic> body = {}; Map<String, dynamic> body = {};
body["pageNumber"] = (items?.length ?? 0) ~/pageItemNumber + 1; body["pageNumber"] = (items?.length ?? 0) ~/ pageItemNumber + 1;
body["pageSize"] = pageItemNumber; body["pageSize"] = pageItemNumber;
response = await ApiManager.instance.post( response = await ApiManager.instance.post(
@ -75,38 +73,35 @@ class DeviceTransferProvider extends ChangeNotifier{
); );
stateCode = response.statusCode; stateCode = response.statusCode;
if(stateCode >= 200 && stateCode < 300) { if (stateCode >= 200 && stateCode < 300) {
// client's request was successfully received // client's request was successfully received
List listJson = json.decode(response.body)["data"]; List listJson = json.decode(response.body)["data"];
List<DeviceTransfer> itemsPage = listJson.map( List<DeviceTransfer> itemsPage = listJson.map((request) => DeviceTransfer.fromJson(request)).toList();
(request) => DeviceTransfer.fromJson(request)).toList();
items ??= []; items ??= [];
items.addAll(itemsPage); items.addAll(itemsPage);
if(itemsPage.length == pageItemNumber){ if (itemsPage.length == pageItemNumber) {
nextPage = true; nextPage = true;
}else{ } else {
nextPage = false; nextPage = false;
} }
} }
isLoading = false; isLoading = false;
notifyListeners(); notifyListeners();
return response.statusCode; return response.statusCode;
} catch (error) {
} catch(error) {
isLoading = false; isLoading = false;
stateCode = -1; stateCode = -1;
notifyListeners(); notifyListeners();
return -1; return -1;
} }
} }
Future<int> createRequest ({ Future<int> createRequest({
@required String host, @required String host,
@required User user, @required User user,
@required DeviceTransfer model, @required DeviceTransfer model,
}) async { }) async {
Map<String,dynamic> body = { Map<String, dynamic> body = {
// "uid": user.id.toString(), // "uid": user.id.toString(),
// "token": user.token ?? "", // "token": user.token ?? "",
"assetId": model.device.id ?? "", "assetId": model.device.id ?? "",
@ -115,34 +110,23 @@ class DeviceTransferProvider extends ChangeNotifier{
"senderSiteId": model.receiver.client.id ?? "", "senderSiteId": model.receiver.client.id ?? "",
}; };
Response response; Response response;
try{ try {
response = await ApiManager.instance.post( response = await ApiManager.instance.post(URLs.requestDeviceTransfer, body: body);
URLs.requestDeviceTransfer,
body: body
);
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) {
items.insert( items.insert(0, DeviceTransfer.fromJson(json.decode(utf8.decode(response.bodyBytes))[0]));
0,
DeviceTransfer.fromJson(
json.decode(utf8.decode(response.bodyBytes))[0]
)
);
notifyListeners(); notifyListeners();
} }
} }
return response.statusCode; return response.statusCode;
} catch (error) {
} catch(error) {
return -1; return -1;
} }
} }
Future<int> updateRequest ({ Future<int> updateRequest({
@required String host, @required String host,
@required User user, @required User user,
@required bool isSender, @required bool isSender,
@ -150,57 +134,49 @@ class DeviceTransferProvider extends ChangeNotifier{
@required DeviceTransfer oldModel, @required DeviceTransfer oldModel,
@required DeviceTransferInfo newModel, @required DeviceTransferInfo newModel,
}) async { }) async {
Map<String, dynamic> body = {
Map<String,dynamic> body = {
"id": oldModel.id, "id": oldModel.id,
"assetId": oldModel.device.id ?? "", "assetId": oldModel.device.id ?? "",
"senderSiteId": oldModel.sender.client.id, "senderSiteId": oldModel.sender.client.id,
"destSiteId": oldModel.receiver.client.id, "destSiteId": oldModel.receiver.client.id,
"destDepartmentId": oldModel.receiver.department.id, "destDepartmentId": oldModel.receiver.department.id,
}; };
if(isSender){ if (isSender) {
body.addAll( body.addAll({
{ //"senderSiteId": newModel.client.id,
//"senderSiteId": newModel.client.id, //"senderDepartmentId": newModel.department.id,
//"senderDepartmentId": newModel.department.id, "senderAssignedEmployeeId": newModel.userId,
"senderAssignedEmployeeId": newModel.userId, "senderMachineStatusId": newModel.status.id,
"senderMachineStatusId": newModel.status.id, "senderComment": newModel.comment,
"senderComment": newModel.comment, "senderWorkingHours": newModel.workingHours,
"senderWorkingHours": newModel.workingHours, "senderTravelingHours": newModel.travelingHours,
"senderTravelingHours": newModel.travelingHours, "senderAttachmentName": "${DateTime.now().toIso8601String()}.png|${newModel.signature}",
"senderAttachmentName": "${DateTime.now().toIso8601String()}.png|${newModel.signature}", });
} } else {
); body.addAll({
}else{ //"destSiteId": newModel.client.id,
body.addAll( //"destDepartmentId": newModel.department.id,
{ "receiverAssignedEmployeeId": newModel.userId,
//"destSiteId": newModel.client.id, "receiverMachineStatusId": newModel.status.id,
//"destDepartmentId": newModel.department.id, "receiverComment": newModel.comment,
"receiverAssignedEmployeeId": newModel.userId, "receiverWorkingHours": newModel.workingHours,
"receiverMachineStatusId": newModel.status.id, "receiverTravelingHours": newModel.travelingHours,
"receiverComment": newModel.comment, "receiverAttachmentName": "${DateTime.now().toIso8601String()}.png|${newModel.signature}",
"receiverWorkingHours": newModel.workingHours, });
"receiverTravelingHours": newModel.travelingHours,
"receiverAttachmentName": "${DateTime.now().toIso8601String()}.png|${newModel.signature}",
}
);
} }
body.addAll(newModel.toJson(isSender)); body.addAll(newModel.toJson(isSender));
Response response; Response response;
try{ try {
response = await ApiManager.instance.put( response = await ApiManager.instance.put(URLs.updateDeviceTransfer, body: body);
URLs.updateDeviceTransfer,
body: body
);
// response = await post( // response = await post(
// Uri.parse("$host${URLs.updateDeviceTransfer}/$requestId"), // Uri.parse("$host${URLs.updateDeviceTransfer}/$requestId"),
// body: body, // body: body,
// ); // );
stateCode = response.statusCode; stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
reset(); reset();
// oldModel.fromDeviceTransfer( // oldModel.fromDeviceTransfer(
// DeviceTransfer.fromJson( // DeviceTransfer.fromJson(
@ -210,10 +186,8 @@ class DeviceTransferProvider extends ChangeNotifier{
notifyListeners(); notifyListeners();
} }
return response.statusCode; return response.statusCode;
} catch (error) {
} catch(error) {
return -1; return -1;
} }
} }
} }

@ -8,10 +8,9 @@ import 'package:test_sa/models/device/device.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/user.dart'; import 'package:test_sa/models/user.dart';
class DevicesProvider extends ChangeNotifier{ class DevicesProvider extends ChangeNotifier {
//reset provider data //reset provider data
void reset(){ void reset() {
_devices = null; _devices = null;
_stateCode = null; _stateCode = null;
} }
@ -30,7 +29,7 @@ class DevicesProvider extends ChangeNotifier{
// 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();
} }
@ -40,36 +39,32 @@ class DevicesProvider extends ChangeNotifier{
/// 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<int> getEquipment ({ Future<int> getEquipment({
@required String host, @required String host,
@required User user, @required User user,
@required int hospitalId, @required int hospitalId,
String serialNumber, String serialNumber,
String number, String number,
}) async { }) async {
if(_loading == true) if (_loading == true) return -2;
return -2;
_loading = true; _loading = true;
notifyListeners(); notifyListeners();
Response response; Response response;
try{ try {
response = await ApiManager.instance.post( response = await ApiManager.instance.post(URLs.getEquipment, body: {
URLs.getEquipment, "pageSize": 50,
body: { "siteId": hospitalId,
"pageSize":50, if (serialNumber?.isEmpty == false) "assetSerialNumber": serialNumber,
"siteId":hospitalId, if (number?.isEmpty == false) "assetNo": number,
if(serialNumber?.isEmpty == false) "assetSerialNumber":serialNumber, });
if(number?.isEmpty == false) "assetNo":number, } catch (error) {
}
);
} catch(error) {
_loading = false; _loading = false;
_stateCode = -1; _stateCode = -1;
notifyListeners(); notifyListeners();
return -1; return -1;
} }
_stateCode = response.statusCode; _stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received // client's request was successfully received
List equipmentListJson = json.decode(response.body)["data"]; List equipmentListJson = json.decode(response.body)["data"];
_devices = equipmentListJson.map((device) => Device.fromJson(device)).toList(); _devices = equipmentListJson.map((device) => Device.fromJson(device)).toList();
@ -84,7 +79,7 @@ class DevicesProvider extends ChangeNotifier{
/// 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>> getDevicesList ({ Future<List<Device>> getDevicesList({
@required String host, @required String host,
@required User user, @required User user,
@required int hospitalId, @required int hospitalId,
@ -92,95 +87,82 @@ class DevicesProvider extends ChangeNotifier{
String number, String number,
}) async { }) async {
Response response; Response response;
try{ try {
response = await ApiManager.instance.post( response = await ApiManager.instance.post(URLs.getEquipment, body: {
URLs.getEquipment, "pageSize": 50,
body: { "siteId": hospitalId,
"pageSize":50, if (serialNumber?.isEmpty == false) "assetSerialNumber": serialNumber,
"siteId":hospitalId, if (number?.isEmpty == false) "assetNo": number,
if(serialNumber?.isEmpty == false) "assetSerialNumber":serialNumber, });
if(number?.isEmpty == false) "assetNo":number,
}
);
// response = await get( // response = await get(
// Uri.parse("$host${URLs.getEquipment}?siteId=$hospitalId" // Uri.parse("$host${URLs.getEquipment}?siteId=$hospitalId"
// "${serialNumber?.isEmpty == false ? "&assetSerialNumber=$serialNumber" :""}" // "${serialNumber?.isEmpty == false ? "&assetSerialNumber=$serialNumber" :""}"
// "${number?.isEmpty == false ? "&assetNo=$number" : ""}" // "${number?.isEmpty == false ? "&assetNo=$number" : ""}"
// ), // ),
// ); // );
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 equipmentListJson = json.decode(response.body)["data"]; List equipmentListJson = json.decode(response.body)["data"];
page = equipmentListJson.map((device) => Device.fromJson(device)).toList(); page = equipmentListJson.map((device) => Device.fromJson(device)).toList();
} }
return page; return page;
} catch(error) { } catch (error) {
return []; return [];
} }
} }
Future<List<Lookup>> getModels({ Future<List<Lookup>> getModels({
String code, String code,
}) async { }) async {
Response response; Response response;
try{ try {
response = await ApiManager.instance.get( response = await ApiManager.instance.get(
URLs.getModels+"?code=$code", URLs.getModels + "?code=$code",
); );
List<Lookup> page = []; List<Lookup> 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(response.body)["data"]; List categoriesListJson = json.decode(response.body)["data"];
page = categoriesListJson.map((json) => page = categoriesListJson
Lookup( .map((json) => Lookup(
name: json["modelDefCode"], name: json["modelDefCode"],
id: json["id"], id: json["id"],
value: json["id"], value: json["id"],
) ))
).toList(); .toList();
} }
return page; return page;
} catch(error) { } catch (error) {
return []; return [];
} }
} }
/// 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 ({ Future<List<Device>> getDevicesListBySN({@required String host, @required User user, @required int hospitalId, @required String sn}) async {
@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(host + URLs.getEquipment+"?client=$hospitalId" Uri.parse(URLs.getEquipment + "?client=$hospitalId" + (sn == null || sn.isEmpty ? "" : "&serial_qr=$sn")),
+ ( 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 [];
} }
} }
} }

@ -3,7 +3,7 @@ import 'package:test_sa/models/department.dart';
import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/hospital.dart';
class User{ class User {
String id; String id;
String userName; String userName;
String password; String password;
@ -17,106 +17,92 @@ class User{
bool isActive; bool isActive;
DateTime tokenLife; DateTime tokenLife;
User(
User({ {this.id,
this.id, this.userName = "",
this.userName = "", this.email = "",
this.email = "", this.password = "",
this.password = "", this.phoneNumber = "",
this.phoneNumber = "", this.hospital,
this.hospital, this.department,
this.department, this.type,
this.type, this.whatsApp,
this.whatsApp, this.token,
this.token, this.tokenLife,
this.tokenLife, this.isActive = false});
this.isActive = false
});
Future<Map<String, dynamic>> toLoginJson() async { Future<Map<String, dynamic>> toLoginJson() async {
if(FirebaseNotificationManger.token == null) if (FirebaseNotificationManger.token == null) await FirebaseNotificationManger.getToken();
await FirebaseNotificationManger.getToken();
return { return {
"username":userName, "username": userName,
"password":password, "password": password,
"firebase_token": FirebaseNotificationManger?.token ?? "", "firebase_token": FirebaseNotificationManger?.token ?? "",
}; };
} }
Map<String,dynamic> toUpdateProfileJson(){ Map<String, dynamic> toUpdateProfileJson() {
Map<String,dynamic> jsonObject ={}; Map<String, dynamic> jsonObject = {};
if(department?.id != null) if (department?.id != null) jsonObject["department"] = department.id;
jsonObject["department"] = department.id; if (whatsApp != null && whatsApp.isNotEmpty) jsonObject["whatsapp"] = whatsApp;
if(whatsApp != null && whatsApp.isNotEmpty) if (phoneNumber != null && phoneNumber.isNotEmpty) jsonObject["phone"] = phoneNumber;
jsonObject["whatsapp"] = whatsApp;
if(phoneNumber != null && phoneNumber.isNotEmpty)
jsonObject["phone"] = phoneNumber;
return jsonObject; return jsonObject;
} }
Future<Map<String, dynamic>> toRegisterJson() async { Future<Map<String, dynamic>> toRegisterJson() async {
if(FirebaseNotificationManger.token == null) if (FirebaseNotificationManger.token == null) await FirebaseNotificationManger.getToken();
await FirebaseNotificationManger.getToken();
return { return {
"username": userName, "username": userName,
"email":email, "email": email,
"whatsapp":whatsApp, "whatsapp": whatsApp,
"client":hospital.id, "client": hospital.id,
"department":department?.id, "department": department?.id,
"phone":phoneNumber, "phone": phoneNumber,
"pass":password, "pass": password,
"firebase_token": FirebaseNotificationManger?.token ?? "", "firebase_token": FirebaseNotificationManger?.token ?? "",
}; };
} }
Map<String,dynamic> toJson(){ Map<String, dynamic> toJson() {
return { return {
"userID":id, "userID": id,
"username": userName, "username": userName,
"email":email, "email": email,
"token":token, "token": token,
"phoneNumber":phoneNumber, "phoneNumber": phoneNumber,
"whatsapp":whatsApp, "whatsapp": whatsApp,
"client_id":hospital?.id, "client_id": hospital?.id,
"client_name":hospital?.name, "client_name": hospital?.name,
"department_id":department?.id, "department_id": department?.id,
"department_name":department?.name, "department_name": department?.name,
//"password":password, //"password":password,
"tokenlife":tokenLife.toIso8601String(), "tokenlife": tokenLife.toIso8601String(),
"active":isActive, "active": isActive,
"userRoles": type == UsersTypes.engineer "userRoles": type == UsersTypes.engineer ? "value: R-6" : "value: R-5",
? "value: R-6" : "value: R-5" , // "token":token, pass is token
// "token":token, pass is token
}; };
} }
factory User.fromJson(Map<String,dynamic> parsedJson){ factory User.fromJson(Map<String, dynamic> parsedJson) {
UsersTypes type; UsersTypes type;
if(parsedJson["userRoles"].toString().contains("value: R-4") if (parsedJson["userRoles"].toString().contains("value: R-4") || parsedJson["userRoles"].toString().contains("value: R-5") || parsedJson["userRoles"].toString().contains("value: R-7")) {
|| parsedJson["userRoles"].toString().contains("value: R-5")
|| parsedJson["userRoles"].toString().contains("value: R-7")){
type = UsersTypes.normal_user; type = UsersTypes.normal_user;
} else { } else {
type = UsersTypes.engineer; type = UsersTypes.engineer;
} }
return User( return User(
id: parsedJson["userID"], id: parsedJson["userID"],
userName: parsedJson["username"], userName: parsedJson["username"],
email: parsedJson["email"], email: parsedJson["email"],
hospital: Hospital( hospital: Hospital(id: parsedJson["client_id"], name: parsedJson["client_name"]),
id: parsedJson["client_id"], department: Department(
name: parsedJson["client_name"] id: parsedJson["department_id"],
), name: parsedJson["department_name"],
department: Department( ),
id: parsedJson["department_id"], phoneNumber: parsedJson["phoneNumber"],
name: parsedJson["department_name"], whatsApp: parsedJson["phoneNumber"],
), token: parsedJson["token"],
phoneNumber: parsedJson["phoneNumber"], isActive: parsedJson["isAuthenticated"],
whatsApp: parsedJson["phoneNumber"], tokenLife: DateTime.tryParse(parsedJson["tokenlife"] ?? ""),
token: parsedJson["token"], type: type);
isActive: parsedJson["isAuthenticated"],
tokenLife: DateTime.tryParse(parsedJson["tokenlife"]??""),
type:type
);
} }
} }

@ -19,6 +19,7 @@ import 'package:test_sa/views/widgets/status/gas_refill/gas_status.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';
class UpdateDeviceTransfer extends StatefulWidget { class UpdateDeviceTransfer extends StatefulWidget {
final DeviceTransfer model; final DeviceTransfer model;
final bool isSender; final bool isSender;
@ -43,25 +44,19 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
_update() async { _update() async {
_validate = true; _validate = true;
if(!_formKey.currentState.validate()){ if (!_formKey.currentState.validate()) {
setState(() {}); setState(() {});
return false; return false;
} }
_formKey.currentState.save(); _formKey.currentState.save();
_isLoading =true; _isLoading = true;
setState(() {}); setState(() {});
int status = await _deviceTransferProvider.updateRequest( int status = await _deviceTransferProvider.updateRequest(
user: _userProvider.user, user: _userProvider.user, host: _settingProvider.host, requestId: widget.model.id, isSender: widget.isSender, newModel: _formModel, oldModel: widget.model);
host: _settingProvider.host, _isLoading = false;
requestId: widget.model.id,
isSender: widget.isSender,
newModel: _formModel,
oldModel: widget.model
);
_isLoading =false;
setState(() {}); setState(() {});
if(status >= 200 && status < 300){ if (status >= 200 && status < 300) {
Fluttertoast.showToast( Fluttertoast.showToast(
msg: _subtitle.requestCompleteSuccessfully, msg: _subtitle.requestCompleteSuccessfully,
); );
@ -72,16 +67,13 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
} }
@override @override
void setState(VoidCallback fn){ void setState(VoidCallback fn) {
if(!mounted) super.setState(() {}); if (!mounted) super.setState(() {});
} }
@override @override
void initState() { void initState() {
_formModel.fromDetails(widget.isSender _formModel.fromDetails(widget.isSender ? widget.model.sender : widget.model.receiver, withSignature: false);
? widget.model.sender : widget.model.receiver,
withSignature: false
);
super.initState(); super.initState();
} }
@ -96,7 +88,7 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
_subtitle = AppLocalization.of(context).subtitle; _subtitle = AppLocalization.of(context).subtitle;
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
_deviceTransferProvider = Provider.of<DeviceTransferProvider>(context,listen: false); _deviceTransferProvider = Provider.of<DeviceTransferProvider>(context, listen: false);
return Scaffold( return Scaffold(
key: _scaffoldKey, key: _scaffoldKey,
body: Form( body: Form(
@ -117,48 +109,56 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
child: Text( child: Text(
"Edit Transfer Device", "Edit Transfer Device",
style: Theme.of(context).textTheme.headline5.copyWith( style: Theme.of(context).textTheme.headline5.copyWith(color: Theme.of(context).primaryColor, fontSize: 28, fontWeight: FontWeight.bold),
color: Theme.of(context).primaryColor,
fontSize: 28,
fontWeight: FontWeight.bold
),
), ),
), ),
), ),
const SizedBox(height: 8,), const SizedBox(
height: 8,
),
ASubTitle("Comment"), ASubTitle("Comment"),
const SizedBox(height: 4,), const SizedBox(
height: 4,
),
ATextFormField( ATextFormField(
initialValue: _formModel?.comment, initialValue: _formModel?.comment,
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: Theme.of(context).textTheme.subtitle1, style: Theme.of(context).textTheme.subtitle1,
textInputType: TextInputType.text, textInputType: TextInputType.text,
onSaved: (value){ onSaved: (value) {
_formModel.comment = value; _formModel.comment = value;
}, },
), ),
const SizedBox(height: 8,), const SizedBox(
height: 8,
),
ASubTitle(_subtitle.travelingHours), ASubTitle(_subtitle.travelingHours),
const SizedBox(height: 4,), const SizedBox(
height: 4,
),
ATextFormField( ATextFormField(
initialValue: _formModel?.travelingHours, initialValue: _formModel?.travelingHours,
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: Theme.of(context).textTheme.subtitle1, style: Theme.of(context).textTheme.subtitle1,
textInputType: TextInputType.number, textInputType: TextInputType.number,
onSaved: (value){ onSaved: (value) {
_formModel.travelingHours = value; _formModel.travelingHours = value;
}, },
), ),
const SizedBox(height: 8,), const SizedBox(
height: 8,
),
ASubTitle(_subtitle.workingHours), ASubTitle(_subtitle.workingHours),
const SizedBox(height: 4,), const SizedBox(
height: 4,
),
ATextFormField( ATextFormField(
initialValue: _formModel?.workingHours, initialValue: _formModel?.workingHours,
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: Theme.of(context).textTheme.subtitle1, style: Theme.of(context).textTheme.subtitle1,
textInputType: TextInputType.number, textInputType: TextInputType.number,
onSaved: (value){ onSaved: (value) {
_formModel.workingHours = value; _formModel.workingHours = value;
}, },
), ),
@ -174,32 +174,37 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
// setState(() {}); // setState(() {});
// }, // },
// ), // ),
const SizedBox(height: 8,), const SizedBox(
height: 8,
),
ASubTitle(_subtitle.status), ASubTitle(_subtitle.status),
const SizedBox(height: 4,), const SizedBox(
height: 4,
),
GasStatusMenu( GasStatusMenu(
initialValue: _formModel.status, initialValue: _formModel.status,
onSelect: (status){ onSelect: (status) {
_formModel.status = status; _formModel.status = status;
setState(() {}); setState(() {});
}, },
), ),
const SizedBox(height: 8,), const SizedBox(
height: 8,
),
const ASubTitle("Signature"), const ASubTitle("Signature"),
// if(_validate && _formModel.signature == null) // if(_validate && _formModel.signature == null)
// ASubTitle(_subtitle.requiredWord,color: Colors.red,), // ASubTitle(_subtitle.requiredWord,color: Colors.red,),
const SizedBox(height: 4,), const SizedBox(
height: 4,
),
ESignature( ESignature(
oldSignature: widget.isSender oldSignature: widget.isSender ? widget.model.sender.signature : widget.model.receiver.signature,
? widget.model.sender.signature newSignature: _signature,
: widget.model.receiver.signature, onSaved: (signature) {
newSignature: _signature, _signature = signature;
onSaved: (signature){ if (signature == null || signature.isEmpty) return;
_signature = signature; _formModel.signature = base64Encode(signature);
if(signature == null || signature.isEmpty) return; },
_formModel.signature = base64Encode(signature);
},
), ),
Padding( Padding(
padding: const EdgeInsets.all(16.0), padding: const EdgeInsets.all(16.0),
@ -208,7 +213,9 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
onPressed: _update, onPressed: _update,
), ),
), ),
const SizedBox(height: 100,) const SizedBox(
height: 100,
)
], ],
), ),
), ),
@ -218,4 +225,3 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
); );
} }
} }

@ -1,6 +1,5 @@
import 'dart:io'; import 'dart:io';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart';
@ -26,7 +25,6 @@ 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/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/notifications/notifications_page.dart';
import 'package:test_sa/views/pages/user/requests/create_request.dart'; import 'package:test_sa/views/pages/user/requests/create_request.dart';
import 'package:test_sa/views/pages/user/visits/regular_visits_page.dart'; import 'package:test_sa/views/pages/user/visits/regular_visits_page.dart';
import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart';
@ -153,7 +151,7 @@ class _LandPageState extends State<LandPage> {
mainAxisSpacing: 12, mainAxisSpacing: 12,
childAspectRatio: 1, childAspectRatio: 1,
children: [ children: [
if (_userProvider.user.type == UsersTypes.normal_user) if (_userProvider.user != null && _userProvider.user.type == UsersTypes.normal_user)
LandPageItem( LandPageItem(
text: _subtitle.newServiceRequest, text: _subtitle.newServiceRequest,
icon: FontAwesomeIcons.tools, icon: FontAwesomeIcons.tools,
@ -279,7 +277,11 @@ class _LandPageState extends State<LandPage> {
decoration: BoxDecoration(border: Border.all(color: Theme.of(context).primaryColor, width: 2), shape: BoxShape.circle), decoration: BoxDecoration(border: Border.all(color: Theme.of(context).primaryColor, width: 2), shape: BoxShape.circle),
child: ClipOval( child: ClipOval(
child: ClipOval( child: ClipOval(
child: Icon(Icons.person,size: 36,color: Theme.of(context).colorScheme.primary,), child: Icon(
Icons.person,
size: 36,
color: Theme.of(context).colorScheme.primary,
),
), ),
), ),
), ),

@ -10,7 +10,7 @@ class ESignature extends StatefulWidget {
final Uint8List newSignature; final Uint8List newSignature;
final Function(Uint8List) onSaved; final Function(Uint8List) onSaved;
final Function(Uint8List) onChange; final Function(Uint8List) onChange;
const ESignature({Key key, this.oldSignature, this.onSaved,this.onChange, this.newSignature}) : super(key: key); const ESignature({Key key, this.oldSignature, this.onSaved, this.onChange, this.newSignature}) : super(key: key);
@override @override
State<ESignature> createState() => _ESignatureState(); State<ESignature> createState() => _ESignatureState();
@ -29,7 +29,7 @@ class _ESignatureState extends State<ESignature> {
bool _unpaint = false; bool _unpaint = false;
@override @override
void initState() { void initState() {
if(widget.newSignature != null) { if (widget.newSignature != null) {
signature = widget.newSignature; signature = widget.newSignature;
} }
// TODO: implement initState // TODO: implement initState
@ -46,72 +46,75 @@ class _ESignatureState extends State<ESignature> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Column( return Column(
children: [ children: [
if(widget.oldSignature != null || signature != null) if (widget.oldSignature != null || signature != null)
Container( Container(
width: MediaQuery.of(context).size.width, width: MediaQuery.of(context).size.width,
padding: const EdgeInsets.only(bottom: 8), padding: const EdgeInsets.only(bottom: 8),
height: 90 * AppStyle.getScaleFactor(context), height: 90 * AppStyle.getScaleFactor(context),
child: signature != null ? child: signature != null ? Image.memory(signature) : ImageLoader(boxFit: BoxFit.contain, url: widget.oldSignature)),
Image.memory(signature): FormField<String>(onSaved: (_) async {
ImageLoader( widget.onSaved(signature);
boxFit: BoxFit.contain, }, builder: (FormFieldState<String> state) {
url: widget.oldSignature) return Column(
), children: [
FormField<String>( Container(
onSaved: (_) async { width: MediaQuery.of(context).size.width,
widget.onSaved(signature); padding: const EdgeInsets.symmetric(horizontal: 16),
}, decoration: BoxDecoration(
builder: (FormFieldState<String> state) { color: Colors.white,
return Column( border: Border.all(color: AColors.black),
children: [ borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)),
Container( boxShadow: const [AppStyle.boxShadow]),
width: MediaQuery.of(context).size.width, child: AbsorbPointer(
padding: const EdgeInsets.symmetric( absorbing: _unpaint,
horizontal: 16 child: Signature(
), controller: _controller,
decoration: BoxDecoration( height: 160 * AppStyle.getScaleFactor(context),
color: Colors.white, backgroundColor: Colors.transparent,
border: Border.all(color:AColors.black),
borderRadius: BorderRadius.circular(
AppStyle.borderRadius * AppStyle.getScaleFactor(context)
),
boxShadow: const [
AppStyle.boxShadow
]
),
child: AbsorbPointer(
absorbing: _unpaint,
child: Signature(
controller: _controller,
height: 160 * AppStyle.getScaleFactor(context),
backgroundColor: Colors.transparent,
),
),
), ),
Row( ),
children: [ ),
IconButton(onPressed: (){_controller.clear();}, icon: const Icon(Icons.clear)), Row(
IconButton(onPressed: (){_controller.undo();}, icon: const Icon(Icons.undo)), children: [
IconButton(onPressed: (){_controller.redo();}, icon: const Icon(Icons.redo)), IconButton(
onPressed: () {
IconButton(onPressed: (){ _controller.clear();
},
icon: const Icon(Icons.clear)),
IconButton(
onPressed: () {
_controller.undo();
},
icon: const Icon(Icons.undo)),
IconButton(
onPressed: () {
_controller.redo();
},
icon: const Icon(Icons.redo)),
IconButton(
onPressed: () {
_unpaint = !_unpaint; _unpaint = !_unpaint;
setState(() {}); setState(() {});
}, icon: Icon( },
icon: Icon(
_unpaint ? Icons.draw : Icons.ac_unit, _unpaint ? Icons.draw : Icons.ac_unit,
color: _unpaint ? AColors.orange : null,)), color: _unpaint ? AColors.orange : null,
const Spacer(), )),
IconButton(onPressed: () async { const Spacer(),
IconButton(
onPressed: () async {
signature = await _controller.toPngBytes(); signature = await _controller.toPngBytes();
widget.onChange(signature); if (widget.onChange != null) {
widget.onChange(signature);
}
setState(() {}); setState(() {});
}, icon: const Icon(Icons.check)), },
], icon: const Icon(Icons.check)),
)
], ],
); )
} ],
), );
}),
], ],
); );
} }

@ -9,11 +9,14 @@ import 'package:test_sa/views/widgets/buttons/app_small_button.dart';
import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart';
import 'package:test_sa/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart'; import 'package:test_sa/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart';
import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart';
class PentryCalibrationToolForm extends StatefulWidget { class PentryCalibrationToolForm extends StatefulWidget {
final List<CalibrationTool> models; final List<CalibrationTool> models;
final bool enableValidate; final bool enableValidate;
const PentryCalibrationToolForm({ const PentryCalibrationToolForm({
Key key, this.models, this.enableValidate, Key key,
this.models,
this.enableValidate,
}) : super(key: key); }) : super(key: key);
@override @override
@ -21,75 +24,80 @@ class PentryCalibrationToolForm extends StatefulWidget {
} }
class _PentryCalibrationToolFormState extends State<PentryCalibrationToolForm> { class _PentryCalibrationToolFormState extends State<PentryCalibrationToolForm> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final subtitle = AppLocalization.of(context).subtitle; final subtitle = AppLocalization.of(context).subtitle;
final userProvider = Provider.of<UserProvider>(context); final userProvider = Provider.of<UserProvider>(context);
return ListView.builder( return ListView.builder(
padding: EdgeInsets.only( padding: EdgeInsets.only(
top: 12 * AppStyle.getScaleFactor(context), top: 12 * AppStyle.getScaleFactor(context), left: 12 * AppStyle.getScaleFactor(context), right: 12 * AppStyle.getScaleFactor(context), bottom: 80 * AppStyle.getScaleFactor(context)),
left: 12 * AppStyle.getScaleFactor(context), itemCount: widget.models.length + 1,
right: 12 * AppStyle.getScaleFactor(context), itemBuilder: (context, index) {
bottom: 80 * AppStyle.getScaleFactor(context) if (index == widget.models.length) {
), return AButton(
itemCount: widget.models.length + 1, text: subtitle.add,
itemBuilder: (context,index){ onPressed: () {
if(index == widget.models.length){ widget.models.add(CalibrationTool());
return AButton(
text: subtitle.add,
onPressed: (){
widget.models.add(CalibrationTool());
setState(() {});
},
);
}
final model = widget.models[index];
return ListView(
shrinkWrap: true,
physics: const ClampingScrollPhysics(),
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
ASubTitle("#${index+1}"),
if(index != 0)
ASmallButton(
color: Theme.of(context).colorScheme.error,
text: subtitle.delete,
onPressed: (){
widget.models.remove(model);
setState(() {});
},
),
],
),
const SizedBox(height: 8,),
const ASubTitle("Asset Number"),
const SizedBox(height: 4,),
AutoCompleteDeviceNumberField(
initialValue: model.assetsNumber,
hospitalId: userProvider.user.hospital?.id,
onPick: (number){
model.assetsNumber = number;
},
),
const SizedBox(height: 8,),
const ASubTitle("Date of Testing"),
const SizedBox(height: 4,),
ADatePicker(
date: model.dataOfTesting,
onDatePicker: (date){
model.dataOfTesting =date;
setState(() {}); setState(() {});
}, },
), );
const SizedBox(height: 8,), }
Divider(color: Theme.of(context).textTheme.titleMedium.color,), final model = widget.models[index];
], return ListView(
); shrinkWrap: true,
} physics: const ClampingScrollPhysics(),
); children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
ASubTitle("#${index + 1}"),
if (index != 0)
ASmallButton(
color: Theme.of(context).colorScheme.error,
text: subtitle.delete,
onPressed: () {
widget.models.remove(model);
setState(() {});
},
),
],
),
const SizedBox(
height: 8,
),
const ASubTitle("Asset Number"),
const SizedBox(
height: 4,
),
AutoCompleteDeviceNumberField(
initialValue: model.assetsNumber,
hospitalId: userProvider.user.hospital?.id,
onPick: (number) {
model.assetsNumber = number;
},
),
const SizedBox(
height: 8,
),
const ASubTitle("Date of Testing"),
const SizedBox(
height: 4,
),
ADatePicker(
date: model.dataOfTesting,
onDatePicker: (date) {
model.dataOfTesting = date;
setState(() {});
},
),
const SizedBox(
height: 8,
),
Divider(
color: Theme.of(context).textTheme.titleMedium.color,
),
],
);
});
} }
} }

@ -6,6 +6,7 @@ import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import 'package:test_sa/views/widgets/status/single_status_menu.dart'; 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;
@ -16,22 +17,19 @@ class ServiceRequestPriorityMenu extends StatelessWidget {
final settingProvider = Provider.of<SettingProvider>(context); final settingProvider = Provider.of<SettingProvider>(context);
final userProvider = Provider.of<UserProvider>(context); final userProvider = Provider.of<UserProvider>(context);
final menuProvider = Provider.of<ServiceRequestPriorityProvider>(context); final menuProvider = Provider.of<ServiceRequestPriorityProvider>(context);
return LoadingManager( return LoadingManager(
isLoading: menuProvider.isLoading, isLoading: menuProvider.isLoading,
isFailedLoading: menuProvider.items == null, isFailedLoading: menuProvider.items == null,
stateCode: menuProvider.stateCode, stateCode: menuProvider.stateCode,
onRefresh: () async { onRefresh: () async {
menuProvider.reset(); menuProvider.reset();
await menuProvider.getData( await menuProvider.getData(user: userProvider.user, host: settingProvider.host);
user: userProvider.user,
host: settingProvider.host
);
}, },
child: SingleStatusMenu( child: SingleStatusMenu(
initialStatus: initialValue, initialStatus: initialValue,
statuses: menuProvider.items, statuses: menuProvider.items,
onSelect: onSelect, onSelect: onSelect,
) ));
);
} }
} }

@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.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';
class SingleStatusMenu extends StatefulWidget { class SingleStatusMenu extends StatefulWidget {
final List<Lookup> statuses; final List<Lookup> statuses;
final Lookup initialStatus; final Lookup initialStatus;
@ -14,27 +15,25 @@ class SingleStatusMenu extends StatefulWidget {
} }
class _SingleStatusMenuState extends State<SingleStatusMenu> { class _SingleStatusMenuState extends State<SingleStatusMenu> {
Lookup _selectedStatus; Lookup _selectedStatus;
@override @override
void setState(VoidCallback fn) { void setState(VoidCallback fn) {
if(mounted) super.setState(fn); if (mounted) super.setState(fn);
} }
@override @override
void didUpdateWidget(covariant SingleStatusMenu oldWidget) { void didUpdateWidget(covariant SingleStatusMenu oldWidget) {
if(widget.initialStatus != null ){ if (widget.initialStatus != null) {
final result = widget.statuses?.where( final result = widget.statuses?.where((element) {
(element) { return element == widget.initialStatus;
return element == widget.initialStatus; });
}); if (result.isNotEmpty) {
if(result.isNotEmpty) { _selectedStatus = result.first;
_selectedStatus =result.first; } else {
}else{ _selectedStatus = null;
_selectedStatus =null;
} }
if(widget.initialStatus.id != _selectedStatus.id) { if (widget.initialStatus?.id != _selectedStatus?.id) {
widget.onSelect(_selectedStatus); widget.onSelect(_selectedStatus);
} }
} else { } else {
@ -45,13 +44,12 @@ class _SingleStatusMenuState extends State<SingleStatusMenu> {
@override @override
void initState() { void initState() {
if(widget.initialStatus != null){ if (widget.initialStatus != null) {
final result = widget.statuses?.where( final result = widget.statuses?.where((element) {
(element) { return element == widget.initialStatus;
return element == widget.initialStatus; });
}); if (result.isNotEmpty) _selectedStatus = result.first;
if(result.isNotEmpty) _selectedStatus = result.first; if (widget.initialStatus.id != _selectedStatus?.id) {
if(widget.initialStatus.id != _selectedStatus?.id) {
widget.onSelect(_selectedStatus); widget.onSelect(_selectedStatus);
} }
} }
@ -76,7 +74,7 @@ class _SingleStatusMenuState extends State<SingleStatusMenu> {
child: DropdownButton<Lookup>( child: DropdownButton<Lookup>(
value: _selectedStatus, value: _selectedStatus,
iconSize: 24, iconSize: 24,
icon: Icon(Icons.keyboard_arrow_down_rounded), icon: const Icon(Icons.keyboard_arrow_down_rounded),
elevation: 0, elevation: 0,
isExpanded: true, isExpanded: true,
hint: Text( hint: Text(
@ -91,17 +89,16 @@ class _SingleStatusMenuState extends State<SingleStatusMenu> {
}); });
widget.onSelect(newValue); widget.onSelect(newValue);
}, },
items: widget.statuses items: widget.statuses.map<DropdownMenuItem<Lookup>>((Lookup value) {
.map<DropdownMenuItem<Lookup>>((Lookup value) {
return DropdownMenuItem<Lookup>( return DropdownMenuItem<Lookup>(
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,
//fontWeight: FontWeight.bold //fontWeight: FontWeight.bold
), ),
), ),
); );
}).toList(), }).toList(),

Loading…
Cancel
Save