implement searchWorkOrders api and edit on ui

main
nextwo 3 years ago
parent f39b6f5d8e
commit 756e2a1881

@ -8,12 +8,11 @@ import 'package:http/http.dart';
import 'package:test_sa/models/user.dart'; import 'package:test_sa/models/user.dart';
class ApiManager { class ApiManager {
ApiManager._(); ApiManager._();
Map<String,String> get _headers => { Map<String, String> get _headers => {
'Content-Type': 'application/json', 'Content-Type': 'application/json',
if(user != null) 'Authorization': 'Bearer ${user.token}', if (user != null) 'Authorization': 'Bearer ${user.token}',
}; };
static ApiManager instance = ApiManager._(); static ApiManager instance = ApiManager._();
@ -21,10 +20,9 @@ class ApiManager {
User user; User user;
Future<http.Response> get( Future<http.Response> get(
String url, String url, {
{Map<String,String> headers,} Map<String, String> headers,
) async{ }) async {
headers ??= {}; headers ??= {};
headers.addAll(_headers); headers.addAll(_headers);
@ -32,11 +30,11 @@ class ApiManager {
Uri _url = Uri.parse(url); Uri _url = Uri.parse(url);
// print(_url); // print(_url);
// print(headers); // print(headers);
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){ if (message != null && message.toString().isNotEmpty) {
Fluttertoast.showToast(msg: message ?? "",toastLength: Toast.LENGTH_LONG); Fluttertoast.showToast(msg: message ?? "", toastLength: Toast.LENGTH_LONG);
} }
} }
@ -45,11 +43,9 @@ class ApiManager {
Future<http.Response> post( Future<http.Response> post(
String url, { String url, {
Map<String,String> headers, Map<String, String> headers,
@required Map<String,dynamic> body, @required Map<String, dynamic> body,
} }) async {
) async{
headers ??= {}; headers ??= {};
headers.addAll(_headers); headers.addAll(_headers);
@ -67,10 +63,10 @@ class ApiManager {
// print(response.statusCode); // print(response.statusCode);
// log(response.body); // log(response.body);
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){ if (message != null && message.toString().isNotEmpty) {
Fluttertoast.showToast(msg: message ?? "",toastLength: Toast.LENGTH_LONG); Fluttertoast.showToast(msg: message ?? "", toastLength: Toast.LENGTH_LONG);
} }
} }
@ -79,11 +75,9 @@ class ApiManager {
Future<http.Response> put( Future<http.Response> put(
String url, { String url, {
Map<String,String> headers, Map<String, String> headers,
@required Map<String,dynamic> body, @required Map<String, dynamic> body,
} }) async {
) async{
headers ??= {}; headers ??= {};
headers.addAll(_headers); headers.addAll(_headers);
@ -100,10 +94,10 @@ class ApiManager {
http.Response response = await http.Response.fromStream(streamedResponse); http.Response response = await http.Response.fromStream(streamedResponse);
// print(response.statusCode); // print(response.statusCode);
// log(response.body); // log(response.body);
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){ if (message != null && message.toString().isNotEmpty) {
Fluttertoast.showToast(msg: message ?? "",toastLength: Toast.LENGTH_LONG); Fluttertoast.showToast(msg: message ?? "", toastLength: Toast.LENGTH_LONG);
} }
} }
return response; return response;
@ -111,11 +105,13 @@ class ApiManager {
Future<http.Response> multiPart( Future<http.Response> multiPart(
String url, { String url, {
Map<String,String> headers, Map<String, String> headers,
@required Map<String,String> body, @required Map<String, String> body,
@required List<Future<MultipartFile>> files, @required List<Future<MultipartFile>> files,
}) async{ }) async {
Map<String,String> _headers = const {'Content-Type': 'multipart/form-data',}; Map<String, String> _headers = const {
'Content-Type': 'multipart/form-data',
};
headers ??= {}; headers ??= {};
@ -139,10 +135,10 @@ class ApiManager {
http.Response response = await http.Response.fromStream(streamedResponse); http.Response response = await http.Response.fromStream(streamedResponse);
// print(response.statusCode); // print(response.statusCode);
// log(response.body); // log(response.body);
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){ if (message != null && message.toString().isNotEmpty) {
Fluttertoast.showToast(msg: message ?? "",toastLength: Toast.LENGTH_LONG); Fluttertoast.showToast(msg: message ?? "", toastLength: Toast.LENGTH_LONG);
} }
} }
return response; return response;

@ -1,40 +1,39 @@
import 'package:meta/meta.dart'; import 'package:meta/meta.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
class HttpStatusManger{ class HttpStatusManger {
static String getStatusMessage({ static String getStatusMessage({
@required int status, @required int status,
@required Subtitle subtitle, @required Subtitle subtitle,
String messageFor400, String messageFor400,
String messageFor200, String messageFor200,
}){ }) {
if(status == null) if (status == null)
// no status code - code error no need for subtitle // no status code - code error no need for subtitle
return "careful null status"; return "careful null status";
if(status == -1) if (status == -1)
// client's request in process // client's request in process
return subtitle.currentlyServiceNotAvailable; return subtitle.currentlyServiceNotAvailable;
if(status == -2){ if (status == -2) {
// client's request in process // client's request in process
return subtitle.waitUntilYourRequestComplete; return subtitle.waitUntilYourRequestComplete;
}else if(status >= 200 && status < 300){ } else if (status >= 200 && status < 300) {
// client's request was successfully received // client's request was successfully received
return messageFor200 ?? subtitle.requestCompleteSuccessfully; return messageFor200 ?? subtitle.requestCompleteSuccessfully;
} else if(status >= 400 && status < 500){ } else if (status >= 400 && status < 500) {
// client's request have error // client's request have error
switch(status){ switch (status) {
case 400: case 400:
return messageFor400 ?? subtitle.failedToCompleteRequest; return messageFor400 ?? subtitle.failedToCompleteRequest;
default: default:
return subtitle.failedToCompleteRequest; return subtitle.failedToCompleteRequest;
} }
} else if(status >= 500){ } else if (status >= 500) {
// server error // server error
return subtitle.currentlyServiceNotAvailable; return subtitle.currentlyServiceNotAvailable;
} else { } else {
// no error match so return default error // no error match so return default error
return subtitle.failedToCompleteRequest; return subtitle.failedToCompleteRequest;
} }
} }
} }

@ -4,7 +4,6 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
class AppLocalization { class AppLocalization {
AppLocalization(this.locale); AppLocalization(this.locale);
@ -17,23 +16,20 @@ class AppLocalization {
Subtitle get subtitle => _subtitle; Subtitle get subtitle => _subtitle;
Future<void> load() async { Future<void> load() async {
String jsonStringValues = String jsonStringValues = await rootBundle.loadString('assets/subtitles/${locale.languageCode}_subtitle.json');
await rootBundle.loadString('assets/subtitles/${locale.languageCode}_subtitle.json');
_subtitle = Subtitle.fromJson(json.decode(jsonStringValues)); _subtitle = Subtitle.fromJson(json.decode(jsonStringValues));
} }
// static member to have simple access to the delegate from Material App // static member to have simple access to the delegate from Material App
static const LocalizationsDelegate<AppLocalization> delegate = static const LocalizationsDelegate<AppLocalization> delegate = _DemoLocalizationsDelegate();
_DemoLocalizationsDelegate();
} }
class _DemoLocalizationsDelegate class _DemoLocalizationsDelegate extends LocalizationsDelegate<AppLocalization> {
extends LocalizationsDelegate<AppLocalization> {
const _DemoLocalizationsDelegate(); const _DemoLocalizationsDelegate();
@override @override
bool isSupported(Locale locale) { bool isSupported(Locale locale) {
return ['en','ar'].contains(locale.languageCode); return ['en', 'ar'].contains(locale.languageCode);
} }
@override @override

@ -7,8 +7,7 @@ import 'package:test_sa/models/app_notification.dart';
import 'notification_manger.dart'; import 'notification_manger.dart';
class FirebaseNotificationManger{ class FirebaseNotificationManger {
static FirebaseMessaging messaging = FirebaseMessaging.instance; static FirebaseMessaging messaging = FirebaseMessaging.instance;
static String token; static String token;
@ -23,7 +22,7 @@ class FirebaseNotificationManger{
sound: true, sound: true,
); );
if(settings.authorizationStatus == AuthorizationStatus.authorized){ if (settings.authorizationStatus == AuthorizationStatus.authorized) {
token = await messaging.getToken(); token = await messaging.getToken();
} }
return token; return token;
@ -32,7 +31,7 @@ class FirebaseNotificationManger{
static initialized(BuildContext context) async { static initialized(BuildContext context) async {
await Firebase.initializeApp(); await Firebase.initializeApp();
NotificationSettings settings; NotificationSettings settings;
try{ try {
settings = await messaging.requestPermission( settings = await messaging.requestPermission(
alert: true, alert: true,
announcement: false, announcement: false,
@ -42,11 +41,11 @@ class FirebaseNotificationManger{
provisional: false, provisional: false,
sound: true, sound: true,
); );
}catch(error){ } catch (error) {
return; return;
} }
if(settings.authorizationStatus != AuthorizationStatus.authorized){ if (settings.authorizationStatus != AuthorizationStatus.authorized) {
return; return;
} }
@ -56,28 +55,17 @@ class FirebaseNotificationManger{
FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) { FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
AppNotification notification = AppNotification.fromJson(message.data); AppNotification notification = AppNotification.fromJson(message.data);
if(notification.path == null if (notification.path == null || notification.path.isEmpty) return;
|| notification.path.isEmpty) Navigator.pushNamed(context, notification.path, arguments: notification.requestId);
return;
Navigator.pushNamed(
context,
notification.path,
arguments: notification.requestId
);
}); });
FirebaseMessaging.onMessage.listen((RemoteMessage message) { FirebaseMessaging.onMessage.listen((RemoteMessage message) {
AppNotification notification = AppNotification.fromJson(message.data); AppNotification notification = AppNotification.fromJson(message.data);
NotificationManger.showNotification( NotificationManger.showNotification(
title: message.notification.title, title: message.notification.title, subtext: message.notification.body, hashcode: int.tryParse(notification.requestId ?? "") ?? 1, payload: json.encode(message.data));
subtext: message.notification.body,
hashcode: int.tryParse(notification.requestId ?? "") ?? 1,
payload: json.encode(message.data)
);
return; return;
}); });
} }
} }
Future<void> firebaseMessagingBackgroundHandler(RemoteMessage message) async { Future<void> firebaseMessagingBackgroundHandler(RemoteMessage message) async {}
}

@ -2,7 +2,7 @@ import 'package:flutter/foundation.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/colors.dart';
class NotificationManger{ class NotificationManger {
// private constructor to avoid create object // private constructor to avoid create object
NotificationManger._(); NotificationManger._();
@ -12,43 +12,26 @@ class NotificationManger{
/// onNotificationPressed action when notification pressed to open tap /// onNotificationPressed action when notification pressed to open tap
/// onIOSNotificationPressed action when notification pressed /// onIOSNotificationPressed action when notification pressed
/// to open tap in iOS versions older than 10 /// to open tap in iOS versions older than 10
static initialisation( static initialisation(Function(NotificationResponse) onNotificationPressed, DidReceiveLocalNotificationCallback onIOSNotificationPressed) async {
Function(NotificationResponse) onNotificationPressed, FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
DidReceiveLocalNotificationCallback onIOSNotificationPressed
) async {
FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
FlutterLocalNotificationsPlugin();
// initialise the plugin. app_icon needs to be a added as a drawable resource to the Android head project // initialise the plugin. app_icon needs to be a added as a drawable resource to the Android head project
const AndroidInitializationSettings initializationSettingsAndroid = const AndroidInitializationSettings initializationSettingsAndroid = AndroidInitializationSettings(
AndroidInitializationSettings('app_icon',); 'app_icon',
);
final DarwinInitializationSettings initializationSettingsDarwin = final DarwinInitializationSettings initializationSettingsDarwin = DarwinInitializationSettings(onDidReceiveLocalNotification: onIOSNotificationPressed);
DarwinInitializationSettings(
onDidReceiveLocalNotification: onIOSNotificationPressed);
final InitializationSettings initializationSettings = InitializationSettings( final InitializationSettings initializationSettings = InitializationSettings(android: initializationSettingsAndroid, iOS: initializationSettingsDarwin, macOS: initializationSettingsDarwin);
android: initializationSettingsAndroid,
iOS: initializationSettingsDarwin,
macOS: initializationSettingsDarwin);
await flutterLocalNotificationsPlugin.initialize( await flutterLocalNotificationsPlugin.initialize(initializationSettings, onDidReceiveNotificationResponse: onNotificationPressed);
initializationSettings,
onDidReceiveNotificationResponse: onNotificationPressed);
} }
// push new notification // push new notification
static Future showNotification( static Future showNotification({@required String title, @required String subtext, @required int hashcode, String payload}) async {
{
@required String title,
@required String subtext,
@required int hashcode,
String payload
}) async {
const AndroidNotificationDetails androidChannel = AndroidNotificationDetails( const AndroidNotificationDetails androidChannel = AndroidNotificationDetails(
'com.newtrack.testsa', 'com.newtrack.testsa',
'Test SA', 'Test SA',
channelDescription:'Push notification service for Test SA', channelDescription: 'Push notification service for Test SA',
importance: Importance.max, importance: Importance.max,
priority: Priority.max, priority: Priority.max,
playSound: true, playSound: true,
@ -62,8 +45,7 @@ class NotificationManger{
groupKey: 'com.newtrack.testsa', groupKey: 'com.newtrack.testsa',
); );
const DarwinNotificationDetails iosNotificationDetails = const DarwinNotificationDetails iosNotificationDetails = DarwinNotificationDetails(
DarwinNotificationDetails(
categoryIdentifier: "testSA", categoryIdentifier: "testSA",
); );
@ -81,5 +63,4 @@ class NotificationManger{
payload: payload, payload: payload,
); );
} }
} }

@ -6,10 +6,9 @@ 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/department.dart'; import 'package:test_sa/models/department.dart';
class DepartmentsProvider extends ChangeNotifier{ class DepartmentsProvider extends ChangeNotifier {
//reset provider data //reset provider data
void reset(){ void reset() {
departments = null; departments = null;
stateCode = null; stateCode = null;
} }
@ -19,7 +18,6 @@ class DepartmentsProvider extends ChangeNotifier{
// 500 service not available // 500 service not available
int stateCode; int stateCode;
// contain user data // contain user data
// when user not login or register _user = null // when user not login or register _user = null
List<Department> departments; List<Department> departments;
@ -29,34 +27,29 @@ class DepartmentsProvider extends ChangeNotifier{
// failed _loading = false // failed _loading = false
bool isLoading; bool isLoading;
/// 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<int> getDepartment (String host) async { Future<int> getDepartment(String host) async {
if(isLoading == true) if (isLoading == true) return -2;
return -2;
isLoading = true; isLoading = true;
notifyListeners(); notifyListeners();
Response response; Response response;
try{ try {
response = await ApiManager.instance.post( response = await ApiManager.instance.post(URLs.getDepartments, body: {
URLs.getDepartments, "pageSize": 50,
body: {
"pageSize":50,
// if(title != null && title.isNotEmpty) "name":title, // if(title != null && title.isNotEmpty) "name":title,
} });
); } catch (error) {
} catch(error) {
isLoading = false; isLoading = 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 listJson = json.decode(response.body)["data"]; List listJson = json.decode(response.body)["data"];
departments = listJson.map((department) => Department.fromJson(department)).toList(); departments = listJson.map((department) => Department.fromJson(department)).toList();
@ -65,5 +58,4 @@ class DepartmentsProvider extends ChangeNotifier{
notifyListeners(); notifyListeners();
return response.statusCode; return response.statusCode;
} }
} }

@ -143,9 +143,8 @@ class DeviceTransferProvider extends ChangeNotifier {
"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,
@ -157,16 +156,14 @@ class DeviceTransferProvider extends ChangeNotifier {
"destSiteId": oldModel.receiver.client.id, "destSiteId": oldModel.receiver.client.id,
"destDepartmentId": oldModel.receiver.department.id, "destDepartmentId": oldModel.receiver.department.id,
"receiverAssignedEmployeeId": oldModel.receiver.userId, "receiverAssignedEmployeeId": oldModel.receiver.userId,
"receiverMachineStatusId": oldModel.receiver.status.id??"", "receiverMachineStatusId": oldModel.receiver.status.id ?? "",
"receiverComment": oldModel.receiver.comment, "receiverComment": oldModel.receiver.comment,
"receiverWorkingHours": oldModel.receiver.workingHours, "receiverWorkingHours": oldModel.receiver.workingHours,
"receiverTravelingHours": oldModel.receiver.travelingHours, "receiverTravelingHours": oldModel.receiver.travelingHours,
"receiverAttachmentName": "${oldModel.receiver.signature}.png", "receiverAttachmentName": "${oldModel.receiver.signature}.png",
} });
); } else {
}else{ body.addAll({
body.addAll(
{
"senderSiteId": oldModel.sender.client.id, "senderSiteId": oldModel.sender.client.id,
"senderDepartmentId": oldModel.sender.department.id, "senderDepartmentId": oldModel.sender.department.id,
"senderAssignedEmployeeId": oldModel.sender.userId, "senderAssignedEmployeeId": oldModel.sender.userId,
@ -178,26 +175,21 @@ class DeviceTransferProvider extends ChangeNotifier {
"destSiteId": newModel.client.id, "destSiteId": newModel.client.id,
"destDepartmentId": newModel.department.id, "destDepartmentId": newModel.department.id,
"receiverAssignedEmployeeId": newModel.userId, "receiverAssignedEmployeeId": newModel.userId,
"receiverMachineStatusId": newModel.status?.id??"", "receiverMachineStatusId": newModel.status?.id ?? "",
"receiverComment": newModel.comment, "receiverComment": newModel.comment,
"receiverWorkingHours": newModel.workingHours, "receiverWorkingHours": newModel.workingHours,
"receiverTravelingHours": newModel.travelingHours, "receiverTravelingHours": newModel.travelingHours,
"receiverAttachmentName": "${newModel.signature}.png", "receiverAttachmentName": "${newModel.signature}.png",
} });
);
} }
print(body["senderWorkingHours"]); print(body["senderWorkingHours"]);
body.addAll(newModel.toJson(isSender)); body.addAll(newModel.toJson(isSender));
print(body); print(body);
Response response; Response response;
try{ try {
response = await ApiManager.instance.put( response = await ApiManager.instance.put(URLs.updateDeviceTransfer, body: body);
URLs.updateDeviceTransfer,
body: body
);
print(response.body); print(response.body);
print("${newModel.signature}.png"); print("${newModel.signature}.png");

@ -23,7 +23,7 @@ class DevicesProvider extends ChangeNotifier {
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
@ -54,8 +54,8 @@ class DevicesProvider extends ChangeNotifier {
Response response; Response response;
try { try {
response = await ApiManager.instance.post(URLs.getEquipment, body: { response = await ApiManager.instance.post(URLs.getEquipment, body: {
"pageSize": pageItemNumber , "pageSize": pageItemNumber,
"pageNumber":devices.length ~/ pageItemNumber + 1, "pageNumber": devices.length ~/ pageItemNumber + 1,
"siteId": hospitalId, "siteId": hospitalId,
if (serialNumber?.isEmpty == false) "assetSerialNumber": serialNumber, if (serialNumber?.isEmpty == false) "assetSerialNumber": serialNumber,
if (number?.isEmpty == false) "assetNo": number, if (number?.isEmpty == false) "assetNo": number,
@ -72,8 +72,7 @@ class DevicesProvider extends ChangeNotifier {
List equipmentListJson = json.decode(response.body)["data"]; List equipmentListJson = json.decode(response.body)["data"];
_devices.addAll(equipmentListJson.map<Device>((device) => Device.fromJson(device)).toList()); _devices.addAll(equipmentListJson.map<Device>((device) => Device.fromJson(device)).toList());
nextPage = true; nextPage = true;
}else } else {
{
nextPage = false; nextPage = false;
} }
_loading = false; _loading = false;
@ -97,7 +96,7 @@ class DevicesProvider extends ChangeNotifier {
try { try {
response = await ApiManager.instance.post(URLs.getEquipment, body: { response = await ApiManager.instance.post(URLs.getEquipment, body: {
"pageSize": pageItemNumber, "pageSize": pageItemNumber,
"pageNumber":devices.length ~/ pageItemNumber + 1, "pageNumber": devices.length ~/ pageItemNumber + 1,
"siteId": devices.length ~/ pageItemNumber + 1, "siteId": devices.length ~/ pageItemNumber + 1,
if (serialNumber?.isEmpty == false) "assetSerialNumber": serialNumber, if (serialNumber?.isEmpty == false) "assetSerialNumber": serialNumber,
if (number?.isEmpty == false) "assetNo": number, if (number?.isEmpty == false) "assetNo": number,

@ -7,13 +7,12 @@ 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/user.dart'; import 'package:test_sa/models/user.dart';
class GasRefillProvider extends ChangeNotifier{ class GasRefillProvider 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;
@ -40,17 +39,16 @@ class GasRefillProvider 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;
Response response; Response response;
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(
@ -58,114 +56,105 @@ class GasRefillProvider extends ChangeNotifier{
body: body, body: body,
); );
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 requestsListJson = json.decode(response.body)["data"]; List requestsListJson = json.decode(response.body)["data"];
List<GasRefillModel> itemsPage = requestsListJson.map( List<GasRefillModel> itemsPage = requestsListJson.map((request) => GasRefillModel.fromJson(request)).toList();
(request) => GasRefillModel.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;
} }
} }
try{ try {
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> createModel ({ Future<int> createModel({
@required String host, @required String host,
@required User user, @required User user,
@required GasRefillModel model, @required GasRefillModel 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 ?? "",
"GazRefillNo": "GR-${DateTime.now().toString().split(" ").first}", "GazRefillNo": "GR-${DateTime.now().toString().split(" ").first}",
"status": model.status.toMap(), "status": model.status.toMap(),
}; };
body["gazRefillDetails"] = model.details.map((model) => { body["gazRefillDetails"] = model.details
.map((model) => {
"gasType": model.type.toMap(), "gasType": model.type.toMap(),
"cylinderSize": model.cylinderSize.toMap(), "cylinderSize": model.cylinderSize.toMap(),
"cylinderType": model.cylinderType.toMap(), "cylinderType": model.cylinderType.toMap(),
"requestedQty": model.requestedQuantity, "requestedQty": model.requestedQuantity,
}).toList(); })
.toList();
Response response; Response response;
try{ try {
response = await ApiManager.instance.post( response = await ApiManager.instance.post(URLs.requestGasRefill, body: body);
URLs.requestGasRefill,
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) {
reset(); reset();
notifyListeners(); notifyListeners();
} }
} }
return response.statusCode; return response.statusCode;
} catch (error) {
} catch(error) {
return -1; return -1;
} }
} }
Future<int> updateModel ({ Future<int> updateModel({
@required String host, @required String host,
@required User user, @required User user,
@required GasRefillModel oldModel, @required GasRefillModel oldModel,
@required GasRefillModel newModel, @required GasRefillModel newModel,
}) async { }) async {
Map<String,dynamic> body = { Map<String, dynamic> body = {
"id":newModel.id, "id": newModel.id,
"gazRefillNo": newModel.title ?? "", "gazRefillNo": newModel.title ?? "",
"status": newModel.status.toMap(), "status": newModel.status.toMap(),
}; };
body["gazRefillDetails"] = newModel.details.map((model) => { body["gazRefillDetails"] = newModel.details
.map((model) => {
"gasType": model.type.toMap(), "gasType": model.type.toMap(),
"cylinderSize": model.cylinderSize.toMap(), "cylinderSize": model.cylinderSize.toMap(),
"cylinderType": model.cylinderType.toMap(), "cylinderType": model.cylinderType.toMap(),
"requestedQty": model.requestedQuantity, "requestedQty": model.requestedQuantity,
"deliverdQty": model.deliveredQuantity, "deliverdQty": model.deliveredQuantity,
}).toList(); })
.toList();
Response response; Response response;
try{ try {
response = await ApiManager.instance.put( response = await ApiManager.instance.put(URLs.updateGasRefill, body: body);
URLs.updateGasRefill,
body: body
);
// response = await post( // response = await post(
// Uri.parse("$host${URLs.updateGasRefill}/${newModel.id}"), // Uri.parse("$host${URLs.updateGasRefill}/${newModel.id}"),
// body: body, // body: body,
// ); // );
stateCode = response.statusCode; stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
oldModel.fromGasRefillModel(newModel); oldModel.fromGasRefillModel(newModel);
notifyListeners(); notifyListeners();
} }
return response.statusCode; return response.statusCode;
} catch (error) {
} catch(error) {
return -1; return -1;
} }
} }
} }

@ -8,13 +8,12 @@ import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/hospital.dart';
import 'package:test_sa/models/user.dart'; import 'package:test_sa/models/user.dart';
class HospitalsProvider extends ChangeNotifier{ class HospitalsProvider 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() {
_hospitals = null; _hospitals = null;
_stateCode = null; _stateCode = null;
} }
@ -39,7 +38,7 @@ class HospitalsProvider 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();
} }
@ -49,58 +48,49 @@ class HospitalsProvider 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> getHospitals ({String host,User user,String title}) async { Future<int> getHospitals({String host, User user, String title}) 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.getHospitals, body: {
URLs.getHospitals, "pageNumber": (hospitals?.length ?? 0) ~/ pageItemNumber + 1,
body: { "pageSize": 50,
"pageNumber":(hospitals?.length ?? 0) ~/pageItemNumber + 1, if (title != null && title.isNotEmpty) "name": title,
"pageSize":50, });
if(title != null && title.isNotEmpty) "name":title,
}
);
_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 categoriesListJson = json.decode(response.body)["data"]; List categoriesListJson = json.decode(response.body)["data"];
List<Hospital> _page = categoriesListJson.map((category) => Hospital.fromJson(category)).toList(); List<Hospital> _page = categoriesListJson.map((category) => Hospital.fromJson(category)).toList();
if(hospitals == null) if (hospitals == null) _hospitals = [];
_hospitals = [];
_hospitals.addAll(_page); _hospitals.addAll(_page);
if(_page.length >= pageItemNumber){ if (_page.length >= pageItemNumber) {
_nextPage = true; _nextPage = true;
}else{ } else {
_nextPage = false; _nextPage = false;
} }
} }
_loading = false; _loading = false;
notifyListeners(); notifyListeners();
return response.statusCode; return response.statusCode;
} catch(error) { } catch (error) {
_loading = false; _loading = false;
_stateCode = -1; _stateCode = -1;
notifyListeners(); notifyListeners();
return -1; return -1;
} }
} }
Future<List<Hospital>> getHospitalsList ({String host,User user,String title}) async { Future<List<Hospital>> getHospitalsList({String host, User user, String title}) async {
Response response; Response response;
try{ try {
response = await ApiManager.instance.post( response = await ApiManager.instance.post(URLs.getHospitals, body: {
URLs.getHospitals, "pageSize": 50,
body: { if (title != null && title.isNotEmpty) "name": title,
"pageSize":50, });
if(title != null && title.isNotEmpty) "name":title,
}
);
// response = await get( // response = await get(
// Uri.parse(host + URLs.getHospitals // Uri.parse(host + URLs.getHospitals
// + ( title == null || title.isEmpty ? "" : "?name=$title" )), // + ( title == null || title.isEmpty ? "" : "?name=$title" )),
@ -111,19 +101,17 @@ class HospitalsProvider extends ChangeNotifier{
_stateCode = response.statusCode; _stateCode = response.statusCode;
List<Hospital> _page = []; List<Hospital> _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((category) => Hospital.fromJson(category)).toList(); _page = categoriesListJson.map((category) => Hospital.fromJson(category)).toList();
} }
return _page; return _page;
} catch(error) { } catch (error) {
_loading = false; _loading = false;
_stateCode = -1; _stateCode = -1;
notifyListeners(); notifyListeners();
return []; return [];
} }
} }
} }

@ -6,13 +6,12 @@ import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/app_notification.dart'; import 'package:test_sa/models/app_notification.dart';
import 'package:test_sa/models/user.dart'; import 'package:test_sa/models/user.dart';
class NotificationsProvider extends ChangeNotifier{ class NotificationsProvider extends ChangeNotifier {
// number of items call in each request // number of items call in each request
final pageItemNumber = 20; final pageItemNumber = 20;
//reset provider data //reset provider data
void reset(){ void reset() {
notifications = null; notifications = null;
nextPage = true; nextPage = true;
stateCode = null; stateCode = null;
@ -34,58 +33,50 @@ class NotificationsProvider extends ChangeNotifier{
// failed _loading = false // failed _loading = false
bool isLoading; bool isLoading;
/// 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<int> getNotifications ({ Future<int> getNotifications({
@required String host, @required String host,
@required User user, @required User user,
@required int hospitalId, @required int hospitalId,
}) async { }) async {
if(isLoading == true) if (isLoading == true) return -2;
return -2;
isLoading = true; isLoading = true;
notifyListeners(); notifyListeners();
Response response; Response response;
// userId = 397.toString(); // testing id to view data // userId = 397.toString(); // testing id to view data
try{ try {
response = await get( response = await get(
Uri.parse(URLs.getNotifications Uri.parse(URLs.getNotifications +
+"?uid=${user.id}" "?uid=${user.id}"
"&token=${user.token}" "&token=${user.token}"
"&page=${(notifications?.length ?? 0) ~/pageItemNumber}"), "&page=${(notifications?.length ?? 0) ~/ pageItemNumber}"),
headers: { headers: {"Content-Type": "application/json; charset=utf-8"});
"Content-Type":"application/json; charset=utf-8"
}
);
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 requestsListJson = json.decode(utf8.decode(response.bodyBytes)); List requestsListJson = json.decode(utf8.decode(response.bodyBytes));
List<AppNotification> _serviceRequestsPage = requestsListJson.map( List<AppNotification> _serviceRequestsPage = requestsListJson.map((request) => AppNotification.fromJson(request)).toList();
(request) => AppNotification.fromJson(request)).toList(); if (notifications == null) notifications = [];
if(notifications == null)
notifications = [];
notifications.addAll(_serviceRequestsPage); notifications.addAll(_serviceRequestsPage);
if(_serviceRequestsPage.length == pageItemNumber){ if (_serviceRequestsPage.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;
} }
} }
/// return -2 if request in progress /// return -2 if request in progress
@ -93,35 +84,26 @@ class NotificationsProvider 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<AppNotification>> getRecentNotifications ({ Future<List<AppNotification>> getRecentNotifications({
@required String host, @required String host,
@required User user, @required User user,
}) async { }) async {
Response response; Response response;
//userId = 397.toString(); // testing id to view data //userId = 397.toString(); // testing id to view data
try{ try {
response = await get( response = await get(Uri.parse(host + URLs.getNotifications + "?uid=${user.id}&token=${user.token}"), headers: {"Content-Type": "application/json; charset=utf-8"});
Uri.parse(host+URLs.getNotifications
+"?uid=${user.id}&token=${user.token}"),
headers: {
"Content-Type":"application/json; charset=utf-8"
}
);
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 requestsListJson = json.decode(utf8.decode(response.bodyBytes)); List requestsListJson = json.decode(utf8.decode(response.bodyBytes));
List<AppNotification> _recentNotifications = requestsListJson.map( List<AppNotification> _recentNotifications = requestsListJson.map((request) => AppNotification.fromJson(request)).toList();
(request) => AppNotification.fromJson(request)).toList();
return _recentNotifications; return _recentNotifications;
} }
return null; return null;
} catch (error) {
} catch(error) {
return null; return null;
} }
} }
} }

@ -8,13 +8,12 @@ import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/part.dart'; import 'package:test_sa/models/part.dart';
import 'package:test_sa/models/user.dart'; import 'package:test_sa/models/user.dart';
class PartsProvider extends ChangeNotifier{ class PartsProvider 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() {
_parts = null; _parts = null;
_stateCode = null; _stateCode = null;
} }
@ -39,7 +38,7 @@ class PartsProvider 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();
} }
@ -49,44 +48,36 @@ class PartsProvider 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> getParts ({String host,User user,String title}) async { Future<int> getParts({String host, User user, String title}) 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.getPartNumber, body: {if (title != null && title.isNotEmpty) "partName": title});
URLs.getPartNumber,
body: {
if(title != null && title.isNotEmpty)
"partName":title
});
_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 categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); List categoriesListJson = json.decode(utf8.decode(response.bodyBytes));
List<Part> _page = categoriesListJson.map((part) => Part.fromJson(part)).toList(); List<Part> _page = categoriesListJson.map((part) => Part.fromJson(part)).toList();
if(parts == null) if (parts == null) _parts = [];
_parts = [];
_parts.addAll(_page); _parts.addAll(_page);
if(_page.length >= pageItemNumber){ if (_page.length >= pageItemNumber) {
_nextPage = true; _nextPage = true;
}else{ } else {
_nextPage = false; _nextPage = false;
} }
} }
_loading = false; _loading = false;
notifyListeners(); notifyListeners();
return response.statusCode; return response.statusCode;
} catch(error) { } catch (error) {
_loading = false; _loading = false;
_stateCode = -1; _stateCode = -1;
notifyListeners(); notifyListeners();
return -1; return -1;
} }
} }
/// return -2 if request in progress /// return -2 if request in progress
@ -94,26 +85,19 @@ class PartsProvider 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<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( response = await ApiManager.instance.post(URLs.getPartNumber, body: {if (title != null && title.isNotEmpty) "partName": title});
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
List categoriesListJson = json.decode(response.body)["data"]; List categoriesListJson = json.decode(response.body)["data"];
_page = categoriesListJson.map((part) => Part.fromJson(part)).toList(); _page = categoriesListJson.map((part) => Part.fromJson(part)).toList();
} }
return _page; return _page;
} catch(error) { } catch (error) {
return []; return [];
} }
} }
} }

