implement searchWorkOrders api and edit on ui

main
nextwo 3 years ago
parent f39b6f5d8e
commit 756e2a1881

@ -8,7 +8,6 @@ import 'package:http/http.dart';
import 'package:test_sa/models/user.dart';
class ApiManager {
ApiManager._();
Map<String, String> get _headers => {
@ -21,10 +20,9 @@ class ApiManager {
User user;
Future<http.Response> get(
String url,
{Map<String,String> headers,}
) async{
String url, {
Map<String, String> headers,
}) async {
headers ??= {};
headers.addAll(_headers);
@ -47,9 +45,7 @@ class ApiManager {
String url, {
Map<String, String> headers,
@required Map<String, dynamic> body,
}
) async{
}) async {
headers ??= {};
headers.addAll(_headers);
@ -81,9 +77,7 @@ class ApiManager {
String url, {
Map<String, String> headers,
@required Map<String, dynamic> body,
}
) async{
}) async {
headers ??= {};
headers.addAll(_headers);
@ -115,7 +109,9 @@ class ApiManager {
@required Map<String, String> body,
@required List<Future<MultipartFile>> files,
}) async {
Map<String,String> _headers = const {'Content-Type': 'multipart/form-data',};
Map<String, String> _headers = const {
'Content-Type': 'multipart/form-data',
};
headers ??= {};

@ -35,6 +35,5 @@ class HttpStatusManger{
// no error match so return default error
return subtitle.failedToCompleteRequest;
}
}
}

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

@ -8,7 +8,6 @@ import 'package:test_sa/models/app_notification.dart';
import 'notification_manger.dart';
class FirebaseNotificationManger {
static FirebaseMessaging messaging = FirebaseMessaging.instance;
static String token;
@ -56,28 +55,17 @@ class FirebaseNotificationManger{
FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
AppNotification notification = AppNotification.fromJson(message.data);
if(notification.path == null
|| notification.path.isEmpty)
return;
Navigator.pushNamed(
context,
notification.path,
arguments: notification.requestId
);
if (notification.path == null || notification.path.isEmpty) return;
Navigator.pushNamed(context, notification.path, arguments: notification.requestId);
});
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
AppNotification notification = AppNotification.fromJson(message.data);
NotificationManger.showNotification(
title: message.notification.title,
subtext: message.notification.body,
hashcode: int.tryParse(notification.requestId ?? "") ?? 1,
payload: json.encode(message.data)
);
title: message.notification.title, subtext: message.notification.body, hashcode: int.tryParse(notification.requestId ?? "") ?? 1, payload: json.encode(message.data));
return;
});
}
}
Future<void> firebaseMessagingBackgroundHandler(RemoteMessage message) async {
}
Future<void> firebaseMessagingBackgroundHandler(RemoteMessage message) async {}

