null safety conversion complete.

design_3.0_demo_module
Sikander Saleem 2 years ago
parent be4c8d7653
commit e6e35ab1d0

@ -1,3 +1,10 @@
plugins {
id "com.android.application"
id "kotlin-android"
id "dev.flutter.flutter-gradle-plugin"
id "com.google.gms.google-services"
}
def localProperties = new Properties() def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties') def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) { if (localPropertiesFile.exists()) {
@ -6,10 +13,10 @@ if (localPropertiesFile.exists()) {
} }
} }
def flutterRoot = localProperties.getProperty('flutter.sdk') //def flutterRoot = localProperties.getProperty('flutter.sdk')
if (flutterRoot == null) { //if (flutterRoot == null) {
throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") // throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
} //}
def flutterVersionCode = localProperties.getProperty('flutter.versionCode') def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) { if (flutterVersionCode == null) {
@ -21,10 +28,10 @@ if (flutterVersionName == null) {
flutterVersionName = '1.0' flutterVersionName = '1.0'
} }
apply plugin: 'com.android.application' //apply plugin: 'com.android.application'
apply plugin: 'kotlin-android' //apply plugin: 'kotlin-android'
apply plugin: 'com.google.gms.google-services' //apply plugin: 'com.google.gms.google-services'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" //apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
def keystoreProperties = new Properties() def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties') def keystorePropertiesFile = rootProject.file('key.properties')

@ -1,16 +1,16 @@
buildscript { //buildscript {
ext.kotlin_version = '1.8.20' // ext.kotlin_version = '1.8.20'
repositories { // repositories {
google() // google()
mavenCentral() // mavenCentral()
} // }
//
dependencies { // dependencies {
classpath 'com.android.tools.build:gradle:7.1.2' // classpath 'com.android.tools.build:gradle:7.1.2'
classpath 'com.google.gms:google-services:4.3.13' // classpath 'com.google.gms:google-services:4.3.13'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
} // }
} //}
allprojects { allprojects {
repositories { repositories {

@ -1,11 +1,39 @@
include ':app' //include ':app'
//
//def localPropertiesFile = new File(rootProject.projectDir, "local.properties")
//def properties = new Properties()
//
//assert localPropertiesFile.exists()
//localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }
//
//def flutterSdkPath = properties.getProperty("flutter.sdk")
//assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
//apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"
//
def localPropertiesFile = new File(rootProject.projectDir, "local.properties") pluginManagement {
def properties = new Properties() def flutterSdkPath = {
def properties = new Properties()
file("local.properties").withInputStream { properties.load(it) }
def flutterSdkPath = properties.getProperty("flutter.sdk")
assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
return flutterSdkPath
}()
assert localPropertiesFile.exists() includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }
def flutterSdkPath = properties.getProperty("flutter.sdk") repositories {
assert flutterSdkPath != null, "flutter.sdk not set in local.properties" google()
apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" mavenCentral()
gradlePluginPortal()
}
}
plugins {
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
id "com.android.application" version "7.1.2" apply false // Replace {agpVersion} with your version, e.g., "7.3.0"
id "org.jetbrains.kotlin.android" version "1.8.20" apply false // Replace {kotlinVersion} with your version, e.g., "1.7.10"
id "com.google.gms.google-services" version "4.3.13" apply false // Replace {kotlinVersion} with your version, e.g., "1.7.10"
}
include ":app"

@ -31,8 +31,8 @@ class ApiManager {
Future<http.Response> get(String url, {Map<String, String>? headers, bool enableToastMessage = true}) async { Future<http.Response> get(String url, {Map<String, String>? headers, bool enableToastMessage = true}) async {
headers ??= {}; headers ??= {};
headers.addAll(_headers); headers.addAll(_headers);
Uri _url = Uri.parse(url); Uri url0 = Uri.parse(url);
http.Response response = await http.get(_url, headers: headers); http.Response response = await http.get(url0, headers: headers);
try { try {
if (response.statusCode == 401) { if (response.statusCode == 401) {
@ -55,19 +55,19 @@ class ApiManager {
headers.addAll(_headers); headers.addAll(_headers);
Uri _url = Uri.parse(url); Uri url0 = Uri.parse(url);
if (!kReleaseMode) { if (!kReleaseMode) {
print("URL:$_url"); print("URL:$url0");
print("Headers:$headers"); print("Headers:$headers");
print("Body:$body"); print("Body:$body");
} }
var request = http.Request('POST', _url); var request = http.Request('POST', url0);
request.body = json.encode(body); request.body = json.encode(body);
request.headers.addAll(headers); request.headers.addAll(headers);
http.StreamedResponse _streamedResponse = await request.send(); http.StreamedResponse streamedResponse = await request.send();
http.Response response = await http.Response.fromStream(_streamedResponse); http.Response response = await http.Response.fromStream(streamedResponse);
try { try {
if (response.statusCode == 401) { if (response.statusCode == 401) {
showLoginDialog(); showLoginDialog();
@ -89,11 +89,11 @@ class ApiManager {
headers.addAll(_headers); headers.addAll(_headers);
Uri _url = Uri.parse(url); Uri url0 = Uri.parse(url);
print(_url); print(url0);
// print(headers); // print(headers);
// log(json.encode(body)); // log(json.encode(body));
var request = http.Request('PUT', _url); var request = http.Request('PUT', url0);
request.body = json.encode(body); request.body = json.encode(body);
request.headers.addAll(headers); request.headers.addAll(headers);
@ -115,21 +115,21 @@ class ApiManager {
} }
Future<http.Response> multiPart(String url, {Map<String, String>? headers, required Map<String, String> body, required List<Future<MultipartFile>> files}) async { Future<http.Response> multiPart(String url, {Map<String, String>? headers, required Map<String, String> body, required List<Future<MultipartFile>> files}) async {
Map<String, String> _headers = const { Map<String, String> headers0 = const {
'Content-Type': 'multipart/form-data', 'Content-Type': 'multipart/form-data',
}; };
headers ??= {}; headers ??= {};
headers.addAll(_headers); headers.addAll(headers0);
Uri _url = Uri.parse(url); Uri url0 = Uri.parse(url);
// print(_url); // print(_url);
// print(_headers); // print(_headers);
// print(json.encode(body)); // print(json.encode(body));
var request = http.MultipartRequest('POST', _url); var request = http.MultipartRequest('POST', url0);
request.fields.addAll(body); request.fields.addAll(body);
request.headers.addAll(_headers); request.headers.addAll(headers0);
for (var element in files) { for (var element in files) {
request.files.add(await element); request.files.add(await element);
@ -160,12 +160,12 @@ class ApiManager {
barrierDismissible: false, barrierDismissible: false,
builder: (_) => Platform.isIOS builder: (_) => Platform.isIOS
? CupertinoAlertDialog( ? CupertinoAlertDialog(
title: Text('Session Expired'), title: const Text('Session Expired'),
content: Text('Login session is expired,\nPlease login.'), content: const Text('Login session is expired,\nPlease login.'),
//actionsAlignment: MainAxisAlignment.center, //actionsAlignment: MainAxisAlignment.center,
actions: [ actions: [
CupertinoButton( CupertinoButton(
child: Text("Login"), child: const Text("Login"),
onPressed: () { onPressed: () {
logout(navigatorKey.currentContext); logout(navigatorKey.currentContext);
}, },
@ -173,13 +173,13 @@ class ApiManager {
], ],
) )
: AlertDialog( : AlertDialog(
title: Text('Session Expired'), title: const Text('Session Expired'),
content: Text('Login session is expired,\nPlease login.'), content: const Text('Login session is expired,\nPlease login.'),
actionsAlignment: MainAxisAlignment.center, actionsAlignment: MainAxisAlignment.center,
contentPadding: EdgeInsets.only(left: 24.0, top: 20.0, right: 24.0, bottom: 16.0), contentPadding: const EdgeInsets.only(left: 24.0, top: 20.0, right: 24.0, bottom: 16.0),
actions: [ actions: [
FilledButton( FilledButton(
child: Text("Login"), child: const Text("Login"),
onPressed: () { onPressed: () {
logout(navigatorKey.currentContext); logout(navigatorKey.currentContext);
}, },

@ -1,5 +1,4 @@
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:meta/meta.dart';
class HttpStatusManger { class HttpStatusManger {
static String getStatusMessage({ static String getStatusMessage({
@ -8,12 +7,14 @@ class HttpStatusManger {
String? messageFor400, String? messageFor400,
String? messageFor200, String? messageFor200,
}) { }) {
if (status == null) if (status == null) {
// no status code - code error no need for subtitle // no status code - code error no need for subtitle
return "careful null status"; return "careful null status";
if (status == -1) }
if (status == -1) {
// client's request in process // client's request in process
return subtitle.serverErrorMessage; return subtitle.serverErrorMessage;
}
if (status == -2) { if (status == -2) {
// client's request in process // client's request in process
return subtitle.requestLockMessage; return subtitle.requestLockMessage;

@ -5,7 +5,7 @@ class URLs {
static const host1 = "https://atomsmdev.hmg.com"; // local UAT url static const host1 = "https://atomsmdev.hmg.com"; // local UAT url
// static String _baseUrl = "$_host/mobile"; // static String _baseUrl = "$_host/mobile";
static String _baseUrl = "$_host/v2/mobile"; // new V2 apis static final String _baseUrl = "$_host/v2/mobile"; // new V2 apis
static String _host = host1; static String _host = host1;

@ -90,7 +90,7 @@ class FirebaseNotificationManger {
FirebaseMessaging.instance.getInitialMessage().then((initialMessage) { FirebaseMessaging.instance.getInitialMessage().then((initialMessage) {
if (initialMessage != null) { if (initialMessage != null) {
handleMessage(context, initialMessage!.data); handleMessage(context, initialMessage.data);
} }
}); });

@ -29,7 +29,7 @@ class NotificationManger {
await localNotificationsPlugin.resolvePlatformSpecificImplementation<IOSFlutterLocalNotificationsPlugin>()?.requestPermissions(alert: true, badge: true, sound: true); await localNotificationsPlugin.resolvePlatformSpecificImplementation<IOSFlutterLocalNotificationsPlugin>()?.requestPermissions(alert: true, badge: true, sound: true);
} else if (Platform.isAndroid) { } else if (Platform.isAndroid) {
final AndroidFlutterLocalNotificationsPlugin? androidImplementation = localNotificationsPlugin.resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>(); final AndroidFlutterLocalNotificationsPlugin? androidImplementation = localNotificationsPlugin.resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>();
final bool granted = await androidImplementation?.requestPermission() ?? false; final bool granted = await androidImplementation?.requestNotificationsPermission() ?? false;
if (!granted) { if (!granted) {
if (kDebugMode) { if (kDebugMode) {
print("-------------------- Permission Granted ------------------------"); print("-------------------- Permission Granted ------------------------");

@ -181,7 +181,6 @@ class AllRequestsProvider extends ChangeNotifier {
if (isCalendarLoading == true) return -2; if (isCalendarLoading == true) return -2;
isCalendarLoading = true; isCalendarLoading = true;
notifyListeners(); notifyListeners();
if (isCalendarLoading == null) notifyListeners();
Response response; Response response;
try { try {
Map<String, dynamic> body = { Map<String, dynamic> body = {

@ -127,7 +127,7 @@ class AssetTransferProvider extends ChangeNotifier {
}) async { }) async {
Response response; Response response;
try { try {
showDialog(context: context, barrierDismissible: false, builder: (context) => AppLazyLoading()); showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
response = await ApiManager.instance.post(URLs.requestDeviceTransfer, body: assetDestination.transferBody(asset: asset)); response = await ApiManager.instance.post(URLs.requestDeviceTransfer, body: assetDestination.transferBody(asset: asset));
stateCode = response.statusCode; stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
@ -151,7 +151,7 @@ class AssetTransferProvider extends ChangeNotifier {
Future<int> updateRequest(BuildContext context, {required AssetTransfer assetTransfer, required bool isSender}) async { Future<int> updateRequest(BuildContext context, {required AssetTransfer assetTransfer, required bool isSender}) async {
Response response; Response response;
try { try {
showDialog(context: context, barrierDismissible: false, builder: (context) => AppLazyLoading()); showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
response = await ApiManager.instance.put(URLs.updateDeviceTransfer, body: assetTransfer.toJson()); response = await ApiManager.instance.put(URLs.updateDeviceTransfer, body: assetTransfer.toJson());
//print(response.body); //print(response.body);

@ -85,7 +85,7 @@ class CommentsProvider extends ChangeNotifier {
late Response response; late Response response;
try { try {
comment.id = 0; comment.id = 0;
showDialog(context: context, barrierDismissible: false, builder: (context) => AppLazyLoading()); showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
response = await ApiManager.instance.post(URLs.addComment, body: comment.toJson()); response = await ApiManager.instance.post(URLs.addComment, body: comment.toJson());
stateCode = response.statusCode; stateCode = response.statusCode;

@ -81,10 +81,10 @@ class AssetProvider extends ChangeNotifier {
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received // client's request was successfully received
List equipmentListJson = json.decode(response.body)["data"]; List equipmentListJson = json.decode(response.body)["data"];
var dList = equipmentListJson?.map<Asset>((asset) => Asset.fromJson(asset))?.toList() ?? []; var dList = equipmentListJson.map<Asset>((asset) => Asset.fromJson(asset)).toList() ?? [];
try { try {
if (isQr) { if (isQr) {
dList = dList.where((element) => search?.assetNo?.toLowerCase() == element?.assetNumber?.toLowerCase())?.toList() ?? []; dList = dList.where((element) => search?.assetNo?.toLowerCase() == element.assetNumber?.toLowerCase()).toList() ?? [];
} }
} catch (e) { } catch (e) {
print(e); print(e);

@ -86,7 +86,7 @@ class GasRefillCommentsProvider extends ChangeNotifier {
isLoading = true; isLoading = true;
late Response response; late Response response;
try { try {
showDialog(context: context, barrierDismissible: false, builder: (context) => AppLazyLoading()); showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
response = await ApiManager.instance.post(URLs.addGazRefillComment, body: {"id": 0, "gasRefillId": id, "comment": comment}); response = await ApiManager.instance.post(URLs.addGazRefillComment, body: {"id": 0, "gasRefillId": id, "comment": comment});
stateCode = response.statusCode; stateCode = response.statusCode;

@ -111,12 +111,12 @@ class GasRefillProvider extends ChangeNotifier {
}) async { }) async {
late Response response; late Response response;
try { try {
showDialog(context: context, barrierDismissible: false, builder: (context) => AppLazyLoading()); showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
final Map<String, dynamic> body = { final Map<String, dynamic> body = {
"uid": user.id.toString(), "uid": user.id.toString(),
"token": user.token ?? "", "token": user.token ?? "",
}; };
if (model != null) body.addAll(model.toJson()); body.addAll(model.toJson());
response = await ApiManager.instance.post(URLs.requestGasRefill, body: body); response = await ApiManager.instance.post(URLs.requestGasRefill, body: body);
stateCode = response.statusCode; stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {

@ -68,11 +68,11 @@ class HospitalsProvider extends ChangeNotifier {
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received // client's request was successfully received
List categoriesListJson = json.decode(response.body)["data"]; List categoriesListJson = json.decode(response.body)["data"];
List<Hospital> _page = categoriesListJson.map((category) => Hospital.fromJson(category)).toList(); List<Hospital> page = categoriesListJson.map((category) => Hospital.fromJson(category)).toList();
if (hospitals == null) _hospitals = []; if (hospitals == null) _hospitals = [];
_hospitals!.addAll(_page); _hospitals!.addAll(page);
if (_page.length >= pageItemNumber) { if (page.length >= pageItemNumber) {
_nextPage = true; _nextPage = true;
} else { } else {
_nextPage = false; _nextPage = false;
@ -105,13 +105,13 @@ class HospitalsProvider extends ChangeNotifier {
// ); // );
_stateCode = response.statusCode; _stateCode = response.statusCode;
List<Hospital> _page = []; List<Hospital> page = [];
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received // client's request was successfully received
List categoriesListJson = json.decode(response.body)["data"]; List categoriesListJson = json.decode(response.body)["data"];
_page = categoriesListJson.map((category) => Hospital.fromJson(category)).toList(); page = categoriesListJson.map((category) => Hospital.fromJson(category)).toList();
} }
return _page; return page;
} catch (error) { } catch (error) {
_loading = false; _loading = false;
_stateCode = -1; _stateCode = -1;
@ -136,13 +136,13 @@ class HospitalsProvider extends ChangeNotifier {
// ); // );
_stateCode = response.statusCode; _stateCode = response.statusCode;
List<Hospital> _page = []; List<Hospital> page = [];
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received // client's request was successfully received
List categoriesListJson = json.decode(response.body)["data"]; List categoriesListJson = json.decode(response.body)["data"];
_page = categoriesListJson.map((category) => Hospital.fromJson(category)).toList(); page = categoriesListJson.map((category) => Hospital.fromJson(category)).toList();
} }
return _page; return page;
} catch (error) { } catch (error) {
_loading = false; _loading = false;
_stateCode = -1; _stateCode = -1;

@ -52,15 +52,15 @@ class NotificationsProvider extends ChangeNotifier {
response = await ApiManager.instance.post(URLs.getSystemNotifications, body: body); response = await ApiManager.instance.post(URLs.getSystemNotifications, body: body);
stateCode = response.statusCode; stateCode = response.statusCode;
print('notifaction response is ${response}'); print('notifaction response is $response');
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received // client's request was successfully received
List requestsListJson = json.decode(response.body)["data"]; List requestsListJson = json.decode(response.body)["data"];
List<SystemNotificationModel> _serviceRequestsPage = requestsListJson.map((request) => SystemNotificationModel.fromJson(request)).toList(); List<SystemNotificationModel> serviceRequestsPage = requestsListJson.map((request) => SystemNotificationModel.fromJson(request)).toList();
if (notifications == null) notifications = []; notifications ??= [];
notifications.addAll(_serviceRequestsPage); notifications.addAll(serviceRequestsPage);
// Update nextPage based on response length // Update nextPage based on response length
nextPage = _serviceRequestsPage.length == pageItemNumber; nextPage = serviceRequestsPage.length == pageItemNumber;
} }
isLoading = false; isLoading = false;
notifyListeners(); notifyListeners();
@ -87,14 +87,14 @@ class NotificationsProvider extends ChangeNotifier {
//userId = 397.toString(); // testing id to view data //userId = 397.toString(); // testing id to view data
try { try {
response = await get(Uri.parse(host + URLs.getSystemNotifications + "?uid=${user.id}&token=${user.token}"), headers: {"Content-Type": "application/json; charset=utf-8"}); response = await get(Uri.parse("${host + URLs.getSystemNotifications}?uid=${user.id}&token=${user.token}"), headers: {"Content-Type": "application/json; charset=utf-8"});
stateCode = response.statusCode; stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received // client's request was successfully received
List requestsListJson = json.decode(utf8.decode(response.bodyBytes)); List requestsListJson = json.decode(utf8.decode(response.bodyBytes));
List<SystemNotificationModel> _recentNotifications = requestsListJson.map((request) => SystemNotificationModel.fromJson(request)).toList(); List<SystemNotificationModel> recentNotifications = requestsListJson.map((request) => SystemNotificationModel.fromJson(request)).toList();
return _recentNotifications; return recentNotifications;
} }
return null; return null;
} catch (error) { } catch (error) {

@ -63,10 +63,10 @@ class PartsProvider extends ChangeNotifier {
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received // client's request was successfully received
List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); List categoriesListJson = json.decode(utf8.decode(response.bodyBytes));
List<SparePart> _page = categoriesListJson.map((part) => SparePart.fromJson(part)).toList(); List<SparePart> page = categoriesListJson.map((part) => SparePart.fromJson(part)).toList();
_parts ??= []; _parts ??= [];
_parts!.addAll(_page.map((e) => SparePartsWorkOrders(sparePart: e)).toList()); _parts!.addAll(page.map((e) => SparePartsWorkOrders(sparePart: e)).toList());
_nextPage = _page.length >= pageItemNumber; _nextPage = page.length >= pageItemNumber;
} }
_loading = false; _loading = false;
notifyListeners(); notifyListeners();

@ -179,7 +179,7 @@ class PpmProvider extends ChangeNotifier {
workingHours: ((ppm.tbsTimer?.durationInSecond ?? 0) / 60 / 60), workingHours: ((ppm.tbsTimer?.durationInSecond ?? 0) / 60 / 60),
), ),
); );
showDialog(context: context, barrierDismissible: false, builder: (context) => AppLazyLoading()); showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
late Response response; // Using 'late' for initialization later late Response response; // Using 'late' for initialization later
Map<String, dynamic> body = ppm.copyWith(assignedEmployeeId: user.userName, tbsTimer: ppm.tbsTimer).toJson(); Map<String, dynamic> body = ppm.copyWith(assignedEmployeeId: user.userName, tbsTimer: ppm.tbsTimer).toJson();
response = await ApiManager.instance.put(URLs.updatePentry, body: body); response = await ApiManager.instance.put(URLs.updatePentry, body: body);

@ -269,7 +269,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
Future<PendingAssetServiceRequest?> checkAssetPendingRequest(int assetId) async { Future<PendingAssetServiceRequest?> checkAssetPendingRequest(int assetId) async {
Response response; Response response;
try { try {
response = await await ApiManager.instance.get(URLs.CheckIfAssetHasAnotherServiceRequest + "?assetId=$assetId"); response = await ApiManager.instance.get(URLs.CheckIfAssetHasAnotherServiceRequest + "?assetId=$assetId");
stateCode = response.statusCode; stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {} if (response.statusCode >= 200 && response.statusCode < 300) {}
return PendingAssetServiceRequest.fromJson(json.decode(response.body)["data"]); return PendingAssetServiceRequest.fromJson(json.decode(response.body)["data"]);
@ -304,7 +304,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
"requestedThrough": request.requestedThrough?.toJson(), "requestedThrough": request.requestedThrough?.toJson(),
"voiceNote": request.audio, "voiceNote": request.audio,
"assets": request.deviceId == null ? [] : [request.deviceId], "assets": request.deviceId == null ? [] : [request.deviceId],
"attachmentsCallRequest": (request.devicePhotos?.isNotEmpty ?? false) ? request.devicePhotos?.map((e) => {"name": e.getFileName})?.toList() : [], "attachmentsCallRequest": (request.devicePhotos?.isNotEmpty ?? false) ? request.devicePhotos?.map((e) => {"name": e.getFileName}).toList() : [],
"assignedEmployee": { "assignedEmployee": {
"id": request.engineerId, "id": request.engineerId,
"name": request.engineerName, "name": request.engineerName,
@ -368,7 +368,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
try { try {
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
final body = report.toJson(); final body = report.toJson();
final callRequest = CallRequest(id: num.tryParse(request?.id ?? "")).toJson(); final callRequest = CallRequest(id: num.tryParse(request.id ?? "")).toJson();
final contactPerson = [ final contactPerson = [
{ {
"id": 0, "id": 0,
@ -448,7 +448,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
try { try {
var body = { var body = {
"pageSize": pageItemNumber, "pageSize": pageItemNumber,
"pageNumber": ((workOrders?.length ?? 0) ~/ pageItemNumber) + 1, "pageNumber": ((workOrders.length ?? 0) ~/ pageItemNumber) + 1,
"callId": callId, "callId": callId,
}; };
response = await ApiManager.instance.post(URLs.searchWorkOrders, body: body); response = await ApiManager.instance.post(URLs.searchWorkOrders, body: body);
@ -528,7 +528,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
Fluttertoast.showToast(msg: context.translation.successfulRequestMessage); Fluttertoast.showToast(msg: context.translation.successfulRequestMessage);
Navigator.of(context).pop(); Navigator.of(context).pop();
} else { } else {
Fluttertoast.showToast(msg: "${context.translation.failedToCompleteRequest}"); Fluttertoast.showToast(msg: context.translation.failedToCompleteRequest);
} }
Navigator.of(context).pop(); Navigator.of(context).pop();
return response.statusCode; return response.statusCode;
@ -662,17 +662,17 @@ class ServiceRequestsProvider extends ChangeNotifier {
try { try {
var body = { var body = {
"pageSize": pageItemNumber, "pageSize": pageItemNumber,
"pageNumber": ((workOrders?.length ?? 0) ~/ pageItemNumber) + 1, "pageNumber": ((workOrders.length ?? 0) ~/ pageItemNumber) + 1,
if (callerId?.isNotEmpty ?? false) "callId": callerId, if (callerId.isNotEmpty ?? false) "callId": callerId,
if (search.assetType != null) "assetSerialNo": search.assetType?.name, if (search.assetType != null) "assetSerialNo": search.assetType?.name,
if (search.workOrderNo != null) "workOrderNo": search.workOrderNo, if (search.workOrderNo != null) "workOrderNo": search.workOrderNo,
if (search.id != null) "workOrderNo": search.id.toString(), if (search.id != null) "workOrderNo": search.id.toString(),
if (search.calllastSituation != null) "callslastSituationWO": search.calllastSituation!.toJson(), if (search.calllastSituation != null) "callslastSituationWO": search.calllastSituation!.toJson(),
if (search.assignedEmployee != null) "assignedEmployees": [search.assignedEmployee!.id], if (search.assignedEmployee != null) "assignedEmployees": [search.assignedEmployee!.id],
// "statusWO": [], // "statusWO": [],
if (site?.isNotEmpty ?? false) "site": site, if (site.isNotEmpty ?? false) "site": site,
if (search.visitDate != null && dateOperator != null) "visitDateSymbol": dateOperator?.toJson(), if (search.visitDate != null) "visitDateSymbol": dateOperator.toJson(),
if (search.visitDate != null && dateOperator != null) "visitDateFrom": search.visitDate, if (search.visitDate != null) "visitDateFrom": search.visitDate,
}; };
print(body); print(body);
response = await ApiManager.instance.post(URLs.searchWorkOrders, body: body); response = await ApiManager.instance.post(URLs.searchWorkOrders, body: body);

@ -1,7 +1,7 @@
import 'dart:convert'; import 'dart:convert';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:http/http.dart';import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/employee.dart'; import 'package:test_sa/models/employee.dart';

@ -58,7 +58,7 @@ class ServiceRequestFaultDescriptionProvider extends ChangeNotifier {
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received // client's request was successfully received
List listJson = json.decode(response.body)["data"]['asset']['modelDefinition']['modelDefRelatedDefects']; List listJson = json.decode(response.body)["data"]['asset']['modelDefinition']['modelDefRelatedDefects'];
_items = listJson?.map((type) => FaultDescription.fromJson(type))?.toList() ?? []; _items = listJson.map((type) => FaultDescription.fromJson(type)).toList() ?? [];
} }
_loading = false; _loading = false;
notifyListeners(); notifyListeners();

@ -6,7 +6,6 @@ import 'package:http/http.dart';
import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/user.dart';
class ServiceReportRepairLocationProvider extends ChangeNotifier { class ServiceReportRepairLocationProvider extends ChangeNotifier {
//reset provider data //reset provider data

@ -54,7 +54,7 @@ class UserProvider extends ChangeNotifier {
notifyListeners(); notifyListeners();
Response response; Response response;
try { try {
showDialog(context: context, barrierDismissible: false, builder: (context) => AppLazyLoading()); showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
response = await ApiManager.instance.post(URLs.login, body: await user.toLoginJson()); response = await ApiManager.instance.post(URLs.login, body: await user.toLoginJson());
_loading = false; _loading = false;
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {

@ -1,12 +1,12 @@
class ASettings { class ASettings {
static final String user = "user"; static const String user = "user";
static final String assetGroup = "asset_group"; static const String assetGroup = "asset_group";
static final String host = "host"; static const String host = "host";
static final String language = "language"; static const String language = "language";
static final String theme = "theme"; static const String theme = "theme";
static final String localAuth = "local_auth"; static const String localAuth = "local_auth";
static final String speechToText = "speech_to_text"; static const String speechToText = "speech_to_text";
static final String rememberMe = "remember_me"; static const String rememberMe = "remember_me";
static final String userName = "username"; static const String userName = "username";
static final String password = "password"; static const String password = "password";
} }

@ -2,7 +2,6 @@ import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:http/http.dart';
import 'package:local_auth/local_auth.dart'; import 'package:local_auth/local_auth.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart';

@ -10,18 +10,18 @@ class Validator {
// Return true if email is valid. Otherwise, return false // Return true if email is valid. Otherwise, return false
static bool isEmail(String email) { static bool isEmail(String email) {
RegExp exp = new RegExp(r"^[a-zA-Z0-9.a-zA-Z0-9.!#$%&'*+-/=?^_`{|}~]+@[a-zA-Z0-9]+\.[a-zA-Z]+"); RegExp exp = 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; return false;
} }
// Return true if phone number is valid. Otherwise, return false // Return true if phone number is valid. Otherwise, return false
static bool isPhoneNumber(String phoneNumber) { static bool isPhoneNumber(String phoneNumber) {
if (phoneNumber == null || phoneNumber.isEmpty) { if (phoneNumber.isEmpty) {
return false; return false;
} }
final pattern = r'^[+]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\s\./0-9]*$'; const pattern = r'^[+]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\s\./0-9]*$';
final regExp = RegExp(pattern); final regExp = RegExp(pattern);
if (regExp.hasMatch(phoneNumber)) return true; if (regExp.hasMatch(phoneNumber)) return true;
@ -30,24 +30,17 @@ class Validator {
// Return true if password is valid. Otherwise, return false // Return true if password is valid. Otherwise, return false
static bool isValidPassword(String password) { static bool isValidPassword(String password) {
if (password == null) return false;
if (password.length < 6) return false; if (password.length < 6) return false;
return true; return true;
} }
// Return true if String is valid Numeric. Otherwise, return false // Return true if String is valid Numeric. Otherwise, return false
static bool isNumeric(String s) { static bool isNumeric(String s) {
if (s == null) {
return false;
}
return double.tryParse(s) != null; return double.tryParse(s) != null;
} }
// Return true if String is valid Numeric. Otherwise, return false // Return true if String is valid Numeric. Otherwise, return false
static bool isInt(String value) { static bool isInt(String value) {
if (value == null) {
return false;
}
return int.tryParse(value) != null; return int.tryParse(value) != null;
} }
} }

@ -29,7 +29,7 @@ class DashboardView extends StatefulWidget {
} }
class _DashboardViewState extends State<DashboardView> { class _DashboardViewState extends State<DashboardView> {
int _currentPage = 0; final int _currentPage = 0;
bool isFCM = true; bool isFCM = true;
late User user; late User user;
@ -87,7 +87,7 @@ class _DashboardViewState extends State<DashboardView> {
void handleScroll() async { void handleScroll() async {
_scrollController = ScrollController(); _scrollController = ScrollController();
_scrollController.addListener(() async { _scrollController.addListener(() async {
if (_scrollController?.position?.pixels == _scrollController?.position?.maxScrollExtent && !allRequestsProvider.isFilterRequestLoading) { if (_scrollController.position.pixels == _scrollController.position.maxScrollExtent && !allRequestsProvider.isFilterRequestLoading) {
allRequestsProvider.pageNum = allRequestsProvider.pageNum + 1; allRequestsProvider.pageNum = allRequestsProvider.pageNum + 1;
await allRequestsProvider.getFilterRequests(showLoader: false, status: allRequestsProvider.status); await allRequestsProvider.getFilterRequests(showLoader: false, status: allRequestsProvider.status);
} }
@ -118,7 +118,7 @@ class _DashboardViewState extends State<DashboardView> {
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [14.height, ProgressFragment(), 25.height, SizedBox(height: 110.toScreenHeight, child: RequestsFragment()), 16.height, RequestCategoryFragment()], children: [14.height, ProgressFragment(), 25.height, SizedBox(height: 110.toScreenHeight, child: const RequestsFragment()), 16.height, const RequestCategoryFragment()],
).paddingOnly(start: 16, end: 16, top: 0, bottom: 8), ).paddingOnly(start: 16, end: 16, top: 0, bottom: 8),
), ),
), ),

@ -52,7 +52,7 @@ class AppBarWidget extends StatelessWidget {
style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50, fontWeight: FontWeight.w600), style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50, fontWeight: FontWeight.w600),
), ),
Text( Text(
snapshot.user?.type?.name?.toCamelCase ?? "", // Simplified null check snapshot.user?.type?.name.toCamelCase ?? "", // Simplified null check
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
), ),
], ],
@ -99,11 +99,11 @@ class AppBarWidget extends StatelessWidget {
return DropdownMenuItem<AssetGroup?>( return DropdownMenuItem<AssetGroup?>(
value: value, value: value,
child: Text( child: Text(
value?.name ?? "", value.name ?? "",
style: Theme.of(context).textTheme.bodyLarge, style: Theme.of(context).textTheme.bodyLarge,
), ),
); );
})?.toList() ?? }).toList() ??
[], // Added null check and empty list default [], // Added null check and empty list default
), ),
); );

@ -40,8 +40,8 @@ extension StringExtensions on String {
String get getFileName { String get getFileName {
try { try {
if (this.contains("fileName=")) { if (contains("fileName=")) {
String sub = this.substring(this.indexOf("fileName="), this.length); String sub = substring(indexOf("fileName="), length);
sub = sub.replaceAll("fileName=", ""); sub = sub.replaceAll("fileName=", "");
return sub; return sub;
} else { } else {

@ -154,7 +154,7 @@ extension CapExtension on String {
String get capitalizeFirstOfEach => trim().isNotEmpty String get capitalizeFirstOfEach => trim().isNotEmpty
? trim().toLowerCase().split(" ").map((str) { ? trim().toLowerCase().split(" ").map((str) {
return str.trim()?.inCaps ?? ""; return str.trim().inCaps ?? "";
}).join(" ") }).join(" ")
: ""; : "";
} }

@ -6,7 +6,7 @@ import 'package:test_sa/extensions/int_extensions.dart';
import '../new_views/app_style/app_color.dart'; import '../new_views/app_style/app_color.dart';
extension WidgetExtensions on Widget { extension WidgetExtensions on Widget {
Widget onPress(VoidCallback? onTap) => InkWell(onTap: onTap, child: this, highlightColor: Colors.transparent, splashColor: Colors.transparent); Widget onPress(VoidCallback? onTap) => InkWell(onTap: onTap, highlightColor: Colors.transparent, splashColor: Colors.transparent, child: this);
Widget get expanded => Expanded(child: this); Widget get expanded => Expanded(child: this);

@ -17,32 +17,12 @@ import 'package:test_sa/controllers/providers/api/notifications_provider.dart';
import 'package:test_sa/controllers/providers/api/parts_provider.dart'; import 'package:test_sa/controllers/providers/api/parts_provider.dart';
import 'package:test_sa/controllers/providers/api/ppm_provider.dart'; import 'package:test_sa/controllers/providers/api/ppm_provider.dart';
import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/employee/assigned_to_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/employee/engineers_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/employee/nurse_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/employee/nurse_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_type_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_assistants_employee_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_assistants_employee_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_equipment_status_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_fault_description_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_fault_description_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_maintenance_situation_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_repair_location_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_repair_location_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_status_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_types_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_users_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_visit_date_operator_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_types_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_types_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_first_action_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_status_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_through_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_type_provider.dart';
import 'package:test_sa/new_views/app_style/app_themes.dart'; import 'package:test_sa/new_views/app_style/app_themes.dart';
import 'package:test_sa/new_views/pages/help_center_page.dart'; import 'package:test_sa/new_views/pages/help_center_page.dart';
import 'package:test_sa/new_views/pages/land_page/land_page.dart'; import 'package:test_sa/new_views/pages/land_page/land_page.dart';
@ -69,10 +49,8 @@ import 'package:test_sa/providers/service_request_providers/commissioning_status
import 'package:test_sa/providers/service_request_providers/equipment_status_provider.dart'; import 'package:test_sa/providers/service_request_providers/equipment_status_provider.dart';
import 'package:test_sa/providers/service_request_providers/first_action_provider.dart'; import 'package:test_sa/providers/service_request_providers/first_action_provider.dart';
import 'package:test_sa/providers/service_request_providers/priority_provider.dart'; import 'package:test_sa/providers/service_request_providers/priority_provider.dart';
import 'package:test_sa/providers/service_request_providers/request_status_provider.dart';
import 'package:test_sa/providers/service_request_providers/requested_through_provider.dart'; import 'package:test_sa/providers/service_request_providers/requested_through_provider.dart';
import 'package:test_sa/providers/service_request_providers/type_of_request_provider.dart'; import 'package:test_sa/providers/service_request_providers/type_of_request_provider.dart';
import 'package:test_sa/providers/work_order/asset_types_provider.dart';
import 'package:test_sa/providers/work_order/reason_provider.dart'; import 'package:test_sa/providers/work_order/reason_provider.dart';
import 'package:test_sa/providers/work_order/service_type_provider.dart'; import 'package:test_sa/providers/work_order/service_type_provider.dart';
import 'package:test_sa/providers/work_order/supplier_engineer_provider.dart'; import 'package:test_sa/providers/work_order/supplier_engineer_provider.dart';
@ -82,16 +60,12 @@ import 'package:test_sa/views/pages/device_transfer/asset_search_screen.dart';
import 'package:test_sa/views/pages/device_transfer/request_device_transfer.dart'; import 'package:test_sa/views/pages/device_transfer/request_device_transfer.dart';
import 'package:test_sa/views/pages/device_transfer/track_device_transfer.dart'; import 'package:test_sa/views/pages/device_transfer/track_device_transfer.dart';
import 'package:test_sa/views/pages/sub_workorder/create_sub_workorder_page.dart'; import 'package:test_sa/views/pages/sub_workorder/create_sub_workorder_page.dart';
import 'package:test_sa/views/pages/sub_workorder/search_sub_workorder_page.dart';
import 'package:test_sa/views/pages/user/gas_refill/request_gas_refill.dart'; import 'package:test_sa/views/pages/user/gas_refill/request_gas_refill.dart';
import 'package:test_sa/views/pages/user/gas_refill/track_gas_refill.dart'; import 'package:test_sa/views/pages/user/gas_refill/track_gas_refill.dart';
import 'package:test_sa/views/pages/user/land_page.dart' as old;
import 'package:test_sa/views/pages/user/notifications/notifications_page.dart'; import 'package:test_sa/views/pages/user/notifications/notifications_page.dart';
import 'package:test_sa/views/pages/user/ppm/ppm_page.dart'; import 'package:test_sa/views/pages/user/ppm/ppm_page.dart';
import 'package:test_sa/views/pages/user/profile_page.dart'; import 'package:test_sa/views/pages/user/profile_page.dart';
import 'package:test_sa/views/pages/user/report_issues_page.dart';
import 'package:test_sa/views/pages/user/requests/create_service_request_page.dart'; import 'package:test_sa/views/pages/user/requests/create_service_request_page.dart';
import 'package:test_sa/views/pages/user/requests/future_request_service_details.dart';
import 'package:test_sa/views/pages/user/requests/requests_page.dart'; import 'package:test_sa/views/pages/user/requests/requests_page.dart';
import 'package:test_sa/views/pages/user/requests/update_service_request_page.dart'; import 'package:test_sa/views/pages/user/requests/update_service_request_page.dart';
import 'package:test_sa/views/pages/user/requests/work_order/work_order_details_page.dart'; import 'package:test_sa/views/pages/user/requests/work_order/work_order_details_page.dart';
@ -99,7 +73,6 @@ import 'package:test_sa/views/pages/user/requests/work_order/work_orders_list_pa
import 'package:test_sa/views/widgets/departments/single_department_picker.dart'; import 'package:test_sa/views/widgets/departments/single_department_picker.dart';
import 'package:test_sa/views/widgets/equipment/asset_detail_page.dart'; import 'package:test_sa/views/widgets/equipment/asset_detail_page.dart';
import 'package:test_sa/views/widgets/equipment/single_device_picker.dart'; import 'package:test_sa/views/widgets/equipment/single_device_picker.dart';
import 'package:test_sa/views/widgets/hospitals/single_hospital_picker.dart';
import 'controllers/providers/api/gas_refill_comments.dart'; import 'controllers/providers/api/gas_refill_comments.dart';
import 'controllers/providers/api/user_provider.dart'; import 'controllers/providers/api/user_provider.dart';
@ -259,14 +232,14 @@ class MyApp extends StatelessWidget {
//old.LandPage.id: (_) => const old.LandPage(), //old.LandPage.id: (_) => const old.LandPage(),
LandPage.routeName: (_) => const LandPage(), LandPage.routeName: (_) => const LandPage(),
NewGasRefillRequestPage.routeName: (_) => const NewGasRefillRequestPage(), NewGasRefillRequestPage.routeName: (_) => const NewGasRefillRequestPage(),
ServiceRequestsPage.id: (_) => ServiceRequestsPage(), ServiceRequestsPage.id: (_) => const ServiceRequestsPage(),
//ReportIssuesPage.id: (_) => ReportIssuesPage(), //ReportIssuesPage.id: (_) => ReportIssuesPage(),
RequestGasRefill.id: (_) => RequestGasRefill(), RequestGasRefill.id: (_) => const RequestGasRefill(),
CreateServiceRequestPage.id: (_) => CreateServiceRequestPage(), CreateServiceRequestPage.id: (_) => const CreateServiceRequestPage(),
// SingleHospitalPicker.id: (_) => SingleHospitalPicker(), // SingleHospitalPicker.id: (_) => SingleHospitalPicker(),
MyAssetsPage.id: (_) => const MyAssetsPage(), MyAssetsPage.id: (_) => const MyAssetsPage(),
SingleDepartmentPicker.id: (_) => SingleDepartmentPicker(), SingleDepartmentPicker.id: (_) => const SingleDepartmentPicker(),
NotificationsPage.id: (_) => NotificationsPage(), NotificationsPage.id: (_) => const NotificationsPage(),
// FutureRequestServiceDetails.id: (_) => FutureRequestServiceDetails(), // FutureRequestServiceDetails.id: (_) => FutureRequestServiceDetails(),
// PreventiveMaintenanceVisitsPage.id: (_) => PreventiveMaintenanceVisitsPage(), // PreventiveMaintenanceVisitsPage.id: (_) => PreventiveMaintenanceVisitsPage(),
PpmPage.id: (_) => const PpmPage(), PpmPage.id: (_) => const PpmPage(),
@ -276,13 +249,13 @@ class MyApp extends StatelessWidget {
// todo remove this class after work // todo remove this class after work
// SearchSubWorkOrderPage.id: (_) => const SearchSubWorkOrderPage(), // SearchSubWorkOrderPage.id: (_) => const SearchSubWorkOrderPage(),
CreateSubWorkOrderPage.id: (_) => CreateSubWorkOrderPage(), CreateSubWorkOrderPage.id: (_) => const CreateSubWorkOrderPage(),
WorkOrderListPage.id: (_) => WorkOrderListPage(), WorkOrderListPage.id: (_) => WorkOrderListPage(),
AssetDetailPage.id: (_) => AssetDetailPage(), AssetDetailPage.id: (_) => const AssetDetailPage(),
AssetSearchScreen.id: (_) => AssetSearchScreen(), AssetSearchScreen.id: (_) => const AssetSearchScreen(),
AssetFilterScreen.id: (_) => AssetFilterScreen(), AssetFilterScreen.id: (_) => const AssetFilterScreen(),
WorkOrderDetailsPage.id: (_) => WorkOrderDetailsPage(), WorkOrderDetailsPage.id: (_) => const WorkOrderDetailsPage(),
UpdateServiceRequestPage.id: (_) => UpdateServiceRequestPage(), UpdateServiceRequestPage.id: (_) => const UpdateServiceRequestPage(),
SettingsPage.id: (_) => const SettingsPage(), SettingsPage.id: (_) => const SettingsPage(),
ProfilePage.id: (_) => const ProfilePage(), ProfilePage.id: (_) => const ProfilePage(),
ReportBugPage.id: (_) => const ReportBugPage(), ReportBugPage.id: (_) => const ReportBugPage(),

@ -129,26 +129,26 @@ class AssetByIdModel {
if (json['multiAssets'] != null) { if (json['multiAssets'] != null) {
multiAssets = <MultiAssets>[]; multiAssets = <MultiAssets>[];
json['multiAssets'].forEach((v) { json['multiAssets'].forEach((v) {
multiAssets!.add(new MultiAssets.fromJson(v)); multiAssets!.add(MultiAssets.fromJson(v));
}); });
} }
id = json['id']; id = json['id'];
modelDefinition = json['modelDefinition'] != null ? new ModelDefinition.fromJson(json['modelDefinition']) : null; modelDefinition = json['modelDefinition'] != null ? ModelDefinition.fromJson(json['modelDefinition']) : null;
supplier = json['supplier'] != null ? Suppliers.fromJson(json['supplier']) : null; supplier = json['supplier'] != null ? Suppliers.fromJson(json['supplier']) : null;
ipAddress = json['ipAddress']; ipAddress = json['ipAddress'];
macAddress = json['macAddress']; macAddress = json['macAddress'];
portNumber = json['portNumber']; portNumber = json['portNumber'];
assetReplace = json['assetReplace'] != null ? new AssetReplace.fromJson(json['assetReplace']) : null; assetReplace = json['assetReplace'] != null ? AssetReplace.fromJson(json['assetReplace']) : null;
oldAsset = json['oldAsset'] != null ? AssetInfo.fromJson(json['oldAsset']) : null; oldAsset = json['oldAsset'] != null ? AssetInfo.fromJson(json['oldAsset']) : null;
isParent = json['isParent'] != null ? new AssetReplace.fromJson(json['isParent']) : null; isParent = json['isParent'] != null ? AssetReplace.fromJson(json['isParent']) : null;
parentAsset = json['parentAsset'] != null ? AssetInfo.fromJson(json['parentAsset']) : null; parentAsset = json['parentAsset'] != null ? AssetInfo.fromJson(json['parentAsset']) : null;
assetType = json['assetType'] != null ? new AssetReplace.fromJson(json['assetType']) : null; assetType = json['assetType'] != null ? AssetReplace.fromJson(json['assetType']) : null;
demoRequest = json['demoRequest']; demoRequest = json['demoRequest'];
missionCritical = json['missionCritical']; missionCritical = json['missionCritical'];
site = json['site'] != null ? new Site.fromJson(json['site']) : null; site = json['site'] != null ? Site.fromJson(json['site']) : null;
building = json['building'] != null ? new AssetReplace.fromJson(json['building']) : null; building = json['building'] != null ? AssetReplace.fromJson(json['building']) : null;
floor = json['floor'] != null ? new AssetReplace.fromJson(json['floor']) : null; floor = json['floor'] != null ? AssetReplace.fromJson(json['floor']) : null;
department = json['department'] != null ? new Department.fromJson(json['department']) : null; department = json['department'] != null ? Department.fromJson(json['department']) : null;
room = json['room'] != null ? Lookup.fromJson(json['room']) : null; room = json['room'] != null ? Lookup.fromJson(json['room']) : null;
testsDay = json['testsDay']; testsDay = json['testsDay'];
purchasingPrice = json['purchasingPrice']; purchasingPrice = json['purchasingPrice'];
@ -162,8 +162,8 @@ class AssetByIdModel {
budgetYear = json['budgetYear']; budgetYear = json['budgetYear'];
lastPOPrice = json['lastPOPrice']; lastPOPrice = json['lastPOPrice'];
commissioningStatus = json['commissioningStatus'] != null ? Lookup.fromJson(json['commissioningStatus']) : null; commissioningStatus = json['commissioningStatus'] != null ? Lookup.fromJson(json['commissioningStatus']) : null;
originDepartment = json['originDepartment'] != null ? new Department.fromJson(json['originDepartment']) : null; originDepartment = json['originDepartment'] != null ? Department.fromJson(json['originDepartment']) : null;
originSite = json['originSite'] != null ? new Site.fromJson(json['originSite']) : null; originSite = json['originSite'] != null ? Site.fromJson(json['originSite']) : null;
productionDate = json['productionDate']; productionDate = json['productionDate'];
edd = json['edd']; edd = json['edd'];
technicalInspectionDate = json['technicalInspectionDate']; technicalInspectionDate = json['technicalInspectionDate'];
@ -204,97 +204,97 @@ class AssetByIdModel {
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>(); final Map<String, dynamic> data = <String, dynamic>{};
if (this.multiAssets != null) { if (multiAssets != null) {
data['multiAssets'] = this.multiAssets!.map((v) => v.toJson()).toList(); data['multiAssets'] = multiAssets!.map((v) => v.toJson()).toList();
} }
data['id'] = this.id; data['id'] = id;
if (this.modelDefinition != null) { if (modelDefinition != null) {
data['modelDefinition'] = this.modelDefinition?.toJson(); data['modelDefinition'] = modelDefinition?.toJson();
} }
if (this.supplier != null) { if (supplier != null) {
data['supplier'] = this.supplier?.toJson(); data['supplier'] = supplier?.toJson();
} }
data['ipAddress'] = this.ipAddress; data['ipAddress'] = ipAddress;
data['macAddress'] = this.macAddress; data['macAddress'] = macAddress;
data['portNumber'] = this.portNumber; data['portNumber'] = portNumber;
if (this.assetReplace != null) { if (assetReplace != null) {
data['assetReplace'] = this.assetReplace?.toJson(); data['assetReplace'] = assetReplace?.toJson();
} }
data['oldAsset'] = this.oldAsset?.toJson(); data['oldAsset'] = oldAsset?.toJson();
if (this.isParent != null) { if (isParent != null) {
data['isParent'] = this.isParent?.toJson(); data['isParent'] = isParent?.toJson();
} }
data['parentAsset'] = this.parentAsset?.toJson(); data['parentAsset'] = parentAsset?.toJson();
if (this.assetType != null) { if (assetType != null) {
data['assetType'] = this.assetType?.toJson(); data['assetType'] = assetType?.toJson();
} }
data['demoRequest'] = this.demoRequest; data['demoRequest'] = demoRequest;
data['missionCritical'] = this.missionCritical; data['missionCritical'] = missionCritical;
if (this.site != null) { if (site != null) {
data['site'] = this.site?.toJson(); data['site'] = site?.toJson();
} }
if (this.building != null) { if (building != null) {
data['building'] = this.building?.toJson(); data['building'] = building?.toJson();
} }
if (this.floor != null) { if (floor != null) {
data['floor'] = this.floor?.toJson(); data['floor'] = floor?.toJson();
} }
if (this.department != null) { if (department != null) {
data['department'] = this.department?.toJson(); data['department'] = department?.toJson();
} }
data['room'] = this.room?.toJson(); data['room'] = room?.toJson();
data['testsDay'] = this.testsDay; data['testsDay'] = testsDay;
data['purchasingPrice'] = this.purchasingPrice; data['purchasingPrice'] = purchasingPrice;
data['nbv'] = this.nbv; data['nbv'] = nbv;
data['currency'] = this.currency; data['currency'] = currency;
data['poDate'] = this.poDate; data['poDate'] = poDate;
data['poNo'] = this.poNo; data['poNo'] = poNo;
data['invoiceNumber'] = this.invoiceNumber; data['invoiceNumber'] = invoiceNumber;
data['invoiceDate'] = this.invoiceDate; data['invoiceDate'] = invoiceDate;
data['replacementDate'] = this.replacementDate; data['replacementDate'] = replacementDate;
data['budgetYear'] = this.budgetYear; data['budgetYear'] = budgetYear;
data['lastPOPrice'] = this.lastPOPrice; data['lastPOPrice'] = lastPOPrice;
data['commissioningStatus'] = this.commissioningStatus?.toJson(); data['commissioningStatus'] = commissioningStatus?.toJson();
if (this.originDepartment != null) { if (originDepartment != null) {
data['originDepartment'] = this.originDepartment?.toJson(); data['originDepartment'] = originDepartment?.toJson();
} }
if (this.originSite != null) { if (originSite != null) {
data['originSite'] = this.originSite?.toJson(); data['originSite'] = originSite?.toJson();
} }
data['productionDate'] = this.productionDate; data['productionDate'] = productionDate;
data['edd'] = this.edd; data['edd'] = edd;
data['technicalInspectionDate'] = this.technicalInspectionDate; data['technicalInspectionDate'] = technicalInspectionDate;
data['deliveryInspectionDate'] = this.deliveryInspectionDate; data['deliveryInspectionDate'] = deliveryInspectionDate;
data['endUserAcceptanceDate'] = this.endUserAcceptanceDate; data['endUserAcceptanceDate'] = endUserAcceptanceDate;
data['technicalAcceptanceDate'] = this.technicalAcceptanceDate; data['technicalAcceptanceDate'] = technicalAcceptanceDate;
data['finalAcceptanceDate'] = this.finalAcceptanceDate; data['finalAcceptanceDate'] = finalAcceptanceDate;
data['installationDate'] = this.installationDate; data['installationDate'] = installationDate;
data['siteWarrantyMonthNo'] = this.siteWarrantyMonthNo; data['siteWarrantyMonthNo'] = siteWarrantyMonthNo;
data['extendedWarrantyMonthNo'] = this.extendedWarrantyMonthNo; data['extendedWarrantyMonthNo'] = extendedWarrantyMonthNo;
data['remainderWarrantyMonthNo'] = this.remainderWarrantyMonthNo; data['remainderWarrantyMonthNo'] = remainderWarrantyMonthNo;
data['eomWarrantyMonthsNo'] = this.eomWarrantyMonthsNo; data['eomWarrantyMonthsNo'] = eomWarrantyMonthsNo;
data['warrantyValue'] = this.warrantyValue; data['warrantyValue'] = warrantyValue;
data['warrantyEndDate'] = this.warrantyEndDate; data['warrantyEndDate'] = warrantyEndDate;
data['warrantyContractConditions'] = this.warrantyContractConditions; data['warrantyContractConditions'] = warrantyContractConditions;
if (this.technicalGuidanceBooks != null) { if (technicalGuidanceBooks != null) {
data['technicalGuidanceBooks'] = this.technicalGuidanceBooks!.map((v) => v).toList(); data['technicalGuidanceBooks'] = technicalGuidanceBooks!.map((v) => v).toList();
} }
data['comment'] = this.comment; data['comment'] = comment;
data['isEnabled'] = this.isEnabled; data['isEnabled'] = isEnabled;
data['tagCode'] = this.tagCode; data['tagCode'] = tagCode;
if (this.assetAttachments != null) { if (assetAttachments != null) {
data['assetAttachments'] = this.assetAttachments!.map((v) => v).toList(); data['assetAttachments'] = assetAttachments!.map((v) => v).toList();
} }
data['retirementTypeName'] = this.retirementTypeName; data['retirementTypeName'] = retirementTypeName;
data['retirementStatusName'] = this.retirementStatusName; data['retirementStatusName'] = retirementStatusName;
data['retirementDate'] = this.retirementDate; data['retirementDate'] = retirementDate;
if (this.assetGroup != null) { if (assetGroup != null) {
data['assetGroup'] = this.assetGroup?.toJson(); data['assetGroup'] = assetGroup?.toJson();
} }
data['assetPhoto'] = this.assetPhoto; data['assetPhoto'] = assetPhoto;
data['nextPMDate'] = this.nextPMDate; data['nextPMDate'] = nextPMDate;
data['lastPMDate'] = this.lastPMDate; data['lastPMDate'] = lastPMDate;
return data; return data;
} }
} }
@ -313,10 +313,10 @@ class MultiAssets {
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>(); final Map<String, dynamic> data = <String, dynamic>{};
data['assetSerialNo'] = this.assetSerialNo; data['assetSerialNo'] = assetSerialNo;
data['systemID'] = this.systemID; data['systemID'] = systemID;
data['assetNumber'] = this.assetNumber; data['assetNumber'] = assetNumber;
return data; return data;
} }
} }
@ -375,30 +375,30 @@ class ModelDefinition {
if (json['suppliers'] != null) { if (json['suppliers'] != null) {
suppliers = <Suppliers>[]; suppliers = <Suppliers>[];
json['suppliers'].forEach((v) { json['suppliers'].forEach((v) {
suppliers!.add(new Suppliers.fromJson(v)); suppliers!.add(Suppliers.fromJson(v));
}); });
} }
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>(); final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = this.id; data['id'] = id;
data['assetName'] = this.assetName; data['assetName'] = assetName;
data['assetDescription'] = this.assetDescription; data['assetDescription'] = assetDescription;
data['modelDefCode'] = this.modelDefCode; data['modelDefCode'] = modelDefCode;
data['modelName'] = this.modelName; data['modelName'] = modelName;
data['manufacturerId'] = this.manufacturerId; data['manufacturerId'] = manufacturerId;
data['manufacturerName'] = this.manufacturerName; data['manufacturerName'] = manufacturerName;
data['supplierName'] = this.supplierName; data['supplierName'] = supplierName;
data['replacementDate'] = this.replacementDate; data['replacementDate'] = replacementDate;
data['essentialEquipement'] = this.essentialEquipement; data['essentialEquipement'] = essentialEquipement;
data['businessCritical'] = this.businessCritical; data['businessCritical'] = businessCritical;
data['lifeSpan'] = this.lifeSpan; data['lifeSpan'] = lifeSpan;
if (this.modelDefRelatedDefects != null) { if (modelDefRelatedDefects != null) {
data['modelDefRelatedDefects'] = this.modelDefRelatedDefects!.map((v) => v.toJson()).toList(); data['modelDefRelatedDefects'] = modelDefRelatedDefects!.map((v) => v.toJson()).toList();
} }
if (this.suppliers != null) { if (suppliers != null) {
data['suppliers'] = this.suppliers!.map((v) => v.toJson()).toList(); data['suppliers'] = suppliers!.map((v) => v.toJson()).toList();
} }
return data; return data;
} }
@ -416,9 +416,9 @@ class Suppliers {
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>(); final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = this.id; data['id'] = id;
data['suppliername'] = this.suppliername; data['suppliername'] = suppliername;
return data; return data;
} }
} }
@ -437,10 +437,10 @@ class AssetReplace {
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>(); final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = this.id; data['id'] = id;
data['name'] = this.name; data['name'] = name;
data['value'] = this.value; data['value'] = value;
return data; return data;
} }
} }
@ -460,18 +460,18 @@ class Site {
if (json['buildings'] != null) { if (json['buildings'] != null) {
buildings = <Buildings>[]; buildings = <Buildings>[];
json['buildings'].forEach((v) { json['buildings'].forEach((v) {
buildings!.add(new Buildings.fromJson(v)); buildings!.add(Buildings.fromJson(v));
}); });
} }
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>(); final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = this.id; data['id'] = id;
data['customerCode'] = this.customerCode; data['customerCode'] = customerCode;
data['custName'] = this.custName; data['custName'] = custName;
if (this.buildings != null) { if (buildings != null) {
data['buildings'] = this.buildings!.map((v) => v.toJson()).toList(); data['buildings'] = buildings!.map((v) => v.toJson()).toList();
} }
return data; return data;
} }
@ -492,18 +492,18 @@ class Buildings {
if (json['floors'] != null) { if (json['floors'] != null) {
floors = <Floors>[]; floors = <Floors>[];
json['floors'].forEach((v) { json['floors'].forEach((v) {
floors!.add(new Floors.fromJson(v)); floors!.add(Floors.fromJson(v));
}); });
} }
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>(); final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = this.id; data['id'] = id;
data['name'] = this.name; data['name'] = name;
data['value'] = this.value; data['value'] = value;
if (this.floors != null) { if (floors != null) {
data['floors'] = this.floors!.map((v) => v.toJson()).toList(); data['floors'] = floors!.map((v) => v.toJson()).toList();
} }
return data; return data;
} }
@ -524,18 +524,18 @@ class Floors {
if (json['departments'] != null) { if (json['departments'] != null) {
departments = <Departments>[]; departments = <Departments>[];
json['departments'].forEach((v) { json['departments'].forEach((v) {
departments!.add(new Departments.fromJson(v)); departments!.add(Departments.fromJson(v));
}); });
} }
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>(); final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = this.id; data['id'] = id;
data['name'] = this.name; data['name'] = name;
data['value'] = this.value; data['value'] = value;
if (this.departments != null) { if (departments != null) {
data['departments'] = this.departments!.map((v) => v.toJson()).toList(); data['departments'] = departments!.map((v) => v.toJson()).toList();
} }
return data; return data;
} }
@ -553,9 +553,9 @@ class Departments {
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>(); final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = this.id; data['id'] = id;
data['name'] = this.name; data['name'] = name;
return data; return data;
} }
} }
@ -576,11 +576,11 @@ class Department {
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>(); final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = this.id; data['id'] = id;
data['departmentName'] = this.departmentName; data['departmentName'] = departmentName;
data['departmentCode'] = this.departmentCode; data['departmentCode'] = departmentCode;
data['ntCode'] = this.ntCode; data['ntCode'] = ntCode;
return data; return data;
} }
} }
@ -599,10 +599,10 @@ class AssetGroup {
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>(); final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = this.id; data['id'] = id;
data['name'] = this.name; data['name'] = name;
data['code'] = this.code; data['code'] = code;
return data; return data;
} }
} }

@ -399,11 +399,11 @@ class AssetTransfer {
map['senderWorkingHours'] = senderWorkingHours; map['senderWorkingHours'] = senderWorkingHours;
map['senderTravelingHours'] = senderTravelingHours; map['senderTravelingHours'] = senderTravelingHours;
map['senderEngSignature'] = senderEngSignature; map['senderEngSignature'] = senderEngSignature;
if (this.senderVisitTimers != null) { if (senderVisitTimers != null) {
map['assetTransferSenderTimers'] = this.senderVisitTimers!.map((v) => v.toJson()).toList(); map['assetTransferSenderTimers'] = senderVisitTimers!.map((v) => v.toJson()).toList();
} }
if (this.receiverVisitTimers != null) { if (receiverVisitTimers != null) {
map['assetTransferReceiverTimers'] = this.receiverVisitTimers!.map((v) => v.toJson()).toList(); map['assetTransferReceiverTimers'] = receiverVisitTimers!.map((v) => v.toJson()).toList();
} }
if (senderAttachments != null) { if (senderAttachments != null) {
map['senderAttachments'] = senderAttachments!.map((v) => v.toJson()).toList(); map['senderAttachments'] = senderAttachments!.map((v) => v.toJson()).toList();

@ -30,7 +30,7 @@ class GasRefillComment {
}) => }) =>
GasRefillComment( GasRefillComment(
id: id ?? this.id, id: id ?? this.id,
gasRefillId: callRequestId ?? this.gasRefillId, gasRefillId: callRequestId ?? gasRefillId,
createdOn: createdOn ?? this.createdOn, createdOn: createdOn ?? this.createdOn,
createdBy: createdBy ?? this.createdBy, createdBy: createdBy ?? this.createdBy,
comment: comment ?? this.comment, comment: comment ?? this.comment,

@ -3,6 +3,7 @@ import 'base.dart';
class Lookup extends Base { class Lookup extends Base {
int? id; // Now nullable int? id; // Now nullable
int? value; // Now nullable int? value; // Now nullable
@override
String? name; // Now nullable String? name; // Now nullable
Lookup({this.id, this.value, this.name}) : super(identifier: id?.toString(), name: name); Lookup({this.id, this.value, this.name}) : super(identifier: id?.toString(), name: name);

@ -2,6 +2,7 @@ import 'package:test_sa/models/base.dart';
class Rooms extends Base { class Rooms extends Base {
int? id; // Now nullable int? id; // Now nullable
@override
String? name; // Now nullable String? name; // Now nullable
int?value; // Now nullable int?value; // Now nullable
@ -15,10 +16,10 @@ class Rooms extends Base {
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>(); final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = this.id; data['id'] = id;
data['name'] = this.name; data['name'] = name;
data['value'] = this.value; data['value'] = value;
return data; return data;
} }
} }

@ -28,11 +28,11 @@ class VisitTimers {
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>(); final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = this.id; data['id'] = id;
data['startDateTime'] = this.startDateTime; data['startDateTime'] = startDateTime;
data['endDateTime'] = this.endDateTime; data['endDateTime'] = endDateTime;
data['workingHours'] = this.workingHours; data['workingHours'] = workingHours;
return data; return data;
} }
} }
@ -578,8 +578,8 @@ class Ppm {
.toList(); .toList();
} }
map['visitStatusId'] = visitStatusId; map['visitStatusId'] = visitStatusId;
if (this.visitTimers != null) { if (visitTimers != null) {
map['visitTimers'] = this.visitTimers!.map((v) => v.toJson()).toList(); map['visitTimers'] = visitTimers!.map((v) => v.toJson()).toList();
} }
// map['startDate'] = tbsTimer?.startAt?.toIso8601String(); // map['startDate'] = tbsTimer?.startAt?.toIso8601String();
// map['endDate'] = tbsTimer?.endAt?.toIso8601String(); // map['endDate'] = tbsTimer?.endAt?.toIso8601String();
@ -643,7 +643,7 @@ class Ppm {
} }
bool _isLocalUrl(String url) { bool _isLocalUrl(String url) {
if (url?.isEmpty != false) return false; if (url.isEmpty != false) return false;
return url.startsWith("/") || url.startsWith("file://") || url.substring(1).startsWith(':\\'); return url.startsWith("/") || url.startsWith("file://") || url.substring(1).startsWith(':\\');
} }

@ -9,16 +9,16 @@ class PendingAssetServiceRequest {
details = <Details>[]; details = <Details>[];
if (json['details'] != null) { if (json['details'] != null) {
json['details'].forEach((v) { json['details'].forEach((v) {
details!.add(new Details.fromJson(v)); details!.add(Details.fromJson(v));
}); });
} }
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>(); final Map<String, dynamic> data = <String, dynamic>{};
data['headerMessage'] = this.headerMessage; data['headerMessage'] = headerMessage;
if (this.details != null) { if (details != null) {
data['details'] = this.details!.map((v) => v.toJson()).toList(); data['details'] = details!.map((v) => v.toJson()).toList();
} }
return data; return data;
} }
@ -42,12 +42,12 @@ class Details {
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>(); final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = this.id; data['id'] = id;
data['message'] = this.message; data['message'] = message;
data['callComments'] = this.callComments; data['callComments'] = callComments;
data['voiceNote'] = this.voiceNote; data['voiceNote'] = voiceNote;
data['createdBy'] = this.createdBy; data['createdBy'] = createdBy;
return data; return data;
} }
} }

@ -133,14 +133,14 @@ class SearchWorkOrder {
visitDate = wo.visitDate ?? visitDate; visitDate = wo.visitDate ?? visitDate;
assistantEmployees = (wo.assistantEmployees ?? assistantEmployees) assistantEmployees = (wo.assistantEmployees ?? assistantEmployees)
?.map((e) => AssistantEmployees.fromJson({ ?.map((e) => AssistantEmployees.fromJson({
"id": e?.id, "id": e.id,
"user": {"name": e?.user?.name, "id": (e?.user?.id) ?? "0"} "user": {"name": e.user?.name, "id": (e.user?.id) ?? "0"}
})) }))
?.toList() ?? .toList() ??
[]; [];
if (wo.supplier != null) supplier = SupplierDetails.fromJson((wo.supplier)?.toJson() ?? {}); if (wo.supplier != null) supplier = SupplierDetails.fromJson((wo.supplier)?.toJson() ?? {});
vendorTicketNumber = wo.vendorTicketNumber ?? vendorTicketNumber; vendorTicketNumber = wo.vendorTicketNumber ?? vendorTicketNumber;
contactPersonWorkOrders = (wo.contactPersonWorkOrders ?? contactPersonWorkOrders)?.map((e) => ContactPersonWorkOrder.fromJson(e?.toJson() ?? {}))?.toList() ?? []; contactPersonWorkOrders = (wo.contactPersonWorkOrders ?? contactPersonWorkOrders)?.map((e) => ContactPersonWorkOrder.fromJson(e.toJson() ?? {})).toList() ?? [];
calllastSituation = Lookup.fromJson((wo.calllastSituation ?? calllastSituation)?.toJson() ?? {}); calllastSituation = Lookup.fromJson((wo.calllastSituation ?? calllastSituation)?.toJson() ?? {});
if (wo.currentSituation != null) currentSituation = Lookup.fromJson((wo.currentSituation)?.toJson() ?? {}); if (wo.currentSituation != null) currentSituation = Lookup.fromJson((wo.currentSituation)?.toJson() ?? {});
repairLocation = Lookup.fromJson((wo.repairLocation ?? repairLocation)?.toJson() ?? {}); repairLocation = Lookup.fromJson((wo.repairLocation ?? repairLocation)?.toJson() ?? {});
@ -152,12 +152,12 @@ class SearchWorkOrder {
travelingHours = wo.travelingHours ?? travelingHours; travelingHours = wo.travelingHours ?? travelingHours;
travelingExpenses = wo.travelingExpenses ?? travelingExpenses; travelingExpenses = wo.travelingExpenses ?? travelingExpenses;
faultDescription = FaultDescription.fromJson((wo.faultDescription ?? faultDescription)?.toJson() ?? {}); faultDescription = FaultDescription.fromJson((wo.faultDescription ?? faultDescription)?.toJson() ?? {});
sparePartsWorkOrders = (wo.sparePartsWorkOrders ?? sparePartsWorkOrders)?.map((e) => SparePartsWorkOrders.fromJson(e?.toJson() ?? {}))?.toList() ?? []; sparePartsWorkOrders = (wo.sparePartsWorkOrders ?? sparePartsWorkOrders)?.map((e) => SparePartsWorkOrders.fromJson(e.toJson() ?? {})).toList() ?? [];
reviewComment = wo.reviewComment ?? reviewComment; reviewComment = wo.reviewComment ?? reviewComment;
comment = wo.comment ?? comment; comment = wo.comment ?? comment;
attachmentsWorkOrder = (wo.attachmentsWorkOrder ?? attachmentsWorkOrder)?.map((e) => Attachment.fromJson(e?.toJson() ?? {}))?.toList() ?? []; attachmentsWorkOrder = (wo.attachmentsWorkOrder ?? attachmentsWorkOrder)?.map((e) => Attachment.fromJson(e.toJson() ?? {})).toList() ?? [];
equipmentStatus = Lookup.fromJson((wo.equipmentStatus ?? equipmentStatus)?.toJson() ?? {}); equipmentStatus = Lookup.fromJson((wo.equipmentStatus ?? equipmentStatus)?.toJson() ?? {});
suppEngineerWorkOrders = (wo.suppEngineerWorkOrders ?? suppEngineerWorkOrders)?.map((e) => SuppEngineerWorkOrders.fromJson(e?.toJson() ?? {}))?.toList() ?? []; suppEngineerWorkOrders = (wo.suppEngineerWorkOrders ?? suppEngineerWorkOrders)?.map((e) => SuppEngineerWorkOrders.fromJson(e.toJson() ?? {})).toList() ?? [];
engSignature = wo.engSignature ?? engSignature; engSignature = wo.engSignature ?? engSignature;
nurseSignature = wo.nurseSignature ?? nurseSignature; nurseSignature = wo.nurseSignature ?? nurseSignature;
woParentDto = wo.woParentDto ?? woParentDto; woParentDto = wo.woParentDto ?? woParentDto;
@ -301,7 +301,7 @@ class SearchWorkOrder {
} }
map['visitDate'] = visitDate; map['visitDate'] = visitDate;
if (assistantEmployees != null) { if (assistantEmployees != null) {
map['assistantEmployees'] = assistantEmployees!.map((v) => v?.toJson()).toList(); map['assistantEmployees'] = assistantEmployees!.map((v) => v.toJson()).toList();
} }
if (supplier != null) { if (supplier != null) {
map['supplier'] = supplier!.toJson(); map['supplier'] = supplier!.toJson();

@ -194,9 +194,9 @@ class CallCreatedBy {
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>(); final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = this.id; data['id'] = id;
data['name'] = this.name; data['name'] = name;
return data; return data;
} }
} }

@ -18,13 +18,13 @@ class SupplierEngineer {
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>(); final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = this.id; data['id'] = id;
data['supplierId'] = this.supplierId; data['supplierId'] = supplierId;
data['personName'] = this.personName; data['personName'] = personName;
data['personRoleId'] = this.personRoleId; data['personRoleId'] = personRoleId;
data['contact'] = this.contact; data['contact'] = contact;
data['email'] = this.email; data['email'] = email;
return data; return data;
} }
} }

@ -75,12 +75,12 @@ class User {
return { return {
"username": userName, "username": userName,
"password": password, "password": password,
"fireBaseToken": FirebaseNotificationManger?.token ?? "", "fireBaseToken": FirebaseNotificationManger.token ?? "",
}; };
} }
UsersTypes? get type { UsersTypes? get type {
switch (userRoles?.first?.value) { switch (userRoles?.first.value) {
case "R-6": case "R-6":
return UsersTypes.engineer; return UsersTypes.engineer;
case "R-7": // Nurse Role case "R-7": // Nurse Role

@ -54,7 +54,7 @@ class _AppLoadingManagerState extends State<AppLoadingManager> {
borderRadius: BorderRadius.circular(10), borderRadius: BorderRadius.circular(10),
color: context.isDark ? AppColor.neutral50 : Colors.white, color: context.isDark ? AppColor.neutral50 : Colors.white,
), ),
child: AppLazyLoading(), child: const AppLazyLoading(),
); );
} else if (widget.isFailedLoading && !widget.isNotPage) { } else if (widget.isFailedLoading && !widget.isNotPage) {
// if failed, return failed widget // if failed, return failed widget

@ -101,7 +101,7 @@ class _AppTextFormFieldState extends State<AppTextFormField> {
controller: widget.controller, controller: widget.controller,
textInputAction: widget.textInputType == TextInputType.multiline ? null : widget.textInputAction ?? TextInputAction.next, textInputAction: widget.textInputType == TextInputType.multiline ? null : widget.textInputAction ?? TextInputAction.next,
onEditingComplete: widget.onAction ?? () => FocusScope.of(context).nextFocus(), onEditingComplete: widget.onAction ?? () => FocusScope.of(context).nextFocus(),
style: AppTextStyle.body1?.copyWith(fontWeight: FontWeight.w500), style: AppTextStyle.body1.copyWith(fontWeight: FontWeight.w500),
onTap: widget.onTap, onTap: widget.onTap,
decoration: InputDecoration( decoration: InputDecoration(
alignLabelWithHint: widget.alignLabelWithHint, alignLabelWithHint: widget.alignLabelWithHint,
@ -120,8 +120,8 @@ class _AppTextFormFieldState extends State<AppTextFormField> {
: !widget.enable : !widget.enable
? AppColor.neutral40 ? AppColor.neutral40
: AppColor.background(context)), : AppColor.background(context)),
errorStyle: AppTextStyle.tiny?.copyWith(color: context.isDark ? AppColor.red50 : AppColor.red60), errorStyle: AppTextStyle.tiny.copyWith(color: context.isDark ? AppColor.red50 : AppColor.red60),
floatingLabelStyle: AppTextStyle.body1?.copyWith(fontWeight: FontWeight.w500, color: context.isDark ? null : AppColor.neutral20), floatingLabelStyle: AppTextStyle.body1.copyWith(fontWeight: FontWeight.w500, color: context.isDark ? null : AppColor.neutral20),
hintText: widget.hintText ?? "", hintText: widget.hintText ?? "",
labelText: widget.labelText ?? "", labelText: widget.labelText ?? "",
labelStyle: widget.labelStyle, labelStyle: widget.labelStyle,

@ -25,7 +25,7 @@ class CustomAppBar extends StatelessWidget implements PreferredSizeWidget {
}), }),
Text( Text(
title ?? "", title ?? "",
style: AppTextStyles.heading3?.copyWith(fontWeight: FontWeight.w600, color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), style: AppTextStyles.heading3.copyWith(fontWeight: FontWeight.w600, color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
).expanded, ).expanded,
], ],
), ),

@ -25,7 +25,7 @@ class DefaultAppBar extends StatelessWidget implements PreferredSizeWidget {
10.width, 10.width,
Text( Text(
title ?? "", title ?? "",
style: AppTextStyles.heading3?.copyWith(fontWeight: FontWeight.w500, color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), style: AppTextStyles.heading3.copyWith(fontWeight: FontWeight.w500, color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
).expanded, ).expanded,
], ],
), ),

@ -151,14 +151,14 @@ class _SingleItemDropDownMenuState<T extends Base, X extends LoadingListNotifier
return DropdownMenuItem<T>( return DropdownMenuItem<T>(
value: value, value: value,
child: Text( child: Text(
value?.name ?? "", // Null-aware operator for value.name value.name ?? "", // Null-aware operator for value.name
style: Theme.of(context).textTheme.bodyLarge, style: Theme.of(context).textTheme.bodyLarge,
), ),
); );
}).toList(), }).toList(),
).onPress(widget.showAsBottomSheet ).onPress(widget.showAsBottomSheet
? () async { ? () async {
final _selectedT = await showModalBottomSheet<T?>( final selectedT = await showModalBottomSheet<T?>(
// Specify return type // Specify return type
context: context, context: context,
isScrollControlled: true, isScrollControlled: true,
@ -176,8 +176,8 @@ class _SingleItemDropDownMenuState<T extends Base, X extends LoadingListNotifier
builderString: (emp) => emp?.name ?? "", // Null-aware operator for emp.name builderString: (emp) => emp?.name ?? "", // Null-aware operator for emp.name
), ),
); );
if (_selectedT != null) { if (selectedT != null) {
widget.onSelect!(_selectedT); // Non-null assertion after null check widget.onSelect!(selectedT); // Non-null assertion after null check
} }
} }
: null), : null),

@ -23,7 +23,7 @@ class TabButton extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return InkWell( return InkWell(
onTap: onPressed, onTap: onPressed,
child: count != null && count > 0 && isSelected && !loading child: count > 0 && isSelected && !loading
? CustomBadge( ? CustomBadge(
value: count.toString(), value: count.toString(),
child: Container( child: Container(

@ -75,8 +75,8 @@ class _MonthlyFragmentState extends State<MonthlyFragment> {
return CalendarDaysCard( return CalendarDaysCard(
day: day, day: day,
fill: snapshot.calendarRequests?.requestsDetails?.firstWhere( fill: snapshot.calendarRequests?.requestsDetails?.firstWhere(
(element) => (element.date != null) && (DateTime.tryParse(element.date!)?.difference(dateTime)?.inDays == 0), (element) => (element.date != null) && (DateTime.tryParse(element.date!)?.difference(dateTime).inDays == 0),
orElse: null, orElse: null,
) != ) !=
null, null,
).toShimmer(isShow: snapshot.isCalendarLoading); ).toShimmer(isShow: snapshot.isCalendarLoading);

@ -78,7 +78,7 @@ class _WeeklyFragmentState extends State<WeeklyFragment> {
return CalendarDaysCard( return CalendarDaysCard(
day: day, day: day,
fill: snapshot.calendarRequests!.requestsDetails?.firstWhere( fill: snapshot.calendarRequests!.requestsDetails?.firstWhere(
(element) => (element.date != null) && (DateTime.tryParse(element.date!)?.day == (dateTime)?.day), (element) => (element.date != null) && (DateTime.tryParse(element.date!)?.day == (dateTime).day),
orElse: null, orElse: null,
) != ) !=
null, null,
@ -89,8 +89,8 @@ class _WeeklyFragmentState extends State<WeeklyFragment> {
return CalendarDaysCard( return CalendarDaysCard(
day: day, day: day,
fill: snapshot.calendarRequests!.requestsDetails?.firstWhere( fill: snapshot.calendarRequests!.requestsDetails?.firstWhere(
(element) => (element.date != null) && (DateTime.tryParse(element.date!)?.day == (dateTime)?.day), (element) => (element.date != null) && (DateTime.tryParse(element.date!)?.day == (dateTime).day),
orElse: null, orElse: null,
) != ) !=
null, null,
).toShimmer(isShow: snapshot.isCalendarLoading); ).toShimmer(isShow: snapshot.isCalendarLoading);

@ -76,29 +76,26 @@ import 'package:test_sa/controllers/notification/firebase_notification_manger.da
import 'package:test_sa/controllers/providers/api/all_requests_provider.dart'; import 'package:test_sa/controllers/providers/api/all_requests_provider.dart';
import 'package:test_sa/controllers/providers/api/notifications_provider.dart'; import 'package:test_sa/controllers/providers/api/notifications_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/views/widgets/notifications/notification_item.dart'; import 'package:test_sa/views/widgets/notifications/notification_item.dart';
class RecentActivitiesFragment extends StatelessWidget { class RecentActivitiesFragment extends StatelessWidget {
RecentActivitiesFragment({Key? key}) : super(key: key); const RecentActivitiesFragment({Key? key}) : super(key: key);
//NotificationsProvider _notificationsProvider; //NotificationsProvider _notificationsProvider;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
//_notificationsProvider ??= Provider.of<NotificationsProvider>(context, listen: false); //_notificationsProvider ??= Provider.of<NotificationsProvider>(context, listen: false);
return Consumer<NotificationsProvider>(builder: (context, _notificationsProvider, _) { return Consumer<NotificationsProvider>(builder: (context, notificationsProvider, _) {
UserProvider _userProvider = Provider.of<UserProvider>(context); UserProvider userProvider = Provider.of<UserProvider>(context);
bool isCurrentUserNotEngineer = (_userProvider.user!.type != UsersTypes.engineer); bool isCurrentUserNotEngineer = (userProvider.user!.type != UsersTypes.engineer);
return RefreshIndicator( return RefreshIndicator(
onRefresh: () { onRefresh: () {
Provider.of<AllRequestsProvider>(context, listen: false).getRequests(); Provider.of<AllRequestsProvider>(context, listen: false).getRequests();
_notificationsProvider.getSystemNotifications(user: Provider.of<UserProvider>(context, listen: false).user!,resetProvider: true); notificationsProvider.getSystemNotifications(user: Provider.of<UserProvider>(context, listen: false).user!,resetProvider: true);
return Future.delayed(const Duration(microseconds: 250)); return Future.delayed(const Duration(microseconds: 250));
}, },
child: SingleChildScrollView( child: SingleChildScrollView(
@ -110,7 +107,7 @@ class RecentActivitiesFragment extends StatelessWidget {
ListView.builder( ListView.builder(
shrinkWrap: true, shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),
itemCount: _notificationsProvider.notifications.length, itemCount: notificationsProvider.notifications.length,
// separatorBuilder: (context, itemIndex) => const Divider().defaultStyle(context).paddingOnly(top: 16, bottom: 16), // separatorBuilder: (context, itemIndex) => const Divider().defaultStyle(context).paddingOnly(top: 16, bottom: 16),
itemBuilder: (context, itemIndex) { itemBuilder: (context, itemIndex) {
// todo add priority & progress tag to show chip // todo add priority & progress tag to show chip
@ -123,8 +120,8 @@ class RecentActivitiesFragment extends StatelessWidget {
shadows: [boxShadowR14], shadows: [boxShadowR14],
), ),
child: NotificationItem( child: NotificationItem(
isLoading: _notificationsProvider.isLoading, isLoading: notificationsProvider.isLoading,
notification: _notificationsProvider.notifications[itemIndex], notification: notificationsProvider.notifications[itemIndex],
onPressed: (notification) { onPressed: (notification) {
FirebaseNotificationManger.handleMessage(context, notification.toNotificationJson()); FirebaseNotificationManger.handleMessage(context, notification.toNotificationJson());
}, },

@ -109,7 +109,7 @@ class RequestCategoryFragment extends StatelessWidget {
child: const SizedBox().toRequestShimmer(context, allRequestProvider.isFilterRequestLoading), child: const SizedBox().toRequestShimmer(context, allRequestProvider.isFilterRequestLoading),
); );
})) }))
: RequestCategoryList(allRequestProvider.filterRequest?.requestsDetails ?? [], allRequestProvider.isFilterRequestLoading, allRequestProvider?.filterRequest?.total?.count ?? 0), : RequestCategoryList(allRequestProvider.filterRequest?.requestsDetails ?? [], allRequestProvider.isFilterRequestLoading, allRequestProvider.filterRequest?.total?.count ?? 0),
]); ]);
}); });
} }

@ -1,6 +1,4 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/all_requests_provider.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/models/all_requests_and_count_model.dart'; import 'package:test_sa/models/all_requests_and_count_model.dart';
import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/app_style/app_color.dart';
@ -23,10 +21,10 @@ class RequestCategoryList extends StatelessWidget {
physics:const NeverScrollableScrollPhysics(), physics:const NeverScrollableScrollPhysics(),
itemBuilder: (context, index) { itemBuilder: (context, index) {
if (index == list.length) { if (index == list.length) {
return ListTile( return const ListTile(
title: Row( title: Row(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: const <Widget>[ children: <Widget>[
CircularProgressIndicator( CircularProgressIndicator(
color: AppColor.primary10, color: AppColor.primary10,
strokeWidth: 1, strokeWidth: 1,

@ -66,15 +66,15 @@ class RequestsFragment extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
value != null && value > 0 && !isLoading value > 0 && !isLoading
? CustomBadge( ? CustomBadge(
value: value.toString(), value: value.toString(),
child: Container( child: Container(
child: (icon ?? "").toSvgAsset(height: 26, width: 26, color: iconColor)?.toShimmer(isShow: isLoading), child: (icon ?? "").toSvgAsset(height: 26, width: 26, color: iconColor).toShimmer(isShow: isLoading),
).toShadowCircleContainer(context, padding: 18), ).toShadowCircleContainer(context, padding: 18),
) )
: Container( : Container(
child: (icon ?? "").toSvgAsset(height: 26, width: 26, color: iconColor)?.toShimmer(isShow: isLoading), child: (icon ?? "").toSvgAsset(height: 26, width: 26, color: iconColor).toShimmer(isShow: isLoading),
).toShadowCircleContainer(context, padding: 18), ).toShadowCircleContainer(context, padding: 18),
10.height, 10.height,
Text( Text(

@ -88,9 +88,9 @@ class _DashboardPageState extends State<DashboardPage> {
), ),
); );
}).onPress(widget.onDrawerPress), }).onPress(widget.onDrawerPress),
Spacer(), const Spacer(),
Container( Container(
padding: EdgeInsets.fromLTRB(12, 6, 6, 6), padding: const EdgeInsets.fromLTRB(12, 6, 6, 6),
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8), borderRadius: BorderRadius.circular(8),
color: AppColor.background(context), color: AppColor.background(context),
@ -124,11 +124,11 @@ class _DashboardPageState extends State<DashboardPage> {
return DropdownMenuItem<AssetGroup>( return DropdownMenuItem<AssetGroup>(
value: value, value: value,
child: Text( child: Text(
value?.name ?? "", value.name ?? "",
style: Theme.of(context).textTheme.bodyLarge, style: Theme.of(context).textTheme.bodyLarge,
), ),
); );
})?.toList(), }).toList(),
), ),
), ),
16.width, 16.width,
@ -168,7 +168,7 @@ class _DashboardPageState extends State<DashboardPage> {
style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
), ),
Text( Text(
user?.username ?? "", user.username ?? "",
style: AppTextStyles.heading2.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50, fontWeight: FontWeight.w600), style: AppTextStyles.heading2.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50, fontWeight: FontWeight.w600),
), ),
24.height, 24.height,
@ -190,7 +190,7 @@ class _DashboardPageState extends State<DashboardPage> {
children: [ children: [
const RequestsFragment(), const RequestsFragment(),
ProgressFragment(), ProgressFragment(),
RecentActivitiesFragment(), const RecentActivitiesFragment(),
], ],
).expanded, ).expanded,
], ],

@ -23,7 +23,6 @@ import '../../../views/widgets/dialogs/dialog.dart';
import '../../common_widgets/app_bottom_nav_bar.dart'; import '../../common_widgets/app_bottom_nav_bar.dart';
import '../../common_widgets/app_drawer.dart'; import '../../common_widgets/app_drawer.dart';
import 'contact_us_bottom_sheet.dart'; import 'contact_us_bottom_sheet.dart';
import 'dashboard_page.dart';
class LandPage extends StatefulWidget { class LandPage extends StatefulWidget {
static const String routeName = "/land-page"; static const String routeName = "/land-page";
@ -51,7 +50,7 @@ class _LandPageState extends State<LandPage> {
if (await Provider.of<SettingProvider>(context, listen: false).auth.isDeviceSupported()) { if (await Provider.of<SettingProvider>(context, listen: false).auth.isDeviceSupported()) {
SharedPreferences prefs = await SharedPreferences.getInstance(); SharedPreferences prefs = await SharedPreferences.getInstance();
if (!prefs.containsKey(ASettings.localAuth)) { if (!prefs.containsKey(ASettings.localAuth)) {
(await Provider.of<SettingProvider>(context, listen: false)).setAuth(false); (Provider.of<SettingProvider>(context, listen: false)).setAuth(false);
showModalBottomSheet( showModalBottomSheet(
context: context, context: context,
useSafeArea: true, useSafeArea: true,

@ -143,11 +143,11 @@ class _AllRequestsSearchPageState extends State<AllRequestsSearchPage> {
} }
bool _showResetButton() { bool _showResetButton() {
return (search?.requestNumber?.controller?.text?.isNotEmpty ?? false) || return (search?.requestNumber?.controller?.text.isNotEmpty ?? false) ||
(search?.assetName?.controller?.text?.isNotEmpty ?? false) || (search?.assetName?.controller?.text.isNotEmpty ?? false) ||
(search?.assetNo?.controller?.text?.isNotEmpty ?? false) || (search?.assetNo?.controller?.text.isNotEmpty ?? false) ||
(search?.manufacture?.controller?.text?.isNotEmpty ?? false) || (search?.manufacture?.controller?.text.isNotEmpty ?? false) ||
(search?.sn?.controller?.text?.isNotEmpty ?? false) || (search?.sn?.controller?.text.isNotEmpty ?? false) ||
(search?.model?.controller?.text?.isNotEmpty ?? false); (search?.model?.controller?.text.isNotEmpty ?? false);
} }
} }

@ -49,8 +49,8 @@ class AssetItemView extends StatelessWidget {
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
context.translation.deviceTransferRequest.heading5(context), context.translation.deviceTransferRequest.heading5(context),
"${context.translation.from} : ${request.siteTransferFrom?.cleanupWhitespace?.capitalizeFirstOfEach}".bodyText(context), "${context.translation.from} : ${request.siteTransferFrom?.cleanupWhitespace.capitalizeFirstOfEach}".bodyText(context),
"${context.translation.to} : ${request.siteTransferTo?.cleanupWhitespace?.capitalizeFirstOfEach}".bodyText(context), "${context.translation.to} : ${request.siteTransferTo?.cleanupWhitespace.capitalizeFirstOfEach}".bodyText(context),
request.status!.replaceAll("=", ":").bodyText(context), request.status!.replaceAll("=", ":").bodyText(context),
'${context.translation.requestNo}: ${request.requestNo}'.bodyText(context), '${context.translation.requestNo}: ${request.requestNo}'.bodyText(context),
], ],

@ -43,7 +43,7 @@ class GasRefillItemView extends StatelessWidget {
8.height, 8.height,
context.translation.gasRefillRequest.heading5(context), context.translation.gasRefillRequest.heading5(context),
'${context.translation.gasType}: ${request.gasType}'.bodyText(context), '${context.translation.gasType}: ${request.gasType}'.bodyText(context),
'${context.translation.site}: ${request.site?.cleanupWhitespace?.capitalizeFirstOfEach}'.bodyText(context), '${context.translation.site}: ${request.site?.cleanupWhitespace.capitalizeFirstOfEach}'.bodyText(context),
'${context.translation.requestNo}: ${request.requestNo}'.bodyText(context), '${context.translation.requestNo}: ${request.requestNo}'.bodyText(context),
8.height, 8.height,
Row( Row(

@ -1,6 +1,4 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/all_requests_provider.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/models/all_requests_and_count_model.dart'; import 'package:test_sa/models/all_requests_and_count_model.dart';
import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/app_style/app_color.dart';
@ -25,10 +23,10 @@ class RequestPaginatedList extends StatelessWidget {
shrinkWrap: true, shrinkWrap: true,
itemBuilder: (context, index) { itemBuilder: (context, index) {
if (index == list.length) { if (index == list.length) {
return ListTile( return const ListTile(
title: Row( title: Row(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: const <Widget>[ children: <Widget>[
CircularProgressIndicator( CircularProgressIndicator(
color: AppColor.primary10, color: AppColor.primary10,
strokeWidth: 1, strokeWidth: 1,

@ -43,7 +43,7 @@ class ServiceRequestItemView extends StatelessWidget {
), ),
8.height, 8.height,
context.translation.serviceRequest.heading5(context), context.translation.serviceRequest.heading5(context),
'${context.translation.assetName}: ${request.assetName?.cleanupWhitespace?.capitalizeFirstOfEach}'.bodyText(context), '${context.translation.assetName}: ${request.assetName?.cleanupWhitespace.capitalizeFirstOfEach}'.bodyText(context),
'${context.translation.assetNumber}: ${request.assetNo}'.bodyText(context), '${context.translation.assetNumber}: ${request.assetNo}'.bodyText(context),
'${context.translation.requestType}: ${request.requestType}'.bodyText(context), '${context.translation.requestType}: ${request.requestType}'.bodyText(context),
'${context.translation.requestNo}: ${request.requestNo}'.bodyText(context), '${context.translation.requestNo}: ${request.requestNo}'.bodyText(context),

@ -48,7 +48,7 @@ class _RequestsListPageState extends State<RequestsListPage> {
_scrollController = ScrollController(); _scrollController = ScrollController();
int pageNo = 1; int pageNo = 1;
_scrollController.addListener(() async { _scrollController.addListener(() async {
if (_scrollController?.position?.pixels == _scrollController?.position?.maxScrollExtent && !_provider.isRequestCategoryLoading) { if (_scrollController.position.pixels == _scrollController.position.maxScrollExtent && !_provider.isRequestCategoryLoading) {
pageNo = pageNo + 1; pageNo = pageNo + 1;
callRequestApis(showLoader: false, pageNo: pageNo); callRequestApis(showLoader: false, pageNo: pageNo);
} }

@ -1,7 +1,5 @@
//request tab page //request tab page
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/all_requests_provider.dart';
import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';

@ -22,15 +22,13 @@ class _RequestsTypeFilterState extends State<RequestsTypeFilter> {
@override @override
void initState() { void initState() {
if (widget.initialValues != null) { _selected.addAll(widget.initialValues);
_selected.addAll(widget.initialValues); super.initState();
}
super.initState();
} }
@override @override
void didUpdateWidget(covariant RequestsTypeFilter oldWidget) { void didUpdateWidget(covariant RequestsTypeFilter oldWidget) {
if ((widget.initialValues?.isEmpty ?? true) || widget.initialValues != oldWidget.initialValues) { if ((widget.initialValues.isEmpty ?? true) || widget.initialValues != oldWidget.initialValues) {
setState(() { setState(() {
_selected = widget.initialValues ?? []; _selected = widget.initialValues ?? [];
}); });

@ -2,8 +2,6 @@ import 'dart:io';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_advanced_switch/flutter_advanced_switch.dart'; import 'package:flutter_advanced_switch/flutter_advanced_switch.dart';
import 'package:local_auth/local_auth.dart';
import 'package:local_auth_android/local_auth_android.dart';
import 'package:local_auth_darwin/local_auth_darwin.dart'; import 'package:local_auth_darwin/local_auth_darwin.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@ -48,8 +46,8 @@ class _SettingsPageState extends State<SettingsPage> {
void checkForLocalAuth(bool buttonState) async { void checkForLocalAuth(bool buttonState) async {
bool authStatus = await _settingProvider!.auth.authenticate( bool authStatus = await _settingProvider!.auth.authenticate(
localizedReason: Platform.isAndroid ? "Scan your fingerprint to authenticate" : "Scan with face id to authenticate", localizedReason: Platform.isAndroid ? "Scan your fingerprint to authenticate" : "Scan with face id to authenticate",
options: AuthenticationOptions(), options: const AuthenticationOptions(),
authMessages: [IOSAuthMessages(cancelButton: 'cancel', goToSettingsButton: 'settings', goToSettingsDescription: 'Please enable Touch ID.', lockOut: 'Please reenable your Touch ID')]); authMessages: [const IOSAuthMessages(cancelButton: 'cancel', goToSettingsButton: 'settings', goToSettingsDescription: 'Please enable Touch ID.', lockOut: 'Please reenable your Touch ID')]);
if (authStatus) { if (authStatus) {
localAuth = !localAuth; localAuth = !localAuth;
await _settingProvider!.setAuth(localAuth); await _settingProvider!.setAuth(localAuth);

@ -74,7 +74,7 @@ class _SplashPageState extends State<SplashPage> {
Future<bool> checkDualAuthentication() async { Future<bool> checkDualAuthentication() async {
return await _settingProvider.auth.authenticate( return await _settingProvider.auth.authenticate(
localizedReason: Platform.isAndroid ? "Scan your fingerprint to authenticate" : "Scan with face id to authenticate", localizedReason: Platform.isAndroid ? "Scan your fingerprint to authenticate" : "Scan with face id to authenticate",
options: AuthenticationOptions(), options: const AuthenticationOptions(),
); );
} }

@ -21,14 +21,14 @@ import 'package:test_sa/views/widgets/requests/request_status.dart';
class ActivitiesListView extends StatelessWidget { class ActivitiesListView extends StatelessWidget {
static const String id = "/activities-list"; static const String id = "/activities-list";
ActivitiesListView({Key? key}) : super(key: key); const ActivitiesListView({Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
// UserProvider _userProvider = Provider.of<UserProvider>(context); // UserProvider _userProvider = Provider.of<UserProvider>(context);
// SettingProvider _settingProvider = Provider.of<SettingProvider>(context); // SettingProvider _settingProvider = Provider.of<SettingProvider>(context);
List<SearchWorkOrder> workOrders = []; List<SearchWorkOrder> workOrders = [];
UserProvider _userProvider = Provider.of<UserProvider>(context); UserProvider userProvider = Provider.of<UserProvider>(context);
return Scaffold( return Scaffold(
appBar: DefaultAppBar(title: context.translation.activities), appBar: DefaultAppBar(title: context.translation.activities),
//backgroundColor: const Color(0xfff8f9fb), //backgroundColor: const Color(0xfff8f9fb),
@ -64,7 +64,7 @@ class ActivitiesListView extends StatelessWidget {
Text(serviceRequestsProvider.currentSelectedRequest!.requestCode!, Text(serviceRequestsProvider.currentSelectedRequest!.requestCode!,
style: AppTextStyles.heading5.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)), style: AppTextStyles.heading5.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)),
Text( Text(
'${context.translation.assetName}: ${workOrders[index].callRequest!.asset!.modelDefinition!.assetName?.cleanupWhitespace?.capitalizeFirstOfEach}', '${context.translation.assetName}: ${workOrders[index].callRequest!.asset!.modelDefinition!.assetName?.cleanupWhitespace.capitalizeFirstOfEach}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
), ),
Text( Text(
@ -94,7 +94,7 @@ class ActivitiesListView extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end,
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
children: [ children: [
if (_userProvider.user!.type == UsersTypes.engineer && if (userProvider.user!.type == UsersTypes.engineer &&
serviceRequestsProvider.currentSelectedRequest?.statusValue != 5 && serviceRequestsProvider.currentSelectedRequest?.statusValue != 5 &&
serviceRequestsProvider.currentSelectedRequest?.statusValue != 3) serviceRequestsProvider.currentSelectedRequest?.statusValue != 3)
"edit".toSvgAsset(height: 48, width: 48).onPress(() { "edit".toSvgAsset(height: 48, width: 48).onPress(() {
@ -102,7 +102,7 @@ class ActivitiesListView extends StatelessWidget {
MaterialPageRoute(builder: (_) => UpdateServiceReport(request: serviceRequestsProvider.currentSelectedRequest!, workOrder: workOrders[index])), MaterialPageRoute(builder: (_) => UpdateServiceReport(request: serviceRequestsProvider.currentSelectedRequest!, workOrder: workOrders[index])),
); );
}), }),
if (_userProvider.user!.type == UsersTypes.engineer && if (userProvider.user!.type == UsersTypes.engineer &&
serviceRequestsProvider.currentSelectedRequest?.statusValue != 5 && serviceRequestsProvider.currentSelectedRequest?.statusValue != 5 &&
serviceRequestsProvider.currentSelectedRequest?.statusValue != 3) serviceRequestsProvider.currentSelectedRequest?.statusValue != 3)
8.height, 8.height,
@ -114,7 +114,7 @@ class ActivitiesListView extends StatelessWidget {
).toShadowContainer(context); ).toShadowContainer(context);
}, },
).expanded, ).expanded,
if (_userProvider.user!.type == UsersTypes.engineer && if (userProvider.user!.type == UsersTypes.engineer &&
(serviceRequestsProvider.currentSelectedRequest?.statusValue != 5 && serviceRequestsProvider.currentSelectedRequest?.statusValue != 3)) (serviceRequestsProvider.currentSelectedRequest?.statusValue != 5 && serviceRequestsProvider.currentSelectedRequest?.statusValue != 3))
AppFilledButton( AppFilledButton(
label: context.translation.createNewActivity, label: context.translation.createNewActivity,

@ -1,6 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/all_requests_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
@ -21,11 +20,11 @@ class ActivityCardView extends StatelessWidget {
final ServiceRequest serviceRequest; final ServiceRequest serviceRequest;
final bool showShadow; final bool showShadow;
ActivityCardView(this.workOrder, this.serviceRequest, {Key? key, this.showShadow = true}) : super(key: key); const ActivityCardView(this.workOrder, this.serviceRequest, {Key? key, this.showShadow = true}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
UserProvider _userProvider = Provider.of<UserProvider>(context, listen: false); UserProvider userProvider = Provider.of<UserProvider>(context, listen: false);
return Row( return Row(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
@ -41,7 +40,7 @@ class ActivityCardView extends StatelessWidget {
8.height, 8.height,
Text(serviceRequest.requestCode!, style: AppTextStyles.heading5.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)), Text(serviceRequest.requestCode!, style: AppTextStyles.heading5.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)),
Text( Text(
'${context.translation.assetName}: ${workOrder.callRequest!.asset!.modelDefinition!.assetName?.cleanupWhitespace?.capitalizeFirstOfEach}', '${context.translation.assetName}: ${workOrder.callRequest!.asset!.modelDefinition!.assetName?.cleanupWhitespace.capitalizeFirstOfEach}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
), ),
Text( Text(
@ -71,13 +70,13 @@ class ActivityCardView extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end,
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
children: [ children: [
if (_userProvider.user!.type == UsersTypes.engineer && serviceRequest.statusValue != 5 && serviceRequest.statusValue != 3) if (userProvider.user!.type == UsersTypes.engineer && serviceRequest.statusValue != 5 && serviceRequest.statusValue != 3)
"edit_icon".toSvgAsset(height: 21, width: 21).onPress(() { "edit_icon".toSvgAsset(height: 21, width: 21).onPress(() {
Navigator.of(context).push( Navigator.of(context).push(
MaterialPageRoute(builder: (_) => UpdateServiceReport(request: serviceRequest, workOrder: workOrder)), MaterialPageRoute(builder: (_) => UpdateServiceReport(request: serviceRequest, workOrder: workOrder)),
); );
}), }),
if (_userProvider.user!.type == UsersTypes.engineer && serviceRequest.statusValue != 5 && serviceRequest.statusValue != 3) 8.height, if (userProvider.user!.type == UsersTypes.engineer && serviceRequest.statusValue != 5 && serviceRequest.statusValue != 3) 8.height,
Text(workOrder.visitDate?.toServiceRequestCardFormat ?? "", Text(workOrder.visitDate?.toServiceRequestCardFormat ?? "",
textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral30 : const Color(0xFF3B3D4A))), textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral30 : const Color(0xFF3B3D4A))),
], ],

@ -12,7 +12,7 @@ import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/service_request_latest/views/components/spare_part_request.dart'; import 'package:test_sa/service_request_latest/views/components/spare_part_request.dart';
class ActivityTypeBottomSheet extends StatelessWidget { class ActivityTypeBottomSheet extends StatelessWidget {
ActivityTypeBottomSheet({Key? key}) : super(key: key); const ActivityTypeBottomSheet({Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -114,13 +114,6 @@ class ActivityTypeBottomSheet extends StatelessWidget {
// MaterialPageRoute(builder: (context) => const ScanQrView()), // MaterialPageRoute(builder: (context) => const ScanQrView()),
// ); // );
break; break;
case 2:
//push to specific screen...
// Navigator.push(
// context,
// MaterialPageRoute(builder: (context) => const ScanQrView()),
// );
break;
} }
// ScanQr // ScanQr
} }

@ -56,31 +56,27 @@ class InitialVisitBottomSheet extends StatelessWidget {
date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest?.visitDate ?? ""), date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest?.visitDate ?? ""),
formatDateWithTime: true, formatDateWithTime: true,
onDatePicker: (selectedDate) { onDatePicker: (selectedDate) {
if (selectedDate != null) { showTimePicker(
showTimePicker( context: context,
context: context, initialTime: TimeOfDay.now(),
initialTime: TimeOfDay.now(), ).then((selectedTime) {
).then((selectedTime) { // Handle the selected date and time here.
// Handle the selected date and time here. if (selectedTime != null) {
if (selectedTime != null) { DateTime selectedDateTime = DateTime(
DateTime selectedDateTime = DateTime( selectedDate.year,
selectedDate.year, selectedDate.month,
selectedDate.month, selectedDate.day,
selectedDate.day, selectedTime.hour,
selectedTime.hour, selectedTime.minute,
selectedTime.minute, );
); if (selectedDateTime.isBefore(DateTime.parse(serviceRequestProvider.currentSelectedRequest!.date!))) {
if (selectedDateTime != null) { "Visit Date time must be greater then request date".showToast;
if (selectedDateTime.isBefore(DateTime.parse(serviceRequestProvider.currentSelectedRequest!.date!))) { return;
"Visit Date time must be greater then request date".showToast;
return;
}
serviceRequestProvider.currentSelectedRequest?.visitDate = selectedDateTime?.toIso8601String();
}
} }
}); serviceRequestProvider.currentSelectedRequest?.visitDate = selectedDateTime.toIso8601String();
} }
}, });
},
), ),
// ], // ],
@ -93,29 +89,24 @@ class InitialVisitBottomSheet extends StatelessWidget {
date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest?.startDate ?? ""), date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest?.startDate ?? ""),
formatDateWithTime: true, formatDateWithTime: true,
onDatePicker: (selectedDate) { onDatePicker: (selectedDate) {
if (selectedDate != null) { showTimePicker(
showTimePicker( context: context,
context: context, initialTime: TimeOfDay.now(),
initialTime: TimeOfDay.now(), ).then((selectedTime) {
).then((selectedTime) { // Handle the selected date and time here.
// Handle the selected date and time here. if (selectedTime != null) {
if (selectedTime != null) { DateTime selectedDateTime = DateTime(
DateTime selectedDateTime = DateTime( selectedDate.year,
selectedDate.year, selectedDate.month,
selectedDate.month, selectedDate.day,
selectedDate.day, selectedTime.hour,
selectedTime.hour, selectedTime.minute,
selectedTime.minute, );
); serviceRequestProvider.currentSelectedRequest?.startDate = selectedDateTime.toIso8601String();
if (selectedDateTime != null) {
serviceRequestProvider.currentSelectedRequest?.startDate = selectedDateTime?.toIso8601String();
} }
} });
}); },
}
},
).expanded, ).expanded,
8.width, 8.width,
ADatePicker( ADatePicker(
@ -123,29 +114,25 @@ class InitialVisitBottomSheet extends StatelessWidget {
date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest?.endDate ?? ""), date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest?.endDate ?? ""),
formatDateWithTime: true, formatDateWithTime: true,
onDatePicker: (selectedDate) { onDatePicker: (selectedDate) {
if (selectedDate != null) { showTimePicker(
showTimePicker( context: context,
context: context, initialTime: TimeOfDay.now(),
initialTime: TimeOfDay.now(), ).then((selectedTime) {
).then((selectedTime) { // Handle the selected date and time here.
// Handle the selected date and time here. if (selectedTime != null) {
if (selectedTime != null) { DateTime selectedDateTime = DateTime(
DateTime selectedDateTime = DateTime( selectedDate.year,
selectedDate.year, selectedDate.month,
selectedDate.month, selectedDate.day,
selectedDate.day, selectedTime.hour,
selectedTime.hour, selectedTime.minute,
selectedTime.minute, );
); serviceRequestProvider.currentSelectedRequest?.endDate = selectedDateTime.toIso8601String();
if (selectedDateTime != null) { serviceRequestProvider.currentSelectedRequest?.workingHours =
serviceRequestProvider.currentSelectedRequest?.endDate = selectedDateTime?.toIso8601String(); (((DateTime.parse(serviceRequestProvider.currentSelectedRequest!.endDate!).difference(DateTime.parse(serviceRequestProvider.currentSelectedRequest!.startDate!)).inSeconds ?? 0) / 60) / 60).toStringAsFixed(2);
serviceRequestProvider.currentSelectedRequest?.workingHours = }
(((DateTime.parse(serviceRequestProvider.currentSelectedRequest!.endDate!).difference(DateTime.parse(serviceRequestProvider.currentSelectedRequest!.startDate!)).inSeconds ?? 0) / 60) / 60).toStringAsFixed(2); });
} },
}
});
}
},
).expanded, ).expanded,
], ],
) )
@ -199,7 +186,7 @@ class InitialVisitBottomSheet extends StatelessWidget {
// await snapshot.updateRequest(user: userProvider.user, request: serviceRequestProvider.serviceRequest); // await snapshot.updateRequest(user: userProvider.user, request: serviceRequestProvider.serviceRequest);
// Navigator.pop(context, true); // Navigator.pop(context, true);
Navigator.of(context).push(MaterialPageRoute( Navigator.of(context).push(MaterialPageRoute(
builder: (_) => VerifyArrivalView())); builder: (_) => const VerifyArrivalView()));
}, },
), ),
), ),

@ -228,7 +228,7 @@ import '../../../../new_views/common_widgets/app_text_form_field.dart';
class ServiceRequestBottomSheet { class ServiceRequestBottomSheet {
static Future fixRemotelyBottomSheet({required BuildContext context}) { static Future fixRemotelyBottomSheet({required BuildContext context}) {
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> formKey = GlobalKey<FormState>();
return showModalBottomSheet( return showModalBottomSheet(
context: context, context: context,
useSafeArea: true, useSafeArea: true,
@ -244,7 +244,7 @@ class ServiceRequestBottomSheet {
), ),
padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight), padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight),
child: Form( child: Form(
key: _formKey, key: formKey,
child: SingleChildScrollView( child: SingleChildScrollView(
child: StatefulBuilder(builder: (context, setState) { child: StatefulBuilder(builder: (context, setState) {
return Column( return Column(
@ -270,35 +270,31 @@ class ServiceRequestBottomSheet {
date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest?.startDate ?? ""), date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest?.startDate ?? ""),
formatDateWithTime: true, formatDateWithTime: true,
onDatePicker: (selectedDate) { onDatePicker: (selectedDate) {
if (selectedDate != null) { showTimePicker(
showTimePicker( context: context,
context: context, initialTime: TimeOfDay.now(),
initialTime: TimeOfDay.now(), ).then((selectedTime) {
).then((selectedTime) { // Handle the selected date and time here.
// Handle the selected date and time here. if (selectedTime != null) {
if (selectedTime != null) { DateTime selectedDateTime = DateTime(
DateTime selectedDateTime = DateTime( selectedDate.year,
selectedDate.year, selectedDate.month,
selectedDate.month, selectedDate.day,
selectedDate.day, selectedTime.hour,
selectedTime.hour, selectedTime.minute,
selectedTime.minute, );
); if (selectedDateTime.isBefore(DateTime.parse(serviceRequestProvider.currentSelectedRequest!.date!))) {
if (selectedDateTime != null) { "Visit Date time must be greater then request date".showToast;
if (selectedDateTime.isBefore(DateTime.parse(serviceRequestProvider.currentSelectedRequest!.date!))) { return;
"Visit Date time must be greater then request date".showToast;
return;
}
setState(() {
serviceRequestProvider.currentSelectedRequest?.startDate = selectedDateTime?.toIso8601String();
});
print('start date i got is ${serviceRequestProvider.currentSelectedRequest?.startDate}');
}
} }
});
} setState(() {
}, serviceRequestProvider.currentSelectedRequest?.startDate = selectedDateTime.toIso8601String();
});
print('start date i got is ${serviceRequestProvider.currentSelectedRequest?.startDate}');
}
});
},
), ),
// ATimePicker( // ATimePicker(
@ -432,7 +428,7 @@ class ServiceRequestBottomSheet {
} }
static Future initialVisitBottomSheet({required BuildContext context}) { static Future initialVisitBottomSheet({required BuildContext context}) {
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> formKey = GlobalKey<FormState>();
return showModalBottomSheet( return showModalBottomSheet(
context: context, context: context,
useSafeArea: true, useSafeArea: true,
@ -448,7 +444,7 @@ class ServiceRequestBottomSheet {
), ),
padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight), padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight),
child: Form( child: Form(
key: _formKey, key: formKey,
child: SingleChildScrollView( child: SingleChildScrollView(
child: Column( child: Column(
children: [ children: [
@ -468,25 +464,21 @@ class ServiceRequestBottomSheet {
date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest?.visitDate ?? ""), date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest?.visitDate ?? ""),
formatDateWithTime: true, formatDateWithTime: true,
onDatePicker: (selectedDate) { onDatePicker: (selectedDate) {
if (selectedDate != null) { showTimePicker(
showTimePicker( context: context,
context: context, initialTime: TimeOfDay.now(),
initialTime: TimeOfDay.now(), ).then((selectedTime) {
).then((selectedTime) { // Handle the selected date and time here.
// Handle the selected date and time here. if (selectedTime != null) {
if (selectedTime != null) { DateTime selectedDateTime = DateTime(selectedDate.year, selectedDate.month, selectedDate.day, selectedTime.hour, selectedTime.minute);
DateTime selectedDateTime = DateTime(selectedDate.year, selectedDate.month, selectedDate.day, selectedTime.hour, selectedTime.minute); if (selectedDateTime.isBefore(DateTime.parse(serviceRequestProvider.currentSelectedRequest!.date!))) {
if (selectedDateTime != null) { "Visit Date time must be greater then request date".showToast;
if (selectedDateTime.isBefore(DateTime.parse(serviceRequestProvider.currentSelectedRequest!.date!))) { return;
"Visit Date time must be greater then request date".showToast;
return;
}
serviceRequestProvider.currentSelectedRequest?.visitDate = selectedDateTime?.toIso8601String();
}
} }
}); serviceRequestProvider.currentSelectedRequest?.visitDate = selectedDateTime.toIso8601String();
} }
}, });
},
), ),
// ], // ],
@ -499,27 +491,23 @@ class ServiceRequestBottomSheet {
date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest?.startDate ?? ""), date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest?.startDate ?? ""),
formatDateWithTime: true, formatDateWithTime: true,
onDatePicker: (selectedDate) { onDatePicker: (selectedDate) {
if (selectedDate != null) { showTimePicker(
showTimePicker( context: context,
context: context, initialTime: TimeOfDay.now(),
initialTime: TimeOfDay.now(), ).then((selectedTime) {
).then((selectedTime) { // Handle the selected date and time here.
// Handle the selected date and time here. if (selectedTime != null) {
if (selectedTime != null) { DateTime selectedDateTime = DateTime(
DateTime selectedDateTime = DateTime( selectedDate.year,
selectedDate.year, selectedDate.month,
selectedDate.month, selectedDate.day,
selectedDate.day, selectedTime.hour,
selectedTime.hour, selectedTime.minute,
selectedTime.minute, );
); serviceRequestProvider.currentSelectedRequest?.startDate = selectedDateTime.toIso8601String();
if (selectedDateTime != null) { }
serviceRequestProvider.currentSelectedRequest?.startDate = selectedDateTime?.toIso8601String(); });
} },
}
});
}
},
).expanded, ).expanded,
8.width, 8.width,
ADatePicker( ADatePicker(
@ -527,28 +515,24 @@ class ServiceRequestBottomSheet {
date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest?.endDate ?? ""), date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest?.endDate ?? ""),
formatDateWithTime: true, formatDateWithTime: true,
onDatePicker: (selectedDate) { onDatePicker: (selectedDate) {
if (selectedDate != null) { showTimePicker(
showTimePicker( context: context,
context: context, initialTime: TimeOfDay.now(),
initialTime: TimeOfDay.now(), ).then((selectedTime) {
).then((selectedTime) { // Handle the selected date and time here.
// Handle the selected date and time here. if (selectedTime != null) {
if (selectedTime != null) { DateTime selectedDateTime = DateTime(selectedDate.year, selectedDate.month, selectedDate.day, selectedTime.hour, selectedTime.minute);
DateTime selectedDateTime = DateTime(selectedDate.year, selectedDate.month, selectedDate.day, selectedTime.hour, selectedTime.minute); serviceRequestProvider.currentSelectedRequest?.endDate = selectedDateTime.toIso8601String();
if (selectedDateTime != null) { serviceRequestProvider.currentSelectedRequest?.workingHours = (((DateTime.parse(serviceRequestProvider.currentSelectedRequest!.endDate!)
serviceRequestProvider.currentSelectedRequest?.endDate = selectedDateTime?.toIso8601String(); .difference(DateTime.parse(serviceRequestProvider.currentSelectedRequest!.startDate!))
serviceRequestProvider.currentSelectedRequest?.workingHours = (((DateTime.parse(serviceRequestProvider.currentSelectedRequest!.endDate!) .inSeconds ??
.difference(DateTime.parse(serviceRequestProvider.currentSelectedRequest!.startDate!)) 0) /
.inSeconds ?? 60) /
0) / 60)
60) / .toStringAsFixed(2);
60) }
.toStringAsFixed(2); });
} },
}
});
}
},
).expanded, ).expanded,
], ],
) )
@ -571,11 +555,11 @@ class ServiceRequestBottomSheet {
label: context.translation.save, label: context.translation.save,
loading: snapshot.isLoading ?? false, loading: snapshot.isLoading ?? false,
onPressed: () async { onPressed: () async {
_formKey.currentState!.save(); formKey.currentState!.save();
// await snapshot.updateRequest(user: userProvider.user, request: serviceRequestProvider.serviceRequest); // await snapshot.updateRequest(user: userProvider.user, request: serviceRequestProvider.serviceRequest);
// Navigator.pop(context, true); // Navigator.pop(context, true);
Navigator.of(context).push(MaterialPageRoute(builder: (_) => VerifyArrivalView())); Navigator.of(context).push(MaterialPageRoute(builder: (_) => const VerifyArrivalView()));
}, },
), ),
), ),
@ -589,7 +573,7 @@ class ServiceRequestBottomSheet {
} }
static Future rejectRequestBottomSheet({required BuildContext context}) { static Future rejectRequestBottomSheet({required BuildContext context}) {
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> formKey = GlobalKey<FormState>();
final userProvider = Provider.of<UserProvider>(context, listen: false); final userProvider = Provider.of<UserProvider>(context, listen: false);
return showModalBottomSheet( return showModalBottomSheet(
context: context, context: context,
@ -606,7 +590,7 @@ class ServiceRequestBottomSheet {
), ),
padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight), padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight),
child: Form( child: Form(
key: _formKey, key: formKey,
child: SingleChildScrollView( child: SingleChildScrollView(
child: Column( child: Column(
children: [ children: [
@ -652,7 +636,7 @@ class ServiceRequestBottomSheet {
showBorder: true, showBorder: true,
loading: snapshot.isLoading ?? false, loading: snapshot.isLoading ?? false,
onPressed: () async { onPressed: () async {
_formKey.currentState!.save(); formKey.currentState!.save();
// serviceRequestProvider.serviceRequest.device = asset; // serviceRequestProvider.serviceRequest.device = asset;
await snapshot.updateRequest(user: userProvider.user!, request: serviceRequestProvider.currentSelectedRequest!); await snapshot.updateRequest(user: userProvider.user!, request: serviceRequestProvider.currentSelectedRequest!);
Navigator.pop(context, true); Navigator.pop(context, true);
@ -724,13 +708,6 @@ class ServiceRequestBottomSheet {
// MaterialPageRoute(builder: (context) => const ScanQrView()), // MaterialPageRoute(builder: (context) => const ScanQrView()),
// ); // );
break; break;
case 2:
//push to specific screen...
// Navigator.push(
// context,
// MaterialPageRoute(builder: (context) => const ScanQrView()),
// );
break;
} }
// ScanQr // ScanQr
} }
@ -780,7 +757,7 @@ class ServiceRequestBottomSheet {
} }
static Future actionBottomSheet({required BuildContext context, required String title, String? noButtonText, String? yesButtonText, VoidCallback? onNoPressed, VoidCallback? onYesPressed}) { static Future actionBottomSheet({required BuildContext context, required String title, String? noButtonText, String? yesButtonText, VoidCallback? onNoPressed, VoidCallback? onYesPressed}) {
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> formKey = GlobalKey<FormState>();
final userProvider = Provider.of<UserProvider>(context, listen: false); final userProvider = Provider.of<UserProvider>(context, listen: false);
return showModalBottomSheet( return showModalBottomSheet(
context: context, context: context,

@ -5,7 +5,6 @@ import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
import 'package:test_sa/views/widgets/requests/request_status.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart';
class HistoryLogView extends StatelessWidget { class HistoryLogView extends StatelessWidget {

@ -54,19 +54,19 @@ class _RequestDetailViewState extends State<RequestDetailView> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
UserProvider _userProvider = Provider.of<UserProvider>(context, listen: false); UserProvider userProvider = Provider.of<UserProvider>(context, listen: false);
return !widget.fromTabView return !widget.fromTabView
? Scaffold( ? Scaffold(
appBar: DefaultAppBar(title: context.translation.serviceDetails), appBar: DefaultAppBar(title: context.translation.serviceDetails),
body: Padding( body: Padding(
padding: EdgeInsets.only(top: 12.toScreenHeight), padding: EdgeInsets.only(top: 12.toScreenHeight),
child: Consumer<ServiceRequestsProvider>(builder: (context, serviceRequestsProvider, child) { child: Consumer<ServiceRequestsProvider>(builder: (context, serviceRequestsProvider, child) {
return requestDetailCard(serviceRequestsProvider: serviceRequestsProvider, userProvider: _userProvider); return requestDetailCard(serviceRequestsProvider: serviceRequestsProvider, userProvider: userProvider);
}), }),
), ),
) )
: Consumer<ServiceRequestsProvider>(builder: (context, serviceRequestsProvider, child) { : Consumer<ServiceRequestsProvider>(builder: (context, serviceRequestsProvider, child) {
return requestDetailCard(serviceRequestsProvider: serviceRequestsProvider, userProvider: _userProvider); return requestDetailCard(serviceRequestsProvider: serviceRequestsProvider, userProvider: userProvider);
}); });
} }
@ -247,7 +247,7 @@ class _RequestDetailViewState extends State<RequestDetailView> {
style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
), ),
8.height, 8.height,
'${context.translation.assetName}: ${serviceRequest.deviceEnName?.cleanupWhitespace?.capitalizeFirstOfEach}'.bodyText(context), '${context.translation.assetName}: ${serviceRequest.deviceEnName?.cleanupWhitespace.capitalizeFirstOfEach}'.bodyText(context),
// 8.height, // 8.height,
Text( Text(
'${context.translation.assetNumber}: ${serviceRequest.device?.assetNumber}', '${context.translation.assetNumber}: ${serviceRequest.device?.assetNumber}',
@ -259,31 +259,31 @@ class _RequestDetailViewState extends State<RequestDetailView> {
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
), ),
Text( Text(
'${context.translation.manufacture}: ${serviceRequest.device!.modelDefinition?.manufacturerName?.cleanupWhitespace?.capitalizeFirstOfEach}', '${context.translation.manufacture}: ${serviceRequest.device!.modelDefinition?.manufacturerName?.cleanupWhitespace.capitalizeFirstOfEach}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
), ),
Text( Text(
'${context.translation.model}: ${serviceRequest.device!.modelDefinition?.modelName?.cleanupWhitespace?.capitalizeFirstOfEach}', '${context.translation.model}: ${serviceRequest.device!.modelDefinition?.modelName?.cleanupWhitespace.capitalizeFirstOfEach}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
), ),
Text( Text(
'${context.translation.site}: ${serviceRequest.device!.site?.custName?.cleanupWhitespace?.capitalizeFirstOfEach}', '${context.translation.site}: ${serviceRequest.device!.site?.custName?.cleanupWhitespace.capitalizeFirstOfEach}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
), ),
Text( Text(
'${context.translation.building}: ${serviceRequest.device!.building?.name?.cleanupWhitespace?.capitalizeFirstOfEach}', '${context.translation.building}: ${serviceRequest.device!.building?.name?.cleanupWhitespace.capitalizeFirstOfEach}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
), ),
Text( Text(
'${context.translation.floor}: ${serviceRequest.device!.floor?.name?.cleanupWhitespace?.capitalizeFirstOfEach ?? ""}', '${context.translation.floor}: ${serviceRequest.device!.floor?.name?.cleanupWhitespace.capitalizeFirstOfEach ?? ""}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
), ),
Text( Text(
'${context.translation.department}: ${serviceRequest.device!.department?.departmentName?.cleanupWhitespace?.capitalizeFirstOfEach}', '${context.translation.department}: ${serviceRequest.device!.department?.departmentName?.cleanupWhitespace.capitalizeFirstOfEach}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
), ),
Text( Text(
'${context.translation.room}: ${(serviceRequest.device!.room?.name ?? "").cleanupWhitespace?.capitalizeFirstOfEach}', '${context.translation.room}: ${(serviceRequest.device!.room?.name ?? "").cleanupWhitespace.capitalizeFirstOfEach}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
), ),
], ],

@ -60,7 +60,7 @@ class _ScanQrViewState extends State<ScanQrView> {
overlay: QrScannerOverlayShape(borderColor: Colors.red, borderRadius: 10, borderLength: 30, borderWidth: 10, cutOutSize: 280), overlay: QrScannerOverlayShape(borderColor: Colors.red, borderRadius: 10, borderLength: 30, borderWidth: 10, cutOutSize: 280),
), ),
Padding( Padding(
padding: EdgeInsets.all(12.0), padding: const EdgeInsets.all(12.0),
child: SizedBox( child: SizedBox(
height: 100.toScreenHeight, height: 100.toScreenHeight,
child: DefaultAppBar(title: context.translation.scanQr)), child: DefaultAppBar(title: context.translation.scanQr)),

@ -10,7 +10,6 @@ import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/device/asset.dart';
import 'package:test_sa/models/service_request/service_report.dart'; import 'package:test_sa/models/service_request/service_report.dart';
import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
@ -110,7 +109,7 @@ class _SparePartRequestState extends State<SparePartRequest> with TickerProvider
} }
_serviceReport.assetType = _assetTypeProvider.statuses?.firstWhere( _serviceReport.assetType = _assetTypeProvider.statuses?.firstWhere(
(element) => element.value == _serviceReport.callRequest?.assetType, (element) => element.value == _serviceReport.callRequest?.assetType,
orElse: null, orElse: null,
); );
return Scaffold( return Scaffold(
@ -157,7 +156,7 @@ class _SparePartRequestState extends State<SparePartRequest> with TickerProvider
contentPadding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 20.toScreenHeight), contentPadding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 20.toScreenHeight),
showWithoutDecoration: true, showWithoutDecoration: true,
backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90, backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90,
enable: serviceRequestProvider.initialSelectedSparePart != null && serviceRequestProvider.initialSelectedSparePart.sparePart?.id != null, enable: serviceRequestProvider.initialSelectedSparePart.sparePart?.id != null,
validator: (value) => value == null || value.isEmpty validator: (value) => value == null || value.isEmpty
? context.translation.requiredField ? context.translation.requiredField
: Validator.isNumeric(value) : Validator.isNumeric(value)
@ -175,7 +174,7 @@ class _SparePartRequestState extends State<SparePartRequest> with TickerProvider
contentPadding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 20.toScreenHeight), contentPadding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 20.toScreenHeight),
showWithoutDecoration: true, showWithoutDecoration: true,
backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90, backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90,
enable: serviceRequestProvider.initialSelectedSparePart != null && serviceRequestProvider.initialSelectedSparePart.sparePart?.id != null, enable: serviceRequestProvider.initialSelectedSparePart.sparePart?.id != null,
validator: (value) => value == null || value.isEmpty validator: (value) => value == null || value.isEmpty
? context.translation.requiredField ? context.translation.requiredField
: Validator.isNumeric(value) : Validator.isNumeric(value)

@ -13,7 +13,7 @@ import 'package:test_sa/service_request_latest/views/components/scan_qr_view.dar
import 'activities_list_view.dart'; import 'activities_list_view.dart';
class VerifyArrivalView extends StatelessWidget { class VerifyArrivalView extends StatelessWidget {
VerifyArrivalView({Key? key}) : super(key: key); const VerifyArrivalView({Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -83,7 +83,7 @@ class VerifyArrivalView extends StatelessWidget {
//push to specific screen... //push to specific screen...
Navigator.push( Navigator.push(
context, context,
MaterialPageRoute(builder: (context) => ActivitiesListView()), MaterialPageRoute(builder: (context) => const ActivitiesListView()),
); );
break; break;
case 2: case 2:
@ -93,13 +93,6 @@ class VerifyArrivalView extends StatelessWidget {
// MaterialPageRoute(builder: (context) => const ScanQrView()), // MaterialPageRoute(builder: (context) => const ScanQrView()),
// ); // );
break; break;
case 2:
//push to specific screen...
// Navigator.push(
// context,
// MaterialPageRoute(builder: (context) => const ScanQrView()),
// );
break;
} }
// ScanQr // ScanQr
} }

@ -4,10 +4,8 @@ import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/timer_model.dart';
import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart'; import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
import 'package:test_sa/views/widgets/timer/app_timer.dart';
class VerifyOtpView extends StatelessWidget { class VerifyOtpView extends StatelessWidget {
const VerifyOtpView({Key? key}) : super(key: key); const VerifyOtpView({Key? key}) : super(key: key);

@ -44,14 +44,14 @@ class _AssetFilterScreenState extends State<AssetFilterScreen> {
WidgetsFlutterBinding.ensureInitialized().addPostFrameCallback((timeStamp) async { WidgetsFlutterBinding.ensureInitialized().addPostFrameCallback((timeStamp) async {
loading = true; loading = true;
setState(() {}); setState(() {});
startDate = filter!.supplyDateFrom; startDate = filter.supplyDateFrom;
endDate = filter!.supplyDateTo; endDate = filter.supplyDateTo;
final departmentProvider = Provider.of<DepartmentProvider>(context, listen: false); final departmentProvider = Provider.of<DepartmentProvider>(context, listen: false);
final siteProvider = Provider.of<SiteProvider>(context, listen: false); final siteProvider = Provider.of<SiteProvider>(context, listen: false);
if (departmentProvider?.items?.isEmpty ?? true) await departmentProvider.getDate(); if (departmentProvider.items.isEmpty ?? true) await departmentProvider.getDate();
if (siteProvider?.items?.isEmpty ?? true) await siteProvider.getDate(); if (siteProvider.items.isEmpty ?? true) await siteProvider.getDate();
_department = departmentProvider.items?.firstWhere((element) => element.name == filter?.department, orElse: null); _department = departmentProvider.items.firstWhere((element) => element.name == filter.department, orElse: null);
_site = siteProvider.items?.firstWhere((element) => element.name == filter?.site, orElse: null); _site = siteProvider.items.firstWhere((element) => element.name == filter.site, orElse: null);
loading = false; loading = false;
setState(() {}); setState(() {});
}); });
@ -133,7 +133,7 @@ class _AssetFilterScreenState extends State<AssetFilterScreen> {
date: DateTime.tryParse(startDate ?? ""), date: DateTime.tryParse(startDate ?? ""),
onDatePicker: (date) { onDatePicker: (date) {
setState(() { setState(() {
startDate = date?.toIso8601String(); startDate = date.toIso8601String();
}); });
}, },
).expanded, ).expanded,
@ -144,7 +144,7 @@ class _AssetFilterScreenState extends State<AssetFilterScreen> {
date: DateTime.tryParse(endDate ?? ""), date: DateTime.tryParse(endDate ?? ""),
onDatePicker: (date) { onDatePicker: (date) {
setState(() { setState(() {
endDate = date?.toIso8601String(); endDate = date.toIso8601String();
}); });
}, },
).expanded, ).expanded,

@ -43,15 +43,15 @@ class _AssetSearchScreenState extends State<AssetSearchScreen> {
@override @override
void dispose() { void dispose() {
_assetNameController?.dispose(); _assetNameController.dispose();
_assetNumberController?.dispose(); _assetNumberController.dispose();
_snController?.dispose(); _snController.dispose();
_modelController?.dispose(); _modelController.dispose();
_supplierController?.dispose(); _supplierController.dispose();
_siteController?.dispose(); _siteController.dispose();
_siteController?.dispose(); _siteController.dispose();
_manufactureController?.dispose(); _manufactureController.dispose();
_mdController?.dispose(); _mdController.dispose();
super.dispose(); super.dispose();
} }
@ -237,13 +237,13 @@ class _AssetSearchScreenState extends State<AssetSearchScreen> {
} }
bool _showResetButton() { bool _showResetButton() {
return (_assetNameController?.text?.isNotEmpty ?? false) || return (_assetNameController.text.isNotEmpty ?? false) ||
(_assetNumberController?.text?.isNotEmpty ?? false) || (_assetNumberController.text.isNotEmpty ?? false) ||
(_snController?.text?.isNotEmpty ?? false) || (_snController.text.isNotEmpty ?? false) ||
(_modelController?.text?.isNotEmpty ?? false) || (_modelController.text.isNotEmpty ?? false) ||
(_supplierController?.text?.isNotEmpty ?? false) || (_supplierController.text.isNotEmpty ?? false) ||
(_siteController?.text?.isNotEmpty ?? false) || (_siteController.text.isNotEmpty ?? false) ||
(_manufactureController?.text?.isNotEmpty ?? false) || (_manufactureController.text.isNotEmpty ?? false) ||
(_mdController?.text?.isNotEmpty ?? false); (_mdController.text.isNotEmpty ?? false);
} }
} }

@ -29,7 +29,7 @@ class DeviceTransferDetails extends StatefulWidget {
class _DeviceTransferDetailsState extends State<DeviceTransferDetails> { class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
UserProvider? _userProvider; UserProvider? _userProvider;
AssetTransfer? _model; AssetTransfer? _model;
bool _isLoading = false; final bool _isLoading = false;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(); final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
@ -73,7 +73,7 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
Column( Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
_buildTextWidget('${context.translation.assetName} : ${_model?.assetName?.cleanupWhitespace?.capitalizeFirstOfEach ?? ""}'), _buildTextWidget('${context.translation.assetName} : ${_model?.assetName?.cleanupWhitespace.capitalizeFirstOfEach ?? ""}'),
_buildTextWidget('${context.translation.assetNumber} : ${_model?.assetNumber ?? ""}'), _buildTextWidget('${context.translation.assetNumber} : ${_model?.assetNumber ?? ""}'),
_buildTextWidget('${context.translation.model} : ${_model?.modelName ?? ""}'), _buildTextWidget('${context.translation.model} : ${_model?.modelName ?? ""}'),
_buildTextWidget('${context.translation.sn} : ${_model?.assetSerialNo ?? ""}'), _buildTextWidget('${context.translation.sn} : ${_model?.assetSerialNo ?? ""}'),
@ -122,10 +122,10 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
// sender card // sender card
_buildCard( _buildCard(
isSender: true, isSender: true,
site: _model?.senderSiteName?.cleanupWhitespace?.capitalizeFirstOfEach ?? "", site: _model?.senderSiteName?.cleanupWhitespace.capitalizeFirstOfEach ?? "",
/// TBD /// TBD
unit: _model?.senderDepartmentName?.cleanupWhitespace?.capitalizeFirstOfEach ?? "", unit: _model?.senderDepartmentName?.cleanupWhitespace.capitalizeFirstOfEach ?? "",
comment: _model?.senderComment ?? "", comment: _model?.senderComment ?? "",
/// TBD /// TBD
@ -142,10 +142,10 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
// receiver card // receiver card
_buildCard( _buildCard(
isSender: false, isSender: false,
site: _model?.destSiteName?.cleanupWhitespace?.capitalizeFirstOfEach ?? "", site: _model?.destSiteName?.cleanupWhitespace.capitalizeFirstOfEach ?? "",
/// TBD /// TBD
unit: _model?.destDepartmentName?.cleanupWhitespace?.capitalizeFirstOfEach ?? "", unit: _model?.destDepartmentName?.cleanupWhitespace.capitalizeFirstOfEach ?? "",
comment: _model?.receiverComment ?? "", comment: _model?.receiverComment ?? "",
/// TBD /// TBD
@ -214,7 +214,7 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
), ),
_buildTextWidget('${context.translation.site} : $site'), _buildTextWidget('${context.translation.site} : $site'),
_buildTextWidget('${context.translation.department} : $unit'), _buildTextWidget('${context.translation.department} : $unit'),
if (comment != null && comment.isNotEmpty) ...[ if (comment.isNotEmpty) ...[
8.height, 8.height,
const Divider().defaultStyle(context), const Divider().defaultStyle(context),
8.height, 8.height,

@ -72,7 +72,7 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
@override @override
void dispose() { void dispose() {
_requestedQuantityController.dispose(); _requestedQuantityController.dispose();
_deviceTransferProvider!.reset(); _deviceTransferProvider.reset();
_receiverNameController.dispose(); _receiverNameController.dispose();
_commentsController.dispose(); _commentsController.dispose();
super.dispose(); super.dispose();
@ -111,7 +111,7 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
SingleItemDropDownMenu<Site, SiteProvider>( SingleItemDropDownMenu<Site, SiteProvider>(
context: context, context: context,
title: context.translation.destinationSite, title: context.translation.destinationSite,
initialValue: _assetDestination?.site, initialValue: _assetDestination.site,
onSelect: (value) { onSelect: (value) {
_assetDestination.site = value; _assetDestination.site = value;
_assetDestination.building = null; _assetDestination.building = null;
@ -127,13 +127,13 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
SingleItemDropDownMenu<Building, NullableLoadingProvider>( SingleItemDropDownMenu<Building, NullableLoadingProvider>(
context: context, context: context,
title: context.translation.building, title: context.translation.building,
initialValue: _assetDestination?.building, initialValue: _assetDestination.building,
enabled: _assetDestination?.site?.buildings?.isNotEmpty ?? false, enabled: _assetDestination.site?.buildings?.isNotEmpty ?? false,
staticData: _assetDestination?.site?.buildings ?? [], staticData: _assetDestination.site?.buildings ?? [],
onSelect: (value) { onSelect: (value) {
_assetDestination?.building = value; _assetDestination.building = value;
_assetDestination?.floor = null; _assetDestination.floor = null;
_assetDestination?.department = null; _assetDestination.department = null;
setState(() {}); setState(() {});
}, },
), ),
@ -141,12 +141,12 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
SingleItemDropDownMenu<Floor, NullableLoadingProvider>( SingleItemDropDownMenu<Floor, NullableLoadingProvider>(
context: context, context: context,
title: context.translation.floor, title: context.translation.floor,
initialValue: _assetDestination?.floor, initialValue: _assetDestination.floor,
enabled: _assetDestination?.building?.floors?.isNotEmpty ?? false, enabled: _assetDestination.building?.floors?.isNotEmpty ?? false,
staticData: _assetDestination?.building?.floors ?? [], staticData: _assetDestination.building?.floors ?? [],
onSelect: (value) { onSelect: (value) {
_assetDestination?.floor = value; _assetDestination.floor = value;
_assetDestination?.department = null; _assetDestination.department = null;
setState(() {}); setState(() {});
}, },
), ),
@ -154,12 +154,12 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
SingleItemDropDownMenu<Department, NullableLoadingProvider>( SingleItemDropDownMenu<Department, NullableLoadingProvider>(
context: context, context: context,
title: context.translation.department, title: context.translation.department,
initialValue: _assetDestination?.department, initialValue: _assetDestination.department,
enabled: _assetDestination?.floor?.departments?.isNotEmpty ?? false, enabled: _assetDestination.floor?.departments?.isNotEmpty ?? false,
staticData: _assetDestination?.floor?.departments ?? [], staticData: _assetDestination.floor?.departments ?? [],
onSelect: (value) { onSelect: (value) {
_assetDestination?.department = value; _assetDestination.department = value;
_assetDestination?.room = null; _assetDestination.room = null;
setState(() {}); setState(() {});
}, },
), ),
@ -167,11 +167,11 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
SingleItemDropDownMenu<Rooms, NullableLoadingProvider>( SingleItemDropDownMenu<Rooms, NullableLoadingProvider>(
context: context, context: context,
title: context.translation.room, title: context.translation.room,
initialValue: _assetDestination?.room, initialValue: _assetDestination.room,
enabled: _assetDestination?.department?.rooms?.isNotEmpty ?? false, enabled: _assetDestination.department?.rooms?.isNotEmpty ?? false,
staticData: _assetDestination?.department?.rooms ?? [], staticData: _assetDestination.department?.rooms ?? [],
onSelect: (value) { onSelect: (value) {
_assetDestination?.room = value; _assetDestination.room = value;
setState(() {}); setState(() {});
}, },
), ),

@ -32,7 +32,7 @@ class _SearchAssetPageState extends State<SearchAssetPage> {
AssetSearch? search; AssetSearch? search;
late TextEditingController _searchController; late TextEditingController _searchController;
late AssetProvider _deviceProvider; late AssetProvider _deviceProvider;
List<Asset> _searchableList = []; final List<Asset> _searchableList = [];
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
bool _isFirst = true; bool _isFirst = true;
@ -138,7 +138,7 @@ class _SearchAssetPageState extends State<SearchAssetPage> {
child: ListView.separated( child: ListView.separated(
itemCount: _searchableList.length, itemCount: _searchableList.length,
separatorBuilder: (listContext, itemIndex) => 8.height, separatorBuilder: (listContext, itemIndex) => 8.height,
padding: EdgeInsets.all(16), padding: const EdgeInsets.all(16),
itemBuilder: (listContext, itemIndex) { itemBuilder: (listContext, itemIndex) {
return AssetItemListView( return AssetItemListView(
device: _searchableList[itemIndex], device: _searchableList[itemIndex],

@ -41,7 +41,7 @@ class UpdateDeviceTransfer extends StatefulWidget {
} }
class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> { class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
bool _isLoading = false; final bool _isLoading = false;
bool _validate = false; bool _validate = false;
late UserProvider _userProvider; late UserProvider _userProvider;
late SettingProvider _settingProvider; late SettingProvider _settingProvider;
@ -75,11 +75,11 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
); );
} }
if (_formModel?.tbsTimer?.startAt == null) { if (_formModel.tbsTimer?.startAt == null) {
await Fluttertoast.showToast(msg: "Working Hours Required"); await Fluttertoast.showToast(msg: "Working Hours Required");
return false; return false;
} }
if (_formModel?.tbsTimer?.endAt == null || isTimerRunning) { if (_formModel.tbsTimer?.endAt == null || isTimerRunning) {
await Fluttertoast.showToast(msg: "Please Stop The Timer"); await Fluttertoast.showToast(msg: "Please Stop The Timer");
return false; return false;
} }
@ -148,8 +148,8 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
: (widget.model.receiverVisitTimers?.fold(0.0, (sum, item) => (sum ?? 0) + DateTime.parse(item.endDateTime!).difference(DateTime.parse(item.startDateTime!)).inSeconds) ?? 0); : (widget.model.receiverVisitTimers?.fold(0.0, (sum, item) => (sum ?? 0) + DateTime.parse(item.endDateTime!).difference(DateTime.parse(item.startDateTime!)).inSeconds) ?? 0);
bool isTimerEnable = widget.isSender bool isTimerEnable = widget.isSender
? (!(_formModel.senderMachineStatusName?.toLowerCase().contains("close") ?? false) || !(_formModel.senderMachineStatusName?.toLowerCase()?.contains("complete") ?? false)) ? (!(_formModel.senderMachineStatusName?.toLowerCase().contains("close") ?? false) || !(_formModel.senderMachineStatusName?.toLowerCase().contains("complete") ?? false))
: (!(_formModel.receiverMachineStatusName?.toLowerCase().contains("close") ?? false) || !(_formModel.receiverMachineStatusName?.toLowerCase()?.contains("complete") ?? false)); : (!(_formModel.receiverMachineStatusName?.toLowerCase().contains("close") ?? false) || !(_formModel.receiverMachineStatusName?.toLowerCase().contains("complete") ?? false));
return Scaffold( return Scaffold(
appBar: DefaultAppBar(title: context.translation.updateRequest), appBar: DefaultAppBar(title: context.translation.updateRequest),
@ -232,7 +232,7 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
context: context, context: context,
title: widget.isSender ? "Status Sender" : "Status Receiver", //,context.translation.reportStatus, title: widget.isSender ? "Status Sender" : "Status Receiver", //,context.translation.reportStatus,
initialValue: initialValue:
snapshot.items.firstWhere((element) => element.name == (widget.isSender ? _formModel.senderMachineStatusName : _formModel.receiverMachineStatusName), orElse: null), snapshot.items.firstWhere((element) => element.name == (widget.isSender ? _formModel.senderMachineStatusName : _formModel.receiverMachineStatusName), orElse: null),
onSelect: (value) { onSelect: (value) {
if (value?.value == 4) { if (value?.value == 4) {
"Status cannot be change to ${value?.name}.".addTranslation.showToast; "Status cannot be change to ${value?.name}.".addTranslation.showToast;
@ -265,7 +265,7 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
8.height, 8.height,
ESignature( ESignature(
title: "Signature", title: "Signature",
oldSignature: widget.isSender ? widget.model?.senderEngSignature : widget.model?.receiverEngSignature, oldSignature: widget.isSender ? widget.model.senderEngSignature : widget.model.receiverEngSignature,
newSignature: _signature, newSignature: _signature,
onSaved: (signature) { onSaved: (signature) {
_signature = signature; _signature = signature;
@ -300,7 +300,7 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
context.translation.transferDetails.heading5(context), context.translation.transferDetails.heading5(context),
8.height, 8.height,
'${context.translation.assetName}: ${_formModel.assetName?.cleanupWhitespace.capitalizeFirstOfEach}'.bodyText(context), '${context.translation.assetName}: ${_formModel.assetName?.cleanupWhitespace.capitalizeFirstOfEach}'.bodyText(context),
'${context.translation.requesterName}: ${_formModel.receiverEndUserName?.cleanupWhitespace?.capitalizeFirstOfEach ?? ""}'.bodyText(context), '${context.translation.requesterName}: ${_formModel.receiverEndUserName?.cleanupWhitespace.capitalizeFirstOfEach ?? ""}'.bodyText(context),
], ],
).toShadowContainer(context); ).toShadowContainer(context);
} }

@ -81,8 +81,8 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
@override @override
void initState() { void initState() {
_subWorkOrders = SearchWorkOrder( _subWorkOrders = SearchWorkOrder(
assignedEmployee: widget?.workOrder?.callRequest?.assignedEmployee, assignedEmployee: widget.workOrder?.callRequest?.assignedEmployee,
callRequest: CallRequest(id: widget?.workOrder?.callRequest?.id), callRequest: CallRequest(id: widget.workOrder?.callRequest?.id),
currentSituation: null, currentSituation: null,
supplier: null, supplier: null,
parentWOId: widget.workOrder?.id, parentWOId: widget.workOrder?.id,
@ -106,7 +106,7 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
Provider.of<ServiceRequestFaultDescriptionProvider>(context, listen: false).reset(); Provider.of<ServiceRequestFaultDescriptionProvider>(context, listen: false).reset();
assetTypesProvider = Provider.of<ServiceStatusProvider>(context, listen: false); assetTypesProvider = Provider.of<ServiceStatusProvider>(context, listen: false);
_callRequestForWorkOrder = await serviceRequestProvider.getCallRequestForWorkOrder(callId: widget.workOrder!.callRequest!.id!.toString()); _callRequestForWorkOrder = await serviceRequestProvider.getCallRequestForWorkOrder(callId: widget.workOrder!.callRequest!.id!.toString());
if (_subWorkOrders?.parentWOId != null) { if (_subWorkOrders.parentWOId != null) {
ServiceReport? subWoDetails = await serviceRequestProvider.getSubWorkOrderDetails(parentId: _subWorkOrders.parentWOId.toString()); ServiceReport? subWoDetails = await serviceRequestProvider.getSubWorkOrderDetails(parentId: _subWorkOrders.parentWOId.toString());
if (subWoDetails != null) { if (subWoDetails != null) {
_subWorkOrders.copyDetails(subWoDetails); _subWorkOrders.copyDetails(subWoDetails);
@ -119,16 +119,16 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
} }
} }
await assetTypesProvider.getTypes(); await assetTypesProvider.getTypes();
_subWorkOrders?.assetType = assetTypesProvider.statuses?.firstWhere( _subWorkOrders.assetType = assetTypesProvider.statuses?.firstWhere(
(element) => element.value == _callRequestForWorkOrder?.assetType, (element) => element.value == _callRequestForWorkOrder?.assetType,
orElse: null, orElse: null,
); );
if (checkVendorFieldsVisibility(_subWorkOrders.calllastSituation)) { if (checkVendorFieldsVisibility(_subWorkOrders.calllastSituation)) {
if (_subWorkOrders.suppEngineerWorkOrders?.isNotEmpty ?? false) { if (_subWorkOrders.suppEngineerWorkOrders?.isNotEmpty ?? false) {
engineer = _subWorkOrders.suppEngineerWorkOrders?.last; engineer = _subWorkOrders.suppEngineerWorkOrders?.last;
engineer?.id = engineer?.supplierContactId; engineer?.id = engineer?.supplierContactId;
} }
_subWorkOrders.supplier ??= SupplierDetails(id: _subWorkOrders?.supplier?.id); _subWorkOrders.supplier ??= SupplierDetails(id: _subWorkOrders.supplier?.id);
} }
_spareParts = await _partsProvider.getPartsList(assetId: widget.workOrder?.callRequest?.asset?.id); _spareParts = await _partsProvider.getPartsList(assetId: widget.workOrder?.callRequest?.asset?.id);
setState(() { setState(() {
@ -140,8 +140,8 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
@override @override
void dispose() { void dispose() {
_workPreformedController?.dispose(); _workPreformedController.dispose();
_partQtyController?.dispose(); _partQtyController.dispose();
super.dispose(); super.dispose();
} }
@ -209,7 +209,7 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
} }
setState(() { setState(() {
_subWorkOrders.visitDate = selectedDateTime?.toIso8601String(); _subWorkOrders.visitDate = selectedDateTime.toIso8601String();
}); });
} }
}); });
@ -219,12 +219,12 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
AppTimer( AppTimer(
label: context.translation.workingHours, label: context.translation.workingHours,
timer: _subWorkOrders.timer, timer: _subWorkOrders.timer,
enabled: _subWorkOrders?.timer?.endAt == null, enabled: _subWorkOrders.timer?.endAt == null,
onChange: (timer) async { onChange: (timer) async {
_subWorkOrders.timer = timer; _subWorkOrders.timer = timer;
if (timer?.startAt != null && timer?.endAt != null) { if (timer.startAt != null && timer.endAt != null) {
if (timer?.durationInSecond != 0) { if (timer.durationInSecond != 0) {
_subWorkOrders.workingHours = num.tryParse((((timer?.durationInSecond ?? 0) / 60) / 60)?.toStringAsFixed(2) ?? "0"); _subWorkOrders.workingHours = num.tryParse((((timer.durationInSecond ?? 0) / 60) / 60).toStringAsFixed(2) ?? "0");
} else { } else {
timer.durationInSecond = (timer.endAt!.difference(timer.startAt!)).inSeconds; timer.durationInSecond = (timer.endAt!.difference(timer.startAt!)).inSeconds;
String workingHours = (((timer.durationInSecond ?? 0) / 60) / 60).toStringAsFixed(2); String workingHours = (((timer.durationInSecond ?? 0) / 60) / 60).toStringAsFixed(2);
@ -242,14 +242,14 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
onRefresh: () async { onRefresh: () async {
assetTypesProvider.reset(); assetTypesProvider.reset();
await assetTypesProvider.getTypes(); await assetTypesProvider.getTypes();
_subWorkOrders?.assetType = assetTypesProvider.statuses?.firstWhere( _subWorkOrders.assetType = assetTypesProvider.statuses?.firstWhere(
(element) => element.value == _serviceReport.callRequest?.assetType, (element) => element.value == _serviceReport.callRequest?.assetType,
orElse: null, orElse: null,
); );
}, },
child: AppTextFormField( child: AppTextFormField(
labelText: context.translation.assetType, labelText: context.translation.assetType,
initialValue: _subWorkOrders?.assetType?.name, initialValue: _subWorkOrders.assetType?.name,
textAlign: TextAlign.center, textAlign: TextAlign.center,
enable: false, enable: false,
style: Theme.of(context).textTheme.titleMedium, style: Theme.of(context).textTheme.titleMedium,
@ -285,7 +285,7 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
onSelect: (status) { onSelect: (status) {
_serviceReport.calllastSituation = status; _serviceReport.calllastSituation = status;
if (checkVendorFieldsVisibility(status)) { if (checkVendorFieldsVisibility(status)) {
_subWorkOrders.supplier ??= SupplierDetails(id: _subWorkOrders?.supplier?.id); _subWorkOrders.supplier ??= SupplierDetails(id: _subWorkOrders.supplier?.id);
engineer = null; engineer = null;
} else { } else {
_subWorkOrders.supplier = initialSupplier; _subWorkOrders.supplier = initialSupplier;
@ -330,8 +330,8 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
SingleItemDropDownMenu<SuppPersons, NullableLoadingProvider>( SingleItemDropDownMenu<SuppPersons, NullableLoadingProvider>(
context: context, context: context,
title: context.translation.supplierEngineer, title: context.translation.supplierEngineer,
enabled: _subWorkOrders?.supplier?.suppPersons?.isNotEmpty ?? false, enabled: _subWorkOrders.supplier?.suppPersons?.isNotEmpty ?? false,
staticData: _subWorkOrders?.supplier?.suppPersons, staticData: _subWorkOrders.supplier?.suppPersons,
showAsBottomSheet: true, showAsBottomSheet: true,
initialValue: engineer == null ? null : SuppPersons.fromJson(engineer!.toJson()), initialValue: engineer == null ? null : SuppPersons.fromJson(engineer!.toJson()),
onSelect: (suppPerson) { onSelect: (suppPerson) {
@ -373,13 +373,11 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
builder: (context) => AddSupplierEngineerBottomSheet(_subWorkOrders.supplier!.id!.toInt()), builder: (context) => AddSupplierEngineerBottomSheet(_subWorkOrders.supplier!.id!.toInt()),
)) as SuppEngineerWorkOrders; )) as SuppEngineerWorkOrders;
if (suppEngineer != null) { _subWorkOrders.supplier?.suppPersons ??= [];
_subWorkOrders?.supplier?.suppPersons ??= []; _subWorkOrders.supplier?.suppPersons?.add(SuppPersons.fromJson(suppEngineer.toJson()));
_subWorkOrders?.supplier?.suppPersons?.add(SuppPersons.fromJson(suppEngineer.toJson())); engineer = suppEngineer;
engineer = suppEngineer; setState(() {});
setState(() {}); }),
}
}),
], ],
), ),
8.height, 8.height,
@ -388,13 +386,13 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
initialValue: _subWorkOrders.faultDescription, initialValue: _subWorkOrders.faultDescription,
onSelect: (status) { onSelect: (status) {
_subWorkOrders.faultDescription = status; _subWorkOrders.faultDescription = status;
_workPreformedController?.text = _subWorkOrders.faultDescription?.workPerformed ?? ""; _workPreformedController.text = _subWorkOrders.faultDescription?.workPerformed ?? "";
}, },
), ),
8.height, 8.height,
AppTextFormField( AppTextFormField(
labelText: context.translation.solution, labelText: context.translation.solution,
initialValue: _subWorkOrders?.faultDescription?.workPerformed, initialValue: _subWorkOrders.faultDescription?.workPerformed,
textAlign: TextAlign.center, textAlign: TextAlign.center,
enable: false, enable: false,
controller: _workPreformedController, controller: _workPreformedController,
@ -403,7 +401,7 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
SingleItemDropDownMenu<Lookup, LoanAvailabilityProvider>( SingleItemDropDownMenu<Lookup, LoanAvailabilityProvider>(
context: context, context: context,
title: context.translation.loanAvailability, title: context.translation.loanAvailability,
initialValue: _subWorkOrders?.loanAvailablity, initialValue: _subWorkOrders.loanAvailablity,
onSelect: (status) { onSelect: (status) {
if (status != null) { if (status != null) {
setState(() { setState(() {
@ -416,18 +414,16 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
} }
}, },
), ),
if (_subWorkOrders?.loanAvailablity?.value == 1) 8.height, if (_subWorkOrders.loanAvailablity?.value == 1) 8.height,
if (_subWorkOrders?.loanAvailablity?.value == 1) if (_subWorkOrders.loanAvailablity?.value == 1)
PickAsset( PickAsset(
device: loanAvailabilityAsset, // ?? _serviceReport.device, device: loanAvailabilityAsset, // ?? _serviceReport.device,
onPickAsset: (asset) { onPickAsset: (asset) {
if (asset != null) { _subWorkOrders.assetLoan = AssetInfo.fromJson(asset.toJson());
_subWorkOrders.assetLoan = AssetInfo.fromJson(asset.toJson()); setState(() {
setState(() { loanAvailabilityAsset = asset;
loanAvailabilityAsset = asset; });
}); },
}
},
), ),
8.height, 8.height,
ServiceReportAssistantEmployeeMenu( ServiceReportAssistantEmployeeMenu(
@ -472,7 +468,7 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
8.height, 8.height,
AppTextFormField( AppTextFormField(
labelText: context.translation.travelingExpense, labelText: context.translation.travelingExpense,
initialValue: _subWorkOrders?.travelingExpenses?.toString(), initialValue: _subWorkOrders.travelingExpenses?.toString(),
textInputType: TextInputType.number, textInputType: TextInputType.number,
onSaved: (value) { onSaved: (value) {
_subWorkOrders.travelingExpenses = double.tryParse(value) ?? 0.0; _subWorkOrders.travelingExpenses = double.tryParse(value) ?? 0.0;
@ -481,7 +477,7 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
8.height, 8.height,
AppTextFormField( AppTextFormField(
labelText: context.translation.travelingHours, labelText: context.translation.travelingHours,
initialValue: _subWorkOrders?.travelingHours?.toString(), initialValue: _subWorkOrders.travelingHours?.toString(),
textInputType: TextInputType.number, textInputType: TextInputType.number,
onSaved: (value) { onSaved: (value) {
_subWorkOrders.travelingHours = double.tryParse(value) ?? 0.0; _subWorkOrders.travelingHours = double.tryParse(value) ?? 0.0;
@ -489,7 +485,7 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
), ),
8.height, 8.height,
AppTextFormField( AppTextFormField(
initialValue: _subWorkOrders?.comment, initialValue: _subWorkOrders.comment,
labelText: context.translation.technicalComment, labelText: context.translation.technicalComment,
alignLabelWithHint: true, alignLabelWithHint: true,
textInputType: TextInputType.multiline, textInputType: TextInputType.multiline,
@ -517,7 +513,7 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
setState(() {}); setState(() {});
return; return;
} }
if (signature == null || signature.isEmpty) return; if (signature.isEmpty) return;
_subWorkOrders.localEngSignature = signature; _subWorkOrders.localEngSignature = signature;
_subWorkOrders.engSignature = signature != null ? "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}" : null; _subWorkOrders.engSignature = signature != null ? "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}" : null;
}, },
@ -559,7 +555,7 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
if (_formKey.currentState?.validate() ?? false) {} if (_formKey.currentState?.validate() ?? false) {}
_formKey.currentState?.save(); _formKey.currentState?.save();
final serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context, listen: false); final serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context, listen: false);
for (var element in (_subWorkOrders?.suppEngineerWorkOrders ?? [])) { for (var element in (_subWorkOrders.suppEngineerWorkOrders ?? [])) {
if (element != null && element.id != 0) { if (element != null && element.id != 0) {
element.supplierContactId = element.id; element.supplierContactId = element.id;
element.id = 0; element.id = 0;
@ -587,8 +583,8 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
bool checkVendorFieldsVisibility(Lookup? callsLastSituation) { bool checkVendorFieldsVisibility(Lookup? callsLastSituation) {
bool result = (initialSupplier?.suppliername?.isNotEmpty ?? false) || bool result = (initialSupplier?.suppliername?.isNotEmpty ?? false) ||
(callsLastSituation?.name?.toLowerCase()?.contains("under repair-vendor") ?? false) || (callsLastSituation?.name?.toLowerCase().contains("under repair-vendor") ?? false) ||
(callsLastSituation?.name?.toLowerCase()?.contains("waiting for vendor") ?? false); (callsLastSituation?.name?.toLowerCase().contains("waiting for vendor") ?? false);
setState(() { setState(() {
_showVendorFields = result; _showVendorFields = result;
}); });
@ -614,10 +610,10 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
} else if (_subWorkOrders.calllastSituation!.value == 12 && (_subWorkOrders.sparePartsWorkOrders?.isEmpty ?? true)) { } else if (_subWorkOrders.calllastSituation!.value == 12 && (_subWorkOrders.sparePartsWorkOrders?.isEmpty ?? true)) {
Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.partNo}"); Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.partNo}");
return false; return false;
} else if (_subWorkOrders?.timer?.startAt == null) { } else if (_subWorkOrders.timer?.startAt == null) {
await Fluttertoast.showToast(msg: "Working Hours Required"); await Fluttertoast.showToast(msg: "Working Hours Required");
return false; return false;
} else if (_subWorkOrders?.timer?.endAt == null) { } else if (_subWorkOrders.timer?.endAt == null) {
await Fluttertoast.showToast(msg: "Please Stop The Timer"); await Fluttertoast.showToast(msg: "Please Stop The Timer");
return false; return false;
} }

@ -95,9 +95,9 @@ class _GasRefillCommentsBottomSheetState extends State<GasRefillCommentsBottomSh
return Column( return Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
(model?.createdBy?.userName ?? "Nurse").heading6(context), (model.createdBy?.userName ?? "Nurse").heading6(context),
// 8.height, // 8.height,
(model?.comment ?? "").bodyText(context), (model.comment ?? "").bodyText(context),
//8.height, //8.height,
Align( Align(
alignment: AlignmentDirectional.bottomEnd, alignment: AlignmentDirectional.bottomEnd,

@ -32,7 +32,7 @@ class GasRefillDetailsPage extends StatefulWidget {
class _GasRefillDetailsPageState extends State<GasRefillDetailsPage> { class _GasRefillDetailsPageState extends State<GasRefillDetailsPage> {
GasRefillModel _model = GasRefillModel(gazRefillDetails: []); GasRefillModel _model = GasRefillModel(gazRefillDetails: []);
late UserProvider _userProvider; late UserProvider _userProvider;
bool _isLoading = false; final bool _isLoading = false;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(); final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
@ -47,14 +47,14 @@ class _GasRefillDetailsPageState extends State<GasRefillDetailsPage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
GasRefillProvider _gasRefillProvider = Provider.of<GasRefillProvider>(context); GasRefillProvider gasRefillProvider = Provider.of<GasRefillProvider>(context);
return Scaffold( return Scaffold(
appBar: DefaultAppBar(title: context.translation.gasRefillDetails), appBar: DefaultAppBar(title: context.translation.gasRefillDetails),
key: _scaffoldKey, key: _scaffoldKey,
body: SafeArea( body: SafeArea(
child: FutureBuilder( child: FutureBuilder(
future: _gasRefillProvider.getGasRefillObjectById(widget.model.id!), future: gasRefillProvider.getGasRefillObjectById(widget.model.id!),
builder: (context, snap) { builder: (context, snap) {
if (snap.connectionState == ConnectionState.waiting) { if (snap.connectionState == ConnectionState.waiting) {
return const ALoading(); return const ALoading();
@ -110,12 +110,12 @@ class _GasRefillDetailsPageState extends State<GasRefillDetailsPage> {
'${context.translation.gasRequest}: ${gasRefillModel.gazRefillDetails![0].gasType?.name}'.bodyText(context), '${context.translation.gasRequest}: ${gasRefillModel.gazRefillDetails![0].gasType?.name}'.bodyText(context),
'${context.translation.cylinderType}: ${gasRefillModel.gazRefillDetails![0].cylinderType?.name}'.bodyText(context), '${context.translation.cylinderType}: ${gasRefillModel.gazRefillDetails![0].cylinderType?.name}'.bodyText(context),
'${context.translation.cylinderSize}: ${gasRefillModel.gazRefillDetails![0].cylinderSize?.name}'.bodyText(context), '${context.translation.cylinderSize}: ${gasRefillModel.gazRefillDetails![0].cylinderSize?.name}'.bodyText(context),
'${context.translation.site}: ${gasRefillModel.site?.name?.cleanupWhitespace?.capitalizeFirstOfEach}'.bodyText(context), '${context.translation.site}: ${gasRefillModel.site?.name?.cleanupWhitespace.capitalizeFirstOfEach}'.bodyText(context),
'${context.translation.department}: ${gasRefillModel.department?.name?.cleanupWhitespace?.capitalizeFirstOfEach}'.bodyText(context), '${context.translation.department}: ${gasRefillModel.department?.name?.cleanupWhitespace.capitalizeFirstOfEach}'.bodyText(context),
'${context.translation.requestNo}: ${gasRefillModel.gazRefillNo}'.bodyText(context), '${context.translation.requestNo}: ${gasRefillModel.gazRefillNo}'.bodyText(context),
const Divider().defaultStyle(context), const Divider().defaultStyle(context),
'${context.translation.requestedQuantity}: ${gasRefillModel.gazRefillDetails![0]?.requestedQty ?? 0}'.bodyText(context), '${context.translation.requestedQuantity}: ${gasRefillModel.gazRefillDetails![0].requestedQty ?? 0}'.bodyText(context),
'${context.translation.deliveredQuantity}: ${gasRefillModel.gazRefillDetails![0]?.deliverdQty ?? 0}'.bodyText(context), '${context.translation.deliveredQuantity}: ${gasRefillModel.gazRefillDetails![0].deliverdQty ?? 0}'.bodyText(context),
8.height, 8.height,
if (gasRefillModel.comment?.isNotEmpty ?? false) ...[ if (gasRefillModel.comment?.isNotEmpty ?? false) ...[
const Divider().defaultStyle(context), const Divider().defaultStyle(context),
@ -130,7 +130,7 @@ class _GasRefillDetailsPageState extends State<GasRefillDetailsPage> {
if (_userProvider.user!.type == UsersTypes.engineer && (gasRefillModel.status?.value ?? 0) != 2) if (_userProvider.user!.type == UsersTypes.engineer && (gasRefillModel.status?.value ?? 0) != 2)
"edit".toSvgAsset(height: 48, width: 48).onPress( "edit".toSvgAsset(height: 48, width: 48).onPress(
() async { () async {
_model?.fromGasRefillModel(gasRefillModel); _model.fromGasRefillModel(gasRefillModel);
// setState(() {}); // setState(() {});
Navigator.push( Navigator.push(
context, context,

@ -39,7 +39,7 @@ class RequestGasRefill extends StatefulWidget {
} }
class _RequestGasRefillState extends State<RequestGasRefill> { class _RequestGasRefillState extends State<RequestGasRefill> {
bool _isLoading = false; final bool _isLoading = false;
bool _validate = false; bool _validate = false;
Uint8List? _engineerSignature; Uint8List? _engineerSignature;
Uint8List? _nurseSignature; Uint8List? _nurseSignature;
@ -52,7 +52,7 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
final TextEditingController _commentController = TextEditingController(); final TextEditingController _commentController = TextEditingController();
final TextEditingController _workingHoursController = TextEditingController(); final TextEditingController _workingHoursController = TextEditingController();
GasRefillModel _formModel = GasRefillModel(gazRefillDetails: []); final GasRefillModel _formModel = GasRefillModel(gazRefillDetails: []);
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey _DetailsKey = GlobalKey<FormState>(); final GlobalKey _DetailsKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(); final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
@ -156,27 +156,24 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
if (_gasRefillProvider == null) { _gasRefillProvider ??= Provider.of<GasRefillProvider>(context, listen: false);
_gasRefillProvider = Provider.of<GasRefillProvider>(context, listen: false);
//_gasRefillProvider.reset();
}
if (_firstTime) { if (_firstTime) {
String? _clientName; String? clientName;
if (widget.gasRefillModel != null) { if (widget.gasRefillModel != null) {
//_formModel.status = widget.gasRefillModel?.status ?? Lookup(value: 0); //_formModel.status = widget.gasRefillModel?.status ?? Lookup(value: 0);
_gasRefillProvider!.expectedDateTime = DateTime.tryParse(_formModel.expectedDate ?? ""); _gasRefillProvider!.expectedDateTime = DateTime.tryParse(_formModel.expectedDate ?? "");
_formModel.timer = TimerModel(startAt: DateTime.tryParse(widget.gasRefillModel?.startDate ?? ""), endAt: DateTime.tryParse(widget.gasRefillModel?.endDate ?? "")); _formModel.timer = TimerModel(startAt: DateTime.tryParse(widget.gasRefillModel?.startDate ?? ""), endAt: DateTime.tryParse(widget.gasRefillModel?.endDate ?? ""));
_clientName = _formModel.site?.custName; clientName = _formModel.site?.custName;
} else { } else {
_formModel.timer = null; _formModel.timer = null;
_clientName = _userProvider.user?.clientName; clientName = _userProvider.user?.clientName;
} }
HospitalsProvider().getHospitalsListByVal(searchVal: _clientName!).then((value) { HospitalsProvider().getHospitalsListByVal(searchVal: clientName!).then((value) {
_gasRefillProvider!.hospital = value?.firstWhere((element) => element.name == _clientName, orElse: null); _gasRefillProvider!.hospital = value.firstWhere((element) => element.name == clientName, orElse: null);
_gasRefillProvider!.building = _gasRefillProvider!.hospital?.buildings?.firstWhere((element) => element.name == widget.gasRefillModel?.building?.name, orElse: null); _gasRefillProvider!.building = _gasRefillProvider!.hospital?.buildings?.firstWhere((element) => element.name == widget.gasRefillModel?.building?.name, orElse: null);
_gasRefillProvider!.floor = _gasRefillProvider!.building?.floors?.firstWhere((element) => element.name == widget.gasRefillModel?.floor?.name, orElse: null); _gasRefillProvider!.floor = _gasRefillProvider!.building?.floors?.firstWhere((element) => element.name == widget.gasRefillModel?.floor?.name, orElse: null);
_gasRefillProvider!.department = _gasRefillProvider!.floor?.departments?.firstWhere((element) => element.name == widget.gasRefillModel?.department?.departmentName, orElse: null); _gasRefillProvider!.department = _gasRefillProvider!.floor?.departments?.firstWhere((element) => element.name == widget.gasRefillModel?.department?.departmentName, orElse: null);
_firstTime = false; _firstTime = false;
setState(() {}); setState(() {});
}); });
@ -245,7 +242,7 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
initialValue: _formModel.gazRefillDetails?[0].deliverdQty?.toString() ?? "", initialValue: _formModel.gazRefillDetails?[0].deliverdQty?.toString() ?? "",
labelText: context.translation.deliveredQuantity, labelText: context.translation.deliveredQuantity,
onSaved: (value) { onSaved: (value) {
_currentDetails?.deliverdQty = double.tryParse(value); _currentDetails.deliverdQty = double.tryParse(value);
}, },
textInputType: TextInputType.number, textInputType: TextInputType.number,
controller: _deliveredQuantityController, controller: _deliveredQuantityController,

@ -10,7 +10,9 @@ import 'package:test_sa/views/pages/user/notifications/notifications_list.dart';
import '../../../widgets/loaders/loading_manager.dart'; import '../../../widgets/loaders/loading_manager.dart';
class NotificationsPage extends StatefulWidget { class NotificationsPage extends StatefulWidget {
static final String id = "/notifications"; static const String id = "/notifications";
const NotificationsPage({Key? key}) : super(key: key);
@override @override
_NotificationsPageState createState() => _NotificationsPageState(); _NotificationsPageState createState() => _NotificationsPageState();

@ -23,7 +23,7 @@ class PpmDetailsPage extends StatefulWidget {
static const String id = "/visit-details"; static const String id = "/visit-details";
final RequestsDetails request; final RequestsDetails request;
PpmDetailsPage({Key? key, required this.request}) : super(key: key); const PpmDetailsPage({Key? key, required this.request}) : super(key: key);
@override @override
_PpmDetailsPageState createState() { _PpmDetailsPageState createState() {
@ -97,11 +97,11 @@ class _PpmDetailsPageState extends State<PpmDetailsPage> {
const Divider().defaultStyle(context), const Divider().defaultStyle(context),
'${context.translation.assignedTo}: ${ppm.assignedToName ?? ""}'.bodyText(context), '${context.translation.assignedTo}: ${ppm.assignedToName ?? ""}'.bodyText(context),
'${context.translation.engineerName}: ${ppm.assignedEmployeeName ?? ""}'.bodyText(context), '${context.translation.engineerName}: ${ppm.assignedEmployeeName ?? ""}'.bodyText(context),
'${context.translation.site}: ${ppm.siteName?.cleanupWhitespace?.capitalizeFirstOfEach}'.bodyText(context), '${context.translation.site}: ${ppm.siteName?.cleanupWhitespace.capitalizeFirstOfEach}'.bodyText(context),
'${context.translation.building}: ${ppm.buildingName?.cleanupWhitespace?.capitalizeFirstOfEach}'.bodyText(context), '${context.translation.building}: ${ppm.buildingName?.cleanupWhitespace.capitalizeFirstOfEach}'.bodyText(context),
'${context.translation.floor}: ${ppm.floorName?.cleanupWhitespace?.capitalizeFirstOfEach}'.bodyText(context), '${context.translation.floor}: ${ppm.floorName?.cleanupWhitespace.capitalizeFirstOfEach}'.bodyText(context),
'${context.translation.department}: ${ppm.departmentName?.cleanupWhitespace?.capitalizeFirstOfEach}'.bodyText(context), '${context.translation.department}: ${ppm.departmentName?.cleanupWhitespace.capitalizeFirstOfEach}'.bodyText(context),
'${context.translation.room}: ${(ppm.roomName ?? "").cleanupWhitespace?.capitalizeFirstOfEach}'.bodyText(context), '${context.translation.room}: ${(ppm.roomName ?? "").cleanupWhitespace.capitalizeFirstOfEach}'.bodyText(context),
], ],
).toShadowContainer(context).paddingAll(16), ).toShadowContainer(context).paddingAll(16),
).expanded, ).expanded,

@ -102,7 +102,7 @@ class _EditPpmState extends State<EditPpm> with SingleTickerProviderStateMixin {
children: [ children: [
PentryTBSForm(model: _ppm), PentryTBSForm(model: _ppm),
PentryCalibrationToolForm(models: _ppm.vCalibrationTools), PentryCalibrationToolForm(models: _ppm.vCalibrationTools),
PentryPMKitForm(models: _ppm.vKits, assetId: widget.ppm?.assetId), PentryPMKitForm(models: _ppm.vKits, assetId: widget.ppm.assetId),
PentryPMChecklistForm(models: _ppm.vChecklists), PentryPMChecklistForm(models: _ppm.vChecklists),
], ],
).expanded, ).expanded,

@ -84,10 +84,10 @@ class _ProfilePageState extends State<ProfilePage> {
radius: 14, radius: 14,
backgroundColor: AppColor.primary70, backgroundColor: AppColor.primary70,
child: Padding( child: Padding(
padding: EdgeInsets.all(1), // Border radius padding: const EdgeInsets.all(1), // Border radius
child: snapshot.isLoading child: snapshot.isLoading
? const SizedBox(height: 16, width: 16, child: CircularProgressIndicator(color: Colors.white, strokeWidth: 2)) ? const SizedBox(height: 16, width: 16, child: CircularProgressIndicator(color: Colors.white, strokeWidth: 2))
: Icon(Icons.upload, size: 16, color: Colors.white), : const Icon(Icons.upload, size: 16, color: Colors.white),
), ),
).onPress(snapshot.isLoading ).onPress(snapshot.isLoading
? null ? null
@ -97,7 +97,7 @@ class _ProfilePageState extends State<ProfilePage> {
if (pickedFile != null) { if (pickedFile != null) {
CroppedFile? croppedFile = await ImageCropper().cropImage( CroppedFile? croppedFile = await ImageCropper().cropImage(
sourcePath: pickedFile.path, sourcePath: pickedFile.path,
aspectRatioPresets: [CropAspectRatioPreset.square], aspectRatio: CropAspectRatio(ratioX: 1, ratioY: 1),
uiSettings: [ uiSettings: [
AndroidUiSettings( AndroidUiSettings(
toolbarTitle: 'ATOMS', toolbarTitle: 'ATOMS',

@ -131,7 +131,7 @@ class _AddSupplierEngineerBottomSheetState extends State<AddSupplierEngineerBott
// return; // return;
SuppEngineerWorkOrders? suppEngineer = await snapshot.addSupplierEngineer(engineer); SuppEngineerWorkOrders? suppEngineer = await snapshot.addSupplierEngineer(engineer);
if (suppEngineer == null) { if (suppEngineer == null) {
Fluttertoast.showToast(msg: "${context.translation.failedToCompleteRequest}"); Fluttertoast.showToast(msg: context.translation.failedToCompleteRequest);
return; return;
} }
Fluttertoast.showToast(msg: context.translation.successfulRequestMessage); Fluttertoast.showToast(msg: context.translation.successfulRequestMessage);

@ -94,9 +94,9 @@ class _CommentsBottomSheetState extends State<CommentsBottomSheet> {
return Column( return Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
(model?.createdBy?.userName ?? "Nurse").heading6(context), (model.createdBy?.userName ?? "Nurse").heading6(context),
8.height, 8.height,
(model?.comment ?? "").bodyText(context), (model.comment ?? "").bodyText(context),
8.height, 8.height,
Align( Align(
alignment: AlignmentDirectional.bottomEnd, alignment: AlignmentDirectional.bottomEnd,

@ -46,7 +46,7 @@ class CreateServiceRequestPageState extends State<CreateServiceRequestPage> {
late ServiceRequestsProvider _serviceRequestsProvider; late ServiceRequestsProvider _serviceRequestsProvider;
late ServiceRequest _serviceRequest; late ServiceRequest _serviceRequest;
final List<File> _deviceImages = []; final List<File> _deviceImages = [];
bool _isLoading = false; final bool _isLoading = false;
bool _showDatePicker = false; bool _showDatePicker = false;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(); final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
@ -67,7 +67,7 @@ class CreateServiceRequestPageState extends State<CreateServiceRequestPage> {
} else { } else {
_serviceRequest = ServiceRequest(); _serviceRequest = ServiceRequest();
} }
isFirstActionSubmitted = _serviceRequest?.firstAction != null; isFirstActionSubmitted = _serviceRequest.firstAction != null;
super.initState(); super.initState();
} }
@ -98,7 +98,7 @@ class CreateServiceRequestPageState extends State<CreateServiceRequestPage> {
} }
bool _isLocalUrl(String url) { bool _isLocalUrl(String url) {
if (url?.isEmpty != false) return false; if (url.isEmpty != false) return false;
return url.startsWith("/") || url.startsWith("file://") || url.substring(1).startsWith(':\\'); return url.startsWith("/") || url.startsWith("file://") || url.substring(1).startsWith(':\\');
} }
@ -119,10 +119,6 @@ class CreateServiceRequestPageState extends State<CreateServiceRequestPage> {
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
_serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context); _serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context);
if (_settingProvider == null) {
_settingProvider = Provider.of<SettingProvider>(context);
getData();
}
return Scaffold( return Scaffold(
key: _scaffoldKey, key: _scaffoldKey,
@ -166,7 +162,7 @@ class CreateServiceRequestPageState extends State<CreateServiceRequestPage> {
8.width, 8.width,
Text( Text(
"This asset already have ${pendingAssetServiceRequest!.details!.length} request pending", "This asset already have ${pendingAssetServiceRequest!.details!.length} request pending",
style: TextStyle(fontSize: 12, fontWeight: FontWeight.w500, color: Color(0xff7D859A), decoration: TextDecoration.underline), style: const TextStyle(fontSize: 12, fontWeight: FontWeight.w500, color: Color(0xff7D859A), decoration: TextDecoration.underline),
).expanded, ).expanded,
], ],
).onPress(() { ).onPress(() {
@ -179,19 +175,19 @@ class CreateServiceRequestPageState extends State<CreateServiceRequestPage> {
children: [ children: [
Text(context.translation.priority, style: Theme.of(context).textTheme.bodyLarge), Text(context.translation.priority, style: Theme.of(context).textTheme.bodyLarge),
Consumer<PriorityProvider>(builder: (cxt, snapshot, _) { Consumer<PriorityProvider>(builder: (cxt, snapshot, _) {
_serviceRequest?.priority ??= snapshot.items?.firstWhere((element) => element.value == 0, orElse: null); _serviceRequest.priority ??= snapshot.items.firstWhere((element) => element.value == 0, orElse: null);
return Transform.scale( return Transform.scale(
scale: 0.8, scale: 0.8,
child: CupertinoSwitch( child: CupertinoSwitch(
thumbColor: _serviceRequest?.priority?.value != 0 ? Color(0xffF63939) : Colors.blueGrey.withOpacity(.5), thumbColor: _serviceRequest.priority?.value != 0 ? const Color(0xffF63939) : Colors.blueGrey.withOpacity(.5),
activeColor: AppColor.blueStatus(context).withOpacity(.25), activeColor: AppColor.blueStatus(context).withOpacity(.25),
value: _serviceRequest?.priority?.value != 0, value: _serviceRequest.priority?.value != 0,
onChanged: (state) { onChanged: (state) {
if (state) { if (state) {
_serviceRequest?.priority = snapshot.items?.firstWhere((element) => element.value == 1, orElse: null); _serviceRequest.priority = snapshot.items.firstWhere((element) => element.value == 1, orElse: null);
} else { } else {
_serviceRequest?.priority = snapshot.items?.firstWhere((element) => element.value == 0, orElse: null); _serviceRequest.priority = snapshot.items.firstWhere((element) => element.value == 0, orElse: null);
} }
setState(() {}); setState(() {});
}).toShimmer(isShow: snapshot.loading), }).toShimmer(isShow: snapshot.loading),
@ -202,9 +198,9 @@ class CreateServiceRequestPageState extends State<CreateServiceRequestPage> {
16.height, 16.height,
Consumer<EquipmentStatusProvider>(builder: (cxt, snapshot, _) { Consumer<EquipmentStatusProvider>(builder: (cxt, snapshot, _) {
try { try {
_serviceRequest?.defectType ??= snapshot.items?.first; _serviceRequest.defectType ??= snapshot.items.first;
} catch (ex) { } catch (ex) {
print("snapshot.items:${snapshot.items?.length}"); print("snapshot.items:${snapshot.items.length}");
} }
return Column( return Column(
@ -227,14 +223,14 @@ class CreateServiceRequestPageState extends State<CreateServiceRequestPage> {
child: Radio( child: Radio(
value: element, value: element,
activeColor: Colors.red, activeColor: Colors.red,
fillColor: MaterialStateColor.resolveWith((states) { fillColor: WidgetStateColor.resolveWith((states) {
if (states.contains(MaterialState.selected)) return Color(0xff3DA5E5); if (states.contains(WidgetState.selected)) return const Color(0xff3DA5E5);
return Color(0xffE0E0E0); return const Color(0xffE0E0E0);
}), }),
groupValue: _serviceRequest?.defectType, groupValue: _serviceRequest.defectType,
onChanged: (state) { onChanged: (state) {
setState(() { setState(() {
_serviceRequest?.defectType = element; _serviceRequest.defectType = element;
}); });
}), }),
), ),
@ -275,7 +271,7 @@ class CreateServiceRequestPageState extends State<CreateServiceRequestPage> {
// context: context, // context: context,
// enabled: false, // enabled: false,
// title: context.translation.source, // title: context.translation.source,
// initialValue: snapshot.items?.firstWhere((element) => element.value == 3, orElse: () => null), // initialValue: snapshot.items?.firstWhere((element) => element.value == 3, orElse: null),
// ); // );
// }), // }),
// 8.height, // 8.height,
@ -284,7 +280,7 @@ class CreateServiceRequestPageState extends State<CreateServiceRequestPage> {
// context: context, // context: context,
// title: context.translation.requestType, // title: context.translation.requestType,
// enabled: false, // enabled: false,
// initialValue: snapshot.items?.firstWhere((element) => element.value == 1, orElse: () => null), // initialValue: snapshot.items?.firstWhere((element) => element.value == 1, orElse: null),
// // onSelect: (value) { // // onSelect: (value) {
// // _serviceRequest.type = value; // // _serviceRequest.type = value;
// // }, // // },
@ -379,8 +375,8 @@ class CreateServiceRequestPageState extends State<CreateServiceRequestPage> {
} }
Future<void> _submit() async { Future<void> _submit() async {
_serviceRequest?.requestedThrough = Provider.of<RequestedThroughProvider>(context, listen: false).items?.firstWhere((element) => element.value == 3, orElse: null); _serviceRequest.requestedThrough = Provider.of<RequestedThroughProvider>(context, listen: false).items.firstWhere((element) => element.value == 3, orElse: null);
_serviceRequest?.type = Provider.of<TypeOfRequestProvider>(context, listen: false).items?.firstWhere((element) => element.value == 1, orElse: null); _serviceRequest.type = Provider.of<TypeOfRequestProvider>(context, listen: false).items.firstWhere((element) => element.value == 1, orElse: null);
// print("_serviceRequest?.requestedThrough:${_serviceRequest?.requestedThrough.toJson()}"); // print("_serviceRequest?.requestedThrough:${_serviceRequest?.requestedThrough.toJson()}");
// print("_serviceRequest?.type:${_serviceRequest?.type.toJson()}"); // print("_serviceRequest?.type:${_serviceRequest?.type.toJson()}");

@ -90,34 +90,30 @@ class _FirstActionBottomSheetState extends State<FirstActionBottomSheet> {
date: DateTime.tryParse(_serviceRequest.visitDate ?? ""), date: DateTime.tryParse(_serviceRequest.visitDate ?? ""),
formatDateWithTime: true, formatDateWithTime: true,
onDatePicker: (selectedDate) { onDatePicker: (selectedDate) {
if (selectedDate != null) { showTimePicker(
showTimePicker( context: context,
context: context, initialTime: TimeOfDay.now(),
initialTime: TimeOfDay.now(), ).then((selectedTime) {
).then((selectedTime) { // Handle the selected date and time here.
// Handle the selected date and time here. if (selectedTime != null) {
if (selectedTime != null) { DateTime selectedDateTime = DateTime(
DateTime selectedDateTime = DateTime( selectedDate.year,
selectedDate.year, selectedDate.month,
selectedDate.month, selectedDate.day,
selectedDate.day, selectedTime.hour,
selectedTime.hour, selectedTime.minute,
selectedTime.minute, );
); if (selectedDateTime.isBefore(DateTime.parse(_serviceRequest.date!))) {
if (selectedDateTime != null) { "Visit Date time must be greater then request date".showToast;
if (selectedDateTime.isBefore(DateTime.parse(_serviceRequest.date!))) { return;
"Visit Date time must be greater then request date".showToast;
return;
}
setState(() {
_serviceRequest.visitDate = selectedDateTime?.toIso8601String();
});
}
} }
});
} setState(() {
}, _serviceRequest.visitDate = selectedDateTime.toIso8601String();
});
}
});
},
), ),
], ],
@ -130,29 +126,25 @@ class _FirstActionBottomSheetState extends State<FirstActionBottomSheet> {
date: DateTime.tryParse(_serviceRequest.startDate ?? ""), date: DateTime.tryParse(_serviceRequest.startDate ?? ""),
formatDateWithTime: true, formatDateWithTime: true,
onDatePicker: (selectedDate) { onDatePicker: (selectedDate) {
if (selectedDate != null) { showTimePicker(
showTimePicker( context: context,
context: context, initialTime: TimeOfDay.now(),
initialTime: TimeOfDay.now(), ).then((selectedTime) {
).then((selectedTime) { // Handle the selected date and time here.
// Handle the selected date and time here. if (selectedTime != null) {
if (selectedTime != null) { DateTime selectedDateTime = DateTime(
DateTime selectedDateTime = DateTime( selectedDate.year,
selectedDate.year, selectedDate.month,
selectedDate.month, selectedDate.day,
selectedDate.day, selectedTime.hour,
selectedTime.hour, selectedTime.minute,
selectedTime.minute, );
); setState(() {
if (selectedDateTime != null) { _serviceRequest.startDate = selectedDateTime.toIso8601String();
setState(() { });
_serviceRequest.startDate = selectedDateTime?.toIso8601String(); }
}); });
} },
}
});
}
},
).expanded, ).expanded,
8.width, 8.width,
ADatePicker( ADatePicker(
@ -160,31 +152,27 @@ class _FirstActionBottomSheetState extends State<FirstActionBottomSheet> {
date: DateTime.tryParse(_serviceRequest.endDate ?? ""), date: DateTime.tryParse(_serviceRequest.endDate ?? ""),
formatDateWithTime: true, formatDateWithTime: true,
onDatePicker: (selectedDate) { onDatePicker: (selectedDate) {
if (selectedDate != null) { showTimePicker(
showTimePicker( context: context,
context: context, initialTime: TimeOfDay.now(),
initialTime: TimeOfDay.now(), ).then((selectedTime) {
).then((selectedTime) { // Handle the selected date and time here.
// Handle the selected date and time here. if (selectedTime != null) {
if (selectedTime != null) { DateTime selectedDateTime = DateTime(
DateTime selectedDateTime = DateTime( selectedDate.year,
selectedDate.year, selectedDate.month,
selectedDate.month, selectedDate.day,
selectedDate.day, selectedTime.hour,
selectedTime.hour, selectedTime.minute,
selectedTime.minute, );
); setState(() {
if (selectedDateTime != null) { _serviceRequest.endDate = selectedDateTime.toIso8601String();
setState(() { _serviceRequest.workingHours =
_serviceRequest.endDate = selectedDateTime?.toIso8601String(); (((DateTime.parse(_serviceRequest.endDate!).difference(DateTime.parse(_serviceRequest.startDate!)).inSeconds ?? 0) / 60) / 60).toStringAsFixed(2);
_serviceRequest.workingHours = });
(((DateTime.parse(_serviceRequest.endDate!).difference(DateTime.parse(_serviceRequest.startDate!)).inSeconds ?? 0) / 60) / 60).toStringAsFixed(2); }
}); });
} },
}
});
}
},
).expanded, ).expanded,
], ],
) )

@ -12,7 +12,7 @@ import 'package:test_sa/views/widgets/sound/sound_player.dart';
class PendingServiceRequestScreen extends StatelessWidget { class PendingServiceRequestScreen extends StatelessWidget {
final PendingAssetServiceRequest pendingAssetServiceRequest; final PendingAssetServiceRequest pendingAssetServiceRequest;
PendingServiceRequestScreen(this.pendingAssetServiceRequest, {Key? key}) : super(key: key); const PendingServiceRequestScreen(this.pendingAssetServiceRequest, {Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -20,10 +20,10 @@ class PendingServiceRequestScreen extends StatelessWidget {
appBar: DefaultAppBar(title: "Pending Requests (${pendingAssetServiceRequest.details!.length})"), appBar: DefaultAppBar(title: "Pending Requests (${pendingAssetServiceRequest.details!.length})"),
body: ListView.separated( body: ListView.separated(
itemCount: pendingAssetServiceRequest.details!.length, itemCount: pendingAssetServiceRequest.details!.length,
padding: EdgeInsets.all(16), padding: const EdgeInsets.all(16),
separatorBuilder: (cxt, index) => 12.height, separatorBuilder: (cxt, index) => 12.height,
itemBuilder: (cxt, index) => Container( itemBuilder: (cxt, index) => Container(
padding: EdgeInsets.symmetric(vertical: 16, horizontal: 16), padding: const EdgeInsets.symmetric(vertical: 16, horizontal: 16),
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.grey[200], color: Colors.grey[200],
borderRadius: BorderRadius.circular(16), borderRadius: BorderRadius.circular(16),
@ -34,14 +34,14 @@ class PendingServiceRequestScreen extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text( Text(
pendingAssetServiceRequest.details![index].message!.cleanupWhitespace?.capitalizeFirstOfEach ?? "", pendingAssetServiceRequest.details![index].message!.cleanupWhitespace.capitalizeFirstOfEach ?? "",
style: Theme.of(context).textTheme.bodyLarge, style: Theme.of(context).textTheme.bodyLarge,
), ),
if ((pendingAssetServiceRequest.details![index].callComments ?? "").isNotEmpty) ...[ if ((pendingAssetServiceRequest.details![index].callComments ?? "").isNotEmpty) ...[
4.height, 4.height,
Text( Text(
"${pendingAssetServiceRequest.details![index].callComments}", "${pendingAssetServiceRequest.details![index].callComments}",
style: Theme.of(context).textTheme.bodyMedium!.copyWith(color: Color(0xff7D859A)), style: Theme.of(context).textTheme.bodyMedium!.copyWith(color: const Color(0xff7D859A)),
), ),
], ],
if ((pendingAssetServiceRequest.details![index].voiceNote ?? "").isNotEmpty) ...[ if ((pendingAssetServiceRequest.details![index].voiceNote ?? "").isNotEmpty) ...[
@ -60,7 +60,7 @@ class PendingServiceRequestScreen extends StatelessWidget {
], ],
).expanded, ).expanded,
8.width, 8.width,
Icon(Icons.arrow_forward_ios, size: 16) const Icon(Icons.arrow_forward_ios, size: 16)
], ],
), ),
).onPress(() { ).onPress(() {

@ -9,7 +9,9 @@ import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import 'package:test_sa/views/widgets/requests/service_request_list.dart'; import 'package:test_sa/views/widgets/requests/service_request_list.dart';
class ServiceRequestsPage extends StatefulWidget { class ServiceRequestsPage extends StatefulWidget {
static final String id = "/service-requests"; static const String id = "/service-requests";
const ServiceRequestsPage({Key? key}) : super(key: key);
@override @override
_ServiceRequestsPageState createState() => _ServiceRequestsPageState(); _ServiceRequestsPageState createState() => _ServiceRequestsPageState();
@ -19,7 +21,7 @@ class _ServiceRequestsPageState extends State<ServiceRequestsPage> with TickerPr
late ServiceRequestsProvider _serviceRequestsProvider; late ServiceRequestsProvider _serviceRequestsProvider;
late UserProvider _userProvider; late UserProvider _userProvider;
late SettingProvider _settingProvider; late SettingProvider _settingProvider;
bool _expandedSearch = false; final bool _expandedSearch = false;
bool _firstTime = true; bool _firstTime = true;
@override @override

@ -56,7 +56,7 @@ class _ServiceRequestDetailsPageState extends State<ServiceRequestDetailsPage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
UserProvider _userProvider = Provider.of<UserProvider>(context, listen: false); UserProvider userProvider = Provider.of<UserProvider>(context, listen: false);
Widget informationCard(ServiceRequest serviceRequest) { Widget informationCard(ServiceRequest serviceRequest) {
return Column( return Column(
@ -90,7 +90,7 @@ class _ServiceRequestDetailsPageState extends State<ServiceRequestDetailsPage> {
], ],
), ),
8.height, 8.height,
Text(serviceRequest.deviceEnName?.cleanupWhitespace?.capitalizeFirstOfEach ?? "", Text(serviceRequest.deviceEnName?.cleanupWhitespace.capitalizeFirstOfEach ?? "",
style: AppTextStyles.heading5.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)), style: AppTextStyles.heading5.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)),
8.height, 8.height,
Text( Text(
@ -118,11 +118,11 @@ class _ServiceRequestDetailsPageState extends State<ServiceRequestDetailsPage> {
Column( Column(
crossAxisAlignment: CrossAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end,
children: [ children: [
if (_userProvider.user!.type == UsersTypes.normal_user) if (userProvider.user!.type == UsersTypes.normal_user)
context.translation.code.toSvgAsset(width: 48).onPress(() { context.translation.code.toSvgAsset(width: 48).onPress(() {
Navigator.push(context, MaterialPageRoute(builder: (context) => UpdateServiceRequestPage(serviceRequest: serviceRequest))); Navigator.push(context, MaterialPageRoute(builder: (context) => UpdateServiceRequestPage(serviceRequest: serviceRequest)));
}), }),
if (_userProvider.user!.type == UsersTypes.engineer) 16.height, if (userProvider.user!.type == UsersTypes.engineer) 16.height,
Text( Text(
serviceRequest.date!.toServiceRequestCardFormat, serviceRequest.date!.toServiceRequestCardFormat,
textAlign: TextAlign.end, textAlign: TextAlign.end,
@ -136,31 +136,31 @@ class _ServiceRequestDetailsPageState extends State<ServiceRequestDetailsPage> {
const Divider().defaultStyle(context), const Divider().defaultStyle(context),
8.height, 8.height,
Text( Text(
'${context.translation.manufacture}: ${serviceRequest.device!.modelDefinition!.manufacturerName?.cleanupWhitespace?.capitalizeFirstOfEach}', '${context.translation.manufacture}: ${serviceRequest.device!.modelDefinition!.manufacturerName?.cleanupWhitespace.capitalizeFirstOfEach}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
), ),
Text( Text(
'${context.translation.model}: ${serviceRequest.device!.modelDefinition!.modelName?.cleanupWhitespace?.capitalizeFirstOfEach}', '${context.translation.model}: ${serviceRequest.device!.modelDefinition!.modelName?.cleanupWhitespace.capitalizeFirstOfEach}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
), ),
Text( Text(
'${context.translation.site}: ${serviceRequest.device!.site?.custName?.cleanupWhitespace?.capitalizeFirstOfEach}', '${context.translation.site}: ${serviceRequest.device!.site?.custName?.cleanupWhitespace.capitalizeFirstOfEach}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
), ),
Text( Text(
'${context.translation.building}: ${serviceRequest.device!.building?.name?.cleanupWhitespace?.capitalizeFirstOfEach}', '${context.translation.building}: ${serviceRequest.device!.building?.name?.cleanupWhitespace.capitalizeFirstOfEach}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
), ),
Text( Text(
'${context.translation.floor}: ${serviceRequest.device!.floor?.name?.cleanupWhitespace?.capitalizeFirstOfEach ?? ""}', '${context.translation.floor}: ${serviceRequest.device!.floor?.name?.cleanupWhitespace.capitalizeFirstOfEach ?? ""}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
), ),
Text( Text(
'${context.translation.department}: ${serviceRequest.device!.department?.departmentName?.cleanupWhitespace?.capitalizeFirstOfEach}', '${context.translation.department}: ${serviceRequest.device!.department?.departmentName?.cleanupWhitespace.capitalizeFirstOfEach}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
), ),
Text( Text(
'${context.translation.room}: ${(serviceRequest.device!.room?.name ?? "").cleanupWhitespace?.capitalizeFirstOfEach}', '${context.translation.room}: ${(serviceRequest.device!.room?.name ?? "").cleanupWhitespace.capitalizeFirstOfEach}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
), ),
8.height, 8.height,
@ -185,7 +185,7 @@ class _ServiceRequestDetailsPageState extends State<ServiceRequestDetailsPage> {
], ],
], ],
).paddingOnly(start: 16, end: 16, top: 16, bottom: 8), ).paddingOnly(start: 16, end: 16, top: 16, bottom: 8),
(_userProvider.user!.type == UsersTypes.normal_user (userProvider.user!.type == UsersTypes.normal_user
? Container( ? Container(
height: 50, height: 50,
padding: const EdgeInsets.only(left: 16, right: 16), padding: const EdgeInsets.only(left: 16, right: 16),
@ -263,7 +263,7 @@ class _ServiceRequestDetailsPageState extends State<ServiceRequestDetailsPage> {
padding: const EdgeInsets.all(16), padding: const EdgeInsets.all(16),
child: informationCard(serviceRequest!), child: informationCard(serviceRequest!),
).expanded, ).expanded,
if (_userProvider.user!.type == UsersTypes.engineer || (serviceRequest!.statusValue == 5 || serviceRequest!.statusValue == 3)) if (userProvider.user!.type == UsersTypes.engineer || (serviceRequest!.statusValue == 5 || serviceRequest!.statusValue == 3))
(serviceRequest?.firstAction == null (serviceRequest?.firstAction == null
? AppFilledButton( ? AppFilledButton(
label: context.translation.firstAction, label: context.translation.firstAction,

@ -101,7 +101,7 @@ class _UpdateServiceRequestPageState extends State<UpdateServiceRequestPage> {
context: context, context: context,
enabled: false, enabled: false,
title: context.translation.source, title: context.translation.source,
initialValue: snapshot.items?.firstWhere((element) => element.value == 3, orElse: null), initialValue: snapshot.items.firstWhere((element) => element.value == 3, orElse: null),
); );
}), }),
8.height, 8.height,
@ -150,7 +150,7 @@ class _UpdateServiceRequestPageState extends State<UpdateServiceRequestPage> {
} }
Future<void> _submit() async { Future<void> _submit() async {
widget.serviceRequest?.requestedThrough = Provider.of<RequestedThroughProvider>(context, listen: false).items?.firstWhere((element) => element.value == 3, orElse: null); widget.serviceRequest?.requestedThrough = Provider.of<RequestedThroughProvider>(context, listen: false).items.firstWhere((element) => element.value == 3, orElse: null);
if (_formKey.currentState!.validate() && await widget.serviceRequest!.validateNewRequest(context)) { if (_formKey.currentState!.validate() && await widget.serviceRequest!.validateNewRequest(context)) {
_formKey.currentState!.save(); _formKey.currentState!.save();
widget.serviceRequest!.devicePhotos = _deviceImages.map((e) => _isLocalUrl(e.path) ? "${e.path.split("/").last}|${base64Encode(e.readAsBytesSync())}" : e.path).toList(); widget.serviceRequest!.devicePhotos = _deviceImages.map((e) => _isLocalUrl(e.path) ? "${e.path.split("/").last}|${base64Encode(e.readAsBytesSync())}" : e.path).toList();
@ -167,7 +167,7 @@ class _UpdateServiceRequestPageState extends State<UpdateServiceRequestPage> {
} }
bool _isLocalUrl(String url) { bool _isLocalUrl(String url) {
if (url?.isEmpty != false) return false; if (url.isEmpty != false) return false;
return url.startsWith("/") || url.startsWith("file://") || url.substring(1).startsWith(':\\'); return url.startsWith("/") || url.startsWith("file://") || url.substring(1).startsWith(':\\');
} }
} }

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

Loading…
Cancel
Save