@ -11,13 +11,12 @@ import 'package:test_sa/models/visits/visit.dart';
import 'package:test_sa/models/visits/visits_group.dart'; import 'package:test_sa/models/visits/visits_group.dart';
import 'package:test_sa/models/visits/visits_search.dart'; import 'package:test_sa/models/visits/visits_search.dart';
class RegularVisitsProvider extends ChangeNotifier{ class RegularVisitsProvider extends ChangeNotifier {
// number of items call in each request // number of items call in each request
final pageItemNumber = 20; final pageItemNumber = 20;
//reset provider data //reset provider data
void reset(){ void reset() {
visits = null; visits = null;
nextPage = true; nextPage = true;
stateCode = null; stateCode = null;
@ -46,50 +45,47 @@ class RegularVisitsProvider 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> getVisits ({ Future<int> getVisits({
@required String host, @required String host,
@required User user, @required User user,
// VisitsSearch visitsSearch, // VisitsSearch visitsSearch,
}) async { }) async {
if(isLoading == true) if (isLoading == true) return -2;
return -2;
isLoading = true; isLoading = true;
if(visits == null) notifyListeners(); if (visits == null) notifyListeners();
Response response; Response response;
//userId = 397.toString(); // testing id to view data //userId = 397.toString(); // testing id to view data
try{ try {
Map<String,dynamic> body = {}; Map<String, dynamic> body = {};
body.addAll(visitsSearch.toMap()); body.addAll(visitsSearch.toMap());
body["pageNumber"] = (visits?.length ?? 0) ~/pageItemNumber +1; body["pageNumber"] = (visits?.length ?? 0) ~/ pageItemNumber + 1;
body["pageSize"] = pageItemNumber; body["pageSize"] = pageItemNumber;
response = await ApiManager.instance.post( response = await ApiManager.instance.post(
URLs.getRegularVisits, URLs.getRegularVisits,
body: body, body: body,
); );
} catch(error) { } catch (error) {
isLoading = false; isLoading = 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
try{ try {
List requestsListJson = json.decode(response.body)["data"]; List requestsListJson = json.decode(response.body)["data"];
List<Visit> _visits = requestsListJson.map( List<Visit> _visits = requestsListJson.map((request) => Visit.fromJson(request)).toList();
(request) => Visit.fromJson(request)
).toList();
visits ??= []; visits ??= [];
visits.addAll(_visits); visits.addAll(_visits);
if(_visits.length == pageItemNumber){ if (_visits.length == pageItemNumber) {
nextPage = true; nextPage = true;
}else{ } else {
nextPage = false; nextPage = false;
} }
}catch(error){ } catch (error) {
Logger().e(error); Logger().e(error);
isLoading = false; isLoading = false;
stateCode = -1; stateCode = -1;
@ -107,29 +103,29 @@ class RegularVisitsProvider 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> updateGroupOfVisits ({ Future<int> updateGroupOfVisits({
@required String host, @required String host,
@required User user, @required User user,
VisitsGroup group, VisitsGroup group,
}) async { }) async {
Response response; Response response;
try{ try {
Map<String,dynamic> body = group.toJson(); Map<String, dynamic> body = group.toJson();
response = await ApiManager.instance.post( response = await ApiManager.instance.post(
URLs.getRegularVisits, URLs.getRegularVisits,
body: body, body: body,
); );
stateCode = response.statusCode; stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received // client's request was successfully received
reset(); reset();
notifyListeners(); notifyListeners();
} }
return response.statusCode; return response.statusCode;
} catch(error) { } catch (error) {
isLoading = false; isLoading = false;
stateCode = -1; stateCode = -1;
notifyListeners(); notifyListeners();
@ -137,31 +133,26 @@ class RegularVisitsProvider extends ChangeNotifier{
} }
} }
Future<Pentry> getPently({String host,User user,int id}) async { Future<Pentry> getPently({String host, User user, int id}) async {
Response response; Response response;
response = await get( response = await get(Uri.parse("$host${URLs.getPentry}/$id"), headers: {"Content-Type": "application/json; charset=utf-8"});
Uri.parse("$host${URLs.getPentry}/$id"),
headers: {
"Content-Type":"application/json; charset=utf-8"
}
);
Pentry pantry; Pentry pantry;
if(response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
pantry = Pentry.fromMap(json.decode(utf8.decode(response.bodyBytes))); pantry = Pentry.fromMap(json.decode(utf8.decode(response.bodyBytes)));
} }
return pantry; return pantry;
} }
Future<int> updatePentry ({ Future<int> updatePentry({
@required String host, @required String host,
@required User user, @required User user,
@required Pentry pentry, @required Pentry pentry,
@required Visit visit, @required Visit visit,
}) async { }) async {
try{ try {
Response response; Response response;
Map<String,dynamic> body = pentry.toMap(visit.id); Map<String, dynamic> body = pentry.toMap(visit.id);
body["id"] = visit.id; body["id"] = visit.id;
body["assetId"] = visit.deviceId; body["assetId"] = visit.deviceId;
body["ppmScheduleId"] = visit.ppmScheduleId; body["ppmScheduleId"] = visit.ppmScheduleId;
@ -169,23 +160,19 @@ class RegularVisitsProvider extends ChangeNotifier{
// body["vChecklists"]?.addAll({}); // body["vChecklists"]?.addAll({});
// body["vCalibrationTools"]?.addAll({"visitId": visit.id,}); // body["vCalibrationTools"]?.addAll({"visitId": visit.id,});
// body["vKits"]?.add({"visitId": visit.id,}); // body["vKits"]?.add({"visitId": visit.id,});
response = await ApiManager.instance.put( response = await ApiManager.instance.put(URLs.updatePentry, body: body);
URLs.updatePentry, body: body
);
// response = await post( // response = await post(
// Uri.parse(host+URLs.updatePentry + "/${visit.id}"), // Uri.parse(host+URLs.updatePentry + "/${visit.id}"),
// body: body, // body: body,
// ); // );
if(response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
reset();//visit.status = pentry.ppmVisitStatus; reset(); //visit.status = pentry.ppmVisitStatus;
notifyListeners(); notifyListeners();
} }
return response.statusCode; return response.statusCode;
} catch (error) {
} catch(error) {
return -1; return -1;
} }
} }
} }

@ -37,7 +37,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
// list of user requests // list of user requests
List<ServiceRequest> serviceRequests; List<ServiceRequest> serviceRequests;
List<SearchWorkOrders> workOrders =[]; List<SearchWorkOrders> workOrders = [];
// when requests in-process _loading = true // when requests in-process _loading = true
// done _loading = true // done _loading = true
@ -249,13 +249,12 @@ class ServiceRequestsProvider extends ChangeNotifier {
} }
Future<List<SearchWorkOrders>> searchWorkOrders({@required String callId}) async { Future<List<SearchWorkOrders>> searchWorkOrders({@required String callId}) async {
Response response; Response response;
try{ try {
var body = { var body = {
"pageSize": pageItemNumber, "pageSize": pageItemNumber,
"pageNumber":( (workOrders?.length ?? 0) ~/ pageItemNumber) + 1, "pageNumber": ((workOrders?.length ?? 0) ~/ pageItemNumber) + 1,
"callId": callId, "callId": callId,
}; };
response = await ApiManager.instance.post(URLs.searchWorkOrders, body: body); response = await ApiManager.instance.post(URLs.searchWorkOrders, body: body);
@ -272,8 +271,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
} }
} }
return workOrders; return workOrders;
} catch (e) {
}catch(e){
return []; return [];
} }
} }

@ -8,10 +8,9 @@ import 'package:test_sa/controllers/api_routes/urls.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 AssignedToProvider extends ChangeNotifier{ class AssignedToProvider extends ChangeNotifier {
//reset provider data //reset provider data
void reset(){ void reset() {
_items = null; _items = null;
_stateCode = null; _stateCode = null;
} }
@ -32,7 +31,7 @@ class AssignedToProvider 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();
} }
@ -42,18 +41,17 @@ class AssignedToProvider 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> getData ({String host,User user}) async { Future<int> getData({String host, User user}) 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.get( response = await ApiManager.instance.get(
URLs.getEmployees, URLs.getEmployees,
); );
_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 categoriesListJson = json.decode(response.body)["data"]; List categoriesListJson = json.decode(response.body)["data"];
_items = categoriesListJson.map((type) => Lookup.fromJson(type)).toList(); _items = categoriesListJson.map((type) => Lookup.fromJson(type)).toList();
@ -61,13 +59,11 @@ class AssignedToProvider extends ChangeNotifier{
_loading = false; _loading = false;
notifyListeners(); notifyListeners();
return response.statusCode; return response.statusCode;
} catch(error) { } catch (error) {
_loading = false; _loading = false;
_stateCode = -1; _stateCode = -1;
notifyListeners(); notifyListeners();
return -1; return -1;
} }
} }
} }

@ -9,10 +9,9 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
class EngineersProvider extends ChangeNotifier{ class EngineersProvider extends ChangeNotifier {
//reset provider data //reset provider data
void reset(){ void reset() {
_items = null; _items = null;
_stateCode = null; _stateCode = null;
} }
@ -33,7 +32,7 @@ class EngineersProvider 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();
} }
@ -43,17 +42,17 @@ class EngineersProvider 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> getData ({String host,User user}) async { Future<int> getData({String host, User user}) async {
if(_loading == true) return -2; if (_loading == true) return -2;
_loading = true; _loading = true;
notifyListeners(); notifyListeners();
Response response; Response response;
try{ try {
response = await ApiManager.instance.get( response = await ApiManager.instance.get(
URLs.getEngineers, URLs.getEngineers,
); );
_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 categoriesListJson = json.decode(response.body); List categoriesListJson = json.decode(response.body);
_items = categoriesListJson.map((type) => Engineer.fromJson(type)).toList(); _items = categoriesListJson.map((type) => Engineer.fromJson(type)).toList();
@ -61,13 +60,11 @@ class EngineersProvider extends ChangeNotifier{
_loading = false; _loading = false;
notifyListeners(); notifyListeners();
return response.statusCode; return response.statusCode;
} catch(error) { } catch (error) {
_loading = false; _loading = false;
_stateCode = -1; _stateCode = -1;
notifyListeners(); notifyListeners();
return -1; return -1;
} }
} }
} }

@ -8,10 +8,9 @@ import 'package:test_sa/controllers/api_routes/urls.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 GasCylinderSizesProvider extends ChangeNotifier{ class GasCylinderSizesProvider extends ChangeNotifier {
//reset provider data //reset provider data
void reset(){ void reset() {
_items = null; _items = null;
_loading = null; _loading = null;
_stateCode = null; _stateCode = null;
@ -33,7 +32,7 @@ class GasCylinderSizesProvider 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();
} }
@ -43,18 +42,20 @@ class GasCylinderSizesProvider 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> getData ({String host,User user,}) async { Future<int> getData({
if(_loading == true) String host,
return -2; User user,
}) async {
if (_loading == true) return -2;
_loading = true; _loading = true;
notifyListeners(); notifyListeners();
Response response; Response response;
try{ try {
response = await ApiManager.instance.get( response = await ApiManager.instance.get(
URLs.getGasCylinderSize, URLs.getGasCylinderSize,
); );
_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 categoriesListJson = json.decode(response.body)["data"]; List categoriesListJson = json.decode(response.body)["data"];
_items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList(); _items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList();
@ -62,13 +63,11 @@ class GasCylinderSizesProvider extends ChangeNotifier{
_loading = false; _loading = false;
notifyListeners(); notifyListeners();
return response.statusCode; return response.statusCode;
} catch(error) { } catch (error) {
_loading = false; _loading = false;
_stateCode = -1; _stateCode = -1;
notifyListeners(); notifyListeners();
return -1; return -1;
} }
} }
} }

@ -8,10 +8,9 @@ import 'package:test_sa/controllers/api_routes/urls.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 GasCylinderTypesProvider extends ChangeNotifier{ class GasCylinderTypesProvider extends ChangeNotifier {
//reset provider data //reset provider data
void reset(){ void reset() {
_items = null; _items = null;
_loading = null; _loading = null;
_stateCode = null; _stateCode = null;
@ -33,7 +32,7 @@ class GasCylinderTypesProvider 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();
} }
@ -43,18 +42,20 @@ class GasCylinderTypesProvider 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> getData ({String host,User user,}) async { Future<int> getData({
if(_loading == true) String host,
return -2; User user,
}) async {
if (_loading == true) return -2;
_loading = true; _loading = true;
notifyListeners(); notifyListeners();
Response response; Response response;
try{ try {
response = await ApiManager.instance.get( response = await ApiManager.instance.get(
URLs.getGasCylinderType, URLs.getGasCylinderType,
); );
_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 categoriesListJson = json.decode(response.body)["data"]; List categoriesListJson = json.decode(response.body)["data"];
_items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList(); _items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList();
@ -62,13 +63,11 @@ class GasCylinderTypesProvider extends ChangeNotifier{
_loading = false; _loading = false;
notifyListeners(); notifyListeners();
return response.statusCode; return response.statusCode;
} catch(error) { } catch (error) {
_loading = false; _loading = false;
_stateCode = -1; _stateCode = -1;
notifyListeners(); notifyListeners();
return -1; return -1;
} }
} }
} }

@ -11,10 +11,9 @@ import 'package:test_sa/controllers/api_routes/urls.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 GasStatusProvider extends ChangeNotifier{ class GasStatusProvider extends ChangeNotifier {
//reset provider data //reset provider data
void reset(){ void reset() {
_items = null; _items = null;
_loading = null; _loading = null;
_stateCode = null; _stateCode = null;
@ -36,7 +35,7 @@ class GasStatusProvider 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();
} }
@ -46,17 +45,20 @@ class GasStatusProvider 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> getData ({String host,User user,}) async { Future<int> getData({
if(_loading == true) return -2; String host,
User user,
}) async {
if (_loading == true) return -2;
_loading = true; _loading = true;
notifyListeners(); notifyListeners();
Response response; Response response;
try{ try {
response = await ApiManager.instance.get( response = await ApiManager.instance.get(
URLs.getGasStatus, URLs.getGasStatus,
); );
_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 categoriesListJson = json.decode(response.body)["data"]; List categoriesListJson = json.decode(response.body)["data"];
_items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList(); _items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList();
@ -64,13 +66,11 @@ class GasStatusProvider extends ChangeNotifier{
_loading = false; _loading = false;
notifyListeners(); notifyListeners();
return response.statusCode; return response.statusCode;
} catch(error) { } catch (error) {
_loading = false; _loading = false;
_stateCode = -1; _stateCode = -1;
notifyListeners(); notifyListeners();
return -1; return -1;
} }
} }
} }

@ -11,10 +11,9 @@ import 'package:test_sa/controllers/api_routes/urls.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 GasTypesProvider extends ChangeNotifier{ class GasTypesProvider extends ChangeNotifier {
//reset provider data //reset provider data
void reset(){ void reset() {
_items = null; _items = null;
_loading = null; _loading = null;
_stateCode = null; _stateCode = null;
@ -36,7 +35,7 @@ class GasTypesProvider 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();
} }
@ -46,17 +45,20 @@ class GasTypesProvider 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> getData ({String host,User user,}) async { Future<int> getData({
if(_loading == true) return -2; String host,
User user,
}) async {
if (_loading == true) return -2;
_loading = true; _loading = true;
notifyListeners(); notifyListeners();
Response response; Response response;
try{ try {
response = await ApiManager.instance.get( response = await ApiManager.instance.get(
URLs.getGasTypes, URLs.getGasTypes,
); );
_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 categoriesListJson = json.decode(response.body)["data"]; List categoriesListJson = json.decode(response.body)["data"];
_items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList(); _items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList();
@ -64,13 +66,11 @@ class GasTypesProvider extends ChangeNotifier{
_loading = false; _loading = false;
notifyListeners(); notifyListeners();
return response.statusCode; return response.statusCode;
} catch(error) { } catch (error) {
_loading = false; _loading = false;
_stateCode = -1; _stateCode = -1;
notifyListeners(); notifyListeners();
return -1; return -1;
} }
} }
} }

@ -8,10 +8,9 @@ import 'package:test_sa/controllers/api_routes/urls.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 PentryStatusProvider extends ChangeNotifier{ class PentryStatusProvider extends ChangeNotifier {
//reset provider data //reset provider data
void reset(){ void reset() {
_items = null; _items = null;
_stateCode = null; _stateCode = null;
} }
@ -32,7 +31,7 @@ class PentryStatusProvider 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();
} }
@ -42,19 +41,18 @@ class PentryStatusProvider 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> getData ({String host,User user}) async { Future<int> getData({String host, User user}) 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.get( response = await ApiManager.instance.get(
URLs.getPentryStatus, URLs.getPentryStatus,
); );
_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 listJson = json.decode(response.body)["data"]; List listJson = json.decode(response.body)["data"];
_items = listJson.map((type) => Lookup.fromJson(type)).toList(); _items = listJson.map((type) => Lookup.fromJson(type)).toList();
@ -62,14 +60,11 @@ class PentryStatusProvider extends ChangeNotifier{
_loading = false; _loading = false;
notifyListeners(); notifyListeners();
return response.statusCode; return response.statusCode;
} catch(error) { } catch (error) {
_loading = false; _loading = false;
_stateCode = -1; _stateCode = -1;
notifyListeners(); notifyListeners();
return -1; return -1;
} }
} }
} }

@ -8,10 +8,9 @@ import 'package:test_sa/controllers/api_routes/urls.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 PentryTaskStatusProvider extends ChangeNotifier{ class PentryTaskStatusProvider extends ChangeNotifier {
//reset provider data //reset provider data
void reset(){ void reset() {
_items = null; _items = null;
_stateCode = null; _stateCode = null;
} }
@ -32,7 +31,7 @@ class PentryTaskStatusProvider 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();
} }
@ -42,19 +41,18 @@ class PentryTaskStatusProvider 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> getData ({String host,User user}) async { Future<int> getData({String host, User user}) 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.get( response = await ApiManager.instance.get(
URLs.getPentryTaskStatus, URLs.getPentryTaskStatus,
); );
_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 categoriesListJson = json.decode(response.body)["data"]; List categoriesListJson = json.decode(response.body)["data"];
_items = categoriesListJson.map((type) => Lookup.fromJson(type)).toList(); _items = categoriesListJson.map((type) => Lookup.fromJson(type)).toList();
@ -62,14 +60,11 @@ class PentryTaskStatusProvider extends ChangeNotifier{
_loading = false; _loading = false;
notifyListeners(); notifyListeners();
return response.statusCode; return response.statusCode;
} catch(error) { } catch (error) {
_loading = false; _loading = false;
_stateCode = -1; _stateCode = -1;
notifyListeners(); notifyListeners();
return -1; return -1;
} }
} }
} }

@ -8,10 +8,9 @@ import 'package:test_sa/controllers/api_routes/urls.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 PentryVisitStatusProvider extends ChangeNotifier{ class PentryVisitStatusProvider extends ChangeNotifier {
//reset provider data //reset provider data
void reset(){ void reset() {
_items = null; _items = null;
_stateCode = null; _stateCode = null;
} }
@ -32,7 +31,7 @@ class PentryVisitStatusProvider 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();
} }
@ -42,19 +41,18 @@ class PentryVisitStatusProvider 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> getData ({String host,User user}) async { Future<int> getData({String host, User user}) 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.get( response = await ApiManager.instance.get(
URLs.getPentryVisitStatus, URLs.getPentryVisitStatus,
); );
_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 listJson = json.decode(response.body)["data"]; List listJson = json.decode(response.body)["data"];
_items = listJson.map((type) => Lookup.fromJson(type)).toList(); _items = listJson.map((type) => Lookup.fromJson(type)).toList();
@ -62,13 +60,11 @@ class PentryVisitStatusProvider extends ChangeNotifier{
_loading = false; _loading = false;
notifyListeners(); notifyListeners();
return response.statusCode; return response.statusCode;
} catch(error) { } catch (error) {
_loading = false; _loading = false;
_stateCode = -1; _stateCode = -1;
notifyListeners(); notifyListeners();
return -1; return -1;
} }
} }
} }

@ -8,10 +8,9 @@ import 'package:test_sa/controllers/api_routes/urls.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 ServiceRequestDefectTypesProvider extends ChangeNotifier{ class ServiceRequestDefectTypesProvider extends ChangeNotifier {
//reset provider data //reset provider data
void reset(){ void reset() {
_items = null; _items = null;
_stateCode = null; _stateCode = null;
} }
@ -32,7 +31,7 @@ class ServiceRequestDefectTypesProvider 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();
} }
@ -42,18 +41,17 @@ class ServiceRequestDefectTypesProvider 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> getData ({String host,User user}) async { Future<int> getData({String host, User user}) 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.get( response = await ApiManager.instance.get(
URLs.getServiceReportDefectTypes, URLs.getServiceReportDefectTypes,
); );
_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 listJson = json.decode(response.body)["data"]; List listJson = json.decode(response.body)["data"];
_items = listJson.map((type) => Lookup.fromJson(type)).toList(); _items = listJson.map((type) => Lookup.fromJson(type)).toList();
@ -61,14 +59,11 @@ class ServiceRequestDefectTypesProvider extends ChangeNotifier{
_loading = false; _loading = false;
notifyListeners(); notifyListeners();
return response.statusCode; return response.statusCode;
} catch(error) { } catch (error) {
_loading = false; _loading = false;
_stateCode = -1; _stateCode = -1;
notifyListeners(); notifyListeners();
return -1; return -1;
} }
} }
} }

@ -8,10 +8,9 @@ import 'package:test_sa/controllers/api_routes/urls.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 ServiceReportLastCallsProvider extends ChangeNotifier{ class ServiceReportLastCallsProvider extends ChangeNotifier {
//reset provider data //reset provider data
void reset(){ void reset() {
_calls = null; _calls = null;
_loading = null; _loading = null;
_stateCode = null; _stateCode = null;
@ -33,7 +32,7 @@ class ServiceReportLastCallsProvider 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();
} }
@ -43,13 +42,12 @@ class ServiceReportLastCallsProvider 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> getCalls ({String host,User user,int serviceStatus}) async { Future<int> getCalls({String host, User user, int serviceStatus}) async {
if(_loading == true) if (_loading == true) return -2;
return -2;
_loading = true; _loading = true;
notifyListeners(); notifyListeners();
Response response; Response response;
try{ try {
// todo request new api from backend to make filter work // todo request new api from backend to make filter work
response = await ApiManager.instance.get( response = await ApiManager.instance.get(
URLs.getServiceReportLastCalls, URLs.getServiceReportLastCalls,
@ -61,7 +59,7 @@ class ServiceReportLastCallsProvider extends ChangeNotifier{
// ), // ),
// ); // );
_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 categoriesListJson = json.decode(response.body)["data"]; List categoriesListJson = json.decode(response.body)["data"];
_calls = categoriesListJson.map((type) => Lookup.fromJson(type)).toList(); _calls = categoriesListJson.map((type) => Lookup.fromJson(type)).toList();
@ -69,13 +67,11 @@ class ServiceReportLastCallsProvider extends ChangeNotifier{
_loading = false; _loading = false;
notifyListeners(); notifyListeners();
return response.statusCode; return response.statusCode;
} catch(error) { } catch (error) {
_loading = false; _loading = false;
_stateCode = -1; _stateCode = -1;
notifyListeners(); notifyListeners();
return -1; return -1;
} }
} }
} }

@ -8,10 +8,9 @@ import 'package:test_sa/controllers/api_routes/urls.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 ServiceRequestPriorityProvider extends ChangeNotifier{ class ServiceRequestPriorityProvider extends ChangeNotifier {
//reset provider data //reset provider data
void reset(){ void reset() {
_items = null; _items = null;
_stateCode = null; _stateCode = null;
} }
@ -32,7 +31,7 @@ class ServiceRequestPriorityProvider 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();
} }
@ -42,19 +41,18 @@ class ServiceRequestPriorityProvider 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> getData ({String host,User user}) async { Future<int> getData({String host, User user}) 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.get( response = await ApiManager.instance.get(
URLs.getServiceReportPriority, URLs.getServiceReportPriority,
); );
_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 listJson = json.decode(response.body)["data"]; List listJson = json.decode(response.body)["data"];
_items = listJson.map((type) => Lookup.fromJson(type)).toList(); _items = listJson.map((type) => Lookup.fromJson(type)).toList();
@ -62,13 +60,11 @@ class ServiceRequestPriorityProvider extends ChangeNotifier{
_loading = false; _loading = false;
notifyListeners(); notifyListeners();
return response.statusCode; return response.statusCode;
} catch(error) { } catch (error) {
_loading = false; _loading = false;
_stateCode = -1; _stateCode = -1;
notifyListeners(); notifyListeners();
return -1; return -1;
} }
} }
} }

@ -8,10 +8,9 @@ import 'package:test_sa/controllers/api_routes/urls.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 ServiceReportReasonsProvider extends ChangeNotifier{ class ServiceReportReasonsProvider extends ChangeNotifier {
//reset provider data //reset provider data
void reset(){ void reset() {
_reasons = null; _reasons = null;
_stateCode = null; _stateCode = null;
} }
@ -32,7 +31,7 @@ class ServiceReportReasonsProvider 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();
} }
@ -42,18 +41,17 @@ class ServiceReportReasonsProvider 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> getTypes ({String host,User user}) async { Future<int> getTypes({String host, User user}) 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.get( response = await ApiManager.instance.get(
URLs.getServiceReportReasons, URLs.getServiceReportReasons,
); );
_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 categoriesListJson = json.decode(response.body)["data"]; List categoriesListJson = json.decode(response.body)["data"];
_reasons = categoriesListJson.map((type) => Lookup.fromJson(type)).toList(); _reasons = categoriesListJson.map((type) => Lookup.fromJson(type)).toList();
@ -61,13 +59,11 @@ class ServiceReportReasonsProvider extends ChangeNotifier{
_loading = false; _loading = false;
notifyListeners(); notifyListeners();
return response.statusCode; return response.statusCode;
} catch(error) { } catch (error) {
_loading = false; _loading = false;
_stateCode = -1; _stateCode = -1;
notifyListeners(); notifyListeners();
return -1; return -1;
} }
} }
} }

@ -11,10 +11,9 @@ import 'package:test_sa/controllers/api_routes/urls.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 ServiceReportStatusProvider extends ChangeNotifier{ class ServiceReportStatusProvider extends ChangeNotifier {
//reset provider data //reset provider data
void reset(){ void reset() {
_status = null; _status = null;
_stateCode = null; _stateCode = null;
} }
@ -35,7 +34,7 @@ class ServiceReportStatusProvider 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();
} }
@ -45,19 +44,18 @@ class ServiceReportStatusProvider 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> getTypes ({String host,User user}) async { Future<int> getTypes({String host, User user}) 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.get( response = await ApiManager.instance.get(
URLs.getServiceReportStatus, URLs.getServiceReportStatus,
); );
_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 categoriesListJson = json.decode(response.body)["data"]; List categoriesListJson = json.decode(response.body)["data"];
_status = categoriesListJson.map((type) => Lookup.fromJson(type)).toList(); _status = categoriesListJson.map((type) => Lookup.fromJson(type)).toList();
@ -65,14 +63,11 @@ class ServiceReportStatusProvider extends ChangeNotifier{
_loading = false; _loading = false;
notifyListeners(); notifyListeners();
return response.statusCode; return response.statusCode;
} catch(error) { } catch (error) {
_loading = false; _loading = false;
_stateCode = -1; _stateCode = -1;
notifyListeners(); notifyListeners();
return -1; return -1;
} }
} }
} }

@ -8,10 +8,9 @@ import 'package:test_sa/controllers/api_routes/urls.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 ServiceReportTypesProvider extends ChangeNotifier{ class ServiceReportTypesProvider extends ChangeNotifier {
//reset provider data //reset provider data
void reset(){ void reset() {
_types = null; _types = null;
_stateCode = null; _stateCode = null;
} }
@ -32,7 +31,7 @@ class ServiceReportTypesProvider 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();
} }
@ -42,18 +41,17 @@ class ServiceReportTypesProvider 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> getTypes ({String host,User user}) async { Future<int> getTypes({String host, User user}) 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.get( response = await ApiManager.instance.get(
URLs.getServiceReportTypes, URLs.getServiceReportTypes,
); );
_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 categoriesListJson = json.decode(response.body)["data"]; List categoriesListJson = json.decode(response.body)["data"];
_types = categoriesListJson.map((type) => Lookup.fromJson(type)).toList(); _types = categoriesListJson.map((type) => Lookup.fromJson(type)).toList();
@ -61,13 +59,11 @@ class ServiceReportTypesProvider extends ChangeNotifier{
_loading = false; _loading = false;
notifyListeners(); notifyListeners();
return response.statusCode; return response.statusCode;
} catch(error) { } catch (error) {
_loading = false; _loading = false;
_stateCode = -1; _stateCode = -1;
notifyListeners(); notifyListeners();
return -1; return -1;
} }
} }
} }

@ -8,10 +8,9 @@ import 'package:test_sa/controllers/api_routes/urls.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 ServiceStatusProvider extends ChangeNotifier{ class ServiceStatusProvider extends ChangeNotifier {
//reset provider data //reset provider data
void reset(){ void reset() {
_statuses = null; _statuses = null;
_stateCode = null; _stateCode = null;
} }
@ -32,7 +31,7 @@ class ServiceStatusProvider 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();
} }
@ -42,33 +41,29 @@ class ServiceStatusProvider 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> getTypes ({String host,User user}) async { Future<int> getTypes({String host, User user}) 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.get( response = await ApiManager.instance.get(
URLs.getAssetTypes, URLs.getAssetTypes,
); );
_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 categoriesListJson = json.decode(response.body)["data"]; List categoriesListJson = json.decode(response.body)["data"];
_statuses = categoriesListJson.map((e) => Lookup.fromJson(e)).toList(); _statuses = categoriesListJson.map((e) => Lookup.fromJson(e)).toList();
} }
_loading = false; _loading = false;
notifyListeners(); notifyListeners();
return response.statusCode; return response.statusCode;
} catch(error) { } catch (error) {
_loading = false; _loading = false;
_stateCode = -1; _stateCode = -1;
notifyListeners(); notifyListeners();
return -1; return -1;
} }
} }
} }

@ -8,10 +8,9 @@ import 'package:test_sa/controllers/api_routes/urls.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 ServiceRequestStatusProvider extends ChangeNotifier{ class ServiceRequestStatusProvider extends ChangeNotifier {
//reset provider data //reset provider data
void reset(){ void reset() {
_statuses = null; _statuses = null;
_stateCode = null; _stateCode = null;
} }
@ -32,7 +31,7 @@ class ServiceRequestStatusProvider 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();
} }
@ -42,33 +41,29 @@ class ServiceRequestStatusProvider 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> getData ({String host,User user}) async { Future<int> getData({String host, User user}) 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.get( response = await ApiManager.instance.get(
URLs.getServiceRequestStatus, URLs.getServiceRequestStatus,
); );
_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 categoriesListJson = json.decode(response.body)["data"]; List categoriesListJson = json.decode(response.body)["data"];
_statuses = categoriesListJson.map((e) => Lookup.fromJson(e)).toList(); _statuses = categoriesListJson.map((e) => Lookup.fromJson(e)).toList();
} }
_loading = false; _loading = false;
notifyListeners(); notifyListeners();
return response.statusCode; return response.statusCode;
} catch(error) { } catch (error) {
_loading = false; _loading = false;
_stateCode = -1; _stateCode = -1;
notifyListeners(); notifyListeners();
return -1; return -1;
} }
} }
} }

@ -8,10 +8,9 @@ import 'package:test_sa/controllers/api_routes/urls.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 ServiceRequestedThroughProvider extends ChangeNotifier{ class ServiceRequestedThroughProvider extends ChangeNotifier {
//reset provider data //reset provider data
void reset(){ void reset() {
_statuses = null; _statuses = null;
_stateCode = null; _stateCode = null;
} }
@ -32,7 +31,7 @@ class ServiceRequestedThroughProvider 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();
} }
@ -42,33 +41,29 @@ class ServiceRequestedThroughProvider 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> getData ({String host,User user}) async { Future<int> getData({String host, User user}) 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.get( response = await ApiManager.instance.get(
URLs.getServiceRequestThrough, URLs.getServiceRequestThrough,
); );
_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 categoriesListJson = json.decode(response.body)["data"]; List categoriesListJson = json.decode(response.body)["data"];
_statuses = categoriesListJson.map((e) => Lookup.fromJson(e)).toList(); _statuses = categoriesListJson.map((e) => Lookup.fromJson(e)).toList();
} }
_loading = false; _loading = false;
notifyListeners(); notifyListeners();
return response.statusCode; return response.statusCode;
} catch(error) { } catch (error) {
_loading = false; _loading = false;
_stateCode = -1; _stateCode = -1;
notifyListeners(); notifyListeners();
return -1; return -1;
} }
} }
} }