@ -12,39 +12,22 @@ class NotificationManger{
/// onNotificationPressed action when notification pressed to open tap
/// onIOSNotificationPressed action when notification pressed
/// to open tap in iOS versions older than 10
static initialisation(
Function(NotificationResponse) onNotificationPressed,
DidReceiveLocalNotificationCallback onIOSNotificationPressed
) async {
FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
FlutterLocalNotificationsPlugin();
static initialisation(Function(NotificationResponse) onNotificationPressed, 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
const AndroidInitializationSettings initializationSettingsAndroid =
AndroidInitializationSettings('app_icon',);
const AndroidInitializationSettings initializationSettingsAndroid = AndroidInitializationSettings(
'app_icon',
);
final DarwinInitializationSettings initializationSettingsDarwin =
DarwinInitializationSettings(
onDidReceiveLocalNotification: onIOSNotificationPressed);
final DarwinInitializationSettings initializationSettingsDarwin = DarwinInitializationSettings(onDidReceiveLocalNotification: onIOSNotificationPressed);
final InitializationSettings initializationSettings = InitializationSettings(
android: initializationSettingsAndroid,
iOS: initializationSettingsDarwin,
macOS: initializationSettingsDarwin);
final InitializationSettings initializationSettings = InitializationSettings(android: initializationSettingsAndroid, iOS: initializationSettingsDarwin, macOS: initializationSettingsDarwin);
await flutterLocalNotificationsPlugin.initialize(
initializationSettings,
onDidReceiveNotificationResponse: onNotificationPressed);
await flutterLocalNotificationsPlugin.initialize(initializationSettings, onDidReceiveNotificationResponse: onNotificationPressed);
}
// push new notification
static Future showNotification(
{
@required String title,
@required String subtext,
@required int hashcode,
String payload
}) async {
static Future showNotification({@required String title, @required String subtext, @required int hashcode, String payload}) async {
const AndroidNotificationDetails androidChannel = AndroidNotificationDetails(
'com.newtrack.testsa',
'Test SA',
@ -62,8 +45,7 @@ class NotificationManger{
groupKey: 'com.newtrack.testsa',
);
const DarwinNotificationDetails iosNotificationDetails =
DarwinNotificationDetails(
const DarwinNotificationDetails iosNotificationDetails = DarwinNotificationDetails(
categoryIdentifier: "testSA",
);
@ -81,5 +63,4 @@ class NotificationManger{
payload: payload,
);
}
}

@ -7,7 +7,6 @@ import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/department.dart';
class DepartmentsProvider extends ChangeNotifier {
//reset provider data
void reset() {
departments = null;
@ -19,7 +18,6 @@ class DepartmentsProvider extends ChangeNotifier{
// 500 service not available
int stateCode;
// contain user data
// when user not login or register _user = null
List<Department> departments;
@ -29,26 +27,21 @@ class DepartmentsProvider extends ChangeNotifier{
// failed _loading = false
bool isLoading;
/// return -2 if request in progress
/// return -1 if error happen when sending request
/// return state code if request complete may be 200, 404 or 403
/// for more details check http state manager
/// lib\controllers\http_status_manger\http_status_manger.dart
Future<int> getDepartment(String host) async {
if(isLoading == true)
return -2;
if (isLoading == true) return -2;
isLoading = true;
notifyListeners();
Response response;
try {
response = await ApiManager.instance.post(
URLs.getDepartments,
body: {
response = await ApiManager.instance.post(URLs.getDepartments, body: {
"pageSize": 50,
// if(title != null && title.isNotEmpty) "name":title,
}
);
});
} catch (error) {
isLoading = false;
stateCode = -1;
@ -65,5 +58,4 @@ class DepartmentsProvider extends ChangeNotifier{
notifyListeners();
return response.statusCode;
}
}

@ -144,8 +144,7 @@ class DeviceTransferProvider extends ChangeNotifier {
};
if (isSender) {
body.addAll(
{
body.addAll({
"senderSiteId": newModel.client.id,
"senderDepartmentId": newModel.department.id,
"senderAssignedEmployeeId": newModel.userId,
@ -162,11 +161,9 @@ class DeviceTransferProvider extends ChangeNotifier {
"receiverWorkingHours": oldModel.receiver.workingHours,
"receiverTravelingHours": oldModel.receiver.travelingHours,
"receiverAttachmentName": "${oldModel.receiver.signature}.png",
}
);
});
} else {
body.addAll(
{
body.addAll({
"senderSiteId": oldModel.sender.client.id,
"senderDepartmentId": oldModel.sender.department.id,
"senderAssignedEmployeeId": oldModel.sender.userId,
@ -183,21 +180,16 @@ class DeviceTransferProvider extends ChangeNotifier {
"receiverWorkingHours": newModel.workingHours,
"receiverTravelingHours": newModel.travelingHours,
"receiverAttachmentName": "${newModel.signature}.png",
}
);
});
}
print(body["senderWorkingHours"]);
body.addAll(newModel.toJson(isSender));
print(body);
Response response;
try {
response = await ApiManager.instance.put(
URLs.updateDeviceTransfer,
body: body
);
response = await ApiManager.instance.put(URLs.updateDeviceTransfer, body: body);
print(response.body);
print("${newModel.signature}.png");

@ -72,8 +72,7 @@ class DevicesProvider extends ChangeNotifier {
List equipmentListJson = json.decode(response.body)["data"];
_devices.addAll(equipmentListJson.map<Device>((device) => Device.fromJson(device)).toList());
nextPage = true;
}else
{
} else {
nextPage = false;
}
_loading = false;

@ -8,7 +8,6 @@ import 'package:test_sa/models/gas_refill/gas_refill_model.dart';
import 'package:test_sa/models/user.dart';
class GasRefillProvider extends ChangeNotifier {
// number of items call in each request
final pageItemNumber = 50;
@ -44,8 +43,7 @@ class GasRefillProvider extends ChangeNotifier{
@required String host,
@required User user,
}) async {
if(isLoading == true)
return -2;
if (isLoading == true) return -2;
isLoading = true;
Response response;
@ -61,8 +59,7 @@ class GasRefillProvider extends ChangeNotifier{
if (stateCode >= 200 && stateCode < 300) {
// client's request was successfully received
List requestsListJson = json.decode(response.body)["data"];
List<GasRefillModel> itemsPage = requestsListJson.map(
(request) => GasRefillModel.fromJson(request)).toList();
List<GasRefillModel> itemsPage = requestsListJson.map((request) => GasRefillModel.fromJson(request)).toList();
items ??= [];
items.addAll(itemsPage);
if (itemsPage.length == pageItemNumber) {
@ -75,14 +72,12 @@ class GasRefillProvider extends ChangeNotifier{
isLoading = false;
notifyListeners();
return response.statusCode;
} catch (error) {
isLoading = false;
stateCode = -1;
notifyListeners();
return -1;
}
}
Future<int> createModel({
@ -97,19 +92,18 @@ class GasRefillProvider extends ChangeNotifier{
"status": model.status.toMap(),
};
body["gazRefillDetails"] = model.details.map((model) => {
body["gazRefillDetails"] = model.details
.map((model) => {
"gasType": model.type.toMap(),
"cylinderSize": model.cylinderSize.toMap(),
"cylinderType": model.cylinderType.toMap(),
"requestedQty": model.requestedQuantity,
}).toList();
})
.toList();
Response response;
try {
response = await ApiManager.instance.post(
URLs.requestGasRefill,
body: body
);
response = await ApiManager.instance.post(URLs.requestGasRefill, body: body);
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
if (items != null) {
@ -118,11 +112,9 @@ class GasRefillProvider extends ChangeNotifier{
}
}
return response.statusCode;
} catch (error) {
return -1;
}
}
Future<int> updateModel({
@ -137,20 +129,19 @@ class GasRefillProvider extends ChangeNotifier{
"status": newModel.status.toMap(),
};
body["gazRefillDetails"] = newModel.details.map((model) => {
body["gazRefillDetails"] = newModel.details
.map((model) => {
"gasType": model.type.toMap(),
"cylinderSize": model.cylinderSize.toMap(),
"cylinderType": model.cylinderType.toMap(),
"requestedQty": model.requestedQuantity,
"deliverdQty": model.deliveredQuantity,
}).toList();
})
.toList();
Response response;
try {
response = await ApiManager.instance.put(
URLs.updateGasRefill,
body: body
);
response = await ApiManager.instance.put(URLs.updateGasRefill, body: body);
// response = await post(
// Uri.parse("$host${URLs.updateGasRefill}/${newModel.id}"),
// body: body,
@ -162,10 +153,8 @@ class GasRefillProvider extends ChangeNotifier{
notifyListeners();
}
return response.statusCode;
} catch (error) {
return -1;
}
}
}

@ -9,7 +9,6 @@ import 'package:test_sa/models/hospital.dart';
import 'package:test_sa/models/user.dart';
class HospitalsProvider extends ChangeNotifier {
// number of items call in each request
final pageItemNumber = 50;
@ -50,27 +49,22 @@ class HospitalsProvider extends ChangeNotifier{
/// for more details check http state manager
/// lib\controllers\http_status_manger\http_status_manger.dart
Future<int> getHospitals({String host, User user, String title}) async {
if(_loading == true)
return -2;
if (_loading == true) return -2;
_loading = true;
notifyListeners();
Response response;
try {
response = await ApiManager.instance.post(
URLs.getHospitals,
body: {
response = await ApiManager.instance.post(URLs.getHospitals, body: {
"pageNumber": (hospitals?.length ?? 0) ~/ pageItemNumber + 1,
"pageSize": 50,
if (title != null && title.isNotEmpty) "name": title,
}
);
});
_stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
List categoriesListJson = json.decode(response.body)["data"];
List<Hospital> _page = categoriesListJson.map((category) => Hospital.fromJson(category)).toList();
if(hospitals == null)
_hospitals = [];
if (hospitals == null) _hospitals = [];
_hospitals.addAll(_page);
if (_page.length >= pageItemNumber) {
@ -88,19 +82,15 @@ class HospitalsProvider extends ChangeNotifier{
notifyListeners();
return -1;
}
}
Future<List<Hospital>> getHospitalsList({String host, User user, String title}) async {
Response response;
try {
response = await ApiManager.instance.post(
URLs.getHospitals,
body: {
response = await ApiManager.instance.post(URLs.getHospitals, body: {
"pageSize": 50,
if (title != null && title.isNotEmpty) "name": title,
}
);
});
// response = await get(
// Uri.parse(host + URLs.getHospitals
// + ( title == null || title.isEmpty ? "" : "?name=$title" )),
@ -123,7 +113,5 @@ class HospitalsProvider extends ChangeNotifier{
notifyListeners();
return [];
}
}
}

@ -7,7 +7,6 @@ import 'package:test_sa/models/app_notification.dart';
import 'package:test_sa/models/user.dart';
class NotificationsProvider extends ChangeNotifier {
// number of items call in each request
final pageItemNumber = 20;
@ -34,7 +33,6 @@ class NotificationsProvider extends ChangeNotifier{
// failed _loading = false
bool isLoading;
/// return -2 if request in progress
/// return -1 if error happen when sending request
/// return state code if request complete may be 200, 404 or 403
@ -45,30 +43,24 @@ class NotificationsProvider extends ChangeNotifier{
@required User user,
@required int hospitalId,
}) async {
if(isLoading == true)
return -2;
if (isLoading == true) return -2;
isLoading = true;
notifyListeners();
Response response;
// userId = 397.toString(); // testing id to view data
try {
response = await get(
Uri.parse(URLs.getNotifications
+"?uid=${user.id}"
Uri.parse(URLs.getNotifications +
"?uid=${user.id}"
"&token=${user.token}"
"&page=${(notifications?.length ?? 0) ~/ pageItemNumber}"),
headers: {
"Content-Type":"application/json; charset=utf-8"
}
);
headers: {"Content-Type": "application/json; charset=utf-8"});
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
List requestsListJson = json.decode(utf8.decode(response.bodyBytes));
List<AppNotification> _serviceRequestsPage = requestsListJson.map(
(request) => AppNotification.fromJson(request)).toList();
if(notifications == null)
notifications = [];
List<AppNotification> _serviceRequestsPage = requestsListJson.map((request) => AppNotification.fromJson(request)).toList();
if (notifications == null) notifications = [];
notifications.addAll(_serviceRequestsPage);
if (_serviceRequestsPage.length == pageItemNumber) {
nextPage = true;
@ -85,7 +77,6 @@ class NotificationsProvider extends ChangeNotifier{
notifyListeners();
return -1;
}
}
/// return -2 if request in progress
@ -101,27 +92,18 @@ class NotificationsProvider extends ChangeNotifier{
//userId = 397.toString(); // testing id to view data
try {
response = await get(
Uri.parse(host+URLs.getNotifications
+"?uid=${user.id}&token=${user.token}"),
headers: {
"Content-Type":"application/json; charset=utf-8"
}
);
response = await get(Uri.parse(host + URLs.getNotifications + "?uid=${user.id}&token=${user.token}"), headers: {"Content-Type": "application/json; charset=utf-8"});
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
List requestsListJson = json.decode(utf8.decode(response.bodyBytes));
List<AppNotification> _recentNotifications = requestsListJson.map(
(request) => AppNotification.fromJson(request)).toList();
List<AppNotification> _recentNotifications = requestsListJson.map((request) => AppNotification.fromJson(request)).toList();
return _recentNotifications;
}
return null;
} catch (error) {
return null;
}
}
}

@ -9,7 +9,6 @@ import 'package:test_sa/models/part.dart';
import 'package:test_sa/models/user.dart';
class PartsProvider extends ChangeNotifier {
// number of items call in each request
final pageItemNumber = 50;
@ -50,25 +49,18 @@ class PartsProvider extends ChangeNotifier{
/// for more details check http state manager
/// lib\controllers\http_status_manger\http_status_manger.dart
Future<int> getParts({String host, User user, String title}) async {
if(_loading == true)
return -2;
if (_loading == true) return -2;
_loading = true;
notifyListeners();
Response response;
try {
response = await ApiManager.instance.post(
URLs.getPartNumber,
body: {
if(title != null && title.isNotEmpty)
"partName":title
});
response = await ApiManager.instance.post(URLs.getPartNumber, body: {if (title != null && title.isNotEmpty) "partName": title});
_stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
List categoriesListJson = json.decode(utf8.decode(response.bodyBytes));
List<Part> _page = categoriesListJson.map((part) => Part.fromJson(part)).toList();
if(parts == null)
_parts = [];
if (parts == null) _parts = [];
_parts.addAll(_page);
if (_page.length >= pageItemNumber) {
@ -86,7 +78,6 @@ class PartsProvider extends ChangeNotifier{
notifyListeners();
return -1;
}
}
/// return -2 if request in progress
@ -97,12 +88,7 @@ class PartsProvider extends ChangeNotifier{
Future<List<Part>> getPartsList({String host, User user, String title}) async {
Response response;
try {
response = await ApiManager.instance.post(
URLs.getPartNumber,
body: {
if(title != null && title.isNotEmpty)
"partName":title
});
response = await ApiManager.instance.post(URLs.getPartNumber, body: {if (title != null && title.isNotEmpty) "partName": title});
List<Part> _page = [];
if (response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
@ -113,7 +99,5 @@ class PartsProvider extends ChangeNotifier{
} catch (error) {
return [];
}
}
}

@ -12,7 +12,6 @@ import 'package:test_sa/models/visits/visits_group.dart';
import 'package:test_sa/models/visits/visits_search.dart';
class RegularVisitsProvider extends ChangeNotifier {
// number of items call in each request
final pageItemNumber = 20;
@ -51,8 +50,7 @@ class RegularVisitsProvider extends ChangeNotifier{
@required User user,
// VisitsSearch visitsSearch,
}) async {
if(isLoading == true)
return -2;
if (isLoading == true) return -2;
isLoading = true;
if (visits == null) notifyListeners();
Response response;
@ -79,9 +77,7 @@ class RegularVisitsProvider extends ChangeNotifier{
// client's request was successfully received
try {
List requestsListJson = json.decode(response.body)["data"];
List<Visit> _visits = requestsListJson.map(
(request) => Visit.fromJson(request)
).toList();
List<Visit> _visits = requestsListJson.map((request) => Visit.fromJson(request)).toList();
visits ??= [];
visits.addAll(_visits);
if (_visits.length == pageItemNumber) {
@ -139,12 +135,7 @@ class RegularVisitsProvider extends ChangeNotifier{
Future<Pentry> getPently({String host, User user, int id}) async {
Response response;
response = await get(
Uri.parse("$host${URLs.getPentry}/$id"),
headers: {
"Content-Type":"application/json; charset=utf-8"
}
);
response = await get(Uri.parse("$host${URLs.getPentry}/$id"), headers: {"Content-Type": "application/json; charset=utf-8"});
Pentry pantry;
if (response.statusCode >= 200 && response.statusCode < 300) {
@ -169,9 +160,7 @@ class RegularVisitsProvider extends ChangeNotifier{
// body["vChecklists"]?.addAll({});
// body["vCalibrationTools"]?.addAll({"visitId": visit.id,});
// body["vKits"]?.add({"visitId": visit.id,});
response = await ApiManager.instance.put(
URLs.updatePentry, body: body
);
response = await ApiManager.instance.put(URLs.updatePentry, body: body);
// response = await post(
// Uri.parse(host+URLs.updatePentry + "/${visit.id}"),
@ -182,10 +171,8 @@ class RegularVisitsProvider extends ChangeNotifier{
notifyListeners();
}
return response.statusCode;
} catch (error) {
return -1;
}
}
}

@ -249,7 +249,6 @@ class ServiceRequestsProvider extends ChangeNotifier {
}
Future<List<SearchWorkOrders>> searchWorkOrders({@required String callId}) async {
Response response;
try {
@ -272,7 +271,6 @@ class ServiceRequestsProvider extends ChangeNotifier {
}
}
return workOrders;
} catch (e) {
return [];
}

@ -9,7 +9,6 @@ import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/user.dart';
class AssignedToProvider extends ChangeNotifier {
//reset provider data
void reset() {
_items = null;
@ -43,8 +42,7 @@ class AssignedToProvider extends ChangeNotifier{
/// for more details check http state manager
/// lib\controllers\http_status_manger\http_status_manger.dart
Future<int> getData({String host, User user}) async {
if(_loading == true)
return -2;
if (_loading == true) return -2;
_loading = true;
notifyListeners();
Response response;
@ -67,7 +65,5 @@ class AssignedToProvider extends ChangeNotifier{
notifyListeners();
return -1;
}
}
}

@ -10,7 +10,6 @@ import 'package:flutter/material.dart';
import 'package:http/http.dart';
class EngineersProvider extends ChangeNotifier {
//reset provider data
void reset() {
_items = null;
@ -67,7 +66,5 @@ class EngineersProvider extends ChangeNotifier{
notifyListeners();
return -1;
}
}
}

@ -9,7 +9,6 @@ import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/user.dart';
class GasCylinderSizesProvider extends ChangeNotifier {
//reset provider data
void reset() {
_items = null;
@ -43,9 +42,11 @@ class GasCylinderSizesProvider extends ChangeNotifier{
/// return state code if request complete may be 200, 404 or 403
/// for more details check http state manager
/// lib\controllers\http_status_manger\http_status_manger.dart
Future<int> getData ({String host,User user,}) async {
if(_loading == true)
return -2;
Future<int> getData({
String host,
User user,
}) async {
if (_loading == true) return -2;
_loading = true;
notifyListeners();
Response response;
@ -68,7 +69,5 @@ class GasCylinderSizesProvider extends ChangeNotifier{
notifyListeners();
return -1;
}
}
}

@ -9,7 +9,6 @@ import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/user.dart';
class GasCylinderTypesProvider extends ChangeNotifier {
//reset provider data
void reset() {
_items = null;
@ -43,9 +42,11 @@ class GasCylinderTypesProvider extends ChangeNotifier{
/// return state code if request complete may be 200, 404 or 403
/// for more details check http state manager
/// lib\controllers\http_status_manger\http_status_manger.dart
Future<int> getData ({String host,User user,}) async {
if(_loading == true)
return -2;
Future<int> getData({
String host,
User user,
}) async {
if (_loading == true) return -2;
_loading = true;
notifyListeners();
Response response;
@ -68,7 +69,5 @@ class GasCylinderTypesProvider extends ChangeNotifier{
notifyListeners();
return -1;
}
}
}

@ -12,7 +12,6 @@ import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/user.dart';
class GasStatusProvider extends ChangeNotifier {
//reset provider data
void reset() {
_items = null;
@ -46,7 +45,10 @@ class GasStatusProvider extends ChangeNotifier{
/// return state code if request complete may be 200, 404 or 403
/// for more details check http state manager
/// 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;
_loading = true;
notifyListeners();
@ -70,7 +72,5 @@ class GasStatusProvider extends ChangeNotifier{
notifyListeners();
return -1;
}
}
}

@ -12,7 +12,6 @@ import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/user.dart';
class GasTypesProvider extends ChangeNotifier {
//reset provider data
void reset() {
_items = null;
@ -46,7 +45,10 @@ class GasTypesProvider extends ChangeNotifier{
/// return state code if request complete may be 200, 404 or 403
/// for more details check http state manager
/// 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;
_loading = true;
notifyListeners();
@ -70,7 +72,5 @@ class GasTypesProvider extends ChangeNotifier{
notifyListeners();
return -1;
}
}
}

@ -9,7 +9,6 @@ import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/user.dart';
class PentryStatusProvider extends ChangeNotifier {
//reset provider data
void reset() {
_items = null;
@ -43,8 +42,7 @@ class PentryStatusProvider extends ChangeNotifier{
/// for more details check http state manager
/// lib\controllers\http_status_manger\http_status_manger.dart
Future<int> getData({String host, User user}) async {
if(_loading == true)
return -2;
if (_loading == true) return -2;
_loading = true;
notifyListeners();
Response response;
@ -63,13 +61,10 @@ class PentryStatusProvider extends ChangeNotifier{
notifyListeners();
return response.statusCode;
} catch (error) {
_loading = false;
_stateCode = -1;
notifyListeners();
return -1;
}
}
}

@ -9,7 +9,6 @@ import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/user.dart';
class PentryTaskStatusProvider extends ChangeNotifier {
//reset provider data
void reset() {
_items = null;
@ -43,8 +42,7 @@ class PentryTaskStatusProvider extends ChangeNotifier{
/// for more details check http state manager
/// lib\controllers\http_status_manger\http_status_manger.dart
Future<int> getData({String host, User user}) async {
if(_loading == true)
return -2;
if (_loading == true) return -2;
_loading = true;
notifyListeners();
Response response;
@ -63,13 +61,10 @@ class PentryTaskStatusProvider extends ChangeNotifier{
notifyListeners();
return response.statusCode;
} catch (error) {
_loading = false;
_stateCode = -1;
notifyListeners();
return -1;
}
}
}

@ -9,7 +9,6 @@ import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/user.dart';
class PentryVisitStatusProvider extends ChangeNotifier {
//reset provider data
void reset() {
_items = null;
@ -43,8 +42,7 @@ class PentryVisitStatusProvider extends ChangeNotifier{
/// for more details check http state manager
/// lib\controllers\http_status_manger\http_status_manger.dart
Future<int> getData({String host, User user}) async {
if(_loading == true)
return -2;
if (_loading == true) return -2;
_loading = true;
notifyListeners();
Response response;
@ -68,7 +66,5 @@ class PentryVisitStatusProvider extends ChangeNotifier{
notifyListeners();
return -1;
}
}
}

@ -9,7 +9,6 @@ import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/user.dart';
class ServiceRequestDefectTypesProvider extends ChangeNotifier {
//reset provider data
void reset() {
_items = null;
@ -43,8 +42,7 @@ class ServiceRequestDefectTypesProvider extends ChangeNotifier{
/// for more details check http state manager
/// lib\controllers\http_status_manger\http_status_manger.dart
Future<int> getData({String host, User user}) async {
if(_loading == true)
return -2;
if (_loading == true) return -2;
_loading = true;
notifyListeners();
Response response;
@ -62,13 +60,10 @@ class ServiceRequestDefectTypesProvider extends ChangeNotifier{
notifyListeners();
return response.statusCode;
} catch (error) {
_loading = false;
_stateCode = -1;
notifyListeners();
return -1;
}
}
}

@ -9,7 +9,6 @@ import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/user.dart';
class ServiceReportLastCallsProvider extends ChangeNotifier {
//reset provider data
void reset() {
_calls = null;
@ -44,8 +43,7 @@ class ServiceReportLastCallsProvider extends ChangeNotifier{
/// for more details check http state manager
/// lib\controllers\http_status_manger\http_status_manger.dart
Future<int> getCalls({String host, User user, int serviceStatus}) async {
if(_loading == true)
return -2;
if (_loading == true) return -2;
_loading = true;
notifyListeners();
Response response;
@ -75,7 +73,5 @@ class ServiceReportLastCallsProvider extends ChangeNotifier{
notifyListeners();
return -1;
}
}
}

@ -9,7 +9,6 @@ import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/user.dart';
class ServiceRequestPriorityProvider extends ChangeNotifier {
//reset provider data
void reset() {
_items = null;
@ -43,8 +42,7 @@ class ServiceRequestPriorityProvider extends ChangeNotifier{
/// for more details check http state manager
/// lib\controllers\http_status_manger\http_status_manger.dart
Future<int> getData({String host, User user}) async {
if(_loading == true)
return -2;
if (_loading == true) return -2;
_loading = true;
notifyListeners();
Response response;
@ -68,7 +66,5 @@ class ServiceRequestPriorityProvider extends ChangeNotifier{
notifyListeners();
return -1;
}
}
}

@ -9,7 +9,6 @@ import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/user.dart';
class ServiceReportReasonsProvider extends ChangeNotifier {
//reset provider data
void reset() {
_reasons = null;
@ -43,8 +42,7 @@ class ServiceReportReasonsProvider extends ChangeNotifier{
/// for more details check http state manager
/// lib\controllers\http_status_manger\http_status_manger.dart
Future<int> getTypes({String host, User user}) async {
if(_loading == true)
return -2;
if (_loading == true) return -2;
_loading = true;
notifyListeners();
Response response;
@ -67,7 +65,5 @@ class ServiceReportReasonsProvider extends ChangeNotifier{
notifyListeners();
return -1;
}
}
}

@ -12,7 +12,6 @@ import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/user.dart';
class ServiceReportStatusProvider extends ChangeNotifier {
//reset provider data
void reset() {
_status = null;
@ -46,8 +45,7 @@ class ServiceReportStatusProvider extends ChangeNotifier{
/// for more details check http state manager
/// lib\controllers\http_status_manger\http_status_manger.dart
Future<int> getTypes({String host, User user}) async {
if(_loading == true)
return -2;
if (_loading == true) return -2;
_loading = true;
notifyListeners();
Response response;
@ -66,13 +64,10 @@ class ServiceReportStatusProvider extends ChangeNotifier{
notifyListeners();
return response.statusCode;
} catch (error) {
_loading = false;
_stateCode = -1;
notifyListeners();
return -1;
}
}
}

@ -9,7 +9,6 @@ import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/user.dart';
class ServiceReportTypesProvider extends ChangeNotifier {
//reset provider data
void reset() {
_types = null;
@ -43,8 +42,7 @@ class ServiceReportTypesProvider extends ChangeNotifier{
/// for more details check http state manager
/// lib\controllers\http_status_manger\http_status_manger.dart
Future<int> getTypes({String host, User user}) async {
if(_loading == true)
return -2;
if (_loading == true) return -2;
_loading = true;
notifyListeners();
Response response;
@ -67,7 +65,5 @@ class ServiceReportTypesProvider extends ChangeNotifier{
notifyListeners();
return -1;
}
}
}

@ -9,7 +9,6 @@ import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/user.dart';
class ServiceStatusProvider extends ChangeNotifier {
//reset provider data
void reset() {
_statuses = null;
@ -43,8 +42,7 @@ class ServiceStatusProvider extends ChangeNotifier{
/// for more details check http state manager
/// lib\controllers\http_status_manger\http_status_manger.dart
Future<int> getTypes({String host, User user}) async {
if(_loading == true)
return -2;
if (_loading == true) return -2;
_loading = true;
notifyListeners();
Response response;
@ -57,7 +55,6 @@ class ServiceStatusProvider extends ChangeNotifier{
// client's request was successfully received
List categoriesListJson = json.decode(response.body)["data"];
_statuses = categoriesListJson.map((e) => Lookup.fromJson(e)).toList();
}
_loading = false;
notifyListeners();
@ -68,7 +65,5 @@ class ServiceStatusProvider extends ChangeNotifier{
notifyListeners();
return -1;
}
}
}

@ -9,7 +9,6 @@ import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/user.dart';
class ServiceRequestStatusProvider extends ChangeNotifier {
//reset provider data
void reset() {
_statuses = null;
@ -43,8 +42,7 @@ class ServiceRequestStatusProvider extends ChangeNotifier{
/// for more details check http state manager
/// lib\controllers\http_status_manger\http_status_manger.dart
Future<int> getData({String host, User user}) async {
if(_loading == true)
return -2;
if (_loading == true) return -2;
_loading = true;
notifyListeners();
Response response;
@ -57,7 +55,6 @@ class ServiceRequestStatusProvider extends ChangeNotifier{
// client's request was successfully received
List categoriesListJson = json.decode(response.body)["data"];
_statuses = categoriesListJson.map((e) => Lookup.fromJson(e)).toList();
}
_loading = false;
notifyListeners();
@ -68,7 +65,5 @@ class ServiceRequestStatusProvider extends ChangeNotifier{
notifyListeners();
return -1;
}
}
}

@ -9,7 +9,6 @@ import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/user.dart';
class ServiceRequestedThroughProvider extends ChangeNotifier {
//reset provider data
void reset() {
_statuses = null;
@ -43,8 +42,7 @@ class ServiceRequestedThroughProvider extends ChangeNotifier{
/// for more details check http state manager
/// lib\controllers\http_status_manger\http_status_manger.dart
Future<int> getData({String host, User user}) async {
if(_loading == true)
return -2;
if (_loading == true) return -2;
_loading = true;
notifyListeners();
Response response;
@ -57,7 +55,6 @@ class ServiceRequestedThroughProvider extends ChangeNotifier{
// client's request was successfully received
List categoriesListJson = json.decode(response.body)["data"];
_statuses = categoriesListJson.map((e) => Lookup.fromJson(e)).toList();
}
_loading = false;
notifyListeners();
@ -68,7 +65,5 @@ class ServiceRequestedThroughProvider extends ChangeNotifier{
notifyListeners();
return -1;
}
}
}

@ -9,7 +9,6 @@ import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/user.dart';
class ServiceRequestTypeProvider extends ChangeNotifier {
//reset provider data
void reset() {
_statuses = null;
@ -43,8 +42,7 @@ class ServiceRequestTypeProvider extends ChangeNotifier{
/// for more details check http state manager
/// lib\controllers\http_status_manger\http_status_manger.dart
Future<int> getData({String host, User user}) async {
if(_loading == true)
return -2;
if (_loading == true) return -2;
_loading = true;
notifyListeners();
Response response;
@ -57,7 +55,6 @@ class ServiceRequestTypeProvider extends ChangeNotifier{
// client's request was successfully received
List categoriesListJson = json.decode(response.body)["data"];
_statuses = categoriesListJson.map((e) => Lookup.fromJson(e)).toList();
}
_loading = false;
notifyListeners();
@ -68,7 +65,5 @@ class ServiceRequestTypeProvider extends ChangeNotifier{
notifyListeners();
return -1;
}
}
}

@ -7,9 +7,7 @@ import 'package:flutter/foundation.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../settings/app_settings.dart';
class SettingProvider extends ChangeNotifier {
resetSettings() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
user = null;
@ -64,7 +62,6 @@ class SettingProvider extends ChangeNotifier{
// get app setting
Future<void> loadSharedPreferences() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
if (prefs.containsKey(ASettings.language)) {
@ -93,5 +90,4 @@ class SettingProvider extends ChangeNotifier{
isLoaded = true;
notifyListeners();
}
}

@ -4,16 +4,14 @@ class Validator{
// check if string not empty and has value
static bool hasValue(String string) {
if (string == null || string.isEmpty)
return false;
if (string == null || string.isEmpty) return false;
return true;
}
// Return true if email is valid. Otherwise, return false
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]+");
if(exp.hasMatch(email))
return true;
if (exp.hasMatch(email)) return true;
return false;
}
@ -26,17 +24,14 @@ class Validator{
final pattern = r'^[+]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\s\./0-9]*$';
final regExp = RegExp(pattern);
if (regExp.hasMatch(phoneNumber))
return true;
if (regExp.hasMatch(phoneNumber)) return true;
return false;
}
// Return true if password is valid. Otherwise, return false
static bool isValidPassword(String password) {
if(password == null)
return false;
if(password.length <6)
return false;
if (password == null) return false;
if (password.length < 6) return false;
return true;
}

@ -65,17 +65,16 @@ void main() async {
WidgetsFlutterBinding.ensureInitialized();
if (Platform.isIOS) {
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 {
await Firebase.initializeApp();
}
runApp(
ChangeNotifierProvider(
runApp(ChangeNotifierProvider(
create: (_) => SettingProvider(),
child: MyApp(),
)
);
));
}
class MyApp extends StatelessWidget {
@ -132,13 +131,7 @@ class MyApp extends StatelessWidget {
scaffoldBackgroundColor: AColors.scaffoldBackgroundColor,
primaryColor: AColors.primaryColor,
indicatorColor: AColors.primaryColor,
colorScheme: const ColorScheme.light(
primary: AColors.primaryColor,
onPrimary: Colors.white,
secondary: AColors.secondaryColor,
onSecondary: Colors.white
)
),
colorScheme: const ColorScheme.light(primary: AColors.primaryColor, onPrimary: Colors.white, secondary: AColors.secondaryColor, onSecondary: Colors.white)),
localizationsDelegates: const [
// ... app-specific localization delegate[s] here
AppLocalization.delegate,
@ -178,6 +171,3 @@ class MyApp extends StatelessWidget {
);
}
}

@ -21,7 +21,6 @@ class AppNotification{
title: parsedJson["call_client"] ?? parsedJson["title"],
description: parsedJson["task_description"],
date: parsedJson["creation_date"],
path: FutureRequestServiceDetails.id
);
path: FutureRequestServiceDetails.id);
}
}

@ -56,10 +56,7 @@ class DeviceTransfer{
workingHours: parsedJson["senderWorkingHours"],
userId: parsedJson["senderAssignedEmployeeId"],
userName: parsedJson["senderAssignedEmployeeName"],
client: Hospital(
id: parsedJson["senderSiteId"],
name: parsedJson["senderSiteName"]
),
client: Hospital(id: parsedJson["senderSiteId"], name: parsedJson["senderSiteName"]),
department: Department(
id: parsedJson["senderDepartmentId"],
name: parsedJson["senderDepartmentName"],
@ -77,10 +74,7 @@ class DeviceTransfer{
workingHours: parsedJson["receiverWorkingHours"],
userId: parsedJson["receiverAssignedEmployeeId"],
userName: parsedJson["receiverAssignedEmployeeName"],
client: Hospital(
id: parsedJson["destSiteId"],
name: parsedJson["destSiteName"]
),
client: Hospital(id: parsedJson["destSiteId"], name: parsedJson["destSiteName"]),
department: Department(
id: parsedJson["destDepartmentId"],
name: parsedJson["destDepartmentName"],
@ -95,4 +89,3 @@ class DeviceTransfer{
);
}
}

@ -63,10 +63,7 @@ class DeviceTransferInfo{
signature: parsedJson["${key}image"],
userId: parsedJson["${key}id"],
comment: parsedJson["${key}comment"],
client: Hospital(
id: parsedJson["${key}SiteId"],
name: parsedJson["${key}SiteName"]
),
client: Hospital(id: parsedJson["${key}SiteId"], name: parsedJson["${key}SiteName"]),
department: Department(
id: parsedJson["${key}DepartmentId"],
name: parsedJson["${key}DepartmentName"],
@ -78,4 +75,3 @@ class DeviceTransferInfo{
);
}
}

@ -8,15 +8,16 @@ class ModelDefinition {
String replacementDate;
int lifeSpan;
ModelDefinition(
{this.id,
ModelDefinition({
this.id,
this.assetName,
this.modelDefCode,
this.modelName,
this.manufacturerName,
this.supplierName,
this.replacementDate,
this.lifeSpan,});
this.lifeSpan,
});
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};

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

@ -21,6 +21,7 @@ class GasRefillDetails{
if (requestedQuantity == null) return false;
return true;
}
factory GasRefillDetails.fromJson(Map<String, dynamic> parsedJson) {
return GasRefillDetails(
type: Lookup.fromJson(parsedJson["gasType"]),
@ -41,4 +42,3 @@ class GasRefillDetails{
);
}
}

@ -44,11 +44,9 @@ class GasRefillModel{
id: parsedJson["id"],
//userId: parsedJson["uid"],
title: parsedJson["gazRefillNo"],
clientName: parsedJson["site"] == null ? null:
parsedJson["site"]["custName"],
clientName: parsedJson["site"] == null ? null : parsedJson["site"]["custName"],
status: Lookup.fromJson(parsedJson["status"]),
details: details,
);
}
}

@ -11,31 +11,15 @@ class Hospital{
this.buildings,
});
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) {
return Hospital(
id: hospital?.id,
name: hospital?.name,
customerCode: hospital?.customerCode,
buildings:hospital?.buildings
);
return Hospital(id: hospital?.id, name: hospital?.name, customerCode: hospital?.customerCode, buildings: hospital?.buildings);
}
Map<String, dynamic> toMap() {
return {
'id': id,
'customerCode': customerCode,
'custName': name,
"buildings":buildings
};
return {'id': id, 'customerCode': customerCode, 'custName': name, "buildings": buildings};
}
}

@ -1,5 +1,4 @@
class Lookup {
//old name label
final String name;
// old name key
@ -13,21 +12,13 @@ class Lookup{
});
@override
bool operator == (Object other) =>
identical(this, other) || other is Lookup &&
((value != null && value == other.value)
|| ( id != null && id == other.id )) ;
bool operator ==(Object other) => identical(this, other) || other is Lookup && ((value != null && value == other.value) || (id != null && id == other.id));
@override
int get hashCode => id?.hashCode ?? value?.hashCode;
toMap() {
return {
"id": id,
"name": name,
"value": value
};
return {"id": id, "name": name, "value": value};
}
factory Lookup.fromStatus(Lookup old) {

@ -8,14 +8,7 @@ class Contact{
String telephone;
String landLine;
Contact({
this.title,
this.contactPerson,
this.job,
this.email,
this.telephone,
this.landLine
});
Contact({this.title, this.contactPerson, this.job, this.email, this.telephone, this.landLine});
Map<String, String> toMap() {
return {

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

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

@ -10,16 +10,7 @@ class PMKit{
String quantityNeeded;
String quantityReserved;
PMKit({
this.id,
this.itemCode,
this.itemName,
this.preparationTimeFrame,
this.kitFrequencyDemand,
this.availability,
this.quantityNeeded,
this.quantityReserved
});
PMKit({this.id, this.itemCode, this.itemName, this.preparationTimeFrame, this.kitFrequencyDemand, this.availability, this.quantityNeeded, this.quantityReserved});
Map<String, dynamic> toMap(int visitId) {
return {

@ -16,11 +16,7 @@ class Part{
Map<String, dynamic> toJson() {
return {
"id": reportPartID ?? 0,
"sparePart":{
"id":id,
"partNo": code,
"partName":name
},
"sparePart": {"id": id, "partNo": code, "partName": name},
"qty": quantity
};
}

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

@ -53,7 +53,6 @@ class ServiceRequest{
this.deviceId,
this.audio,
this.engineerName,
this.viewReport = false,
this.deviceModel,
this.engineerMobile,
@ -90,30 +89,20 @@ class ServiceRequest{
deviceSerialNumber: parsedJson["asset"]["assetSerialNo"],
date: DateTime.tryParse(parsedJson["requestedDate"] ?? "").toString().split(" ").first,
maintenanceIssue: parsedJson["comments"],
statusLabel: parsedJson["status"] == null ? null :
parsedJson["status"]["name"],
statusValue: parsedJson["status"] == null ? null :
parsedJson["status"]["value"],
departmentName: parsedJson["asset"]["department"] != null ?
parsedJson["asset"]["department"]["name"] : "",
engineerName: parsedJson["assignedEmployee"] == null ? null :
parsedJson["assignedEmployee"]["name"],
statusLabel: parsedJson["status"] == null ? null : parsedJson["status"]["name"],
statusValue: parsedJson["status"] == null ? null : parsedJson["status"]["value"],
departmentName: parsedJson["asset"]["department"] != null ? parsedJson["asset"]["department"]["name"] : "",
engineerName: parsedJson["assignedEmployee"] == null ? null : parsedJson["assignedEmployee"]["name"],
hospitalId: parsedJson["asset"]["site"]["id"],
reportID: parsedJson["workOrder"] != null ?
parsedJson["workOrder"]["workOrderId"] : null,
reportID: parsedJson["workOrder"] != null ? parsedJson["workOrder"]["workOrderId"] : null,
viewReport: parsedJson["workOrder"] != null,
deviceModel: parsedJson["asset"]["modelDefinition"]["modelName"],
engineerMobile: parsedJson["assignedEmployee"] == null ? null :
parsedJson["assignedEmployee"]["phone"],
faultDescription: parsedJson["workOrder"] != null ?
parsedJson["workOrder"]["faultDescription"] : null,
jobSheetNumber: parsedJson["workOrder"] != null ?
parsedJson["workOrder"]["jobSheetNumber"] :null,
engineerMobile: parsedJson["assignedEmployee"] == null ? null : parsedJson["assignedEmployee"]["phone"],
faultDescription: parsedJson["workOrder"] != null ? parsedJson["workOrder"]["faultDescription"] : null,
jobSheetNumber: parsedJson["workOrder"] != null ? parsedJson["workOrder"]["jobSheetNumber"] : null,
visitDate: DateTime.tryParse(parsedJson["visitDate"] ?? "").toString().split(" ").first,
nextVisitDate: DateTime.tryParse(parsedJson["nextVisitDate"] ?? ""),
workPerformed: parsedJson["workOrder"] != null ?
parsedJson["workOrder"]["workPerformed"] : null,
device: Device.fromJson(parsedJson["asset"])
);
workPerformed: parsedJson["workOrder"] != null ? parsedJson["workOrder"]["workPerformed"] : null,
device: Device.fromJson(parsedJson["asset"]));
}
}

@ -9,7 +9,6 @@ class ServiceRequestSearch{
String model;
Lookup statusValue;
ServiceRequestSearch({
this.deviceSerialNumber,
this.deviceNumber,
@ -43,7 +42,6 @@ class ServiceRequestSearch{
if (deviceName != null && deviceName.isNotEmpty) {
search["assetName"] = deviceName;
}
if (hospital != null) {

@ -285,7 +285,6 @@ class Subtitle{
@required this.titleValidateMessage,
@required this.to,
@required this.urlNotFound,
@required this.nameExist,
@required this.unitRequired,
@required this.unite,
@ -391,7 +390,6 @@ class Subtitle{
@required this.pickImage,
@required this.requiredImage,
@required this.activationAlert,
@required this.callId,
@required this.requiredWord,
@required this.quantity,
@ -437,7 +435,6 @@ class Subtitle{
signOut: parsedJson["sign_out"],
signOutAlert: parsedJson["logout_alert"],
language: parsedJson["language"],
name: parsedJson["name"],
email: parsedJson["email"],
phoneNumber: parsedJson["phone_number"],
@ -451,7 +448,6 @@ class Subtitle{
passwordValidateMessage: parsedJson["password_validate_message"],
confirmPasswordValidateMessage: parsedJson["confirm_password_validate_message"],
phoneNumberValidateMessage: parsedJson["phone_number_validate_message"],
forgetPasswordWithMark: parsedJson["forget_password_with_mark"],
showPassword: parsedJson["show_password"],
wrongEmailOrPassword: parsedJson["wrong_email_or_password"],
@ -461,7 +457,6 @@ class Subtitle{
back: parsedJson["back"],
search: parsedJson["search"],
searchByName: parsedJson["search_by_name"],
address: parsedJson["address"],
addressNotFound: parsedJson["address_not_found"],
addressValidateMessage: parsedJson["address_validate_message"],
@ -480,7 +475,6 @@ class Subtitle{
titleNotFound: parsedJson["title_not_found"],
titleValidateMessage: parsedJson["title_validate_message"],
urlNotFound: parsedJson["url_not_found"],
date: parsedJson["date"],
status: parsedJson["status"],
code: parsedJson["code"],
@ -556,7 +550,6 @@ class Subtitle{
visitDate: parsedJson["visitDate"],
whatsApp: parsedJson["whatsApp"],
workPerformed: parsedJson["workPerformed"],
actualDate: parsedJson["actualDate"],
done: parsedJson["done"],
expectDate: parsedJson["expectDate"],
@ -587,7 +580,6 @@ class Subtitle{
requiredImage: parsedJson["requiredImage"],
taskStatus: parsedJson["taskStatus"],
activationAlert: parsedJson["activationAlert"],
attachImage: parsedJson["attachImage"],
callLastSituation: parsedJson["callLastSituation"],
customer: parsedJson["customer"],
@ -606,7 +598,6 @@ class Subtitle{
requiredWord: parsedJson["requiredWord"],
serviceType: parsedJson["serviceType"],
workPreformed: parsedJson["workPreformed"],
alert: parsedJson["alert"],
duplicateAlert: parsedJson["duplicateAlert"],
duplicateAlertMessage: parsedJson["duplicateAlertMessage"],
@ -620,5 +611,4 @@ class Subtitle{
currentSituation: parsedJson["currentSituation"],
);
}
}

@ -73,7 +73,6 @@ class Visit{
name: parsedJson["visitStatusName"] // text value
),
assignTo: parsedJson["assignedToName"],
pentry: Pentry.fromMap(parsedJson)
);
pentry: Pentry.fromMap(parsedJson));
}
}

@ -1,4 +1,3 @@
import 'package:test_sa/models/engineer.dart';
import 'package:test_sa/models/visits/visit.dart';
@ -43,6 +42,4 @@ class VisitsGroup{
// if(taskStatus != null) jsonObject["task_status"] = taskStatus.id.toString();
return jsonObject;
}
}

@ -84,4 +84,3 @@ class VisitsSearch{
return _search;
}
}

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

@ -1,14 +1,11 @@
import 'package:flutter/material.dart';
class AppStyle {
AppStyle._();
static const double borderRadius = 10;
static const BoxShadow boxShadow = BoxShadow(
color: Colors.black26,
blurRadius: 3,
offset: Offset(0,2)
);
static const BoxShadow boxShadow = BoxShadow(color: Colors.black26, blurRadius: 3, offset: Offset(0, 2));
static double getBorderRadius(BuildContext context) {
return borderRadius * getScaleFactor(context);
@ -17,23 +14,18 @@ class AppStyle {
static double getScaleFactor(BuildContext context) {
return MediaQuery.of(context).orientation == Orientation.portrait
? MediaQuery.of(context).size.width / (360) > 1.5
? 1.5 : MediaQuery.of(context).size.width/(360)
? 1.5
: MediaQuery.of(context).size.width / (360)
: MediaQuery.of(context).size.height / (360) > 1.5
? 1.5 : MediaQuery.of(context).size.height/(360);
? 1.5
: MediaQuery.of(context).size.height / (360);
}
static BorderRadius getCardBorder(BuildContext context) {
return BorderRadius.only(
topRight: Radius.circular(
AppStyle.borderRadius * AppStyle.getScaleFactor(context)
),
topLeft: Radius.circular(
AppStyle.borderRadius * AppStyle.getScaleFactor(context)
),
bottomRight: Radius.circular(
AppStyle.borderRadius * AppStyle.getScaleFactor(context)
),
topRight: 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> {
final DeviceTransferInfo _model = DeviceTransferInfo();
bool _isSender = false;
bool _isReceiver = false;
@ -39,8 +38,6 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
@override
void initState() {
super.initState();
}
@ -74,10 +71,7 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
child: Center(
child: Text(
_subtitle.details,
style: Theme.of(context).textTheme.headline6.copyWith(
color: AColors.white,
fontStyle: FontStyle.italic
),
style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic),
),
),
),
@ -103,20 +97,17 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
Row(
children: [
Expanded(
child: Text(
"Sender",
style: Theme.of(context).textTheme.headline6
),
child: Text("Sender", style: Theme.of(context).textTheme.headline6),
),
if (_isSender || true)
ASmallButton(
text: _subtitle.edit,
onPressed: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (_)=> UpdateDeviceTransfer(model: widget.model,isSender: true,)
)
);
Navigator.of(context).push(MaterialPageRoute(
builder: (_) => UpdateDeviceTransfer(
model: widget.model,
isSender: true,
)));
},
),
],
@ -129,20 +120,17 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
Row(
children: [
Expanded(
child: Text(
"Receiver",
style: Theme.of(context).textTheme.headline6
),
child: Text("Receiver", style: Theme.of(context).textTheme.headline6),
),
if (_isReceiver || true)
ASmallButton(
text: _subtitle.edit,
onPressed: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (_)=> UpdateDeviceTransfer(model: widget.model,isSender: false,)
)
);
Navigator.of(context).push(MaterialPageRoute(
builder: (_) => UpdateDeviceTransfer(
model: widget.model,
isSender: false,
)));
},
),
],
@ -151,7 +139,6 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
DeviceTransferInfoSection(
info: widget.model.receiver,
),
],
),
),

@ -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/device_trancfer/device_transfer_list.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
class TrackDeviceTransferPage extends StatefulWidget {
static const String id = "/track-device-transfer";
@ -18,8 +19,7 @@ class TrackDeviceTransferPage extends StatefulWidget {
State<TrackDeviceTransferPage> createState() => _TrackDeviceTransferPageState();
}
class _TrackDeviceTransferPageState extends State<TrackDeviceTransferPage>
with TickerProviderStateMixin{
class _TrackDeviceTransferPageState extends State<TrackDeviceTransferPage> with TickerProviderStateMixin {
DeviceTransferProvider _deviceTransferProvider;
UserProvider _userProvider;
SettingProvider _settingProvider;
@ -59,17 +59,15 @@ class _TrackDeviceTransferPageState extends State<TrackDeviceTransferPage>
child: Center(
child: Text(
"Device Transfer",
style: Theme.of(context).textTheme.headline6.copyWith(
color: AColors.white,
fontStyle: FontStyle.italic
),
style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic),
),
),
),
const SizedBox(width: 48,)
const SizedBox(
width: 48,
)
],
),
],
),
),

@ -22,7 +22,6 @@ class SplashScreen extends StatefulWidget {
}
class _SplashScreenState extends State<SplashScreen> {
SettingProvider _settingProvider;
UserProvider _userProvider;
@ -38,19 +37,11 @@ class _SplashScreenState extends State<SplashScreen> {
void initState() {
Firebase.initializeApp();
NotificationManger.initialisation(
(notificationDetails) {
NotificationManger.initialisation((notificationDetails) {
AppNotification notification = AppNotification.fromJson(json.decode(notificationDetails.payload));
if(notification.path == null || notification.path.isEmpty)
return;
Navigator.pushNamed(
context,
notification.path,
arguments: notification.requestId
);
}
, (id, title, body, payload) async {
});
if (notification.path == null || notification.path.isEmpty) return;
Navigator.pushNamed(context, notification.path, arguments: notification.requestId);
}, (id, title, body, payload) async {});
super.initState();
}

@ -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 '../../../app_style/colors.dart';
class GasRefillDetails extends StatefulWidget {
final GasRefillModel model;
const GasRefillDetails({Key key, this.model}) : super(key: key);
@ -30,7 +31,6 @@ class GasRefillDetails extends StatefulWidget {
}
class _GasRefillDetailsState extends State<GasRefillDetails> {
final GasRefillModel _model = GasRefillModel();
bool _enableEdit = false;
bool _validate = false;
@ -51,12 +51,7 @@ class _GasRefillDetailsState extends State<GasRefillDetails> {
_isLoading = true;
setState(() {});
int status = await _gasRefillProvider.updateModel(
user: _userProvider.user,
host: _settingProvider.host,
newModel: _model,
oldModel: widget.model
);
int status = await _gasRefillProvider.updateModel(user: _userProvider.user, host: _settingProvider.host, newModel: _model, oldModel: widget.model);
_isLoading = false;
setState(() {});
if (status >= 200 && status < 300) {
@ -67,15 +62,10 @@ class _GasRefillDetailsState extends State<GasRefillDetails> {
_validate = false;
//Navigator.of(context).pop();
} else {
String errorMessage = HttpStatusManger.getStatusMessage(
status: status, subtitle: _subtitle);
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
errorMessage
),
)
);
String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle);
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(errorMessage),
));
}
}
@ -113,10 +103,7 @@ class _GasRefillDetailsState extends State<GasRefillDetails> {
child: Center(
child: Text(
_subtitle.details,
style: Theme.of(context).textTheme.headline6.copyWith(
color: AColors.white,
fontStyle: FontStyle.italic
),
style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic),
),
),
),
@ -132,7 +119,9 @@ class _GasRefillDetailsState extends State<GasRefillDetails> {
setState(() {});
},
),
const SizedBox(width: 16,)
const SizedBox(
width: 16,
)
],
),
),
@ -150,15 +139,22 @@ class _GasRefillDetailsState extends State<GasRefillDetails> {
title: _subtitle.hospital,
info: _model.clientName,
),
_enableEdit ?
Column(
_enableEdit
? Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const SizedBox(height: 8,),
const SizedBox(
height: 8,
),
ASubTitle(_subtitle.status),
if (_validate && _model.status == null)
ASubTitle(_subtitle.requiredWord,color: Colors.red,),
const SizedBox(height: 4,),
ASubTitle(
_subtitle.requiredWord,
color: Colors.red,
),
const SizedBox(
height: 4,
),
GasStatusMenu(
initialValue: _model.status,
onSelect: (status) {
@ -166,8 +162,8 @@ class _GasRefillDetailsState extends State<GasRefillDetails> {
},
)
],
):
Row(
)
: Row(
children: [
Expanded(
child: Text(
@ -176,15 +172,16 @@ class _GasRefillDetailsState extends State<GasRefillDetails> {
textScaleFactor: AppStyle.getScaleFactor(context),
),
),
if(_model.status?.id != null)
StatusLabel(label: _model.status.name,
color: AColors.getGasStatusColor(_model.status.id)
),
if (_model.status?.id != null) StatusLabel(label: _model.status.name, color: AColors.getGasStatusColor(_model.status.id)),
],
),
const SizedBox(height: 8,),
const SizedBox(
height: 8,
),
const ASubTitle("Gas Requests"),
const SizedBox(height: 8,),
const SizedBox(
height: 8,
),
ListView.builder(
shrinkWrap: true,
physics: const ClampingScrollPhysics(),
@ -196,12 +193,13 @@ class _GasRefillDetailsState extends State<GasRefillDetails> {
validate: _validate,
enableEdit: _enableEdit,
);
}
),
}),
if (_enableEdit)
Column(
children: [
const SizedBox(height: 16,),
const SizedBox(
height: 16,
),
AButton(
text: _subtitle.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 '../../../../controllers/localization/localization.dart';
class RequestGasRefill extends StatefulWidget {
static const String id = "/request-gas-refill";
const RequestGasRefill({Key key}) : super(key: key);
@ -70,15 +71,10 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
);
Navigator.of(context).pop();
} else {
String errorMessage = HttpStatusManger.getStatusMessage(
status: status, subtitle: _subtitle);
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
errorMessage
),
)
);
String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle);
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(errorMessage),
));
}
}
@ -94,7 +90,6 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
return false;
}
_formModel.details.insert(0, _currentDetails);
_validate = false;
Scrollable.ensureVisible(_DetailsKey.currentContext);
@ -109,6 +104,7 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
_requestedQuantityController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
_subtitle = AppLocalization.of(context).subtitle;
@ -135,11 +131,7 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
padding: const EdgeInsets.all(8.0),
child: Text(
"Request Gas Refill",
style: Theme.of(context).textTheme.headline5.copyWith(
color: Theme.of(context).primaryColor,
fontSize: 28,
fontWeight: FontWeight.bold
),
style: Theme.of(context).textTheme.headline5.copyWith(color: Theme.of(context).primaryColor, fontSize: 28, fontWeight: FontWeight.bold),
),
),
),
@ -160,23 +152,37 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
// const SizedBox(height: 8,),
ASubTitle(_subtitle.status),
if (_validate && _formModel.status == null)
ASubTitle(_subtitle.requiredWord,color: Colors.red,),
const SizedBox(height: 4,),
GasStatusMenu(
initialValue: _formModel.status ?? const Lookup(
value: 1
ASubTitle(
_subtitle.requiredWord,
color: Colors.red,
),
const SizedBox(
height: 4,
),
GasStatusMenu(
initialValue: _formModel.status ?? const Lookup(value: 1),
onSelect: (status) {
_formModel.status = status;
},
),
const SizedBox(height: 8,),
Divider(color: Theme.of(context).colorScheme.primary,),
const SizedBox(height: 4,),
const SizedBox(
height: 8,
),
Divider(
color: Theme.of(context).colorScheme.primary,
),
const SizedBox(
height: 4,
),
const ASubTitle("Type"),
if (_validate && _currentDetails.type == null)
ASubTitle(_subtitle.requiredWord,color: Colors.red,),
const SizedBox(height: 4,),
ASubTitle(
_subtitle.requiredWord,
color: Colors.red,
),
const SizedBox(
height: 4,
),
GasTypeMenu(
initialValue: _currentDetails.type,
onSelect: (status) {
@ -184,41 +190,60 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
},
),
const SizedBox(height: 8,),
const SizedBox(
height: 8,
),
const ASubTitle("Cylinder Size"),
if (_validate && _currentDetails.cylinderSize == null)
ASubTitle(_subtitle.requiredWord,color: Colors.red,),
const SizedBox(height: 4,),
ASubTitle(
_subtitle.requiredWord,
color: Colors.red,
),
const SizedBox(
height: 4,
),
GasCylinderSizeMenu(
initialValue: _currentDetails.cylinderSize,
onSelect: (status) {
_currentDetails.cylinderSize = status;
},
),
const SizedBox(height: 8,),
const SizedBox(
height: 8,
),
const ASubTitle("Cylinder Type"),
if (_validate && _currentDetails.cylinderSize == null)
ASubTitle(_subtitle.requiredWord,color: Colors.red,),
const SizedBox(height: 4,),
ASubTitle(
_subtitle.requiredWord,
color: Colors.red,
),
const SizedBox(
height: 4,
),
GasCylinderTypesMenu(
initialValue: _currentDetails.cylinderType,
onSelect: (status) {
_currentDetails.cylinderType = status;
},
),
const SizedBox(height: 8,),
const SizedBox(
height: 8,
),
ASubTitle(_subtitle.quantity),
if (_validate && _currentDetails.requestedQuantity == null)
ASubTitle(_subtitle.requiredWord,color: Colors.red,),
SizedBox(height: 4,),
ASubTitle(
_subtitle.requiredWord,
color: Colors.red,
),
SizedBox(
height: 4,
),
ATextFormField(
initialValue: (_currentDetails?.requestedQuantity ?? "").toString(),
textAlign: TextAlign.center,
controller: _requestedQuantityController,
style: Theme.of(context).textTheme.subtitle1,
validator: (value) =>
Validator.isNumeric(value)
? null : "allow numbers only",
validator: (value) => Validator.isNumeric(value) ? null : "allow numbers only",
textInputType: TextInputType.number,
onSaved: (value) {
_currentDetails.requestedQuantity = double.tryParse(value);
@ -229,8 +254,7 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
text: _subtitle.add,
onPressed: _addNewModel,
),
if(_formModel.details.isNotEmpty)
const ASubTitle("Gas Requests"),
if (_formModel.details.isNotEmpty) const ASubTitle("Gas Requests"),
ListView.builder(
key: _DetailsKey,
shrinkWrap: true,
@ -245,14 +269,15 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
setState(() {});
},
);
}
),
}),
const SizedBox(height: 16),
AButton(
text: _subtitle.submit,
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/gas_refill/gas_refill_list.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
class TrackGasRefillPage extends StatefulWidget {
static const String id = "/track-gas-refill";
@ -18,8 +19,7 @@ class TrackGasRefillPage extends StatefulWidget {
State<TrackGasRefillPage> createState() => _TrackGasRefillPageState();
}
class _TrackGasRefillPageState extends State<TrackGasRefillPage>
with TickerProviderStateMixin{
class _TrackGasRefillPageState extends State<TrackGasRefillPage> with TickerProviderStateMixin {
GasRefillProvider _gasRefillProvider;
UserProvider _userProvider;
SettingProvider _settingProvider;
@ -59,17 +59,15 @@ class _TrackGasRefillPageState extends State<TrackGasRefillPage>
child: Center(
child: Text(
_subtitle.serviceRequests,
style: Theme.of(context).textTheme.headline6.copyWith(
color: AColors.grey3A,
fontStyle: FontStyle.italic
),
style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.grey3A, fontStyle: FontStyle.italic),
),
),
),
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/no_item_found.dart';
import 'package:test_sa/views/widgets/notifications/notification_item.dart';
class NotificationsList extends StatelessWidget {
final List<AppNotification> notifications;
final bool nextPage;
@ -17,7 +18,9 @@ class NotificationsList extends StatelessWidget {
Widget build(BuildContext context) {
Subtitle _subtitle = AppLocalization.of(context).subtitle;
if (notifications.length == 0) {
return NoItemFound(message: _subtitle.notificationsNotFound,);
return NoItemFound(
message: _subtitle.notificationsNotFound,
);
}
return LazyLoading(
nextPage: nextPage,
@ -30,14 +33,10 @@ class NotificationsList extends StatelessWidget {
return NotificationItem(
notification: notifications[itemIndex],
onPressed: (notification) {
Navigator.of(context).pushNamed(
FutureRequestServiceDetails.id,
arguments: notification.requestId
);
Navigator.of(context).pushNamed(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/widgets/buttons/app_back_button.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
class NotificationsPage extends StatefulWidget {
static final String id = "/notifications";
@override
_NotificationsPageState createState() => _NotificationsPageState();
}
class _NotificationsPageState extends State<NotificationsPage>
with TickerProviderStateMixin{
class _NotificationsPageState extends State<NotificationsPage> with TickerProviderStateMixin {
NotificationsProvider _notificationsProvider;
UserProvider _userProvider;
SettingProvider _settingProvider;
@ -57,17 +57,15 @@ class _NotificationsPageState extends State<NotificationsPage>
child: Center(
child: Text(
_subtitle.notifications,
style: Theme.of(context).textTheme.headline6.copyWith(
color: AColors.white,
fontStyle: FontStyle.italic
),
style: Theme.of(context).textTheme.headline6.copyWith(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/hospitals/hospital_button.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
class ProfilePage extends StatefulWidget {
static final String id = "/user/profile";
@override
@ -67,16 +68,12 @@ class _ProfilePageState extends State<ProfilePage> {
Container(
padding: EdgeInsets.symmetric(horizontal: 16, vertical: 16),
margin: EdgeInsets.symmetric(horizontal: 16),
decoration: BoxDecoration(
color: AColors.primaryColor,
borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)),
boxShadow: [
decoration: BoxDecoration(color: AColors.primaryColor, borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), boxShadow: [
BoxShadow(
color: AColors.grey,
offset: Offset(0, -1),
)
]
),
]),
child: Column(
children: [
ATextFormField(
@ -85,13 +82,14 @@ class _ProfilePageState extends State<ProfilePage> {
enable: false,
prefixIconData: Icons.account_circle,
style: Theme.of(context).textTheme.headline6,
validator: (value) => Validator.hasValue(value)
? null : _subtitle.nameValidateMessage,
validator: (value) => Validator.hasValue(value) ? null : _subtitle.nameValidateMessage,
onSaved: (value) {
_user.userName = value;
},
),
SizedBox(height: 8,),
SizedBox(
height: 8,
),
ATextFormField(
initialValue: _user.email,
hintText: _subtitle.email,
@ -99,13 +97,14 @@ class _ProfilePageState extends State<ProfilePage> {
prefixIconData: Icons.email,
textInputType: TextInputType.emailAddress,
style: Theme.of(context).textTheme.headline6,
validator: (value) => Validator.isEmail(value)
? null : _subtitle.emailValidateMessage,
validator: (value) => Validator.isEmail(value) ? null : _subtitle.emailValidateMessage,
onSaved: (value) {
_user.email = value;
},
),
SizedBox(height: 8,),
SizedBox(
height: 8,
),
AbsorbPointer(
child: HospitalButton(
hospital: _user.hospital,
@ -115,7 +114,9 @@ class _ProfilePageState extends State<ProfilePage> {
},
),
),
SizedBox(height: 8,),
SizedBox(
height: 8,
),
DepartmentButton(
department: _user.department,
onDepartmentPick: (department) {
@ -123,28 +124,30 @@ class _ProfilePageState extends State<ProfilePage> {
setState(() {});
},
),
SizedBox(height: 8,),
SizedBox(
height: 8,
),
ATextFormField(
initialValue: _user.phoneNumber,
hintText: _subtitle.phoneNumber,
style: Theme.of(context).textTheme.headline6,
prefixIconData: Icons.phone_android,
validator: (value) =>
Validator.isPhoneNumber(value) ? null : _subtitle.phoneNumberValidateMessage,
validator: (value) => Validator.isPhoneNumber(value) ? null : _subtitle.phoneNumberValidateMessage,
textInputType: TextInputType.phone,
onSaved: (value) {
_user.phoneNumber = value;
},
),
SizedBox(height: 8,),
SizedBox(
height: 8,
),
ATextFormField(
initialValue: _user.whatsApp,
hintText: _subtitle.whatsApp,
style: Theme.of(context).textTheme.headline6,
prefixIconData: FontAwesomeIcons.whatsapp,
prefixIconSize: 36,
validator: (value) =>
Validator.isPhoneNumber(value) ? null : _subtitle.phoneNumberValidateMessage,
validator: (value) => Validator.isPhoneNumber(value) ? null : _subtitle.phoneNumberValidateMessage,
textInputType: TextInputType.phone,
onSaved: (value) {
_user.whatsApp = value;
@ -153,7 +156,9 @@ class _ProfilePageState extends State<ProfilePage> {
],
),
),
SizedBox(height: 16,),
SizedBox(
height: 16,
),
Center(
child: SizedBox(
height: _width / 8,
@ -161,17 +166,12 @@ class _ProfilePageState extends State<ProfilePage> {
child: AButton(
text: _subtitle.update,
onPressed: () async {
if(!_formKey.currentState.validate())
return;
if (!_formKey.currentState.validate()) return;
_formKey.currentState.save();
if (_user.department?.id == null) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
_subtitle.unitRequired
),
)
);
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(_subtitle.unitRequired),
));
return;
}
int status = await _userProvider.updateProfile(
@ -180,29 +180,22 @@ class _ProfilePageState extends State<ProfilePage> {
);
if (status >= 200 && status < 300) {
_settingProvider.setUser(_userProvider.user);
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
_subtitle.requestCompleteSuccessfully
),
)
);
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(_subtitle.requestCompleteSuccessfully),
));
} else {
String errorMessage = HttpStatusManger.getStatusMessage(
status: status, subtitle: _subtitle);
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
errorMessage
),
)
);
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/issues/report_issue_item.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
class ReportIssuesPage extends StatefulWidget {
static final String id = "/report-issue";
final ServiceRequest serviceRequest;
@ -64,10 +65,7 @@ class _ReportIssuesPageState extends State<ReportIssuesPage> {
),
child: Text(
_subtitle.reportIssue,
style: Theme.of(context).textTheme.headline5.copyWith(
color: AColors.cyan,
fontWeight: FontWeight.bold
),
style: Theme.of(context).textTheme.headline5.copyWith(color: AColors.cyan, fontWeight: FontWeight.bold),
),
),
),
@ -75,7 +73,6 @@ class _ReportIssuesPageState extends State<ReportIssuesPage> {
height: _height / 8,
image: AssetImage("assets/images/logo.png"),
),
Container(
padding: EdgeInsets.symmetric(
horizontal: 16,
@ -92,8 +89,7 @@ class _ReportIssuesPageState extends State<ReportIssuesPage> {
color: AColors.grey,
offset: Offset(0, -1),
)
]
),
]),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
@ -102,15 +98,15 @@ class _ReportIssuesPageState extends State<ReportIssuesPage> {
hintText: _subtitle.title,
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.headline6,
validator: (value) =>
Validator.hasValue(value)
? null : _subtitle.titleValidateMessage,
validator: (value) => Validator.hasValue(value) ? null : _subtitle.titleValidateMessage,
textInputType: TextInputType.name,
onSaved: (value) {
_issue.title = value;
},
),
SizedBox(height: 8,),
SizedBox(
height: 8,
),
Column(
children: List.generate(
_issues.length,
@ -125,9 +121,7 @@ class _ReportIssuesPageState extends State<ReportIssuesPage> {
}
setState(() {});
},
)
)
),
))),
Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
@ -148,8 +142,7 @@ class _ReportIssuesPageState extends State<ReportIssuesPage> {
child: AButton(
text: _subtitle.submit,
onPressed: () async {
if(!_formKey.currentState.validate())
return;
if (!_formKey.currentState.validate()) return;
_formKey.currentState.save();
_issue.serviceRequestId = widget.serviceRequest.id;
_isLoading = true;

@ -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_types_mune.dart';
import 'package:test_sa/views/widgets/titles/app_sub_title.dart';
class CreateRequestPage extends StatefulWidget {
static final String id = "/create-request";
@ -136,18 +137,26 @@ class _CreateRequestPageState extends State<CreateRequestPage> {
setState(() {});
},
),
const SizedBox(height: 8,),
const SizedBox(
height: 8,
),
const ASubTitle("Priority"),
const SizedBox(height: 4,),
const SizedBox(
height: 4,
),
ServiceRequestPriorityMenu(
initialValue: _serviceRequest.priority,
onSelect: (status) {
_serviceRequest.priority = status;
},
),
const SizedBox(height: 8,),
const SizedBox(
height: 8,
),
const ASubTitle("Defect Type"),
const SizedBox(height: 4,),
const SizedBox(
height: 4,
),
ServiceRequestDefectTypesMenu(
initialValue: _serviceRequest.defectType,
onSelect: (status) {
@ -155,18 +164,26 @@ class _CreateRequestPageState extends State<CreateRequestPage> {
},
),
12.height,
const SizedBox(height: 8,),
const SizedBox(
height: 8,
),
const ASubTitle("Type"),
const SizedBox(height: 4,),
const SizedBox(
height: 4,
),
ServiceRequestTypesMenu(
initialValue: _serviceRequest.type,
onSelect: (status) {
_serviceRequest.type = status;
},
),
const SizedBox(height: 8,),
const SizedBox(
height: 8,
),
const ASubTitle("Through"),
const SizedBox(height: 4,),
const SizedBox(
height: 4,
),
ServiceRequestedThroughMenu(
initialValue: const Lookup(name: "App", value: 3),
onSelect: (status) {
@ -210,8 +227,7 @@ class _CreateRequestPageState extends State<CreateRequestPage> {
_serviceRequest.deviceId = _device?.id ?? "";
_isLoading = true;
setState(() {});
_serviceRequest.devicePhotos = _deviceImages.map(
(e) => "${e.path.split("/").last}|${base64Encode(e.readAsBytesSync())}").toList();
_serviceRequest.devicePhotos = _deviceImages.map((e) => "${e.path.split("/").last}|${base64Encode(e.readAsBytesSync())}").toList();
if (_serviceRequest.audio != null) {
final file = File(_serviceRequest.audio);
_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/widgets/loaders/app_loading.dart';
import 'package:test_sa/views/widgets/loaders/failed_loading.dart';
class FutureRequestServiceDetails extends StatefulWidget {
static final String id = "/service-request-details";
@ -17,7 +18,6 @@ class FutureRequestServiceDetails extends StatefulWidget {
}
class _FutureRequestServiceDetailsState extends State<FutureRequestServiceDetails> {
UserProvider _userProvider;
SettingProvider _settingProvider;
@override
@ -28,17 +28,14 @@ class _FutureRequestServiceDetailsState extends State<FutureRequestServiceDetail
Subtitle _subtitle = AppLocalization.of(context).subtitle;
return Scaffold(
body: FutureBuilder<ServiceRequest>(
future: ServiceRequestsProvider().getSingleServiceRequest(
requestId: requestId,
user: _userProvider.user,
host: _settingProvider.host,
subtitle: _subtitle
),
future: ServiceRequestsProvider().getSingleServiceRequest(requestId: requestId, user: _userProvider.user, host: _settingProvider.host, subtitle: _subtitle),
builder: (BuildContext context, AsyncSnapshot<ServiceRequest> snapshot) {
if (snapshot.hasError)
return FailedLoading(
message: snapshot.error.toString(),
onReload: (){setState(() {});},
onReload: () {
setState(() {});
},
);
if (snapshot.hasData) {
return RequestDetailsPage(

@ -37,6 +37,7 @@ 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/timer/app_timer.dart';
import 'package:test_sa/views/widgets/titles/app_sub_title.dart';
class CreateServiceReport extends StatefulWidget {
static final String id = "/create-service-report";
final ServiceRequest request;
@ -47,8 +48,6 @@ class CreateServiceReport extends StatefulWidget {
}
class _CreateServiceReportState extends State<CreateServiceReport> with TickerProviderStateMixin {
UserProvider _userProvider;
SettingProvider _settingProvider;
ServiceRequestsProvider _serviceRequestsProvider;
@ -70,8 +69,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
visitDate: DateTime.now(),
//type: const Lookup(value: 2),
device: widget.request.device,
parts: []
);
parts: []);
super.initState();
}
@ -81,6 +79,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
_workPreformedController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
_userProvider = Provider.of<UserProvider>(context);
@ -102,43 +101,46 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
ListView(
children: [
//AppNameBar(),
const SizedBox(height: 16,),
const SizedBox(
height: 16,
),
Center(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
_subtitle.newServiceReport,
style: Theme.of(context).textTheme.headline5.copyWith(
color: AColors.cyan,
fontSize: 28,
fontWeight: FontWeight.bold
),
style: Theme.of(context).textTheme.headline5.copyWith(color: AColors.cyan, fontSize: 28, fontWeight: FontWeight.bold),
),
),
),
Container(
padding: const EdgeInsets.symmetric(horizontal: 16),
margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 16),
decoration: BoxDecoration(
color: AColors.grey,
borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)),
boxShadow: [
decoration: BoxDecoration(color: AColors.grey, borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), boxShadow: [
const BoxShadow(
color: AColors.grey,
offset: Offset(0, -1),
)
]
),
]),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const SizedBox(height: 8,),
const SizedBox(
height: 8,
),
Wrap(
spacing: 10,
children: [
ASubTitle("${_subtitle.callId}: ${widget.request.requestCode}",font: 14,),
widget.request.deviceSerialNumber == null ? const SizedBox():
ASubTitle("${_subtitle.deviceSN}: ${widget.request.deviceSerialNumber}",font: 14,),
ASubTitle(
"${_subtitle.callId}: ${widget.request.requestCode}",
font: 14,
),
widget.request.deviceSerialNumber == null
? const SizedBox()
: ASubTitle(
"${_subtitle.deviceSN}: ${widget.request.deviceSerialNumber}",
font: 14,
),
Text(
"${_subtitle.customer}: ${widget.request.hospitalName}",
style: Theme.of(context).textTheme.subtitle1.copyWith(
@ -147,7 +149,6 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
),
textScaleFactor: AppStyle.getScaleFactor(context),
)
],
),
const Divider(),
@ -181,9 +182,12 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ASubTitle(_subtitle.visitDate),
_validate && _serviceReport.visitDate == null ?
ASubTitle(_subtitle.requiredWord,color: Colors.red,):
const SizedBox.shrink(),
_validate && _serviceReport.visitDate == null
? ASubTitle(
_subtitle.requiredWord,
color: Colors.red,
)
: const SizedBox.shrink(),
Row(
children: [
Expanded(
@ -202,10 +206,11 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
],
),
),
],
),
const SizedBox(height: 8,),
const SizedBox(
height: 8,
),
// device sn
Visibility(
visible: widget.request.deviceSerialNumber == null,
@ -213,9 +218,12 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ASubTitle(_subtitle.deviceSN),
_validate && _serviceReport.device?.id == null ?
ASubTitle(_subtitle.requiredWord,color: Colors.red,):
const SizedBox.shrink(),
_validate && _serviceReport.device?.id == null
? ASubTitle(
_subtitle.requiredWord,
color: Colors.red,
)
: const SizedBox.shrink(),
AutoCompleteDeviceField(
hospitalId: widget.request.hospitalId,
initialValue: _serviceReport.device,
@ -223,23 +231,34 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
_serviceReport.device.id = id;
},
),
const SizedBox(height: 8,),
const SizedBox(
height: 8,
),
],
),
),
const SizedBox(height: 8,),
const SizedBox(
height: 8,
),
ASubTitle(_subtitle.serviceType),
_validate && _serviceReport.assetType == null ?
ASubTitle(_subtitle.requiredWord,color: Colors.red,):
const SizedBox.shrink(),
const SizedBox(height: 4,),
_validate && _serviceReport.assetType == null
? ASubTitle(
_subtitle.requiredWord,
color: Colors.red,
)
: const SizedBox.shrink(),
const SizedBox(
height: 4,
),
ServiceAssetTypeMenu(
initialValue: _serviceReport.assetType,
onSelect: (status) {
_serviceReport.assetType = status;
},
),
const SizedBox(height: 8,),
const SizedBox(
height: 8,
),
// Report status and Service Type
Row(
children: [
@ -249,10 +268,15 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ASubTitle(_subtitle.reportStatus),
_validate && _serviceReport.status == null ?
ASubTitle(_subtitle.requiredWord,color: Colors.red,):
const SizedBox.shrink(),
const SizedBox(height: 4,),
_validate && _serviceReport.status == null
? ASubTitle(
_subtitle.requiredWord,
color: Colors.red,
)
: const SizedBox.shrink(),
const SizedBox(
height: 4,
),
ServiceReportStatusMenu(
report: _serviceReport,
onSelect: (status) {
@ -262,7 +286,9 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
],
),
),
const SizedBox(width: 8,),
const SizedBox(
width: 8,
),
// Provider.of<ServiceReportLastCallsProvider>(context).isLoading == null
// ? const SizedBox.shrink():
// Call's last Situation
@ -274,15 +300,19 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ASubTitle(_subtitle.callLastSituation),
_validate && _serviceReport.callLastSituation == null ?
ASubTitle(_subtitle.requiredWord,color: Colors.red,):
const SizedBox.shrink(),
const SizedBox(height: 4,),
_validate && _serviceReport.callLastSituation == null
? ASubTitle(
_subtitle.requiredWord,
color: Colors.red,
)
: const SizedBox.shrink(),
const SizedBox(
height: 4,
),
ServiceReportLastCallsMenu(
report: _serviceReport,
onSelect: (status) {
if(status?.value == 12
|| _serviceReport.callLastSituation?.value == 12){
if (status?.value == 12 || _serviceReport.callLastSituation?.value == 12) {
_serviceReport.callLastSituation = status;
setState(() {});
} else {
@ -297,37 +327,49 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
),
],
),
SizedBox(height: 8 * AppStyle.getScaleFactor(context),),
SizedBox(
height: 8 * AppStyle.getScaleFactor(context),
),
const ASubTitle("Assign Employee"),
const SizedBox(height: 8,),
_validate && _serviceReport.engineer == null ?
ASubTitle(_subtitle.requiredWord,color: Colors.red,):
const SizedBox.shrink(),
const SizedBox(height: 4,),
const SizedBox(
height: 8,
),
_validate && _serviceReport.engineer == null
? ASubTitle(
_subtitle.requiredWord,
color: Colors.red,
)
: const SizedBox.shrink(),
const SizedBox(
height: 4,
),
EngineersMenu(
initialValue: _serviceReport.engineer,
onSelect: (engineer) {
_serviceReport.engineer = engineer;
},
),
const SizedBox(height: 8,),
const SizedBox(
height: 8,
),
// invoice number & code
_serviceReport.callLastSituation?.id != 12 ? const SizedBox.shrink():
Row(
_serviceReport.callLastSituation?.id != 12
? const SizedBox.shrink()
: Row(
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ASubTitle(_subtitle.invoiceNumber),
const SizedBox(height: 8,),
const SizedBox(
height: 8,
),
ATextFormField(
initialValue: _serviceReport?.invoiceNumber,
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.subtitle1,
validator: (value) =>
Validator.hasValue(value)
? null : _subtitle.requiredWord,
validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord,
textInputType: TextInputType.number,
onSaved: (value) {
_serviceReport.invoiceNumber = value;
@ -336,20 +378,22 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
],
),
),
const SizedBox(width: 8,),
const SizedBox(
width: 8,
),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ASubTitle(_subtitle.invoiceCode),
const SizedBox(height: 4,),
const SizedBox(
height: 4,
),
ATextFormField(
initialValue: _serviceReport?.invoiceCode,
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.subtitle1,
validator: (value) =>
Validator.hasValue(value)
? null : _subtitle.requiredWord,
validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord,
textInputType: TextInputType.text,
onSaved: (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,
),
Row(
children: [
// reasons
@ -430,7 +476,9 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ASubTitle(_subtitle.reasons),
const SizedBox(height: 4,),
const SizedBox(
height: 4,
),
ServiceReportReasonsMenu(
initialValue: _serviceReport.reason,
onSelect: (status) {
@ -440,7 +488,9 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
],
),
),
const SizedBox(width: 8,),
const SizedBox(
width: 8,
),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
@ -459,7 +509,9 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
),
],
),
const SizedBox(height: 8,),
const SizedBox(
height: 8,
),
// Traveling Hours & Working Hours
Row(
children: [
@ -468,7 +520,9 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ASubTitle(_subtitle.workingHours),
const SizedBox(height: 8,),
const SizedBox(
height: 8,
),
Row(
children: [
Expanded(
@ -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
// Row(
// 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 ASubTitle("Nurse Signature"),
ESignature(
oldSignature: _serviceReport.signatureNurse,
newSignature: _serviceReport.localNurseSignature,
onSaved: (signature) {
if(signature == null || signature.isEmpty) {return;}
if (signature == null || signature.isEmpty) {
return;
}
_serviceReport.localNurseSignature = signature;
_serviceReport.signatureNurse = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}";
},
),
const SizedBox(height: 8,),
const SizedBox(
height: 8,
),
const ASubTitle("Engineer Signature"),
ESignature(
oldSignature: _serviceReport.signatureEngineer,
newSignature: _serviceReport.localNurseSignature,
onSaved: (signature) {
if(signature == null || signature.isEmpty) {return;}
if (signature == null || signature.isEmpty) {
return;
}
_serviceReport.localNurseSignature = signature;
_serviceReport.signatureEngineer = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}";
},
),
const SizedBox(height: 8,),
const SizedBox(
height: 8,
),
// Part Number and Quantity
Row(
children: [
@ -603,10 +669,15 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ASubTitle(_subtitle.partNumber),
_validate && _serviceReport.parts == null ?
ASubTitle(_subtitle.requiredWord,color: Colors.red,):
const SizedBox.shrink(),
const SizedBox(height: 4,),
_validate && _serviceReport.parts == null
? ASubTitle(
_subtitle.requiredWord,
color: Colors.red,
)
: const SizedBox.shrink(),
const SizedBox(
height: 4,
),
AutoCompletePartsField(
onPick: (part) {
_serviceReport.parts.add(part);
@ -615,10 +686,11 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
],
),
),
],
),
SizedBox(height: 8*AppStyle.getScaleFactor(context),),
SizedBox(
height: 8 * AppStyle.getScaleFactor(context),
),
Row(
children: [
Expanded(flex: 3, child: Text(_subtitle.number)),
@ -626,9 +698,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
],
),
Column(
children: List.generate(
_serviceReport.parts.length,
(index) {
children: List.generate(_serviceReport.parts.length, (index) {
Part _part = _serviceReport.parts[index];
return PartItem(
part: _part,
@ -637,11 +707,11 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
setState(() {});
},
);
}
}),
),
const SizedBox(
height: 16,
),
const SizedBox(height: 16,),
],
),
),
@ -661,14 +731,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
_isLoading = true;
setState(() {});
int status = await _serviceRequestsProvider.createServiceReport(
user: _userProvider.user,
host: _settingProvider.host,
report: _serviceReport,
request: widget.request
);
int status = await _serviceRequestsProvider.createServiceReport(user: _userProvider.user, host: _settingProvider.host, report: _serviceReport, request: widget.request);
_isLoading = false;
setState(() {});
if (status >= 200 && status < 300) {
@ -678,20 +741,17 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
Navigator.of(context).pop();
Navigator.of(context).pop();
} else {
String errorMessage = HttpStatusManger.getStatusMessage(
status: status, subtitle: _subtitle);
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
errorMessage
),
)
);
String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle);
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(errorMessage),
));
}
},
),
),
const SizedBox(height: 300,)
const SizedBox(
height: 300,
)
],
),
const ABackButton(),

@ -36,6 +36,7 @@ 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/timer/app_timer.dart';
import 'package:test_sa/views/widgets/titles/app_sub_title.dart';
class EditServiceReport extends StatefulWidget {
static final String id = "/edit-service-report";
final ServiceRequest request;
@ -47,8 +48,6 @@ class EditServiceReport extends StatefulWidget {
}
class _EditServiceReportState extends State<EditServiceReport> with TickerProviderStateMixin {
UserProvider _userProvider;
SettingProvider _settingProvider;
ServiceRequestsProvider _serviceRequestsProvider;
@ -76,6 +75,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
_workPreformedController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
_userProvider = Provider.of<UserProvider>(context);
@ -97,43 +97,46 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
ListView(
children: [
//AppNameBar(),
const SizedBox(height: 16,),
const SizedBox(
height: 16,
),
Center(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
_subtitle.editServiceReport,
style: Theme.of(context).textTheme.headline5.copyWith(
color: AColors.cyan,
fontSize: 28,
fontWeight: FontWeight.bold
),
style: Theme.of(context).textTheme.headline5.copyWith(color: AColors.cyan, fontSize: 28, fontWeight: FontWeight.bold),
),
),
),
Container(
padding: const EdgeInsets.symmetric(horizontal: 16),
margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 16),
decoration: BoxDecoration(
color: AColors.grey,
borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)),
boxShadow: [
decoration: BoxDecoration(color: AColors.grey, borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), boxShadow: [
const BoxShadow(
color: AColors.grey,
offset: Offset(0, -1),
)
]
),
]),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const SizedBox(height: 8,),
const SizedBox(
height: 8,
),
Wrap(
spacing: 10,
children: [
ASubTitle("${_subtitle.callId}: ${widget.request.requestCode}",font: 14,),
widget.request.deviceSerialNumber == null ? const SizedBox():
ASubTitle("${_subtitle.deviceSN}: ${widget.request.deviceSerialNumber}",font: 14,),
ASubTitle(
"${_subtitle.callId}: ${widget.request.requestCode}",
font: 14,
),
widget.request.deviceSerialNumber == null
? const SizedBox()
: ASubTitle(
"${_subtitle.deviceSN}: ${widget.request.deviceSerialNumber}",
font: 14,
),
Text(
"${_subtitle.customer}: ${widget.request.hospitalName}",
style: Theme.of(context).textTheme.subtitle1.copyWith(
@ -142,7 +145,6 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
),
textScaleFactor: AppStyle.getScaleFactor(context),
)
],
),
const Divider(),
@ -156,10 +158,15 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ASubTitle(_subtitle.reportType),
_validate && _serviceReport.type == null ?
ASubTitle(_subtitle.requiredWord,color: Colors.red,):
const SizedBox.shrink(),
const SizedBox(height: 4,),
_validate && _serviceReport.type == null
? ASubTitle(
_subtitle.requiredWord,
color: Colors.red,
)
: const SizedBox.shrink(),
const SizedBox(
height: 4,
),
ServiceReportTypeMenu(
initialValue: _serviceReport.type,
onSelect: (status) {
@ -169,16 +176,21 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
],
),
),
const SizedBox(width: 8,),
const SizedBox(
width: 8,
),
// visit date
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ASubTitle(_subtitle.visitDate),
_validate && _serviceReport.visitDate == null ?
ASubTitle(_subtitle.requiredWord,color: Colors.red,):
const SizedBox.shrink(),
_validate && _serviceReport.visitDate == null
? ASubTitle(
_subtitle.requiredWord,
color: Colors.red,
)
: const SizedBox.shrink(),
Row(
children: [
Expanded(
@ -197,10 +209,11 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
],
),
),
],
),
const SizedBox(height: 8,),
const SizedBox(
height: 8,
),
// device sn
Visibility(
visible: true, //widget.report.device == null,
@ -208,9 +221,12 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ASubTitle(_subtitle.deviceSN),
_validate && _serviceReport.device?.id == null ?
ASubTitle(_subtitle.requiredWord,color: Colors.red,):
const SizedBox.shrink(),
_validate && _serviceReport.device?.id == null
? ASubTitle(
_subtitle.requiredWord,
color: Colors.red,
)
: const SizedBox.shrink(),
AutoCompleteDeviceField(
hospitalId: widget.request.hospitalId,
initialValue: _serviceReport.device,
@ -218,37 +234,59 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
_serviceReport.device.id = id;
},
),
const SizedBox(height: 8,),
const SizedBox(
height: 8,
),
],
),
),
const SizedBox(height: 8,),
const SizedBox(
height: 8,
),
ASubTitle(_subtitle.serviceType),
_validate && _serviceReport.assetType == null ?
ASubTitle(_subtitle.requiredWord,color: Colors.red,):
const SizedBox.shrink(),
const SizedBox(height: 4,),
_validate && _serviceReport.assetType == null
? ASubTitle(
_subtitle.requiredWord,
color: Colors.red,
)
: const SizedBox.shrink(),
const SizedBox(
height: 4,
),
ServiceAssetTypeMenu(
initialValue: _serviceReport.assetType,
onSelect: (status) {
_serviceReport.assetType = status;
},
),
const SizedBox(height: 8,),
SizedBox(height: 8 * AppStyle.getScaleFactor(context),),
const SizedBox(
height: 8,
),
SizedBox(
height: 8 * AppStyle.getScaleFactor(context),
),
const ASubTitle("Assign Employee"),
const SizedBox(height: 8,),
_validate && _serviceReport.engineer == null ?
ASubTitle(_subtitle.requiredWord,color: Colors.red,):
const SizedBox.shrink(),
const SizedBox(height: 4,),
const SizedBox(
height: 8,
),
_validate && _serviceReport.engineer == null
? ASubTitle(
_subtitle.requiredWord,
color: Colors.red,
)
: const SizedBox.shrink(),
const SizedBox(
height: 4,
),
EngineersMenu(
initialValue: _serviceReport.engineer,
onSelect: (engineer) {
_serviceReport.engineer = engineer;
},
),
const SizedBox(height: 8,),
const SizedBox(
height: 8,
),
// Report status and Service Type
Row(
children: [
@ -258,10 +296,15 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ASubTitle(_subtitle.reportStatus),
_validate && _serviceReport.status == null ?
ASubTitle(_subtitle.requiredWord,color: Colors.red,):
const SizedBox.shrink(),
const SizedBox(height: 4,),
_validate && _serviceReport.status == null
? ASubTitle(
_subtitle.requiredWord,
color: Colors.red,
)
: const SizedBox.shrink(),
const SizedBox(
height: 4,
),
ServiceReportStatusMenu(
report: _serviceReport,
onSelect: (status) {
@ -271,7 +314,9 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
],
),
),
const SizedBox(width: 8,),
const SizedBox(
width: 8,
),
Consumer<ServiceReportLastCallsProvider>(
builder: (_, provider, __) {
if (provider.isLoading == null) return const SizedBox.shrink();
@ -280,15 +325,19 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ASubTitle(_subtitle.callLastSituation),
_validate && _serviceReport.callLastSituation == null ?
ASubTitle(_subtitle.requiredWord,color: Colors.red,):
const SizedBox.shrink(),
const SizedBox(height: 4,),
_validate && _serviceReport.callLastSituation == null
? ASubTitle(
_subtitle.requiredWord,
color: Colors.red,
)
: const SizedBox.shrink(),
const SizedBox(
height: 4,
),
ServiceReportLastCallsMenu(
report: _serviceReport,
onSelect: (status) {
if(status?.value == 12
|| _serviceReport.callLastSituation?.value == 12){
if (status?.value == 12 || _serviceReport.callLastSituation?.value == 12) {
_serviceReport.callLastSituation = status;
setState(() {});
} else {
@ -303,24 +352,27 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
),
],
),
const SizedBox(height: 8,),
const SizedBox(
height: 8,
),
// invoice number & code
_serviceReport.callLastSituation?.value != 12 ? const SizedBox.shrink():
Row(
_serviceReport.callLastSituation?.value != 12
? const SizedBox.shrink()
: Row(
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ASubTitle(_subtitle.invoiceNumber),
const SizedBox(height: 8,),
const SizedBox(
height: 8,
),
ATextFormField(
initialValue: _serviceReport?.invoiceNumber,
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.subtitle1,
validator: (value) =>
Validator.hasValue(value)
? null : _subtitle.requiredWord,
validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord,
textInputType: TextInputType.number,
onSaved: (value) {
_serviceReport.invoiceNumber = value;
@ -329,20 +381,22 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
],
),
),
const SizedBox(width: 8,),
const SizedBox(
width: 8,
),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ASubTitle(_subtitle.invoiceCode),
const SizedBox(height: 4,),
const SizedBox(
height: 4,
),
ATextFormField(
initialValue: _serviceReport?.invoiceCode,
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.subtitle1,
validator: (value) =>
Validator.hasValue(value)
? null : _subtitle.requiredWord,
validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord,
textInputType: TextInputType.text,
onSaved: (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,
),
Row(
children: [
// reasons
@ -423,7 +479,9 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ASubTitle(_subtitle.reasons),
const SizedBox(height: 4,),
const SizedBox(
height: 4,
),
ServiceReportReasonsMenu(
initialValue: _serviceReport.reason,
onSelect: (status) {
@ -433,7 +491,9 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
],
),
),
const SizedBox(width: 8,),
const SizedBox(
width: 8,
),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
@ -452,7 +512,9 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
),
],
),
const SizedBox(height: 8,),
const SizedBox(
height: 8,
),
// Traveling Hours & Working Hours
Row(
children: [
@ -461,7 +523,9 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ASubTitle(_subtitle.workingHours),
const SizedBox(height: 8,),
const SizedBox(
height: 8,
),
Row(
children: [
Expanded(
@ -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
// Row(
// 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 ASubTitle("Nurse Signature"),
ESignature(
oldSignature: _serviceReport.signatureNurse,
newSignature: _serviceReport.localNurseSignature,
onChange: (signature) {
if(signature == null || signature.isEmpty) {return;}
if (signature == null || signature.isEmpty) {
return;
}
_serviceReport.localNurseSignature = signature;
_serviceReport.signatureNurse = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}";
},
),
const SizedBox(height: 8,),
const SizedBox(
height: 8,
),
const ASubTitle("Engineer Signature"),
ESignature(
oldSignature: _serviceReport.signatureEngineer,
newSignature: _serviceReport.localNurseSignature,
onChange: (signature) {
if(signature == null || signature.isEmpty) {return;}
if (signature == null || signature.isEmpty) {
return;
}
_serviceReport.localNurseSignature = signature;
_serviceReport.signatureEngineer = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}";
},
),
const SizedBox(height: 8,),
const SizedBox(
height: 8,
),
// Part Number and Quantity
Row(
children: [
@ -596,10 +672,15 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ASubTitle(_subtitle.partNumber),
_validate && _serviceReport.parts == null ?
ASubTitle(_subtitle.requiredWord,color: Colors.red,):
const SizedBox.shrink(),
const SizedBox(height: 4,),
_validate && _serviceReport.parts == null
? ASubTitle(
_subtitle.requiredWord,
color: Colors.red,
)
: const SizedBox.shrink(),
const SizedBox(
height: 4,
),
AutoCompletePartsField(
onPick: (part) {
_serviceReport.parts.add(part);
@ -609,10 +690,11 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
],
),
),
],
),
SizedBox(height: 8*AppStyle.getScaleFactor(context),),
SizedBox(
height: 8 * AppStyle.getScaleFactor(context),
),
Row(
children: [
Expanded(flex: 3, child: Text(_subtitle.number)),
@ -620,9 +702,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
],
),
Column(
children: List.generate(
_serviceReport.parts.length,
(index) {
children: List.generate(_serviceReport.parts.length, (index) {
Part _part = _serviceReport.parts[index];
return PartItem(
part: _part,
@ -631,12 +711,12 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
setState(() {});
},
);
}
),
}),
),
const SizedBox(height: 16,),
const SizedBox(
height: 16,
),
],
),
),
@ -659,12 +739,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
_isLoading = true;
setState(() {});
int status = await _serviceRequestsProvider.updateServiceReport(
user: _userProvider.user,
host: _settingProvider.host,
report: _serviceReport,
request: widget.request
);
int status = await _serviceRequestsProvider.updateServiceReport(user: _userProvider.user, host: _settingProvider.host, report: _serviceReport, request: widget.request);
_isLoading = false;
setState(() {});
if (status >= 200 && status < 300) {
@ -674,20 +749,17 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
Navigator.of(context).pop();
Navigator.of(context).pop();
} else {
String errorMessage = HttpStatusManger.getStatusMessage(
status: status, subtitle: _subtitle);
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
errorMessage
),
)
);
String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle);
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(errorMessage),
));
}
},
),
),
const SizedBox(height: 300,)
const SizedBox(
height: 300,
)
],
),
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/requests/service_request_list.dart';
import 'package:test_sa/views/widgets/search/service_request_search_bar.dart';
class ServiceRequestsPage extends StatefulWidget {
static final String id = "/service-requests";
@override
_ServiceRequestsPageState createState() => _ServiceRequestsPageState();
}
class _ServiceRequestsPageState extends State<ServiceRequestsPage>
with TickerProviderStateMixin{
class _ServiceRequestsPageState extends State<ServiceRequestsPage> with TickerProviderStateMixin {
ServiceRequestsProvider _serviceRequestsProvider;
UserProvider _userProvider;
SettingProvider _settingProvider;
@ -66,10 +66,7 @@ class _ServiceRequestsPageState extends State<ServiceRequestsPage>
child: Center(
child: Text(
_subtitle.serviceRequests,
style: Theme.of(context).textTheme.headline6.copyWith(
color: AColors.white,
fontStyle: FontStyle.italic
),
style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic),
),
),
),
@ -95,10 +92,11 @@ class _ServiceRequestsPageState extends State<ServiceRequestsPage>
}
},
),
SizedBox(width: 16,)
SizedBox(
width: 16,
)
],
),
],
),
),
@ -117,7 +115,6 @@ class _ServiceRequestsPageState extends State<ServiceRequestsPage>
),
],
),
],
),
),

@ -49,12 +49,7 @@ class _EditPentryState extends State<EditPentry> with SingleTickerProviderStateM
_isLoading = true;
setState(() {});
int status = await _regularVisitsProvider.updatePentry(
user: _userProvider.user,
host: _settingProvider.host,
pentry: _pentry,
visit: widget.visit
);
int status = await _regularVisitsProvider.updatePentry(user: _userProvider.user, host: _settingProvider.host, pentry: _pentry, visit: widget.visit);
_isLoading = false;
setState(() {});
if (status >= 200 && status < 300) {
@ -115,10 +110,18 @@ class _EditPentryState extends State<EditPentry> with SingleTickerProviderStateM
setState(() {});
},
tabs: const [
Tab(text: "PPM Check List",),
Tab(text: "Calibration Tools",),
Tab(text: "PK Kits",),
Tab(text: "Pentry",),
Tab(
text: "PPM Check List",
),
Tab(
text: "Calibration Tools",
),
Tab(
text: "PK Kits",
),
Tab(
text: "Pentry",
),
]),
),
),
@ -157,7 +160,9 @@ class _EditPentryState extends State<EditPentry> with SingleTickerProviderStateM
ASmallButton(
text: _subtitle.back,
onPressed: () {
_tabController.animateTo(_tabController.index - 1,);
_tabController.animateTo(
_tabController.index - 1,
);
setState(() {});
},
),
@ -166,7 +171,9 @@ class _EditPentryState extends State<EditPentry> with SingleTickerProviderStateM
ASmallButton(
text: _subtitle.next,
onPressed: () {
_tabController.animateTo(_tabController.index + 1,);
_tabController.animateTo(
_tabController.index + 1,
);
setState(() {});
},
),
@ -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/widgets/loaders/app_loading.dart';
import 'package:test_sa/views/widgets/loaders/failed_loading.dart';
class FutureEditPentry extends StatefulWidget {
class FutureEditPentry extends StatefulWidget {
final Visit visit;
const FutureEditPentry({Key key, this.visit}) : super(key: key);
@ -21,7 +21,6 @@ class FutureEditPentry extends StatefulWidget {
}
class _FutureEditPentryState extends State<FutureEditPentry> {
UserProvider _userProvider;
SettingProvider _settingProvider;
@override
@ -32,17 +31,14 @@ class _FutureEditPentryState extends State<FutureEditPentry> {
Subtitle subtitle = AppLocalization.of(context).subtitle;
return Scaffold(
body: FutureBuilder<Pentry>(
future: RegularVisitsProvider().getPently(
user: _userProvider.user,
host: _settingProvider.host,
id: widget.visit.id
),
future: RegularVisitsProvider().getPently(user: _userProvider.user, host: _settingProvider.host, id: widget.visit.id),
builder: (BuildContext context, AsyncSnapshot<Pentry> snapshot) {
if (snapshot.hasError) {
return FailedLoading(
message: subtitle.failedToCompleteRequest,
onReload: (){setState(() {});},
onReload: () {
setState(() {});
},
);
}
if (snapshot.hasData) {

@ -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/search/visits_search_bar.dart';
import 'package:test_sa/views/widgets/visits/visits_list.dart';
class PreventiveMaintenanceVisitsPage extends StatefulWidget {
static final String id = "/preventive-maintenance-visits";
@override
_PreventiveMaintenanceVisitsPageState createState() => _PreventiveMaintenanceVisitsPageState();
}
class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceVisitsPage>
with TickerProviderStateMixin{
class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceVisitsPage> with TickerProviderStateMixin {
PreventiveMaintenanceVisitsProvider _visitsProvider;
UserProvider _userProvider;
SettingProvider _settingProvider;
@ -68,10 +68,7 @@ class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceV
child: Center(
child: Text(
_subtitle.preventiveMaintenance,
style: Theme.of(context).textTheme.headline6.copyWith(
color: AColors.white,
fontStyle: FontStyle.italic
),
style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic),
),
),
),
@ -101,10 +98,11 @@ class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceV
}
},
),
SizedBox(width: 16,)
SizedBox(
width: 16,
)
],
),
],
),
),
@ -137,7 +135,10 @@ class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceV
isScrollControlled: true,
context: context,
builder: (context) {
return UpdateVisitsGroupSheet(visits: visits,title:_subtitle.updatePreventiveMaintenance,);
return UpdateVisitsGroupSheet(
visits: visits,
title: _subtitle.updatePreventiveMaintenance,
);
},
) as VisitsGroup;
if (_group != null) {
@ -151,11 +152,7 @@ class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceV
);
},
);
int status = await _visitsProvider.updateGroupOfVisits(
user: _userProvider.user,
host: _settingProvider.host,
group: _group
);
int status = await _visitsProvider.updateGroupOfVisits(user: _userProvider.user, host: _settingProvider.host, group: _group);
Navigator.of(context).pop();
if (status >= 200 && status < 300) {
Fluttertoast.showToast(
@ -165,10 +162,7 @@ class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceV
);
} else {
Fluttertoast.showToast(
msg: HttpStatusManger.getStatusMessage(
status: status,
subtitle: _subtitle
),
msg: HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle),
toastLength: Toast.LENGTH_LONG,
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/search/visits_search_bar.dart';
import 'package:test_sa/views/widgets/visits/visits_list.dart';
class RegularVisitsPage extends StatefulWidget {
static final String id = "/Regular-visits";
@override
_RegularVisitsPageState createState() => _RegularVisitsPageState();
}
class _RegularVisitsPageState extends State<RegularVisitsPage>
with TickerProviderStateMixin{
class _RegularVisitsPageState extends State<RegularVisitsPage> with TickerProviderStateMixin {
RegularVisitsProvider _visitsProvider;
UserProvider _userProvider;
SettingProvider _settingProvider;
@ -67,10 +67,7 @@ class _RegularVisitsPageState extends State<RegularVisitsPage>
child: Center(
child: Text(
_subtitle.preventiveMaintenance,
style: Theme.of(context).textTheme.headline6.copyWith(
color: AColors.white,
fontStyle: FontStyle.italic
),
style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic),
),
),
),
@ -99,10 +96,11 @@ class _RegularVisitsPageState extends State<RegularVisitsPage>
},
),
),
SizedBox(width: 16,)
SizedBox(
width: 16,
)
],
),
],
),
),
@ -134,7 +132,10 @@ class _RegularVisitsPageState extends State<RegularVisitsPage>
isScrollControlled: true,
context: context,
builder: (context) {
return UpdateVisitsGroupSheet(visits: visits,title: _subtitle.updateRegularVisits,);
return UpdateVisitsGroupSheet(
visits: visits,
title: _subtitle.updateRegularVisits,
);
},
) as VisitsGroup;
if (_group != null) {
@ -148,11 +149,7 @@ class _RegularVisitsPageState extends State<RegularVisitsPage>
);
},
);
int status = await _visitsProvider.updateGroupOfVisits(
user: _userProvider.user,
host: _settingProvider.host,
group: _group
);
int status = await _visitsProvider.updateGroupOfVisits(user: _userProvider.user, host: _settingProvider.host, group: _group);
Navigator.of(context).pop();
if (status >= 200 && status < 300) {
Fluttertoast.showToast(
@ -162,10 +159,7 @@ class _RegularVisitsPageState extends State<RegularVisitsPage>
);
} else {
Fluttertoast.showToast(
msg: HttpStatusManger.getStatusMessage(
status: status,
subtitle: _subtitle
),
msg: HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle),
toastLength: Toast.LENGTH_LONG,
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/status/employee/engineers_mune.dart';
import 'package:test_sa/views/widgets/visits/visit_status.dart';
class UpdateVisitsGroupSheet extends StatefulWidget {
final List<Visit> visits;
final String title;
@ -76,14 +77,18 @@ class _UpdateVisitsGroupSheetState extends State<UpdateVisitsGroupSheet> {
),
],
),
SizedBox(height: 8 * AppStyle.getScaleFactor(context),),
SizedBox(
height: 8 * AppStyle.getScaleFactor(context),
),
EngineersMenu(
initialValue: _group.engineer,
onSelect: (engineer) {
_group.engineer = engineer;
},
),
SizedBox(height: 8 * AppStyle.getScaleFactor(context),),
SizedBox(
height: 8 * AppStyle.getScaleFactor(context),
),
// AOneImagePicker(
// image: _image,
// onPick: (image){
@ -200,7 +205,9 @@ class _UpdateVisitsGroupSheetState extends State<UpdateVisitsGroupSheet> {
// ),
// ),
// ),
SizedBox(height: 8 * AppStyle.getScaleFactor(context),),
SizedBox(
height: 8 * AppStyle.getScaleFactor(context),
),
Expanded(
child: ListView.builder(
itemCount: widget.visits.length,
@ -209,28 +216,18 @@ class _UpdateVisitsGroupSheetState extends State<UpdateVisitsGroupSheet> {
return Container(
padding: EdgeInsets.symmetric(vertical: 8, horizontal: 8),
margin: EdgeInsets.symmetric(vertical: 4),
decoration: BoxDecoration(
color: AColors.primaryColor,
borderRadius: BorderRadius.circular(
AppStyle.getBorderRadius(context)
),
boxShadow: [
AppStyle.boxShadow
]
),
decoration: BoxDecoration(color: AColors.primaryColor, borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), boxShadow: [AppStyle.boxShadow]),
child: Row(
children: [
Expanded(
child: Text(
"${_subtitle.sn}: " + visit.deviceSerialNumber ?? _subtitle.noSerialNumberFound,
style: Theme.of(context).textTheme.headline6.copyWith(
color: AColors.white,
fontSize: 16,
fontWeight: FontWeight.bold
style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontSize: 16, fontWeight: FontWeight.bold),
),
),
),
VisitStatusLabel(visit: visit,)
VisitStatusLabel(
visit: visit,
)
],
),
);
@ -245,7 +242,6 @@ class _UpdateVisitsGroupSheetState extends State<UpdateVisitsGroupSheet> {
),
],
),
],
),
);

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

@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:test_sa/views/app_style/colors.dart';
import 'package:test_sa/views/app_style/sizing.dart';
class AppNameBar extends StatelessWidget {
@override
Widget build(BuildContext context) {
@ -11,10 +12,7 @@ class AppNameBar extends StatelessWidget {
child: Center(
child: Text(
"Test SA",
style: Theme.of(context).textTheme.headline6.copyWith(
color: AColors.white,
fontStyle: FontStyle.italic
),
style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic),
),
),
);

@ -13,14 +13,14 @@ class AFlatButton extends StatelessWidget {
Widget build(BuildContext context) {
return TextButton(
style: TextButton.styleFrom(
foregroundColor: this.textColor ?? Colors.black, padding: padding,
foregroundColor: this.textColor ?? Colors.black,
padding: padding,
),
onPressed: onPressed,
child: Text(
text ?? "",
style: style ?? Theme.of(context).textTheme.bodyText1,
textScaleFactor: AppStyle.getScaleFactor(context),
)
);
));
}
}

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

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

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

@ -15,19 +15,13 @@ class ASmallButton extends StatelessWidget {
style: ElevatedButton.styleFrom(
padding: padding,
primary: color ?? Theme.of(context).primaryColor,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8)
),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)),
),
child: Text(
text ?? "",
style: style ?? Theme.of(context).textTheme.bodyText1.copyWith(
color: color == Colors.white
? Theme.of(context).primaryColor : Colors.white
),
style: style ?? Theme.of(context).textTheme.bodyText1.copyWith(color: color == Colors.white ? Theme.of(context).primaryColor : Colors.white),
textScaleFactor: AppStyle.getScaleFactor(context),
),
onPressed: onPressed
);
onPressed: onPressed);
}
}