@ -8,10 +8,9 @@ import 'package:test_sa/controllers/api_routes/urls.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 ServiceRequestTypeProvider extends ChangeNotifier{ class ServiceRequestTypeProvider extends ChangeNotifier {
//reset provider data //reset provider data
void reset(){ void reset() {
_statuses = null; _statuses = null;
_stateCode = null; _stateCode = null;
} }
@ -32,7 +31,7 @@ class ServiceRequestTypeProvider 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();
} }
@ -42,33 +41,29 @@ class ServiceRequestTypeProvider 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> getData ({String host,User user}) async { Future<int> getData({String host, User user}) 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.get( response = await ApiManager.instance.get(
URLs.getServiceRequestTypes, URLs.getServiceRequestTypes,
); );
_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 categoriesListJson = json.decode(response.body)["data"]; List categoriesListJson = json.decode(response.body)["data"];
_statuses = categoriesListJson.map((e) => Lookup.fromJson(e)).toList(); _statuses = categoriesListJson.map((e) => Lookup.fromJson(e)).toList();
} }
_loading = false; _loading = false;
notifyListeners(); notifyListeners();
return response.statusCode; return response.statusCode;
} catch(error) { } catch (error) {
_loading = false; _loading = false;
_stateCode = -1; _stateCode = -1;
notifyListeners(); notifyListeners();
return -1; return -1;
} }
} }
} }

@ -7,9 +7,7 @@ import 'package:flutter/foundation.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
import '../settings/app_settings.dart'; import '../settings/app_settings.dart';
class SettingProvider extends ChangeNotifier {
class SettingProvider extends ChangeNotifier{
resetSettings() async { resetSettings() async {
SharedPreferences prefs = await SharedPreferences.getInstance(); SharedPreferences prefs = await SharedPreferences.getInstance();
user = null; user = null;
@ -58,40 +56,38 @@ class SettingProvider extends ChangeNotifier{
} }
// call loadSharedPreferences when provider initialise // call loadSharedPreferences when provider initialise
SettingProvider(){ SettingProvider() {
loadSharedPreferences(); loadSharedPreferences();
} }
// get app setting // get app setting
Future<void> loadSharedPreferences() async { Future<void> loadSharedPreferences() async {
SharedPreferences prefs = await SharedPreferences.getInstance(); SharedPreferences prefs = await SharedPreferences.getInstance();
if(prefs.containsKey(ASettings.language)){ if (prefs.containsKey(ASettings.language)) {
_language = prefs.getString(ASettings.language); _language = prefs.getString(ASettings.language);
}else{ } else {
_language = 'en'; _language = 'en';
} }
if(prefs.containsKey(ASettings.speechToText)){ if (prefs.containsKey(ASettings.speechToText)) {
_speechToText = prefs.getString(ASettings.speechToText); _speechToText = prefs.getString(ASettings.speechToText);
}else{ } else {
_speechToText = 'ar'; _speechToText = 'ar';
} }
if(prefs.containsKey(ASettings.user)){ if (prefs.containsKey(ASettings.user)) {
String userJson = prefs.getString(ASettings.user); String userJson = prefs.getString(ASettings.user);
user = User.fromJson(json.decode(userJson)); user = User.fromJson(json.decode(userJson));
} }
if(prefs.containsKey(ASettings.host)){ if (prefs.containsKey(ASettings.host)) {
_host = prefs.getString(ASettings.host); _host = prefs.getString(ASettings.host);
} else{ } else {
_host = URLs.host1; _host = URLs.host1;
} }
isLoaded = true; isLoaded = true;
notifyListeners(); notifyListeners();
} }
} }

@ -1,24 +1,22 @@
class Validator{ class Validator {
// private constructor to avoid create class object // private constructor to avoid create class object
Validator._(); Validator._();
// check if string not empty and has value // check if string not empty and has value
static bool hasValue(String string){ static bool hasValue(String string) {
if (string == null || string.isEmpty) if (string == null || string.isEmpty) return false;
return false;
return true; return true;
} }
// Return true if email is valid. Otherwise, return false // Return true if email is valid. Otherwise, return false
static bool isEmail(String email){ static bool isEmail(String email) {
RegExp exp = new RegExp(r"^[a-zA-Z0-9.a-zA-Z0-9.!#$%&'*+-/=?^_`{|}~]+@[a-zA-Z0-9]+\.[a-zA-Z]+"); RegExp exp = new RegExp(r"^[a-zA-Z0-9.a-zA-Z0-9.!#$%&'*+-/=?^_`{|}~]+@[a-zA-Z0-9]+\.[a-zA-Z]+");
if(exp.hasMatch(email)) if (exp.hasMatch(email)) return true;
return true;
return false; return false;
} }
// Return true if phone number is valid. Otherwise, return false // Return true if phone number is valid. Otherwise, return false
static bool isPhoneNumber(String phoneNumber){ static bool isPhoneNumber(String phoneNumber) {
if (phoneNumber == null || phoneNumber.isEmpty) { if (phoneNumber == null || phoneNumber.isEmpty) {
return false; return false;
} }
@ -26,17 +24,14 @@ class Validator{
final pattern = r'^[+]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\s\./0-9]*$'; final pattern = r'^[+]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\s\./0-9]*$';
final regExp = RegExp(pattern); final regExp = RegExp(pattern);
if (regExp.hasMatch(phoneNumber)) if (regExp.hasMatch(phoneNumber)) return true;
return true;
return false; return false;
} }
// Return true if password is valid. Otherwise, return false // Return true if password is valid. Otherwise, return false
static bool isValidPassword(String password){ static bool isValidPassword(String password) {
if(password == null) if (password == null) return false;
return false; if (password.length < 6) return false;
if(password.length <6)
return false;
return true; return true;
} }

@ -65,17 +65,16 @@ void main() async {
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();
if (Platform.isIOS) { if (Platform.isIOS) {
await Firebase.initializeApp( await Firebase.initializeApp(
options: const FirebaseOptions(apiKey: "AIzaSyACQkSleNwU1jzEKR5ho1uSfZERokwwAbc", appId: "1:973582662416:ios:bc4a8061444c6a08fbc395", messagingSenderId: "973582662416", projectId: "atoms-fb912"), options:
const FirebaseOptions(apiKey: "AIzaSyACQkSleNwU1jzEKR5ho1uSfZERokwwAbc", appId: "1:973582662416:ios:bc4a8061444c6a08fbc395", messagingSenderId: "973582662416", projectId: "atoms-fb912"),
); );
} else { } else {
await Firebase.initializeApp(); await Firebase.initializeApp();
} }
runApp( runApp(ChangeNotifierProvider(
ChangeNotifierProvider(
create: (_) => SettingProvider(), create: (_) => SettingProvider(),
child: MyApp(), child: MyApp(),
) ));
);
} }
class MyApp extends StatelessWidget { class MyApp extends StatelessWidget {
@ -132,13 +131,7 @@ class MyApp extends StatelessWidget {
scaffoldBackgroundColor: AColors.scaffoldBackgroundColor, scaffoldBackgroundColor: AColors.scaffoldBackgroundColor,
primaryColor: AColors.primaryColor, primaryColor: AColors.primaryColor,
indicatorColor: AColors.primaryColor, indicatorColor: AColors.primaryColor,
colorScheme: const ColorScheme.light( colorScheme: const ColorScheme.light(primary: AColors.primaryColor, onPrimary: Colors.white, secondary: AColors.secondaryColor, onSecondary: Colors.white)),
primary: AColors.primaryColor,
onPrimary: Colors.white,
secondary: AColors.secondaryColor,
onSecondary: Colors.white
)
),
localizationsDelegates: const [ localizationsDelegates: const [
// ... app-specific localization delegate[s] here // ... app-specific localization delegate[s] here
AppLocalization.delegate, AppLocalization.delegate,
@ -153,31 +146,28 @@ class MyApp extends StatelessWidget {
locale: Locale(_settingProvider.language ?? 'en'), locale: Locale(_settingProvider.language ?? 'en'),
initialRoute: SplashScreen.id, initialRoute: SplashScreen.id,
routes: { routes: {
SplashScreen.id: (_)=> const SplashScreen(), SplashScreen.id: (_) => const SplashScreen(),
LandPage.id: (_)=> const LandPage(), LandPage.id: (_) => const LandPage(),
Login.id: (_)=> Login(), Login.id: (_) => Login(),
Register.id: (_)=> Register(), Register.id: (_) => Register(),
ProfilePage.id: (_)=> ProfilePage(), ProfilePage.id: (_) => ProfilePage(),
ReportIssuesPage.id: (_)=> const ReportIssuesPage(), ReportIssuesPage.id: (_) => const ReportIssuesPage(),
RequestGasRefill.id: (_)=> const RequestGasRefill(), RequestGasRefill.id: (_) => const RequestGasRefill(),
CreateRequestPage.id: (_)=> CreateRequestPage(), CreateRequestPage.id: (_) => CreateRequestPage(),
SingleHospitalPicker.id: (_)=> SingleHospitalPicker(), SingleHospitalPicker.id: (_) => SingleHospitalPicker(),
SingleDevicePicker.id: (_)=> SingleDevicePicker(), SingleDevicePicker.id: (_) => SingleDevicePicker(),
SingleDepartmentPicker.id: (_)=> SingleDepartmentPicker(), SingleDepartmentPicker.id: (_) => SingleDepartmentPicker(),
ServiceRequestsPage.id: (_)=> ServiceRequestsPage(), ServiceRequestsPage.id: (_) => ServiceRequestsPage(),
NotificationsPage.id: (_)=> NotificationsPage(), NotificationsPage.id: (_) => NotificationsPage(),
FutureRequestServiceDetails.id: (_)=> FutureRequestServiceDetails(), FutureRequestServiceDetails.id: (_) => FutureRequestServiceDetails(),
PreventiveMaintenanceVisitsPage.id: (_)=> PreventiveMaintenanceVisitsPage(), PreventiveMaintenanceVisitsPage.id: (_) => PreventiveMaintenanceVisitsPage(),
RegularVisitsPage.id: (_)=> RegularVisitsPage(), RegularVisitsPage.id: (_) => RegularVisitsPage(),
TrackGasRefillPage.id: (_)=> const TrackGasRefillPage(), TrackGasRefillPage.id: (_) => const TrackGasRefillPage(),
RequestDeviceTransfer.id: (_)=> const RequestDeviceTransfer(), RequestDeviceTransfer.id: (_) => const RequestDeviceTransfer(),
TrackDeviceTransferPage.id: (_)=> const TrackDeviceTransferPage(), TrackDeviceTransferPage.id: (_) => const TrackDeviceTransferPage(),
}, },
), ),
), ),
); );
} }
} }

@ -1,6 +1,6 @@
import 'package:test_sa/views/pages/user/requests/future_request_service_details.dart'; import 'package:test_sa/views/pages/user/requests/future_request_service_details.dart';
class AppNotification{ class AppNotification {
String requestId; String requestId;
String title; String title;
String description; String description;
@ -15,13 +15,12 @@ class AppNotification{
this.path, this.path,
}); });
factory AppNotification.fromJson(Map<String,dynamic> parsedJson){ factory AppNotification.fromJson(Map<String, dynamic> parsedJson) {
return AppNotification( return AppNotification(
requestId: parsedJson["nid"], requestId: parsedJson["nid"],
title: parsedJson["call_client"] ?? parsedJson["title"], title: parsedJson["call_client"] ?? parsedJson["title"],
description: parsedJson["task_description"], description: parsedJson["task_description"],
date: parsedJson["creation_date"], date: parsedJson["creation_date"],
path: FutureRequestServiceDetails.id path: FutureRequestServiceDetails.id);
);
} }
} }

@ -1,4 +1,4 @@
class Department{ class Department {
int id; int id;
String name; String name;
@ -7,13 +7,13 @@ class Department{
this.name, this.name,
}); });
factory Department.fromJson(Map<String,dynamic> parsedJson){ factory Department.fromJson(Map<String, dynamic> parsedJson) {
return Department( return Department(
id: parsedJson["id"], id: parsedJson["id"],
name: parsedJson["name"], name: parsedJson["name"],
); );
} }
factory Department.fromDepartment(Department department){ factory Department.fromDepartment(Department department) {
return Department( return Department(
id: department?.id, id: department?.id,
name: department?.name, name: department?.name,

@ -5,7 +5,7 @@ import 'package:test_sa/models/device/device_transfer_info.dart';
import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/hospital.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
class DeviceTransfer{ class DeviceTransfer {
int id; int id;
String userId; String userId;
String title; String title;
@ -22,12 +22,12 @@ class DeviceTransfer{
this.receiver, this.receiver,
}); });
bool validate(){ bool validate() {
if(device == null) return false; if (device == null) return false;
return receiver.validate(); return receiver.validate();
} }
fromDeviceTransfer(DeviceTransfer old){ fromDeviceTransfer(DeviceTransfer old) {
id = old.id; id = old.id;
title = old.title; title = old.title;
userId = old.userId; userId = old.userId;
@ -40,7 +40,7 @@ class DeviceTransfer{
this.receiver = receiver; this.receiver = receiver;
} }
factory DeviceTransfer.fromJson(Map<String,dynamic> parsedJson){ factory DeviceTransfer.fromJson(Map<String, dynamic> parsedJson) {
return DeviceTransfer( return DeviceTransfer(
id: parsedJson["id"], id: parsedJson["id"],
title: parsedJson["transferCode"], title: parsedJson["transferCode"],
@ -56,10 +56,7 @@ class DeviceTransfer{
workingHours: parsedJson["senderWorkingHours"], workingHours: parsedJson["senderWorkingHours"],
userId: parsedJson["senderAssignedEmployeeId"], userId: parsedJson["senderAssignedEmployeeId"],
userName: parsedJson["senderAssignedEmployeeName"], userName: parsedJson["senderAssignedEmployeeName"],
client: Hospital( client: Hospital(id: parsedJson["senderSiteId"], name: parsedJson["senderSiteName"]),
id: parsedJson["senderSiteId"],
name: parsedJson["senderSiteName"]
),
department: Department( department: Department(
id: parsedJson["senderDepartmentId"], id: parsedJson["senderDepartmentId"],
name: parsedJson["senderDepartmentName"], name: parsedJson["senderDepartmentName"],
@ -77,10 +74,7 @@ class DeviceTransfer{
workingHours: parsedJson["receiverWorkingHours"], workingHours: parsedJson["receiverWorkingHours"],
userId: parsedJson["receiverAssignedEmployeeId"], userId: parsedJson["receiverAssignedEmployeeId"],
userName: parsedJson["receiverAssignedEmployeeName"], userName: parsedJson["receiverAssignedEmployeeName"],
client: Hospital( client: Hospital(id: parsedJson["destSiteId"], name: parsedJson["destSiteName"]),
id: parsedJson["destSiteId"],
name: parsedJson["destSiteName"]
),
department: Department( department: Department(
id: parsedJson["destDepartmentId"], id: parsedJson["destDepartmentId"],
name: parsedJson["destDepartmentName"], name: parsedJson["destDepartmentName"],
@ -95,4 +89,3 @@ class DeviceTransfer{
); );
} }
} }

@ -2,7 +2,7 @@ import 'package:test_sa/models/department.dart';
import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/hospital.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
class DeviceTransferInfo{ class DeviceTransferInfo {
String userId; String userId;
String comment; String comment;
Hospital client; Hospital client;
@ -25,25 +25,25 @@ class DeviceTransferInfo{
this.status, this.status,
}); });
Map<String,String>toJson(bool isSender){ Map<String, String> toJson(bool isSender) {
Map<String,String> body = {}; Map<String, String> body = {};
final baseKey = isSender ? "sender_" : "receiver_"; final baseKey = isSender ? "sender_" : "receiver_";
if(comment != null && comment.isNotEmpty) body["${baseKey}comment"] = comment; if (comment != null && comment.isNotEmpty) body["${baseKey}comment"] = comment;
if(workingHours != null && workingHours.isNotEmpty) body["${baseKey}working_hours"] = workingHours; if (workingHours != null && workingHours.isNotEmpty) body["${baseKey}working_hours"] = workingHours;
if(travelingHours != null && travelingHours.isNotEmpty) body["${baseKey}travel_hours"] = travelingHours; if (travelingHours != null && travelingHours.isNotEmpty) body["${baseKey}travel_hours"] = travelingHours;
if(status != null) body["${baseKey}status"] = status.id.toString(); if (status != null) body["${baseKey}status"] = status.id.toString();
if(signature != null && signature.isNotEmpty) body["${baseKey}image"] = signature; if (signature != null && signature.isNotEmpty) body["${baseKey}image"] = signature;
return body; return body;
} }
bool validate(){ bool validate() {
if(client == null) return false; if (client == null) return false;
if(department == null) return false; if (department == null) return false;
return true; return true;
} }
fromDetails(DeviceTransferInfo old,{bool withSignature = true}){ fromDetails(DeviceTransferInfo old, {bool withSignature = true}) {
userId = old.userId; userId = old.userId;
userName = old.userName; userName = old.userName;
client = Hospital.fromHospital(old.client); client = Hospital.fromHospital(old.client);
@ -51,11 +51,11 @@ class DeviceTransferInfo{
workingHours = old.workingHours; workingHours = old.workingHours;
travelingHours = old.travelingHours; travelingHours = old.travelingHours;
comment = old.comment; comment = old.comment;
if(withSignature) signature = old.signature; if (withSignature) signature = old.signature;
status = old.status; status = old.status;
} }
factory DeviceTransferInfo.fromJson(Map<String,dynamic> parsedJson,String key){ factory DeviceTransferInfo.fromJson(Map<String, dynamic> parsedJson, String key) {
return DeviceTransferInfo( return DeviceTransferInfo(
workingHours: parsedJson["${key}working_hours"], workingHours: parsedJson["${key}working_hours"],
travelingHours: parsedJson["${key}travel_hours"], travelingHours: parsedJson["${key}travel_hours"],
@ -63,10 +63,7 @@ class DeviceTransferInfo{
signature: parsedJson["${key}image"], signature: parsedJson["${key}image"],
userId: parsedJson["${key}id"], userId: parsedJson["${key}id"],
comment: parsedJson["${key}comment"], comment: parsedJson["${key}comment"],
client: Hospital( client: Hospital(id: parsedJson["${key}SiteId"], name: parsedJson["${key}SiteName"]),
id: parsedJson["${key}SiteId"],
name: parsedJson["${key}SiteName"]
),
department: Department( department: Department(
id: parsedJson["${key}DepartmentId"], id: parsedJson["${key}DepartmentId"],
name: parsedJson["${key}DepartmentName"], name: parsedJson["${key}DepartmentName"],
@ -78,4 +75,3 @@ class DeviceTransferInfo{
); );
} }
} }

@ -8,15 +8,16 @@ class ModelDefinition {
String replacementDate; String replacementDate;
int lifeSpan; int lifeSpan;
ModelDefinition( ModelDefinition({
{this.id, this.id,
this.assetName, this.assetName,
this.modelDefCode, this.modelDefCode,
this.modelName, this.modelName,
this.manufacturerName, this.manufacturerName,
this.supplierName, this.supplierName,
this.replacementDate, this.replacementDate,
this.lifeSpan,}); this.lifeSpan,
});
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{}; final Map<String, dynamic> data = <String, dynamic>{};
@ -32,7 +33,7 @@ class ModelDefinition {
} }
factory ModelDefinition.fromJson(Map<String, dynamic> map) { factory ModelDefinition.fromJson(Map<String, dynamic> map) {
if(map == null) return null; if (map == null) return null;
return ModelDefinition( return ModelDefinition(
id: map['id'] as int, id: map['id'] as int,
assetName: map['assetName'] as String, assetName: map['assetName'] as String,

@ -1,4 +1,4 @@
class Engineer{ class Engineer {
String id; String id;
String name; String name;
@ -7,15 +7,13 @@ class Engineer{
this.name, this.name,
}); });
factory Engineer.fromJson(Map<String, dynamic> parsedJson) {
factory Engineer.fromJson(Map<String,dynamic> parsedJson){
return Engineer( return Engineer(
id: parsedJson["userId"] ?? parsedJson["id"], id: parsedJson["userId"] ?? parsedJson["id"],
name: parsedJson["userName"] ?? parsedJson["name"], name: parsedJson["userName"] ?? parsedJson["name"],
); );
} }
factory Engineer.fromEngineer(Engineer department){ factory Engineer.fromEngineer(Engineer department) {
return Engineer( return Engineer(
id: department?.id, id: department?.id,
name: department?.name, name: department?.name,
@ -23,10 +21,7 @@ class Engineer{
} }
@override @override
bool operator == (Object other) => bool operator ==(Object other) => identical(this, other) || other is Engineer && id == other.id;
identical(this, other) || other is Engineer &&
id == other.id;
@override @override
int get hashCode => id.hashCode; int get hashCode => id.hashCode;
@ -37,5 +32,4 @@ class Engineer{
'name': name, 'name': name,
}; };
} }
} }

@ -1,4 +1,4 @@
enum UsersTypes{ enum UsersTypes {
engineer, // 0 engineer, // 0
normal_user, // 1 normal_user, // 1
} }

@ -1,6 +1,6 @@
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
class GasRefillDetails{ class GasRefillDetails {
Lookup type; Lookup type;
Lookup cylinderSize; Lookup cylinderSize;
Lookup cylinderType; Lookup cylinderType;
@ -15,13 +15,14 @@ class GasRefillDetails{
this.deliveredQuantity, this.deliveredQuantity,
}); });
bool validate(){ bool validate() {
//if(cylinderSize == null) return false; //if(cylinderSize == null) return false;
if(type == null) return false; if (type == null) return false;
if(requestedQuantity == null) return false; if (requestedQuantity == null) return false;
return true; return true;
} }
factory GasRefillDetails.fromJson(Map<String,dynamic> parsedJson){
factory GasRefillDetails.fromJson(Map<String, dynamic> parsedJson) {
return GasRefillDetails( return GasRefillDetails(
type: Lookup.fromJson(parsedJson["gasType"]), type: Lookup.fromJson(parsedJson["gasType"]),
cylinderSize: Lookup.fromJson(parsedJson["cylinderSize"]), cylinderSize: Lookup.fromJson(parsedJson["cylinderSize"]),
@ -31,14 +32,13 @@ class GasRefillDetails{
); );
} }
factory GasRefillDetails.fromDetails(GasRefillDetails details){ factory GasRefillDetails.fromDetails(GasRefillDetails details) {
return GasRefillDetails( return GasRefillDetails(
type: Lookup.fromStatus(details.type), type: Lookup.fromStatus(details.type),
cylinderSize:Lookup.fromStatus(details.cylinderSize), cylinderSize: Lookup.fromStatus(details.cylinderSize),
cylinderType:Lookup.fromStatus(details.cylinderType), cylinderType: Lookup.fromStatus(details.cylinderType),
requestedQuantity: details.requestedQuantity, requestedQuantity: details.requestedQuantity,
deliveredQuantity: details.deliveredQuantity, deliveredQuantity: details.deliveredQuantity,
); );
} }
} }

@ -1,7 +1,7 @@
import 'package:test_sa/models/gas_refill/gas_refill_details.dart'; import 'package:test_sa/models/gas_refill/gas_refill_details.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
class GasRefillModel{ class GasRefillModel {
int id; int id;
//String userId; //String userId;
String clientName; String clientName;
@ -18,14 +18,14 @@ class GasRefillModel{
this.details, this.details,
}); });
bool validate(){ bool validate() {
if(title == null) return false; if (title == null) return false;
if(status == null) return false; if (status == null) return false;
if(details == null && details.isEmpty) return false; if (details == null && details.isEmpty) return false;
return true; return true;
} }
fromGasRefillModel(GasRefillModel model){ fromGasRefillModel(GasRefillModel model) {
id = model.id; id = model.id;
//userId = model.userId; //userId = model.userId;
clientName = model.clientName; clientName = model.clientName;
@ -34,9 +34,9 @@ class GasRefillModel{
details = model.details.map((e) => GasRefillDetails.fromDetails(e)).toList(); details = model.details.map((e) => GasRefillDetails.fromDetails(e)).toList();
} }
factory GasRefillModel.fromJson(Map<String,dynamic> parsedJson){ factory GasRefillModel.fromJson(Map<String, dynamic> parsedJson) {
List<GasRefillDetails> details = []; List<GasRefillDetails> details = [];
if(parsedJson["gazRefillDetails"] != null){ if (parsedJson["gazRefillDetails"] != null) {
List list = parsedJson["gazRefillDetails"]; List list = parsedJson["gazRefillDetails"];
details = list.map((e) => GasRefillDetails.fromJson(e)).toList(); details = list.map((e) => GasRefillDetails.fromJson(e)).toList();
} }
@ -44,11 +44,9 @@ class GasRefillModel{
id: parsedJson["id"], id: parsedJson["id"],
//userId: parsedJson["uid"], //userId: parsedJson["uid"],
title: parsedJson["gazRefillNo"], title: parsedJson["gazRefillNo"],
clientName: parsedJson["site"] == null ? null: clientName: parsedJson["site"] == null ? null : parsedJson["site"]["custName"],
parsedJson["site"]["custName"],
status: Lookup.fromJson(parsedJson["status"]), status: Lookup.fromJson(parsedJson["status"]),
details: details, details: details,
); );
} }
} }

@ -1,4 +1,4 @@
class Hospital{ class Hospital {
int id; int id;
int customerCode; int customerCode;
String name; String name;
@ -11,31 +11,15 @@ class Hospital{
this.buildings, this.buildings,
}); });
factory Hospital.fromJson(Map<String, dynamic> parsedJson) {
factory Hospital.fromJson(Map<String,dynamic> parsedJson){ return Hospital(id: parsedJson["id"], name: parsedJson["custName"], customerCode: parsedJson["customerCode"], buildings: parsedJson["buildings"]);
return Hospital(
id: parsedJson["id"],
name: parsedJson["custName"],
customerCode: parsedJson["customerCode"],
buildings: parsedJson["buildings"]
);
} }
factory Hospital.fromHospital(Hospital hospital){ factory Hospital.fromHospital(Hospital hospital) {
return Hospital( return Hospital(id: hospital?.id, name: hospital?.name, customerCode: hospital?.customerCode, buildings: hospital?.buildings);
id: hospital?.id,
name: hospital?.name,
customerCode: hospital?.customerCode,
buildings:hospital?.buildings
);
} }
Map<String, dynamic> toMap() { Map<String, dynamic> toMap() {
return { return {'id': id, 'customerCode': customerCode, 'custName': name, "buildings": buildings};
'id': id,
'customerCode': customerCode,
'custName': name,
"buildings":buildings
};
} }
} }

@ -1,4 +1,4 @@
class Issue{ class Issue {
String title; String title;
String userId; String userId;
List<int> reports; List<int> reports;
@ -15,13 +15,13 @@ class Issue{
this.serviceRequestId, this.serviceRequestId,
}); });
Map<String,String> toMap(){ Map<String, String> toMap() {
Map<String,String> map ={}; Map<String, String> map = {};
if(title != null) map["title"] = title; if (title != null) map["title"] = title;
if(reports != null) map["issue_report"] = reports.toString(); if (reports != null) map["issue_report"] = reports.toString();
if(userId != null) map["uid"] = userId; if (userId != null) map["uid"] = userId;
if(description != null) map["desc"] = description; if (description != null) map["desc"] = description;
if(serviceRequestId != null) map["call_id"] = serviceRequestId; if (serviceRequestId != null) map["call_id"] = serviceRequestId;
return map; return map;
} }
} }

@ -1,5 +1,4 @@
class Lookup{ class Lookup {
//old name label //old name label
final String name; final String name;
// old name key // old name key
@ -13,25 +12,17 @@ class Lookup{
}); });
@override @override
bool operator == (Object other) => bool operator ==(Object other) => identical(this, other) || other is Lookup && ((value != null && value == other.value) || (id != null && id == other.id));
identical(this, other) || other is Lookup &&
((value != null && value == other.value)
|| ( id != null && id == other.id )) ;
@override @override
int get hashCode => id?.hashCode ?? value?.hashCode; int get hashCode => id?.hashCode ?? value?.hashCode;
toMap(){ toMap() {
return { return {"id": id, "name": name, "value": value};
"id": id,
"name": name,
"value": value
};
} }
factory Lookup.fromStatus(Lookup old){ factory Lookup.fromStatus(Lookup old) {
if(old == null) return null; if (old == null) return null;
return Lookup( return Lookup(
name: old.name, name: old.name,
id: old.id, id: old.id,
@ -39,8 +30,8 @@ class Lookup{
); );
} }
factory Lookup.fromJson(Map<String,dynamic> parsedJson){ factory Lookup.fromJson(Map<String, dynamic> parsedJson) {
if(parsedJson == null) return null; if (parsedJson == null) return null;
return Lookup( return Lookup(
name: parsedJson["name"], name: parsedJson["name"],
id: parsedJson["id"], id: parsedJson["id"],

@ -1,6 +1,6 @@
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
class CalibrationTool{ class CalibrationTool {
int id; int id;
Lookup assetsNumber; Lookup assetsNumber;
DateTime dataOfTesting; DateTime dataOfTesting;
@ -13,16 +13,16 @@ class CalibrationTool{
Map<String, dynamic> toMap(int visitId) { Map<String, dynamic> toMap(int visitId) {
return { return {
"id":id ?? 0, "id": id ?? 0,
"visitId": visitId, "visitId": visitId,
if(assetsNumber != null) 'assetId': (assetsNumber?.id).toString(), if (assetsNumber != null) 'assetId': (assetsNumber?.id).toString(),
if(dataOfTesting != null) 'calibrationDateOfTesters': dataOfTesting.toIso8601String(), if (dataOfTesting != null) 'calibrationDateOfTesters': dataOfTesting.toIso8601String(),
}; };
} }
factory CalibrationTool.fromMap(Map<String, dynamic> map) { factory CalibrationTool.fromMap(Map<String, dynamic> map) {
return CalibrationTool( return CalibrationTool(
assetsNumber: Lookup(id: map["assetId"],name: map['assetSerialNo']), assetsNumber: Lookup(id: map["assetId"], name: map['assetSerialNo']),
dataOfTesting: DateTime.tryParse(map['calibrationDateOfTesters'] ?? ""), dataOfTesting: DateTime.tryParse(map['calibrationDateOfTesters'] ?? ""),
); );
} }

@ -1,6 +1,6 @@
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
class Contact{ class Contact {
Lookup title; Lookup title;
Lookup contactPerson; Lookup contactPerson;
String job; String job;
@ -8,14 +8,7 @@ class Contact{
String telephone; String telephone;
String landLine; String landLine;
Contact({ Contact({this.title, this.contactPerson, this.job, this.email, this.telephone, this.landLine});
this.title,
this.contactPerson,
this.job,
this.email,
this.telephone,
this.landLine
});
Map<String, String> toMap() { Map<String, String> toMap() {
return { return {

@ -1,12 +1,9 @@
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
class ContactTitle extends Lookup { class ContactTitle extends Lookup {
ContactTitle({ ContactTitle({int id, String label}) : super(id: id, name: label);
int id,
String label
}):super(id: id,name: label);
factory ContactTitle.fromMap(Map<String,dynamic> parsedJson){ factory ContactTitle.fromMap(Map<String, dynamic> parsedJson) {
return ContactTitle( return ContactTitle(
label: parsedJson["value"], label: parsedJson["value"],
id: parsedJson["id"], id: parsedJson["id"],

@ -1,12 +1,9 @@
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
class ContactTitle extends Lookup { class ContactTitle extends Lookup {
ContactTitle({ ContactTitle({int id, String label}) : super(id: id, name: label);
int id,
String label
}):super(id: id,name: label);
factory ContactTitle.fromMap(Map<String,dynamic> parsedJson){ factory ContactTitle.fromMap(Map<String, dynamic> parsedJson) {
return ContactTitle( return ContactTitle(
label: parsedJson["value"], label: parsedJson["value"],
id: parsedJson["id"], id: parsedJson["id"],

@ -1,6 +1,6 @@
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
class PMKit{ class PMKit {
int id; int id;
Lookup itemCode; Lookup itemCode;
String itemName; String itemName;
@ -10,22 +10,13 @@ class PMKit{
String quantityNeeded; String quantityNeeded;
String quantityReserved; String quantityReserved;
PMKit({ PMKit({this.id, this.itemCode, this.itemName, this.preparationTimeFrame, this.kitFrequencyDemand, this.availability, this.quantityNeeded, this.quantityReserved});
this.id,
this.itemCode,
this.itemName,
this.preparationTimeFrame,
this.kitFrequencyDemand,
this.availability,
this.quantityNeeded,
this.quantityReserved
});
Map<String, dynamic> toMap(int visitId) { Map<String, dynamic> toMap(int visitId) {
return { return {
"id":id ?? 0, "id": id ?? 0,
"visitId": visitId, "visitId": visitId,
if(itemCode != null) 'partCatalogItemId': (itemCode?.id).toString(), if (itemCode != null) 'partCatalogItemId': (itemCode?.id).toString(),
// if(itemName != null) 'itemName': itemName, // if(itemName != null) 'itemName': itemName,
// if(preparationTimeFrame != null) 'preparationTimeFrame': preparationTimeFrame, // if(preparationTimeFrame != null) 'preparationTimeFrame': preparationTimeFrame,
// if(kitFrequencyDemand != null) 'kitFrequencyDemand': kitFrequencyDemand, // if(kitFrequencyDemand != null) 'kitFrequencyDemand': kitFrequencyDemand,
@ -38,7 +29,7 @@ class PMKit{
factory PMKit.fromMap(Map<String, dynamic> map) { factory PMKit.fromMap(Map<String, dynamic> map) {
return PMKit( return PMKit(
id: map['id'], id: map['id'],
itemCode: Lookup(id:map['partCatalogItemId'],name:map["partNumber"]), itemCode: Lookup(id: map['partCatalogItemId'], name: map["partNumber"]),
itemName: map['itemName'] as String, itemName: map['itemName'] as String,
preparationTimeFrame: map['preparationTimeFrame'] as String, preparationTimeFrame: map['preparationTimeFrame'] as String,
kitFrequencyDemand: map['kitFrequencyDemand'] as String, kitFrequencyDemand: map['kitFrequencyDemand'] as String,

@ -1,4 +1,4 @@
class Part{ class Part {
int id; int id;
int reportPartID; int reportPartID;
String code; String code;
@ -13,19 +13,15 @@ class Part{
this.quantity = 1, this.quantity = 1,
}); });
Map<String,dynamic> toJson(){ Map<String, dynamic> toJson() {
return { return {
"id": reportPartID ?? 0, "id": reportPartID ?? 0,
"sparePart":{ "sparePart": {"id": id, "partNo": code, "partName": name},
"id":id, "qty": quantity
"partNo": code,
"partName":name
},
"qty":quantity
}; };
} }
factory Part.fromJson(Map<String,dynamic> parsedJson,{Map<String,dynamic> reportJson}){ factory Part.fromJson(Map<String, dynamic> parsedJson, {Map<String, dynamic> reportJson}) {
return Part( return Part(
id: parsedJson["id"], id: parsedJson["id"],
reportPartID: reportJson != null ? reportJson["id"] : null, reportPartID: reportJson != null ? reportJson["id"] : null,

@ -75,13 +75,9 @@ class SearchWorkOrders {
workOrderNo = json['workOrderNo']; workOrderNo = json['workOrderNo'];
workOrderYear = json['workOrderYear']; workOrderYear = json['workOrderYear'];
workOrderSequennce = json['workOrderSequennce']; workOrderSequennce = json['workOrderSequennce'];
callRequest = json['callRequest'] != null callRequest = json['callRequest'] != null ? new CallRequest.fromJson(json['callRequest']) : CallRequest();
? new CallRequest.fromJson(json['callRequest'])
: CallRequest();
assetType = json['assetType']; assetType = json['assetType'];
assignedEmployee = json['assignedEmployee'] != null assignedEmployee = json['assignedEmployee'] != null ? new AssignedEmployee.fromJson(json['assignedEmployee']) : AssignedEmployee();
? new AssignedEmployee.fromJson(json['assignedEmployee'])
: AssignedEmployee();
visitDate = json['visitDate']; visitDate = json['visitDate'];
if (json['assistantEmployees'] != null) { if (json['assistantEmployees'] != null) {
assistantEmployees = json['assistantEmployees']; assistantEmployees = json['assistantEmployees'];
@ -91,12 +87,8 @@ class SearchWorkOrders {
if (json['contactPersonWorkOrders'] != null) { if (json['contactPersonWorkOrders'] != null) {
contactPersonWorkOrders = json['contactPersonWorkOrders']; contactPersonWorkOrders = json['contactPersonWorkOrders'];
} }
calllastSituation = json['calllastSituation'] != null calllastSituation = json['calllastSituation'] != null ? new Lookup.fromJson(json['calllastSituation']) : Lookup();
? new Lookup.fromJson(json['calllastSituation']) currentSituation = json['currentSituation'] != null ? new Lookup.fromJson(json['currentSituation']) : Lookup();
: Lookup();
currentSituation = json['currentSituation'] != null
? new Lookup.fromJson(json['currentSituation'])
: Lookup();
repairLocation = json['repairLocation']; repairLocation = json['repairLocation'];
reason = json['reason']; reason = json['reason'];
startofWorkTime = json['startofWorkTime']; startofWorkTime = json['startofWorkTime'];
@ -104,9 +96,7 @@ class SearchWorkOrders {
workingHours = json['workingHours']; workingHours = json['workingHours'];
travelingHours = json['travelingHours']; travelingHours = json['travelingHours'];
travelingExpenses = json['travelingExpenses']; travelingExpenses = json['travelingExpenses'];
faultDescription = json['faultDescription'] != null faultDescription = json['faultDescription'] != null ? new ModelDefRelatedDefects.fromJson(json['faultDescription']) : ModelDefRelatedDefects();
? new ModelDefRelatedDefects.fromJson(json['faultDescription'])
: ModelDefRelatedDefects();
if (json['sparePartsWorkOrders'] != null) { if (json['sparePartsWorkOrders'] != null) {
sparePartsWorkOrders = json['sparePartsWorkOrders']; sparePartsWorkOrders = json['sparePartsWorkOrders'];
} }
@ -138,14 +128,12 @@ class SearchWorkOrders {
} }
data['visitDate'] = this.visitDate; data['visitDate'] = this.visitDate;
if (this.assistantEmployees != null) { if (this.assistantEmployees != null) {
data['assistantEmployees'] = data['assistantEmployees'] = this.assistantEmployees.map((v) => v.toJson()).toList();
this.assistantEmployees.map((v) => v.toJson()).toList();
} }
data['supplier'] = this.supplier; data['supplier'] = this.supplier;
data['vendorTicketNumber'] = this.vendorTicketNumber; data['vendorTicketNumber'] = this.vendorTicketNumber;
if (this.contactPersonWorkOrders != null) { if (this.contactPersonWorkOrders != null) {
data['contactPersonWorkOrders'] = data['contactPersonWorkOrders'] = this.contactPersonWorkOrders.map((v) => v.toJson()).toList();
this.contactPersonWorkOrders.map((v) => v.toJson()).toList();
} }
if (this.calllastSituation != null) { if (this.calllastSituation != null) {
data['calllastSituation'] = this.calllastSituation.toMap(); data['calllastSituation'] = this.calllastSituation.toMap();
@ -164,16 +152,14 @@ class SearchWorkOrders {
data['faultDescription'] = this.faultDescription.toJson(); data['faultDescription'] = this.faultDescription.toJson();
} }
if (this.sparePartsWorkOrders != null) { if (this.sparePartsWorkOrders != null) {
data['sparePartsWorkOrders'] = data['sparePartsWorkOrders'] = this.sparePartsWorkOrders.map((v) => v.toJson()).toList();
this.sparePartsWorkOrders.map((v) => v.toJson()).toList();
} }
data['reviewComment'] = this.reviewComment; data['reviewComment'] = this.reviewComment;
data['comment'] = this.comment; data['comment'] = this.comment;
data['attachmentsWorkOrder'] = this.attachmentsWorkOrder; data['attachmentsWorkOrder'] = this.attachmentsWorkOrder;
data['equipmentStatus'] = this.equipmentStatus; data['equipmentStatus'] = this.equipmentStatus;
if (this.suppEngineerWorkOrders != null) { if (this.suppEngineerWorkOrders != null) {
data['suppEngineerWorkOrders'] = data['suppEngineerWorkOrders'] = this.suppEngineerWorkOrders.map((v) => v.toJson()).toList();
this.suppEngineerWorkOrders.map((v) => v.toJson()).toList();
} }
data['engSignature'] = this.engSignature; data['engSignature'] = this.engSignature;
data['nurseSignature'] = this.nurseSignature; data['nurseSignature'] = this.nurseSignature;
@ -194,33 +180,18 @@ class CallRequest {
String firstAction; String firstAction;
String assetType; String assetType;
CallRequest( CallRequest({this.id, this.callNo, this.asset, this.assignedEmployee, this.callSiteContactPerson, this.status, this.callLastSituation, this.defectType, this.firstAction, this.assetType});
{this.id,
this.callNo,
this.asset,
this.assignedEmployee,
this.callSiteContactPerson,
this.status,
this.callLastSituation,
this.defectType,
this.firstAction,
this.assetType});
CallRequest.fromJson(Map<String, dynamic> json) { CallRequest.fromJson(Map<String, dynamic> json) {
id = json['id']; id = json['id'];
callNo = json['callNo']; callNo = json['callNo'];
asset = json['asset'] != null ? new Asset.fromJson(json['asset']) : Asset(); asset = json['asset'] != null ? new Asset.fromJson(json['asset']) : Asset();
assignedEmployee = json['assignedEmployee'] != null assignedEmployee = json['assignedEmployee'] != null ? new AssignedEmployee.fromJson(json['assignedEmployee']) : AssignedEmployee();
? new AssignedEmployee.fromJson(json['assignedEmployee'])
: AssignedEmployee();
if (json['callSiteContactPerson'] != null) { if (json['callSiteContactPerson'] != null) {
callSiteContactPerson = json['callSiteContactPerson']; callSiteContactPerson = json['callSiteContactPerson'];
} }
status = status = json['status'] != null ? new Lookup.fromJson(json['status']) : Lookup();
json['status'] != null ? new Lookup.fromJson(json['status']) : Lookup(); callLastSituation = json['callLastSituation'] != null ? new Lookup.fromJson(json['callLastSituation']) : Lookup();
callLastSituation = json['callLastSituation'] != null
? new Lookup.fromJson(json['callLastSituation'])
: Lookup();
defectType = json['defectType']; defectType = json['defectType'];
firstAction = json['firstAction']; firstAction = json['firstAction'];
assetType = json['assetType']; assetType = json['assetType'];
@ -237,8 +208,7 @@ class CallRequest {
data['assignedEmployee'] = this.assignedEmployee.toJson(); data['assignedEmployee'] = this.assignedEmployee.toJson();
} }
if (this.callSiteContactPerson != null) { if (this.callSiteContactPerson != null) {
data['callSiteContactPerson'] = data['callSiteContactPerson'] = this.callSiteContactPerson.map((v) => v.toJson()).toList();
this.callSiteContactPerson.map((v) => v.toJson()).toList();
} }
if (this.status != null) { if (this.status != null) {
data['status'] = this.status.toMap(); data['status'] = this.status.toMap();
@ -358,9 +328,7 @@ class Asset {
assetSerialNo = json['assetSerialNo']; assetSerialNo = json['assetSerialNo'];
systemID = json['systemID']; systemID = json['systemID'];
assetNumber = json['assetNumber']; assetNumber = json['assetNumber'];
modelDefinition = json['modelDefinition'] != null modelDefinition = json['modelDefinition'] != null ? new ModelDefinition.fromJson(json['modelDefinition']) : ModelDefinition();
? new ModelDefinition.fromJson(json['modelDefinition'])
: ModelDefinition();
supplier = json['supplier']; supplier = json['supplier'];
ipAddress = json['ipAddress']; ipAddress = json['ipAddress'];
macAddress = json['macAddress']; macAddress = json['macAddress'];
@ -430,8 +398,7 @@ class Asset {
data['warrantyEndDate'] = this.warrantyEndDate; data['warrantyEndDate'] = this.warrantyEndDate;
data['warrantyContractConditions'] = this.warrantyContractConditions; data['warrantyContractConditions'] = this.warrantyContractConditions;
if (this.technicalGuidanceBooks != null) { if (this.technicalGuidanceBooks != null) {
data['technicalGuidanceBooks'] = data['technicalGuidanceBooks'] = this.technicalGuidanceBooks.map((v) => v.toJson()).toList();
this.technicalGuidanceBooks.map((v) => v.toJson()).toList();
} }
data['comment'] = this.comment; data['comment'] = this.comment;
data['tagCode'] = this.tagCode; data['tagCode'] = this.tagCode;
@ -498,8 +465,7 @@ class ModelDefinition {
data['replacementDate'] = this.replacementDate; data['replacementDate'] = this.replacementDate;
data['lifeSpan'] = this.lifeSpan; data['lifeSpan'] = this.lifeSpan;
if (this.modelDefRelatedDefects != null) { if (this.modelDefRelatedDefects != null) {
data['modelDefRelatedDefects'] = data['modelDefRelatedDefects'] = this.modelDefRelatedDefects.map((v) => v.toJson()).toList();
this.modelDefRelatedDefects.map((v) => v.toJson()).toList();
} }
if (this.suppliers != null) { if (this.suppliers != null) {
data['suppliers'] = this.suppliers.map((v) => v.toJson()).toList(); data['suppliers'] = this.suppliers.map((v) => v.toJson()).toList();
@ -514,8 +480,7 @@ class ModelDefRelatedDefects {
String workPerformed; String workPerformed;
String estimatedTime; String estimatedTime;
ModelDefRelatedDefects( ModelDefRelatedDefects({this.id, this.defectName, this.workPerformed, this.estimatedTime});
{this.id, this.defectName, this.workPerformed, this.estimatedTime});
ModelDefRelatedDefects.fromJson(Map<String, dynamic> json) { ModelDefRelatedDefects.fromJson(Map<String, dynamic> json) {
id = json['id']; id = json['id'];
@ -581,4 +546,3 @@ class AssignedEmployee {
return data; return data;
} }
} }

@ -2,7 +2,7 @@ import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/models/device/device.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
class ServiceRequest{ class ServiceRequest {
String id; String id;
String requestCode; String requestCode;
String deviceSerialNumber; String deviceSerialNumber;
@ -53,7 +53,6 @@ class ServiceRequest{
this.deviceId, this.deviceId,
this.audio, this.audio,
this.engineerName, this.engineerName,
this.viewReport = false, this.viewReport = false,
this.deviceModel, this.deviceModel,
this.engineerMobile, this.engineerMobile,
@ -71,9 +70,9 @@ class ServiceRequest{
this.device, this.device,
}); });
factory ServiceRequest.fromJson(Map<String,dynamic> parsedJson){ factory ServiceRequest.fromJson(Map<String, dynamic> parsedJson) {
List<String> images = []; List<String> images = [];
if(parsedJson["attachmentsCallRequest"] is List){ if (parsedJson["attachmentsCallRequest"] is List) {
List list = parsedJson["attachmentsCallRequest"]; List list = parsedJson["attachmentsCallRequest"];
images = list.map((e) => URLs.getFileUrl(e["attachmentsCallRequest"])).toList(); images = list.map((e) => URLs.getFileUrl(e["attachmentsCallRequest"])).toList();
} }
@ -90,30 +89,20 @@ class ServiceRequest{
deviceSerialNumber: parsedJson["asset"]["assetSerialNo"], deviceSerialNumber: parsedJson["asset"]["assetSerialNo"],
date: DateTime.tryParse(parsedJson["requestedDate"] ?? "").toString().split(" ").first, date: DateTime.tryParse(parsedJson["requestedDate"] ?? "").toString().split(" ").first,
maintenanceIssue: parsedJson["comments"], maintenanceIssue: parsedJson["comments"],
statusLabel: parsedJson["status"] == null ? null : statusLabel: parsedJson["status"] == null ? null : parsedJson["status"]["name"],
parsedJson["status"]["name"], statusValue: parsedJson["status"] == null ? null : parsedJson["status"]["value"],
statusValue: parsedJson["status"] == null ? null : departmentName: parsedJson["asset"]["department"] != null ? parsedJson["asset"]["department"]["name"] : "",
parsedJson["status"]["value"], engineerName: parsedJson["assignedEmployee"] == null ? null : parsedJson["assignedEmployee"]["name"],
departmentName: parsedJson["asset"]["department"] != null ?
parsedJson["asset"]["department"]["name"] : "",
engineerName: parsedJson["assignedEmployee"] == null ? null :
parsedJson["assignedEmployee"]["name"],
hospitalId: parsedJson["asset"]["site"]["id"], hospitalId: parsedJson["asset"]["site"]["id"],
reportID: parsedJson["workOrder"] != null ? reportID: parsedJson["workOrder"] != null ? parsedJson["workOrder"]["workOrderId"] : null,
parsedJson["workOrder"]["workOrderId"] : null,
viewReport: parsedJson["workOrder"] != null, viewReport: parsedJson["workOrder"] != null,
deviceModel: parsedJson["asset"]["modelDefinition"]["modelName"], deviceModel: parsedJson["asset"]["modelDefinition"]["modelName"],
engineerMobile: parsedJson["assignedEmployee"] == null ? null : engineerMobile: parsedJson["assignedEmployee"] == null ? null : parsedJson["assignedEmployee"]["phone"],
parsedJson["assignedEmployee"]["phone"], faultDescription: parsedJson["workOrder"] != null ? parsedJson["workOrder"]["faultDescription"] : null,
faultDescription: parsedJson["workOrder"] != null ? jobSheetNumber: parsedJson["workOrder"] != null ? parsedJson["workOrder"]["jobSheetNumber"] : null,
parsedJson["workOrder"]["faultDescription"] : null,
jobSheetNumber: parsedJson["workOrder"] != null ?
parsedJson["workOrder"]["jobSheetNumber"] :null,
visitDate: DateTime.tryParse(parsedJson["visitDate"] ?? "").toString().split(" ").first, visitDate: DateTime.tryParse(parsedJson["visitDate"] ?? "").toString().split(" ").first,
nextVisitDate: DateTime.tryParse(parsedJson["nextVisitDate"] ?? ""), nextVisitDate: DateTime.tryParse(parsedJson["nextVisitDate"] ?? ""),
workPerformed: parsedJson["workOrder"] != null ? workPerformed: parsedJson["workOrder"] != null ? parsedJson["workOrder"]["workPerformed"] : null,
parsedJson["workOrder"]["workPerformed"] : null, device: Device.fromJson(parsedJson["asset"]));
device: Device.fromJson(parsedJson["asset"])
);
} }
} }

@ -1,7 +1,7 @@
import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/hospital.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
class ServiceRequestSearch{ class ServiceRequestSearch {
String deviceSerialNumber; String deviceSerialNumber;
String deviceNumber; String deviceNumber;
String deviceName; String deviceName;
@ -9,7 +9,6 @@ class ServiceRequestSearch{
String model; String model;
Lookup statusValue; Lookup statusValue;
ServiceRequestSearch({ ServiceRequestSearch({
this.deviceSerialNumber, this.deviceSerialNumber,
this.deviceNumber, this.deviceNumber,
@ -19,7 +18,7 @@ class ServiceRequestSearch{
this.hospital, this.hospital,
}); });
fromSearch(ServiceRequestSearch newSearch){ fromSearch(ServiceRequestSearch newSearch) {
deviceSerialNumber = newSearch.deviceSerialNumber; deviceSerialNumber = newSearch.deviceSerialNumber;
deviceNumber = newSearch.deviceNumber; deviceNumber = newSearch.deviceNumber;
statusValue = newSearch.statusValue; statusValue = newSearch.statusValue;
@ -27,30 +26,29 @@ class ServiceRequestSearch{
model = newSearch.model; model = newSearch.model;
} }
Map<String,dynamic> toMap(){ Map<String, dynamic> toMap() {
Map<String,dynamic> search = {}; Map<String, dynamic> search = {};
if(deviceSerialNumber != null && deviceSerialNumber.isNotEmpty){ if (deviceSerialNumber != null && deviceSerialNumber.isNotEmpty) {
search["assetSerialNumber"] = deviceSerialNumber; search["assetSerialNumber"] = deviceSerialNumber;
} }
if(deviceNumber != null && deviceNumber.isNotEmpty){ if (deviceNumber != null && deviceNumber.isNotEmpty) {
search["assetNo"] = deviceNumber; search["assetNo"] = deviceNumber;
} }
if(statusValue != null){ if (statusValue != null) {
search["status"] = statusValue.toMap(); search["status"] = statusValue.toMap();
} }
if(deviceName != null && deviceName.isNotEmpty){ if (deviceName != null && deviceName.isNotEmpty) {
search["assetName"] = deviceName; search["assetName"] = deviceName;
} }
if(hospital != null){ if (hospital != null) {
search["site"] = hospital.name; search["site"] = hospital.name;
} }
if(model != null){ if (model != null) {
search["modelDefinition"] = model; search["modelDefinition"] = model;
} }
return search; return search;

@ -1,6 +1,6 @@
import 'package:meta/meta.dart'; import 'package:meta/meta.dart';
class Subtitle{ class Subtitle {
// http requests status messages // http requests status messages
String currentlyServiceNotAvailable; String currentlyServiceNotAvailable;
String waitUntilYourRequestComplete; String waitUntilYourRequestComplete;
@ -223,7 +223,7 @@ class Subtitle{
String duplicateAlertMessage; String duplicateAlertMessage;
String alert; String alert;
void setIssues(List<String> issues){ void setIssues(List<String> issues) {
issues.clear(); issues.clear();
issues.add(reason1); issues.add(reason1);
issues.add(reason2); issues.add(reason2);
@ -285,7 +285,6 @@ class Subtitle{
@required this.titleValidateMessage, @required this.titleValidateMessage,
@required this.to, @required this.to,
@required this.urlNotFound, @required this.urlNotFound,
@required this.nameExist, @required this.nameExist,
@required this.unitRequired, @required this.unitRequired,
@required this.unite, @required this.unite,
@ -391,7 +390,6 @@ class Subtitle{
@required this.pickImage, @required this.pickImage,
@required this.requiredImage, @required this.requiredImage,
@required this.activationAlert, @required this.activationAlert,
@required this.callId, @required this.callId,
@required this.requiredWord, @required this.requiredWord,
@required this.quantity, @required this.quantity,
@ -423,7 +421,7 @@ class Subtitle{
@required this.currentSituation, @required this.currentSituation,
}); });
factory Subtitle.fromJson(Map<String,dynamic> parsedJson){ factory Subtitle.fromJson(Map<String, dynamic> parsedJson) {
return Subtitle( return Subtitle(
currentlyServiceNotAvailable: parsedJson["server_error_message"], currentlyServiceNotAvailable: parsedJson["server_error_message"],
failedToCompleteRequest: parsedJson["failed_request_message"], failedToCompleteRequest: parsedJson["failed_request_message"],
@ -437,7 +435,6 @@ class Subtitle{
signOut: parsedJson["sign_out"], signOut: parsedJson["sign_out"],
signOutAlert: parsedJson["logout_alert"], signOutAlert: parsedJson["logout_alert"],
language: parsedJson["language"], language: parsedJson["language"],
name: parsedJson["name"], name: parsedJson["name"],
email: parsedJson["email"], email: parsedJson["email"],
phoneNumber: parsedJson["phone_number"], phoneNumber: parsedJson["phone_number"],
@ -451,7 +448,6 @@ class Subtitle{
passwordValidateMessage: parsedJson["password_validate_message"], passwordValidateMessage: parsedJson["password_validate_message"],
confirmPasswordValidateMessage: parsedJson["confirm_password_validate_message"], confirmPasswordValidateMessage: parsedJson["confirm_password_validate_message"],
phoneNumberValidateMessage: parsedJson["phone_number_validate_message"], phoneNumberValidateMessage: parsedJson["phone_number_validate_message"],
forgetPasswordWithMark: parsedJson["forget_password_with_mark"], forgetPasswordWithMark: parsedJson["forget_password_with_mark"],
showPassword: parsedJson["show_password"], showPassword: parsedJson["show_password"],
wrongEmailOrPassword: parsedJson["wrong_email_or_password"], wrongEmailOrPassword: parsedJson["wrong_email_or_password"],
@ -461,7 +457,6 @@ class Subtitle{
back: parsedJson["back"], back: parsedJson["back"],
search: parsedJson["search"], search: parsedJson["search"],
searchByName: parsedJson["search_by_name"], searchByName: parsedJson["search_by_name"],
address: parsedJson["address"], address: parsedJson["address"],
addressNotFound: parsedJson["address_not_found"], addressNotFound: parsedJson["address_not_found"],
addressValidateMessage: parsedJson["address_validate_message"], addressValidateMessage: parsedJson["address_validate_message"],
@ -480,7 +475,6 @@ class Subtitle{
titleNotFound: parsedJson["title_not_found"], titleNotFound: parsedJson["title_not_found"],
titleValidateMessage: parsedJson["title_validate_message"], titleValidateMessage: parsedJson["title_validate_message"],
urlNotFound: parsedJson["url_not_found"], urlNotFound: parsedJson["url_not_found"],
date: parsedJson["date"], date: parsedJson["date"],
status: parsedJson["status"], status: parsedJson["status"],
code: parsedJson["code"], code: parsedJson["code"],
@ -556,7 +550,6 @@ class Subtitle{
visitDate: parsedJson["visitDate"], visitDate: parsedJson["visitDate"],
whatsApp: parsedJson["whatsApp"], whatsApp: parsedJson["whatsApp"],
workPerformed: parsedJson["workPerformed"], workPerformed: parsedJson["workPerformed"],
actualDate: parsedJson["actualDate"], actualDate: parsedJson["actualDate"],
done: parsedJson["done"], done: parsedJson["done"],
expectDate: parsedJson["expectDate"], expectDate: parsedJson["expectDate"],
@ -587,7 +580,6 @@ class Subtitle{
requiredImage: parsedJson["requiredImage"], requiredImage: parsedJson["requiredImage"],
taskStatus: parsedJson["taskStatus"], taskStatus: parsedJson["taskStatus"],
activationAlert: parsedJson["activationAlert"], activationAlert: parsedJson["activationAlert"],
attachImage: parsedJson["attachImage"], attachImage: parsedJson["attachImage"],
callLastSituation: parsedJson["callLastSituation"], callLastSituation: parsedJson["callLastSituation"],
customer: parsedJson["customer"], customer: parsedJson["customer"],
@ -606,19 +598,17 @@ class Subtitle{
requiredWord: parsedJson["requiredWord"], requiredWord: parsedJson["requiredWord"],
serviceType: parsedJson["serviceType"], serviceType: parsedJson["serviceType"],
workPreformed: parsedJson["workPreformed"], workPreformed: parsedJson["workPreformed"],
alert: parsedJson["alert"], alert: parsedJson["alert"],
duplicateAlert: parsedJson["duplicateAlert"], duplicateAlert: parsedJson["duplicateAlert"],
duplicateAlertMessage: parsedJson["duplicateAlertMessage"], duplicateAlertMessage: parsedJson["duplicateAlertMessage"],
duplicateRequest: parsedJson["duplicateRequest"], duplicateRequest: parsedJson["duplicateRequest"],
orderWorkNumber:parsedJson["orderWorkNumber"], orderWorkNumber: parsedJson["orderWorkNumber"],
assignedEmployee:parsedJson["assignedEmployee"], assignedEmployee: parsedJson["assignedEmployee"],
assetSN:parsedJson["assetSN"], assetSN: parsedJson["assetSN"],
assetName:parsedJson["assetName"], assetName: parsedJson["assetName"],
site:parsedJson["site"], site: parsedJson["site"],
maintenanceSituation:parsedJson["maintenanceSituation"], maintenanceSituation: parsedJson["maintenanceSituation"],
currentSituation:parsedJson["currentSituation"], currentSituation: parsedJson["currentSituation"],
); );
} }
} }

@ -3,5 +3,5 @@ class TimerModel {
DateTime endAt; DateTime endAt;
int durationInSecond; int durationInSecond;
TimerModel({this.startAt,this.endAt,this.durationInSecond}); TimerModel({this.startAt, this.endAt, this.durationInSecond});
} }

@ -1,7 +1,7 @@
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/pantry/pentry.dart'; import 'package:test_sa/models/pantry/pentry.dart';
class Visit{ class Visit {
int id; int id;
String serialNumber; String serialNumber;
String expectDate; String expectDate;
@ -44,9 +44,9 @@ class Visit{
this.deviceNumber, this.deviceNumber,
}); });
factory Visit.fromJson(Map<String,dynamic> parsedJson){ factory Visit.fromJson(Map<String, dynamic> parsedJson) {
List<String> images = []; List<String> images = [];
if(parsedJson["vAttachments"] is List){ if (parsedJson["vAttachments"] is List) {
List list = parsedJson["vAttachments"]; List list = parsedJson["vAttachments"];
images = list.map((e) => e["attachmentURL"].toString()).toList(); images = list.map((e) => e["attachmentURL"].toString()).toList();
} }
@ -73,7 +73,6 @@ class Visit{
name: parsedJson["visitStatusName"] // text value name: parsedJson["visitStatusName"] // text value
), ),
assignTo: parsedJson["assignedToName"], assignTo: parsedJson["assignedToName"],
pentry: Pentry.fromMap(parsedJson) pentry: Pentry.fromMap(parsedJson));
);
} }
} }

@ -1,8 +1,7 @@
import 'package:test_sa/models/engineer.dart'; import 'package:test_sa/models/engineer.dart';
import 'package:test_sa/models/visits/visit.dart'; import 'package:test_sa/models/visits/visit.dart';
class VisitsGroup{ class VisitsGroup {
// String userId; // String userId;
// String workingHours; // String workingHours;
// String travelingHours; // String travelingHours;
@ -27,8 +26,8 @@ class VisitsGroup{
// this.taskStatus, // this.taskStatus,
}); });
Map<String,dynamic> toJson(){ Map<String, dynamic> toJson() {
Map<String,dynamic> jsonObject = {}; Map<String, dynamic> jsonObject = {};
jsonObject["ids"] = visits.map((e) => e.id).toList(); jsonObject["ids"] = visits.map((e) => e.id).toList();
jsonObject["assignedEmployeeId"] = engineer?.id; jsonObject["assignedEmployeeId"] = engineer?.id;
// if(status != null) jsonObject["taskStatusId"] = status.id.toString(); // if(status != null) jsonObject["taskStatusId"] = status.id.toString();
@ -43,6 +42,4 @@ class VisitsGroup{
// if(taskStatus != null) jsonObject["task_status"] = taskStatus.id.toString(); // if(taskStatus != null) jsonObject["task_status"] = taskStatus.id.toString();
return jsonObject; return jsonObject;
} }
} }

@ -1,7 +1,7 @@
import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/hospital.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
class VisitsSearch{ class VisitsSearch {
String deviceSerialNumber; String deviceSerialNumber;
Hospital hospital; Hospital hospital;
String brand; String brand;
@ -26,7 +26,7 @@ class VisitsSearch{
this.expectedDateTo, this.expectedDateTo,
}); });
fromSearch(VisitsSearch newSearch){ fromSearch(VisitsSearch newSearch) {
deviceSerialNumber = newSearch.deviceSerialNumber; deviceSerialNumber = newSearch.deviceSerialNumber;
brand = newSearch.brand; brand = newSearch.brand;
hospital = newSearch.hospital; hospital = newSearch.hospital;
@ -39,49 +39,48 @@ class VisitsSearch{
statusValue = newSearch.statusValue; statusValue = newSearch.statusValue;
} }
Map<String,dynamic> toMap(){ Map<String, dynamic> toMap() {
Map<String,dynamic> _search = {}; Map<String, dynamic> _search = {};
if(deviceSerialNumber != null && deviceSerialNumber.isNotEmpty){ if (deviceSerialNumber != null && deviceSerialNumber.isNotEmpty) {
_search["assetId"]= deviceSerialNumber; _search["assetId"] = deviceSerialNumber;
} }
if(hospital != null){ if (hospital != null) {
_search["siteId"]= hospital.id; _search["siteId"] = hospital.id;
} }
if(brand != null && brand.isNotEmpty){ if (brand != null && brand.isNotEmpty) {
// todo get new key // todo get new key
_search[""]= brand; _search[""] = brand;
} }
if(model != null){ if (model != null) {
_search["modelId"]= model.id; _search["modelId"] = model.id;
} }
if(expectedDateFrom != null){ if (expectedDateFrom != null) {
_search["expectedDateFrom"]= expectedDateFrom.toIso8601String(); _search["expectedDateFrom"] = expectedDateFrom.toIso8601String();
} }
if(expectedDateTo != null){ if (expectedDateTo != null) {
_search["expectedDateTo"]= expectedDateTo.toIso8601String(); _search["expectedDateTo"] = expectedDateTo.toIso8601String();
} }
if(actualDateFrom != null){ if (actualDateFrom != null) {
_search["actualDateFrom"]= actualDateFrom.toIso8601String(); _search["actualDateFrom"] = actualDateFrom.toIso8601String();
} }
if(actualDateTo != null){ if (actualDateTo != null) {
_search["actualDateTo"]= actualDateTo.toIso8601String(); _search["actualDateTo"] = actualDateTo.toIso8601String();
} }
if(statusValue != null){ if (statusValue != null) {
_search["visitStatusId"]= statusValue.id; _search["visitStatusId"] = statusValue.id;
} }
if(contactStatus != null){ if (contactStatus != null) {
_search["assignedToId"]= contactStatus.id; _search["assignedToId"] = contactStatus.id;
} }
return _search; return _search;
} }
} }

@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class AColors { class AColors {
AColors._(); AColors._();
static const Color white = Color(0xffffffff); static const Color white = Color(0xffffffff);
@ -18,23 +19,31 @@ class AColors {
static Color inputFieldBackgroundColor = Color(0xfff5f5f5); static Color inputFieldBackgroundColor = Color(0xfff5f5f5);
static Color greyEF = Color(0xffEFEFEF); static Color greyEF = Color(0xffEFEFEF);
static Color getRequestStatusColor(int id){ static Color getRequestStatusColor(int id) {
switch(id){ switch (id) {
case 4: return AColors.deepRed; case 4:
case 6: return AColors.green; return AColors.deepRed;
case 5: return AColors.orange; case 6:
case 8: return AColors.green; return AColors.green;
case 9: return AColors.orange; case 5:
default : return AColors.grey; return AColors.orange;
case 8:
return AColors.green;
case 9:
return AColors.orange;
default:
return AColors.grey;
} }
} }
static Color getGasStatusColor(int id){ static Color getGasStatusColor(int id) {
switch(id){ switch (id) {
case 0: return AColors.orange; case 0:
case 1: return AColors.green; return AColors.orange;
default : return AColors.grey; case 1:
return AColors.green;
default:
return AColors.grey;
} }
} }
} }

@ -1,39 +1,31 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class AppStyle { class AppStyle {
AppStyle._(); AppStyle._();
static const double borderRadius = 10; static const double borderRadius = 10;
static const BoxShadow boxShadow = BoxShadow( static const BoxShadow boxShadow = BoxShadow(color: Colors.black26, blurRadius: 3, offset: Offset(0, 2));
color: Colors.black26,
blurRadius: 3,
offset: Offset(0,2)
);
static double getBorderRadius(BuildContext context){ static double getBorderRadius(BuildContext context) {
return borderRadius * getScaleFactor(context); return borderRadius * getScaleFactor(context);
} }
static double getScaleFactor(BuildContext context){ static double getScaleFactor(BuildContext context) {
return MediaQuery.of(context).orientation == Orientation.portrait return MediaQuery.of(context).orientation == Orientation.portrait
? MediaQuery.of(context).size.width/(360) > 1.5 ? MediaQuery.of(context).size.width / (360) > 1.5
? 1.5 : MediaQuery.of(context).size.width/(360) ? 1.5
: MediaQuery.of(context).size.height/(360) > 1.5 : MediaQuery.of(context).size.width / (360)
? 1.5 : MediaQuery.of(context).size.height/(360); : MediaQuery.of(context).size.height / (360) > 1.5
? 1.5
: MediaQuery.of(context).size.height / (360);
} }
static BorderRadius getCardBorder(BuildContext context){ static BorderRadius getCardBorder(BuildContext context) {
return BorderRadius.only( return BorderRadius.only(
topRight: Radius.circular( topRight: Radius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)),
AppStyle.borderRadius * AppStyle.getScaleFactor(context) topLeft: Radius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)),
), bottomRight: Radius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)),
topLeft: Radius.circular(
AppStyle.borderRadius * AppStyle.getScaleFactor(context)
),
bottomRight: Radius.circular(
AppStyle.borderRadius * AppStyle.getScaleFactor(context)
),
); );
} }
} }

@ -25,7 +25,6 @@ class DeviceTransferDetails extends StatefulWidget {
} }
class _DeviceTransferDetailsState extends State<DeviceTransferDetails> { class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
final DeviceTransferInfo _model = DeviceTransferInfo(); final DeviceTransferInfo _model = DeviceTransferInfo();
bool _isSender = false; bool _isSender = false;
bool _isReceiver = false; bool _isReceiver = false;
@ -39,8 +38,6 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
@override @override
void initState() { void initState() {
super.initState(); super.initState();
} }
@ -66,7 +63,7 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
children: [ children: [
Container( Container(
color: Theme.of(context).colorScheme.primary, color: Theme.of(context).colorScheme.primary,
padding: const EdgeInsets.symmetric(horizontal: 0,vertical: 4), padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4),
child: Row( child: Row(
children: [ children: [
const ABackButton(), const ABackButton(),
@ -74,10 +71,7 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
child: Center( child: Center(
child: Text( child: Text(
_subtitle.details, _subtitle.details,
style: Theme.of(context).textTheme.headline6.copyWith( style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic),
color: AColors.white,
fontStyle: FontStyle.italic
),
), ),
), ),
), ),
@ -87,7 +81,7 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
), ),
Expanded( Expanded(
child: SingleChildScrollView( child: SingleChildScrollView(
padding: EdgeInsets.all(16*AppStyle.getScaleFactor(context)), padding: EdgeInsets.all(16 * AppStyle.getScaleFactor(context)),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
@ -99,59 +93,52 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
title: _subtitle.device, title: _subtitle.device,
info: widget.model.device.serialNumber, info: widget.model.device.serialNumber,
), ),
const SizedBox(height:8), const SizedBox(height: 8),
Row( Row(
children: [ children: [
Expanded( Expanded(
child: Text( child: Text("Sender", style: Theme.of(context).textTheme.headline6),
"Sender",
style: Theme.of(context).textTheme.headline6
),
), ),
if(_isSender || true) if (_isSender || true)
ASmallButton( ASmallButton(
text: _subtitle.edit, text: _subtitle.edit,
onPressed: (){ onPressed: () {
Navigator.of(context).push( Navigator.of(context).push(MaterialPageRoute(
MaterialPageRoute( builder: (_) => UpdateDeviceTransfer(
builder: (_)=> UpdateDeviceTransfer(model: widget.model,isSender: true,) model: widget.model,
) isSender: true,
); )));
}, },
), ),
], ],
), ),
const SizedBox(height:12), const SizedBox(height: 12),
DeviceTransferInfoSection( DeviceTransferInfoSection(
info: widget.model.sender, info: widget.model.sender,
), ),
const SizedBox(height:8), const SizedBox(height: 8),
Row( Row(
children: [ children: [
Expanded( Expanded(
child: Text( child: Text("Receiver", style: Theme.of(context).textTheme.headline6),
"Receiver",
style: Theme.of(context).textTheme.headline6
),
), ),
if(_isReceiver || true) if (_isReceiver || true)
ASmallButton( ASmallButton(
text: _subtitle.edit, text: _subtitle.edit,
onPressed: (){ onPressed: () {
Navigator.of(context).push( Navigator.of(context).push(MaterialPageRoute(
MaterialPageRoute( builder: (_) => UpdateDeviceTransfer(
builder: (_)=> UpdateDeviceTransfer(model: widget.model,isSender: false,) model: widget.model,
) isSender: false,
); )));
}, },
), ),
], ],
), ),
const SizedBox(height:12), const SizedBox(height: 12),
DeviceTransferInfoSection( DeviceTransferInfoSection(
info: widget.model.receiver, info: widget.model.receiver,
), ),
], ],
), ),
), ),

@ -35,7 +35,7 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
SettingProvider _settingProvider; SettingProvider _settingProvider;
DeviceTransferProvider _deviceTransferProvider; DeviceTransferProvider _deviceTransferProvider;
final TextEditingController _requestedQuantityController = TextEditingController(); final TextEditingController _requestedQuantityController = TextEditingController();
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>();

@ -9,6 +9,7 @@ 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';
class TrackDeviceTransferPage extends StatefulWidget { class TrackDeviceTransferPage extends StatefulWidget {
static const String id = "/track-device-transfer"; static const String id = "/track-device-transfer";
@ -18,8 +19,7 @@ class TrackDeviceTransferPage extends StatefulWidget {
State<TrackDeviceTransferPage> createState() => _TrackDeviceTransferPageState(); State<TrackDeviceTransferPage> createState() => _TrackDeviceTransferPageState();
} }
class _TrackDeviceTransferPageState extends State<TrackDeviceTransferPage> class _TrackDeviceTransferPageState extends State<TrackDeviceTransferPage> with TickerProviderStateMixin {
with TickerProviderStateMixin{
DeviceTransferProvider _deviceTransferProvider; DeviceTransferProvider _deviceTransferProvider;
UserProvider _userProvider; UserProvider _userProvider;
SettingProvider _settingProvider; SettingProvider _settingProvider;
@ -48,8 +48,8 @@ class _TrackDeviceTransferPageState extends State<TrackDeviceTransferPage>
Column( Column(
children: [ children: [
Container( Container(
color:AColors.primaryColor, color: AColors.primaryColor,
padding: const EdgeInsets.symmetric(horizontal: 0,vertical: 4), padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4),
child: Column( child: Column(
children: [ children: [
Row( Row(
@ -59,17 +59,15 @@ class _TrackDeviceTransferPageState extends State<TrackDeviceTransferPage>
child: Center( child: Center(
child: Text( child: Text(
"Device Transfer", "Device Transfer",
style: Theme.of(context).textTheme.headline6.copyWith( style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic),
color: AColors.white,
fontStyle: FontStyle.italic
),
), ),
), ),
), ),
const SizedBox(width: 48,) const SizedBox(
width: 48,
)
], ],
), ),
], ],
), ),
), ),

@ -22,12 +22,11 @@ class SplashScreen extends StatefulWidget {
} }
class _SplashScreenState extends State<SplashScreen> { class _SplashScreenState extends State<SplashScreen> {
SettingProvider _settingProvider; SettingProvider _settingProvider;
UserProvider _userProvider; UserProvider _userProvider;
_goToUserScreen(User user){ _goToUserScreen(User user) {
if(user.tokenLife != null && user.tokenLife.isAfter(DateTime.now())){ if (user.tokenLife != null && user.tokenLife.isAfter(DateTime.now())) {
_userProvider.user = user; _userProvider.user = user;
// Navigator.of(context).pushNamed(Login.id); // Navigator.of(context).pushNamed(Login.id);
Navigator.of(context).pushNamed(LandPage.id); Navigator.of(context).pushNamed(LandPage.id);
@ -38,38 +37,30 @@ class _SplashScreenState extends State<SplashScreen> {
void initState() { void initState() {
Firebase.initializeApp(); Firebase.initializeApp();
NotificationManger.initialisation( NotificationManger.initialisation((notificationDetails) {
(notificationDetails) {
AppNotification notification = AppNotification.fromJson(json.decode(notificationDetails.payload)); AppNotification notification = AppNotification.fromJson(json.decode(notificationDetails.payload));
if(notification.path == null || notification.path.isEmpty) if (notification.path == null || notification.path.isEmpty) return;
return; Navigator.pushNamed(context, notification.path, arguments: notification.requestId);
Navigator.pushNamed( }, (id, title, body, payload) async {});
context,
notification.path,
arguments: notification.requestId
);
}
, (id, title, body, payload) async {
});
super.initState(); super.initState();
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_settingProvider = Provider.of<SettingProvider>(context,listen: false); _settingProvider = Provider.of<SettingProvider>(context, listen: false);
_userProvider = Provider.of<UserProvider>(context,listen: false); _userProvider = Provider.of<UserProvider>(context, listen: false);
return Scaffold( return Scaffold(
backgroundColor: Colors.white, backgroundColor: Colors.white,
body: Center( body: Center(
child: SizedBox( child: SizedBox(
width: MediaQuery.of(context).size.width/1.1, width: MediaQuery.of(context).size.width / 1.1,
child: FlareActor( child: FlareActor(
"assets/rives/atoms_splash.flr", "assets/rives/atoms_splash.flr",
fit: BoxFit.contain, fit: BoxFit.contain,
animation: "splash", animation: "splash",
callback: (animation) async { callback: (animation) async {
Navigator.of(context).pushNamed(Login.id); Navigator.of(context).pushNamed(Login.id);
if(_settingProvider.isLoaded && _settingProvider.user != null){ if (_settingProvider.isLoaded && _settingProvider.user != null) {
_goToUserScreen(_settingProvider.user); _goToUserScreen(_settingProvider.user);
} }
}, },

@ -21,6 +21,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 '../../../app_style/colors.dart'; 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);
@ -30,7 +31,6 @@ class GasRefillDetails extends StatefulWidget {
} }
class _GasRefillDetailsState extends State<GasRefillDetails> { class _GasRefillDetailsState extends State<GasRefillDetails> {
final GasRefillModel _model = GasRefillModel(); final GasRefillModel _model = GasRefillModel();
bool _enableEdit = false; bool _enableEdit = false;
bool _validate = false; bool _validate = false;
@ -43,39 +43,29 @@ class _GasRefillDetailsState extends State<GasRefillDetails> {
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()) {
setState(() {}); setState(() {});
return false; return false;
} }
_formKey.currentState.save(); _formKey.currentState.save();
_isLoading =true; _isLoading = true;
setState(() {}); setState(() {});
int status = await _gasRefillProvider.updateModel( int status = await _gasRefillProvider.updateModel(user: _userProvider.user, host: _settingProvider.host, newModel: _model, oldModel: widget.model);
user: _userProvider.user, _isLoading = false;
host: _settingProvider.host,
newModel: _model,
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,
); );
_enableEdit = false; _enableEdit = false;
_validate = false; _validate = false;
//Navigator.of(context).pop(); //Navigator.of(context).pop();
}else{ } else {
String errorMessage = HttpStatusManger.getStatusMessage( String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle);
status: status, subtitle: _subtitle); ScaffoldMessenger.of(context).showSnackBar(SnackBar(
ScaffoldMessenger.of(context).showSnackBar( content: Text(errorMessage),
SnackBar( ));
content: Text(
errorMessage
),
)
);
} }
} }
@ -105,7 +95,7 @@ class _GasRefillDetailsState extends State<GasRefillDetails> {
children: [ children: [
Container( Container(
color: Theme.of(context).colorScheme.primary, color: Theme.of(context).colorScheme.primary,
padding: const EdgeInsets.symmetric(horizontal: 0,vertical: 4), padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4),
child: Row( child: Row(
children: [ children: [
const ABackButton(), const ABackButton(),
@ -113,14 +103,11 @@ class _GasRefillDetailsState extends State<GasRefillDetails> {
child: Center( child: Center(
child: Text( child: Text(
_subtitle.details, _subtitle.details,
style: Theme.of(context).textTheme.headline6.copyWith( style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic),
color: AColors.white,
fontStyle: FontStyle.italic
),
), ),
), ),
), ),
if(_userProvider.user.type == UsersTypes.engineer) if (_userProvider.user.type == UsersTypes.engineer)
AIconButton( AIconButton(
iconData: _enableEdit ? Icons.cancel : Icons.edit, iconData: _enableEdit ? Icons.cancel : Icons.edit,
color: Theme.of(context).colorScheme.onPrimary, color: Theme.of(context).colorScheme.onPrimary,
@ -132,13 +119,15 @@ class _GasRefillDetailsState extends State<GasRefillDetails> {
setState(() {}); setState(() {});
}, },
), ),
const SizedBox(width: 16,) const SizedBox(
width: 16,
)
], ],
), ),
), ),
Expanded( Expanded(
child: SingleChildScrollView( child: SingleChildScrollView(
padding: EdgeInsets.all(16*AppStyle.getScaleFactor(context)), padding: EdgeInsets.all(16 * AppStyle.getScaleFactor(context)),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
@ -150,24 +139,31 @@ class _GasRefillDetailsState extends State<GasRefillDetails> {
title: _subtitle.hospital, title: _subtitle.hospital,
info: _model.clientName, info: _model.clientName,
), ),
_enableEdit ? _enableEdit
Column( ? Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
const SizedBox(height: 8,), const SizedBox(
height: 8,
),
ASubTitle(_subtitle.status), ASubTitle(_subtitle.status),
if(_validate && _model.status == null) if (_validate && _model.status == null)
ASubTitle(_subtitle.requiredWord,color: Colors.red,), ASubTitle(
const SizedBox(height: 4,), _subtitle.requiredWord,
color: Colors.red,
),
const SizedBox(
height: 4,
),
GasStatusMenu( GasStatusMenu(
initialValue: _model.status, initialValue: _model.status,
onSelect: (status){ onSelect: (status) {
_model.status = status; _model.status = status;
}, },
) )
], ],
): )
Row( : Row(
children: [ children: [
Expanded( Expanded(
child: Text( child: Text(
@ -176,32 +172,34 @@ class _GasRefillDetailsState extends State<GasRefillDetails> {
textScaleFactor: AppStyle.getScaleFactor(context), textScaleFactor: AppStyle.getScaleFactor(context),
), ),
), ),
if(_model.status?.id != null) if (_model.status?.id != null) StatusLabel(label: _model.status.name, color: AColors.getGasStatusColor(_model.status.id)),
StatusLabel(label: _model.status.name,
color: AColors.getGasStatusColor(_model.status.id)
),
], ],
), ),
const SizedBox(height: 8,), const SizedBox(
height: 8,
),
const ASubTitle("Gas Requests"), const ASubTitle("Gas Requests"),
const SizedBox(height: 8,), const SizedBox(
height: 8,
),
ListView.builder( ListView.builder(
shrinkWrap: true, shrinkWrap: true,
physics: const ClampingScrollPhysics(), physics: const ClampingScrollPhysics(),
itemCount: _model.details.length, itemCount: _model.details.length,
itemBuilder: (context,index){ itemBuilder: (context, index) {
final details = _model.details[index]; final details = _model.details[index];
return GasRefillUpdateDetailsItem( return GasRefillUpdateDetailsItem(
details: details, details: details,
validate: _validate, validate: _validate,
enableEdit: _enableEdit, enableEdit: _enableEdit,
); );
} }),
), if (_enableEdit)
if(_enableEdit)
Column( Column(
children: [ children: [
const SizedBox(height: 16,), const SizedBox(
height: 16,
),
AButton( AButton(
text: _subtitle.update, text: _subtitle.update,
onPressed: _update, onPressed: _update,

@ -22,6 +22,7 @@ import 'package:test_sa/views/widgets/status/gas_refill/gas_type.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 RequestGasRefill extends StatefulWidget { class RequestGasRefill extends StatefulWidget {
static const String id = "/request-gas-refill"; static const String id = "/request-gas-refill";
const RequestGasRefill({Key key}) : super(key: key); const RequestGasRefill({Key key}) : super(key: key);
@ -45,16 +46,16 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
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(() {});
} }
_onSubmit() async { _onSubmit() async {
if(_formModel.details.isEmpty){ if (_formModel.details.isEmpty) {
if(!_addNewModel()) return; if (!_addNewModel()) return;
} }
_isLoading =true; _isLoading = true;
setState(() {}); setState(() {});
int status = await _gasRefillProvider.createModel( int status = await _gasRefillProvider.createModel(
@ -62,40 +63,34 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
host: _settingProvider.host, host: _settingProvider.host,
model: _formModel, model: _formModel,
); );
_isLoading =false; _isLoading = false;
setState(() {}); setState(() {});
if(status >= 200 && status < 300){ if (status >= 200 && status < 300) {
Fluttertoast.showToast( Fluttertoast.showToast(
msg: _subtitle.requestCompleteSuccessfully, msg: _subtitle.requestCompleteSuccessfully,
); );
Navigator.of(context).pop(); Navigator.of(context).pop();
}else{ } else {
String errorMessage = HttpStatusManger.getStatusMessage( String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle);
status: status, subtitle: _subtitle); ScaffoldMessenger.of(context).showSnackBar(SnackBar(
ScaffoldMessenger.of(context).showSnackBar( content: Text(errorMessage),
SnackBar( ));
content: Text(
errorMessage
),
)
);
} }
} }
bool _addNewModel(){ bool _addNewModel() {
_validate = true; _validate = true;
if(!_formKey.currentState.validate()){ if (!_formKey.currentState.validate()) {
setState(() {}); setState(() {});
return false; return false;
} }
_formKey.currentState.save(); _formKey.currentState.save();
if(!_currentDetails.validate()) { if (!_currentDetails.validate()) {
setState(() { }); setState(() {});
return false; return false;
} }
_formModel.details.insert(0, _currentDetails);
_formModel.details.insert(0,_currentDetails);
_validate = false; _validate = false;
Scrollable.ensureVisible(_DetailsKey.currentContext); Scrollable.ensureVisible(_DetailsKey.currentContext);
_requestedQuantityController.clear(); _requestedQuantityController.clear();
@ -109,12 +104,13 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
_requestedQuantityController.dispose(); _requestedQuantityController.dispose();
super.dispose(); super.dispose();
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_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);
_gasRefillProvider = Provider.of<GasRefillProvider>(context,listen: false); _gasRefillProvider = Provider.of<GasRefillProvider>(context, listen: false);
return Scaffold( return Scaffold(
key: _scaffoldKey, key: _scaffoldKey,
body: Form( body: Form(
@ -135,11 +131,7 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
child: Text( child: Text(
"Request Gas Refill", "Request Gas Refill",
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
),
), ),
), ),
), ),
@ -159,68 +151,101 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
// ), // ),
// const SizedBox(height: 8,), // const SizedBox(height: 8,),
ASubTitle(_subtitle.status), ASubTitle(_subtitle.status),
if(_validate && _formModel.status == null) if (_validate && _formModel.status == null)
ASubTitle(_subtitle.requiredWord,color: Colors.red,), ASubTitle(
const SizedBox(height: 4,), _subtitle.requiredWord,
GasStatusMenu( color: Colors.red,
initialValue: _formModel.status ?? const Lookup( ),
value: 1 const SizedBox(
height: 4,
), ),
onSelect: (status){ GasStatusMenu(
initialValue: _formModel.status ?? const Lookup(value: 1),
onSelect: (status) {
_formModel.status = status; _formModel.status = status;
}, },
), ),
const SizedBox(height: 8,), const SizedBox(
Divider(color: Theme.of(context).colorScheme.primary,), height: 8,
const SizedBox(height: 4,), ),
Divider(
color: Theme.of(context).colorScheme.primary,
),
const SizedBox(
height: 4,
),
const ASubTitle("Type"), const ASubTitle("Type"),
if(_validate && _currentDetails.type == null) if (_validate && _currentDetails.type == null)
ASubTitle(_subtitle.requiredWord,color: Colors.red,), ASubTitle(
const SizedBox(height: 4,), _subtitle.requiredWord,
color: Colors.red,
),
const SizedBox(
height: 4,
),
GasTypeMenu( GasTypeMenu(
initialValue: _currentDetails.type, initialValue: _currentDetails.type,
onSelect: (status){ onSelect: (status) {
_currentDetails.type = status; _currentDetails.type = status;
}, },
), ),
const SizedBox(height: 8,), const SizedBox(
height: 8,
),
const ASubTitle("Cylinder Size"), const ASubTitle("Cylinder Size"),
if(_validate && _currentDetails.cylinderSize == null) if (_validate && _currentDetails.cylinderSize == null)
ASubTitle(_subtitle.requiredWord,color: Colors.red,), ASubTitle(
const SizedBox(height: 4,), _subtitle.requiredWord,
color: Colors.red,
),
const SizedBox(
height: 4,
),
GasCylinderSizeMenu( GasCylinderSizeMenu(
initialValue: _currentDetails.cylinderSize, initialValue: _currentDetails.cylinderSize,
onSelect: (status){ onSelect: (status) {
_currentDetails.cylinderSize = status; _currentDetails.cylinderSize = status;
}, },
), ),
const SizedBox(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(_subtitle.requiredWord,color: Colors.red,), ASubTitle(
const SizedBox(height: 4,), _subtitle.requiredWord,
color: Colors.red,
),
const SizedBox(
height: 4,
),
GasCylinderTypesMenu( GasCylinderTypesMenu(
initialValue: _currentDetails.cylinderType, initialValue: _currentDetails.cylinderType,
onSelect: (status){ onSelect: (status) {
_currentDetails.cylinderType = status; _currentDetails.cylinderType = status;
}, },
), ),
const SizedBox(height: 8,), const SizedBox(
height: 8,
),
ASubTitle(_subtitle.quantity), ASubTitle(_subtitle.quantity),
if(_validate && _currentDetails.requestedQuantity == null) if (_validate && _currentDetails.requestedQuantity == null)
ASubTitle(_subtitle.requiredWord,color: Colors.red,), ASubTitle(
SizedBox(height: 4,), _subtitle.requiredWord,
color: Colors.red,
),
SizedBox(
height: 4,
),
ATextFormField( ATextFormField(
initialValue: (_currentDetails?.requestedQuantity ?? "").toString(), initialValue: (_currentDetails?.requestedQuantity ?? "").toString(),
textAlign: TextAlign.center, textAlign: TextAlign.center,
controller: _requestedQuantityController, controller: _requestedQuantityController,
style: Theme.of(context).textTheme.subtitle1, style: Theme.of(context).textTheme.subtitle1,
validator: (value) => validator: (value) => Validator.isNumeric(value) ? null : "allow numbers only",
Validator.isNumeric(value)
? null : "allow numbers only",
textInputType: TextInputType.number, textInputType: TextInputType.number,
onSaved: (value){ onSaved: (value) {
_currentDetails.requestedQuantity = double.tryParse(value); _currentDetails.requestedQuantity = double.tryParse(value);
}, },
), ),
@ -229,30 +254,30 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
text: _subtitle.add, text: _subtitle.add,
onPressed: _addNewModel, onPressed: _addNewModel,
), ),
if(_formModel.details.isNotEmpty) if (_formModel.details.isNotEmpty) const ASubTitle("Gas Requests"),
const ASubTitle("Gas Requests"),
ListView.builder( ListView.builder(
key: _DetailsKey, key: _DetailsKey,
shrinkWrap: true, shrinkWrap: true,
physics: const ClampingScrollPhysics(), physics: const ClampingScrollPhysics(),
itemCount: _formModel.details.length, itemCount: _formModel.details.length,
itemBuilder: (context,index){ itemBuilder: (context, index) {
final model = _formModel.details[index]; final model = _formModel.details[index];
return GasRefillCreateDetailsItem( return GasRefillCreateDetailsItem(
model: model, model: model,
onDelete: (){ onDelete: () {
_formModel.details.remove(model); _formModel.details.remove(model);
setState(() {}); setState(() {});
}, },
); );
} }),
),
const SizedBox(height: 16), const SizedBox(height: 16),
AButton( AButton(
text: _subtitle.submit, text: _subtitle.submit,
onPressed: _onSubmit, onPressed: _onSubmit,
), ),
const SizedBox(height: 100,) const SizedBox(
height: 100,
)
], ],
), ),
), ),
@ -262,4 +287,3 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
); );
} }
} }

@ -9,6 +9,7 @@ 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/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';
class TrackGasRefillPage extends StatefulWidget { class TrackGasRefillPage extends StatefulWidget {
static const String id = "/track-gas-refill"; static const String id = "/track-gas-refill";
@ -18,8 +19,7 @@ class TrackGasRefillPage extends StatefulWidget {
State<TrackGasRefillPage> createState() => _TrackGasRefillPageState(); State<TrackGasRefillPage> createState() => _TrackGasRefillPageState();
} }
class _TrackGasRefillPageState extends State<TrackGasRefillPage> class _TrackGasRefillPageState extends State<TrackGasRefillPage> with TickerProviderStateMixin {
with TickerProviderStateMixin{
GasRefillProvider _gasRefillProvider; GasRefillProvider _gasRefillProvider;
UserProvider _userProvider; UserProvider _userProvider;
SettingProvider _settingProvider; SettingProvider _settingProvider;
@ -48,8 +48,8 @@ class _TrackGasRefillPageState extends State<TrackGasRefillPage>
Column( Column(
children: [ children: [
Container( Container(
color:AColors.white, color: AColors.white,
padding: const EdgeInsets.symmetric(horizontal: 0,vertical: 4), padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4),
child: Column( child: Column(
children: [ children: [
Row( Row(
@ -59,17 +59,15 @@ class _TrackGasRefillPageState extends State<TrackGasRefillPage>
child: Center( child: Center(
child: Text( child: Text(
_subtitle.serviceRequests, _subtitle.serviceRequests,
style: Theme.of(context).textTheme.headline6.copyWith( style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.grey3A, fontStyle: FontStyle.italic),
color: AColors.grey3A,
fontStyle: FontStyle.italic
),
), ),
), ),
), ),
const SizedBox(width: 48,) const SizedBox(
width: 48,
)
], ],
), ),
], ],
), ),
), ),
@ -87,7 +85,6 @@ class _TrackGasRefillPageState extends State<TrackGasRefillPage>
), ),
], ],
), ),
], ],
), ),
), ),

@ -6,6 +6,7 @@ import 'package:test_sa/views/pages/user/requests/future_request_service_details
import 'package:test_sa/views/widgets/loaders/lazy_loading.dart'; import 'package:test_sa/views/widgets/loaders/lazy_loading.dart';
import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; import 'package:test_sa/views/widgets/loaders/no_item_found.dart';
import 'package:test_sa/views/widgets/notifications/notification_item.dart'; import 'package:test_sa/views/widgets/notifications/notification_item.dart';
class NotificationsList extends StatelessWidget { class NotificationsList extends StatelessWidget {
final List<AppNotification> notifications; final List<AppNotification> notifications;
final bool nextPage; final bool nextPage;
@ -16,8 +17,10 @@ class NotificationsList extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Subtitle _subtitle = AppLocalization.of(context).subtitle; Subtitle _subtitle = AppLocalization.of(context).subtitle;
if(notifications.length == 0){ if (notifications.length == 0) {
return NoItemFound(message: _subtitle.notificationsNotFound,); return NoItemFound(
message: _subtitle.notificationsNotFound,
);
} }
return LazyLoading( return LazyLoading(
nextPage: nextPage, nextPage: nextPage,
@ -25,19 +28,15 @@ class NotificationsList extends StatelessWidget {
child: ListView.builder( child: ListView.builder(
physics: BouncingScrollPhysics(), physics: BouncingScrollPhysics(),
itemCount: notifications.length, itemCount: notifications.length,
padding: EdgeInsets.symmetric(horizontal: 16,vertical: 8), padding: EdgeInsets.symmetric(horizontal: 16, vertical: 8),
itemBuilder: (context,itemIndex){ itemBuilder: (context, itemIndex) {
return NotificationItem( return NotificationItem(
notification: notifications[itemIndex], notification: notifications[itemIndex],
onPressed: (notification){ onPressed: (notification) {
Navigator.of(context).pushNamed( Navigator.of(context).pushNamed(FutureRequestServiceDetails.id, arguments: notification.requestId);
FutureRequestServiceDetails.id,
arguments: notification.requestId
);
}, },
); );
} }),
),
); );
} }
} }

@ -9,14 +9,14 @@ import 'package:test_sa/views/app_style/colors.dart';
import 'package:test_sa/views/pages/user/notifications/notifications_list.dart'; import 'package:test_sa/views/pages/user/notifications/notifications_list.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/loaders/loading_manager.dart'; 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();
} }
class _NotificationsPageState extends State<NotificationsPage> class _NotificationsPageState extends State<NotificationsPage> with TickerProviderStateMixin {
with TickerProviderStateMixin{
NotificationsProvider _notificationsProvider; NotificationsProvider _notificationsProvider;
UserProvider _userProvider; UserProvider _userProvider;
SettingProvider _settingProvider; SettingProvider _settingProvider;
@ -46,8 +46,8 @@ class _NotificationsPageState extends State<NotificationsPage>
Column( Column(
children: [ children: [
Container( Container(
color:AColors.primaryColor, color: AColors.primaryColor,
padding: const EdgeInsets.symmetric(horizontal: 0,vertical: 4), padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4),
child: Column( child: Column(
children: [ children: [
Row( Row(
@ -57,17 +57,15 @@ class _NotificationsPageState extends State<NotificationsPage>
child: Center( child: Center(
child: Text( child: Text(
_subtitle.notifications, _subtitle.notifications,
style: Theme.of(context).textTheme.headline6.copyWith( style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic),
color: AColors.white,
fontStyle: FontStyle.italic
),
), ),
), ),
), ),
SizedBox(width: 48,) SizedBox(
width: 48,
)
], ],
), ),
], ],
), ),
), ),
@ -86,7 +84,6 @@ class _NotificationsPageState extends State<NotificationsPage>
), ),
], ],
), ),
], ],
), ),
), ),

@ -16,6 +16,7 @@ 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/departments/department_button.dart';
import 'package:test_sa/views/widgets/hospitals/hospital_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';
class ProfilePage extends StatefulWidget { class ProfilePage extends StatefulWidget {
static final String id = "/user/profile"; static final String id = "/user/profile";
@override @override
@ -38,13 +39,13 @@ class _ProfilePageState extends State<ProfilePage> {
_width = MediaQuery.of(context).size.width; _width = MediaQuery.of(context).size.width;
_height = MediaQuery.of(context).size.height; _height = MediaQuery.of(context).size.height;
Subtitle _subtitle = AppLocalization.of(context).subtitle; Subtitle _subtitle = AppLocalization.of(context).subtitle;
if(_firstTime){ if (_firstTime) {
_user = User.fromJson(_userProvider.user.toJson()); _user = User.fromJson(_userProvider.user.toJson());
_firstTime = false; _firstTime = false;
} }
return Scaffold( return Scaffold(
key: _scaffoldKey, key: _scaffoldKey,
body:LoadingManager( body: LoadingManager(
isLoading: _userProvider.isLoading, isLoading: _userProvider.isLoading,
isFailedLoading: false, isFailedLoading: false,
stateCode: 200, stateCode: 200,
@ -60,23 +61,19 @@ class _ProfilePageState extends State<ProfilePage> {
Hero( Hero(
tag: "logo", tag: "logo",
child: Image( child: Image(
height: _height/4, height: _height / 4,
image: AssetImage("assets/images/logo.png"), image: AssetImage("assets/images/logo.png"),
), ),
), ),
Container( Container(
padding: EdgeInsets.symmetric(horizontal: 16,vertical: 16), padding: EdgeInsets.symmetric(horizontal: 16, vertical: 16),
margin: EdgeInsets.symmetric(horizontal: 16), margin: EdgeInsets.symmetric(horizontal: 16),
decoration: BoxDecoration( decoration: BoxDecoration(color: AColors.primaryColor, borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), boxShadow: [
color: AColors.primaryColor,
borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)),
boxShadow: [
BoxShadow( BoxShadow(
color: AColors.grey, color: AColors.grey,
offset: Offset(0,-1), offset: Offset(0, -1),
) )
] ]),
),
child: Column( child: Column(
children: [ children: [
ATextFormField( ATextFormField(
@ -85,13 +82,14 @@ class _ProfilePageState extends State<ProfilePage> {
enable: false, enable: false,
prefixIconData: Icons.account_circle, prefixIconData: Icons.account_circle,
style: Theme.of(context).textTheme.headline6, style: Theme.of(context).textTheme.headline6,
validator: (value) => Validator.hasValue(value) validator: (value) => Validator.hasValue(value) ? null : _subtitle.nameValidateMessage,
? null : _subtitle.nameValidateMessage, onSaved: (value) {
onSaved: (value){
_user.userName = value; _user.userName = value;
}, },
), ),
SizedBox(height: 8,), SizedBox(
height: 8,
),
ATextFormField( ATextFormField(
initialValue: _user.email, initialValue: _user.email,
hintText: _subtitle.email, hintText: _subtitle.email,
@ -99,110 +97,105 @@ class _ProfilePageState extends State<ProfilePage> {
prefixIconData: Icons.email, prefixIconData: Icons.email,
textInputType: TextInputType.emailAddress, textInputType: TextInputType.emailAddress,
style: Theme.of(context).textTheme.headline6, style: Theme.of(context).textTheme.headline6,
validator: (value) => Validator.isEmail(value) validator: (value) => Validator.isEmail(value) ? null : _subtitle.emailValidateMessage,
? null : _subtitle.emailValidateMessage, onSaved: (value) {
onSaved: (value){
_user.email = value; _user.email = value;
}, },
), ),
SizedBox(height: 8,), SizedBox(
height: 8,
),
AbsorbPointer( AbsorbPointer(
child: HospitalButton( child: HospitalButton(
hospital: _user.hospital, hospital: _user.hospital,
onHospitalPick: (hospital){ onHospitalPick: (hospital) {
_user.hospital = hospital; _user.hospital = hospital;
setState(() {}); setState(() {});
}, },
), ),
), ),
SizedBox(height: 8,), SizedBox(
height: 8,
),
DepartmentButton( DepartmentButton(
department: _user.department, department: _user.department,
onDepartmentPick: (department){ onDepartmentPick: (department) {
_user.department = department; _user.department = department;
setState(() {}); setState(() {});
}, },
), ),
SizedBox(height: 8,), SizedBox(
height: 8,
),
ATextFormField( ATextFormField(
initialValue: _user.phoneNumber, initialValue: _user.phoneNumber,
hintText: _subtitle.phoneNumber, hintText: _subtitle.phoneNumber,
style: Theme.of(context).textTheme.headline6, style: Theme.of(context).textTheme.headline6,
prefixIconData: Icons.phone_android, prefixIconData: Icons.phone_android,
validator: (value) => validator: (value) => Validator.isPhoneNumber(value) ? null : _subtitle.phoneNumberValidateMessage,
Validator.isPhoneNumber(value) ? null : _subtitle.phoneNumberValidateMessage,
textInputType: TextInputType.phone, textInputType: TextInputType.phone,
onSaved: (value){ onSaved: (value) {
_user.phoneNumber = value; _user.phoneNumber = value;
}, },
), ),
SizedBox(height: 8,), SizedBox(
height: 8,
),
ATextFormField( ATextFormField(
initialValue: _user.whatsApp, initialValue: _user.whatsApp,
hintText: _subtitle.whatsApp, hintText: _subtitle.whatsApp,
style: Theme.of(context).textTheme.headline6, style: Theme.of(context).textTheme.headline6,
prefixIconData: FontAwesomeIcons.whatsapp, prefixIconData: FontAwesomeIcons.whatsapp,
prefixIconSize: 36, prefixIconSize: 36,
validator: (value) => validator: (value) => Validator.isPhoneNumber(value) ? null : _subtitle.phoneNumberValidateMessage,
Validator.isPhoneNumber(value) ? null : _subtitle.phoneNumberValidateMessage,
textInputType: TextInputType.phone, textInputType: TextInputType.phone,
onSaved: (value){ onSaved: (value) {
_user.whatsApp = value; _user.whatsApp = value;
}, },
), ),
], ],
), ),
), ),
SizedBox(height: 16,), SizedBox(
height: 16,
),
Center( Center(
child: SizedBox( child: SizedBox(
height: _width / 8, height: _width / 8,
width: _width/1.2, width: _width / 1.2,
child: AButton( child: AButton(
text: _subtitle.update, text: _subtitle.update,
onPressed: () async { onPressed: () async {
if(!_formKey.currentState.validate()) if (!_formKey.currentState.validate()) return;
return;
_formKey.currentState.save(); _formKey.currentState.save();
if(_user.department?.id == null){ if (_user.department?.id == null) {
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(context).showSnackBar(SnackBar(
SnackBar( content: Text(_subtitle.unitRequired),
content: Text( ));
_subtitle.unitRequired
),
)
);
return; return;
} }
int status = await _userProvider.updateProfile( int status = await _userProvider.updateProfile(
user: _user, user: _user,
host: _settingProvider.host, host: _settingProvider.host,
); );
if(status >= 200 && status < 300){ if (status >= 200 && status < 300) {
_settingProvider.setUser(_userProvider.user); _settingProvider.setUser(_userProvider.user);
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(context).showSnackBar(SnackBar(
SnackBar( content: Text(_subtitle.requestCompleteSuccessfully),
content: Text( ));
_subtitle.requestCompleteSuccessfully } else {
), String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle);
) ScaffoldMessenger.of(context).showSnackBar(SnackBar(
); content: Text(errorMessage),
}else{ ));
String errorMessage = HttpStatusManger.getStatusMessage(
status: status, subtitle: _subtitle);
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
errorMessage
),
)
);
} }
}, },
), ),
), ),
), ),
SizedBox(height: 32,), SizedBox(
height: 32,
),
], ],
), ),
), ),

@ -16,6 +16,7 @@ import 'package:test_sa/views/widgets/buttons/app_back_button.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/issues/report_issue_item.dart'; import 'package:test_sa/views/widgets/issues/report_issue_item.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
class ReportIssuesPage extends StatefulWidget { class ReportIssuesPage extends StatefulWidget {
static final String id = "/report-issue"; static final String id = "/report-issue";
final ServiceRequest serviceRequest; final ServiceRequest serviceRequest;
@ -64,18 +65,14 @@ class _ReportIssuesPageState extends State<ReportIssuesPage> {
), ),
child: Text( child: Text(
_subtitle.reportIssue, _subtitle.reportIssue,
style: Theme.of(context).textTheme.headline5.copyWith( style: Theme.of(context).textTheme.headline5.copyWith(color: AColors.cyan, fontWeight: FontWeight.bold),
color: AColors.cyan,
fontWeight: FontWeight.bold
),
), ),
), ),
), ),
Image( Image(
height: _height/8, height: _height / 8,
image: AssetImage("assets/images/logo.png"), image: AssetImage("assets/images/logo.png"),
), ),
Container( Container(
padding: EdgeInsets.symmetric( padding: EdgeInsets.symmetric(
horizontal: 16, horizontal: 16,
@ -90,10 +87,9 @@ class _ReportIssuesPageState extends State<ReportIssuesPage> {
boxShadow: [ boxShadow: [
BoxShadow( BoxShadow(
color: AColors.grey, color: AColors.grey,
offset: Offset(0,-1), offset: Offset(0, -1),
) )
] ]),
),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
@ -102,32 +98,30 @@ class _ReportIssuesPageState extends State<ReportIssuesPage> {
hintText: _subtitle.title, hintText: _subtitle.title,
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: Theme.of(context).textTheme.headline6, style: Theme.of(context).textTheme.headline6,
validator: (value) => validator: (value) => Validator.hasValue(value) ? null : _subtitle.titleValidateMessage,
Validator.hasValue(value)
? null : _subtitle.titleValidateMessage,
textInputType: TextInputType.name, textInputType: TextInputType.name,
onSaved: (value){ onSaved: (value) {
_issue.title = value; _issue.title = value;
}, },
), ),
SizedBox(height: 8,), SizedBox(
height: 8,
),
Column( Column(
children: List.generate( children: List.generate(
_issues.length, _issues.length,
(index) => ReportIssueItem( (index) => ReportIssueItem(
isSelected: _issue.reports.contains(index), isSelected: _issue.reports.contains(index),
issueInfo: _issues[index], issueInfo: _issues[index],
onChange: (info,value){ onChange: (info, value) {
if(value){ if (value) {
_issue.reports.add(index); _issue.reports.add(index);
} else { } else {
_issue.reports.remove(index); _issue.reports.remove(index);
} }
setState(() {}); setState(() {});
}, },
) ))),
)
),
Padding( Padding(
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
child: Text( child: Text(
@ -139,7 +133,7 @@ class _ReportIssuesPageState extends State<ReportIssuesPage> {
hintText: _subtitle.description, hintText: _subtitle.description,
style: Theme.of(context).textTheme.subtitle1, style: Theme.of(context).textTheme.subtitle1,
textInputType: TextInputType.multiline, textInputType: TextInputType.multiline,
onSaved: (value){ onSaved: (value) {
_issue.description = value; _issue.description = value;
}, },
), ),
@ -148,20 +142,19 @@ class _ReportIssuesPageState extends State<ReportIssuesPage> {
child: AButton( child: AButton(
text: _subtitle.submit, text: _subtitle.submit,
onPressed: () async { onPressed: () async {
if(!_formKey.currentState.validate()) if (!_formKey.currentState.validate()) return;
return;
_formKey.currentState.save(); _formKey.currentState.save();
_issue.serviceRequestId = widget.serviceRequest.id; _issue.serviceRequestId = widget.serviceRequest.id;
_isLoading =true; _isLoading = true;
setState(() {}); setState(() {});
int status = await _serviceRequestsProvider.createIssueReport( int status = await _serviceRequestsProvider.createIssueReport(
user: _userProvider.user, user: _userProvider.user,
host: _settingProvider.host, host: _settingProvider.host,
issue: _issue, issue: _issue,
); );
_isLoading =false; _isLoading = false;
setState(() {}); setState(() {});
if(status >= 200 && status < 300){ if (status >= 200 && status < 300) {
Fluttertoast.showToast( Fluttertoast.showToast(
msg: _subtitle.requestCompleteSuccessfully, msg: _subtitle.requestCompleteSuccessfully,
); );

@ -31,6 +31,7 @@ import 'package:test_sa/views/widgets/status/service_request/service_request_pri
import 'package:test_sa/views/widgets/status/service_request/service_request_through_mune.dart'; import 'package:test_sa/views/widgets/status/service_request/service_request_through_mune.dart';
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';
class CreateRequestPage extends StatefulWidget { class CreateRequestPage extends StatefulWidget {
static final String id = "/create-request"; static final String id = "/create-request";
@ -136,40 +137,56 @@ class _CreateRequestPageState extends State<CreateRequestPage> {
setState(() {}); setState(() {});
}, },
), ),
const SizedBox(height: 8,), const SizedBox(
height: 8,
),
const ASubTitle("Priority"), const ASubTitle("Priority"),
const SizedBox(height: 4,), const SizedBox(
height: 4,
),
ServiceRequestPriorityMenu( ServiceRequestPriorityMenu(
initialValue: _serviceRequest.priority, initialValue: _serviceRequest.priority,
onSelect: (status){ onSelect: (status) {
_serviceRequest.priority = status; _serviceRequest.priority = status;
}, },
), ),
const SizedBox(height: 8,), const SizedBox(
height: 8,
),
const ASubTitle("Defect Type"), const ASubTitle("Defect Type"),
const SizedBox(height: 4,), const SizedBox(
height: 4,
),
ServiceRequestDefectTypesMenu( ServiceRequestDefectTypesMenu(
initialValue: _serviceRequest.defectType, initialValue: _serviceRequest.defectType,
onSelect: (status){ onSelect: (status) {
_serviceRequest.defectType = status; _serviceRequest.defectType = status;
}, },
), ),
12.height, 12.height,
const SizedBox(height: 8,), const SizedBox(
height: 8,
),
const ASubTitle("Type"), const ASubTitle("Type"),
const SizedBox(height: 4,), const SizedBox(
height: 4,
),
ServiceRequestTypesMenu( ServiceRequestTypesMenu(
initialValue: _serviceRequest.type, initialValue: _serviceRequest.type,
onSelect: (status){ onSelect: (status) {
_serviceRequest.type = status; _serviceRequest.type = status;
}, },
), ),
const SizedBox(height: 8,), const SizedBox(
height: 8,
),
const ASubTitle("Through"), const ASubTitle("Through"),
const SizedBox(height: 4,), const SizedBox(
height: 4,
),
ServiceRequestedThroughMenu( ServiceRequestedThroughMenu(
initialValue: const Lookup(name: "App",value: 3), initialValue: const Lookup(name: "App", value: 3),
onSelect: (status){ onSelect: (status) {
_serviceRequest.requestedThrough = status; _serviceRequest.requestedThrough = status;
}, },
), ),
@ -210,9 +227,8 @@ class _CreateRequestPageState extends State<CreateRequestPage> {
_serviceRequest.deviceId = _device?.id ?? ""; _serviceRequest.deviceId = _device?.id ?? "";
_isLoading = true; _isLoading = true;
setState(() {}); setState(() {});
_serviceRequest.devicePhotos = _deviceImages.map( _serviceRequest.devicePhotos = _deviceImages.map((e) => "${e.path.split("/").last}|${base64Encode(e.readAsBytesSync())}").toList();
(e) => "${e.path.split("/").last}|${base64Encode(e.readAsBytesSync())}").toList(); if (_serviceRequest.audio != null) {
if(_serviceRequest.audio != null){
final file = File(_serviceRequest.audio); final file = File(_serviceRequest.audio);
_serviceRequest.audio = "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}"; _serviceRequest.audio = "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}";
} }

@ -9,6 +9,7 @@ import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/views/pages/user/requests/request_details.dart'; import 'package:test_sa/views/pages/user/requests/request_details.dart';
import 'package:test_sa/views/widgets/loaders/app_loading.dart'; import 'package:test_sa/views/widgets/loaders/app_loading.dart';
import 'package:test_sa/views/widgets/loaders/failed_loading.dart'; import 'package:test_sa/views/widgets/loaders/failed_loading.dart';
class FutureRequestServiceDetails extends StatefulWidget { class FutureRequestServiceDetails extends StatefulWidget {
static final String id = "/service-request-details"; static final String id = "/service-request-details";
@ -17,7 +18,6 @@ class FutureRequestServiceDetails extends StatefulWidget {
} }
class _FutureRequestServiceDetailsState extends State<FutureRequestServiceDetails> { class _FutureRequestServiceDetailsState extends State<FutureRequestServiceDetails> {
UserProvider _userProvider; UserProvider _userProvider;
SettingProvider _settingProvider; SettingProvider _settingProvider;
@override @override
@ -28,19 +28,16 @@ class _FutureRequestServiceDetailsState extends State<FutureRequestServiceDetail
Subtitle _subtitle = AppLocalization.of(context).subtitle; Subtitle _subtitle = AppLocalization.of(context).subtitle;
return Scaffold( return Scaffold(
body: FutureBuilder<ServiceRequest>( body: FutureBuilder<ServiceRequest>(
future: ServiceRequestsProvider().getSingleServiceRequest( future: ServiceRequestsProvider().getSingleServiceRequest(requestId: requestId, user: _userProvider.user, host: _settingProvider.host, subtitle: _subtitle),
requestId: requestId, builder: (BuildContext context, AsyncSnapshot<ServiceRequest> snapshot) {
user: _userProvider.user, if (snapshot.hasError)
host: _settingProvider.host,
subtitle: _subtitle
),
builder: (BuildContext context, AsyncSnapshot<ServiceRequest> snapshot){
if(snapshot.hasError)
return FailedLoading( return FailedLoading(
message: snapshot.error.toString(), message: snapshot.error.toString(),
onReload: (){setState(() {});}, onReload: () {
setState(() {});
},
); );
if(snapshot.hasData){ if (snapshot.hasData) {
return RequestDetailsPage( return RequestDetailsPage(
serviceRequest: snapshot.data, serviceRequest: snapshot.data,
); );

@ -37,18 +37,17 @@ import 'package:test_sa/views/widgets/status/report/service_report_type.dart';
import 'package:test_sa/views/widgets/status/report/service_status.dart'; import 'package:test_sa/views/widgets/status/report/service_status.dart';
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';
class CreateServiceReport extends StatefulWidget { class CreateServiceReport extends StatefulWidget {
static final String id = "/create-service-report"; static final String id = "/create-service-report";
final ServiceRequest request ; final ServiceRequest request;
const CreateServiceReport({Key key, this.request}) : super(key: key); const CreateServiceReport({Key key, this.request}) : super(key: key);
@override @override
_CreateServiceReportState createState() => _CreateServiceReportState(); _CreateServiceReportState createState() => _CreateServiceReportState();
} }
class _CreateServiceReportState extends State<CreateServiceReport> with TickerProviderStateMixin{ class _CreateServiceReportState extends State<CreateServiceReport> with TickerProviderStateMixin {
UserProvider _userProvider; UserProvider _userProvider;
SettingProvider _settingProvider; SettingProvider _settingProvider;
ServiceRequestsProvider _serviceRequestsProvider; ServiceRequestsProvider _serviceRequestsProvider;
@ -70,8 +69,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
visitDate: DateTime.now(), visitDate: DateTime.now(),
//type: const Lookup(value: 2), //type: const Lookup(value: 2),
device: widget.request.device, device: widget.request.device,
parts: [] parts: []);
);
super.initState(); super.initState();
} }
@ -81,6 +79,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
_workPreformedController.dispose(); _workPreformedController.dispose();
super.dispose(); super.dispose();
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
@ -102,43 +101,46 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
ListView( ListView(
children: [ children: [
//AppNameBar(), //AppNameBar(),
const SizedBox(height: 16,), const SizedBox(
height: 16,
),
Center( Center(
child: Padding( child: Padding(
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
child: Text( child: Text(
_subtitle.newServiceReport, _subtitle.newServiceReport,
style: Theme.of(context).textTheme.headline5.copyWith( style: Theme.of(context).textTheme.headline5.copyWith(color: AColors.cyan, fontSize: 28, fontWeight: FontWeight.bold),
color: AColors.cyan,
fontSize: 28,
fontWeight: FontWeight.bold
),
), ),
), ),
), ),
Container( Container(
padding: const EdgeInsets.symmetric(horizontal: 16), padding: const EdgeInsets.symmetric(horizontal: 16),
margin: const EdgeInsets.symmetric(horizontal: 16,vertical: 16), margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 16),
decoration: BoxDecoration( decoration: BoxDecoration(color: AColors.grey, borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), boxShadow: [
color: AColors.grey,
borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)),
boxShadow: [
const BoxShadow( const BoxShadow(
color: AColors.grey, color: AColors.grey,
offset: Offset(0,-1), offset: Offset(0, -1),
) )
] ]),
),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
const SizedBox(height: 8,), const SizedBox(
height: 8,
),
Wrap( Wrap(
spacing: 10, spacing: 10,
children: [ children: [
ASubTitle("${_subtitle.callId}: ${widget.request.requestCode}",font: 14,), ASubTitle(
widget.request.deviceSerialNumber == null ? const SizedBox(): "${_subtitle.callId}: ${widget.request.requestCode}",
ASubTitle("${_subtitle.deviceSN}: ${widget.request.deviceSerialNumber}",font: 14,), font: 14,
),
widget.request.deviceSerialNumber == null
? const SizedBox()
: ASubTitle(
"${_subtitle.deviceSN}: ${widget.request.deviceSerialNumber}",
font: 14,
),
Text( Text(
"${_subtitle.customer}: ${widget.request.hospitalName}", "${_subtitle.customer}: ${widget.request.hospitalName}",
style: Theme.of(context).textTheme.subtitle1.copyWith( style: Theme.of(context).textTheme.subtitle1.copyWith(
@ -147,7 +149,6 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
), ),
textScaleFactor: AppStyle.getScaleFactor(context), textScaleFactor: AppStyle.getScaleFactor(context),
) )
], ],
), ),
const Divider(), const Divider(),
@ -181,9 +182,12 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle(_subtitle.visitDate), ASubTitle(_subtitle.visitDate),
_validate && _serviceReport.visitDate == null ? _validate && _serviceReport.visitDate == null
ASubTitle(_subtitle.requiredWord,color: Colors.red,): ? ASubTitle(
const SizedBox.shrink(), _subtitle.requiredWord,
color: Colors.red,
)
: const SizedBox.shrink(),
Row( Row(
children: [ children: [
Expanded( Expanded(
@ -191,7 +195,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
date: _serviceReport.visitDate, date: _serviceReport.visitDate,
from: DateTime.now().subtract(const Duration(days: 365)), from: DateTime.now().subtract(const Duration(days: 365)),
to: DateTime.now().add(const Duration(days: 365)), to: DateTime.now().add(const Duration(days: 365)),
onDatePicker: (date){ onDatePicker: (date) {
_serviceReport.visitDate = date; _serviceReport.visitDate = date;
setState(() {}); setState(() {});
}, },
@ -202,10 +206,11 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
], ],
), ),
), ),
], ],
), ),
const SizedBox(height: 8,), const SizedBox(
height: 8,
),
// device sn // device sn
Visibility( Visibility(
visible: widget.request.deviceSerialNumber == null, visible: widget.request.deviceSerialNumber == null,
@ -213,33 +218,47 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle(_subtitle.deviceSN), ASubTitle(_subtitle.deviceSN),
_validate && _serviceReport.device?.id == null ? _validate && _serviceReport.device?.id == null
ASubTitle(_subtitle.requiredWord,color: Colors.red,): ? ASubTitle(
const SizedBox.shrink(), _subtitle.requiredWord,
color: Colors.red,
)
: const SizedBox.shrink(),
AutoCompleteDeviceField( AutoCompleteDeviceField(
hospitalId: widget.request.hospitalId, hospitalId: widget.request.hospitalId,
initialValue: _serviceReport.device, initialValue: _serviceReport.device,
onPick: (id){ onPick: (id) {
_serviceReport.device.id = id; _serviceReport.device.id = id;
}, },
), ),
const SizedBox(height: 8,), const SizedBox(
height: 8,
),
], ],
), ),
), ),
const SizedBox(height: 8,), const SizedBox(
height: 8,
),
ASubTitle(_subtitle.serviceType), ASubTitle(_subtitle.serviceType),
_validate && _serviceReport.assetType == null ? _validate && _serviceReport.assetType == null
ASubTitle(_subtitle.requiredWord,color: Colors.red,): ? ASubTitle(
const SizedBox.shrink(), _subtitle.requiredWord,
const SizedBox(height: 4,), color: Colors.red,
)
: const SizedBox.shrink(),
const SizedBox(
height: 4,
),
ServiceAssetTypeMenu( ServiceAssetTypeMenu(
initialValue: _serviceReport.assetType, initialValue: _serviceReport.assetType,
onSelect: (status){ onSelect: (status) {
_serviceReport.assetType = status; _serviceReport.assetType = status;
}, },
), ),
const SizedBox(height: 8,), const SizedBox(
height: 8,
),
// Report status and Service Type // Report status and Service Type
Row( Row(
children: [ children: [
@ -249,40 +268,51 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle(_subtitle.reportStatus), ASubTitle(_subtitle.reportStatus),
_validate && _serviceReport.status == null ? _validate && _serviceReport.status == null
ASubTitle(_subtitle.requiredWord,color: Colors.red,): ? ASubTitle(
const SizedBox.shrink(), _subtitle.requiredWord,
const SizedBox(height: 4,), color: Colors.red,
)
: const SizedBox.shrink(),
const SizedBox(
height: 4,
),
ServiceReportStatusMenu( ServiceReportStatusMenu(
report: _serviceReport, report: _serviceReport,
onSelect: (status){ onSelect: (status) {
_serviceReport.status = status; _serviceReport.status = status;
}, },
), ),
], ],
), ),
), ),
const SizedBox(width: 8,), const SizedBox(
width: 8,
),
// Provider.of<ServiceReportLastCallsProvider>(context).isLoading == null // Provider.of<ServiceReportLastCallsProvider>(context).isLoading == null
// ? const SizedBox.shrink(): // ? const SizedBox.shrink():
// Call's last Situation // Call's last Situation
Consumer<ServiceReportLastCallsProvider>( Consumer<ServiceReportLastCallsProvider>(
builder: (_, provider, __) { builder: (_, provider, __) {
if(provider.isLoading == null) return const SizedBox.shrink(); if (provider.isLoading == null) return const SizedBox.shrink();
return Expanded( return Expanded(
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle(_subtitle.callLastSituation), ASubTitle(_subtitle.callLastSituation),
_validate && _serviceReport.callLastSituation == null ? _validate && _serviceReport.callLastSituation == null
ASubTitle(_subtitle.requiredWord,color: Colors.red,): ? ASubTitle(
const SizedBox.shrink(), _subtitle.requiredWord,
const SizedBox(height: 4,), color: Colors.red,
)
: const SizedBox.shrink(),
const SizedBox(
height: 4,
),
ServiceReportLastCallsMenu( ServiceReportLastCallsMenu(
report: _serviceReport, report: _serviceReport,
onSelect: (status){ onSelect: (status) {
if(status?.value == 12 if (status?.value == 12 || _serviceReport.callLastSituation?.value == 12) {
|| _serviceReport.callLastSituation?.value == 12){
_serviceReport.callLastSituation = status; _serviceReport.callLastSituation = status;
setState(() {}); setState(() {});
} else { } else {
@ -297,61 +327,75 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
), ),
], ],
), ),
SizedBox(height: 8 * AppStyle.getScaleFactor(context),), SizedBox(
height: 8 * AppStyle.getScaleFactor(context),
),
const ASubTitle("Assign Employee"), const ASubTitle("Assign Employee"),
const SizedBox(height: 8,), const SizedBox(
_validate && _serviceReport.engineer == null ? height: 8,
ASubTitle(_subtitle.requiredWord,color: Colors.red,): ),
const SizedBox.shrink(), _validate && _serviceReport.engineer == null
const SizedBox(height: 4,), ? ASubTitle(
_subtitle.requiredWord,
color: Colors.red,
)
: const SizedBox.shrink(),
const SizedBox(
height: 4,
),
EngineersMenu( EngineersMenu(
initialValue: _serviceReport.engineer, initialValue: _serviceReport.engineer,
onSelect: (engineer){ onSelect: (engineer) {
_serviceReport.engineer = engineer; _serviceReport.engineer = engineer;
}, },
), ),
const SizedBox(height: 8,), const SizedBox(
height: 8,
),
// invoice number & code // invoice number & code
_serviceReport.callLastSituation?.id != 12 ? const SizedBox.shrink(): _serviceReport.callLastSituation?.id != 12
Row( ? const SizedBox.shrink()
: Row(
children: [ children: [
Expanded( Expanded(
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle(_subtitle.invoiceNumber), ASubTitle(_subtitle.invoiceNumber),
const SizedBox(height: 8,), const SizedBox(
height: 8,
),
ATextFormField( ATextFormField(
initialValue: _serviceReport?.invoiceNumber, initialValue: _serviceReport?.invoiceNumber,
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: Theme.of(context).textTheme.subtitle1, style: Theme.of(context).textTheme.subtitle1,
validator: (value) => validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord,
Validator.hasValue(value)
? null : _subtitle.requiredWord,
textInputType: TextInputType.number, textInputType: TextInputType.number,
onSaved: (value){ onSaved: (value) {
_serviceReport.invoiceNumber = value; _serviceReport.invoiceNumber = value;
}, },
), ),
], ],
), ),
), ),
const SizedBox(width: 8,), const SizedBox(
width: 8,
),
Expanded( Expanded(
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle(_subtitle.invoiceCode), ASubTitle(_subtitle.invoiceCode),
const SizedBox(height: 4,), const SizedBox(
height: 4,
),
ATextFormField( ATextFormField(
initialValue: _serviceReport?.invoiceCode, initialValue: _serviceReport?.invoiceCode,
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: Theme.of(context).textTheme.subtitle1, style: Theme.of(context).textTheme.subtitle1,
validator: (value) => validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord,
Validator.hasValue(value)
? null : _subtitle.requiredWord,
textInputType: TextInputType.text, textInputType: TextInputType.text,
onSaved: (value){ onSaved: (value) {
_serviceReport.invoiceCode = value; _serviceReport.invoiceCode = value;
}, },
), ),
@ -421,7 +465,9 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
// ), // ),
// const SizedBox(height: 8,), // const SizedBox(height: 8,),
const SizedBox(height: 8,), const SizedBox(
height: 8,
),
Row( Row(
children: [ children: [
// reasons // reasons
@ -430,17 +476,21 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle(_subtitle.reasons), ASubTitle(_subtitle.reasons),
const SizedBox(height: 4,), const SizedBox(
height: 4,
),
ServiceReportReasonsMenu( ServiceReportReasonsMenu(
initialValue: _serviceReport.reason, initialValue: _serviceReport.reason,
onSelect: (status){ onSelect: (status) {
_serviceReport.reason = status; _serviceReport.reason = status;
}, },
), ),
], ],
), ),
), ),
const SizedBox(width: 8,), const SizedBox(
width: 8,
),
Expanded( Expanded(
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
@ -449,8 +499,8 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
AMiniOneImagePicker( AMiniOneImagePicker(
//error: _validate && _serviceReport.image == null, //error: _validate && _serviceReport.image == null,
image: _image, image: _image,
onPick: (image){ onPick: (image) {
_image =image; _image = image;
_serviceReport.image = "${image.path.split("/").last}|${base64Encode(image.readAsBytesSync())}"; _serviceReport.image = "${image.path.split("/").last}|${base64Encode(image.readAsBytesSync())}";
}, },
), ),
@ -459,7 +509,9 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
), ),
], ],
), ),
const SizedBox(height: 8,), const SizedBox(
height: 8,
),
// Traveling Hours & Working Hours // Traveling Hours & Working Hours
Row( Row(
children: [ children: [
@ -468,13 +520,15 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle(_subtitle.workingHours), ASubTitle(_subtitle.workingHours),
const SizedBox(height: 8,), const SizedBox(
height: 8,
),
Row( Row(
children: [ children: [
Expanded( Expanded(
child: AppTimer( child: AppTimer(
timer: _serviceReport.timer, timer: _serviceReport.timer,
onChange: (timer) async{ onChange: (timer) async {
_serviceReport.timer = timer; _serviceReport.timer = timer;
return true; return true;
}, },
@ -523,7 +577,9 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
// ), // ),
], ],
), ),
const SizedBox(height: 8,), const SizedBox(
height: 8,
),
// Operating Hours and Job Sheet Number // Operating Hours and Job Sheet Number
// Row( // Row(
// children: [ // children: [
@ -571,29 +627,39 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
// ], // ],
// ), // ),
//const SizedBox(height: 8,), //const SizedBox(height: 8,),
const SizedBox(height: 8,), const SizedBox(
height: 8,
),
const ASubTitle("Nurse Signature"), const ASubTitle("Nurse Signature"),
ESignature( ESignature(
oldSignature: _serviceReport.signatureNurse, oldSignature: _serviceReport.signatureNurse,
newSignature: _serviceReport.localNurseSignature, newSignature: _serviceReport.localNurseSignature,
onSaved: (signature){ onSaved: (signature) {
if(signature == null || signature.isEmpty) {return;} if (signature == null || signature.isEmpty) {
return;
}
_serviceReport.localNurseSignature = signature; _serviceReport.localNurseSignature = signature;
_serviceReport.signatureNurse = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; _serviceReport.signatureNurse = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}";
}, },
), ),
const SizedBox(height: 8,), const SizedBox(
height: 8,
),
const ASubTitle("Engineer Signature"), const ASubTitle("Engineer Signature"),
ESignature( ESignature(
oldSignature: _serviceReport.signatureEngineer, oldSignature: _serviceReport.signatureEngineer,
newSignature: _serviceReport.localNurseSignature, newSignature: _serviceReport.localNurseSignature,
onSaved: (signature){ onSaved: (signature) {
if(signature == null || signature.isEmpty) {return;} if (signature == null || signature.isEmpty) {
return;
}
_serviceReport.localNurseSignature = signature; _serviceReport.localNurseSignature = signature;
_serviceReport.signatureEngineer = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; _serviceReport.signatureEngineer = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}";
}, },
), ),
const SizedBox(height: 8,), const SizedBox(
height: 8,
),
// Part Number and Quantity // Part Number and Quantity
Row( Row(
children: [ children: [
@ -603,45 +669,49 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle(_subtitle.partNumber), ASubTitle(_subtitle.partNumber),
_validate && _serviceReport.parts == null ? _validate && _serviceReport.parts == null
ASubTitle(_subtitle.requiredWord,color: Colors.red,): ? ASubTitle(
const SizedBox.shrink(), _subtitle.requiredWord,
const SizedBox(height: 4,), color: Colors.red,
)
: const SizedBox.shrink(),
const SizedBox(
height: 4,
),
AutoCompletePartsField( AutoCompletePartsField(
onPick: (part){ onPick: (part) {
_serviceReport.parts.add(part); _serviceReport.parts.add(part);
}, },
), ),
], ],
), ),
), ),
], ],
), ),
SizedBox(height: 8*AppStyle.getScaleFactor(context),), SizedBox(
height: 8 * AppStyle.getScaleFactor(context),
),
Row( Row(
children: [ children: [
Expanded(flex:3,child: Text(_subtitle.number)), Expanded(flex: 3, child: Text(_subtitle.number)),
Expanded(flex: 1,child: Text(_subtitle.quantity)), Expanded(flex: 1, child: Text(_subtitle.quantity)),
], ],
), ),
Column( Column(
children: List.generate( children: List.generate(_serviceReport.parts.length, (index) {
_serviceReport.parts.length,
(index) {
Part _part = _serviceReport.parts[index]; Part _part = _serviceReport.parts[index];
return PartItem( return PartItem(
part: _part, part: _part,
onDelete: (part){ onDelete: (part) {
_serviceReport.parts.remove(part); _serviceReport.parts.remove(part);
setState(() {}); setState(() {});
}, },
); );
} }),
), ),
const SizedBox(
height: 16,
), ),
const SizedBox(height: 16,),
], ],
), ),
), ),
@ -651,47 +721,37 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
text: _subtitle.submit, text: _subtitle.submit,
onPressed: () async { onPressed: () async {
_validate = true; _validate = true;
if(!_formKey.currentState.validate()){ if (!_formKey.currentState.validate()) {
setState(() {}); setState(() {});
return; return;
} }
if(!_serviceReport.validate()) return; if (!_serviceReport.validate()) return;
_formKey.currentState.save(); _formKey.currentState.save();
_isLoading =true; _isLoading = true;
setState(() {}); setState(() {});
int status = await _serviceRequestsProvider.createServiceReport(user: _userProvider.user, host: _settingProvider.host, report: _serviceReport, request: widget.request);
_isLoading = false;
int status = await _serviceRequestsProvider.createServiceReport(
user: _userProvider.user,
host: _settingProvider.host,
report: _serviceReport,
request: widget.request
);
_isLoading =false;
setState(() {}); setState(() {});
if(status >= 200 && status < 300){ if (status >= 200 && status < 300) {
Fluttertoast.showToast( Fluttertoast.showToast(
msg: _subtitle.requestCompleteSuccessfully, msg: _subtitle.requestCompleteSuccessfully,
); );
Navigator.of(context).pop(); Navigator.of(context).pop();
Navigator.of(context).pop(); Navigator.of(context).pop();
}else{ } else {
String errorMessage = HttpStatusManger.getStatusMessage( String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle);
status: status, subtitle: _subtitle); ScaffoldMessenger.of(context).showSnackBar(SnackBar(
ScaffoldMessenger.of(context).showSnackBar( content: Text(errorMessage),
SnackBar( ));
content: Text(
errorMessage
),
)
);
} }
}, },
), ),
), ),
const SizedBox(height: 300,) const SizedBox(
height: 300,
)
], ],
), ),
const ABackButton(), const ABackButton(),

@ -36,9 +36,10 @@ import 'package:test_sa/views/widgets/status/report/service_report_type.dart';
import 'package:test_sa/views/widgets/status/report/service_status.dart'; import 'package:test_sa/views/widgets/status/report/service_status.dart';
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';
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;
final ServiceReport report; final ServiceReport report;
const EditServiceReport({Key key, this.request, this.report}) : super(key: key); const EditServiceReport({Key key, this.request, this.report}) : super(key: key);
@ -46,9 +47,7 @@ class EditServiceReport extends StatefulWidget {
_EditServiceReportState createState() => _EditServiceReportState(); _EditServiceReportState createState() => _EditServiceReportState();
} }
class _EditServiceReportState extends State<EditServiceReport> with TickerProviderStateMixin{ class _EditServiceReportState extends State<EditServiceReport> with TickerProviderStateMixin {
UserProvider _userProvider; UserProvider _userProvider;
SettingProvider _settingProvider; SettingProvider _settingProvider;
ServiceRequestsProvider _serviceRequestsProvider; ServiceRequestsProvider _serviceRequestsProvider;
@ -76,6 +75,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
_workPreformedController.dispose(); _workPreformedController.dispose();
super.dispose(); super.dispose();
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
@ -97,43 +97,46 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
ListView( ListView(
children: [ children: [
//AppNameBar(), //AppNameBar(),
const SizedBox(height: 16,), const SizedBox(
height: 16,
),
Center( Center(
child: Padding( child: Padding(
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
child: Text( child: Text(
_subtitle.editServiceReport, _subtitle.editServiceReport,
style: Theme.of(context).textTheme.headline5.copyWith( style: Theme.of(context).textTheme.headline5.copyWith(color: AColors.cyan, fontSize: 28, fontWeight: FontWeight.bold),
color: AColors.cyan,
fontSize: 28,
fontWeight: FontWeight.bold
),
), ),
), ),
), ),
Container( Container(
padding: const EdgeInsets.symmetric(horizontal: 16), padding: const EdgeInsets.symmetric(horizontal: 16),
margin: const EdgeInsets.symmetric(horizontal: 16,vertical: 16), margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 16),
decoration: BoxDecoration( decoration: BoxDecoration(color: AColors.grey, borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), boxShadow: [
color: AColors.grey,
borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)),
boxShadow: [
const BoxShadow( const BoxShadow(
color: AColors.grey, color: AColors.grey,
offset: Offset(0,-1), offset: Offset(0, -1),
) )
] ]),
),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
const SizedBox(height: 8,), const SizedBox(
height: 8,
),
Wrap( Wrap(
spacing: 10, spacing: 10,
children: [ children: [
ASubTitle("${_subtitle.callId}: ${widget.request.requestCode}",font: 14,), ASubTitle(
widget.request.deviceSerialNumber == null ? const SizedBox(): "${_subtitle.callId}: ${widget.request.requestCode}",
ASubTitle("${_subtitle.deviceSN}: ${widget.request.deviceSerialNumber}",font: 14,), font: 14,
),
widget.request.deviceSerialNumber == null
? const SizedBox()
: ASubTitle(
"${_subtitle.deviceSN}: ${widget.request.deviceSerialNumber}",
font: 14,
),
Text( Text(
"${_subtitle.customer}: ${widget.request.hospitalName}", "${_subtitle.customer}: ${widget.request.hospitalName}",
style: Theme.of(context).textTheme.subtitle1.copyWith( style: Theme.of(context).textTheme.subtitle1.copyWith(
@ -142,7 +145,6 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
), ),
textScaleFactor: AppStyle.getScaleFactor(context), textScaleFactor: AppStyle.getScaleFactor(context),
) )
], ],
), ),
const Divider(), const Divider(),
@ -156,29 +158,39 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle(_subtitle.reportType), ASubTitle(_subtitle.reportType),
_validate && _serviceReport.type == null ? _validate && _serviceReport.type == null
ASubTitle(_subtitle.requiredWord,color: Colors.red,): ? ASubTitle(
const SizedBox.shrink(), _subtitle.requiredWord,
const SizedBox(height: 4,), color: Colors.red,
)
: const SizedBox.shrink(),
const SizedBox(
height: 4,
),
ServiceReportTypeMenu( ServiceReportTypeMenu(
initialValue: _serviceReport.type, initialValue: _serviceReport.type,
onSelect: (status){ onSelect: (status) {
_serviceReport.type = status; _serviceReport.type = status;
}, },
), ),
], ],
), ),
), ),
const SizedBox(width: 8,), const SizedBox(
width: 8,
),
// visit date // visit date
Expanded( Expanded(
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle(_subtitle.visitDate), ASubTitle(_subtitle.visitDate),
_validate && _serviceReport.visitDate == null ? _validate && _serviceReport.visitDate == null
ASubTitle(_subtitle.requiredWord,color: Colors.red,): ? ASubTitle(
const SizedBox.shrink(), _subtitle.requiredWord,
color: Colors.red,
)
: const SizedBox.shrink(),
Row( Row(
children: [ children: [
Expanded( Expanded(
@ -186,7 +198,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
date: _serviceReport.visitDate, date: _serviceReport.visitDate,
from: DateTime.now().subtract(const Duration(days: 365)), from: DateTime.now().subtract(const Duration(days: 365)),
to: DateTime.now().add(const Duration(days: 365)), to: DateTime.now().add(const Duration(days: 365)),
onDatePicker: (date){ onDatePicker: (date) {
_serviceReport.visitDate = date; _serviceReport.visitDate = date;
setState(() {}); setState(() {});
}, },
@ -197,58 +209,84 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
], ],
), ),
), ),
], ],
), ),
const SizedBox(height: 8,), const SizedBox(
height: 8,
),
// device sn // device sn
Visibility( Visibility(
visible: true,//widget.report.device == null, visible: true, //widget.report.device == null,
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle(_subtitle.deviceSN), ASubTitle(_subtitle.deviceSN),
_validate && _serviceReport.device?.id == null ? _validate && _serviceReport.device?.id == null
ASubTitle(_subtitle.requiredWord,color: Colors.red,): ? ASubTitle(
const SizedBox.shrink(), _subtitle.requiredWord,
color: Colors.red,
)
: const SizedBox.shrink(),
AutoCompleteDeviceField( AutoCompleteDeviceField(
hospitalId: widget.request.hospitalId, hospitalId: widget.request.hospitalId,
initialValue: _serviceReport.device, initialValue: _serviceReport.device,
onPick: (id){ onPick: (id) {
_serviceReport.device.id = id; _serviceReport.device.id = id;
}, },
), ),
const SizedBox(height: 8,), const SizedBox(
height: 8,
),
], ],
), ),
), ),
const SizedBox(height: 8,), const SizedBox(
height: 8,
),
ASubTitle(_subtitle.serviceType), ASubTitle(_subtitle.serviceType),
_validate && _serviceReport.assetType == null ? _validate && _serviceReport.assetType == null
ASubTitle(_subtitle.requiredWord,color: Colors.red,): ? ASubTitle(
const SizedBox.shrink(), _subtitle.requiredWord,
const SizedBox(height: 4,), color: Colors.red,
)
: const SizedBox.shrink(),
const SizedBox(
height: 4,
),
ServiceAssetTypeMenu( ServiceAssetTypeMenu(
initialValue: _serviceReport.assetType, initialValue: _serviceReport.assetType,
onSelect: (status){ onSelect: (status) {
_serviceReport.assetType = status; _serviceReport.assetType = status;
}, },
), ),
const SizedBox(height: 8,), const SizedBox(
SizedBox(height: 8 * AppStyle.getScaleFactor(context),), height: 8,
),
SizedBox(
height: 8 * AppStyle.getScaleFactor(context),
),
const ASubTitle("Assign Employee"), const ASubTitle("Assign Employee"),
const SizedBox(height: 8,), const SizedBox(
_validate && _serviceReport.engineer == null ? height: 8,
ASubTitle(_subtitle.requiredWord,color: Colors.red,): ),
const SizedBox.shrink(), _validate && _serviceReport.engineer == null
const SizedBox(height: 4,), ? ASubTitle(
_subtitle.requiredWord,
color: Colors.red,
)
: const SizedBox.shrink(),
const SizedBox(
height: 4,
),
EngineersMenu( EngineersMenu(
initialValue: _serviceReport.engineer, initialValue: _serviceReport.engineer,
onSelect: (engineer){ onSelect: (engineer) {
_serviceReport.engineer = engineer; _serviceReport.engineer = engineer;
}, },
), ),
const SizedBox(height: 8,), const SizedBox(
height: 8,
),
// Report status and Service Type // Report status and Service Type
Row( Row(
children: [ children: [
@ -258,37 +296,48 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle(_subtitle.reportStatus), ASubTitle(_subtitle.reportStatus),
_validate && _serviceReport.status == null ? _validate && _serviceReport.status == null
ASubTitle(_subtitle.requiredWord,color: Colors.red,): ? ASubTitle(
const SizedBox.shrink(), _subtitle.requiredWord,
const SizedBox(height: 4,), color: Colors.red,
)
: const SizedBox.shrink(),
const SizedBox(
height: 4,
),
ServiceReportStatusMenu( ServiceReportStatusMenu(
report: _serviceReport, report: _serviceReport,
onSelect: (status){ onSelect: (status) {
_serviceReport.status = status; _serviceReport.status = status;
}, },
), ),
], ],
), ),
), ),
const SizedBox(width: 8,), const SizedBox(
width: 8,
),
Consumer<ServiceReportLastCallsProvider>( Consumer<ServiceReportLastCallsProvider>(
builder: (_, provider, __) { builder: (_, provider, __) {
if(provider.isLoading == null) return const SizedBox.shrink(); if (provider.isLoading == null) return const SizedBox.shrink();
return Expanded( return Expanded(
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle(_subtitle.callLastSituation), ASubTitle(_subtitle.callLastSituation),
_validate && _serviceReport.callLastSituation == null ? _validate && _serviceReport.callLastSituation == null
ASubTitle(_subtitle.requiredWord,color: Colors.red,): ? ASubTitle(
const SizedBox.shrink(), _subtitle.requiredWord,
const SizedBox(height: 4,), color: Colors.red,
)
: const SizedBox.shrink(),
const SizedBox(
height: 4,
),
ServiceReportLastCallsMenu( ServiceReportLastCallsMenu(
report: _serviceReport, report: _serviceReport,
onSelect: (status){ onSelect: (status) {
if(status?.value == 12 if (status?.value == 12 || _serviceReport.callLastSituation?.value == 12) {
|| _serviceReport.callLastSituation?.value == 12){
_serviceReport.callLastSituation = status; _serviceReport.callLastSituation = status;
setState(() {}); setState(() {});
} else { } else {
@ -303,48 +352,53 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
), ),
], ],
), ),
const SizedBox(height: 8,), const SizedBox(
height: 8,
),
// invoice number & code // invoice number & code
_serviceReport.callLastSituation?.value != 12 ? const SizedBox.shrink(): _serviceReport.callLastSituation?.value != 12
Row( ? const SizedBox.shrink()
: Row(
children: [ children: [
Expanded( Expanded(
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle(_subtitle.invoiceNumber), ASubTitle(_subtitle.invoiceNumber),
const SizedBox(height: 8,), const SizedBox(
height: 8,
),
ATextFormField( ATextFormField(
initialValue: _serviceReport?.invoiceNumber, initialValue: _serviceReport?.invoiceNumber,
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: Theme.of(context).textTheme.subtitle1, style: Theme.of(context).textTheme.subtitle1,
validator: (value) => validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord,
Validator.hasValue(value)
? null : _subtitle.requiredWord,
textInputType: TextInputType.number, textInputType: TextInputType.number,
onSaved: (value){ onSaved: (value) {
_serviceReport.invoiceNumber = value; _serviceReport.invoiceNumber = value;
}, },
), ),
], ],
), ),
), ),
const SizedBox(width: 8,), const SizedBox(
width: 8,
),
Expanded( Expanded(
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle(_subtitle.invoiceCode), ASubTitle(_subtitle.invoiceCode),
const SizedBox(height: 4,), const SizedBox(
height: 4,
),
ATextFormField( ATextFormField(
initialValue: _serviceReport?.invoiceCode, initialValue: _serviceReport?.invoiceCode,
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: Theme.of(context).textTheme.subtitle1, style: Theme.of(context).textTheme.subtitle1,
validator: (value) => validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord,
Validator.hasValue(value)
? null : _subtitle.requiredWord,
textInputType: TextInputType.text, textInputType: TextInputType.text,
onSaved: (value){ onSaved: (value) {
_serviceReport.invoiceCode = value; _serviceReport.invoiceCode = value;
}, },
), ),
@ -414,7 +468,9 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
// ), // ),
// const SizedBox(height: 8,), // const SizedBox(height: 8,),
const SizedBox(height: 8,), const SizedBox(
height: 8,
),
Row( Row(
children: [ children: [
// reasons // reasons
@ -423,17 +479,21 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle(_subtitle.reasons), ASubTitle(_subtitle.reasons),
const SizedBox(height: 4,), const SizedBox(
height: 4,
),
ServiceReportReasonsMenu( ServiceReportReasonsMenu(
initialValue: _serviceReport.reason, initialValue: _serviceReport.reason,
onSelect: (status){ onSelect: (status) {
_serviceReport.reason = status; _serviceReport.reason = status;
}, },
), ),
], ],
), ),
), ),
const SizedBox(width: 8,), const SizedBox(
width: 8,
),
Expanded( Expanded(
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
@ -442,8 +502,8 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
AMiniOneImagePicker( AMiniOneImagePicker(
//error: _validate && _serviceReport.image == null, //error: _validate && _serviceReport.image == null,
image: _image, image: _image,
onPick: (image){ onPick: (image) {
_image =image; _image = image;
_serviceReport.image = base64Encode(image.readAsBytesSync()); _serviceReport.image = base64Encode(image.readAsBytesSync());
}, },
), ),
@ -452,7 +512,9 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
), ),
], ],
), ),
const SizedBox(height: 8,), const SizedBox(
height: 8,
),
// Traveling Hours & Working Hours // Traveling Hours & Working Hours
Row( Row(
children: [ children: [
@ -461,13 +523,15 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle(_subtitle.workingHours), ASubTitle(_subtitle.workingHours),
const SizedBox(height: 8,), const SizedBox(
height: 8,
),
Row( Row(
children: [ children: [
Expanded( Expanded(
child: AppTimer( child: AppTimer(
timer: _serviceReport.timer, timer: _serviceReport.timer,
onChange: (timer) async{ onChange: (timer) async {
_serviceReport.timer = timer; _serviceReport.timer = timer;
return true; return true;
}, },
@ -516,7 +580,9 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
// ), // ),
], ],
), ),
const SizedBox(height: 8,), const SizedBox(
height: 8,
),
// Operating Hours and Job Sheet Number // Operating Hours and Job Sheet Number
// Row( // Row(
// children: [ // children: [
@ -564,29 +630,39 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
// ], // ],
// ), // ),
//const SizedBox(height: 8,), //const SizedBox(height: 8,),
const SizedBox(height: 8,), const SizedBox(
height: 8,
),
const ASubTitle("Nurse Signature"), const ASubTitle("Nurse Signature"),
ESignature( ESignature(
oldSignature: _serviceReport.signatureNurse, oldSignature: _serviceReport.signatureNurse,
newSignature: _serviceReport.localNurseSignature, newSignature: _serviceReport.localNurseSignature,
onChange: (signature){ onChange: (signature) {
if(signature == null || signature.isEmpty) {return;} if (signature == null || signature.isEmpty) {
return;
}
_serviceReport.localNurseSignature = signature; _serviceReport.localNurseSignature = signature;
_serviceReport.signatureNurse = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; _serviceReport.signatureNurse = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}";
}, },
), ),
const SizedBox(height: 8,), const SizedBox(
height: 8,
),
const ASubTitle("Engineer Signature"), const ASubTitle("Engineer Signature"),
ESignature( ESignature(
oldSignature: _serviceReport.signatureEngineer, oldSignature: _serviceReport.signatureEngineer,
newSignature: _serviceReport.localNurseSignature, newSignature: _serviceReport.localNurseSignature,
onChange: (signature){ onChange: (signature) {
if(signature == null || signature.isEmpty) {return;} if (signature == null || signature.isEmpty) {
return;
}
_serviceReport.localNurseSignature = signature; _serviceReport.localNurseSignature = signature;
_serviceReport.signatureEngineer = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; _serviceReport.signatureEngineer = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}";
}, },
), ),
const SizedBox(height: 8,), const SizedBox(
height: 8,
),
// Part Number and Quantity // Part Number and Quantity
Row( Row(
children: [ children: [
@ -596,12 +672,17 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle(_subtitle.partNumber), ASubTitle(_subtitle.partNumber),
_validate && _serviceReport.parts == null ? _validate && _serviceReport.parts == null
ASubTitle(_subtitle.requiredWord,color: Colors.red,): ? ASubTitle(
const SizedBox.shrink(), _subtitle.requiredWord,
const SizedBox(height: 4,), color: Colors.red,
)
: const SizedBox.shrink(),
const SizedBox(
height: 4,
),
AutoCompletePartsField( AutoCompletePartsField(
onPick: (part){ onPick: (part) {
_serviceReport.parts.add(part); _serviceReport.parts.add(part);
setState(() {}); setState(() {});
}, },
@ -609,34 +690,33 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
], ],
), ),
), ),
], ],
), ),
SizedBox(height: 8*AppStyle.getScaleFactor(context),), SizedBox(
height: 8 * AppStyle.getScaleFactor(context),
),
Row( Row(
children: [ children: [
Expanded(flex:3,child: Text(_subtitle.number)), Expanded(flex: 3, child: Text(_subtitle.number)),
Expanded(flex: 1,child: Text(_subtitle.quantity)), Expanded(flex: 1, child: Text(_subtitle.quantity)),
], ],
), ),
Column( Column(
children: List.generate( children: List.generate(_serviceReport.parts.length, (index) {
_serviceReport.parts.length,
(index) {
Part _part = _serviceReport.parts[index]; Part _part = _serviceReport.parts[index];
return PartItem( return PartItem(
part: _part, part: _part,
onDelete: (part){ onDelete: (part) {
_serviceReport.parts.remove(part); _serviceReport.parts.remove(part);
setState(() {}); setState(() {});
}, },
); );
} }),
), ),
),
const SizedBox(height: 16,),
const SizedBox(
height: 16,
),
], ],
), ),
), ),
@ -646,48 +726,40 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
text: _subtitle.update, text: _subtitle.update,
onPressed: () async { onPressed: () async {
_validate = true; _validate = true;
if(!_formKey.currentState.validate()){ if (!_formKey.currentState.validate()) {
setState(() {}); setState(() {});
return; return;
} }
if(!_serviceReport.validate()) { if (!_serviceReport.validate()) {
setState(() {}); setState(() {});
return; return;
} }
_formKey.currentState.save(); _formKey.currentState.save();
_isLoading =true; _isLoading = true;
setState(() {}); setState(() {});
int status = await _serviceRequestsProvider.updateServiceReport( int status = await _serviceRequestsProvider.updateServiceReport(user: _userProvider.user, host: _settingProvider.host, report: _serviceReport, request: widget.request);
user: _userProvider.user, _isLoading = false;
host: _settingProvider.host,
report: _serviceReport,
request: widget.request
);
_isLoading =false;
setState(() {}); setState(() {});
if(status >= 200 && status < 300){ if (status >= 200 && status < 300) {
Fluttertoast.showToast( Fluttertoast.showToast(
msg: _subtitle.requestCompleteSuccessfully, msg: _subtitle.requestCompleteSuccessfully,
); );
Navigator.of(context).pop(); Navigator.of(context).pop();
Navigator.of(context).pop(); Navigator.of(context).pop();
}else{ } else {
String errorMessage = HttpStatusManger.getStatusMessage( String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle);
status: status, subtitle: _subtitle); ScaffoldMessenger.of(context).showSnackBar(SnackBar(
ScaffoldMessenger.of(context).showSnackBar( content: Text(errorMessage),
SnackBar( ));
content: Text(
errorMessage
),
)
);
} }
}, },
), ),
), ),
const SizedBox(height: 300,) const SizedBox(
height: 300,
)
], ],
), ),
const ABackButton(), const ABackButton(),