@ -11,13 +11,13 @@ class CarveInImage extends CustomClipper<Path> {
Path path = Path();
path.lineTo(0, size.height);
path.lineTo(size.width / 2 - gab / 2, size.height);
path.arcToPoint(Offset(size.width/2 + gab / 2, size.height),
radius: Radius.circular(gab/2));
path.arcToPoint(Offset(size.width / 2 + gab / 2, size.height), radius: Radius.circular(gab / 2));
path.lineTo(size.width, size.height);
path.lineTo(size.width, 0);
path.lineTo(0, 0);
return path;
}
@override
bool shouldReclip(CustomClipper<Path> oldClipper) => true;
}

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

@ -4,6 +4,7 @@ import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/views/app_style/sizing.dart';
import 'date_picker.dart';
class FromToDateBar extends StatefulWidget {
final DateTime from;
final DateTime to;
@ -32,16 +33,12 @@ class _FromToDateBarState extends State<FromToDateBar> {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
_subtitle.from,
style: Theme.of(context).textTheme.bodyText1.copyWith(
fontSize: 12,
fontWeight: FontWeight.normal
),
style: Theme.of(context).textTheme.bodyText1.copyWith(fontSize: 12, fontWeight: FontWeight.normal),
textScaleFactor: AppStyle.getScaleFactor(context),
),
ADatePicker(
@ -60,10 +57,7 @@ class _FromToDateBarState extends State<FromToDateBar> {
children: [
Text(
_subtitle.to,
style: Theme.of(context).textTheme.bodyText1.copyWith(
fontSize: 12,
fontWeight: FontWeight.normal
),
style: Theme.of(context).textTheme.bodyText1.copyWith(fontSize: 12, fontWeight: FontWeight.normal),
textScaleFactor: AppStyle.getScaleFactor(context),
),
ADatePicker(

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

@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:test_sa/models/department.dart';
import 'package:test_sa/views/app_style/colors.dart';
import 'package:test_sa/views/app_style/sizing.dart';
class DepartmentItem extends StatelessWidget {
final Department department;
final Function(Department) onPressed;
@ -15,9 +16,7 @@ class DepartmentItem extends StatelessWidget {
style: ElevatedButton.styleFrom(
backgroundColor: AColors.primaryColor,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(
AppStyle.getBorderRadius(context)
),
borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)),
),
),
onPressed: () {
@ -26,12 +25,9 @@ class DepartmentItem extends StatelessWidget {
child: ListTile(
title: Text(
department.name ?? "",
style: Theme.of(context).textTheme.subtitle1.copyWith(
color: AColors.white
),
style: Theme.of(context).textTheme.subtitle1.copyWith(color: AColors.white),
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 '../app_text_form_field.dart';
class SingleDepartmentPicker extends StatefulWidget {
static final String id = "/single-Department-Picker";
@override
@ -45,7 +46,9 @@ class _SingleDepartmentPickerState extends State<SingleDepartmentPicker> {
},
child: Column(
children: [
SizedBox(height: 48,),
SizedBox(
height: 48,
),
Padding(
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16),
child: ATextFormField(
@ -54,19 +57,17 @@ class _SingleDepartmentPickerState extends State<SingleDepartmentPicker> {
suffixIcon: Icon(Icons.search_rounded),
onChange: (value) {
_searchableList.clear();
_searchableList.addAll(_departmentsProvider.departments.where(
(element) => element.name.toLowerCase().contains(
value.toLowerCase()
)
).toList());
_searchableList.addAll(_departmentsProvider.departments.where((element) => element.name.toLowerCase().contains(value.toLowerCase())).toList());
setState(() {});
},
),
),
Expanded(
child: _searchableList.isEmpty ?
NoItemFound(message: _subtitle.noUniteFound,):
ListView.builder(
child: _searchableList.isEmpty
? NoItemFound(
message: _subtitle.noUniteFound,
)
: ListView.builder(
padding: EdgeInsets.zero,
shrinkWrap: true,
itemCount: _searchableList.length,

@ -5,6 +5,7 @@ import 'package:test_sa/views/app_style/colors.dart';
import 'package:test_sa/views/widgets/loaders/image_loader.dart';
import 'package:test_sa/views/widgets/requests/info_row.dart';
import 'package:test_sa/views/widgets/requests/request_status.dart';
class DeviceTransferInfoSection extends StatelessWidget {
final DeviceTransferInfo info;
final VoidCallback onEdit;
@ -41,19 +42,16 @@ class DeviceTransferInfoSection extends StatelessWidget {
),
RequestInfoRow(
title: "Signature",
info: info.signature?.isEmpty != false
? subtitle.noDateFound : null,
contentWidget: info.signature?.isEmpty != false ? null :
ImageLoader(
info: info.signature?.isEmpty != false ? subtitle.noDateFound : null,
contentWidget: info.signature?.isEmpty != false
? null
: ImageLoader(
url: info.signature,
),
),
RequestInfoRow(
title: subtitle.status,
infoWidget: StatusLabel(
label: info.status?.name,
color: AColors.getGasStatusColor(info.status?.id)
),
infoWidget: StatusLabel(label: info.status?.name, color: AColors.getGasStatusColor(info.status?.id)),
),
],
);

@ -9,6 +9,7 @@ import 'package:test_sa/models/user.dart';
import 'package:test_sa/views/app_style/colors.dart';
import 'package:test_sa/views/app_style/sizing.dart';
import 'package:test_sa/views/widgets/requests/request_status.dart';
class DeviceTransferItem extends StatelessWidget {
final int index;
final DeviceTransfer item;
@ -19,12 +20,8 @@ class DeviceTransferItem extends StatelessWidget {
Widget build(BuildContext context) {
Subtitle _subtitle = AppLocalization.of(context).subtitle;
User _user = Provider.of<UserProvider>(context, listen: false).user;
Color itemColor = index % 2 == 0
? Theme.of(context).colorScheme.primary
: Theme.of(context).colorScheme.onPrimary;
Color onItemColor = index % 2 != 0
? Theme.of(context).colorScheme.primary
: Theme.of(context).colorScheme.onPrimary;
Color itemColor = index % 2 == 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary;
Color onItemColor = index % 2 != 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary;
return Padding(
padding: const EdgeInsets.symmetric(vertical: 4),
@ -33,9 +30,7 @@ class DeviceTransferItem extends StatelessWidget {
padding: EdgeInsets.symmetric(vertical: 8, horizontal: 8),
backgroundColor: itemColor,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(
AppStyle.getBorderRadius(context)
),
borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)),
),
),
//padding: EdgeInsets.symmetric(vertical: 8,horizontal: 8),
@ -53,13 +48,11 @@ class DeviceTransferItem extends StatelessWidget {
children: [
Text(
item.title ?? "-----",
style: Theme.of(context).textTheme.headline6.copyWith(
color: onItemColor,
fontSize: 16,
fontWeight: FontWeight.bold
style: Theme.of(context).textTheme.headline6.copyWith(color: onItemColor, fontSize: 16, fontWeight: FontWeight.bold),
),
Divider(
color: onItemColor,
),
Divider(color: onItemColor,),
Row(
children: [
Expanded(
@ -74,7 +67,6 @@ class DeviceTransferItem extends StatelessWidget {
color: AColors.getRequestStatusColor(item.sender.status?.id),
label: item.sender.status?.name,
)
],
),
//const SizedBox(height: 8,),
@ -88,8 +80,6 @@ class DeviceTransferItem extends StatelessWidget {
),
),
),
],
),
if (item.sender.department.id != null)
@ -99,7 +89,9 @@ class DeviceTransferItem extends StatelessWidget {
color: onItemColor,
),
),
Divider(color: onItemColor,),
Divider(
color: onItemColor,
),
Row(
children: [
Expanded(
@ -114,7 +106,6 @@ class DeviceTransferItem extends StatelessWidget {
color: AColors.getRequestStatusColor(item.receiver.status?.id),
label: item.receiver.status?.name,
)
],
),
//const SizedBox(height: 8,),
@ -128,8 +119,6 @@ class DeviceTransferItem extends StatelessWidget {
),
),
),
],
),
if (item.receiver.department.id != null)
@ -143,7 +132,6 @@ class DeviceTransferItem extends StatelessWidget {
],
),
),
],
),
],

@ -6,6 +6,7 @@ import 'package:test_sa/views/pages/device_transfer/device_transfer_details.dart
import 'package:test_sa/views/widgets/device_trancfer/device_transfer_item.dart';
import 'package:test_sa/views/widgets/loaders/lazy_loading.dart';
import 'package:test_sa/views/widgets/loaders/no_item_found.dart';
class DeviceTransferList extends StatelessWidget {
final List<DeviceTransfer> items;
final bool nextPage;
@ -15,10 +16,11 @@ class DeviceTransferList extends StatelessWidget {
@override
Widget build(BuildContext context) {
if (items.length == 0) {
Subtitle subtitle = AppLocalization.of(context).subtitle;
return NoItemFound(message: subtitle.noServiceRequestFound,);
return NoItemFound(
message: subtitle.noServiceRequestFound,
);
}
return LazyLoading(
nextPage: nextPage,
@ -32,15 +34,13 @@ class DeviceTransferList extends StatelessWidget {
index: itemIndex,
item: items[itemIndex],
onPressed: (model) {
Navigator.of(context).push(
MaterialPageRoute(
builder: (_)=> DeviceTransferDetails(model: model,)
)
);
Navigator.of(context).push(MaterialPageRoute(
builder: (_) => DeviceTransferDetails(
model: model,
)));
},
);
}
),
}),
);
}
}

@ -2,6 +2,7 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/models/subtitle.dart';
class AAlertDialog extends StatelessWidget {
final String title;
final String content;
@ -12,12 +13,8 @@ class AAlertDialog extends StatelessWidget {
Widget build(BuildContext context) {
Subtitle _subtitle = AppLocalization.of(context).subtitle;
return CupertinoAlertDialog(
title: title != null
? Text(title)
: null,
content: content != null
? Text(content)
: null,
title: title != null ? Text(title) : null,
content: content != null ? Text(content) : null,
actions: <Widget>[
TextButton(
child: Text(_subtitle.confirm),

@ -8,6 +8,7 @@ import 'package:test_sa/models/device/device.dart';
import 'package:test_sa/views/app_style/colors.dart';
import 'package:test_sa/views/app_style/sizing.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
class AutoCompleteDeviceField extends StatefulWidget {
final Device initialValue;
final int hospitalId;
@ -20,7 +21,6 @@ class AutoCompleteDeviceField extends StatefulWidget {
}
class _AutoCompleteDeviceFieldState extends State<AutoCompleteDeviceField> {
SettingProvider _settingProvider;
DevicesProvider _devicesProvider;
UserProvider _userProvider;
@ -37,6 +37,7 @@ class _AutoCompleteDeviceFieldState extends State<AutoCompleteDeviceField> {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
_settingProvider = Provider.of<SettingProvider>(context);
@ -49,26 +50,15 @@ class _AutoCompleteDeviceFieldState extends State<AutoCompleteDeviceField> {
stateCode: _devicesProvider.stateCode,
onRefresh: () async {
_devicesProvider.reset();
await _devicesProvider.getEquipment(
host: _settingProvider.host,
user: _userProvider.user,
hospitalId: widget.hospitalId
);
await _devicesProvider.getEquipment(host: _settingProvider.host, user: _userProvider.user, hospitalId: widget.hospitalId);
},
child: Container(
padding: const EdgeInsets.symmetric(
horizontal: 16
),
padding: const EdgeInsets.symmetric(horizontal: 16),
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(color: AColors.black),
borderRadius: BorderRadius.circular(
AppStyle.borderRadius * AppStyle.getScaleFactor(context)
),
boxShadow: [
AppStyle.boxShadow
]
),
borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)),
boxShadow: [AppStyle.boxShadow]),
child: TypeAheadField<Device>(
textFieldConfiguration: TextFieldConfiguration(
style: Theme.of(context).textTheme.headline6,

@ -7,18 +7,22 @@ import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/views/app_style/colors.dart';
import 'package:test_sa/views/app_style/sizing.dart';
class AutoCompleteModelField extends StatefulWidget {
final Lookup initialValue;
final Function(Lookup) onPick;
const AutoCompleteModelField({Key key, this.initialValue, this.onPick,}) : super(key: key);
const AutoCompleteModelField({
Key key,
this.initialValue,
this.onPick,
}) : super(key: key);
@override
_AutoCompleteModelFieldState createState() => _AutoCompleteModelFieldState();
}
class _AutoCompleteModelFieldState extends State<AutoCompleteModelField> {
SettingProvider _settingProvider;
DevicesProvider _devicesProvider;
UserProvider _userProvider;
@ -35,6 +39,7 @@ class _AutoCompleteModelFieldState extends State<AutoCompleteModelField> {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
_settingProvider = Provider.of<SettingProvider>(context);
@ -42,25 +47,17 @@ class _AutoCompleteModelFieldState extends State<AutoCompleteModelField> {
_devicesProvider = Provider.of<DevicesProvider>(context);
//Subtitle _subtitle = AppLocalization.of(context).subtitle;
return Container(
padding: const EdgeInsets.symmetric(
horizontal: 16
),
padding: const EdgeInsets.symmetric(horizontal: 16),
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(color: AColors.black),
borderRadius: BorderRadius.circular(
AppStyle.borderRadius * AppStyle.getScaleFactor(context)
),
boxShadow: [
AppStyle.boxShadow
]
),
borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)),
boxShadow: [AppStyle.boxShadow]),
child: TypeAheadField<Lookup>(
textFieldConfiguration: TextFieldConfiguration(
style: Theme.of(context).textTheme.headline6,
controller: _controller,
textAlign: TextAlign.center,
decoration: const InputDecoration(
hintText: "Model",
border: InputBorder.none,

@ -4,6 +4,7 @@ import 'package:test_sa/models/device/device.dart';
import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/views/app_style/colors.dart';
import 'package:test_sa/views/app_style/sizing.dart';
class DeviceItem extends StatelessWidget {
final Device device;
final Function(Device) onPressed;
@ -18,36 +19,33 @@ class DeviceItem extends StatelessWidget {
style: ElevatedButton.styleFrom(
primary: AColors.primaryColor,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(
AppStyle.getBorderRadius(context)
),
borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)),
),
),
onPressed: () {
onPressed(device);
},
child: ListTile(
title: Text("${_subtitle.sn} : ${device.serialNumber}",
style: Theme.of(context).textTheme.headline6.copyWith(
color: AColors.white
),
title: Text(
"${_subtitle.sn} : ${device.serialNumber}",
style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white),
),
subtitle: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Divider(color: Theme.of(context).scaffoldBackgroundColor,),
Text("${_subtitle.brand} : ${device.modelDefinition.manufacturerName}",
style: Theme.of(context).textTheme.subtitle1.copyWith(
color: AColors.white
Divider(
color: Theme.of(context).scaffoldBackgroundColor,
),
Text(
"${_subtitle.brand} : ${device.modelDefinition.manufacturerName}",
style: Theme.of(context).textTheme.subtitle1.copyWith(color: AColors.white),
),
Divider(color: Theme.of(context).scaffoldBackgroundColor,),
Text("${_subtitle.model} : ${device.modelDefinition.modelName}",
style: Theme.of(context).textTheme.subtitle1.copyWith(
color: AColors.white
Divider(
color: Theme.of(context).scaffoldBackgroundColor,
),
Text(
"${_subtitle.model} : ${device.modelDefinition.modelName}",
style: Theme.of(context).textTheme.subtitle1.copyWith(color: AColors.white),
),
],
),

@ -14,6 +14,7 @@ import 'package:test_sa/views/widgets/loaders/no_item_found.dart';
import 'package:test_sa/views/widgets/qr/scan_qr.dart';
import '../app_text_form_field.dart';
class SingleDevicePicker extends StatefulWidget {
static final String id = "/single-device-Picker";
final bool sandraChoice = true;
@ -38,14 +39,8 @@ class _SingleDevicePickerState extends State<SingleDevicePicker> {
context: context,
builder: (dialogContext) {
return const Center(child: CircularProgressIndicator());
}
);
List<Device> devices = await _devicesProvider.getDevicesListBySN(
host: _settingProvider.host,
user: _userProvider.user,
hospitalId: _userProvider.user.hospital.id,
sn: result
);
});
List<Device> devices = await _devicesProvider.getDevicesListBySN(host: _settingProvider.host, user: _userProvider.user, hospitalId: _userProvider.user.hospital.id, sn: result);
Navigator.of(context).pop();
if (devices.isEmpty) {
Fluttertoast.showToast(msg: _subtitle.noDeviceFound);
@ -85,11 +80,7 @@ class _SingleDevicePickerState extends State<SingleDevicePicker> {
isFailedLoading: _devicesProvider.devices == null,
onRefresh: () async {
_devicesProvider.reset();
await _devicesProvider.getEquipment(
user: _userProvider.user,
host: _settingProvider.host,
hospitalId: _userProvider.user.hospital?.id
);
await _devicesProvider.getEquipment(user: _userProvider.user, host: _settingProvider.host, hospitalId: _userProvider.user.hospital?.id);
},
child: Column(
children: [
@ -107,17 +98,14 @@ class _SingleDevicePickerState extends State<SingleDevicePicker> {
onAction: () async {
_devicesProvider.reset();
await _devicesProvider.getEquipment(
user: _userProvider.user,
host: _settingProvider.host,
hospitalId: _userProvider.user.hospital?.id,
serialNumber: snController.text,
number: numberController.text
);
user: _userProvider.user, host: _settingProvider.host, hospitalId: _userProvider.user.hospital?.id, serialNumber: snController.text, number: numberController.text);
_searchableList.clear();
_searchableList.addAll(_devicesProvider.devices);
},
),
const SizedBox(height: 8,),
const SizedBox(
height: 8,
),
ATextFormField(
hintText: "Search by Number",
controller: numberController,
@ -127,12 +115,7 @@ class _SingleDevicePickerState extends State<SingleDevicePicker> {
onAction: () async {
_devicesProvider.reset();
await _devicesProvider.getEquipment(
user: _userProvider.user,
host: _settingProvider.host,
hospitalId: _userProvider.user.hospital?.id,
serialNumber: snController.text,
number: numberController.text
);
user: _userProvider.user, host: _settingProvider.host, hospitalId: _userProvider.user.hospital?.id, serialNumber: snController.text, number: numberController.text);
_searchableList.clear();
_searchableList.addAll(_devicesProvider.devices);
},
@ -141,18 +124,15 @@ class _SingleDevicePickerState extends State<SingleDevicePicker> {
),
),
Expanded(
child: _searchableList.isEmpty ?
NoItemFound(message: _subtitle.noDeviceFound,):
LazyLoading(
child: _searchableList.isEmpty
? NoItemFound(
message: _subtitle.noDeviceFound,
)
: LazyLoading(
nextPage: _devicesProvider.nextPage,
onLazyLoad: () async {
await _devicesProvider.getDevicesList(
user: _userProvider.user,
host: _settingProvider.host,
hospitalId: _userProvider.user.hospital?.id,
serialNumber: snController.text,
number: numberController.text
);
user: _userProvider.user, host: _settingProvider.host, hospitalId: _userProvider.user.hospital?.id, serialNumber: snController.text, number: numberController.text);
},
child: ListView.builder(
padding: EdgeInsets.zero,
@ -167,8 +147,7 @@ class _SingleDevicePickerState extends State<SingleDevicePicker> {
);
},
),
)
),
)),
],
),
),

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

Loading…
Cancel
Save