@ -12,14 +12,14 @@ import 'package:test_sa/views/widgets/buttons/app_icon_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/requests/service_request_list.dart'; import 'package:test_sa/views/widgets/requests/service_request_list.dart';
import 'package:test_sa/views/widgets/search/service_request_search_bar.dart'; 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();
} }
class _ServiceRequestsPageState extends State<ServiceRequestsPage> class _ServiceRequestsPageState extends State<ServiceRequestsPage> with TickerProviderStateMixin {
with TickerProviderStateMixin{
ServiceRequestsProvider _serviceRequestsProvider; ServiceRequestsProvider _serviceRequestsProvider;
UserProvider _userProvider; UserProvider _userProvider;
SettingProvider _settingProvider; SettingProvider _settingProvider;
@ -31,7 +31,7 @@ class _ServiceRequestsPageState extends State<ServiceRequestsPage>
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
Subtitle _subtitle = AppLocalization.of(context).subtitle; Subtitle _subtitle = AppLocalization.of(context).subtitle;
if(_firstTime){ if (_firstTime) {
_serviceRequestsProvider.reset(); _serviceRequestsProvider.reset();
_firstTime = false; _firstTime = false;
} }
@ -55,8 +55,8 @@ class _ServiceRequestsPageState extends State<ServiceRequestsPage>
Column( Column(
children: [ children: [
Container( Container(
color:AColors.primaryColor, color: AColors.primaryColor,
padding: const EdgeInsets.symmetric(horizontal: 0,vertical: 4), padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4),
child: Column( child: Column(
children: [ children: [
Row( Row(
@ -66,10 +66,7 @@ class _ServiceRequestsPageState extends State<ServiceRequestsPage>
child: Center( child: Center(
child: Text( child: Text(
_subtitle.serviceRequests, _subtitle.serviceRequests,
style: Theme.of(context).textTheme.headline6.copyWith( style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic),
color: AColors.white,
fontStyle: FontStyle.italic
),
), ),
), ),
), ),
@ -83,22 +80,23 @@ class _ServiceRequestsPageState extends State<ServiceRequestsPage>
ServiceRequestSearch _temp = await showModalBottomSheet( ServiceRequestSearch _temp = await showModalBottomSheet(
context: context, context: context,
isScrollControlled: true, isScrollControlled: true,
builder: (context){ builder: (context) {
return ServiceRequestsSearchDialog( return ServiceRequestsSearchDialog(
initialSearchValue: _serviceRequestsProvider.search, initialSearchValue: _serviceRequestsProvider.search,
); );
}); });
if(_temp != null){ if (_temp != null) {
_serviceRequestsProvider.search = _temp; _serviceRequestsProvider.search = _temp;
_serviceRequestsProvider.reset(); _serviceRequestsProvider.reset();
setState(() {}); setState(() {});
} }
}, },
), ),
SizedBox(width: 16,) SizedBox(
width: 16,
)
], ],
), ),
], ],
), ),
), ),
@ -117,7 +115,6 @@ class _ServiceRequestsPageState extends State<ServiceRequestsPage>
), ),
], ],
), ),
], ],
), ),
), ),

@ -21,13 +21,13 @@ import 'package:test_sa/views/widgets/pentry/pentry_ppm_check_list_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
State<EditPentry> createState() => _EditPentryState(); State<EditPentry> createState() => _EditPentryState();
} }
class _EditPentryState extends State<EditPentry> with SingleTickerProviderStateMixin{ class _EditPentryState extends State<EditPentry> with SingleTickerProviderStateMixin {
bool _isLoading = false; bool _isLoading = false;
bool _validate = false; bool _validate = false;
Subtitle _subtitle; Subtitle _subtitle;
@ -41,29 +41,24 @@ class _EditPentryState extends State<EditPentry> with SingleTickerProviderStateM
_onSubmit() async { _onSubmit() async {
_validate = true; _validate = true;
if(!_pentry.validate()) { if (!_pentry.validate()) {
setState(() { }); setState(() {});
return; return;
} }
_isLoading = true; _isLoading = true;
setState(() {}); setState(() {});
int status = await _regularVisitsProvider.updatePentry( int status = await _regularVisitsProvider.updatePentry(user: _userProvider.user, host: _settingProvider.host, pentry: _pentry, visit: widget.visit);
user: _userProvider.user, _isLoading = false;
host: _settingProvider.host,
pentry: _pentry,
visit: widget.visit
);
_isLoading =false;
setState(() {}); setState(() {});
if(status >= 200 && status < 300){ if (status >= 200 && status < 300) {
Fluttertoast.showToast( Fluttertoast.showToast(
msg: _subtitle.requestCompleteSuccessfully, msg: _subtitle.requestCompleteSuccessfully,
); );
Navigator.of(context).pop(); Navigator.of(context).pop();
Navigator.of(context).pop(); Navigator.of(context).pop();
}else{ } else {
// String errorMessage = HttpStatusManger.getStatusMessage( // String errorMessage = HttpStatusManger.getStatusMessage(
// status: status, subtitle: _subtitle); // status: status, subtitle: _subtitle);
// Fluttertoast.showToast( // Fluttertoast.showToast(
@ -75,9 +70,9 @@ class _EditPentryState extends State<EditPentry> with SingleTickerProviderStateM
@override @override
void initState() { void initState() {
_pentry = widget.pentry.copyWith(); _pentry = widget.pentry.copyWith();
if(_pentry.pmKits.isEmpty) _pentry.pmKits.add(PMKit()); if (_pentry.pmKits.isEmpty) _pentry.pmKits.add(PMKit());
if(_pentry.calibrationTools.isEmpty) _pentry.calibrationTools.add(CalibrationTool()); if (_pentry.calibrationTools.isEmpty) _pentry.calibrationTools.add(CalibrationTool());
if(_pentry.ppmCheckLists.isEmpty) _pentry.ppmCheckLists.add(PPMCheckList()); if (_pentry.ppmCheckLists.isEmpty) _pentry.ppmCheckLists.add(PPMCheckList());
_tabController = TabController(length: 4, vsync: this); _tabController = TabController(length: 4, vsync: this);
super.initState(); super.initState();
} }
@ -111,14 +106,22 @@ class _EditPentryState extends State<EditPentry> with SingleTickerProviderStateM
child: TabBar( child: TabBar(
controller: _tabController, controller: _tabController,
isScrollable: true, isScrollable: true,
onTap: (index){ onTap: (index) {
setState(() {}); setState(() {});
}, },
tabs: const [ tabs: const [
Tab(text: "PPM Check List",), Tab(
Tab(text: "Calibration Tools",), text: "PPM Check List",
Tab(text: "PK Kits",), ),
Tab(text: "Pentry",), Tab(
text: "Calibration Tools",
),
Tab(
text: "PK Kits",
),
Tab(
text: "Pentry",
),
]), ]),
), ),
), ),
@ -153,24 +156,28 @@ class _EditPentryState extends State<EditPentry> with SingleTickerProviderStateM
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
child: Row( child: Row(
children: [ children: [
if(_tabController.index != 0) if (_tabController.index != 0)
ASmallButton( ASmallButton(
text: _subtitle.back, text: _subtitle.back,
onPressed: (){ onPressed: () {
_tabController.animateTo(_tabController.index - 1,); _tabController.animateTo(
_tabController.index - 1,
);
setState(() {}); setState(() {});
}, },
), ),
const Spacer(), const Spacer(),
if(_tabController.index != _tabController.length -1) if (_tabController.index != _tabController.length - 1)
ASmallButton( ASmallButton(
text: _subtitle.next, text: _subtitle.next,
onPressed: (){ onPressed: () {
_tabController.animateTo(_tabController.index + 1,); _tabController.animateTo(
_tabController.index + 1,
);
setState(() {}); setState(() {});
}, },
), ),
if(_tabController.index == _tabController.length -1) if (_tabController.index == _tabController.length - 1)
ASmallButton( ASmallButton(
text: _subtitle.update, text: _subtitle.update,
onPressed: _onSubmit, onPressed: _onSubmit,
@ -182,12 +189,9 @@ class _EditPentryState extends State<EditPentry> with SingleTickerProviderStateM
], ],
), ),
), ),
], ],
) )),
),
), ),
); );
} }
} }

@ -10,8 +10,8 @@ import 'package:test_sa/models/visits/visit.dart';
import 'package:test_sa/views/pages/user/visits/pantry/edit_pentry.dart'; import 'package:test_sa/views/pages/user/visits/pantry/edit_pentry.dart';
import 'package:test_sa/views/widgets/loaders/app_loading.dart'; import 'package:test_sa/views/widgets/loaders/app_loading.dart';
import 'package:test_sa/views/widgets/loaders/failed_loading.dart'; import 'package:test_sa/views/widgets/loaders/failed_loading.dart';
class FutureEditPentry extends StatefulWidget {
class FutureEditPentry extends StatefulWidget {
final Visit visit; final Visit visit;
const FutureEditPentry({Key key, this.visit}) : super(key: key); const FutureEditPentry({Key key, this.visit}) : super(key: key);
@ -21,7 +21,6 @@ class FutureEditPentry extends StatefulWidget {
} }
class _FutureEditPentryState extends State<FutureEditPentry> { class _FutureEditPentryState extends State<FutureEditPentry> {
UserProvider _userProvider; UserProvider _userProvider;
SettingProvider _settingProvider; SettingProvider _settingProvider;
@override @override
@ -32,20 +31,17 @@ class _FutureEditPentryState extends State<FutureEditPentry> {
Subtitle subtitle = AppLocalization.of(context).subtitle; Subtitle subtitle = AppLocalization.of(context).subtitle;
return Scaffold( return Scaffold(
body: FutureBuilder<Pentry>( body: FutureBuilder<Pentry>(
future: RegularVisitsProvider().getPently( future: RegularVisitsProvider().getPently(user: _userProvider.user, host: _settingProvider.host, id: widget.visit.id),
user: _userProvider.user, builder: (BuildContext context, AsyncSnapshot<Pentry> snapshot) {
host: _settingProvider.host, if (snapshot.hasError) {
id: widget.visit.id
),
builder: (BuildContext context, AsyncSnapshot<Pentry> snapshot){
if(snapshot.hasError) {
return FailedLoading( return FailedLoading(
message: subtitle.failedToCompleteRequest, message: subtitle.failedToCompleteRequest,
onReload: (){setState(() {});}, onReload: () {
setState(() {});
},
); );
} }
if(snapshot.hasData){ if (snapshot.hasData) {
return EditPentry( return EditPentry(
pentry: snapshot.data, pentry: snapshot.data,
visit: widget.visit, visit: widget.visit,

@ -18,14 +18,14 @@ import 'package:test_sa/views/widgets/buttons/app_icon_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/search/visits_search_bar.dart'; import 'package:test_sa/views/widgets/search/visits_search_bar.dart';
import 'package:test_sa/views/widgets/visits/visits_list.dart'; 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();
} }
class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceVisitsPage> class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceVisitsPage> with TickerProviderStateMixin {
with TickerProviderStateMixin{
PreventiveMaintenanceVisitsProvider _visitsProvider; PreventiveMaintenanceVisitsProvider _visitsProvider;
UserProvider _userProvider; UserProvider _userProvider;
SettingProvider _settingProvider; SettingProvider _settingProvider;
@ -57,8 +57,8 @@ class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceV
Column( Column(
children: [ children: [
Container( Container(
color:AColors.primaryColor, color: AColors.primaryColor,
padding: const EdgeInsets.symmetric(horizontal: 0,vertical: 4), padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4),
child: Column( child: Column(
children: [ children: [
Row( Row(
@ -68,10 +68,7 @@ class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceV
child: Center( child: Center(
child: Text( child: Text(
_subtitle.preventiveMaintenance, _subtitle.preventiveMaintenance,
style: Theme.of(context).textTheme.headline6.copyWith( style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic),
color: AColors.white,
fontStyle: FontStyle.italic
),
), ),
), ),
), ),
@ -84,12 +81,12 @@ class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceV
VisitsSearch _temp = await showModalBottomSheet( VisitsSearch _temp = await showModalBottomSheet(
context: context, context: context,
isScrollControlled: true, isScrollControlled: true,
builder: (context){ builder: (context) {
return VisitsSearchDialog( return VisitsSearchDialog(
initialSearchValue: _visitsProvider.visitsSearch, initialSearchValue: _visitsProvider.visitsSearch,
); );
}); });
if(_temp != null){ if (_temp != null) {
_visitsProvider.visitsSearch = _temp; _visitsProvider.visitsSearch = _temp;
_visitsProvider.reset(); _visitsProvider.reset();
setState(() {}); setState(() {});
@ -101,10 +98,11 @@ class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceV
} }
}, },
), ),
SizedBox(width: 16,) SizedBox(
width: 16,
)
], ],
), ),
], ],
), ),
), ),
@ -114,7 +112,7 @@ class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceV
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
child: AButton( child: AButton(
text: _subtitle.clearSearch, text: _subtitle.clearSearch,
onPressed: (){ onPressed: () {
_visitsProvider.visitsSearch = VisitsSearch(); _visitsProvider.visitsSearch = VisitsSearch();
_visitsProvider.reset(); _visitsProvider.reset();
setState(() {}); setState(() {});
@ -137,10 +135,13 @@ class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceV
isScrollControlled: true, isScrollControlled: true,
context: context, context: context,
builder: (context) { builder: (context) {
return UpdateVisitsGroupSheet(visits: visits,title:_subtitle.updatePreventiveMaintenance,); return UpdateVisitsGroupSheet(
visits: visits,
title: _subtitle.updatePreventiveMaintenance,
);
}, },
)as VisitsGroup; ) as VisitsGroup;
if(_group != null){ if (_group != null) {
showDialog<void>( showDialog<void>(
context: context, context: context,
barrierDismissible: false, barrierDismissible: false,
@ -151,24 +152,17 @@ class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceV
); );
}, },
); );
int status = await _visitsProvider.updateGroupOfVisits( int status = await _visitsProvider.updateGroupOfVisits(user: _userProvider.user, host: _settingProvider.host, group: _group);
user: _userProvider.user,
host: _settingProvider.host,
group: _group
);
Navigator.of(context).pop(); Navigator.of(context).pop();
if(status >= 200 && status < 300){ if (status >= 200 && status < 300) {
Fluttertoast.showToast( Fluttertoast.showToast(
msg: _subtitle.preventiveMaintenanceUpdatedSuccessfully, msg: _subtitle.preventiveMaintenanceUpdatedSuccessfully,
toastLength: Toast.LENGTH_LONG, toastLength: Toast.LENGTH_LONG,
gravity: ToastGravity.BOTTOM, gravity: ToastGravity.BOTTOM,
); );
}else{ } else {
Fluttertoast.showToast( Fluttertoast.showToast(
msg: HttpStatusManger.getStatusMessage( msg: HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle),
status: status,
subtitle: _subtitle
),
toastLength: Toast.LENGTH_LONG, toastLength: Toast.LENGTH_LONG,
gravity: ToastGravity.BOTTOM, gravity: ToastGravity.BOTTOM,
); );
@ -180,7 +174,6 @@ class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceV
), ),
], ],
), ),
], ],
), ),
), ),

@ -18,14 +18,14 @@ import 'package:test_sa/views/widgets/buttons/app_icon_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/search/visits_search_bar.dart'; import 'package:test_sa/views/widgets/search/visits_search_bar.dart';
import 'package:test_sa/views/widgets/visits/visits_list.dart'; 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();
} }
class _RegularVisitsPageState extends State<RegularVisitsPage> class _RegularVisitsPageState extends State<RegularVisitsPage> with TickerProviderStateMixin {
with TickerProviderStateMixin{
RegularVisitsProvider _visitsProvider; RegularVisitsProvider _visitsProvider;
UserProvider _userProvider; UserProvider _userProvider;
SettingProvider _settingProvider; SettingProvider _settingProvider;
@ -56,8 +56,8 @@ class _RegularVisitsPageState extends State<RegularVisitsPage>
Column( Column(
children: [ children: [
Container( Container(
color:AColors.primaryColor, color: AColors.primaryColor,
padding: const EdgeInsets.symmetric(horizontal: 0,vertical: 4), padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4),
child: Column( child: Column(
children: [ children: [
Row( Row(
@ -67,10 +67,7 @@ class _RegularVisitsPageState extends State<RegularVisitsPage>
child: Center( child: Center(
child: Text( child: Text(
_subtitle.preventiveMaintenance, _subtitle.preventiveMaintenance,
style: Theme.of(context).textTheme.headline6.copyWith( style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic),
color: AColors.white,
fontStyle: FontStyle.italic
),
), ),
), ),
), ),
@ -78,7 +75,7 @@ class _RegularVisitsPageState extends State<RegularVisitsPage>
duration: Duration(milliseconds: 400), duration: Duration(milliseconds: 400),
child: AIconButton( child: AIconButton(
key: ValueKey(_expandedSearch), key: ValueKey(_expandedSearch),
iconData: _expandedSearch ? Icons.keyboard_arrow_up :Icons.search, iconData: _expandedSearch ? Icons.keyboard_arrow_up : Icons.search,
color: AColors.secondaryColor, color: AColors.secondaryColor,
buttonSize: 42, buttonSize: 42,
backgroundColor: AColors.white, backgroundColor: AColors.white,
@ -86,23 +83,24 @@ class _RegularVisitsPageState extends State<RegularVisitsPage>
VisitsSearch _temp = await showModalBottomSheet( VisitsSearch _temp = await showModalBottomSheet(
context: context, context: context,
isScrollControlled: true, isScrollControlled: true,
builder: (context){ builder: (context) {
return VisitsSearchDialog( return VisitsSearchDialog(
initialSearchValue: _visitsProvider.visitsSearch, initialSearchValue: _visitsProvider.visitsSearch,
); );
}); });
if(_temp != null){ if (_temp != null) {
_visitsProvider.visitsSearch.fromSearch(_temp) ; _visitsProvider.visitsSearch.fromSearch(_temp);
_visitsProvider.reset(); _visitsProvider.reset();
setState(() {}); setState(() {});
} }
}, },
), ),
), ),
SizedBox(width: 16,) SizedBox(
width: 16,
)
], ],
), ),
], ],
), ),
), ),
@ -112,7 +110,7 @@ class _RegularVisitsPageState extends State<RegularVisitsPage>
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
child: AButton( child: AButton(
text: _subtitle.clearSearch, text: _subtitle.clearSearch,
onPressed: (){ onPressed: () {
_visitsProvider.visitsSearch = VisitsSearch(); _visitsProvider.visitsSearch = VisitsSearch();
_visitsProvider.reset(); _visitsProvider.reset();
setState(() {}); setState(() {});
@ -134,10 +132,13 @@ class _RegularVisitsPageState extends State<RegularVisitsPage>
isScrollControlled: true, isScrollControlled: true,
context: context, context: context,
builder: (context) { builder: (context) {
return UpdateVisitsGroupSheet(visits: visits,title: _subtitle.updateRegularVisits,); return UpdateVisitsGroupSheet(
visits: visits,
title: _subtitle.updateRegularVisits,
);
}, },
)as VisitsGroup; ) as VisitsGroup;
if(_group != null){ if (_group != null) {
showDialog<void>( showDialog<void>(
context: context, context: context,
barrierDismissible: false, barrierDismissible: false,
@ -148,24 +149,17 @@ class _RegularVisitsPageState extends State<RegularVisitsPage>
); );
}, },
); );
int status = await _visitsProvider.updateGroupOfVisits( int status = await _visitsProvider.updateGroupOfVisits(user: _userProvider.user, host: _settingProvider.host, group: _group);
user: _userProvider.user,
host: _settingProvider.host,
group: _group
);
Navigator.of(context).pop(); Navigator.of(context).pop();
if(status >= 200 && status < 300){ if (status >= 200 && status < 300) {
Fluttertoast.showToast( Fluttertoast.showToast(
msg: _subtitle.preventiveMaintenanceUpdatedSuccessfully, msg: _subtitle.preventiveMaintenanceUpdatedSuccessfully,
toastLength: Toast.LENGTH_LONG, toastLength: Toast.LENGTH_LONG,
gravity: ToastGravity.BOTTOM, gravity: ToastGravity.BOTTOM,
); );
}else{ } else {
Fluttertoast.showToast( Fluttertoast.showToast(
msg: HttpStatusManger.getStatusMessage( msg: HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle),
status: status,
subtitle: _subtitle
),
toastLength: Toast.LENGTH_LONG, toastLength: Toast.LENGTH_LONG,
gravity: ToastGravity.BOTTOM, gravity: ToastGravity.BOTTOM,
); );
@ -177,7 +171,6 @@ class _RegularVisitsPageState extends State<RegularVisitsPage>
), ),
], ],
), ),
], ],
), ),
), ),

@ -14,6 +14,7 @@ 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/status/employee/engineers_mune.dart'; import 'package:test_sa/views/widgets/status/employee/engineers_mune.dart';
import 'package:test_sa/views/widgets/visits/visit_status.dart'; 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;
@ -70,20 +71,24 @@ class _UpdateVisitsGroupSheetState extends State<UpdateVisitsGroupSheet> {
), ),
ASmallButton( ASmallButton(
text: _subtitle.cancel, text: _subtitle.cancel,
onPressed: (){ onPressed: () {
Navigator.of(context).pop(); Navigator.of(context).pop();
}, },
), ),
], ],
), ),
SizedBox(height: 8 * AppStyle.getScaleFactor(context),), SizedBox(
height: 8 * AppStyle.getScaleFactor(context),
),
EngineersMenu( EngineersMenu(
initialValue: _group.engineer, initialValue: _group.engineer,
onSelect: (engineer){ onSelect: (engineer) {
_group.engineer = engineer; _group.engineer = engineer;
}, },
), ),
SizedBox(height: 8 * AppStyle.getScaleFactor(context),), SizedBox(
height: 8 * AppStyle.getScaleFactor(context),
),
// AOneImagePicker( // AOneImagePicker(
// image: _image, // image: _image,
// onPick: (image){ // onPick: (image){
@ -200,37 +205,29 @@ class _UpdateVisitsGroupSheetState extends State<UpdateVisitsGroupSheet> {
// ), // ),
// ), // ),
// ), // ),
SizedBox(height: 8 * AppStyle.getScaleFactor(context),), SizedBox(
height: 8 * AppStyle.getScaleFactor(context),
),
Expanded( Expanded(
child: ListView.builder( child: ListView.builder(
itemCount: widget.visits.length, itemCount: widget.visits.length,
itemBuilder: (context,index){ itemBuilder: (context, index) {
Visit visit = widget.visits[index]; Visit visit = widget.visits[index];
return Container( return Container(
padding: EdgeInsets.symmetric(vertical: 8,horizontal: 8), padding: EdgeInsets.symmetric(vertical: 8, horizontal: 8),
margin: EdgeInsets.symmetric(vertical: 4), margin: EdgeInsets.symmetric(vertical: 4),
decoration: BoxDecoration( decoration: BoxDecoration(color: AColors.primaryColor, borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), boxShadow: [AppStyle.boxShadow]),
color: AColors.primaryColor,
borderRadius: BorderRadius.circular(
AppStyle.getBorderRadius(context)
),
boxShadow: [
AppStyle.boxShadow
]
),
child: Row( child: Row(
children: [ children: [
Expanded( Expanded(
child: Text( child: Text(
"${_subtitle.sn}: "+visit.deviceSerialNumber ?? _subtitle.noSerialNumberFound, "${_subtitle.sn}: " + visit.deviceSerialNumber ?? _subtitle.noSerialNumberFound,
style: Theme.of(context).textTheme.headline6.copyWith( style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontSize: 16, fontWeight: FontWeight.bold),
color: AColors.white,
fontSize: 16,
fontWeight: FontWeight.bold
), ),
), ),
), VisitStatusLabel(
VisitStatusLabel(visit: visit,) visit: visit,
)
], ],
), ),
); );
@ -239,13 +236,12 @@ class _UpdateVisitsGroupSheetState extends State<UpdateVisitsGroupSheet> {
), ),
AButton( AButton(
text: _subtitle.update, text: _subtitle.update,
onPressed: (){ onPressed: () {
Navigator.of(context).pop(_group); Navigator.of(context).pop(_group);
}, },
), ),
], ],
), ),
], ],
), ),
); );

@ -29,8 +29,8 @@ class VisitDetailsPage extends StatelessWidget {
child: Column( child: Column(
children: [ children: [
Container( Container(
color:AColors.primaryColor, color: AColors.primaryColor,
padding: const EdgeInsets.symmetric(horizontal: 0,vertical: 4), padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4),
child: Row( child: Row(
children: [ children: [
ABackButton(), ABackButton(),
@ -38,10 +38,7 @@ class VisitDetailsPage extends StatelessWidget {
child: Center( child: Center(
child: Text( child: Text(
_subtitle.visitInformation, _subtitle.visitInformation,
style: Theme.of(context).textTheme.headline6.copyWith( style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic),
color: AColors.white,
fontStyle: FontStyle.italic
),
), ),
), ),
), ),
@ -51,9 +48,11 @@ class VisitDetailsPage extends StatelessWidget {
buttonSize: 42, buttonSize: 42,
backgroundColor: AColors.green, backgroundColor: AColors.green,
onPressed: () async { onPressed: () async {
Navigator.of(context).push( Navigator.of(context).push(MaterialPageRoute(
MaterialPageRoute(builder: (_)=> EditPentry(visit: visit,pentry: visit.pentry,)) builder: (_) => EditPentry(
); visit: visit,
pentry: visit.pentry,
)));
}, },
), ),
SizedBox(width: 42) SizedBox(width: 42)
@ -64,12 +63,13 @@ class VisitDetailsPage extends StatelessWidget {
child: ListView( child: ListView(
padding: EdgeInsets.symmetric(horizontal: 16), padding: EdgeInsets.symmetric(horizontal: 16),
children: [ children: [
SizedBox(height: 8,), SizedBox(
height: 8,
),
MaterialButton( MaterialButton(
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
onPressed: (){ onPressed: () {
Navigator.of(context).push( Navigator.of(context).push(MaterialPageRoute(
MaterialPageRoute(
builder: (_) => Scaffold( builder: (_) => Scaffold(
body: InteractiveViewer( body: InteractiveViewer(
child: Center( child: Center(
@ -79,27 +79,29 @@ class VisitDetailsPage extends StatelessWidget {
), ),
), ),
), ),
) )));
)
);
}, },
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,
child: ImageLoader( child: ImageLoader(
url: visit.images.isEmpty ? " ":visit.images.first, url: visit.images.isEmpty ? " " : visit.images.first,
boxFit: BoxFit.cover, boxFit: BoxFit.cover,
), ),
), ),
), ),
SizedBox(height: 8,),
SizedBox( SizedBox(
height: 60* AppStyle.getScaleFactor(context), height: 8,
),
SizedBox(
height: 60 * AppStyle.getScaleFactor(context),
child: ImagesList( child: ImagesList(
images: visit.images, images: visit.images,
), ),
), ),
SizedBox(height: 8,), SizedBox(
height: 8,
),
RequestInfoRow( RequestInfoRow(
title: _subtitle.code, title: _subtitle.code,
info: visit.serialNumber, info: visit.serialNumber,
@ -112,7 +114,6 @@ class VisitDetailsPage extends StatelessWidget {
title: _subtitle.deviceSN, title: _subtitle.deviceSN,
info: visit.deviceSerialNumber, info: visit.deviceSerialNumber,
), ),
RequestInfoRow( RequestInfoRow(
title: _subtitle.expectDate, title: _subtitle.expectDate,
info: visit.expectDate, info: visit.expectDate,
@ -126,17 +127,18 @@ class VisitDetailsPage extends StatelessWidget {
Expanded( Expanded(
child: Text( child: Text(
"${_subtitle.status} : ", "${_subtitle.status} : ",
style: Theme.of(context).textTheme.subtitle1.copyWith( style: Theme.of(context).textTheme.subtitle1.copyWith(fontWeight: FontWeight.bold),
fontWeight: FontWeight.bold
),
textScaleFactor: AppStyle.getScaleFactor(context), textScaleFactor: AppStyle.getScaleFactor(context),
), ),
), ),
VisitStatusLabel(visit: visit,), VisitStatusLabel(
visit: visit,
),
], ],
), ),
Divider(
Divider(color: Theme.of(context).primaryColor,), color: Theme.of(context).primaryColor,
),
RequestInfoRow( RequestInfoRow(
title: _subtitle.contactStatus, title: _subtitle.contactStatus,
info: visit.assignTo, info: visit.assignTo,

@ -1,20 +1,18 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.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 AppNameBar extends StatelessWidget { class AppNameBar extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Container( return Container(
height: 50 * AppStyle.getScaleFactor(context), height: 50 * AppStyle.getScaleFactor(context),
color:AColors.primaryColor, color: AColors.primaryColor,
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
child: Center( child: Center(
child: Text( child: Text(
"Test SA", "Test SA",
style: Theme.of(context).textTheme.headline6.copyWith( style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic),
color: AColors.white,
fontStyle: FontStyle.italic
),
), ),
), ),
); );

@ -7,7 +7,7 @@ class ABackButton extends StatelessWidget {
final VoidCallback onPressed; final VoidCallback onPressed;
final IconData icon; final IconData icon;
const ABackButton({Key key, this.onPressed,this.icon}) : super(key: key); const ABackButton({Key key, this.onPressed, this.icon}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {

@ -27,7 +27,7 @@ class AButton extends StatelessWidget {
onPressed: onPressed, onPressed: onPressed,
child: Text( child: Text(
text ?? "", text ?? "",
style: textStyle ?? Theme.of(context).textTheme.subtitle2.copyWith(color: AColors.white, fontSize: 14,fontWeight: FontWeight.w600), style: textStyle ?? Theme.of(context).textTheme.subtitle2.copyWith(color: AColors.white, fontSize: 14, fontWeight: FontWeight.w600),
textScaleFactor: AppStyle.getScaleFactor(context), textScaleFactor: AppStyle.getScaleFactor(context),
), ),
), ),

@ -8,19 +8,19 @@ class AFlatButton extends StatelessWidget {
final EdgeInsets padding; final EdgeInsets padding;
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(
style: TextButton.styleFrom( style: TextButton.styleFrom(
foregroundColor: this.textColor ?? Colors.black, padding: padding, foregroundColor: this.textColor ?? Colors.black,
padding: padding,
), ),
onPressed: onPressed, onPressed: onPressed,
child: Text( child: Text(
text??"", text ?? "",
style: style ?? Theme.of(context).textTheme.bodyText1, style: style ?? Theme.of(context).textTheme.bodyText1,
textScaleFactor: AppStyle.getScaleFactor(context), textScaleFactor: AppStyle.getScaleFactor(context),
) ));
);
} }
} }

@ -2,8 +2,8 @@ import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.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 AIconButton extends StatelessWidget {
class AIconButton extends StatelessWidget {
final IconData iconData; final IconData iconData;
final Color color; final Color color;
final Color backgroundColor; final Color backgroundColor;
@ -11,16 +11,7 @@ class AIconButton extends StatelessWidget {
final double iconSize; final double iconSize;
final double buttonSize; final double buttonSize;
const AIconButton({Key key, this.iconData, this.onPressed, this.color, this.iconSize, this.buttonSize = 54, this.backgroundColor}) : super(key: key);
const AIconButton({
Key key,
this.iconData,
this.onPressed,
this.color,
this.iconSize,
this.buttonSize = 54,
this.backgroundColor
}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -30,11 +21,7 @@ class AIconButton extends StatelessWidget {
child: ElevatedButton( child: ElevatedButton(
style: ElevatedButton.styleFrom( style: ElevatedButton.styleFrom(
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular((AppStyle.borderRadius - 4) * AppStyle.getScaleFactor(context))),
borderRadius: BorderRadius.circular(
(AppStyle.borderRadius - 4) * AppStyle.getScaleFactor(context)
)
),
backgroundColor: backgroundColor ?? AColors.onPrimaryColor, backgroundColor: backgroundColor ?? AColors.onPrimaryColor,
), ),
onPressed: onPressed, onPressed: onPressed,

@ -1,8 +1,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/app_style/sizing.dart';
class AIconButton2 extends StatelessWidget {
class AIconButton2 extends StatelessWidget {
final IconData iconData; final IconData iconData;
final Color color; final Color color;
final VoidCallback onPressed; final VoidCallback onPressed;

@ -16,11 +16,7 @@ class AOutLinedButton extends StatelessWidget {
return OutlinedButton( return OutlinedButton(
style: ElevatedButton.styleFrom( style: ElevatedButton.styleFrom(
padding: padding ?? EdgeInsets.symmetric(vertical: 12), padding: padding ?? EdgeInsets.symmetric(vertical: 12),
textStyle: textStyle ?? Theme textStyle: textStyle ?? Theme.of(context).textTheme.subtitle2.copyWith(fontSize: 18),
.of(context)
.textTheme
.subtitle2
.copyWith(fontSize: 18),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context))), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context))),
), ),
onPressed: onPressed, onPressed: onPressed,
@ -29,11 +25,7 @@ class AOutLinedButton extends StatelessWidget {
Expanded( Expanded(
child: Text( child: Text(
text ?? "", text ?? "",
style: Theme style: Theme.of(context).textTheme.subtitle2.copyWith(color: AColors.primaryColor, fontSize: 14, fontWeight: FontWeight.w600),
.of(context)
.textTheme
.subtitle2
.copyWith(color: AColors.primaryColor, fontSize: 14, fontWeight: FontWeight.w600),
textAlign: TextAlign.center, textAlign: TextAlign.center,
textScaleFactor: AppStyle.getScaleFactor(context), textScaleFactor: AppStyle.getScaleFactor(context),
), ),

@ -8,26 +8,20 @@ class ASmallButton extends StatelessWidget {
final EdgeInsets padding; final EdgeInsets padding;
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(
style: ElevatedButton.styleFrom( style: ElevatedButton.styleFrom(
padding: padding, padding: padding,
primary: color ?? Theme.of(context).primaryColor, primary: color ?? Theme.of(context).primaryColor,
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)),
borderRadius: BorderRadius.circular(8)
),
), ),
child: Text( child: Text(
text??"", text ?? "",
style: style ?? Theme.of(context).textTheme.bodyText1.copyWith( style: style ?? Theme.of(context).textTheme.bodyText1.copyWith(color: color == Colors.white ? Theme.of(context).primaryColor : Colors.white),
color: color == Colors.white
? Theme.of(context).primaryColor : Colors.white
),
textScaleFactor: AppStyle.getScaleFactor(context), textScaleFactor: AppStyle.getScaleFactor(context),
), ),
onPressed: onPressed onPressed: onPressed);
);
} }
} }

@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
class CarveInImage extends CustomClipper<Path> { class CarveInImage extends CustomClipper<Path> {
final double gab; final double gab;
var radius=10.0; var radius = 10.0;
CarveInImage(this.gab); CarveInImage(this.gab);
@ -10,14 +10,14 @@ class CarveInImage extends CustomClipper<Path> {
Path getClip(Size size) { Path getClip(Size size) {
Path path = Path(); Path path = Path();
path.lineTo(0, size.height); path.lineTo(0, size.height);
path.lineTo(size.width/2 - gab / 2, size.height); path.lineTo(size.width / 2 - gab / 2, size.height);
path.arcToPoint(Offset(size.width/2 + gab / 2, size.height), path.arcToPoint(Offset(size.width / 2 + gab / 2, size.height), radius: Radius.circular(gab / 2));
radius: Radius.circular(gab/2));
path.lineTo(size.width, size.height); path.lineTo(size.width, size.height);
path.lineTo(size.width, 0); path.lineTo(size.width, 0);
path.lineTo(0, 0); path.lineTo(0, 0);
return path; return path;
} }
@override @override
bool shouldReclip(CustomClipper<Path> oldClipper) => true; bool shouldReclip(CustomClipper<Path> oldClipper) => true;
} }

@ -16,23 +16,15 @@ class ADatePicker extends StatelessWidget {
foregroundColor: Colors.white, foregroundColor: Colors.white,
textStyle: Theme.of(context).textTheme.subtitle2, textStyle: Theme.of(context).textTheme.subtitle2,
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular( borderRadius: BorderRadius.circular(12 * AppStyle.getScaleFactor(context)),
12 * AppStyle.getScaleFactor(context)
),
), ),
), ),
child: Text( child: Text(
date == null ? "Pick Date" : date == null ? "Pick Date" : date.toString().split(" ").first,
date.toString().split(" ").first,
textScaleFactor: AppStyle.getScaleFactor(context), textScaleFactor: AppStyle.getScaleFactor(context),
), ),
onPressed: () async { onPressed: () async {
DateTime picked = await showDatePicker( DateTime picked = await showDatePicker(context: context, initialDate: DateTime.now(), firstDate: from ?? DateTime.now(), lastDate: to ?? DateTime.now().add(Duration(days: 365)));
context: context,
initialDate: DateTime.now(),
firstDate: from ?? DateTime.now(),
lastDate: to ?? DateTime.now().add(Duration(days: 365))
);
onDatePicker(picked); onDatePicker(picked);
}, },
); );

@ -4,6 +4,7 @@ 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 'date_picker.dart'; import 'date_picker.dart';
class FromToDateBar extends StatefulWidget { class FromToDateBar extends StatefulWidget {
final DateTime from; final DateTime from;
final DateTime to; final DateTime to;
@ -32,22 +33,18 @@ class _FromToDateBarState extends State<FromToDateBar> {
return Row( return Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly, mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [ children: [
Column( Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text( Text(
_subtitle.from, _subtitle.from,
style: Theme.of(context).textTheme.bodyText1.copyWith( style: Theme.of(context).textTheme.bodyText1.copyWith(fontSize: 12, fontWeight: FontWeight.normal),
fontSize: 12,
fontWeight: FontWeight.normal
),
textScaleFactor: AppStyle.getScaleFactor(context), textScaleFactor: AppStyle.getScaleFactor(context),
), ),
ADatePicker( ADatePicker(
date: _from, date: _from,
from: DateTime(1950), from: DateTime(1950),
onDatePicker: (date){ onDatePicker: (date) {
_from = date; _from = date;
setState(() {}); setState(() {});
widget.onPickFrom(date); widget.onPickFrom(date);
@ -60,16 +57,13 @@ class _FromToDateBarState extends State<FromToDateBar> {
children: [ children: [
Text( Text(
_subtitle.to, _subtitle.to,
style: Theme.of(context).textTheme.bodyText1.copyWith( style: Theme.of(context).textTheme.bodyText1.copyWith(fontSize: 12, fontWeight: FontWeight.normal),
fontSize: 12,
fontWeight: FontWeight.normal
),
textScaleFactor: AppStyle.getScaleFactor(context), textScaleFactor: AppStyle.getScaleFactor(context),
), ),
ADatePicker( ADatePicker(
date: _to, date: _to,
from: DateTime(1950), from: DateTime(1950),
onDatePicker: (date){ onDatePicker: (date) {
_to = date; _to = date;
setState(() {}); setState(() {});
widget.onPickTo(date); widget.onPickTo(date);

@ -6,6 +6,7 @@ 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/departments/single_department_picker.dart'; import 'package:test_sa/views/widgets/departments/single_department_picker.dart';
class DepartmentButton extends StatelessWidget { class DepartmentButton extends StatelessWidget {
final Function(Department) onDepartmentPick; final Function(Department) onDepartmentPick;
final Department department; final Department department;

@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:test_sa/models/department.dart'; import 'package:test_sa/models/department.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 DepartmentItem extends StatelessWidget { class DepartmentItem extends StatelessWidget {
final Department department; final Department department;
final Function(Department) onPressed; final Function(Department) onPressed;
@ -10,28 +11,23 @@ class DepartmentItem extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Padding( return Padding(
padding: EdgeInsets.symmetric(horizontal: 16,vertical: 6), padding: EdgeInsets.symmetric(horizontal: 16, vertical: 6),
child: ElevatedButton( child: ElevatedButton(
style: ElevatedButton.styleFrom( style: ElevatedButton.styleFrom(
backgroundColor: AColors.primaryColor, backgroundColor: AColors.primaryColor,
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular( borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)),
AppStyle.getBorderRadius(context)
),
), ),
), ),
onPressed: (){ onPressed: () {
onPressed(department); onPressed(department);
}, },
child: ListTile( child: ListTile(
title: Text( title: Text(
department.name ?? "", department.name ?? "",
style: Theme.of(context).textTheme.subtitle1.copyWith( style: Theme.of(context).textTheme.subtitle1.copyWith(color: AColors.white),
color: AColors.white
),
textDirection: TextDirection.rtl, textDirection: TextDirection.rtl,
), ),
), ),
), ),
); );

@ -10,6 +10,7 @@ import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; import 'package:test_sa/views/widgets/loaders/no_item_found.dart';
import '../app_text_form_field.dart'; 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
@ -26,7 +27,7 @@ class _SingleDepartmentPickerState extends State<SingleDepartmentPicker> {
_departmentsProvider = Provider.of<DepartmentsProvider>(context); _departmentsProvider = Provider.of<DepartmentsProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
Subtitle _subtitle = AppLocalization.of(context).subtitle; Subtitle _subtitle = AppLocalization.of(context).subtitle;
if(_firstTime && _departmentsProvider.departments != null){ if (_firstTime && _departmentsProvider.departments != null) {
_searchableList.addAll(_departmentsProvider.departments); _searchableList.addAll(_departmentsProvider.departments);
_firstTime = false; _firstTime = false;
} }
@ -45,35 +46,35 @@ class _SingleDepartmentPickerState extends State<SingleDepartmentPicker> {
}, },
child: Column( child: Column(
children: [ children: [
SizedBox(height: 48,), SizedBox(
height: 48,
),
Padding( Padding(
padding: const EdgeInsets.symmetric(vertical: 8,horizontal: 16), padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16),
child: ATextFormField( child: ATextFormField(
hintText: _subtitle.searchByName, hintText: _subtitle.searchByName,
style: Theme.of(context).textTheme.headline6, style: Theme.of(context).textTheme.headline6,
suffixIcon: Icon(Icons.search_rounded), suffixIcon: Icon(Icons.search_rounded),
onChange: (value){ onChange: (value) {
_searchableList.clear(); _searchableList.clear();
_searchableList.addAll(_departmentsProvider.departments.where( _searchableList.addAll(_departmentsProvider.departments.where((element) => element.name.toLowerCase().contains(value.toLowerCase())).toList());
(element) => element.name.toLowerCase().contains(
value.toLowerCase()
)
).toList());
setState(() {}); setState(() {});
}, },
), ),
), ),
Expanded( Expanded(
child: _searchableList.isEmpty ? child: _searchableList.isEmpty
NoItemFound(message: _subtitle.noUniteFound,): ? NoItemFound(
ListView.builder( message: _subtitle.noUniteFound,
)
: ListView.builder(
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
shrinkWrap: true, shrinkWrap: true,
itemCount: _searchableList.length, itemCount: _searchableList.length,
itemBuilder: (listContext,itemIndex){ itemBuilder: (listContext, itemIndex) {
return DepartmentItem( return DepartmentItem(
department: _searchableList[itemIndex], department: _searchableList[itemIndex],
onPressed: (hospital){ onPressed: (hospital) {
Navigator.of(context).pop(hospital); Navigator.of(context).pop(hospital);
}, },
); );

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save