null safety conversation complete

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

@ -1,22 +1,15 @@
class Attachment { class Attachment {
Attachment({ Attachment({this.id, this.name});
this.id,
this.name,
});
Attachment.fromJson(dynamic json) { Attachment.fromJson(dynamic json) {
id = json['id']; id = json['id'];
name = json['name']; name = json['name'];
} }
num id; num? id;
String name; String? name;
Attachment copyWith({ Attachment copyWith({num? id, String? name}) => Attachment(
num id,
String name,
}) =>
Attachment(
id: id ?? this.id, id: id ?? this.id,
name: name ?? this.name, name: name ?? this.name,
); );

@ -50,8 +50,8 @@ class AllRequestsProvider extends ChangeNotifier {
AllRequestsAndCount? get allRequestsAndCount => _allRequestsAndCount; AllRequestsAndCount? get allRequestsAndCount => _allRequestsAndCount;
AllRequestsAndCount? get highPriorityRequests => _highPriorityRequests; AllRequestsAndCount? get highPriorityRequests => _highPriorityRequests;
AllRequestsAndCount? get overdueRequests => _overdueRequests; AllRequestsAndCount? get overdueRequests => _overdueRequests;
AllRequestsAndCount? get openRequests => _openRequests; // AllRequestsAndCount? get openRequests => _openRequests;
AllRequestsAndCount? get completedRequests => _completedRequests; // AllRequestsAndCount? get completedRequests => _completedRequests;
AllRequestsAndCount? get requestDetailList => _requestDetailList; AllRequestsAndCount? get requestDetailList => _requestDetailList;
set requestDetailList(AllRequestsAndCount? value) { set requestDetailList(AllRequestsAndCount? value) {

@ -1,15 +1,12 @@
import 'dart:convert'; import 'dart:convert';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:fluttertoast/fluttertoast.dart'; import 'package:fluttertoast/fluttertoast.dart';
import 'package:http/http.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/http_status_manger.dart';
import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/models/issue.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/service_request/pending_service_request_model.dart'; import 'package:test_sa/models/service_request/pending_service_request_model.dart';
import 'package:test_sa/models/service_request/service_report.dart'; import 'package:test_sa/models/service_request/service_report.dart';
@ -40,7 +37,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
// state code of current request to defied error message // state code of current request to defied error message
// like 400 customer request failed // like 400 customer request failed
// 500 service not available // 500 service not available
int stateCode; int? stateCode;
bool _isDetialLoading = false; bool _isDetialLoading = false;
bool get isDetialLoading => _isDetialLoading; bool get isDetialLoading => _isDetialLoading;
@ -51,21 +48,21 @@ class ServiceRequestsProvider extends ChangeNotifier {
} // true if there is next page in product list and false if not } // true if there is next page in product list and false if not
bool nextPage = true; bool nextPage = true;
TimeOfDay _selectedTime; TimeOfDay? _selectedTime;
TimeOfDay get selectedTime => _selectedTime; TimeOfDay? get selectedTime => _selectedTime;
set selectedTime(TimeOfDay value) { set selectedTime(TimeOfDay? value) {
_selectedTime = value; _selectedTime = value;
notifyListeners(); notifyListeners();
} // list of user requests } // list of user requests
List<ServiceRequest> serviceRequests; List<ServiceRequest>? serviceRequests;
List<SearchWorkOrder> workOrders = []; List<SearchWorkOrder> workOrders = [];
List<SparePartsWorkOrders> _sparePartList = []; List<SparePartsWorkOrders> _sparePartList = [];
SparePartsWorkOrders _initialSelectedSparePart = SparePartsWorkOrders(); SparePartsWorkOrders _initialSelectedSparePart = SparePartsWorkOrders();
ServiceRequest _currentSelectedRequest; ServiceRequest? _currentSelectedRequest;
int _selectedListIndex = 0; int _selectedListIndex = 0;
int get selectedListIndex => _selectedListIndex; int get selectedListIndex => _selectedListIndex;
@ -75,9 +72,9 @@ class ServiceRequestsProvider extends ChangeNotifier {
notifyListeners(); notifyListeners();
} }
ServiceRequest get currentSelectedRequest => _currentSelectedRequest; ServiceRequest? get currentSelectedRequest => _currentSelectedRequest;
set currentSelectedRequest(ServiceRequest value) { set currentSelectedRequest(ServiceRequest? value) {
_currentSelectedRequest = value; _currentSelectedRequest = value;
notifyListeners(); notifyListeners();
} }
@ -85,7 +82,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
// when requests in-process _loading = true // when requests in-process _loading = true
// done _loading = true // done _loading = true
// failed _loading = false // failed _loading = false
bool isLoading; bool isLoading = false;
ServiceRequestSearch search = ServiceRequestSearch(); ServiceRequestSearch search = ServiceRequestSearch();
@ -116,7 +113,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
List requestsListJson = json.decode(response.body)["data"]; List requestsListJson = json.decode(response.body)["data"];
List<ServiceRequest> serviceRequestsPage = requestsListJson.map((request) => ServiceRequest.fromJson(request)).toList(); List<ServiceRequest> serviceRequestsPage = requestsListJson.map((request) => ServiceRequest.fromJson(request)).toList();
serviceRequests ??= []; serviceRequests ??= [];
serviceRequests.addAll(serviceRequestsPage); serviceRequests!.addAll(serviceRequestsPage);
notifyListeners(); notifyListeners();
if (serviceRequestsPage.length == pageItemNumber) { if (serviceRequestsPage.length == pageItemNumber) {
nextPage = true; nextPage = true;
@ -135,40 +132,40 @@ class ServiceRequestsProvider extends ChangeNotifier {
} }
} }
Future<ServiceRequest> getSingleServiceRequest({ // Future<ServiceRequest> getSingleServiceRequest({
required String requestId, // required String requestId,
required String host, // required String host,
required User user, // required User user,
required AppLocalizations subtitle, // required AppLocalizations subtitle,
}) async { // }) async {
String userData = ''; // String userData = '';
if (user != null) { // if (user != null) {
userData += "&uid=" + user.id; // userData += "&uid=" + user!.id!;
userData += "&token=" + user.token; // userData += "&token=" + user!.token!;
} // }
//
Response response; // Response response;
try { // try {
response = await get(Uri.parse( // response = await get(Uri.parse(
host + // host +
URLs.getSingleServiceRequest + // URLs.getSingleServiceRequest +
'?call_nid=$requestId' // '?call_nid=$requestId'
'$userData', // '$userData',
)); // ));
} catch (error) { // } catch (error) {
throw (HttpStatusManger.getStatusMessage(status: -1, subtitle: subtitle)); // throw (HttpStatusManger.getStatusMessage(status: -1, subtitle: subtitle));
} // }
//
// If the call to the server was successful, parse the JSON. // // If the call to the server was successful, parse the JSON.
if (response.statusCode >= 200 && response.statusCode < 300) { // if (response.statusCode >= 200 && response.statusCode < 300) {
// If the call to the server was successful, parse the JSON. // // If the call to the server was successful, parse the JSON.
List jsonList = json.decode(utf8.decode(response.bodyBytes).replaceAll("\\", "")); // List jsonList = json.decode(utf8.decode(response.bodyBytes).replaceAll("\\", ""));
List<ServiceRequest> _requests = jsonList.map((i) => ServiceRequest.fromJson(i)).toList(); // List<ServiceRequest> _requests = jsonList.map((i) => ServiceRequest.fromJson(i)).toList();
return _requests[0]; // return _requests[0];
} else { // } else {
throw (HttpStatusManger.getStatusMessage(status: response.statusCode, subtitle: subtitle)); // throw (HttpStatusManger.getStatusMessage(status: response.statusCode, subtitle: subtitle));
} // }
} // }
Future<void> createRequest({ Future<void> createRequest({
required BuildContext context, required BuildContext context,
@ -185,7 +182,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
"requestedTime": DateTime.now().toIso8601String(), "requestedTime": DateTime.now().toIso8601String(),
"client": user.clientId, "client": user.clientId,
"callComments": serviceRequest.callComments, "callComments": serviceRequest.callComments,
if (serviceRequest.devicePhotos.isNotEmpty) "attachmentsCallRequest": serviceRequest.devicePhotos.map((e) => {"name": e}).toList(), if (serviceRequest.devicePhotos?.isNotEmpty ?? false) "attachmentsCallRequest": serviceRequest.devicePhotos!.map((e) => {"name": e}).toList(),
"priority": serviceRequest.priority?.toJson(), "priority": serviceRequest.priority?.toJson(),
"defectType": serviceRequest.defectType?.toJson(), "defectType": serviceRequest.defectType?.toJson(),
"typeofRequest": serviceRequest.type?.toJson(), "typeofRequest": serviceRequest.type?.toJson(),
@ -226,7 +223,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
if (serviceRequests != null) { if (serviceRequests != null) {
var data = json.decode(utf8.decode(response.bodyBytes)); var data = json.decode(utf8.decode(response.bodyBytes));
if (data is List) { if (data is List) {
serviceRequests.insert(0, ServiceRequest.fromJson(data[0])); serviceRequests!.insert(0, ServiceRequest.fromJson(data[0]));
} else { } else {
if (data["data"] != null && data["data"] == true) { if (data["data"] != null && data["data"] == true) {
// serviceRequests.insert(0, ServiceRequest.fromJson(data[0])); // serviceRequests.insert(0, ServiceRequest.fromJson(data[0]));
@ -246,30 +243,30 @@ class ServiceRequestsProvider extends ChangeNotifier {
} }
} }
Future<int> createIssueReport({ // Future<int> createIssueReport({
required String host, // required String host,
required User user, // required User user,
required Issue issue, // required Issue issue,
}) async { // }) async {
Response response; // Response response;
Map<String, String> body = issue.toMap(); // Map<String, String> body = issue.toMap();
body["uid"] = user.id; // body["uid"] = user.id;
body["token"] = user.token; // body["token"] = user.token;
try { // try {
response = await post( // response = await post(
Uri.parse(host + URLs.createReport), // Uri.parse(host + URLs.createReport),
body: body, // body: body,
); // );
//
stateCode = response.statusCode; // stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {} // if (response.statusCode >= 200 && response.statusCode < 300) {}
return response.statusCode; // return response.statusCode;
} catch (error) { // } catch (error) {
return -1; // return -1;
} // }
} // }
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 await ApiManager.instance.get(URLs.CheckIfAssetHasAnotherServiceRequest + "?assetId=$assetId");
@ -285,13 +282,13 @@ class ServiceRequestsProvider extends ChangeNotifier {
Future<int> updateRequest({required User user, required ServiceRequest request}) async { Future<int> updateRequest({required User user, required ServiceRequest request}) async {
isLoading = true; isLoading = true;
notifyListeners(); notifyListeners();
Map<String, dynamic> serviceRequest = await getServiceRequestById(requestId: request.id) ?? ""; Map<String, dynamic> serviceRequest = await getServiceRequestById(requestId: request.id!);
final List callSiteContacts = (serviceRequest['callSiteContactPerson'] as List); final List callSiteContacts = (serviceRequest['callSiteContactPerson'] as List);
final Map<String, dynamic> callSiteContactPerson = callSiteContacts.isEmpty ? {} : callSiteContacts[0]; final Map<String, dynamic> callSiteContactPerson = callSiteContacts.isEmpty ? {} : callSiteContacts[0];
Response response; Response response;
try { try {
if ((request.audio ?? "").isNotEmpty) { if ((request.audio ?? "").isNotEmpty) {
request.audio = request.audio.substring(request.audio.indexOf("=") + 1, request.audio.length); request.audio = request.audio!.substring(request.audio!.indexOf("=") + 1, request.audio!.length);
} }
} catch (ex) {} } catch (ex) {}
@ -423,14 +420,12 @@ class ServiceRequestsProvider extends ChangeNotifier {
} }
} }
CallRequest callRequestForWorkOrder; CallRequest? callRequestForWorkOrder;
Future<CallRequest> getCallRequestForWorkOrder({String? callId}) async { Future<CallRequest?> getCallRequestForWorkOrder({required String callId}) async {
Response response; Response response;
try { try {
response = await ApiManager.instance.get( response = await ApiManager.instance.get(URLs.getCallRequestForWorkOrder + "?callId=$callId");
URLs.getCallRequestForWorkOrder + "?callId=$callId",
);
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
@ -474,7 +469,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
} }
} }
Future<ServiceReport> getSubWorkOrderDetails({required String parentId}) async { Future<ServiceReport?> getSubWorkOrderDetails({required String parentId}) async {
Response response; Response response;
try { try {
response = await ApiManager.instance.get(URLs.getSubWorkerInfoAccordingToPreviousStep + "?parentId=$parentId"); response = await ApiManager.instance.get(URLs.getSubWorkerInfoAccordingToPreviousStep + "?parentId=$parentId");
@ -491,38 +486,38 @@ class ServiceRequestsProvider extends ChangeNotifier {
} }
} }
Future<int> createDuplicatedReport({ // Future<int> createDuplicatedReport({
required String host, // required String host,
required User user, // required User user,
required ServiceRequest request, // required ServiceRequest request,
}) async { // }) async {
Response response; // Response response;
String userData = ''; // String userData = '';
if (user != null) { // if (user != null) {
userData += "&uid=" + user.id; // userData += "&uid=" + user.id;
userData += "&token=" + user.token; // userData += "&token=" + user.token;
} // }
//
try { // try {
response = await get( // response = await get(
Uri.parse(host + URLs.createDuplicatedReport + "?nid=${request.id}" + userData), // Uri.parse(host + URLs.createDuplicatedReport + "?nid=${request.id}" + userData),
); // );
//
stateCode = response.statusCode; // stateCode = response.statusCode;
//
if (response.statusCode >= 200 && response.statusCode < 300) { // if (response.statusCode >= 200 && response.statusCode < 300) {
reset(); // reset();
notifyListeners(); // notifyListeners();
} // }
return response.statusCode; // return response.statusCode;
} catch (error) { // } catch (error) {
return -1; // return -1;
} // }
} // }
Future<int> updateServiceReport(BuildContext context, {required ServiceReport report}) async { Future<int> updateServiceReport(BuildContext context, {required ServiceReport report}) async {
Response response; Response response;
report.callRequest = CallRequest(id: report.callRequest.id); report.callRequest = CallRequest(id: report.callRequest!.id!);
Map<String, dynamic> body = report.toJson(); Map<String, dynamic> body = report.toJson();
try { try {
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
@ -573,20 +568,15 @@ class ServiceRequestsProvider extends ChangeNotifier {
} }
} }
Future<int> updateServiceReportTimer({ Future<int> updateServiceReportTimer({required String host, required User user, required TimerModel timer, required ServiceRequest request}) async {
required String host,
required User user,
required TimerModel timer,
required ServiceRequest request,
}) async {
Response response; Response response;
Map<String, dynamic> body = {}; Map<String, dynamic> body = {};
body["uid"] = user.id; body["uid"] = user.id;
body["token"] = user.token; body["token"] = user.token;
body["job_id"] = request.id; body["job_id"] = request.id;
body["start_time"] = (timer.startAt.millisecondsSinceEpoch / 1000).toStringAsFixed(0); body["start_time"] = (timer.startAt!.millisecondsSinceEpoch / 1000).toStringAsFixed(0);
body["end_time"] = (timer.endAt.millisecondsSinceEpoch / 1000).toStringAsFixed(0); body["end_time"] = (timer.endAt!.millisecondsSinceEpoch / 1000).toStringAsFixed(0);
body["working_hours"] = (timer.durationInSecond / 60 / 60).toStringAsFixed(5); body["working_hours"] = (timer.durationInSecond! / 60 / 60).toStringAsFixed(5);
body["report_id"] = request.reportID; body["report_id"] = request.reportID;
try { try {
response = await post( response = await post(
@ -622,7 +612,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
} }
} }
Future<ServiceRequest> getServiceRequestObjectById({required String requestId}) async { Future<ServiceRequest?> getServiceRequestObjectById({required String requestId}) async {
try { try {
isDetialLoading = true; isDetialLoading = true;
Response response = await ApiManager.instance.get(URLs.getServiceRequestById + "?callRequestId=$requestId"); Response response = await ApiManager.instance.get(URLs.getServiceRequestById + "?callRequestId=$requestId");
@ -642,9 +632,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
Future<Map<String, dynamic>> getServiceRequestById({required String requestId}) async { Future<Map<String, dynamic>> getServiceRequestById({required String requestId}) async {
Response response; Response response;
try { try {
response = await ApiManager.instance.get( response = await ApiManager.instance.get(URLs.getServiceRequestById + "?callRequestId=$requestId");
URLs.getServiceRequestById + "?callRequestId=$requestId",
);
} catch (error) { } catch (error) {
print(error); print(error);
return {}; return {};
@ -678,12 +666,9 @@ class ServiceRequestsProvider extends ChangeNotifier {
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) if (search.assignedEmployee != null) "assignedEmployees": [search.assignedEmployee!.id],
"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 && dateOperator != null) "visitDateSymbol": dateOperator?.toJson(),
@ -710,11 +695,11 @@ class ServiceRequestsProvider extends ChangeNotifier {
} }
} }
Future<SuppEngineerWorkOrders> addSupplierEngineer(SupplierEngineer supplierEngineer) async { Future<SuppEngineerWorkOrders?> addSupplierEngineer(SupplierEngineer supplierEngineer) async {
isLoading = true; isLoading = true;
notifyListeners(); notifyListeners();
Response response; Response response;
SuppEngineerWorkOrders res; SuppEngineerWorkOrders? res;
try { try {
response = await ApiManager.instance.post(URLs.addSupplierEngineer, body: supplierEngineer.toJson()); response = await ApiManager.instance.post(URLs.addSupplierEngineer, body: supplierEngineer.toJson());
stateCode = response.statusCode; stateCode = response.statusCode;

@ -65,14 +65,14 @@ class SettingProvider extends ChangeNotifier {
} }
void selectAssetGroup(User user) { void selectAssetGroup(User user) {
if (user.assetGroups.length == 1) { if (user.assetGroups!.length == 1) {
_assetGroup = user.assetGroups.first; _assetGroup = user.assetGroups!.first;
} else { } else {
int fmIndex = user.assetGroups.indexWhere((element) => element.id == 1); int fmIndex = user.assetGroups!.indexWhere((element) => element.id == 1);
if (fmIndex < 0) { if (fmIndex < 0) {
_assetGroup = user.assetGroups.first; _assetGroup = user.assetGroups!.first;
} else { } else {
_assetGroup = user.assetGroups[fmIndex]; _assetGroup = user.assetGroups![fmIndex];
} }
} }
setAssetGroup(_assetGroup); setAssetGroup(_assetGroup);

@ -3,7 +3,7 @@ class Validator {
Validator._(); Validator._();
// check if string not empty and has value // check if string not empty and has value
static bool hasValue(String string) { static bool hasValue(String? string) {
if (string == null || string.isEmpty) return false; if (string == null || string.isEmpty) return false;
return true; return true;
} }

@ -240,7 +240,7 @@ class MyApp extends StatelessWidget {
onTap: () { onTap: () {
FocusScopeNode currentFocus = FocusScope.of(context); FocusScopeNode currentFocus = FocusScope.of(context);
if (!currentFocus.hasPrimaryFocus) { if (!currentFocus.hasPrimaryFocus) {
FocusManager.instance.primaryFocus.unfocus(); FocusManager.instance.primaryFocus!.unfocus();
} }
}, },
child: MaterialApp( child: MaterialApp(
@ -260,14 +260,14 @@ class MyApp extends StatelessWidget {
LandPage.routeName: (_) => const LandPage(), LandPage.routeName: (_) => const LandPage(),
NewGasRefillRequestPage.routeName: (_) => const NewGasRefillRequestPage(), NewGasRefillRequestPage.routeName: (_) => const NewGasRefillRequestPage(),
ServiceRequestsPage.id: (_) => ServiceRequestsPage(), ServiceRequestsPage.id: (_) => ServiceRequestsPage(),
ReportIssuesPage.id: (_) => const ReportIssuesPage(), //ReportIssuesPage.id: (_) => ReportIssuesPage(),
RequestGasRefill.id: (_) => const RequestGasRefill(), RequestGasRefill.id: (_) => RequestGasRefill(),
CreateServiceRequestPage.id: (_) => const CreateServiceRequestPage(), CreateServiceRequestPage.id: (_) => CreateServiceRequestPage(),
SingleHospitalPicker.id: (_) => SingleHospitalPicker(), // SingleHospitalPicker.id: (_) => SingleHospitalPicker(),
MyAssetsPage.id: (_) => const MyAssetsPage(), MyAssetsPage.id: (_) => const MyAssetsPage(),
SingleDepartmentPicker.id: (_) => SingleDepartmentPicker(), SingleDepartmentPicker.id: (_) => SingleDepartmentPicker(),
NotificationsPage.id: (_) => NotificationsPage(), NotificationsPage.id: (_) => NotificationsPage(),
FutureRequestServiceDetails.id: (_) => FutureRequestServiceDetails(), // FutureRequestServiceDetails.id: (_) => FutureRequestServiceDetails(),
// PreventiveMaintenanceVisitsPage.id: (_) => PreventiveMaintenanceVisitsPage(), // PreventiveMaintenanceVisitsPage.id: (_) => PreventiveMaintenanceVisitsPage(),
PpmPage.id: (_) => const PpmPage(), PpmPage.id: (_) => const PpmPage(),
TrackGasRefillPage.id: (_) => const TrackGasRefillPage(), TrackGasRefillPage.id: (_) => const TrackGasRefillPage(),
@ -276,13 +276,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: (_) => const CreateSubWorkOrderPage(), CreateSubWorkOrderPage.id: (_) => CreateSubWorkOrderPage(),
WorkOrderListPage.id: (_) => WorkOrderListPage(), WorkOrderListPage.id: (_) => WorkOrderListPage(),
AssetDetailPage.id: (_) => AssetDetailPage(), AssetDetailPage.id: (_) => AssetDetailPage(),
AssetSearchScreen.id: (_) => const AssetSearchScreen(), AssetSearchScreen.id: (_) => AssetSearchScreen(),
AssetFilterScreen.id: (_) => const AssetFilterScreen(), AssetFilterScreen.id: (_) => AssetFilterScreen(),
WorkOrderDetailsPage.id: (_) => const WorkOrderDetailsPage(), WorkOrderDetailsPage.id: (_) => WorkOrderDetailsPage(),
UpdateServiceRequestPage.id: (_) => const UpdateServiceRequestPage(), UpdateServiceRequestPage.id: (_) => 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(),

@ -311,7 +311,7 @@ class ServiceReport {
map['reviewComment'] = reviewComment; map['reviewComment'] = reviewComment;
map['comment'] = comment; map['comment'] = comment;
if (attachmentsWorkOrder != null) { if (attachmentsWorkOrder != null) {
map['attachmentsWorkOrder'] = attachmentsWorkOrder!.map((v) => {"name": v.name.getFileName}).toList(); map['attachmentsWorkOrder'] = attachmentsWorkOrder!.map((v) => {"name": v.name!.getFileName}).toList();
} }
if (equipmentStatus != null) { if (equipmentStatus != null) {
map['equipmentStatus'] = equipmentStatus!.toJson(); map['equipmentStatus'] = equipmentStatus!.toJson();

@ -81,7 +81,7 @@ class AppColor {
static Color filterButtonTextColor(BuildContext context) => context.isDark ? neutral30 : neutral50; static Color filterButtonTextColor(BuildContext context) => context.isDark ? neutral30 : neutral50;
static Color getRequestStatusTextColorByName(BuildContext context, String status) { static Color getRequestStatusTextColorByName(BuildContext context, String? status) {
switch ((status ?? "").toLowerCase()) { switch ((status ?? "").toLowerCase()) {
case "in progress": case "in progress":
return orange60; return orange60;
@ -92,7 +92,7 @@ class AppColor {
} }
} }
static Color getRequestStatusColorByName(BuildContext context, String status) { static Color getRequestStatusColorByName(BuildContext context, String? status) {
switch ((status ?? "").toLowerCase()) { switch ((status ?? "").toLowerCase()) {
case "medium": case "medium":
return blueStatus(context); return blueStatus(context);

@ -13,7 +13,7 @@ class AppTextFormField extends StatefulWidget {
final String? hintText; final String? hintText;
final String? labelText; final String? labelText;
final TextInputType? textInputType; final TextInputType? textInputType;
final String initialValue; final String? initialValue;
final TextStyle? style; final TextStyle? style;
final TextStyle? labelStyle; final TextStyle? labelStyle;
final bool enable; final bool enable;
@ -45,7 +45,7 @@ class AppTextFormField extends StatefulWidget {
this.hintText, this.hintText,
this.labelText, this.labelText,
this.textInputType = TextInputType.text, this.textInputType = TextInputType.text,
this.initialValue = "", // Provide default value this.initialValue, // Provide default value
this.enable = true, this.enable = true,
this.style, this.style,
this.contentPadding, this.contentPadding,
@ -71,7 +71,10 @@ class AppTextFormField extends StatefulWidget {
class _AppTextFormFieldState extends State<AppTextFormField> { class _AppTextFormFieldState extends State<AppTextFormField> {
@override @override
void initState() { void initState() {
widget.controller?.text = widget.initialValue; // Use null-aware operator if (widget.initialValue != null) {
widget.controller?.text = widget.initialValue!;
}
super.initState(); super.initState();
} }

@ -16,7 +16,7 @@ class SingleItemDropDownMenu<T extends Base, X extends LoadingListNotifier> exte
final T? initialValue; final T? initialValue;
final bool enabled; final bool enabled;
final bool showAsBottomSheet; final bool showAsBottomSheet;
final List<T> staticData; final List<T>? staticData;
final String title; final String title;
final double? height; final double? height;
final bool showShadow; final bool showShadow;
@ -34,7 +34,7 @@ class SingleItemDropDownMenu<T extends Base, X extends LoadingListNotifier> exte
this.enabled = true, this.enabled = true,
this.height, this.height,
this.showAsBottomSheet = false, this.showAsBottomSheet = false,
this.staticData = const [], // Provide a default empty list this.staticData, // Provide a default empty list
this.showShadow = true, this.showShadow = true,
this.backgroundColor, this.backgroundColor,
this.loading, this.loading,

@ -68,7 +68,7 @@ class GasRefillItemView extends StatelessWidget {
Navigator.of(context).push( Navigator.of(context).push(
MaterialPageRoute( MaterialPageRoute(
builder: (_) => GasRefillDetailsPage( builder: (_) => GasRefillDetailsPage(
priority: request.priority!, priority: request.priority,
date: request.date!, date: request.date!,
model: GasRefillModel(id: request.id), model: GasRefillModel(id: request.id),
), ),

@ -35,7 +35,7 @@ class ActivitiesListView extends StatelessWidget {
body: Consumer<ServiceRequestsProvider>(builder: (context, serviceRequestsProvider, child) { body: Consumer<ServiceRequestsProvider>(builder: (context, serviceRequestsProvider, child) {
return SafeArea( return SafeArea(
child: FutureBuilder( child: FutureBuilder(
future: serviceRequestsProvider.searchWorkOrders(callId: serviceRequestsProvider.currentSelectedRequest.requestCode!), future: serviceRequestsProvider.searchWorkOrders(callId: serviceRequestsProvider.currentSelectedRequest!.requestCode!),
builder: (context, snap) { builder: (context, snap) {
if (snap.connectionState == ConnectionState.waiting) return const Center(child: CircularProgressIndicator()); if (snap.connectionState == ConnectionState.waiting) return const Center(child: CircularProgressIndicator());
workOrders = snap.data as List<SearchWorkOrder>; workOrders = snap.data as List<SearchWorkOrder>;
@ -61,7 +61,7 @@ class ActivitiesListView extends StatelessWidget {
backgroundColor: AppColor.getRequestStatusColorByName(context, workOrders[index].currentSituation!.name!), backgroundColor: AppColor.getRequestStatusColorByName(context, workOrders[index].currentSituation!.name!),
), ),
8.height, 8.height,
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}',
@ -95,16 +95,16 @@ class ActivitiesListView extends StatelessWidget {
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(() {
Navigator.of(context).push( Navigator.of(context).push(
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,
Text(workOrders[index].visitDate?.toServiceRequestCardFormat ?? "", Text(workOrders[index].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))),
@ -115,7 +115,7 @@ class ActivitiesListView extends StatelessWidget {
}, },
).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,
maxWidth: true, maxWidth: true,

@ -51,7 +51,7 @@ class ActivityTypeBottomSheet extends StatelessWidget {
subHeading: item['subHeading']!, subHeading: item['subHeading']!,
context: context, context: context,
onTap: () { onTap: () {
onItemTap(serviceRequest: serviceRequestsProvider.currentSelectedRequest, index: index, context: context); onItemTap(serviceRequest: serviceRequestsProvider.currentSelectedRequest!, index: index, context: context);
}); });
}, },
), ),

@ -53,7 +53,7 @@ class InitialVisitBottomSheet extends StatelessWidget {
8.height, 8.height,
ADatePicker( ADatePicker(
label: context.translation.visitDate, label: context.translation.visitDate,
date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest.visitDate ?? ""), date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest?.visitDate ?? ""),
formatDateWithTime: true, formatDateWithTime: true,
onDatePicker: (selectedDate) { onDatePicker: (selectedDate) {
if (selectedDate != null) { if (selectedDate != null) {
@ -71,11 +71,11 @@ class InitialVisitBottomSheet extends StatelessWidget {
selectedTime.minute, selectedTime.minute,
); );
if (selectedDateTime != null) { if (selectedDateTime != null) {
if (selectedDateTime.isBefore(DateTime.parse(serviceRequestProvider.currentSelectedRequest.date!))) { if (selectedDateTime.isBefore(DateTime.parse(serviceRequestProvider.currentSelectedRequest!.date!))) {
"Visit Date time must be greater then request date".showToast; "Visit Date time must be greater then request date".showToast;
return; return;
} }
serviceRequestProvider.currentSelectedRequest.visitDate = selectedDateTime?.toIso8601String(); serviceRequestProvider.currentSelectedRequest?.visitDate = selectedDateTime?.toIso8601String();
} }
} }
}); });
@ -84,13 +84,13 @@ class InitialVisitBottomSheet extends StatelessWidget {
), ),
// ], // ],
if (serviceRequestProvider.currentSelectedRequest.firstAction?.id == 404 && Provider.of<SettingProvider>(context, listen: false).assetGroup!.id == 1) ...[ if (serviceRequestProvider.currentSelectedRequest?.firstAction?.id == 404 && Provider.of<SettingProvider>(context, listen: false).assetGroup!.id == 1) ...[
8.height, 8.height,
Row( Row(
children: [ children: [
ADatePicker( ADatePicker(
label: context.translation.startDate, label: context.translation.startDate,
date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest.startDate ?? ""), date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest?.startDate ?? ""),
formatDateWithTime: true, formatDateWithTime: true,
onDatePicker: (selectedDate) { onDatePicker: (selectedDate) {
if (selectedDate != null) { if (selectedDate != null) {
@ -109,7 +109,7 @@ class InitialVisitBottomSheet extends StatelessWidget {
); );
if (selectedDateTime != null) { if (selectedDateTime != null) {
serviceRequestProvider.currentSelectedRequest.startDate = selectedDateTime?.toIso8601String(); serviceRequestProvider.currentSelectedRequest?.startDate = selectedDateTime?.toIso8601String();
} }
} }
@ -120,7 +120,7 @@ class InitialVisitBottomSheet extends StatelessWidget {
8.width, 8.width,
ADatePicker( ADatePicker(
label: context.translation.endDate, label: context.translation.endDate,
date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest.endDate ?? ""), date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest?.endDate ?? ""),
formatDateWithTime: true, formatDateWithTime: true,
onDatePicker: (selectedDate) { onDatePicker: (selectedDate) {
if (selectedDate != null) { if (selectedDate != null) {
@ -138,9 +138,9 @@ class InitialVisitBottomSheet extends StatelessWidget {
selectedTime.minute, selectedTime.minute,
); );
if (selectedDateTime != null) { if (selectedDateTime != null) {
serviceRequestProvider.currentSelectedRequest.endDate = selectedDateTime?.toIso8601String(); serviceRequestProvider.currentSelectedRequest?.endDate = selectedDateTime?.toIso8601String();
serviceRequestProvider.currentSelectedRequest.workingHours = serviceRequestProvider.currentSelectedRequest?.workingHours =
(((DateTime.parse(serviceRequestProvider.currentSelectedRequest.endDate!).difference(DateTime.parse(serviceRequestProvider.currentSelectedRequest.startDate!)).inSeconds ?? 0) / 60) / 60).toStringAsFixed(2); (((DateTime.parse(serviceRequestProvider.currentSelectedRequest!.endDate!).difference(DateTime.parse(serviceRequestProvider.currentSelectedRequest!.startDate!)).inSeconds ?? 0) / 60) / 60).toStringAsFixed(2);
} }
} }
}); });
@ -182,10 +182,10 @@ class InitialVisitBottomSheet extends StatelessWidget {
textInputType: TextInputType.multiline, textInputType: TextInputType.multiline,
alignLabelWithHint: true, alignLabelWithHint: true,
onChange: (text) { onChange: (text) {
serviceRequestProvider.currentSelectedRequest.comments = text; serviceRequestProvider.currentSelectedRequest?.comments = text;
}, },
onSaved: (text) { onSaved: (text) {
serviceRequestProvider.currentSelectedRequest.comments = text; serviceRequestProvider.currentSelectedRequest?.comments = text;
}, },
), ),
16.height, 16.height,

@ -54,13 +54,13 @@ class RejectRequestBottomSheet extends StatelessWidget {
SingleItemDropDownMenu<Lookup, FirstActionStatusProvider>( SingleItemDropDownMenu<Lookup, FirstActionStatusProvider>(
context: context, context: context,
title: context.translation.rejectionReason, title: context.translation.rejectionReason,
initialValue: requestDetailProvider.currentSelectedRequest.firstAction, //_currentSelectedRequest.firstAction, initialValue: requestDetailProvider.currentSelectedRequest?.firstAction, //_currentSelectedRequest.firstAction,
onSelect: (value) { onSelect: (value) {
// setState(() { // setState(() {
//_currentSelectedRequest.firstAction = value; //_currentSelectedRequest.firstAction = value;
requestDetailProvider.currentSelectedRequest.firstAction = value; requestDetailProvider.currentSelectedRequest?.firstAction = value;
if (requestDetailProvider.currentSelectedRequest.firstAction!.value != 2) { if (requestDetailProvider.currentSelectedRequest?.firstAction!.value != 2) {
requestDetailProvider.currentSelectedRequest.visitDate = null; requestDetailProvider.currentSelectedRequest?.visitDate = null;
} }
// }); // });
}, },
@ -199,10 +199,10 @@ class RejectRequestBottomSheet extends StatelessWidget {
textInputType: TextInputType.multiline, textInputType: TextInputType.multiline,
alignLabelWithHint: true, alignLabelWithHint: true,
onChange: (text) { onChange: (text) {
requestDetailProvider.currentSelectedRequest.comments = text; requestDetailProvider.currentSelectedRequest?.comments = text;
}, },
onSaved: (text) { onSaved: (text) {
requestDetailProvider.currentSelectedRequest.comments = text; requestDetailProvider.currentSelectedRequest?.comments = text;
}, },
), ),
16.height, 16.height,
@ -217,7 +217,7 @@ class RejectRequestBottomSheet extends StatelessWidget {
onPressed: () async { onPressed: () async {
_formKey.currentState!.save(); _formKey.currentState!.save();
// requestDetailProvider.serviceRequest.device = asset; // requestDetailProvider.serviceRequest.device = asset;
await snapshot.updateRequest(user: userProvider.user!, request: requestDetailProvider.currentSelectedRequest); await snapshot.updateRequest(user: userProvider.user!, request: requestDetailProvider.currentSelectedRequest!);
Navigator.pop(context, true); Navigator.pop(context, true);
}, },
), ),

@ -9,7 +9,6 @@ import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart'; 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/models/device/asset.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/service_request/service_request.dart';
import 'package:test_sa/models/timer_model.dart'; import 'package:test_sa/models/timer_model.dart';
@ -18,8 +17,8 @@ import 'package:test_sa/providers/service_request_providers/first_action_provide
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';
import 'package:test_sa/service_request_latest/views/components/verify_arrival_view.dart'; import 'package:test_sa/service_request_latest/views/components/verify_arrival_view.dart';
import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart';
import 'package:test_sa/views/widgets/date_and_time/time_picker.dart';
import 'package:test_sa/views/widgets/timer/app_timer.dart'; import 'package:test_sa/views/widgets/timer/app_timer.dart';
import '../../../../controllers/providers/api/service_requests_provider.dart'; import '../../../../controllers/providers/api/service_requests_provider.dart';
import '../../../../new_views/app_style/app_color.dart'; import '../../../../new_views/app_style/app_color.dart';
import '../../../../new_views/common_widgets/app_filled_button.dart'; import '../../../../new_views/common_widgets/app_filled_button.dart';
@ -268,7 +267,7 @@ class ServiceRequestBottomSheet {
hideShadow: true, hideShadow: true,
height: 80.toScreenHeight, height: 80.toScreenHeight,
backgroundColor: AppColor.neutral90, backgroundColor: AppColor.neutral90,
date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest.startDate ?? ""), date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest?.startDate ?? ""),
formatDateWithTime: true, formatDateWithTime: true,
onDatePicker: (selectedDate) { onDatePicker: (selectedDate) {
if (selectedDate != null) { if (selectedDate != null) {
@ -286,15 +285,15 @@ class ServiceRequestBottomSheet {
selectedTime.minute, selectedTime.minute,
); );
if (selectedDateTime != null) { if (selectedDateTime != null) {
if (selectedDateTime.isBefore(DateTime.parse(serviceRequestProvider.currentSelectedRequest.date))) { if (selectedDateTime.isBefore(DateTime.parse(serviceRequestProvider.currentSelectedRequest!.date!))) {
"Visit Date time must be greater then request date".showToast; "Visit Date time must be greater then request date".showToast;
return; return;
} }
setState(() { setState(() {
serviceRequestProvider.currentSelectedRequest.startDate = selectedDateTime?.toIso8601String(); serviceRequestProvider.currentSelectedRequest?.startDate = selectedDateTime?.toIso8601String();
}); });
print('start date i got is ${serviceRequestProvider.currentSelectedRequest.startDate}'); print('start date i got is ${serviceRequestProvider.currentSelectedRequest?.startDate}');
} }
} }
}); });
@ -386,10 +385,10 @@ class ServiceRequestBottomSheet {
backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90, backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90,
alignLabelWithHint: true, alignLabelWithHint: true,
onChange: (text) { onChange: (text) {
serviceRequestProvider.currentSelectedRequest.comments = text; serviceRequestProvider.currentSelectedRequest?.comments = text;
}, },
onSaved: (text) { onSaved: (text) {
serviceRequestProvider.currentSelectedRequest.comments = text; serviceRequestProvider.currentSelectedRequest?.comments = text;
}, },
), ),
16.height, 16.height,
@ -466,7 +465,7 @@ class ServiceRequestBottomSheet {
8.height, 8.height,
ADatePicker( ADatePicker(
label: context.translation.visitDate, label: context.translation.visitDate,
date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest.visitDate ?? ""), date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest?.visitDate ?? ""),
formatDateWithTime: true, formatDateWithTime: true,
onDatePicker: (selectedDate) { onDatePicker: (selectedDate) {
if (selectedDate != null) { if (selectedDate != null) {
@ -476,19 +475,13 @@ class ServiceRequestBottomSheet {
).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.month, selectedDate.day, selectedTime.hour, selectedTime.minute);
selectedDate.year,
selectedDate.month,
selectedDate.day,
selectedTime.hour,
selectedTime.minute,
);
if (selectedDateTime != null) { if (selectedDateTime != null) {
if (selectedDateTime.isBefore(DateTime.parse(serviceRequestProvider.currentSelectedRequest.date))) { if (selectedDateTime.isBefore(DateTime.parse(serviceRequestProvider.currentSelectedRequest!.date!))) {
"Visit Date time must be greater then request date".showToast; "Visit Date time must be greater then request date".showToast;
return; return;
} }
serviceRequestProvider.currentSelectedRequest.visitDate = selectedDateTime?.toIso8601String(); serviceRequestProvider.currentSelectedRequest?.visitDate = selectedDateTime?.toIso8601String();
} }
} }
}); });
@ -497,13 +490,13 @@ class ServiceRequestBottomSheet {
), ),
// ], // ],
if (serviceRequestProvider.currentSelectedRequest.firstAction?.id == 404 && Provider.of<SettingProvider>(context, listen: false).assetGroup.id == 1) ...[ if (serviceRequestProvider.currentSelectedRequest?.firstAction?.id == 404 && Provider.of<SettingProvider>(context, listen: false).assetGroup!.id == 1) ...[
8.height, 8.height,
Row( Row(
children: [ children: [
ADatePicker( ADatePicker(
label: context.translation.startDate, label: context.translation.startDate,
date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest.startDate ?? ""), date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest?.startDate ?? ""),
formatDateWithTime: true, formatDateWithTime: true,
onDatePicker: (selectedDate) { onDatePicker: (selectedDate) {
if (selectedDate != null) { if (selectedDate != null) {
@ -521,7 +514,7 @@ class ServiceRequestBottomSheet {
selectedTime.minute, selectedTime.minute,
); );
if (selectedDateTime != null) { if (selectedDateTime != null) {
serviceRequestProvider.currentSelectedRequest.startDate = selectedDateTime?.toIso8601String(); serviceRequestProvider.currentSelectedRequest?.startDate = selectedDateTime?.toIso8601String();
} }
} }
}); });
@ -531,7 +524,7 @@ class ServiceRequestBottomSheet {
8.width, 8.width,
ADatePicker( ADatePicker(
label: context.translation.endDate, label: context.translation.endDate,
date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest.endDate ?? ""), date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest?.endDate ?? ""),
formatDateWithTime: true, formatDateWithTime: true,
onDatePicker: (selectedDate) { onDatePicker: (selectedDate) {
if (selectedDate != null) { if (selectedDate != null) {
@ -541,17 +534,11 @@ class ServiceRequestBottomSheet {
).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.month, selectedDate.day, selectedTime.hour, selectedTime.minute);
selectedDate.year,
selectedDate.month,
selectedDate.day,
selectedTime.hour,
selectedTime.minute,
);
if (selectedDateTime != null) { if (selectedDateTime != null) {
serviceRequestProvider.currentSelectedRequest.endDate = selectedDateTime?.toIso8601String(); serviceRequestProvider.currentSelectedRequest?.endDate = selectedDateTime?.toIso8601String();
serviceRequestProvider.currentSelectedRequest.workingHours = (((DateTime.parse(serviceRequestProvider.currentSelectedRequest.endDate) serviceRequestProvider.currentSelectedRequest?.workingHours = (((DateTime.parse(serviceRequestProvider.currentSelectedRequest!.endDate!)
.difference(DateTime.parse(serviceRequestProvider.currentSelectedRequest.startDate)) .difference(DateTime.parse(serviceRequestProvider.currentSelectedRequest!.startDate!))
.inSeconds ?? .inSeconds ??
0) / 0) /
60) / 60) /
@ -572,10 +559,10 @@ class ServiceRequestBottomSheet {
textInputType: TextInputType.multiline, textInputType: TextInputType.multiline,
alignLabelWithHint: true, alignLabelWithHint: true,
onChange: (text) { onChange: (text) {
serviceRequestProvider.currentSelectedRequest.comments = text; serviceRequestProvider.currentSelectedRequest?.comments = text;
}, },
onSaved: (text) { onSaved: (text) {
serviceRequestProvider.currentSelectedRequest.comments = text; serviceRequestProvider.currentSelectedRequest?.comments = text;
}, },
), ),
16.height, 16.height,
@ -584,7 +571,7 @@ 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);
@ -635,11 +622,11 @@ class ServiceRequestBottomSheet {
SingleItemDropDownMenu<Lookup, FirstActionStatusProvider>( SingleItemDropDownMenu<Lookup, FirstActionStatusProvider>(
context: context, context: context,
title: context.translation.rejectionReason, title: context.translation.rejectionReason,
initialValue: serviceRequestProvider.currentSelectedRequest.firstAction, //_serviceRequest.firstAction, initialValue: serviceRequestProvider.currentSelectedRequest?.firstAction, //_serviceRequest.firstAction,
onSelect: (value) { onSelect: (value) {
serviceRequestProvider.currentSelectedRequest.firstAction = value; serviceRequestProvider.currentSelectedRequest?.firstAction = value;
if (serviceRequestProvider.currentSelectedRequest.firstAction.value != 2) { if (serviceRequestProvider.currentSelectedRequest?.firstAction!.value != 2) {
serviceRequestProvider.currentSelectedRequest.visitDate = null; serviceRequestProvider.currentSelectedRequest?.visitDate = null;
} }
}, },
), ),
@ -649,10 +636,10 @@ class ServiceRequestBottomSheet {
textInputType: TextInputType.multiline, textInputType: TextInputType.multiline,
alignLabelWithHint: true, alignLabelWithHint: true,
onChange: (text) { onChange: (text) {
serviceRequestProvider.currentSelectedRequest.comments = text; serviceRequestProvider.currentSelectedRequest?.comments = text;
}, },
onSaved: (text) { onSaved: (text) {
serviceRequestProvider.currentSelectedRequest.comments = text; serviceRequestProvider.currentSelectedRequest?.comments = text;
}, },
), ),
16.height, 16.height,
@ -665,9 +652,9 @@ 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);
}, },
), ),
@ -776,12 +763,12 @@ class ServiceRequestBottomSheet {
itemBuilder: (context, index) { itemBuilder: (context, index) {
final item = items[index]; final item = items[index];
return listItem( return listItem(
icon: item['icon'], icon: item['icon']!,
heading: item['heading'], heading: item['heading']!,
subHeading: item['subHeading'], subHeading: item['subHeading']!,
context: context, context: context,
onTap: () { onTap: () {
onItemTap(serviceRequest: serviceRequestProvider.currentSelectedRequest, index: index, context: context); onItemTap(serviceRequest: serviceRequestProvider.currentSelectedRequest!, index: index, context: context);
}); });
}, },
), ),
@ -792,7 +779,7 @@ class ServiceRequestBottomSheet {
})); }));
} }
static Future actionBottomSheet({required BuildContext context, required String title, String button1Text, String button2Text, VoidCallback button1Tap, VoidCallback button2Tap}) { 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(
@ -827,11 +814,11 @@ class ServiceRequestBottomSheet {
SizedBox( SizedBox(
width: 200.toScreenHeight, width: 200.toScreenHeight,
child: AppFilledButton( child: AppFilledButton(
label: button1Text ?? context.translation.no, label: noButtonText ?? context.translation.no,
loading: false, loading: false,
buttonColor: AppColor.neutral40, buttonColor: AppColor.neutral40,
textColor: AppColor.black10, textColor: AppColor.black10,
onPressed: button1Tap ?? onPressed: onNoPressed ??
() async { () async {
Navigator.pop(context); Navigator.pop(context);
// await snapshot.updateRequest(user: userProvider.user, request: serviceRequestProvider.serviceRequest); // await snapshot.updateRequest(user: userProvider.user, request: serviceRequestProvider.serviceRequest);
@ -845,7 +832,7 @@ class ServiceRequestBottomSheet {
label: context.translation.yes, label: context.translation.yes,
buttonColor: AppColor.primary10, buttonColor: AppColor.primary10,
loading: false, loading: false,
onPressed: button2Tap, onPressed: onYesPressed,
), ),
), ),
], ],

@ -84,7 +84,7 @@ class _RequestDetailViewState extends State<RequestDetailView> {
children: [ children: [
SingleChildScrollView( SingleChildScrollView(
padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth), padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth),
child: informationCard(serviceRequestsProvider.currentSelectedRequest, userProvider), child: informationCard(serviceRequestsProvider.currentSelectedRequest!, userProvider),
).expanded, ).expanded,
Center( Center(
child: InkWell( child: InkWell(
@ -92,7 +92,7 @@ class _RequestDetailViewState extends State<RequestDetailView> {
try { try {
//use a common list //use a common list
AllRequestsProvider allRequestProvider = Provider.of<AllRequestsProvider>(context, listen: false); AllRequestsProvider allRequestProvider = Provider.of<AllRequestsProvider>(context, listen: false);
int index = allRequestProvider.requestDetailList!.requestsDetails!.indexWhere((element) => element.id.toString() == serviceRequestsProvider.currentSelectedRequest.id); int index = allRequestProvider.requestDetailList!.requestsDetails!.indexWhere((element) => element.id.toString() == serviceRequestsProvider.currentSelectedRequest?.id);
if (index != -1 && index != allRequestProvider.requestDetailList!.requestsDetails!.length) { if (index != -1 && index != allRequestProvider.requestDetailList!.requestsDetails!.length) {
getServiceRequest(requestId: allRequestProvider.requestDetailList!.requestsDetails![index + 1].id.toString()); getServiceRequest(requestId: allRequestProvider.requestDetailList!.requestsDetails![index + 1].id.toString());
} }
@ -108,7 +108,7 @@ class _RequestDetailViewState extends State<RequestDetailView> {
), ),
20.height, 20.height,
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))
(serviceRequestsProvider.currentSelectedRequest?.firstAction == null (serviceRequestsProvider.currentSelectedRequest?.firstAction == null
? Row( ? Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
@ -182,7 +182,7 @@ class _RequestDetailViewState extends State<RequestDetailView> {
onPressed: () { onPressed: () {
Navigator.push( Navigator.push(
context, context,
MaterialPageRoute(builder: (context) => WorkOrderListPage(serviceRequest: serviceRequestsProvider.currentSelectedRequest)), MaterialPageRoute(builder: (context) => WorkOrderListPage(serviceRequest: serviceRequestsProvider.currentSelectedRequest!)),
); );
// Navigator.of(context).pushNamed(WorkOrderListPage.id, arguments: serviceRequest); // Navigator.of(context).pushNamed(WorkOrderListPage.id, arguments: serviceRequest);
}, },

@ -69,7 +69,7 @@ class _SparePartRequestState extends State<SparePartRequest> with TickerProvider
ServiceRequestsProvider serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context, listen: false); ServiceRequestsProvider serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context, listen: false);
Provider.of<ServiceReportLastCallsProvider>(context, listen: false).reset(); Provider.of<ServiceReportLastCallsProvider>(context, listen: false).reset();
Provider.of<ReasonProvider>(context, listen: false).reset(); Provider.of<ReasonProvider>(context, listen: false).reset();
Provider.of<ReasonProvider>(context, listen: false).serviceRequestId = serviceRequestsProvider.currentSelectedRequest.id; Provider.of<ReasonProvider>(context, listen: false).serviceRequestId = serviceRequestsProvider.currentSelectedRequest?.id;
} }
// _isLoading = true; // _isLoading = true;
} }
@ -88,12 +88,12 @@ class _SparePartRequestState extends State<SparePartRequest> with TickerProvider
_isLoading = true; _isLoading = true;
setState(() {}); setState(() {});
ServiceRequestsProvider serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context, listen: false); ServiceRequestsProvider serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context, listen: false);
_serviceReport.callRequest = await _serviceRequestsProvider.getCallRequestForWorkOrder(callId: serviceRequestsProvider.currentSelectedRequest.id!); _serviceReport.callRequest = await _serviceRequestsProvider.getCallRequestForWorkOrder(callId: serviceRequestsProvider.currentSelectedRequest!.id!);
await _assetTypeProvider.getTypes(); await _assetTypeProvider.getTypes();
_serviceReport.assignedEmployee = _serviceReport.callRequest?.assignedEmployee; _serviceReport.assignedEmployee = _serviceReport.callRequest?.assignedEmployee;
_serviceReport.equipmentStatus = _serviceReport.callRequest?.defectType; _serviceReport.equipmentStatus = _serviceReport.callRequest?.defectType;
_serviceReport.serviceType = Lookup(id: 65, name: "Interval", value: 1); // default value in service type as in web _serviceReport.serviceType = Lookup(id: 65, name: "Interval", value: 1); // default value in service type as in web
_spareParts = await _partsProvider.getPartsList(assetId: serviceRequestsProvider.currentSelectedRequest.deviceId); _spareParts = await _partsProvider.getPartsList(assetId: serviceRequestsProvider.currentSelectedRequest?.deviceId);
_isLoading = false; _isLoading = false;
setState(() {}); setState(() {});
} }

@ -40,7 +40,7 @@ class VerifyArrivalView extends StatelessWidget {
subHeading: item['subHeading']!, subHeading: item['subHeading']!,
//context: context, //context: context,
onTap: () { onTap: () {
onItemTap(serviceRequest: serviceRequestsProvider.currentSelectedRequest, index: index, context: context); onItemTap(serviceRequest: serviceRequestsProvider.currentSelectedRequest!, index: index, context: context);
}); });
}, },
), ),

@ -1,48 +1,47 @@
import 'package:another_flushbar/flushbar.dart'; // import 'package:another_flushbar/flushbar.dart';
import 'package:flutter/cupertino.dart'; // import 'package:flutter/foundation.dart';
import 'package:flutter/foundation.dart'; // import 'package:flutter/material.dart';
import 'package:flutter/material.dart'; // import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/app_style/app_color.dart'; // todo delete
// class GeneralUtils {
class GeneralUtils{ // static Duration parseTimeString(String timeString) {
// try {
static Duration parseTimeString(String timeString) { // print('time string i got is ${timeString}');
try { // List<String> timeParts = timeString.split(':');
print('time string i got is ${timeString}'); //
List<String> timeParts = timeString.split(':'); // int hours = int.parse(timeParts[0]);
// int minutes = int.parse(timeParts[1]);
int hours = int.parse(timeParts[0]); // int seconds = int.parse(timeParts[2]);
int minutes = int.parse(timeParts[1]); //
int seconds = int.parse(timeParts[2]); // print('');
//
print(''); // return Duration(hours: hours, minutes: minutes, seconds: seconds);
// } catch (e) {
return Duration(hours: hours, minutes: minutes, seconds: seconds); // if (kDebugMode) {
} catch (e) { // print("Error parsing time string: $e");
if (kDebugMode) { // }
print("Error parsing time string: $e"); // return Duration.zero; // Return zero duration in case of an error
} // }
return Duration.zero; // Return zero duration in case of an error // }
} //
} // static Widget showFlushBar({required BuildContext context, String? title, String? message, double? duration}) {
static Widget showFlushBar({required BuildContext context,String title,String message,double duration}){ // return Flushbar(
return Flushbar( // flushbarPosition: FlushbarPosition.TOP,
flushbarPosition: FlushbarPosition.TOP, // backgroundColor: AppColor.green70,
backgroundColor: AppColor.green70, // title: title ?? "Hey Ninja",
title:title?? "Hey Ninja", // message: message ?? "Lorem Ipsum is simply dummy text of the printing and typesetting industry",
message:message?? "Lorem Ipsum is simply dummy text of the printing and typesetting industry", // duration: Duration(seconds: duration?.toInt() ?? 3),
duration: Duration(seconds:duration?? 3), // flushbarStyle: FlushbarStyle.GROUNDED,
flushbarStyle: FlushbarStyle.GROUNDED, // reverseAnimationCurve: Curves.easeInOut,
reverseAnimationCurve: Curves.easeInOut, // mainButton: IconButton(
mainButton: IconButton( // onPressed: () {
onPressed: () { // Navigator.pop(context);
Navigator.pop(context); // },
}, // icon: const Icon(
icon: const Icon( // Icons.close,
Icons.close, // color: AppColor.white20,
color: AppColor.white20, // ),
), // ),
), // )..show(context);
)..show(context); // }
} // }
}

@ -22,7 +22,7 @@ import '../../widgets/equipment/commissioning_status_buttons.dart';
class AssetFilterScreen extends StatefulWidget { class AssetFilterScreen extends StatefulWidget {
static const String id = "asset_filter_screen"; static const String id = "asset_filter_screen";
final AssetSearch data; final AssetSearch? data;
const AssetFilterScreen({Key? key, this.data}) : super(key: key); const AssetFilterScreen({Key? key, this.data}) : super(key: key);
@ -31,11 +31,11 @@ class AssetFilterScreen extends StatefulWidget {
} }
class _AssetFilterScreenState extends State<AssetFilterScreen> { class _AssetFilterScreenState extends State<AssetFilterScreen> {
AssetSearch filter; late AssetSearch filter;
Lookup _commissioningStatus; Lookup? _commissioningStatus;
Site _site; Site? _site;
Department _department; Department? _department;
String startDate, endDate; String? startDate, endDate;
bool loading = false; bool loading = false;
@override @override
@ -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(() {});
}); });
@ -93,10 +93,9 @@ class _AssetFilterScreenState extends State<AssetFilterScreen> {
CommissioningStatusButtons( CommissioningStatusButtons(
initialValue: _commissioningStatus, initialValue: _commissioningStatus,
onSelect: (value) { onSelect: (value) {
if (value == null) { if (value != null) {
/// the selected value is [All Assets]
}
_commissioningStatus = value; _commissioningStatus = value;
}
}, },
), ),
16.height, 16.height,

@ -14,7 +14,7 @@ import '../../../new_views/common_widgets/default_app_bar.dart';
class AssetSearchScreen extends StatefulWidget { class AssetSearchScreen extends StatefulWidget {
static const String id = "asset_search_screen"; static const String id = "asset_search_screen";
final AssetSearch data; final AssetSearch? data;
const AssetSearchScreen({Key? key, this.data}) : super(key: key); const AssetSearchScreen({Key? key, this.data}) : super(key: key);
@ -23,9 +23,9 @@ class AssetSearchScreen extends StatefulWidget {
} }
class _AssetSearchScreenState extends State<AssetSearchScreen> { class _AssetSearchScreenState extends State<AssetSearchScreen> {
AssetSearch search; late AssetSearch search;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
TextEditingController _assetNameController, _assetNumberController, _snController, _modelController, _supplierController, _siteController, _manufactureController, _mdController; late TextEditingController _assetNameController, _assetNumberController, _snController, _modelController, _supplierController, _siteController, _manufactureController, _mdController;
@override @override
void initState() { void initState() {
@ -225,8 +225,8 @@ class _AssetSearchScreenState extends State<AssetSearchScreen> {
} }
void _search() async { void _search() async {
if (_formKey.currentState.validate()) { if (_formKey.currentState!.validate()) {
_formKey.currentState.save(); _formKey.currentState!.save();
final deviceProvider = Provider.of<AssetProvider>(context, listen: false); final deviceProvider = Provider.of<AssetProvider>(context, listen: false);
deviceProvider.reset(); deviceProvider.reset();
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());

@ -20,15 +20,15 @@ import '../../widgets/requests/request_status.dart';
class DeviceTransferDetails extends StatefulWidget { class DeviceTransferDetails extends StatefulWidget {
final AssetTransfer model; final AssetTransfer model;
const DeviceTransferDetails({Key? key, this.model}) : super(key: key); const DeviceTransferDetails({Key? key, required this.model}) : super(key: key);
@override @override
State<DeviceTransferDetails> createState() => _DeviceTransferDetailsState(); State<DeviceTransferDetails> createState() => _DeviceTransferDetailsState();
} }
class _DeviceTransferDetailsState extends State<DeviceTransferDetails> { class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
UserProvider _userProvider; UserProvider? _userProvider;
AssetTransfer _model; AssetTransfer? _model;
bool _isLoading = false; 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>();
@ -46,12 +46,12 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
key: _scaffoldKey, key: _scaffoldKey,
body: SafeArea( body: SafeArea(
child: FutureBuilder( child: FutureBuilder(
future: Provider.of<AssetTransferProvider>(context).getRequestById(assetTransferId: widget.model.id), future: Provider.of<AssetTransferProvider>(context).getRequestById(assetTransferId: widget.model.id?.toInt()),
builder: (context, snapshot) { builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) { if (snapshot.connectionState == ConnectionState.waiting) {
return const ALoading(); return const ALoading();
} else { } else {
_model = snapshot.data; _model = snapshot.data as AssetTransfer?;
return Form( return Form(
key: _formKey, key: _formKey,
@ -83,7 +83,7 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
8.height, 8.height,
const Divider().defaultStyle(context), const Divider().defaultStyle(context),
8.height, 8.height,
_buildTextWidget(_model?.comment), _buildTextWidget(_model!.comment!),
] ]
], ],
), ),
@ -110,7 +110,7 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
// ), // ),
1.width, 1.width,
Text( Text(
_model?.createdOn != null ? _model.createdOn.toServiceRequestCardFormat : "", _model?.createdOn != null ? _model!.createdOn!.toServiceRequestCardFormat : "",
textAlign: TextAlign.end, textAlign: TextAlign.end,
style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
), ),
@ -131,10 +131,10 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
/// TBD /// TBD
statusLabel: _model?.senderMachineStatusName != null statusLabel: _model?.senderMachineStatusName != null
? StatusLabel( ? StatusLabel(
label: _model?.senderMachineStatusName, label: _model!.senderMachineStatusName!,
id: _model?.senderMachineStatusId, id: _model!.senderMachineStatusId!.toInt(),
textColor: AppColor.getRequestStatusTextColorByName(context, _model.senderMachineStatusName), textColor: AppColor.getRequestStatusTextColorByName(context, _model!.senderMachineStatusName!),
backgroundColor: AppColor.getRequestStatusColorByName(context, _model.senderMachineStatusName), backgroundColor: AppColor.getRequestStatusColorByName(context, _model!.senderMachineStatusName!),
) )
: null, : null,
), ),
@ -151,10 +151,10 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
/// TBD /// TBD
statusLabel: _model?.receiverMachineStatusName != null statusLabel: _model?.receiverMachineStatusName != null
? StatusLabel( ? StatusLabel(
label: _model?.receiverMachineStatusName ?? "", label: _model!.receiverMachineStatusName ?? "",
id: _model?.receiverMachineStatusId, id: _model!.receiverMachineStatusId!.toInt(),
textColor: AppColor.getRequestStatusTextColorByName(context, _model.receiverMachineStatusName), textColor: AppColor.getRequestStatusTextColorByName(context, _model!.receiverMachineStatusName!),
backgroundColor: AppColor.getRequestStatusColorByName(context, _model.receiverMachineStatusName)) backgroundColor: AppColor.getRequestStatusColorByName(context, _model!.receiverMachineStatusName!))
: null, : null,
), ),
], ],
@ -176,13 +176,11 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
return text.bodyText(context); return text.bodyText(context);
} }
_buildCard({required String site, required String unit, required String comment, required bool isSender, StatusLabel statusLabel}) { _buildCard({required String site, required String unit, required String comment, required bool isSender, StatusLabel? statusLabel}) {
bool isCurrentEngineerEligibleForEdit = isSender ? _model?.senderAssignedEmployeeId == _userProvider.user?.userID : _model?.receiverAssignedEmployeeId == _userProvider.user?.userID; bool isCurrentEngineerEligibleForEdit = isSender ? _model?.senderAssignedEmployeeId == _userProvider!.user?.userID : _model?.receiverAssignedEmployeeId == _userProvider!.user?.userID;
bool isCurrentRequestClosed = isSender
? ((_model?.senderMachineStatusName?.toLowerCase()?.contains("close") ?? false))
: ((_model?.receiverMachineStatusName?.toLowerCase()?.contains("close") ?? false));
bool isCurrentRequestClosed =
isSender ? ((_model?.senderMachineStatusName?.toLowerCase().contains("close") ?? false)) : ((_model?.receiverMachineStatusName?.toLowerCase().contains("close") ?? false));
return Column( return Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
@ -198,7 +196,7 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
isSender ? context.translation.senderDetails.heading5(context) : context.translation.receiverDetails.heading5(context), isSender ? context.translation.senderDetails.heading5(context) : context.translation.receiverDetails.heading5(context),
], ],
), ),
if ((_userProvider.user?.type == UsersTypes.engineer)) if ((_userProvider!.user?.type == UsersTypes.engineer))
if (isCurrentEngineerEligibleForEdit && !isCurrentRequestClosed) if (isCurrentEngineerEligibleForEdit && !isCurrentRequestClosed)
// if (isSender // if (isSender
@ -207,7 +205,7 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
// //
"edit".toSvgAsset(height: 48, width: 48).onPress(() async { "edit".toSvgAsset(height: 48, width: 48).onPress(() async {
bool isReload = (await Navigator.of(context).push(MaterialPageRoute(builder: (_) => UpdateDeviceTransfer(model: _model, isSender: isSender)))) as bool; bool isReload = (await Navigator.of(context).push(MaterialPageRoute(builder: (_) => UpdateDeviceTransfer(model: _model!, isSender: isSender)))) as bool;
if (isReload ?? false) { if (isReload ?? false) {
setState(() {}); setState(() {});
} }

@ -38,7 +38,7 @@ class RequestDeviceTransfer extends StatefulWidget {
class _RequestDeviceTransferState extends State<RequestDeviceTransfer> { class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
UserProvider? _userProvider; UserProvider? _userProvider;
SettingProvider? _settingProvider; SettingProvider? _settingProvider;
AssetTransferProvider? _deviceTransferProvider; late AssetTransferProvider _deviceTransferProvider;
final TextEditingController _requestedQuantityController = TextEditingController(); final TextEditingController _requestedQuantityController = TextEditingController();
final AssetTransfer _transferModel = AssetTransfer(); final AssetTransfer _transferModel = AssetTransfer();
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
@ -61,12 +61,12 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
_transferModel.destFloorId = _assetDestination.floor?.id; _transferModel.destFloorId = _assetDestination.floor?.id;
_transferModel.destDepartmentId = _assetDestination.department?.id; _transferModel.destDepartmentId = _assetDestination.department?.id;
_transferModel.destRoomId = _assetDestination.room?.id; _transferModel.destRoomId = _assetDestination.room?.id;
_transferModel.receiverEndUserId = _selectedNurse != null ? _selectedNurse.id : null; _transferModel.receiverEndUserId = _selectedNurse?.id;
if (!_formKey.currentState.validate() || !(await _transferModel.validate(context))) { if (!_formKey.currentState!.validate() || !(await _transferModel.validate(context))) {
return; return;
} }
_formKey.currentState.save(); _formKey.currentState!.save();
await _deviceTransferProvider.createRequest(context: context, assetDestination: _transferModel, asset: _pickedAsset); await _deviceTransferProvider.createRequest(context: context, assetDestination: _transferModel, asset: _pickedAsset!);
} }
@override @override
@ -118,7 +118,7 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
_assetDestination.floor = null; _assetDestination.floor = null;
_assetDestination.department = null; _assetDestination.department = null;
_selectedNurse = null; _selectedNurse = null;
Provider.of<NurseProvider>(context, listen: false).siteId = value.id!.toInt(); Provider.of<NurseProvider>(context, listen: false).siteId = value!.id!.toInt();
Provider.of<NurseProvider>(context, listen: false).getData(); Provider.of<NurseProvider>(context, listen: false).getData();
setState(() {}); setState(() {});
}, },

@ -29,9 +29,9 @@ class SearchAssetPage extends StatefulWidget {
class _SearchAssetPageState extends State<SearchAssetPage> { class _SearchAssetPageState extends State<SearchAssetPage> {
int _selectedIndex = 0; int _selectedIndex = 0;
AssetSearch search; AssetSearch? search;
TextEditingController _searchController; late TextEditingController _searchController;
AssetProvider _deviceProvider; late AssetProvider _deviceProvider;
List<Asset> _searchableList = []; List<Asset> _searchableList = [];
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
bool _isFirst = true; bool _isFirst = true;
@ -44,7 +44,7 @@ class _SearchAssetPageState extends State<SearchAssetPage> {
@override @override
void dispose() { void dispose() {
_searchController?.dispose(); _searchController.dispose();
_deviceProvider.searchReset(); _deviceProvider.searchReset();
super.dispose(); super.dispose();
} }
@ -158,7 +158,7 @@ class _SearchAssetPageState extends State<SearchAssetPage> {
void _search() async { void _search() async {
FocusScope.of(context).unfocus(); FocusScope.of(context).unfocus();
_formKey.currentState.save(); _formKey.currentState!.save();
_deviceProvider.searchReset(); _deviceProvider.searchReset();
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
await _deviceProvider.getAssets(search: search, isSearchBy: true); await _deviceProvider.getAssets(search: search, isSearchBy: true);
@ -174,17 +174,17 @@ class _SearchAssetPageState extends State<SearchAssetPage> {
/// todo : check oracle code (no matched parameter) /// todo : check oracle code (no matched parameter)
switch (_selectedIndex) { switch (_selectedIndex) {
case 0: case 0:
search.assetName = value; search!.assetName = value;
break; break;
case 1: case 1:
search.assetNo = value; search!.assetNo = value;
break; break;
case 2: case 2:
search.oracleCodeValue = value; search!.oracleCodeValue = value;
search.oracleCodeTypeId = 412; search!.oracleCodeTypeId = 412;
break; break;
case 3: case 3:
search.assetSerialNumber = value; search!.assetSerialNumber = value;
break; break;
default: default:
break; break;

@ -19,9 +19,9 @@ class TrackDeviceTransferPage extends StatefulWidget {
} }
class _TrackDeviceTransferPageState extends State<TrackDeviceTransferPage> with TickerProviderStateMixin { class _TrackDeviceTransferPageState extends State<TrackDeviceTransferPage> with TickerProviderStateMixin {
AssetTransferProvider _deviceTransferProvider; late AssetTransferProvider _deviceTransferProvider;
UserProvider _userProvider; late UserProvider _userProvider;
SettingProvider _settingProvider; late SettingProvider _settingProvider;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -38,10 +38,7 @@ class _TrackDeviceTransferPageState extends State<TrackDeviceTransferPage> with
stateCode: _deviceTransferProvider.stateCode, stateCode: _deviceTransferProvider.stateCode,
onRefresh: () async { onRefresh: () async {
_deviceTransferProvider.reset(); _deviceTransferProvider.reset();
await _deviceTransferProvider.getRequests( await _deviceTransferProvider.getRequests(user: _userProvider.user!, host: _settingProvider.host!);
user: _userProvider.user,
host: _settingProvider.host,
);
}, },
child: Stack( child: Stack(
children: [ children: [
@ -51,12 +48,9 @@ class _TrackDeviceTransferPageState extends State<TrackDeviceTransferPage> with
child: DeviceTransferList( child: DeviceTransferList(
nextPage: _deviceTransferProvider.nextPage, nextPage: _deviceTransferProvider.nextPage,
onLazyLoad: () async { onLazyLoad: () async {
await _deviceTransferProvider.getRequests( await _deviceTransferProvider.getRequests(user: _userProvider.user!, host: _settingProvider.host!);
user: _userProvider.user,
host: _settingProvider.host,
);
}, },
items: _deviceTransferProvider.items, items: _deviceTransferProvider.items!,
), ),
), ),
], ],

@ -1,5 +1,4 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:developer';
import 'dart:io'; import 'dart:io';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
@ -20,9 +19,7 @@ import 'package:test_sa/providers/asset_transfer/asset_transfer_status_provider.
import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/app_style/sizing.dart';
import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; import 'package:test_sa/views/widgets/images/multi_image_picker.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import 'package:test_sa/views/widgets/status/asset_status.dart';
import '../../../controllers/validator/validator.dart';
import '../../../extensions/text_extensions.dart'; import '../../../extensions/text_extensions.dart';
import '../../../models/lookup.dart'; import '../../../models/lookup.dart';
import '../../../models/ppm/ppm.dart'; import '../../../models/ppm/ppm.dart';
@ -30,7 +27,6 @@ import '../../../new_views/app_style/app_color.dart';
import '../../../new_views/common_widgets/app_text_form_field.dart'; import '../../../new_views/common_widgets/app_text_form_field.dart';
import '../../../new_views/common_widgets/default_app_bar.dart'; import '../../../new_views/common_widgets/default_app_bar.dart';
import '../../../new_views/common_widgets/single_item_drop_down_menu.dart'; import '../../../new_views/common_widgets/single_item_drop_down_menu.dart';
import '../../../providers/gas_request_providers/gas_status_provider.dart';
import '../../widgets/e_signature/e_signature.dart'; import '../../widgets/e_signature/e_signature.dart';
import '../../widgets/timer/app_timer.dart'; import '../../widgets/timer/app_timer.dart';
@ -38,7 +34,7 @@ class UpdateDeviceTransfer extends StatefulWidget {
final AssetTransfer model; final AssetTransfer model;
final bool isSender; final bool isSender;
const UpdateDeviceTransfer({Key? key, this.model, this.isSender}) : super(key: key); const UpdateDeviceTransfer({Key? key, required this.model, required this.isSender}) : super(key: key);
@override @override
State<UpdateDeviceTransfer> createState() => _UpdateDeviceTransferState(); State<UpdateDeviceTransfer> createState() => _UpdateDeviceTransferState();
@ -47,10 +43,10 @@ class UpdateDeviceTransfer extends StatefulWidget {
class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> { class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
bool _isLoading = false; bool _isLoading = false;
bool _validate = false; bool _validate = false;
UserProvider _userProvider; late UserProvider _userProvider;
SettingProvider _settingProvider; late SettingProvider _settingProvider;
Uint8List _signature; Uint8List? _signature;
AssetTransferProvider _deviceTransferProvider; late AssetTransferProvider _deviceTransferProvider;
final TextEditingController _requestedQuantityController = TextEditingController(); final TextEditingController _requestedQuantityController = TextEditingController();
final AssetTransfer _formModel = AssetTransfer(); final AssetTransfer _formModel = AssetTransfer();
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
@ -60,7 +56,7 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
_update() async { _update() async {
if (widget.isSender) { if (widget.isSender) {
_formModel.senderVisitTimers.add( _formModel.senderVisitTimers?.add(
VisitTimers( VisitTimers(
id: 0, id: 0,
startDateTime: _formModel.tbsTimer?.startAt?.toIso8601String(), startDateTime: _formModel.tbsTimer?.startAt?.toIso8601String(),
@ -69,7 +65,7 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
), ),
); );
} else { } else {
_formModel.receiverVisitTimers.add( _formModel.receiverVisitTimers?.add(
VisitTimers( VisitTimers(
id: 0, id: 0,
startDateTime: _formModel.tbsTimer?.startAt?.toIso8601String(), startDateTime: _formModel.tbsTimer?.startAt?.toIso8601String(),
@ -88,11 +84,11 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
return false; return false;
} }
_validate = true; _validate = true;
if (!(_formKey.currentState.validate())) { if (!(_formKey.currentState!.validate())) {
setState(() {}); setState(() {});
return false; return false;
} }
_formKey.currentState.save(); _formKey.currentState!.save();
if (widget.isSender) { if (widget.isSender) {
_formModel.senderAttachments = []; _formModel.senderAttachments = [];
@ -109,9 +105,9 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
} }
if (widget.isSender) { if (widget.isSender) {
_formModel.senderAttachments.add(AssetTransferAttachment(id: 0, attachmentName: attachmentName)); _formModel.senderAttachments!.add(AssetTransferAttachment(id: 0, attachmentName: attachmentName));
} else { } else {
_formModel.receiverAttachments.add(AssetTransferAttachment(id: 0, attachmentName: attachmentName)); _formModel.receiverAttachments!.add(AssetTransferAttachment(id: 0, attachmentName: attachmentName));
} }
} }
} catch (error) { } catch (error) {
@ -125,9 +121,9 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
_formModel.fromDetails(widget.model); _formModel.fromDetails(widget.model);
if (widget.isSender) { if (widget.isSender) {
_files = widget.model?.senderAttachments?.map((e) => File(e.attachmentName))?.toList(); _files = widget.model.senderAttachments?.map((e) => File(e.attachmentName!)).toList() ?? [];
} else { } else {
_files = widget.model?.receiverAttachments?.map((e) => File(e.attachmentName))?.toList(); _files = widget.model.receiverAttachments?.map((e) => File(e.attachmentName!)).toList() ?? [];
} }
super.initState(); super.initState();
@ -148,12 +144,12 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
_deviceTransferProvider = Provider.of<AssetTransferProvider>(context, listen: false); _deviceTransferProvider = Provider.of<AssetTransferProvider>(context, listen: false);
double totalWorkingHours = widget.isSender double totalWorkingHours = widget.isSender
? widget.model.senderVisitTimers.fold(0.0, (sum, item) => sum + DateTime.parse(item.endDateTime).difference(DateTime.parse(item.startDateTime)).inSeconds) ? (widget.model.senderVisitTimers?.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 + DateTime.parse(item.endDateTime).difference(DateTime.parse(item.startDateTime)).inSeconds); : (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),
@ -176,7 +172,7 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
_buildCard(), _buildCard(),
8.height, 8.height,
AppTextFormField( AppTextFormField(
initialValue: widget.isSender ? _formModel.senderTravelingHours : _formModel.receiverTravelingHours, initialValue: widget.isSender ? _formModel.senderTravelingHours ?? "" : _formModel.receiverTravelingHours ?? "",
labelText: context.translation.travelingHours, labelText: context.translation.travelingHours,
onChange: (text) { onChange: (text) {
widget.isSender ? _formModel.senderTravelingHours = text : _formModel.receiverTravelingHours = text; widget.isSender ? _formModel.senderTravelingHours = text : _formModel.receiverTravelingHours = text;
@ -235,20 +231,20 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
return SingleItemDropDownMenu<Lookup, AssetTransferStatusProvider>( return SingleItemDropDownMenu<Lookup, AssetTransferStatusProvider>(
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: snapshot.items initialValue:
?.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;
setState(() {}); setState(() {});
return; return;
} }
if (widget.isSender) { if (widget.isSender) {
_formModel.senderMachineStatusName = value.name; _formModel.senderMachineStatusName = value?.name;
_formModel.senderMachineStatusId = value.id; _formModel.senderMachineStatusId = value?.id;
} else { } else {
_formModel.receiverMachineStatusName = value.name; _formModel.receiverMachineStatusName = value?.name;
_formModel.receiverMachineStatusId = value.id; _formModel.receiverMachineStatusId = value?.id;
} }
setState(() {}); setState(() {});
}, },
@ -258,7 +254,7 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
MultiFilesPicker(label: context.translation.attachImage, files: _files), MultiFilesPicker(label: context.translation.attachImage, files: _files),
8.height, 8.height,
AppTextFormField( AppTextFormField(
initialValue: widget.isSender ? _formModel.senderComment : _formModel.receiverComment, initialValue: widget.isSender ? _formModel.senderComment ?? "" : _formModel.receiverComment ?? "",
labelText: context.translation.comments, labelText: context.translation.comments,
textInputType: TextInputType.multiline, textInputType: TextInputType.multiline,
alignLabelWithHint: true, alignLabelWithHint: true,
@ -303,8 +299,8 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
children: [ children: [
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);
} }

@ -1,5 +1,4 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:developer';
import 'dart:io'; import 'dart:io';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -57,7 +56,7 @@ import '../user/requests/work_order/part_no_button.dart';
class CreateSubWorkOrderPage extends StatefulWidget { class CreateSubWorkOrderPage extends StatefulWidget {
static const id = "/CreateSubWorkOrder"; static const id = "/CreateSubWorkOrder";
final SearchWorkOrder workOrder; final SearchWorkOrder? workOrder;
const CreateSubWorkOrderPage({this.workOrder, Key? key}) : super(key: key); const CreateSubWorkOrderPage({this.workOrder, Key? key}) : super(key: key);
@ -67,15 +66,15 @@ class CreateSubWorkOrderPage extends StatefulWidget {
class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> { class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
SearchWorkOrder _subWorkOrders; late SearchWorkOrder _subWorkOrders;
ServiceReport _serviceReport; late ServiceReport _serviceReport;
PartsProvider _partsProvider; late PartsProvider _partsProvider;
final List<File> _files = []; final List<File> _files = [];
List<SparePart> _spareParts = []; List<SparePart> _spareParts = [];
bool _isLoading = false; bool _isLoading = false;
bool _showVendorFields = false; bool _showVendorFields = false;
SuppEngineerWorkOrders engineer; SuppEngineerWorkOrders? engineer;
SupplierDetails initialSupplier; SupplierDetails? initialSupplier;
final TextEditingController _workPreformedController = TextEditingController(); final TextEditingController _workPreformedController = TextEditingController();
final TextEditingController _partQtyController = TextEditingController(); final TextEditingController _partQtyController = TextEditingController();
@ -86,29 +85,30 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
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,
); );
_serviceReport = ServiceReport(id: widget.workOrder.id, assetType: widget.workOrder.assetType, equipmentStatus: widget.workOrder.equipmentStatus); _serviceReport = ServiceReport(id: widget.workOrder?.id, assetType: widget.workOrder?.assetType, equipmentStatus: widget.workOrder?.equipmentStatus);
_isLoading = true; _isLoading = true;
super.initState(); super.initState();
if (context.mounted) { if (context.mounted) {
Provider.of<ServiceReportAssistantsEmployeeProvider>(context, listen: false).reset(); Provider.of<ServiceReportAssistantsEmployeeProvider>(context, listen: false).reset();
Provider.of<ReasonProvider>(context, listen: false).reset(); Provider.of<ReasonProvider>(context, listen: false).reset();
Provider.of<ReasonProvider>(context, listen: false).serviceRequestId = widget.workOrder.callRequest.id.toString(); Provider.of<ReasonProvider>(context, listen: false).serviceRequestId = widget.workOrder?.callRequest!.id.toString();
} }
} }
ServiceStatusProvider assetTypesProvider; late ServiceStatusProvider assetTypesProvider;
CallRequest _callRequestForWorkOrder; CallRequest? _callRequestForWorkOrder;
Future getAssetType() async { Future getAssetType() async {
Provider.of<ServiceReportLastCallsProvider>(context, listen: false).reset(); Provider.of<ServiceReportLastCallsProvider>(context, listen: false).reset();
final serviceRequestProvider = Provider.of<ServiceRequestsProvider>(context); final serviceRequestProvider = Provider.of<ServiceRequestsProvider>(context);
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) {
final subWoDetails = await serviceRequestProvider.getSubWorkOrderDetails(parentId: _subWorkOrders?.parentWOId.toString()); ServiceReport? subWoDetails = await serviceRequestProvider.getSubWorkOrderDetails(parentId: _subWorkOrders.parentWOId.toString());
if (subWoDetails != null) {
_subWorkOrders.copyDetails(subWoDetails); _subWorkOrders.copyDetails(subWoDetails);
_serviceReport.equipmentStatus = subWoDetails.equipmentStatus; _serviceReport.equipmentStatus = subWoDetails.equipmentStatus;
_serviceReport.reason = subWoDetails.reason; _serviceReport.reason = subWoDetails.reason;
@ -117,10 +117,11 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
_subWorkOrders.visitDate = subWoDetails.visitDate; _subWorkOrders.visitDate = subWoDetails.visitDate;
_subWorkOrders.sparePartsWorkOrders = subWoDetails.sparePartsWorkOrders; _subWorkOrders.sparePartsWorkOrders = subWoDetails.sparePartsWorkOrders;
} }
}
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) {
@ -135,7 +136,7 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
}); });
} }
Asset loanAvailabilityAsset; Asset? loanAvailabilityAsset;
@override @override
void dispose() { void dispose() {
@ -146,8 +147,8 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final user = Provider.of<UserProvider>(context).user; final user = Provider.of<UserProvider>(context).user!;
final isCurrentUserIsAssistantEmp = (user.userID != widget.workOrder.assignedEmployee?.id); final isCurrentUserIsAssistantEmp = (user.userID != widget.workOrder?.assignedEmployee?.id);
if (isCurrentUserIsAssistantEmp) { if (isCurrentUserIsAssistantEmp) {
// _subWorkOrders.assistantEmployees = [widget.workOrder.assistantEmployees?.first?.copyWith(id: 0)]; // _subWorkOrders.assistantEmployees = [widget.workOrder.assistantEmployees?.first?.copyWith(id: 0)];
_subWorkOrders.assistantEmployees = [AssistantEmployees(id: 0, user: AssignedEmployee(id: user.userID, name: user.username))]; _subWorkOrders.assistantEmployees = [AssistantEmployees(id: 0, user: AssignedEmployee(id: user.userID, name: user.username))];
@ -190,7 +191,6 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
date: DateTime.tryParse(_subWorkOrders.visitDate ?? ""), date: DateTime.tryParse(_subWorkOrders.visitDate ?? ""),
formatDateWithTime: true, formatDateWithTime: true,
onDatePicker: (selectedDate) { onDatePicker: (selectedDate) {
if (selectedDate != null) {
showTimePicker( showTimePicker(
context: context, context: context,
initialTime: TimeOfDay.now(), initialTime: TimeOfDay.now(),
@ -203,8 +203,7 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
selectedTime.hour, selectedTime.hour,
selectedTime.minute, selectedTime.minute,
); );
if (selectedDateTime != null) { if (_subWorkOrders.visitDate != null && selectedDateTime.isBefore(DateTime.parse(_subWorkOrders.visitDate!))) {
if (_subWorkOrders.visitDate != null && selectedDateTime.isBefore(DateTime.parse(_subWorkOrders.visitDate))) {
"Visit Date time must be greater then previous date".showToast; "Visit Date time must be greater then previous date".showToast;
return; return;
} }
@ -213,9 +212,7 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
_subWorkOrders.visitDate = selectedDateTime?.toIso8601String(); _subWorkOrders.visitDate = selectedDateTime?.toIso8601String();
}); });
} }
}
}); });
}
}, },
), ),
8.height, 8.height,
@ -229,7 +226,7 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
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);
_subWorkOrders.workingHours = num.tryParse(workingHours ?? "0"); _subWorkOrders.workingHours = num.tryParse(workingHours ?? "0");
} }
@ -246,8 +243,8 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
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(
@ -321,7 +318,7 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
onSelect: (supplier) { onSelect: (supplier) {
if (supplier != null) { if (supplier != null) {
_subWorkOrders.supplier = supplier; _subWorkOrders.supplier = supplier;
log(_subWorkOrders.supplier?.suppPersons?.map((e) => e.personName)?.toString()); // log(_subWorkOrders.supplier?.suppPersons?.map((e) => e.personName)?.toString());
setState(() {}); setState(() {});
} }
}, },
@ -336,7 +333,7 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
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) {
print(suppPerson?.toJson()); print(suppPerson?.toJson());
if (suppPerson != null) { if (suppPerson != null) {
@ -374,7 +371,7 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
useSafeArea: true, useSafeArea: true,
isScrollControlled: true, isScrollControlled: true,
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
builder: (context) => AddSupplierEngineerBottomSheet(_subWorkOrders.supplier.id), builder: (context) => AddSupplierEngineerBottomSheet(_subWorkOrders.supplier!.id!.toInt()),
)) as SuppEngineerWorkOrders; )) as SuppEngineerWorkOrders;
if (suppEngineer != null) { if (suppEngineer != null) {
_subWorkOrders?.supplier?.suppPersons ??= []; _subWorkOrders?.supplier?.suppPersons ??= [];
@ -391,7 +388,7 @@ 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,
@ -411,7 +408,7 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
if (status != null) { if (status != null) {
setState(() { setState(() {
_subWorkOrders.loanAvailablity = status; _subWorkOrders.loanAvailablity = status;
if (_subWorkOrders.loanAvailablity.value != 1) { if (_subWorkOrders.loanAvailablity?.value != 1) {
loanAvailabilityAsset = null; loanAvailabilityAsset = null;
_subWorkOrders.assetLoan = null; _subWorkOrders.assetLoan = null;
} }
@ -432,11 +429,10 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
} }
}, },
), ),
8.height, 8.height,
ServiceReportAssistantEmployeeMenu( ServiceReportAssistantEmployeeMenu(
title: context.translation.assignAssistant, title: context.translation.assignAssistant,
assetId: widget.workOrder?.callRequest?.asset?.id, assetId: widget.workOrder!.callRequest!.asset!.id!.toInt(),
initialValue: (_subWorkOrders.assistantEmployees?.isNotEmpty ?? false) ? _subWorkOrders.assistantEmployees?.first : null, initialValue: (_subWorkOrders.assistantEmployees?.isNotEmpty ?? false) ? _subWorkOrders.assistantEmployees?.first : null,
// initialValue: !isCurrentAssigned // initialValue: !isCurrentAssigned
@ -449,7 +445,7 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
if (employee == null) { if (employee == null) {
_subWorkOrders.assistantEmployees = []; _subWorkOrders.assistantEmployees = [];
} else { } else {
_subWorkOrders.assistantEmployees = [employee?.copyWith(id: 0)]; _subWorkOrders.assistantEmployees = [employee.copyWith(id: 0)];
} }
}, },
), ),
@ -552,13 +548,13 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
setState(() {}); setState(() {});
_subWorkOrders.suppEngineerWorkOrders = []; _subWorkOrders.suppEngineerWorkOrders = [];
if (engineer != null) { if (engineer != null) {
_subWorkOrders.suppEngineerWorkOrders.add(engineer); _subWorkOrders.suppEngineerWorkOrders!.add(engineer!);
} }
// return; // return;
if (await validate()) { if (await validate()) {
_subWorkOrders.attachmentsWorkOrder ??= []; _subWorkOrders.attachmentsWorkOrder ??= [];
for (var file in _files) { for (var file in _files) {
_subWorkOrders.attachmentsWorkOrder.add(Attachment(id: 0, name: "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}")); _subWorkOrders.attachmentsWorkOrder!.add(Attachment(id: 0, name: "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}"));
} }
if (_formKey.currentState?.validate() ?? false) {} if (_formKey.currentState?.validate() ?? false) {}
_formKey.currentState?.save(); _formKey.currentState?.save();
@ -589,7 +585,7 @@ 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);
@ -612,10 +608,10 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
} else if (_showVendorFields && _subWorkOrders.suppEngineerWorkOrders == null) { } else if (_showVendorFields && _subWorkOrders.suppEngineerWorkOrders == null) {
Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.supplierEngineer}"); Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.supplierEngineer}");
return false; return false;
} else if (_showVendorFields && (_subWorkOrders.supplier.suppliername == null || _subWorkOrders.supplier.suppliername.isEmpty)) { } else if (_showVendorFields && (_subWorkOrders.supplier?.suppliername?.isEmpty ?? true)) {
Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.supplier}"); Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.supplier}");
return false; return false;
} else if (_subWorkOrders.calllastSituation.value == 12 && (_subWorkOrders.sparePartsWorkOrders == null || _subWorkOrders.sparePartsWorkOrders.isEmpty)) { } 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) {

@ -13,7 +13,6 @@ import 'package:test_sa/new_views/common_widgets/app_text_form_field.dart';
import 'package:test_sa/views/widgets/loaders/lazy_loading.dart'; import 'package:test_sa/views/widgets/loaders/lazy_loading.dart';
import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; import 'package:test_sa/views/widgets/loaders/no_item_found.dart';
import '../../../../models/gas_refill_comments_model.dart';
import '../../../../new_views/app_style/app_color.dart'; import '../../../../new_views/app_style/app_color.dart';
import '../../../widgets/loaders/loading_manager.dart'; import '../../../widgets/loaders/loading_manager.dart';
@ -28,8 +27,8 @@ class GasRefillCommentsBottomSheet extends StatefulWidget {
class _GasRefillCommentsBottomSheetState extends State<GasRefillCommentsBottomSheet> { class _GasRefillCommentsBottomSheetState extends State<GasRefillCommentsBottomSheet> {
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
GasRefillCommentsProvider commentsProvider; late GasRefillCommentsProvider commentsProvider;
String text; String? text;
@override @override
void initState() { void initState() {
@ -44,7 +43,7 @@ class _GasRefillCommentsBottomSheetState extends State<GasRefillCommentsBottomSh
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
commentsProvider= Provider.of<GasRefillCommentsProvider>(context); commentsProvider = Provider.of<GasRefillCommentsProvider>(context);
final userProvider = Provider.of<UserProvider>(context, listen: false); final userProvider = Provider.of<UserProvider>(context, listen: false);
return Container( return Container(
height: MediaQuery.of(context).size.height * 0.6, height: MediaQuery.of(context).size.height * 0.6,
@ -102,7 +101,7 @@ class _GasRefillCommentsBottomSheetState extends State<GasRefillCommentsBottomSh
//8.height, //8.height,
Align( Align(
alignment: AlignmentDirectional.bottomEnd, alignment: AlignmentDirectional.bottomEnd,
child: Text(DateTime.tryParse(model.createdOn).toIso8601String().toServiceRequestDetailsFormat, child: Text(DateTime.tryParse(model.createdOn!)!.toIso8601String().toServiceRequestDetailsFormat,
style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50)), style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50)),
), ),
], ],
@ -111,8 +110,8 @@ class _GasRefillCommentsBottomSheetState extends State<GasRefillCommentsBottomSh
), ),
), ),
).expanded, ).expanded,
if (userProvider.user.type == UsersTypes.normal_user) 8.height, if (userProvider.user!.type == UsersTypes.normal_user) 8.height,
if (userProvider.user.type == UsersTypes.normal_user) if (userProvider.user!.type == UsersTypes.normal_user)
AppTextFormField( AppTextFormField(
labelText: "Type any comment", labelText: "Type any comment",
backgroundColor: AppColor.neutral30, backgroundColor: AppColor.neutral30,
@ -121,10 +120,10 @@ class _GasRefillCommentsBottomSheetState extends State<GasRefillCommentsBottomSh
validator: (value) => Validator.hasValue(value) ? null : context.translation.requiredField, validator: (value) => Validator.hasValue(value) ? null : context.translation.requiredField,
textInputType: TextInputType.multiline, textInputType: TextInputType.multiline,
suffixIcon: "comment_send".toSvgAsset().paddingOnly(end: 16).onPress(() { suffixIcon: "comment_send".toSvgAsset().paddingOnly(end: 16).onPress(() {
if (_formKey.currentState.validate()) { if (_formKey.currentState!.validate()) {
_formKey.currentState.save(); _formKey.currentState!.save();
// final comment = GasRefillComment(id: 0, gasRefillId: num.tryParse(widget.requestId ?? ""), comment: text); // final comment = GasRefillComment(id: 0, gasRefillId: num.tryParse(widget.requestId ?? ""), comment: text);
commentsProvider.addComment(context, comment: text, id: num.tryParse(widget.requestId ?? "")); commentsProvider.addComment(context, comment: text!, id: int.parse(widget.requestId));
} }
}), }),
onSaved: (value) { onSaved: (value) {

@ -21,9 +21,9 @@ import 'gas_refill_comments.dart';
class GasRefillDetailsPage extends StatefulWidget { class GasRefillDetailsPage extends StatefulWidget {
GasRefillModel model; GasRefillModel model;
String priority, date; String? priority, date;
GasRefillDetailsPage({Key? key, this.priority, this.date, this.model}) : super(key: key); GasRefillDetailsPage({Key? key, this.priority, this.date, required this.model}) : super(key: key);
@override @override
State<GasRefillDetailsPage> createState() => _GasRefillDetailsPageState(); State<GasRefillDetailsPage> createState() => _GasRefillDetailsPageState();
@ -31,7 +31,7 @@ class GasRefillDetailsPage extends StatefulWidget {
class _GasRefillDetailsPageState extends State<GasRefillDetailsPage> { class _GasRefillDetailsPageState extends State<GasRefillDetailsPage> {
GasRefillModel _model = GasRefillModel(gazRefillDetails: []); GasRefillModel _model = GasRefillModel(gazRefillDetails: []);
UserProvider _userProvider; late UserProvider _userProvider;
bool _isLoading = false; bool _isLoading = false;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
@ -54,12 +54,12 @@ class _GasRefillDetailsPageState extends State<GasRefillDetailsPage> {
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();
} else if (snap.hasData) { } else if (snap.hasData) {
_model = snap.data; _model = snap.data as GasRefillModel;
return Column( return Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
@ -93,8 +93,8 @@ class _GasRefillDetailsPageState extends State<GasRefillDetailsPage> {
if (widget.priority != null) if (widget.priority != null)
StatusLabel( StatusLabel(
label: widget.priority, label: widget.priority,
textColor: AppColor.getRequestStatusTextColorByName(context, widget.priority), textColor: AppColor.getRequestStatusTextColorByName(context, widget.priority!),
backgroundColor: AppColor.getRequestStatusColorByName(context, widget.priority), backgroundColor: AppColor.getRequestStatusColorByName(context, widget.priority!),
), ),
8.width, 8.width,
StatusLabel( StatusLabel(
@ -107,19 +107,19 @@ class _GasRefillDetailsPageState extends State<GasRefillDetailsPage> {
8.height, 8.height,
context.translation.gasRefillRequest.heading5(context), context.translation.gasRefillRequest.heading5(context),
8.height, 8.height,
'${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),
gasRefillModel.comment.bodyText(context), gasRefillModel.comment!.bodyText(context),
8.height, 8.height,
] ]
], ],
@ -127,7 +127,7 @@ class _GasRefillDetailsPageState extends State<GasRefillDetailsPage> {
Column( Column(
crossAxisAlignment: CrossAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end,
children: [ children: [
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);
@ -145,7 +145,7 @@ class _GasRefillDetailsPageState extends State<GasRefillDetailsPage> {
}); });
}, },
), ),
if (_userProvider.user.type == UsersTypes.engineer && (gasRefillModel.status?.value ?? 0) != 2) 8.height, if (_userProvider.user!.type == UsersTypes.engineer && (gasRefillModel.status?.value ?? 0) != 2) 8.height,
Text( Text(
(widget.date ?? gasRefillModel.expectedDate)?.toServiceRequestCardFormat ?? "", (widget.date ?? gasRefillModel.expectedDate)?.toServiceRequestCardFormat ?? "",
textAlign: TextAlign.end, textAlign: TextAlign.end,
@ -157,7 +157,7 @@ class _GasRefillDetailsPageState extends State<GasRefillDetailsPage> {
).paddingOnly(top: 16, start: 16, end: 16), ).paddingOnly(top: 16, start: 16, end: 16),
/// TBD /// TBD
(_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),
@ -194,7 +194,7 @@ class _GasRefillDetailsPageState extends State<GasRefillDetailsPage> {
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
Text( Text(
'${context.translation.viewComments}', context.translation.viewComments,
style: AppTextStyles.bodyText.copyWith(color: AppColor.blueStatus(context)), style: AppTextStyles.bodyText.copyWith(color: AppColor.blueStatus(context)),
), ),
4.width, 4.width,

@ -30,7 +30,7 @@ import '../../../widgets/timer/app_timer.dart';
class RequestGasRefill extends StatefulWidget { class RequestGasRefill extends StatefulWidget {
static const String id = "/request-gas-refill"; static const String id = "/request-gas-refill";
final GasRefillModel gasRefillModel; final GasRefillModel? gasRefillModel;
const RequestGasRefill({this.gasRefillModel, Key? key}) : super(key: key); const RequestGasRefill({this.gasRefillModel, Key? key}) : super(key: key);
@ -41,12 +41,12 @@ class RequestGasRefill extends StatefulWidget {
class _RequestGasRefillState extends State<RequestGasRefill> { class _RequestGasRefillState extends State<RequestGasRefill> {
bool _isLoading = false; bool _isLoading = false;
bool _validate = false; bool _validate = false;
Uint8List _engineerSignature; Uint8List? _engineerSignature;
Uint8List _nurseSignature; Uint8List? _nurseSignature;
UserProvider _userProvider; late UserProvider _userProvider;
SettingProvider _settingProvider; late SettingProvider _settingProvider;
GasRefillProvider _gasRefillProvider; GasRefillProvider? _gasRefillProvider;
GasRefillDetails _currentDetails = GasRefillDetails(); GasRefillDetails _currentDetails = GasRefillDetails();
final TextEditingController _deliveredQuantityController = TextEditingController(); final TextEditingController _deliveredQuantityController = TextEditingController();
final TextEditingController _commentController = TextEditingController(); final TextEditingController _commentController = TextEditingController();
@ -62,7 +62,7 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
void initState() { void initState() {
super.initState(); super.initState();
if (widget.gasRefillModel != null) { if (widget.gasRefillModel != null) {
_formModel.fromGasRefillModel(widget.gasRefillModel); _formModel.fromGasRefillModel(widget.gasRefillModel!);
_commentController.text = _formModel.comment ?? ""; _commentController.text = _formModel.comment ?? "";
} }
} }
@ -90,17 +90,17 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
} }
setState(() {}); setState(() {});
_formKey.currentState.save(); _formKey.currentState!.save();
_formModel.comment = _commentController.text; _formModel.comment = _commentController.text;
int status = widget.gasRefillModel == null int? status = widget.gasRefillModel == null
? null /*await _gasRefillProvider.createModel( ? 0 /*await _gasRefillProvider.createModel(
user: _userProvider.user, user: _userProvider.user,
model: _formModel, model: _formModel,
)*/ )*/
: await _gasRefillProvider.updateModel( : await _gasRefillProvider!.updateModel(
user: _userProvider.user, user: _userProvider.user!,
host: _settingProvider.host, host: _settingProvider.host!,
oldModel: widget.gasRefillModel, oldModel: widget.gasRefillModel!,
newModel: _formModel, newModel: _formModel,
); );
//_isLoading = false; //_isLoading = false;
@ -121,19 +121,19 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
Future<bool> _addNewModel(BuildContext context) async { Future<bool> _addNewModel(BuildContext context) async {
_validate = true; _validate = true;
if (!_formKey.currentState.validate()) { if (!_formKey.currentState!.validate()) {
setState(() {}); setState(() {});
return false; return false;
} }
_formKey.currentState.save(); _formKey.currentState!.save();
_currentDetails.gasType = _formModel.gazRefillDetails[0].gasType; _currentDetails.gasType = _formModel.gazRefillDetails![0].gasType;
_currentDetails.cylinderSize = _formModel.gazRefillDetails[0].cylinderSize; _currentDetails.cylinderSize = _formModel.gazRefillDetails![0].cylinderSize;
_currentDetails.cylinderType = _formModel.gazRefillDetails[0].cylinderType; _currentDetails.cylinderType = _formModel.gazRefillDetails![0].cylinderType;
if (!(await _currentDetails.validate(context))) { if (!(await _currentDetails.validate(context))) {
setState(() {}); setState(() {});
return false; return false;
} }
_formModel.gazRefillDetails[0].deliverdQty = _currentDetails.deliverdQty; _formModel.gazRefillDetails![0].deliverdQty = _currentDetails.deliverdQty;
_validate = false; _validate = false;
// Scrollable.ensureVisible(_DetailsKey.currentContext); // Scrollable.ensureVisible(_DetailsKey.currentContext);
_deliveredQuantityController.clear(); _deliveredQuantityController.clear();
@ -161,10 +161,10 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
//_gasRefillProvider.reset(); //_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 {
@ -172,11 +172,11 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
_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(() {});
}); });
@ -207,11 +207,11 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
8.height, 8.height,
/// TBD /// TBD
'${context.translation.gasRequest}: ${widget.gasRefillModel.gazRefillDetails[0].gasType.name}'.bodyText(context), '${context.translation.gasRequest}: ${widget.gasRefillModel!.gazRefillDetails![0].gasType!.name}'.bodyText(context),
'${context.translation.cylinderType}: ${widget.gasRefillModel.gazRefillDetails[0].cylinderType.name}'.bodyText(context), '${context.translation.cylinderType}: ${widget.gasRefillModel!.gazRefillDetails![0].cylinderType!.name}'.bodyText(context),
'${context.translation.cylinderSize}: ${widget.gasRefillModel.gazRefillDetails[0].cylinderSize.name}'.bodyText(context), '${context.translation.cylinderSize}: ${widget.gasRefillModel!.gazRefillDetails![0].cylinderSize!.name}'.bodyText(context),
'${context.translation.quantity}: ${widget.gasRefillModel.gazRefillDetails[0].requestedQty ?? 0}'.bodyText(context), '${context.translation.quantity}: ${widget.gasRefillModel!.gazRefillDetails![0].requestedQty ?? 0}'.bodyText(context),
'${context.translation.site}: ${widget.gasRefillModel.site?.name}'.bodyText(context), '${context.translation.site}: ${widget.gasRefillModel!.site?.name}'.bodyText(context),
], ],
).toShadowContainer(context), ).toShadowContainer(context),
8.height, 8.height,
@ -231,18 +231,18 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
initialValue: _formModel.status, initialValue: _formModel.status,
onSelect: (value) { onSelect: (value) {
if (value?.value == 0) { if (value?.value == 0) {
"Status cannot be change to ${value.name}.".addTranslation.showToast; "Status cannot be change to ${value?.name}.".addTranslation.showToast;
setState(() {}); setState(() {});
return; return;
} }
if(value!=null) { if (value != null) {
_formModel.status = value; _formModel.status = value;
} }
}, },
), ),
8.height, 8.height,
AppTextFormField( AppTextFormField(
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);
@ -268,7 +268,7 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
8.height, 8.height,
ESignature( ESignature(
title: "Engineer Signature", title: "Engineer Signature",
oldSignature: widget.gasRefillModel.engSignature, oldSignature: widget.gasRefillModel?.engSignature,
newSignature: _engineerSignature, newSignature: _engineerSignature,
onSaved: (signature) { onSaved: (signature) {
_engineerSignature = signature; _engineerSignature = signature;
@ -280,7 +280,7 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
8.height, 8.height,
ESignature( ESignature(
title: "Nurse Signature", title: "Nurse Signature",
oldSignature: widget.gasRefillModel.nurseSignature, oldSignature: widget.gasRefillModel?.nurseSignature,
newSignature: _nurseSignature, newSignature: _nurseSignature,
onSaved: (signature) { onSaved: (signature) {
_nurseSignature = signature; _nurseSignature = signature;

@ -19,16 +19,16 @@ class TrackGasRefillPage extends StatefulWidget {
} }
class _TrackGasRefillPageState extends State<TrackGasRefillPage> with TickerProviderStateMixin { class _TrackGasRefillPageState extends State<TrackGasRefillPage> with TickerProviderStateMixin {
GasRefillProvider _gasRefillProvider; GasRefillProvider? _gasRefillProvider;
UserProvider _userProvider; late UserProvider _userProvider;
SettingProvider _settingProvider; late SettingProvider _settingProvider;
bool mostRecent = true; bool mostRecent = true;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (_gasRefillProvider == null) { if (_gasRefillProvider == null) {
_gasRefillProvider = Provider.of<GasRefillProvider>(context); _gasRefillProvider = Provider.of<GasRefillProvider>(context);
_gasRefillProvider.reset(); _gasRefillProvider!.reset();
} }
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
@ -37,16 +37,12 @@ class _TrackGasRefillPageState extends State<TrackGasRefillPage> with TickerProv
appBar: DefaultAppBar(title: context.translation.gasRefillRequest), appBar: DefaultAppBar(title: context.translation.gasRefillRequest),
body: SafeArea( body: SafeArea(
child: LoadingManager( child: LoadingManager(
isLoading: _gasRefillProvider.isLoading, isLoading: _gasRefillProvider!.isLoading,
isFailedLoading: _gasRefillProvider.items == null, isFailedLoading: _gasRefillProvider!.items == null,
stateCode: _gasRefillProvider.stateCode, stateCode: _gasRefillProvider!.stateCode,
onRefresh: () async { onRefresh: () async {
_gasRefillProvider.reset(); _gasRefillProvider!.reset();
await _gasRefillProvider.getRequests( await _gasRefillProvider!.getRequests(user: _userProvider.user!, host: _settingProvider.host!, mostRecent: mostRecent);
user: _userProvider.user,
host: _settingProvider.host,
mostRecent: mostRecent,
);
}, },
child: Stack( child: Stack(
children: [ children: [
@ -54,15 +50,11 @@ class _TrackGasRefillPageState extends State<TrackGasRefillPage> with TickerProv
children: [ children: [
Expanded( Expanded(
child: GasRefillList( child: GasRefillList(
nextPage: _gasRefillProvider.nextPage, nextPage: _gasRefillProvider!.nextPage,
onLazyLoad: () async { onLazyLoad: () async {
await _gasRefillProvider.getRequests( await _gasRefillProvider!.getRequests(user: _userProvider.user!, host: _settingProvider.host!, mostRecent: mostRecent);
user: _userProvider.user,
host: _settingProvider.host,
mostRecent: mostRecent,
);
}, },
items: _gasRefillProvider.items, items: _gasRefillProvider?.items ?? [],
), ),
), ),
], ],

@ -12,7 +12,7 @@ class NotificationsList extends StatelessWidget {
final bool nextPage; final bool nextPage;
final Future<void> Function() onLazyLoad; final Future<void> Function() onLazyLoad;
const NotificationsList({Key? key, this.notifications, this.nextPage, this.onLazyLoad}) : super(key: key); const NotificationsList({Key? key, this.notifications = const <SystemNotificationModel>[], required this.nextPage, required this.onLazyLoad}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {

@ -17,9 +17,9 @@ class NotificationsPage extends StatefulWidget {
} }
class _NotificationsPageState extends State<NotificationsPage> with TickerProviderStateMixin { class _NotificationsPageState extends State<NotificationsPage> with TickerProviderStateMixin {
NotificationsProvider _notificationsProvider; late NotificationsProvider _notificationsProvider;
UserProvider _userProvider; late UserProvider _userProvider;
SettingProvider _settingProvider; late SettingProvider _settingProvider;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -36,7 +36,7 @@ class _NotificationsPageState extends State<NotificationsPage> with TickerProvid
onRefresh: () async { onRefresh: () async {
_notificationsProvider.reset(); _notificationsProvider.reset();
await _notificationsProvider.getSystemNotifications( await _notificationsProvider.getSystemNotifications(
user: _userProvider.user,resetProvider: true user: _userProvider.user!,resetProvider: true
// host: _settingProvider.host, // host: _settingProvider.host,
// hospitalId: _userProvider.user.clientId, // hospitalId: _userProvider.user.clientId,
@ -46,7 +46,7 @@ class _NotificationsPageState extends State<NotificationsPage> with TickerProvid
nextPage: _notificationsProvider.nextPage, nextPage: _notificationsProvider.nextPage,
onLazyLoad: () async { onLazyLoad: () async {
await _notificationsProvider.getSystemNotifications( await _notificationsProvider.getSystemNotifications(
user: _userProvider.user, user: _userProvider.user!,
// host: _settingProvider.host, // host: _settingProvider.host,
// hospitalId: _userProvider.user.clientId, // hospitalId: _userProvider.user.clientId,
); );

@ -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, this.request}) : super(key: key); PpmDetailsPage({Key? key, required this.request}) : super(key: key);
@override @override
_PpmDetailsPageState createState() { _PpmDetailsPageState createState() {
@ -32,9 +32,9 @@ class PpmDetailsPage extends StatefulWidget {
} }
class _PpmDetailsPageState extends State<PpmDetailsPage> { class _PpmDetailsPageState extends State<PpmDetailsPage> {
UserProvider userProvider; UserProvider? userProvider;
PpmProvider ppmProvider; PpmProvider? ppmProvider;
@override @override
void initState() { void initState() {
@ -55,12 +55,12 @@ class _PpmDetailsPageState extends State<PpmDetailsPage> {
appBar: DefaultAppBar(title: context.translation.preventiveMaintenance), appBar: DefaultAppBar(title: context.translation.preventiveMaintenance),
body: SafeArea( body: SafeArea(
child: FutureBuilder( child: FutureBuilder(
future: ppmProvider.getPpmById(widget.request.id), future: ppmProvider!.getPpmById(widget.request.id!),
builder: (context, snap) { builder: (context, snap) {
if (snap.connectionState == ConnectionState.waiting) { if (snap.connectionState == ConnectionState.waiting) {
return const ALoading(); return const ALoading();
} else if (snap.hasData) { } else if (snap.hasData) {
Ppm ppm = snap.data; Ppm ppm = snap.data as Ppm;
return Column(children: [ return Column(children: [
SingleChildScrollView( SingleChildScrollView(
@ -72,21 +72,21 @@ class _PpmDetailsPageState extends State<PpmDetailsPage> {
if (widget.request.priority != null) if (widget.request.priority != null)
StatusLabel( StatusLabel(
label: widget.request.priority, label: widget.request.priority,
textColor: AppColor.getRequestStatusTextColorByName(context, widget.request.priority), textColor: AppColor.getRequestStatusTextColorByName(context, widget.request.priority!),
backgroundColor: AppColor.getRequestStatusColorByName(context, widget.request.priority), backgroundColor: AppColor.getRequestStatusColorByName(context, widget.request.priority!),
), ),
if (widget.request.priority != null) 8.width, if (widget.request.priority != null) 8.width,
StatusLabel( StatusLabel(
label: ppm.visitStatusName, label: ppm.visitStatusName,
id: ppm.deviceStatusId, id: ppm.deviceStatusId!.toInt(),
textColor: AppColor.getRequestStatusTextColorByName(context, ppm.visitStatusName), textColor: AppColor.getRequestStatusTextColorByName(context, ppm.visitStatusName!),
backgroundColor: AppColor.getRequestStatusColorByName(context, ppm.visitStatusName), backgroundColor: AppColor.getRequestStatusColorByName(context, ppm.visitStatusName!),
), ),
1.width.expanded, 1.width.expanded,
], ],
), ),
8.height, 8.height,
ppm.assetName.heading5(context), ppm.assetName!.heading5(context),
8.height, 8.height,
'${context.translation.assetNumber}: ${ppm.assetNumber}'.bodyText(context), '${context.translation.assetNumber}: ${ppm.assetNumber}'.bodyText(context),
'${context.translation.assetSN}: ${ppm.assetSerialNo}'.bodyText(context), '${context.translation.assetSN}: ${ppm.assetSerialNo}'.bodyText(context),
@ -101,11 +101,11 @@ class _PpmDetailsPageState extends State<PpmDetailsPage> {
'${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,
if (userProvider.user.type == UsersTypes.engineer && (ppm.visitStatusId != 270 && ppm.visitStatusId != 269)) if (userProvider!.user!.type == UsersTypes.engineer && (ppm.visitStatusId != 270 && ppm.visitStatusId != 269))
AppFilledButton( AppFilledButton(
onPressed: () async { onPressed: () async {
await Navigator.of(context).push(MaterialPageRoute(builder: (_) => EditPpm(ppm: ppm, details: widget.request))); await Navigator.of(context).push(MaterialPageRoute(builder: (_) => EditPpm(ppm: ppm, details: widget.request)));

@ -22,9 +22,9 @@ class PpmPage extends StatefulWidget {
} }
class _PpmPageState extends State<PpmPage> with TickerProviderStateMixin { class _PpmPageState extends State<PpmPage> with TickerProviderStateMixin {
PpmProvider _visitsProvider; late PpmProvider _visitsProvider;
UserProvider _userProvider; late UserProvider _userProvider;
SettingProvider _settingProvider; late SettingProvider _settingProvider;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -41,23 +41,20 @@ class _PpmPageState extends State<PpmPage> with TickerProviderStateMixin {
stateCode: _visitsProvider.stateCode, stateCode: _visitsProvider.stateCode,
onRefresh: () async { onRefresh: () async {
_visitsProvider.reset(); _visitsProvider.reset();
await _visitsProvider.getVisits( await _visitsProvider.getVisits(user: _userProvider.user!, host: _settingProvider.host!);
user: _userProvider.user,
host: _settingProvider.host,
);
}, },
child: _visitsProvider.ppms.isEmpty child: _visitsProvider.ppms?.isEmpty ?? true
? NoItemFound(message: context.translation.noVisitsFound) ? NoItemFound(message: context.translation.noVisitsFound)
: LazyLoading( : LazyLoading(
nextPage: _visitsProvider.nextPage, nextPage: _visitsProvider.nextPage,
onLazyLoad: () async { onLazyLoad: () async {
await _visitsProvider.getVisits(user: _userProvider.user, host: _settingProvider.host); await _visitsProvider.getVisits(user: _userProvider.user!, host: _settingProvider.host!);
}, },
child: ListView.builder( child: ListView.builder(
itemCount: _visitsProvider.ppms.length, itemCount: _visitsProvider.ppms!.length,
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 16), padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 16),
itemBuilder: (context, itemIndex) { itemBuilder: (context, itemIndex) {
Ppm ppm = _visitsProvider.ppms[itemIndex]; Ppm ppm = _visitsProvider.ppms![itemIndex];
return Padding(padding: const EdgeInsets.only(bottom: 8.0), child: PpmItem(ppm: ppm)); return Padding(padding: const EdgeInsets.only(bottom: 8.0), child: PpmItem(ppm: ppm));
}, },
), ),

@ -20,21 +20,21 @@ import '../../../../widgets/pentry/pentry_tbs_form.dart';
class EditPpm extends StatefulWidget { class EditPpm extends StatefulWidget {
final Ppm ppm; final Ppm ppm;
final RequestsDetails details; final RequestsDetails? details;
const EditPpm({Key? key, this.ppm, this.details}) : super(key: key); const EditPpm({Key? key, required this.ppm, this.details}) : super(key: key);
@override @override
State<EditPpm> createState() => _EditPpmState(); State<EditPpm> createState() => _EditPpmState();
} }
class _EditPpmState extends State<EditPpm> with SingleTickerProviderStateMixin { class _EditPpmState extends State<EditPpm> with SingleTickerProviderStateMixin {
UserProvider _userProvider; late UserProvider _userProvider;
PpmProvider _regularVisitsProvider; late PpmProvider _regularVisitsProvider;
Ppm _ppm; late Ppm _ppm;
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(); final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
TabController _tabController; late TabController _tabController;
_onSubmit() async { _onSubmit() async {
if (!(await _ppm.validate(context))) { if (!(await _ppm.validate(context))) {
@ -42,7 +42,7 @@ class _EditPpmState extends State<EditPpm> with SingleTickerProviderStateMixin {
return; return;
} }
_ppm.removeEmptyObjects(); _ppm.removeEmptyObjects();
await _regularVisitsProvider.updatePentry(context, user: _userProvider.user, ppm: widget.ppm); await _regularVisitsProvider.updatePentry(context, user: _userProvider.user!, ppm: widget.ppm);
} }
@override @override
@ -60,8 +60,8 @@ class _EditPpmState extends State<EditPpm> with SingleTickerProviderStateMixin {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_userProvider = Provider.of<UserProvider>(context,listen: false); _userProvider = Provider.of<UserProvider>(context, listen: false);
_regularVisitsProvider = Provider.of<PpmProvider>(context,listen: false); _regularVisitsProvider = Provider.of<PpmProvider>(context, listen: false);
return Scaffold( return Scaffold(
appBar: DefaultAppBar(title: context.translation.preventiveMaintenance), appBar: DefaultAppBar(title: context.translation.preventiveMaintenance),
key: _scaffoldKey, key: _scaffoldKey,

@ -25,10 +25,10 @@ class ProfilePage extends StatefulWidget {
} }
class _ProfilePageState extends State<ProfilePage> { class _ProfilePageState extends State<ProfilePage> {
UserProvider _userProvider; late UserProvider _userProvider;
SettingProvider _settingProvider; late SettingProvider _settingProvider;
double _width; late double _width;
double _height; late double _height;
User _user = User(); User _user = User();
bool _firstTime = true; bool _firstTime = true;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
@ -42,7 +42,7 @@ class _ProfilePageState extends State<ProfilePage> {
_height = MediaQuery.of(context).size.height; _height = MediaQuery.of(context).size.height;
if (_firstTime) { if (_firstTime) {
_user = User.fromJson(_userProvider.user.toJson()); _user = User.fromJson(_userProvider.user!.toJson());
_firstTime = false; _firstTime = false;
} }
Color color = context.isDark ? AppColor.neutral10 : AppColor.neutral50; Color color = context.isDark ? AppColor.neutral10 : AppColor.neutral50;
@ -69,9 +69,9 @@ class _ProfilePageState extends State<ProfilePage> {
padding: const EdgeInsets.all(1), // Border radius padding: const EdgeInsets.all(1), // Border radius
child: ClipOval( child: ClipOval(
child: snapshot.profileImage != null child: snapshot.profileImage != null
? Image.file(snapshot.profileImage) ? Image.file(snapshot.profileImage!)
: (snapshot.user.profilePhotoName?.isNotEmpty ?? false) : (snapshot.user!.profilePhotoName?.isNotEmpty ?? false)
? Image.network(snapshot.user.profilePhotoName) ? Image.network(snapshot.user!.profilePhotoName!)
: const Icon( : const Icon(
Icons.person, Icons.person,
size: 50, size: 50,
@ -95,7 +95,7 @@ class _ProfilePageState extends State<ProfilePage> {
final pickedFile = await ImagePicker().pickImage(source: ImageSource.gallery, imageQuality: 70, maxWidth: 800, maxHeight: 800); final pickedFile = await ImagePicker().pickImage(source: ImageSource.gallery, imageQuality: 70, maxWidth: 800, maxHeight: 800);
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], aspectRatioPresets: [CropAspectRatioPreset.square],
uiSettings: [ uiSettings: [
@ -111,8 +111,8 @@ class _ProfilePageState extends State<ProfilePage> {
); );
if (croppedFile != null) { if (croppedFile != null) {
await snapshot.uploadProfileImage(_user.userID, File(croppedFile.path)); await snapshot.uploadProfileImage(_user.userID!, File(croppedFile.path));
Provider.of<SettingProvider>(context, listen: false).setUser(_userProvider.user); Provider.of<SettingProvider>(context, listen: false).setUser(_userProvider.user!);
} }
} }
}), }),
@ -120,7 +120,7 @@ class _ProfilePageState extends State<ProfilePage> {
); );
}), }),
8.height, 8.height,
(_user.username).heading3(context).custom(fontWeight: FontWeight.w600, color: context.isDark ? AppColor.neutral10 : AppColor.neutral50), (_user.username)!.heading3(context).custom(fontWeight: FontWeight.w600, color: context.isDark ? AppColor.neutral10 : AppColor.neutral50),
if ((_user.email ?? "").isNotEmpty) (_user.email ?? "").heading6(context).custom(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), if ((_user.email ?? "").isNotEmpty) (_user.email ?? "").heading6(context).custom(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
], ],
), ),
@ -129,13 +129,13 @@ class _ProfilePageState extends State<ProfilePage> {
if ((_user.phoneNumber ?? "").isNotEmpty) ...[ if ((_user.phoneNumber ?? "").isNotEmpty) ...[
const Divider().defaultStyle(context), const Divider().defaultStyle(context),
8.height, 8.height,
_user.phoneNumber.heading5(context), _user.phoneNumber!.heading5(context),
8.height, 8.height,
], ],
if ((_user.extensionNo ?? "").isNotEmpty) ...[ if ((_user.extensionNo ?? "").isNotEmpty) ...[
const Divider().defaultStyle(context), const Divider().defaultStyle(context),
8.height, 8.height,
_user.extensionNo.heading5(context), _user.extensionNo!.heading5(context),
8.height, 8.height,
], ],
if ((_user.departmentName?.length ?? 0) > 0) const Divider().defaultStyle(context), if ((_user.departmentName?.length ?? 0) > 0) const Divider().defaultStyle(context),
@ -144,13 +144,13 @@ class _ProfilePageState extends State<ProfilePage> {
itemCount: _user.departmentName?.length ?? 0, itemCount: _user.departmentName?.length ?? 0,
shrinkWrap: true, shrinkWrap: true,
itemBuilder: (context, index) { itemBuilder: (context, index) {
return (_user.departmentName[index] ?? "N/A").heading5(context).paddingOnly(top: 8, bottom: 8); return (_user.departmentName![index] ?? "N/A").heading5(context).paddingOnly(top: 8, bottom: 8);
}, },
), ),
if ((_user.clientName ?? "").isNotEmpty) ...[ if ((_user.clientName ?? "").isNotEmpty) ...[
const Divider().defaultStyle(context), const Divider().defaultStyle(context),
8.height, 8.height,
_user.clientName.heading5(context).custom(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50), _user.clientName!.heading5(context).custom(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50),
8.height, 8.height,
], ],
], ],

@ -1,181 +1,177 @@
import 'package:flutter/material.dart'; // import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart'; // import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.dart'; // import 'package:provider/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/user_provider.dart'; // import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; // import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/controllers/validator/validator.dart'; // import 'package:test_sa/controllers/validator/validator.dart';
import 'package:test_sa/extensions/context_extension.dart'; // import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/issue.dart'; // import 'package:test_sa/models/issue.dart';
import 'package:test_sa/models/service_request/service_request.dart'; // import 'package:test_sa/models/service_request/service_request.dart';
import 'package:test_sa/views/app_style/sizing.dart'; // import 'package:test_sa/views/app_style/sizing.dart';
import 'package:test_sa/views/widgets/app_text_form_field.dart'; // import 'package:test_sa/views/widgets/app_text_form_field.dart';
import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; // import 'package:test_sa/views/widgets/buttons/app_back_button.dart';
import 'package:test_sa/views/widgets/buttons/app_button.dart'; // import 'package:test_sa/views/widgets/buttons/app_button.dart';
import 'package:test_sa/views/widgets/issues/report_issue_item.dart'; // import 'package:test_sa/views/widgets/issues/report_issue_item.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; // import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
//
class ReportIssuesPage extends StatefulWidget { // class ReportIssuesPage extends StatefulWidget {
static final String id = "/report-issue"; // static final String id = "/report-issue";
final ServiceRequest serviceRequest; // final ServiceRequest serviceRequest;
// todo delete
const ReportIssuesPage({Key? key, this.serviceRequest}) : super(key: key); // const ReportIssuesPage({Key? key, required this.serviceRequest}) : super(key: key);
//
@override // @override
_ReportIssuesPageState createState() => _ReportIssuesPageState(); // _ReportIssuesPageState createState() => _ReportIssuesPageState();
} // }
//
class _ReportIssuesPageState extends State<ReportIssuesPage> { // class _ReportIssuesPageState extends State<ReportIssuesPage> {
List<String> _issues = []; // List<String> _issues = [];
Issue _issue = Issue(reports: []); // Issue _issue = Issue(reports: []);
double _height; // late double _height;
bool _isLoading = false; // bool _isLoading = false;
ServiceRequestsProvider _serviceRequestsProvider; // late ServiceRequestsProvider _serviceRequestsProvider;
UserProvider _userProvider; // late UserProvider _userProvider;
SettingProvider _settingProvider; // late SettingProvider _settingProvider;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); // final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
//
@override // @override
Widget build(BuildContext context) { // Widget build(BuildContext context) {
_serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context); // _serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context);
_userProvider = Provider.of<UserProvider>(context); // _userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context); // _settingProvider = Provider.of<SettingProvider>(context);
_height = MediaQuery.of(context).size.height; // _height = MediaQuery.of(context).size.height;
//
return Scaffold( // return Scaffold(
body: SafeArea( // body: SafeArea(
child: Form( // child: Form(
key: _formKey, // key: _formKey,
child: LoadingManager( // child: LoadingManager(
onRefresh: () async {}, // onRefresh: () async {},
stateCode: 200, // stateCode: 200,
isFailedLoading: false, // isFailedLoading: false,
isLoading: _isLoading, // isLoading: _isLoading,
child: Stack( // child: Stack(
children: [ // children: [
SingleChildScrollView( // SingleChildScrollView(
child: Column( // child: Column(
children: [ // children: [
Center( // Center(
child: Padding( // child: Padding(
padding: EdgeInsets.symmetric( // padding: EdgeInsets.symmetric(
horizontal: 16 * AppStyle.getScaleFactor(context), // horizontal: 16 * AppStyle.getScaleFactor(context),
vertical: 24 * AppStyle.getScaleFactor(context), // vertical: 24 * AppStyle.getScaleFactor(context),
), // ),
child: Text( // child: Text(
context.translation.reportIssue, // context.translation.reportIssue,
// style: Theme.of(context).textTheme.headline5.copyWith(color: AColors.cyan, fontWeight: FontWeight.bold), // // style: Theme.of(context).textTheme.headline5.copyWith(color: AColors.cyan, fontWeight: FontWeight.bold),
), // ),
), // ),
), // ),
Image( // Image(
height: _height / 8, // height: _height / 8,
image: AssetImage("assets/images/logo.png"), // image: AssetImage("assets/images/logo.png"),
), // ),
Container( // Container(
padding: EdgeInsets.symmetric( // padding: EdgeInsets.symmetric(
horizontal: 16, // horizontal: 16,
vertical: 16, // vertical: 16,
), // ),
decoration: BoxDecoration( // decoration: BoxDecoration(
// color: AColors.grey, // // color: AColors.grey,
borderRadius: BorderRadius.only( // borderRadius: BorderRadius.only(
topLeft: Radius.circular(AppStyle.getBorderRadius(context)), // topLeft: Radius.circular(AppStyle.getBorderRadius(context)),
topRight: Radius.circular(AppStyle.getBorderRadius(context)), // topRight: Radius.circular(AppStyle.getBorderRadius(context)),
), // ),
boxShadow: [ // boxShadow: [
BoxShadow( // BoxShadow(
// color: AColors.grey, // // color: AColors.grey,
offset: Offset(0, -1), // offset: Offset(0, -1),
) // )
]), // ]),
child: Column( // child: Column(
crossAxisAlignment: CrossAxisAlignment.start, // crossAxisAlignment: CrossAxisAlignment.start,
children: [ // children: [
ATextFormField( // ATextFormField(
initialValue: _issue?.title, // initialValue: _issue?.title,
hintText: context.translation.title, // hintText: context.translation.title,
textAlign: TextAlign.center, // textAlign: TextAlign.center,
style: Theme.of(context).textTheme.headline6, // style: Theme.of(context).textTheme.titleLarge,
validator: (value) => Validator.hasValue(value) ? null : context.translation.titleValidateMessage, // validator: (value) => Validator.hasValue(value ?? "") ? null : context.translation.titleValidateMessage,
textInputType: TextInputType.name, // textInputType: TextInputType.name,
onSaved: (value) { // onSaved: (value) {
_issue.title = value; // _issue.title = value;
}, // },
), // ),
SizedBox( // SizedBox(
height: 8, // height: 8,
), // ),
Column( // Column(
children: List.generate( // children: List.generate(
_issues.length, // _issues.length,
(index) => ReportIssueItem( // (index) => ReportIssueItem(
isSelected: _issue.reports.contains(index), // isSelected: _issue.reports!.contains(index) ?? false,
issueInfo: _issues[index], // issueInfo: _issues[index],
onChange: (info, value) { // onChange: (info, value) {
if (value) { // if (value) {
_issue.reports.add(index); // _issue.reports!.add(index);
} else { // } else {
_issue.reports.remove(index); // _issue.reports!.remove(index);
} // }
setState(() {}); // setState(() {});
}, // },
))), // ))),
Padding( // Padding(
padding: const EdgeInsets.all(8.0), // padding: const EdgeInsets.all(8.0),
child: Text( // child: Text(
"${context.translation.shareAntherIssue} :", // "${context.translation.shareAntherIssue} :",
style: Theme.of(context).textTheme.headline6, // style: Theme.of(context).textTheme.titleLarge,
), // ),
), // ),
ATextFormField( // ATextFormField(
hintText: context.translation.description, // hintText: context.translation.description,
style: Theme.of(context).textTheme.subtitle1, // style: Theme.of(context).textTheme.titleMedium,
textInputType: TextInputType.multiline, // textInputType: TextInputType.multiline,
onSaved: (value) { // onSaved: (value) {
_issue.description = value; // _issue.description = value;
}, // },
), // ),
Padding( // Padding(
padding: const EdgeInsets.all(8.0), // padding: const EdgeInsets.all(8.0),
child: AButton( // child: AButton(
text: context.translation.submit, // text: context.translation.submit,
onPressed: () async { // onPressed: () async {
if (!_formKey.currentState.validate()) return; // if (!_formKey.currentState!.validate()) return;
_formKey.currentState.save(); // _formKey.currentState!.save();
_issue.serviceRequestId = widget.serviceRequest.id; // _issue.serviceRequestId = widget.serviceRequest.id;
_isLoading = true; // _isLoading = true;
setState(() {}); // setState(() {});
int status = await _serviceRequestsProvider.createIssueReport( // int status = await _serviceRequestsProvider.createIssueReport(user: _userProvider.user!, host: _settingProvider.host!, issue: _issue);
user: _userProvider.user, // _isLoading = false;
host: _settingProvider.host, // setState(() {});
issue: _issue, // if (status >= 200 && status < 300) {
); // Fluttertoast.showToast(
_isLoading = false; // msg: context.translation.successfulRequestMessage,
setState(() {}); // );
if (status >= 200 && status < 300) { // Navigator.of(context).pop();
Fluttertoast.showToast( // }
msg: context.translation.successfulRequestMessage, // _isLoading = false;
); // setState(() {});
Navigator.of(context).pop(); // },
} // ),
_isLoading = false; // ),
setState(() {}); // ],
}, // ),
), // ),
), // ],
], // ),
), // ),
), // ABackButton(),
], // ],
), // ),
), // ),
ABackButton(), // ),
], // ),
), // );
), // }
), // }
),
);
}
}

@ -30,7 +30,7 @@ class AddSupplierEngineerBottomSheet extends StatefulWidget {
class _AddSupplierEngineerBottomSheetState extends State<AddSupplierEngineerBottomSheet> { class _AddSupplierEngineerBottomSheetState extends State<AddSupplierEngineerBottomSheet> {
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
Lookup suppEngRole; Lookup? suppEngRole;
SupplierEngineer engineer = SupplierEngineer(); SupplierEngineer engineer = SupplierEngineer();
@ -119,9 +119,9 @@ class _AddSupplierEngineerBottomSheetState extends State<AddSupplierEngineerBott
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();
if (engineer.personName.isEmpty) { if (engineer.personName?.isEmpty ?? true) {
"Engineer supplier name is empty".showToast; "Engineer supplier name is empty".showToast;
return; return;
} }
@ -129,7 +129,7 @@ class _AddSupplierEngineerBottomSheetState extends State<AddSupplierEngineerBott
engineer.personRoleId = suppEngRole?.id; engineer.personRoleId = suppEngRole?.id;
// print(engineer.toJson()); // print(engineer.toJson());
// 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;

@ -28,7 +28,7 @@ class CommentsBottomSheet extends StatefulWidget {
class _CommentsBottomSheetState extends State<CommentsBottomSheet> { class _CommentsBottomSheetState extends State<CommentsBottomSheet> {
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
String text; String? text;
@override @override
void initState() { void initState() {
@ -100,7 +100,7 @@ class _CommentsBottomSheetState extends State<CommentsBottomSheet> {
8.height, 8.height,
Align( Align(
alignment: AlignmentDirectional.bottomEnd, alignment: AlignmentDirectional.bottomEnd,
child: Text(DateTime.tryParse(model.createdOn).toIso8601String().toServiceRequestDetailsFormat, child: Text(DateTime.tryParse(model.createdOn!)!.toIso8601String().toServiceRequestDetailsFormat,
style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50)), style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50)),
), ),
], ],
@ -111,8 +111,8 @@ class _CommentsBottomSheetState extends State<CommentsBottomSheet> {
], ],
), ),
), ),
if (userProvider.user.type == UsersTypes.normal_user) 8.height, if (userProvider.user!.type == UsersTypes.normal_user) 8.height,
if (userProvider.user.type == UsersTypes.normal_user) if (userProvider.user!.type == UsersTypes.normal_user)
AppTextFormField( AppTextFormField(
labelText: "Type any comment", labelText: "Type any comment",
backgroundColor: AppColor.neutral30, backgroundColor: AppColor.neutral30,
@ -121,8 +121,8 @@ class _CommentsBottomSheetState extends State<CommentsBottomSheet> {
validator: (value) => Validator.hasValue(value) ? null : context.translation.requiredField, validator: (value) => Validator.hasValue(value) ? null : context.translation.requiredField,
textInputType: TextInputType.multiline, textInputType: TextInputType.multiline,
suffixIcon: "comment_send".toSvgAsset().paddingOnly(end: 16).onPress(() { suffixIcon: "comment_send".toSvgAsset().paddingOnly(end: 16).onPress(() {
if (_formKey.currentState.validate()) { if (_formKey.currentState!.validate()) {
_formKey.currentState.save(); _formKey.currentState!.save();
final comment = Comment(id: 0, callRequestId: num.tryParse(widget.requestId ?? ""), comment: text); final comment = Comment(id: 0, callRequestId: num.tryParse(widget.requestId ?? ""), comment: text);
commentsProvider.addComment(context, comment: comment); commentsProvider.addComment(context, comment: comment);
} }

@ -29,7 +29,7 @@ import '../../../../providers/service_request_providers/type_of_request_provider
class CreateServiceRequestPage extends StatefulWidget { class CreateServiceRequestPage extends StatefulWidget {
static const String id = "/create-request"; static const String id = "/create-request";
final ServiceRequest serviceRequest; final ServiceRequest? serviceRequest;
const CreateServiceRequestPage({this.serviceRequest, Key? key}) : super(key: key); const CreateServiceRequestPage({this.serviceRequest, Key? key}) : super(key: key);
@ -38,19 +38,19 @@ class CreateServiceRequestPage extends StatefulWidget {
} }
class CreateServiceRequestPageState extends State<CreateServiceRequestPage> { class CreateServiceRequestPageState extends State<CreateServiceRequestPage> {
TextEditingController _commentController; late TextEditingController _commentController;
double _height; late double _height;
UserProvider _userProvider; late UserProvider _userProvider;
SettingProvider _settingProvider; late SettingProvider _settingProvider;
ServiceRequestsProvider _serviceRequestsProvider; late ServiceRequestsProvider _serviceRequestsProvider;
ServiceRequest _serviceRequest; late ServiceRequest _serviceRequest;
final List<File> _deviceImages = []; final List<File> _deviceImages = [];
bool _isLoading = false; 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>();
DateTime _dateTime; DateTime? _dateTime;
bool isFirstActionSubmitted = false; bool isFirstActionSubmitted = false;
@ -58,11 +58,11 @@ class CreateServiceRequestPageState extends State<CreateServiceRequestPage> {
void initState() { void initState() {
_commentController = TextEditingController(); _commentController = TextEditingController();
if (widget.serviceRequest != null) { if (widget.serviceRequest != null) {
_serviceRequest = widget.serviceRequest; _serviceRequest = widget.serviceRequest!;
_deviceImages.addAll(_serviceRequest.devicePhotos.map((e) => File(e)).toList()); _deviceImages.addAll(_serviceRequest.devicePhotos!.map((e) => File(e)).toList());
_showDatePicker = _serviceRequest.firstAction != null && _serviceRequest.firstAction.name == "Need a visit"; _showDatePicker = _serviceRequest.firstAction != null && _serviceRequest.firstAction?.name == "Need a visit";
if (_showDatePicker && _serviceRequest.visitDate != null) { if (_showDatePicker && _serviceRequest.visitDate != null) {
_dateTime = DateTime.tryParse(_serviceRequest.visitDate); _dateTime = DateTime.tryParse(_serviceRequest.visitDate!);
} }
} else { } else {
_serviceRequest = ServiceRequest(); _serviceRequest = ServiceRequest();
@ -102,7 +102,7 @@ class CreateServiceRequestPageState extends State<CreateServiceRequestPage> {
return url.startsWith("/") || url.startsWith("file://") || url.substring(1).startsWith(':\\'); return url.startsWith("/") || url.startsWith("file://") || url.substring(1).startsWith(':\\');
} }
bool priority; // bool priority;
void getData() { void getData() {
Provider.of<RequestedThroughProvider>(context).getDate(); Provider.of<RequestedThroughProvider>(context).getDate();
@ -111,7 +111,7 @@ class CreateServiceRequestPageState extends State<CreateServiceRequestPage> {
Provider.of<EquipmentStatusProvider>(context).getDate(); Provider.of<EquipmentStatusProvider>(context).getDate();
} }
PendingAssetServiceRequest pendingAssetServiceRequest; PendingAssetServiceRequest? pendingAssetServiceRequest;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -151,21 +151,21 @@ class CreateServiceRequestPageState extends State<CreateServiceRequestPage> {
onPick: (asset) async { onPick: (asset) async {
pendingAssetServiceRequest = null; pendingAssetServiceRequest = null;
_serviceRequest.device = asset; _serviceRequest.device = asset;
await checkAssetForPendingServiceRequest(asset.id); await checkAssetForPendingServiceRequest(asset.id!.toInt());
if (pendingAssetServiceRequest != null && pendingAssetServiceRequest.details.isNotEmpty) { if (pendingAssetServiceRequest != null && pendingAssetServiceRequest!.details!.isNotEmpty) {
showPendingRequestBottomSheet(); showPendingRequestBottomSheet();
} }
}, },
), ),
if (pendingAssetServiceRequest != null && pendingAssetServiceRequest.details.isNotEmpty) ...[ if (pendingAssetServiceRequest != null && pendingAssetServiceRequest!.details!.isNotEmpty) ...[
8.height, 8.height,
Row( Row(
children: [ children: [
const Icon(Icons.warning, color: Color(0xffEE404C), size: 14), const Icon(Icons.warning, color: Color(0xffEE404C), size: 14),
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: TextStyle(fontSize: 12, fontWeight: FontWeight.w500, color: Color(0xff7D859A), decoration: TextDecoration.underline),
).expanded, ).expanded,
], ],
@ -179,7 +179,7 @@ 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,
@ -189,9 +189,9 @@ class CreateServiceRequestPageState extends State<CreateServiceRequestPage> {
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),
@ -239,7 +239,7 @@ class CreateServiceRequestPageState extends State<CreateServiceRequestPage> {
}), }),
), ),
8.width, 8.width,
Text(element.name, style: Theme.of(context).textTheme.bodySmall), Text(element.name!, style: Theme.of(context).textTheme.bodySmall),
], ],
) )
], ],
@ -334,7 +334,7 @@ class CreateServiceRequestPageState extends State<CreateServiceRequestPage> {
AppFilledButton( AppFilledButton(
onPressed: checkPendingRequest ? null : _submit, onPressed: checkPendingRequest ? null : _submit,
loading: checkPendingRequest, loading: checkPendingRequest,
label: (pendingAssetServiceRequest != null && pendingAssetServiceRequest.details.isNotEmpty) ? "Submit Duplicate Request" : "Submit New Request", label: (pendingAssetServiceRequest != null && (pendingAssetServiceRequest!.details?.isNotEmpty ?? false)) ? "Submit Duplicate Request" : "Submit New Request",
), ),
], ],
), ),
@ -347,7 +347,7 @@ class CreateServiceRequestPageState extends State<CreateServiceRequestPage> {
bool checkPendingRequest = false; bool checkPendingRequest = false;
void showPendingRequests() { void showPendingRequests() {
Navigator.of(context).push(MaterialPageRoute(builder: (_) => PendingServiceRequestScreen(pendingAssetServiceRequest))); Navigator.of(context).push(MaterialPageRoute(builder: (_) => PendingServiceRequestScreen(pendingAssetServiceRequest!)));
} }
void showPendingRequestBottomSheet() async { void showPendingRequestBottomSheet() async {
@ -360,7 +360,7 @@ class CreateServiceRequestPageState extends State<CreateServiceRequestPage> {
), ),
), ),
clipBehavior: Clip.antiAliasWithSaveLayer, clipBehavior: Clip.antiAliasWithSaveLayer,
builder: (BuildContext context) => PendingRequestBottomSheet(pendingAssetServiceRequest, _serviceRequest.device), builder: (BuildContext context) => PendingRequestBottomSheet(pendingAssetServiceRequest!, _serviceRequest.device!),
)) as bool; )) as bool;
if (view) { if (view) {
showPendingRequests(); showPendingRequests();
@ -379,16 +379,16 @@ 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()}");
// print("_serviceRequest?.priority:${_serviceRequest?.priority.toJson()}"); // print("_serviceRequest?.priority:${_serviceRequest?.priority.toJson()}");
// return; // return;
if (_formKey.currentState.validate() && await _serviceRequest.validateNewRequest(context)) { if (_formKey.currentState!.validate() && await _serviceRequest.validateNewRequest(context)) {
_formKey.currentState.save(); _formKey.currentState!.save();
// bool canSubmitRequest = await checkAssetForPendingServiceRequest(_serviceRequest.device.id); // bool canSubmitRequest = await checkAssetForPendingServiceRequest(_serviceRequest.device.id);
// if (!canSubmitRequest) { // if (!canSubmitRequest) {
@ -397,15 +397,15 @@ class CreateServiceRequestPageState extends State<CreateServiceRequestPage> {
_serviceRequest.devicePhotos = _deviceImages.map((e) => _isLocalUrl(e.path) ? "${e.path.split("/").last}|${base64Encode(e.readAsBytesSync())}" : e.path).toList(); _serviceRequest.devicePhotos = _deviceImages.map((e) => _isLocalUrl(e.path) ? "${e.path.split("/").last}|${base64Encode(e.readAsBytesSync())}" : e.path).toList();
if (_serviceRequest.audio != null) { if (_serviceRequest.audio != null) {
if (_isLocalUrl(_serviceRequest.audio)) { if (_isLocalUrl(_serviceRequest.audio!)) {
final File file = File(_serviceRequest.audio); final File file = File(_serviceRequest.audio!);
_serviceRequest.audio = "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}"; _serviceRequest.audio = "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}";
} }
} }
await _serviceRequestsProvider.createRequest( await _serviceRequestsProvider.createRequest(
context: context, context: context,
user: _userProvider.user, user: _userProvider.user!,
host: _settingProvider.host, host: _settingProvider.host!,
serviceRequest: _serviceRequest, serviceRequest: _serviceRequest,
); );
} }

@ -29,11 +29,11 @@ class FirstActionBottomSheet extends StatefulWidget {
} }
class _FirstActionBottomSheetState extends State<FirstActionBottomSheet> { class _FirstActionBottomSheetState extends State<FirstActionBottomSheet> {
ServiceRequest _serviceRequest; late ServiceRequest _serviceRequest;
Asset asset; Asset? asset;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
Lookup firstAction; Lookup? firstAction;
@override @override
void initState() { void initState() {
@ -77,7 +77,7 @@ class _FirstActionBottomSheetState extends State<FirstActionBottomSheet> {
setState(() { setState(() {
//_serviceRequest.firstAction = value; //_serviceRequest.firstAction = value;
firstAction = value; firstAction = value;
if (firstAction.value != 2) { if (firstAction?.value != 2) {
_serviceRequest.visitDate = null; _serviceRequest.visitDate = null;
} }
}); });
@ -105,7 +105,7 @@ class _FirstActionBottomSheetState extends State<FirstActionBottomSheet> {
selectedTime.minute, selectedTime.minute,
); );
if (selectedDateTime != null) { if (selectedDateTime != null) {
if (selectedDateTime.isBefore(DateTime.parse(_serviceRequest.date))) { if (selectedDateTime.isBefore(DateTime.parse(_serviceRequest.date!))) {
"Visit Date time must be greater then request date".showToast; "Visit Date time must be greater then request date".showToast;
return; return;
} }
@ -121,7 +121,7 @@ class _FirstActionBottomSheetState extends State<FirstActionBottomSheet> {
), ),
], ],
if (firstAction?.id == 404 && Provider.of<SettingProvider>(context, listen: false).assetGroup.id == 1) ...[ if (firstAction?.id == 404 && Provider.of<SettingProvider>(context, listen: false).assetGroup!.id == 1) ...[
8.height, 8.height,
Row( Row(
children: [ children: [
@ -178,7 +178,7 @@ class _FirstActionBottomSheetState extends State<FirstActionBottomSheet> {
setState(() { setState(() {
_serviceRequest.endDate = selectedDateTime?.toIso8601String(); _serviceRequest.endDate = selectedDateTime?.toIso8601String();
_serviceRequest.workingHours = _serviceRequest.workingHours =
(((DateTime.parse(_serviceRequest.endDate).difference(DateTime.parse(_serviceRequest.startDate)).inSeconds ?? 0) / 60) / 60).toStringAsFixed(2); (((DateTime.parse(_serviceRequest.endDate!).difference(DateTime.parse(_serviceRequest.startDate!)).inSeconds ?? 0) / 60) / 60).toStringAsFixed(2);
}); });
} }
} }
@ -233,10 +233,10 @@ class _FirstActionBottomSheetState extends State<FirstActionBottomSheet> {
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();
_serviceRequest.device = asset; _serviceRequest.device = asset;
_serviceRequest.firstAction = firstAction; _serviceRequest.firstAction = firstAction;
await snapshot.updateRequest(user: userProvider.user, request: _serviceRequest); await snapshot.updateRequest(user: userProvider.user!, request: _serviceRequest);
Navigator.pop(context, true); Navigator.pop(context, true);
}, },
), ),

@ -1,51 +1,51 @@
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/service_requests_provider.dart'; // import 'package:test_sa/controllers/providers/api/service_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/controllers/providers/settings/setting_provider.dart'; // import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/extensions/context_extension.dart'; // import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/service_request/service_request.dart'; // import 'package:test_sa/models/service_request/service_request.dart';
import 'package:test_sa/views/pages/user/requests/service_request_details.dart'; // import 'package:test_sa/views/pages/user/requests/service_request_details.dart';
import 'package:test_sa/views/widgets/loaders/app_loading.dart'; // import 'package:test_sa/views/widgets/loaders/app_loading.dart';
import 'package:test_sa/views/widgets/loaders/failed_loading.dart'; // import 'package:test_sa/views/widgets/loaders/failed_loading.dart';
//
class FutureRequestServiceDetails extends StatefulWidget { // class FutureRequestServiceDetails extends StatefulWidget {
static final String id = "/service-request-details"; // static final String id = "/service-request-details";
//
@override // @override
_FutureRequestServiceDetailsState createState() => _FutureRequestServiceDetailsState(); // _FutureRequestServiceDetailsState createState() => _FutureRequestServiceDetailsState();
} // }
// todo delete
class _FutureRequestServiceDetailsState extends State<FutureRequestServiceDetails> { // class _FutureRequestServiceDetailsState extends State<FutureRequestServiceDetails> {
UserProvider _userProvider; // UserProvider _userProvider;
SettingProvider _settingProvider; // SettingProvider _settingProvider;
//
@override // @override
Widget build(BuildContext context) { // Widget build(BuildContext context) {
_userProvider = Provider.of<UserProvider>(context); // _userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context); // _settingProvider = Provider.of<SettingProvider>(context);
String requestId = ModalRoute.of(context).settings.arguments; // String requestId = ModalRoute.of(context).settings.arguments;
//
return Scaffold( // return Scaffold(
body: FutureBuilder<ServiceRequest>( // body: FutureBuilder<ServiceRequest>(
future: ServiceRequestsProvider().getSingleServiceRequest(requestId: requestId, user: _userProvider.user, host: _settingProvider.host, subtitle: context.translation), // future: ServiceRequestsProvider().getSingleServiceRequest(requestId: requestId, user: _userProvider.user, host: _settingProvider.host, subtitle: context.translation),
builder: (BuildContext context, AsyncSnapshot<ServiceRequest> snapshot) { // builder: (BuildContext context, AsyncSnapshot<ServiceRequest> snapshot) {
if (snapshot.hasError) { // if (snapshot.hasError) {
return FailedLoading( // return FailedLoading(
message: snapshot.error.toString(), // message: snapshot.error.toString(),
onReload: () { // onReload: () {
setState(() {}); // setState(() {});
}, // },
); // );
} // }
if (snapshot.hasData) { // if (snapshot.hasData) {
return ServiceRequestDetailsPage( // return ServiceRequestDetailsPage(
serviceRequest: snapshot.data, // serviceRequest: snapshot.data,
); // );
} // }
return Center(child: ALoading()); // return Center(child: ALoading());
}, // },
), // ),
); // );
} // }
} // }

@ -17,9 +17,9 @@ class PendingServiceRequestScreen extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
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: EdgeInsets.all(16),
separatorBuilder: (cxt, index) => 12.height, separatorBuilder: (cxt, index) => 12.height,
itemBuilder: (cxt, index) => Container( itemBuilder: (cxt, index) => Container(
@ -34,26 +34,26 @@ 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: Color(0xff7D859A)),
), ),
], ],
if ((pendingAssetServiceRequest.details[index].voiceNote ?? "").isNotEmpty) ...[ if ((pendingAssetServiceRequest.details![index].voiceNote ?? "").isNotEmpty) ...[
4.height, 4.height,
ASoundPlayer( ASoundPlayer(
audio: URLs.getFileUrl(pendingAssetServiceRequest.details[index].voiceNote), audio: URLs.getFileUrl(pendingAssetServiceRequest.details![index].voiceNote)!,
), ),
], ],
if((pendingAssetServiceRequest.details[index].createdBy ?? "").isNotEmpty)...[ if ((pendingAssetServiceRequest.details![index].createdBy ?? "").isNotEmpty) ...[
4.height, 4.height,
Text( Text(
"Created By: ${pendingAssetServiceRequest.details[index].createdBy}", "Created By: ${pendingAssetServiceRequest.details![index].createdBy}",
style: Theme.of(context).textTheme.bodyMedium, style: Theme.of(context).textTheme.bodyMedium,
), ),
] ]
@ -66,7 +66,7 @@ class PendingServiceRequestScreen extends StatelessWidget {
).onPress(() { ).onPress(() {
Navigator.of(context).push(MaterialPageRoute( Navigator.of(context).push(MaterialPageRoute(
builder: (_) => ServiceRequestDetailsPage( builder: (_) => ServiceRequestDetailsPage(
serviceRequest: ServiceRequest(id: pendingAssetServiceRequest.details[index].id.toString()), serviceRequest: ServiceRequest(id: pendingAssetServiceRequest.details![index].id.toString()),
))); )));
}))); })));
} }

@ -16,9 +16,9 @@ class ServiceRequestsPage extends StatefulWidget {
} }
class _ServiceRequestsPageState extends State<ServiceRequestsPage> with TickerProviderStateMixin { class _ServiceRequestsPageState extends State<ServiceRequestsPage> with TickerProviderStateMixin {
ServiceRequestsProvider _serviceRequestsProvider; late ServiceRequestsProvider _serviceRequestsProvider;
UserProvider _userProvider; late UserProvider _userProvider;
SettingProvider _settingProvider; late SettingProvider _settingProvider;
bool _expandedSearch = false; bool _expandedSearch = false;
bool _firstTime = true; bool _firstTime = true;
@ -42,15 +42,14 @@ class _ServiceRequestsPageState extends State<ServiceRequestsPage> with TickerPr
stateCode: _serviceRequestsProvider.stateCode, stateCode: _serviceRequestsProvider.stateCode,
onRefresh: () async { onRefresh: () async {
_serviceRequestsProvider.reset(); _serviceRequestsProvider.reset();
await _serviceRequestsProvider.getRequests(hospitalId: _userProvider.user.clientId); await _serviceRequestsProvider.getRequests(hospitalId: _userProvider.user!.clientId!);
}, },
child: child: ServiceRequestsList(
ServiceRequestsList(
nextPage: _serviceRequestsProvider.nextPage, nextPage: _serviceRequestsProvider.nextPage,
onLazyLoad: () async { onLazyLoad: () async {
await _serviceRequestsProvider.getRequests(hospitalId: _userProvider.user.clientId); await _serviceRequestsProvider.getRequests(hospitalId: _userProvider.user!.clientId!);
}, },
requests: _serviceRequestsProvider.serviceRequests, requests: _serviceRequestsProvider.serviceRequests!,
), ),
), ),
), ),

@ -27,7 +27,7 @@ class ServiceRequestDetailsPage extends StatefulWidget {
static const String id = "/call-details"; static const String id = "/call-details";
ServiceRequest serviceRequest; ServiceRequest serviceRequest;
ServiceRequestDetailsPage({Key? key, this.serviceRequest}) : super(key: key); ServiceRequestDetailsPage({Key? key, required this.serviceRequest}) : super(key: key);
@override @override
State<ServiceRequestDetailsPage> createState() => _ServiceRequestDetailsPageState(); State<ServiceRequestDetailsPage> createState() => _ServiceRequestDetailsPageState();
@ -35,7 +35,7 @@ class ServiceRequestDetailsPage extends StatefulWidget {
class _ServiceRequestDetailsPageState extends State<ServiceRequestDetailsPage> { class _ServiceRequestDetailsPageState extends State<ServiceRequestDetailsPage> {
bool loading = false; bool loading = false;
ServiceRequest serviceRequest; ServiceRequest? serviceRequest;
@override @override
void initState() { void initState() {
@ -48,7 +48,7 @@ class _ServiceRequestDetailsPageState extends State<ServiceRequestDetailsPage> {
setState(() {}); setState(() {});
WidgetsFlutterBinding.ensureInitialized().addPostFrameCallback((timeStamp) async { WidgetsFlutterBinding.ensureInitialized().addPostFrameCallback((timeStamp) async {
Provider.of<CommentsProvider>(context, listen: false).reset(); Provider.of<CommentsProvider>(context, listen: false).reset();
serviceRequest = await Provider.of<ServiceRequestsProvider>(context, listen: false).getServiceRequestObjectById(requestId: widget.serviceRequest.id); serviceRequest = await Provider.of<ServiceRequestsProvider>(context, listen: false).getServiceRequestObjectById(requestId: widget.serviceRequest.id!);
loading = false; loading = false;
setState(() {}); setState(() {});
}); });
@ -75,34 +75,34 @@ class _ServiceRequestDetailsPageState extends State<ServiceRequestDetailsPage> {
Row( Row(
children: [ children: [
StatusLabel( StatusLabel(
label: serviceRequest.priority.name, label: serviceRequest.priority!.name,
id: serviceRequest.priority.id, id: serviceRequest.priority!.id!,
textColor: AppColor.getPriorityStatusTextColor(context, serviceRequest.priority.id), textColor: AppColor.getPriorityStatusTextColor(context, serviceRequest.priority!.id!),
backgroundColor: AppColor.getPriorityStatusColor(context, serviceRequest.priority.id), backgroundColor: AppColor.getPriorityStatusColor(context, serviceRequest.priority!.id!),
), ),
8.width, 8.width,
StatusLabel( StatusLabel(
label: serviceRequest.statusLabel, label: serviceRequest.statusLabel,
textColor: AppColor.getRequestStatusTextColor(context, serviceRequest.statusValue), textColor: AppColor.getRequestStatusTextColor(context, serviceRequest.statusValue!),
backgroundColor: AppColor.getRequestStatusColor(context, serviceRequest.statusValue), backgroundColor: AppColor.getRequestStatusColor(context, serviceRequest.statusValue!),
), ),
1.width.expanded, 1.width.expanded,
], ],
), ),
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(
'${context.translation.assetNumber}: ${serviceRequest.device.assetNumber}', '${context.translation.assetNumber}: ${serviceRequest.device!.assetNumber}',
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.requestType}: ${serviceRequest.type.name}', '${context.translation.requestType}: ${serviceRequest.type!.name}',
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.equipmentStatus}: ${serviceRequest.defectType.name}', '${context.translation.equipmentStatus}: ${serviceRequest.defectType!.name}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
), ),
Text( Text(
@ -118,13 +118,13 @@ 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,
style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
), ),
@ -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,
@ -168,24 +168,24 @@ class _ServiceRequestDetailsPageState extends State<ServiceRequestDetailsPage> {
const Divider().defaultStyle(context), const Divider().defaultStyle(context),
8.height, 8.height,
Text( Text(
serviceRequest.callComments, serviceRequest.callComments!,
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
), ),
], ],
if (serviceRequest.devicePhotos.isNotEmpty) ...[ if (serviceRequest.devicePhotos?.isNotEmpty ?? false) ...[
8.height, 8.height,
const Divider().defaultStyle(context), const Divider().defaultStyle(context),
FilesList(images: serviceRequest.devicePhotos), FilesList(images: serviceRequest.devicePhotos!),
], ],
if (serviceRequest.audio?.isNotEmpty ?? false) ...[ if (serviceRequest.audio?.isNotEmpty ?? false) ...[
const Divider().defaultStyle(context), const Divider().defaultStyle(context),
16.height, 16.height,
ASoundPlayer(audio: serviceRequest.audio), ASoundPlayer(audio: serviceRequest.audio!),
8.height, 8.height,
], ],
], ],
).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),
@ -238,7 +238,7 @@ class _ServiceRequestDetailsPageState extends State<ServiceRequestDetailsPage> {
isScrollControlled: true, isScrollControlled: true,
useRootNavigator: true, useRootNavigator: true,
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
builder: (context) => CommentsBottomSheet(requestId: serviceRequest.id), builder: (context) => CommentsBottomSheet(requestId: serviceRequest.id!),
); );
}), }),
], ],
@ -261,9 +261,9 @@ class _ServiceRequestDetailsPageState extends State<ServiceRequestDetailsPage> {
children: [ children: [
SingleChildScrollView( SingleChildScrollView(
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,
@ -274,7 +274,7 @@ class _ServiceRequestDetailsPageState extends State<ServiceRequestDetailsPage> {
useSafeArea: true, useSafeArea: true,
isScrollControlled: true, isScrollControlled: true,
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
builder: (context) => FirstActionBottomSheet(request: serviceRequest), builder: (context) => FirstActionBottomSheet(request: serviceRequest!),
)) as bool; )) as bool;
if (shouldReloadData ?? false) { if (shouldReloadData ?? false) {
getServiceRequest(); getServiceRequest();

@ -28,7 +28,7 @@ import '../../../widgets/sound/record_sound.dart';
class UpdateServiceRequestPage extends StatefulWidget { class UpdateServiceRequestPage extends StatefulWidget {
static const String id = "/update_service_request_page"; static const String id = "/update_service_request_page";
final ServiceRequest serviceRequest; final ServiceRequest? serviceRequest;
const UpdateServiceRequestPage({Key? key, this.serviceRequest}) : super(key: key); const UpdateServiceRequestPage({Key? key, this.serviceRequest}) : super(key: key);
@ -38,15 +38,15 @@ class UpdateServiceRequestPage extends StatefulWidget {
class _UpdateServiceRequestPageState extends State<UpdateServiceRequestPage> { class _UpdateServiceRequestPageState extends State<UpdateServiceRequestPage> {
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
TextEditingController _commentController; late TextEditingController _commentController;
List<File> _deviceImages = []; List<File> _deviceImages = [];
UserProvider _userProvider; late UserProvider _userProvider;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
_deviceImages = widget.serviceRequest.devicePhotos.map((e) => File(e)).toList(); _deviceImages = widget.serviceRequest?.devicePhotos?.map((e) => File(e)).toList() ?? [];
_commentController = TextEditingController(text: widget.serviceRequest.callComments ?? ""); _commentController = TextEditingController(text: widget.serviceRequest?.callComments ?? "");
} }
@override @override
@ -71,9 +71,9 @@ class _UpdateServiceRequestPageState extends State<UpdateServiceRequestPage> {
children: [ children: [
PickAsset( PickAsset(
editable: false, editable: false,
device: widget.serviceRequest.device, device: widget.serviceRequest?.device,
onPickAsset: (asset) { onPickAsset: (asset) {
widget.serviceRequest.device = asset; widget.serviceRequest!.device = asset;
setState(() {}); setState(() {});
}, },
), ),
@ -83,7 +83,7 @@ class _UpdateServiceRequestPageState extends State<UpdateServiceRequestPage> {
title: context.translation.priority, title: context.translation.priority,
initialValue: widget.serviceRequest?.priority, initialValue: widget.serviceRequest?.priority,
onSelect: (value) { onSelect: (value) {
widget.serviceRequest.priority = value; widget.serviceRequest!.priority = value;
}, },
), ),
8.height, 8.height,
@ -92,7 +92,7 @@ class _UpdateServiceRequestPageState extends State<UpdateServiceRequestPage> {
title: context.translation.equipmentStatus, title: context.translation.equipmentStatus,
initialValue: widget.serviceRequest?.defectType, initialValue: widget.serviceRequest?.defectType,
onSelect: (value) { onSelect: (value) {
widget.serviceRequest.defectType = value; widget.serviceRequest!.defectType = value;
}, },
), ),
8.height, 8.height,
@ -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,
@ -110,12 +110,12 @@ class _UpdateServiceRequestPageState extends State<UpdateServiceRequestPage> {
title: context.translation.requestType, title: context.translation.requestType,
initialValue: widget.serviceRequest?.type, initialValue: widget.serviceRequest?.type,
onSelect: (value) { onSelect: (value) {
widget.serviceRequest.type = value; widget.serviceRequest!.type = value;
}, },
), ),
8.height, 8.height,
MultiFilesPicker(label: context.translation.attachImage, files: _deviceImages), MultiFilesPicker(label: context.translation.attachImage, files: _deviceImages),
((widget.serviceRequest.devicePhotos?.isNotEmpty ?? false) ? 16 : 8).height, ((widget.serviceRequest!.devicePhotos?.isNotEmpty ?? false) ? 16 : 8).height,
Align( Align(
alignment: AlignmentDirectional.centerStart, alignment: AlignmentDirectional.centerStart,
child: context.translation.callComments.heading5(context), child: context.translation.callComments.heading5(context),
@ -124,16 +124,16 @@ class _UpdateServiceRequestPageState extends State<UpdateServiceRequestPage> {
AppTextFormField( AppTextFormField(
controller: _commentController, controller: _commentController,
labelText: context.translation.problemDesc, labelText: context.translation.problemDesc,
initialValue: widget.serviceRequest.callComments, initialValue: widget.serviceRequest!.callComments,
suffixIcon: "warning".toSvgAsset(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20, width: 24).paddingOnly(end: 16), suffixIcon: "warning".toSvgAsset(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20, width: 24).paddingOnly(end: 16),
onSaved: (text) { onSaved: (text) {
widget.serviceRequest.callComments = text; widget.serviceRequest!.callComments = text;
}, },
), ),
8.height, 8.height,
RecordSound( RecordSound(
onRecord: (audio) { onRecord: (audio) {
widget.serviceRequest.audio = audio; widget.serviceRequest!.audio = audio;
}, },
enabled: widget.serviceRequest == null ? true : false, enabled: widget.serviceRequest == null ? true : false,
), ),
@ -150,18 +150,18 @@ 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();
if (widget.serviceRequest.audio != null) { if (widget.serviceRequest!.audio != null) {
if (_isLocalUrl(widget.serviceRequest.audio)) { if (_isLocalUrl(widget.serviceRequest!.audio!)) {
final File file = File(widget.serviceRequest.audio); final File file = File(widget.serviceRequest!.audio!);
widget.serviceRequest.audio = "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}"; widget.serviceRequest!.audio = "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}";
} }
} }
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
await Provider.of<ServiceRequestsProvider>(context, listen: false).updateRequest(user: _userProvider.user, request: widget.serviceRequest); await Provider.of<ServiceRequestsProvider>(context, listen: false).updateRequest(user: _userProvider.user!, request: widget.serviceRequest!);
Navigator.of(context).pop(); Navigator.of(context).pop();
} }
} }

@ -40,23 +40,24 @@ import '../../../../widgets/images/multi_image_picker.dart';
import '../../../../widgets/status/report/service_report_fault_description.dart'; import '../../../../widgets/status/report/service_report_fault_description.dart';
import '../../../../widgets/status/report/service_report_repair_location.dart'; import '../../../../widgets/status/report/service_report_repair_location.dart';
import '../../../../widgets/timer/app_timer.dart'; import '../../../../widgets/timer/app_timer.dart';
class CreateServiceReport extends StatefulWidget { class CreateServiceReport extends StatefulWidget {
static const String id = "/create-service-report"; static const String id = "/create-service-report";
final ServiceRequest request; final ServiceRequest request;
const CreateServiceReport({Key? key, this.request}) : super(key: key); const CreateServiceReport({Key? key, required this.request}) : super(key: key);
@override @override
_CreateServiceReportState createState() => _CreateServiceReportState(); _CreateServiceReportState createState() => _CreateServiceReportState();
} }
class _CreateServiceReportState extends State<CreateServiceReport> with TickerProviderStateMixin { class _CreateServiceReportState extends State<CreateServiceReport> with TickerProviderStateMixin {
UserProvider _userProvider; late UserProvider _userProvider;
SettingProvider _settingProvider; late SettingProvider _settingProvider;
ServiceRequestsProvider _serviceRequestsProvider; late ServiceRequestsProvider _serviceRequestsProvider;
ServiceStatusProvider _assetTypeProvider; late ServiceStatusProvider _assetTypeProvider;
PartsProvider _partsProvider; late PartsProvider _partsProvider;
ServiceReport _serviceReport; late ServiceReport _serviceReport;
bool _isLoading = false; bool _isLoading = false;
List<SparePart> _spareParts = []; List<SparePart> _spareParts = [];
@ -84,7 +85,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
// _isLoading = true; // _isLoading = true;
} }
Asset loanAvailabilityAsset; Asset? loanAvailabilityAsset;
@override @override
void dispose() { void dispose() {
@ -97,7 +98,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
void getRequestForWorkOrder() async { void getRequestForWorkOrder() async {
_isLoading = true; _isLoading = true;
setState(() {}); setState(() {});
_serviceReport.callRequest = await _serviceRequestsProvider.getCallRequestForWorkOrder(callId: widget.request.id); _serviceReport.callRequest = await _serviceRequestsProvider.getCallRequestForWorkOrder(callId: widget.request.id!);
await _assetTypeProvider.getTypes(); await _assetTypeProvider.getTypes();
_serviceReport.assignedEmployee = _serviceReport.callRequest?.assignedEmployee; _serviceReport.assignedEmployee = _serviceReport.callRequest?.assignedEmployee;
_serviceReport.equipmentStatus = _serviceReport.callRequest?.defectType; _serviceReport.equipmentStatus = _serviceReport.callRequest?.defectType;
@ -119,7 +120,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
} }
_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(
@ -143,7 +144,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch, crossAxisAlignment: CrossAxisAlignment.stretch,
children: [ children: [
widget.request.hospitalName.heading5(context), widget.request.hospitalName!.heading5(context),
8.height, 8.height,
"${context.translation.assetNo}: ${widget.request.deviceNumber}".bodyText(context), "${context.translation.assetNo}: ${widget.request.deviceNumber}".bodyText(context),
"${context.translation.callId}: ${widget.request.requestCode}".bodyText(context), "${context.translation.callId}: ${widget.request.requestCode}".bodyText(context),
@ -170,7 +171,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
selectedTime.minute, selectedTime.minute,
); );
if (selectedDateTime != null) { if (selectedDateTime != null) {
if (selectedDateTime.isBefore(DateTime.parse(widget.request.date))) { if (selectedDateTime.isBefore(DateTime.parse(widget.request.date!))) {
"Return to service Date time must be greater then request date".showToast; "Return to service Date time must be greater then request date".showToast;
return; return;
} }
@ -194,7 +195,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
if (timer?.durationInSecond != 0) { if (timer?.durationInSecond != 0) {
_serviceReport.workingHours = num.tryParse((((timer?.durationInSecond ?? 0) / 60) / 60)?.toStringAsFixed(2) ?? "0"); _serviceReport.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);
_serviceReport.workingHours = num.tryParse(workingHours ?? "0"); _serviceReport.workingHours = num.tryParse(workingHours ?? "0");
} }
@ -211,8 +212,8 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
_assetTypeProvider.reset(); _assetTypeProvider.reset();
await _assetTypeProvider.getTypes(); await _assetTypeProvider.getTypes();
_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,
); );
}, },
child: AppTextFormField( child: AppTextFormField(
@ -256,7 +257,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
ServiceReportLastCallsMenu( ServiceReportLastCallsMenu(
report: _serviceReport, report: _serviceReport,
title: context.translation.callLastSituation, title: context.translation.callLastSituation,
parentId: "0",//widget.request.id, parentId: "0", //widget.request.id,
onSelect: (status) { onSelect: (status) {
_serviceReport.calllastSituation = status; _serviceReport.calllastSituation = status;
}, },
@ -267,7 +268,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
initialValue: _serviceReport.faultDescription, initialValue: _serviceReport.faultDescription,
onSelect: (status) { onSelect: (status) {
_serviceReport.faultDescription = status; _serviceReport.faultDescription = status;
_workPreformedController?.text = _serviceReport.faultDescription?.workPerformed; _workPreformedController?.text = _serviceReport.faultDescription?.workPerformed ?? "";
}, },
), ),
8.height, 8.height,
@ -287,7 +288,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
if (status != null) { if (status != null) {
setState(() { setState(() {
_serviceReport.loanAvailablity = status; _serviceReport.loanAvailablity = status;
if (_serviceReport.loanAvailablity.value != 1) { if (_serviceReport.loanAvailablity!.value != 1) {
loanAvailabilityAsset = null; loanAvailabilityAsset = null;
_serviceReport.assetLoan = null; _serviceReport.assetLoan = null;
} }
@ -311,13 +312,13 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
8.height, 8.height,
ServiceReportAssistantEmployeeMenu( ServiceReportAssistantEmployeeMenu(
title: context.translation.assignAssistant, title: context.translation.assignAssistant,
assetId: _serviceReport.callRequest?.asset?.id, assetId: _serviceReport.callRequest!.asset!.id!,
initialValue: (_serviceReport.assistantEmployees?.isNotEmpty ?? false) ? _serviceReport.assistantEmployees?.first : null, initialValue: (_serviceReport.assistantEmployees?.isNotEmpty ?? false) ? _serviceReport.assistantEmployees?.first : null,
onSelect: (employee) { onSelect: (employee) {
if (employee == null) { if (employee == null) {
_serviceReport.assistantEmployees = []; _serviceReport.assistantEmployees = [];
} else { } else {
_serviceReport.assistantEmployees = [employee?.copyWith(id: 0)]; _serviceReport.assistantEmployees = [employee.copyWith(id: 0)];
} }
}, },
), ),
@ -405,17 +406,17 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
AppFilledButton( AppFilledButton(
label: context.translation.submitRequest, label: context.translation.submitRequest,
onPressed: () async { onPressed: () async {
if ((!_formKey.currentState.validate()) || (!(await _serviceReport.validate(context)))) { if ((!_formKey.currentState!.validate()) || (!(await _serviceReport.validate(context)))) {
setState(() {}); setState(() {});
return; return;
} }
_formKey.currentState.save(); _formKey.currentState!.save();
_serviceReport.attachmentsWorkOrder ??= []; _serviceReport.attachmentsWorkOrder ??= [];
if (_files.isEmpty) _serviceReport.attachmentsWorkOrder = []; if (_files.isEmpty) _serviceReport.attachmentsWorkOrder = [];
for (var file in _files) { for (var file in _files) {
_serviceReport.attachmentsWorkOrder.add(Attachment(id: 0, name: "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}")); _serviceReport.attachmentsWorkOrder!.add(Attachment(id: 0, name: "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}"));
} }
final user = Provider.of<UserProvider>(context, listen: false).user; final user = Provider.of<UserProvider>(context, listen: false).user!;
await _serviceRequestsProvider.createServiceReport(context, report: _serviceReport, request: widget.request, user: user); await _serviceRequestsProvider.createServiceReport(context, report: _serviceReport, request: widget.request, user: user);
}, },
), ),

@ -44,18 +44,18 @@ class EditServiceReport extends StatefulWidget {
final ServiceRequest request; final ServiceRequest request;
final ServiceReport report; final ServiceReport report;
const EditServiceReport({Key? key, this.request, this.report}) : super(key: key); const EditServiceReport({Key? key, required this.request, required this.report}) : super(key: key);
@override @override
_EditServiceReportState createState() => _EditServiceReportState(); _EditServiceReportState createState() => _EditServiceReportState();
} }
class _EditServiceReportState extends State<EditServiceReport> with TickerProviderStateMixin { class _EditServiceReportState extends State<EditServiceReport> with TickerProviderStateMixin {
UserProvider _userProvider; late UserProvider _userProvider;
SettingProvider _settingProvider; late SettingProvider _settingProvider;
ServiceRequestsProvider _serviceRequestsProvider; late ServiceRequestsProvider _serviceRequestsProvider;
List<SparePart> _spareParts = []; List<SparePart> _spareParts = [];
ServiceReport _serviceReport; late ServiceReport _serviceReport;
bool _isLoading = false; bool _isLoading = false;
List<File> _files = []; List<File> _files = [];
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
@ -63,28 +63,28 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
final TextEditingController _faultController = TextEditingController(); final TextEditingController _faultController = TextEditingController();
final TextEditingController _workPreformedController = TextEditingController(); final TextEditingController _workPreformedController = TextEditingController();
final TextEditingController _partQtyController = TextEditingController(); final TextEditingController _partQtyController = TextEditingController();
ServiceStatusProvider _assetTypeProvider; late ServiceStatusProvider _assetTypeProvider;
CallRequest _callRequestForWorkOrder; late CallRequest _callRequestForWorkOrder;
Asset loanAvailabilityAsset; Asset? loanAvailabilityAsset;
@override @override
void initState() { void initState() {
_serviceReport = widget.report; _serviceReport = widget.report;
_files = widget.report?.attachmentsWorkOrder?.map((e) => File(e.name))?.toList(); _files = widget.report.attachmentsWorkOrder?.map((e) => File(e.name!)).toList() ?? [];
_spareParts = _serviceReport.sparePartsWorkOrders.map((e) => e.sparePart).toList(); _spareParts = _serviceReport.sparePartsWorkOrders?.map((e) => e.sparePart!).toList() ?? [];
super.initState(); super.initState();
if (context.mounted) { if (context.mounted) {
Provider.of<ReasonProvider>(context, listen: false).reset(); Provider.of<ReasonProvider>(context, listen: false).reset();
Provider.of<ReasonProvider>(context, listen: false).serviceRequestId = _serviceReport.callRequest.id.toString(); Provider.of<ReasonProvider>(context, listen: false).serviceRequestId = _serviceReport.callRequest!.id.toString();
} }
} }
void getRequestForWorkOrder() async { void getRequestForWorkOrder() async {
_isLoading = true; _isLoading = true;
setState(() {}); setState(() {});
_callRequestForWorkOrder = await _serviceRequestsProvider?.getCallRequestForWorkOrder(callId: widget.request.id); _callRequestForWorkOrder = (await _serviceRequestsProvider.getCallRequestForWorkOrder(callId: widget.request.id!))!;
_serviceReport.assignedEmployee = _callRequestForWorkOrder?.assignedEmployee; _serviceReport.assignedEmployee = _callRequestForWorkOrder.assignedEmployee;
await _assetTypeProvider.getTypes(); await _assetTypeProvider.getTypes();
_isLoading = false; _isLoading = false;
setState(() {}); setState(() {});
@ -107,7 +107,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
if (_callRequestForWorkOrder == null) { if (_callRequestForWorkOrder == null) {
getRequestForWorkOrder(); getRequestForWorkOrder();
} }
_serviceReport.assetType = _assetTypeProvider.statuses?.firstWhere((element) => element.value == _callRequestForWorkOrder?.assetType, orElse: () => null); _serviceReport.assetType = _assetTypeProvider.statuses?.firstWhere((element) => element.value == _callRequestForWorkOrder?.assetType, orElse: null);
return Scaffold( return Scaffold(
key: _scaffoldKey, key: _scaffoldKey,
appBar: DefaultAppBar(title: context.translation.updateWorkOrder), appBar: DefaultAppBar(title: context.translation.updateWorkOrder),
@ -129,7 +129,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch, crossAxisAlignment: CrossAxisAlignment.stretch,
children: [ children: [
widget.request.hospitalName.heading5(context), widget.request.hospitalName!.heading5(context),
8.height, 8.height,
"${context.translation.assetNo}: ${widget.request.deviceNumber}".bodyText(context), "${context.translation.assetNo}: ${widget.request.deviceNumber}".bodyText(context),
"${context.translation.callId}: ${widget.request.requestCode}".bodyText(context), "${context.translation.callId}: ${widget.request.requestCode}".bodyText(context),
@ -184,8 +184,8 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
_assetTypeProvider.reset(); _assetTypeProvider.reset();
await _assetTypeProvider.getTypes(); await _assetTypeProvider.getTypes();
_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,
); );
}, },
child: AppTextFormField( child: AppTextFormField(
@ -240,7 +240,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
initialValue: _serviceReport.faultDescription, initialValue: _serviceReport.faultDescription,
onSelect: (status) { onSelect: (status) {
_serviceReport.faultDescription = status; _serviceReport.faultDescription = status;
_workPreformedController?.text = _serviceReport.faultDescription?.workPerformed; _workPreformedController?.text = _serviceReport.faultDescription?.workPerformed ?? "";
}, },
), ),
8.height, 8.height,
@ -260,7 +260,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
if (status != null) { if (status != null) {
setState(() { setState(() {
_serviceReport.loanAvailablity = status; _serviceReport.loanAvailablity = status;
if (_serviceReport.loanAvailablity.value != 1) { if (_serviceReport.loanAvailablity?.value != 1) {
loanAvailabilityAsset = null; loanAvailabilityAsset = null;
_serviceReport.assetLoan = null; _serviceReport.assetLoan = null;
} }
@ -282,17 +282,17 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
}, },
), ),
if (_serviceReport.assetLoan != null && loanAvailabilityAsset == null) if (_serviceReport.assetLoan != null && loanAvailabilityAsset == null)
Card(child: "${context.translation.assetNumber}: ${_serviceReport.assetLoan.assetNumber}".bodyText(context).paddingAll(16)), Card(child: "${context.translation.assetNumber}: ${_serviceReport.assetLoan?.assetNumber}".bodyText(context).paddingAll(16)),
8.height, 8.height,
ServiceReportAssistantEmployeeMenu( ServiceReportAssistantEmployeeMenu(
title: context.translation.assignAssistant, title: context.translation.assignAssistant,
assetId: _serviceReport.callRequest?.asset?.id, assetId: _serviceReport.callRequest!.asset!.id!,
initialValue: (_serviceReport.assistantEmployees?.isNotEmpty ?? false) ? _serviceReport.assistantEmployees?.first : null, initialValue: (_serviceReport.assistantEmployees?.isNotEmpty ?? false) ? _serviceReport.assistantEmployees?.first : null,
onSelect: (employee) { onSelect: (employee) {
if (employee == null) { if (employee == null) {
_serviceReport.assistantEmployees = []; _serviceReport.assistantEmployees = [];
} else { } else {
_serviceReport.assistantEmployees = [employee?.copyWith(id: 0)]; _serviceReport.assistantEmployees = [employee.copyWith(id: 0)];
} }
}, },
), ),
@ -378,16 +378,16 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
AppFilledButton( AppFilledButton(
label: context.translation.updateRequest, label: context.translation.updateRequest,
onPressed: () async { onPressed: () async {
if ((!_formKey.currentState.validate()) || (!(await _serviceReport.validate(context)))) { if ((!_formKey.currentState!.validate()) || (!(await _serviceReport.validate(context)))) {
setState(() {}); setState(() {});
return; return;
} }
_formKey.currentState.save(); _formKey.currentState!.save();
_serviceReport.attachmentsWorkOrder ??= []; _serviceReport.attachmentsWorkOrder ??= [];
if (_files.isEmpty) _serviceReport.attachmentsWorkOrder = []; if (_files.isEmpty) _serviceReport.attachmentsWorkOrder = [];
try { try {
for (var file in _files) { for (var file in _files) {
_serviceReport.attachmentsWorkOrder.add(Attachment(id: 0, name: "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}")); _serviceReport.attachmentsWorkOrder!.add(Attachment(id: 0, name: "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}"));
} }
} catch (error) { } catch (error) {
print(error); print(error);

@ -14,10 +14,10 @@ import '../../../../../providers/loading_list_notifier.dart';
class PartNoButton extends StatefulWidget { class PartNoButton extends StatefulWidget {
final List<SparePart> spareParts; final List<SparePart> spareParts;
final List<SparePartsWorkOrders> initialList; final List<SparePartsWorkOrders>? initialList;
final TextEditingController controller; final TextEditingController controller;
final bool disablePartEdit; final bool disablePartEdit;
final Function(List<SparePartsWorkOrders> sparePart) onChange; final Function(List<SparePartsWorkOrders> sparePart)? onChange;
const PartNoButton({required this.spareParts, required this.controller, this.initialList, this.onChange, this.disablePartEdit = false, Key? key}) : super(key: key); const PartNoButton({required this.spareParts, required this.controller, this.initialList, this.onChange, this.disablePartEdit = false, Key? key}) : super(key: key);
@ -79,7 +79,7 @@ class _PartNoButtonState extends State<PartNoButton> {
labelText: context.translation.quantity, labelText: context.translation.quantity,
textInputType: TextInputType.number, textInputType: TextInputType.number,
backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral30, backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral30,
enable: current != null && current.sparePart?.id != null, enable: current.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)
@ -98,10 +98,10 @@ class _PartNoButtonState extends State<PartNoButton> {
onPressed: widget.disablePartEdit onPressed: widget.disablePartEdit
? null ? null
: () { : () {
if (current != null && _formKey.currentState.validate()) { if (current != null && _formKey.currentState!.validate()) {
_formKey.currentState.save(); _formKey.currentState!.save();
list.add(current); list.add(current);
if (widget.onChange != null) widget.onChange(list); if (widget.onChange != null) widget.onChange!(list);
current = SparePartsWorkOrders(); current = SparePartsWorkOrders();
widget.controller.text = ""; widget.controller.text = "";
setState(() {}); setState(() {});
@ -123,14 +123,14 @@ class _PartNoButtonState extends State<PartNoButton> {
Row( Row(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
"${list[index].sparePart.partNo} / ${list[index].sparePart.partName}".bodyText(context).expanded, "${list[index].sparePart?.partNo} / ${list[index].sparePart?.partName}".bodyText(context).expanded,
list[index].qty.toString().bodyText(context), list[index].qty.toString().bodyText(context),
32.width, 32.width,
"trash".toSvgAsset(color: widget.disablePartEdit ? Colors.grey : null).onPress(widget.disablePartEdit "trash".toSvgAsset(color: widget.disablePartEdit ? Colors.grey : null).onPress(widget.disablePartEdit
? null ? null
: () { : () {
list.remove(list[index]); list.remove(list[index]);
if (widget.onChange != null) widget.onChange(list); if (widget.onChange != null) widget.onChange!(list);
setState(() {}); setState(() {});
}), }),
], ],
@ -152,7 +152,7 @@ class _PartNoButtonState extends State<PartNoButton> {
: context.translation.onlyNumbers, : context.translation.onlyNumbers,
onChange: (text) { onChange: (text) {
list[index].installQty = num.tryParse(text ?? ""); list[index].installQty = num.tryParse(text ?? "");
if (widget.onChange != null) widget.onChange(list); if (widget.onChange != null) widget.onChange!(list);
}, },
onSaved: (text) { onSaved: (text) {
list[index].installQty = num.tryParse(text ?? ""); list[index].installQty = num.tryParse(text ?? "");
@ -173,7 +173,7 @@ class _PartNoButtonState extends State<PartNoButton> {
: context.translation.onlyNumbers, : context.translation.onlyNumbers,
onChange: (text) { onChange: (text) {
list[index].returnQty = num.tryParse(text ?? ""); list[index].returnQty = num.tryParse(text ?? "");
if (widget.onChange != null) widget.onChange(list); if (widget.onChange != null) widget.onChange!(list);
}, },
onSaved: (text) { onSaved: (text) {
list[index].returnQty = num.tryParse(text ?? ""); list[index].returnQty = num.tryParse(text ?? "");

@ -12,7 +12,7 @@ class UpdateServiceReport extends StatefulWidget {
final ServiceRequest request; final ServiceRequest request;
final SearchWorkOrder workOrder; final SearchWorkOrder workOrder;
const UpdateServiceReport({Key? key, this.request, this.workOrder}) : super(key: key); const UpdateServiceReport({Key? key, required this.request, required this.workOrder}) : super(key: key);
@override @override
_UpdateServiceReportState createState() => _UpdateServiceReportState(); _UpdateServiceReportState createState() => _UpdateServiceReportState();
@ -21,10 +21,10 @@ class UpdateServiceReport extends StatefulWidget {
class _UpdateServiceReportState extends State<UpdateServiceReport> { class _UpdateServiceReportState extends State<UpdateServiceReport> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
ServiceRequestsProvider().getSingleServiceReport(context, reportId: widget.workOrder.id); ServiceRequestsProvider().getSingleServiceReport(context, reportId: widget.workOrder.id!.toInt());
return Scaffold( return Scaffold(
body: FutureBuilder<ServiceReport>( body: FutureBuilder<ServiceReport>(
future: ServiceRequestsProvider().getSingleServiceReport(context, reportId: widget.workOrder.id), future: ServiceRequestsProvider().getSingleServiceReport(context, reportId: widget.workOrder.id!.toInt()),
builder: (BuildContext context, AsyncSnapshot<ServiceReport> snapshot) { builder: (BuildContext context, AsyncSnapshot<ServiceReport> snapshot) {
if (snapshot.hasError) { if (snapshot.hasError) {
return FailedLoading( return FailedLoading(
@ -35,7 +35,7 @@ class _UpdateServiceReportState extends State<UpdateServiceReport> {
); );
} }
if (snapshot.connectionState == ConnectionState.done) { if (snapshot.connectionState == ConnectionState.done) {
return EditServiceReport(report: snapshot.data, request: widget.request); return EditServiceReport(report: snapshot.data as ServiceReport, request: widget.request);
} }
return const Center(child: ALoading()); return const Center(child: ALoading());
}, },

@ -23,8 +23,8 @@ import '../../../../widgets/requests/request_status.dart';
class WorkOrderDetailsPage extends StatelessWidget { class WorkOrderDetailsPage extends StatelessWidget {
static const String id = "/work_order_details_page"; static const String id = "/work_order_details_page";
final SearchWorkOrder workOrder; final SearchWorkOrder? workOrder;
final ServiceRequest serviceRequest; final ServiceRequest? serviceRequest;
const WorkOrderDetailsPage({Key? key, this.workOrder, this.serviceRequest}) : super(key: key); const WorkOrderDetailsPage({Key? key, this.workOrder, this.serviceRequest}) : super(key: key);
@ -34,7 +34,7 @@ class WorkOrderDetailsPage extends StatelessWidget {
return Scaffold( return Scaffold(
appBar: DefaultAppBar(title: context.translation.activities), appBar: DefaultAppBar(title: context.translation.activities),
body: FutureBuilder<ServiceReport>( body: FutureBuilder<ServiceReport>(
future: Provider.of<ServiceRequestsProvider>(context).getSingleServiceReport(context, reportId: workOrder.id), future: Provider.of<ServiceRequestsProvider>(context).getSingleServiceReport(context, reportId: workOrder!.id!.toInt()),
builder: (context, snapshot) { builder: (context, snapshot) {
final workOrderDetails = snapshot.data; final workOrderDetails = snapshot.data;
return Column( return Column(
@ -50,56 +50,56 @@ class WorkOrderDetailsPage extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
StatusLabel( StatusLabel(
label: workOrderDetails.currentSituation?.name, label: workOrderDetails?.currentSituation?.name,
textColor: AppColor.getRequestStatusTextColorByName(context, workOrderDetails.currentSituation?.name), textColor: AppColor.getRequestStatusTextColorByName(context, workOrderDetails?.currentSituation?.name),
backgroundColor: AppColor.getRequestStatusColorByName(context, workOrderDetails.currentSituation?.name), backgroundColor: AppColor.getRequestStatusColorByName(context, workOrderDetails?.currentSituation?.name),
), ),
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)),
8.height, 8.height,
Text( Text(
'${context.translation.assetName}: ${workOrderDetails.callRequest.asset.modelDefinition.assetName?.cleanupWhitespace?.capitalizeFirstOfEach}', '${context.translation.assetName}: ${workOrderDetails?.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(
'${context.translation.orderWorkNumber}: ${workOrderDetails.workOrderNo}', '${context.translation.orderWorkNumber}: ${workOrderDetails!.workOrderNo}',
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.assignedEmployee}: ${workOrderDetails.assignedEmployee?.name ?? ""}', '${context.translation.assignedEmployee}: ${workOrderDetails.assignedEmployee?.name ?? ""}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
), ),
Text('${context.translation.assetSN}: ${workOrderDetails.callRequest.asset.assetSerialNo ?? ""}', Text('${context.translation.assetSN}: ${workOrderDetails.callRequest?.asset?.assetSerialNo ?? ""}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20)), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20)),
Text('${context.translation.assetName}: ${workOrderDetails.callRequest.asset.modelDefinition.assetName ?? ""}', Text('${context.translation.assetName}: ${workOrderDetails.callRequest?.asset?.modelDefinition?.assetName ?? ""}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20)), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20)),
Text('${context.translation.assetNumber}: ${workOrderDetails.callRequest.asset.assetNumber ?? ""}', Text('${context.translation.assetNumber}: ${workOrderDetails.callRequest?.asset?.assetNumber ?? ""}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20)), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20)),
Text('${context.translation.model}: ${workOrderDetails.callRequest.asset.modelDefinition.modelName ?? ""}', Text('${context.translation.model}: ${workOrderDetails.callRequest?.asset?.modelDefinition?.modelName ?? ""}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20)), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20)),
Text('${context.translation.site}: ${workOrderDetails.callRequest.asset.site.custName ?? ""}', Text('${context.translation.site}: ${workOrderDetails.callRequest?.asset?.site?.custName ?? ""}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20)), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20)),
Text('${context.translation.currentSituation}: ${workOrderDetails.currentSituation?.name}', Text('${context.translation.currentSituation}: ${workOrderDetails.currentSituation?.name}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20)), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20)),
Text('Situation: ${workOrderDetails.calllastSituation.name ?? '' ?? ""}', Text('Situation: ${workOrderDetails.calllastSituation?.name ?? '' ?? ""}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20)), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20)),
Text('${context.translation.startDate}: ${workOrderDetails.startofWorkTime?.toServiceRequestDetailsFormat ?? "" ?? '' ?? ""}', Text('${context.translation.startDate}: ${workOrderDetails.startofWorkTime?.toServiceRequestDetailsFormat ?? "" ?? '' ?? ""}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20)), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20)),
Text('${context.translation.endDate}: ${workOrderDetails.endofWorkTime?.toServiceRequestDetailsFormat ?? "" ?? '' ?? ""}', Text('${context.translation.endDate}: ${workOrderDetails.endofWorkTime?.toServiceRequestDetailsFormat ?? "" ?? '' ?? ""}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20)), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20)),
if (workOrderDetails.attachmentsWorkOrder.isNotEmpty) ...[ if (workOrderDetails!.attachmentsWorkOrder?.isNotEmpty ?? false) ...[
8.height, 8.height,
const Divider().defaultStyle(context), const Divider().defaultStyle(context),
FilesList(images: workOrderDetails.attachmentsWorkOrder.map((e) => e.name).toList()), FilesList(images: workOrderDetails.attachmentsWorkOrder!.map((e) => e.name!).toList()),
], ],
], ],
).expanded, ).expanded,
Column( Column(
crossAxisAlignment: CrossAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end,
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)
Align(alignment: AlignmentDirectional.centerEnd, child: "edit_icon".toSvgAsset(height: 21, width: 21)).onPress(() { Align(alignment: AlignmentDirectional.centerEnd, child: "edit_icon".toSvgAsset(height: 21, width: 21)).onPress(() {
Navigator.of(context).push(MaterialPageRoute(builder: (_) => UpdateServiceReport(workOrder: workOrder, request: serviceRequest))); Navigator.of(context).push(MaterialPageRoute(builder: (_) => UpdateServiceReport(workOrder: workOrder!, request: serviceRequest!)));
}), }),
// 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(workOrderDetails.endofWorkTime?.toServiceRequestCardFormat ?? "", // Text(workOrderDetails.endofWorkTime?.toServiceRequestCardFormat ?? "",
@ -109,7 +109,7 @@ class WorkOrderDetailsPage extends StatelessWidget {
], ],
).toShadowContainer(context), ).toShadowContainer(context),
).paddingAll(16).expanded, ).paddingAll(16).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)
AppFilledButton( AppFilledButton(
onPressed: () { onPressed: () {
Navigator.of(context).push( Navigator.of(context).push(

@ -4,42 +4,36 @@ import 'package:test_sa/controllers/providers/api/service_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';
import 'package:test_sa/extensions/string_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/models/service_request/search_work_order.dart'; import 'package:test_sa/models/service_request/search_work_order.dart';
import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/service_request/service_request.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';
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/service_request_latest/views/components/activity_card_view.dart'; import 'package:test_sa/service_request_latest/views/components/activity_card_view.dart';
import 'package:test_sa/views/pages/user/requests/work_order/create_service_report.dart'; import 'package:test_sa/views/pages/user/requests/work_order/create_service_report.dart';
import 'package:test_sa/views/pages/user/requests/work_order/update_service_report.dart';
import 'package:test_sa/views/pages/user/requests/work_order/work_order_details_page.dart';
import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; import 'package:test_sa/views/widgets/loaders/no_item_found.dart';
import 'package:test_sa/views/widgets/requests/request_status.dart';
class WorkOrderListPage extends StatelessWidget { class WorkOrderListPage extends StatelessWidget {
static const String id = "/work-order-list"; static const String id = "/work-order-list";
ServiceRequest serviceRequest; final ServiceRequest? serviceRequest;
WorkOrderListPage({Key? key, this.serviceRequest}) : super(key: key); WorkOrderListPage({Key? key, this.serviceRequest}) : super(key: key);
late ServiceRequestsProvider serviceRequestsProvider;
late UserProvider _userProvider;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
// UserProvider _userProvider = Provider.of<UserProvider>(context);
// SettingProvider _settingProvider = Provider.of<SettingProvider>(context);
List<SearchWorkOrder> workOrders = []; List<SearchWorkOrder> workOrders = [];
ServiceRequestsProvider serviceRequestsProvider; _userProvider = Provider.of<UserProvider>(context);
UserProvider _userProvider = Provider.of<UserProvider>(context); serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context);
serviceRequestsProvider ??= Provider.of<ServiceRequestsProvider>(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),
body: SafeArea( body: SafeArea(
child: FutureBuilder( child: FutureBuilder(
future: serviceRequestsProvider.searchWorkOrders(callId: serviceRequest?.requestCode), future: serviceRequestsProvider.searchWorkOrders(callId: serviceRequest!.requestCode!),
builder: (context, snap) { builder: (context, snap) {
if (snap.connectionState == ConnectionState.waiting) return const Center(child: CircularProgressIndicator()); if (snap.connectionState == ConnectionState.waiting) return const Center(child: CircularProgressIndicator());
workOrders = snap.data as List<SearchWorkOrder>; workOrders = snap.data as List<SearchWorkOrder>;
@ -52,7 +46,7 @@ class WorkOrderListPage extends StatelessWidget {
itemCount: workOrders.length, itemCount: workOrders.length,
separatorBuilder: (czt, index) => 8.height, separatorBuilder: (czt, index) => 8.height,
itemBuilder: (context, index) { itemBuilder: (context, index) {
return ActivityCardView(workOrders[index], serviceRequest); return ActivityCardView(workOrders[index], serviceRequest!);
//older code.... //older code....
// Row( // Row(
@ -115,12 +109,12 @@ class WorkOrderListPage extends StatelessWidget {
// ).toShadowContainer(context); // ).toShadowContainer(context);
}, },
).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))
AppFilledButton( AppFilledButton(
label: context.translation.createWorkOrder, label: context.translation.createWorkOrder,
maxWidth: true, maxWidth: true,
onPressed: () { onPressed: () {
Navigator.of(context).push(MaterialPageRoute(builder: (_) => CreateServiceReport(request: serviceRequest))); Navigator.of(context).push(MaterialPageRoute(builder: (_) => CreateServiceReport(request: serviceRequest!)));
}, },
).paddingOnly(start: 16, end: 16, bottom: 16) ).paddingOnly(start: 16, end: 16, bottom: 16)
], ],

@ -25,7 +25,7 @@ class PendingRequestBottomSheet extends StatelessWidget {
"Alert!".heading4(context), "Alert!".heading4(context),
12.height, 12.height,
Text( Text(
"${pendingAssetServiceRequest.details.length} pending service requests found", "${pendingAssetServiceRequest.details!.length} pending service requests found",
style: TextStyle( style: TextStyle(
fontSize: 16.toScreenWidth, fontSize: 16.toScreenWidth,
fontWeight: FontWeight.w500, fontWeight: FontWeight.w500,

@ -8,12 +8,12 @@ import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
typedef SelectionBuilderString = String Function(dynamic); typedef SelectionBuilderString = String Function(dynamic);
class SelectionBottomSheet<T> extends StatefulWidget { class SelectionBottomSheet<T> extends StatefulWidget {
final List<T> items; final List<T>? items;
final T? selectedItem; // Now nullable final T? selectedItem; // Now nullable
final String title; final String title;
final SelectionBuilderString builderString; final SelectionBuilderString builderString;
const SelectionBottomSheet({Key? key, this.items = const [], this.selectedItem, this.title = "", required this.builderString}) : super(key: key); const SelectionBottomSheet({Key? key, this.items, this.selectedItem, this.title = "", required this.builderString}) : super(key: key);
@override @override
_SelectionBottomSheetState createState() => _SelectionBottomSheetState<T>(); _SelectionBottomSheetState createState() => _SelectionBottomSheetState<T>();
@ -24,7 +24,7 @@ class _SelectionBottomSheetState<T> extends State<SelectionBottomSheet<T>> {
String query = ""; String query = "";
List<T> get filteredList => widget.items.where((element) => widget.builderString(element).toLowerCase().contains(query.toLowerCase())).toList(); List<T>? get filteredList => widget.items?.where((element) => widget.builderString(element).toLowerCase().contains(query.toLowerCase())).toList();
@override @override
void initState() { void initState() {
@ -76,11 +76,11 @@ class _SelectionBottomSheetState<T> extends State<SelectionBottomSheet<T>> {
Expanded( Expanded(
// Wrap ListView with Expanded // Wrap ListView with Expanded
child: ListView.builder( child: ListView.builder(
itemCount: filteredList.length, itemCount: filteredList?.length,
padding: const EdgeInsets.only(top: 8), padding: const EdgeInsets.only(top: 8),
itemBuilder: (cxt, index) => RadioListTile<T>( itemBuilder: (cxt, index) => RadioListTile<T>(
// Specify type for RadioListTile // Specify type for RadioListTile
value: filteredList[index], value: filteredList![index],
dense: true, dense: true,
contentPadding: EdgeInsets.zero, contentPadding: EdgeInsets.zero,
groupValue: _selectedValue, groupValue: _selectedValue,
@ -91,7 +91,7 @@ class _SelectionBottomSheetState<T> extends State<SelectionBottomSheet<T>> {
setState(() {}); setState(() {});
}, },
title: Text( title: Text(
widget.builderString(filteredList[index]).cleanupWhitespace?.capitalizeFirstOfEach ?? "", widget.builderString(filteredList![index]).cleanupWhitespace?.capitalizeFirstOfEach ?? "",
style: Theme.of(context).textTheme.bodyLarge, style: Theme.of(context).textTheme.bodyLarge,
), ),
), ),

@ -3,8 +3,8 @@ import 'package:flutter/material.dart';
import 'app_icon_button.dart'; import 'app_icon_button.dart';
class ABackButton extends StatelessWidget { class ABackButton extends StatelessWidget {
final VoidCallback onPressed; final VoidCallback? onPressed;
final IconData icon; final IconData? icon;
const ABackButton({Key? key, this.onPressed, this.icon}) : super(key: key); const ABackButton({Key? key, this.onPressed, this.icon}) : super(key: key);

@ -1,15 +1,18 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/app_style/sizing.dart';class AButton extends StatelessWidget {
class AButton extends StatelessWidget {
final String text; final String text;
final Color color; final Color? color; // Nullable
final EdgeInsets padding; final EdgeInsets? padding; // Nullable
final TextStyle? textStyle; // Nullable
final TextStyle textStyle; final VoidCallback? onPressed; // Nullable
final VoidCallback onPressed;
const AButton({Key? key, this.color /* = AColors.primaryColor*/, this.text, this.padding, this.onPressed, this.textStyle}) : super(key: key); const AButton({
Key? key,this.color,
required this.text,
this.padding,
this.onPressed,
this.textStyle,
}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -18,15 +21,15 @@ class AButton extends StatelessWidget {
child: ElevatedButton( child: ElevatedButton(
style: ElevatedButton.styleFrom( style: ElevatedButton.styleFrom(
elevation: 0, elevation: 0,
// foregroundColor: color.computeLuminance() > 0.5 ? AColors.black : Colors.white,
backgroundColor: color, backgroundColor: color,
padding: padding ?? const EdgeInsets.symmetric(vertical: 12), padding: padding ?? const EdgeInsets.symmetric(vertical: 12),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context))), shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context))),
), ),
onPressed: onPressed, onPressed: onPressed,
child: Text( child: Text(
text ?? "", text,
// style: textStyle ?? Theme.of(context).textTheme.subtitle2.copyWith(color: AColors.white, fontSize: 14, fontWeight: FontWeight.w600), style: textStyle,
textScaleFactor: AppStyle.getScaleFactor(context), textScaleFactor: AppStyle.getScaleFactor(context),
), ),
), ),

@ -4,13 +4,21 @@ import 'package:test_sa/views/app_style/sizing.dart';
class AIconButton extends StatelessWidget { class AIconButton extends StatelessWidget {
final IconData iconData; final IconData iconData;
final Color color; final Color? color; // Nullable
final Color backgroundColor; final Color? backgroundColor; // Nullable
final VoidCallback onPressed; final VoidCallback? onPressed; // Nullable
final double iconSize; final double? iconSize; // Nullable
final double buttonSize; final double buttonSize;
const AIconButton({Key? key, this.iconData, this.onPressed, this.color, this.iconSize, this.buttonSize = 54, this.backgroundColor}) : super(key: key); const AIconButton({
Key? key,
required this.iconData,
this.onPressed,
this.color,
this.iconSize,
this.buttonSize = 54,
this.backgroundColor,
}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -20,13 +28,15 @@ class AIconButton extends StatelessWidget {
child: ElevatedButton( child: ElevatedButton(
style: ElevatedButton.styleFrom( style: ElevatedButton.styleFrom(
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular((AppStyle.borderRadius - 4) * AppStyle.getScaleFactor(context))), shape: RoundedRectangleBorder(
// backgroundColor: backgroundColor ?? AColors.onPrimaryColor, borderRadius: BorderRadius.circular((AppStyle.borderRadius - 4) * AppStyle.getScaleFactor(context)),
),
backgroundColor: backgroundColor,
), ),
onPressed: onPressed, onPressed: onPressed,
child: FaIcon( child: FaIcon(
iconData, iconData,
// color: color ?? AColors.primaryColor, color: color,
size: iconSize ?? 32, size: iconSize ?? 32,
), ),
), ),

@ -1,32 +1,32 @@
import 'package:flutter/material.dart'; // import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart'; // import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:test_sa/views/app_style/sizing.dart'; // import 'package:test_sa/views/app_style/sizing.dart';
//
class AIconButton2 extends StatelessWidget { // class AIconButton2 extends StatelessWidget {
final IconData iconData; // final IconData iconData;
final Color color; // final Color color;
final VoidCallback onPressed; // final VoidCallback onPressed;
//
const AIconButton2({ // const AIconButton2({todo delete
Key? key, // Key? key,
this.iconData, // this.iconData,
this.onPressed, // this.onPressed,
this.color, // this.color,
}) : super(key: key); // }) : super(key: key);
//
@override // @override
Widget build(BuildContext context) { // Widget build(BuildContext context) {
return Material( // return Material(
color: Colors.transparent, // color: Colors.transparent,
child: IconButton( // child: IconButton(
highlightColor: color?.withOpacity(.5) ?? Theme.of(context).colorScheme.secondary.withOpacity(.5), // highlightColor: color?.withOpacity(.5) ?? Theme.of(context).colorScheme.secondary.withOpacity(.5),
color: color ?? Theme.of(context).colorScheme.secondary, // color: color ?? Theme.of(context).colorScheme.secondary,
icon: FaIcon( // icon: FaIcon(
iconData, // iconData,
size: 24 * AppStyle.getScaleFactor(context), // size: 24 * AppStyle.getScaleFactor(context),
), // ),
onPressed: onPressed, // onPressed: onPressed,
), // ),
); // );
} // }
} // }

@ -1,29 +1,29 @@
import 'package:flutter/material.dart'; // import 'package:flutter/material.dart';
//
class RoundedBackButton extends StatelessWidget { // class RoundedBackButton extends StatelessWidget {
final VoidCallback onPressed; // final VoidCallback onPressed;
final IconData icon; // final IconData icon;
final Color backgroundColor; // final Color backgroundColor;
final Color iconColor; // final Color iconColor; todo delete
//
const RoundedBackButton({Key? key, this.onPressed,required this.icon,this.backgroundColor,this.iconColor}) : super(key: key); // const RoundedBackButton({Key? key, this.onPressed,required this.icon,this.backgroundColor,this.iconColor}) : super(key: key);
//
@override // @override
Widget build(BuildContext context) { // Widget build(BuildContext context) {
return Container( // return Container(
padding: const EdgeInsets.only(left: 8), // padding: const EdgeInsets.only(left: 8),
decoration: BoxDecoration( // decoration: BoxDecoration(
shape: BoxShape.circle, // shape: BoxShape.circle,
color: backgroundColor??Colors.blue, // Background color of the circle // color: backgroundColor??Colors.blue, // Background color of the circle
), // ),
child: Padding( // child: Padding(
padding: const EdgeInsets.all(8), // padding: const EdgeInsets.all(8),
child: Icon( // child: Icon(
icon, // icon,
color: iconColor??Colors.white, // color: iconColor??Colors.white,
size: 22, // Adjust the icon size as needed // size: 22, // Adjust the icon size as needed
), // ),
), // ),
); // );
} // }
} // }

@ -1,19 +1,19 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.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/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';
class ATimePicker extends StatelessWidget { class ATimePicker extends StatelessWidget {
final TimeOfDay time; final TimeOfDay? time; // Nullable
final String label; final String label;
final String hint; final String? hint; // Nullable
final Function(TimeOfDay) onTimePicker; final Function(TimeOfDay)? onTimePicker; // Nullable
final bool enable, withBorder; final bool enable;
final Color backgroundColor; final bool withBorder;
final double height; final Color? backgroundColor; // Nullable
final double? height; // Nullable
const ATimePicker({ const ATimePicker({
Key? key, Key? key,
@ -29,14 +29,13 @@ class ATimePicker extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
print('initial time in picker is $time');
return Container( return Container(
height:height, height: height,
decoration: BoxDecoration( decoration: BoxDecoration(
color: backgroundColor ?? color: backgroundColor ??
(context.isDark && (enable == false) (context.isDark && !enable
? AppColor.neutral50 ? AppColor.neutral50
: (enable == false) : !enable
? AppColor.neutral40 ? AppColor.neutral40
: AppColor.background(context)), : AppColor.background(context)),
borderRadius: BorderRadius.circular(10), borderRadius: BorderRadius.circular(10),
@ -46,40 +45,32 @@ class ATimePicker extends StatelessWidget {
padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight), padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight),
child: Row( child: Row(
children: [ children: [
// enable
// ?
Column( Column(
crossAxisAlignment: CrossAxisAlignment.stretch, crossAxisAlignment: CrossAxisAlignment.stretch,
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
label.tinyFont(context), label.tinyFont(context),
(time == null (time == null
?hint?? context.translation.pickTime ? hint ?? context.translation.pickTime
: (time.format(context)?? context.translation.pickADate)) : (time!.format(context) ?? // Use null assertion operator
context.translation.pickADate))
.bodyText(context) .bodyText(context)
.custom(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), .custom(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
], ],
).expanded, ).expanded,
//: label.bodyText(context).paddingOnly(top: 8, bottom: 8),
enable ? 16.width : const Spacer(), enable ? 16.width : const Spacer(),
"calender".toSvgAsset(width: 20, color: context.isDark ? AppColor.neutral10 : null), "calender".toSvgAsset(width: 20, color: context.isDark ? AppColor.neutral10 : null),
], ],
), ),
).onPress(enable ).onPress(enable
? () async { ? () async {
// Define the initial time final TimeOfDay? pickedTime = await showTimePicker(
TimeOfDay initialTime = TimeOfDay.now(); // Nullable TimeOfDay
// Show the time picker with the initial time set
TimeOfDay pickedTime = await showTimePicker(
context: context, context: context,
initialTime: initialTime, initialTime: TimeOfDay.now(),
); );
if (pickedTime != null && onTimePicker != null) {
// Handle the selected time (if user didn't cancel) onTimePicker!(pickedTime); // Use null-aware operator
if (pickedTime != null) {
if (onTimePicker != null) onTimePicker(pickedTime);
print("Selected time: ${pickedTime.format(context)}");
} }
} }
: null); : null);

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

@ -18,8 +18,8 @@ class SingleDepartmentPicker extends StatefulWidget {
} }
class _SingleDepartmentPickerState extends State<SingleDepartmentPicker> { class _SingleDepartmentPickerState extends State<SingleDepartmentPicker> {
DepartmentsProvider _departmentsProvider; late DepartmentsProvider _departmentsProvider;
SettingProvider _settingProvider; late SettingProvider _settingProvider;
List<Department> _searchableList = []; List<Department> _searchableList = [];
bool _firstTime = true; bool _firstTime = true;
@ -28,7 +28,7 @@ class _SingleDepartmentPickerState extends State<SingleDepartmentPicker> {
_departmentsProvider = Provider.of<DepartmentsProvider>(context); _departmentsProvider = Provider.of<DepartmentsProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
if (_firstTime && _departmentsProvider.departments != null) { if (_firstTime && _departmentsProvider.departments != null) {
_searchableList.addAll(_departmentsProvider.departments); _searchableList.addAll(_departmentsProvider.departments!);
_firstTime = false; _firstTime = false;
} }
@ -40,24 +40,20 @@ class _SingleDepartmentPickerState extends State<SingleDepartmentPicker> {
isFailedLoading: _departmentsProvider.departments == null, isFailedLoading: _departmentsProvider.departments == null,
onRefresh: () async { onRefresh: () async {
_departmentsProvider.reset(); _departmentsProvider.reset();
await _departmentsProvider.getDepartment( await _departmentsProvider.getDepartment(_settingProvider.host!);
_settingProvider.host,
);
}, },
child: Column( child: Column(
children: [ children: [
SizedBox( SizedBox(height: 48),
height: 48,
),
Padding( Padding(
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16),
child: ATextFormField( child: ATextFormField(
hintText: context.translation.searchByName, hintText: context.translation.searchByName,
style: Theme.of(context).textTheme.headline6, style: Theme.of(context).textTheme.titleLarge,
suffixIcon: Icon(Icons.search_rounded), suffixIcon: Icon(Icons.search_rounded),
onChange: (value) { onChange: (value) {
_searchableList.clear(); _searchableList.clear();
_searchableList.addAll(_departmentsProvider.departments.where((element) => element.name.toLowerCase().contains(value.toLowerCase())).toList()); _searchableList.addAll(_departmentsProvider.departments!.where((element) => element.name!.toLowerCase().contains(value.toLowerCase())).toList());
setState(() {}); setState(() {});
}, },
), ),

@ -13,7 +13,7 @@ class DeviceTransferItem extends StatelessWidget {
final AssetTransfer item; final AssetTransfer item;
final Function(AssetTransfer) onPressed; final Function(AssetTransfer) onPressed;
const DeviceTransferItem({Key? key, this.item, this.onPressed, this.index}) : super(key: key); const DeviceTransferItem({Key? key,required this.item,required this.onPressed,required this.index}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -58,7 +58,7 @@ class DeviceTransferItem extends StatelessWidget {
/// TBD /// TBD
//StatusLabel(label: '', textColor: AColors.getRequestStatusTextColor(0), backgroundColor: AColors.getRequestStatusColor(0)), //StatusLabel(label: '', textColor: AColors.getRequestStatusTextColor(0), backgroundColor: AColors.getRequestStatusColor(0)),
1.width, 1.width,
Text(item.createdOn != null ? item.createdOn.toServiceRequestCardFormat : "", Text(item.createdOn != null ? item.createdOn!.toServiceRequestCardFormat : "",
textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral10 : const Color(0xFF3B3D4A))), textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral10 : const Color(0xFF3B3D4A))),
], ],
), ),

@ -11,7 +11,7 @@ class DeviceTransferList extends StatelessWidget {
final bool nextPage; final bool nextPage;
final Future<void> Function() onLazyLoad; final Future<void> Function() onLazyLoad;
const DeviceTransferList({Key? key, this.items, this.nextPage, this.onLazyLoad}) : super(key: key); const DeviceTransferList({Key? key,required this.items,required this.nextPage,required this.onLazyLoad}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {

@ -3,8 +3,8 @@ import 'package:flutter/material.dart';
import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/context_extension.dart';
class AAlertDialog extends StatelessWidget { class AAlertDialog extends StatelessWidget {
final String title; final String? title;
final String content; final String? content;
const AAlertDialog({Key? key, this.title, this.content}) : super(key: key); const AAlertDialog({Key? key, this.title, this.content}) : super(key: key);
@ -12,8 +12,8 @@ class AAlertDialog extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
// //
return CupertinoAlertDialog( return CupertinoAlertDialog(
title: title != null ? Text(title) : null, title: title != null ? Text(title!) : null,
content: content != null ? Text(content) : null, content: content != null ? Text(content!) : null,
actions: <Widget>[ actions: <Widget>[
TextButton( TextButton(
// child: Text(_subtitle.confirm), // child: Text(_subtitle.confirm),

@ -11,13 +11,13 @@ import 'package:test_sa/new_views/app_style/app_color.dart';
import '../loaders/image_loader.dart'; import '../loaders/image_loader.dart';
class ESignature extends StatefulWidget { class ESignature extends StatefulWidget {
final String oldSignature; final String? oldSignature;
final Uint8List newSignature; final Uint8List? newSignature;
final Function(Uint8List) onSaved; final Function(Uint8List?)? onSaved;
final Function(Uint8List) onChange; final Function(Uint8List)? onChange;
final String title; final String title;
const ESignature({Key? key, this.title, this.oldSignature, this.onSaved, this.onChange, this.newSignature}) : super(key: key); const ESignature({Key? key, required this.title, required this.oldSignature, this.onSaved, this.onChange, required this.newSignature}) : super(key: key);
@override @override
State<ESignature> createState() => _ESignatureState(); State<ESignature> createState() => _ESignatureState();
@ -25,9 +25,9 @@ class ESignature extends StatefulWidget {
class _ESignatureState extends State<ESignature> { class _ESignatureState extends State<ESignature> {
// Initialise a controller. It will contains signature points, stroke width and pen color. // Initialise a controller. It will contains signature points, stroke width and pen color.
SignatureController _controller; SignatureController? _controller;
Uint8List signature; Uint8List? signature;
bool _editable = false; bool _editable = false;
@ -42,7 +42,7 @@ class _ESignatureState extends State<ESignature> {
@override @override
void dispose() { void dispose() {
_controller.dispose(); _controller?.dispose();
super.dispose(); super.dispose();
} }
@ -55,7 +55,7 @@ class _ESignatureState extends State<ESignature> {
); );
print(widget.oldSignature); print(widget.oldSignature);
return FormField<String>(onSaved: (_) async { return FormField<String>(onSaved: (_) async {
widget.onSaved(signature); if (widget.onSaved != null) widget.onSaved!(signature);
}, builder: (FormFieldState<String> state) { }, builder: (FormFieldState<String> state) {
return Column( return Column(
children: [ children: [
@ -87,9 +87,9 @@ class _ESignatureState extends State<ESignature> {
)) ))
.onPress(() async { .onPress(() async {
if (_editable) { if (_editable) {
signature = await _controller.toPngBytes(); signature = await _controller!.toPngBytes();
if (widget.onChange != null) { if (widget.onChange != null) {
widget.onChange(signature); widget.onChange!(signature!);
} }
} }
_editable = !_editable; _editable = !_editable;
@ -102,12 +102,12 @@ class _ESignatureState extends State<ESignature> {
height: 135.toScreenHeight, height: 135.toScreenHeight,
width: MediaQuery.of(context).size.width, width: MediaQuery.of(context).size.width,
padding: const EdgeInsets.only(bottom: 8), padding: const EdgeInsets.only(bottom: 8),
child: signature != null ? Image.memory(signature) : ImageLoader(boxFit: BoxFit.contain, url: URLs.getFileUrl(widget.oldSignature)), child: signature != null ? Image.memory(signature!) : ImageLoader(boxFit: BoxFit.contain, url: URLs.getFileUrl(widget.oldSignature)!),
) )
: AbsorbPointer( : AbsorbPointer(
absorbing: !_editable, absorbing: !_editable,
child: Signature( child: Signature(
controller: _controller, controller: _controller!,
height: 135.toScreenHeight, height: 135.toScreenHeight,
width: MediaQuery.of(context).size.width - 64.toScreenWidth, width: MediaQuery.of(context).size.width - 64.toScreenWidth,
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
@ -125,15 +125,15 @@ class _ESignatureState extends State<ESignature> {
child: Row( child: Row(
children: [ children: [
"clear".toSvgAsset(width: 14).paddingOnly(start: 16).onPress(() { "clear".toSvgAsset(width: 14).paddingOnly(start: 16).onPress(() {
_controller.clear(); _controller!.clear();
}), }),
35.width, 35.width,
"back".toSvgAsset(width: 17).onPress(() { "back".toSvgAsset(width: 17).onPress(() {
_controller.undo(); _controller!.undo();
}), }),
27.width, 27.width,
"redo".toSvgAsset(width: 17).onPress(() { "redo".toSvgAsset(width: 17).onPress(() {
_controller.redo(); _controller!.redo();
}), }),
// IconButton( // IconButton(
// onPressed: () { // onPressed: () {

@ -37,18 +37,18 @@ class _AssetDetailPageState extends State<AssetDetailPage> {
super.dispose(); super.dispose();
} }
int assetId; int? assetId;
AssetProvider _assetProvider; AssetProvider? _assetProvider;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
assetId ??= ModalRoute.of(context).settings.arguments; assetId ??= ModalRoute.of(context)?.settings.arguments as int;
_assetProvider ??= Provider.of<AssetProvider>(context, listen: false); _assetProvider ??= Provider.of<AssetProvider>(context, listen: false);
_assetProvider?.stateCode = null; _assetProvider?.stateCode = null;
return Scaffold( return Scaffold(
appBar: DefaultAppBar(title: context.translation.assetDetails), appBar: DefaultAppBar(title: context.translation.assetDetails),
body: FutureBuilder<AssetByIdModel>( body: FutureBuilder<AssetByIdModel>(
future: _assetProvider.getAssetById(assetId, context.translation), future: _assetProvider!.getAssetById(assetId!, context.translation),
builder: (BuildContext context, AsyncSnapshot<AssetByIdModel> snapshot) { builder: (BuildContext context, AsyncSnapshot<AssetByIdModel> snapshot) {
if (snapshot.hasError) { if (snapshot.hasError) {
return FailedLoading( return FailedLoading(
@ -62,7 +62,7 @@ class _AssetDetailPageState extends State<AssetDetailPage> {
return const Center(child: ALoading()); return const Center(child: ALoading());
} else if (snapshot.hasData) {} } else if (snapshot.hasData) {}
if (snapshot.hasData) { if (snapshot.hasData) {
AssetByIdModel assetModel = snapshot.data; AssetByIdModel assetModel = snapshot.data!;
return SingleChildScrollView( return SingleChildScrollView(
padding: const EdgeInsets.all(16), padding: const EdgeInsets.all(16),
child: Column( child: Column(
@ -80,8 +80,7 @@ class _AssetDetailPageState extends State<AssetDetailPage> {
), ),
image: DecorationImage( image: DecorationImage(
fit: BoxFit.cover, fit: BoxFit.cover,
image: NetworkImage( image: NetworkImage(assetModel?.assetPhoto != null ? URLs.getFileUrl(assetModel.assetPhoto!)! : "https://www.lasteelcraft.com/images/no-image-available.png"),
assetModel?.assetPhoto != null ? URLs.getFileUrl(assetModel.assetPhoto) : "https://www.lasteelcraft.com/images/no-image-available.png"),
)), )),
), ),
), ),
@ -92,9 +91,9 @@ class _AssetDetailPageState extends State<AssetDetailPage> {
children: [ children: [
if (assetModel.commissioningStatus != null) if (assetModel.commissioningStatus != null)
StatusLabel( StatusLabel(
label: assetModel.commissioningStatus.name, label: assetModel.commissioningStatus!.name,
textColor: AppColor.getRequestStatusTextColorByName(context, assetModel.commissioningStatus.name), textColor: AppColor.getRequestStatusTextColorByName(context, assetModel.commissioningStatus!.name!),
backgroundColor: AppColor.getRequestStatusColorByName(context, assetModel.commissioningStatus.name), backgroundColor: AppColor.getRequestStatusColorByName(context, assetModel.commissioningStatus!.name!),
), ),
if (assetModel.commissioningStatus != null) 8.height, if (assetModel.commissioningStatus != null) 8.height,
(assetModel?.modelDefinition?.assetName?.cleanupWhitespace?.capitalizeFirstOfEach ?? "-").heading5(context), (assetModel?.modelDefinition?.assetName?.cleanupWhitespace?.capitalizeFirstOfEach ?? "-").heading5(context),
@ -105,10 +104,10 @@ class _AssetDetailPageState extends State<AssetDetailPage> {
Column( Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
"${context.translation.assetNo}: ${assetModel.multiAssets.first.assetNumber}".bodyText(context), "${context.translation.assetNo}: ${assetModel.multiAssets!.first.assetNumber}".bodyText(context),
"${context.translation.modelName}: ${assetModel.modelDefinition.modelName}".bodyText(context), "${context.translation.modelName}: ${assetModel.modelDefinition!.modelName}".bodyText(context),
"${context.translation.supplier}: ${assetModel.supplier?.suppliername ?? "-"}".bodyText(context), "${context.translation.supplier}: ${assetModel.supplier?.suppliername ?? "-"}".bodyText(context),
"${context.translation.manufacture}: ${assetModel.modelDefinition.manufacturerName}".bodyText(context), "${context.translation.manufacture}: ${assetModel.modelDefinition!.manufacturerName}".bodyText(context),
//"${context.translation.location}: ${assetModel.site.custName?.cleanupWhitespace?.capitalizeFirstOfEach}".bodyText(context), //"${context.translation.location}: ${assetModel.site.custName?.cleanupWhitespace?.capitalizeFirstOfEach}".bodyText(context),
], ],
).expanded, ).expanded,
@ -118,7 +117,7 @@ class _AssetDetailPageState extends State<AssetDetailPage> {
children: [ children: [
/// TODO: theres no [ORACLE CODE] available to preview /// TODO: theres no [ORACLE CODE] available to preview
// "${context.translation.oracleCode}: ${"-"}".bodyText(context), // "${context.translation.oracleCode}: ${"-"}".bodyText(context),
"${context.translation.snNo}: ${assetModel.multiAssets.first.assetSerialNo}".bodyText(context), "${context.translation.snNo}: ${assetModel.multiAssets!.first.assetSerialNo}".bodyText(context),
"${context.translation.site}: ${assetModel?.site?.custName?.cleanupWhitespace?.capitalizeFirstOfEach ?? "-"}".bodyText(context), "${context.translation.site}: ${assetModel?.site?.custName?.cleanupWhitespace?.capitalizeFirstOfEach ?? "-"}".bodyText(context),
"${context.translation.building}: ${assetModel?.building?.name?.cleanupWhitespace?.capitalizeFirstOfEach ?? "-"}".bodyText(context), "${context.translation.building}: ${assetModel?.building?.name?.cleanupWhitespace?.capitalizeFirstOfEach ?? "-"}".bodyText(context),
"${context.translation.floor}: ${assetModel?.floor?.name?.cleanupWhitespace?.capitalizeFirstOfEach ?? "-"}".bodyText(context), "${context.translation.floor}: ${assetModel?.floor?.name?.cleanupWhitespace?.capitalizeFirstOfEach ?? "-"}".bodyText(context),
@ -131,14 +130,14 @@ class _AssetDetailPageState extends State<AssetDetailPage> {
8.height, 8.height,
const Divider(color: AppColor.neutral30, height: 1, thickness: 1), const Divider(color: AppColor.neutral30, height: 1, thickness: 1),
8.height, 8.height,
"${context.translation.installationDate}: ${assetModel.installationDate.toAssetDetailsFormat ?? "-"}".bodyText(context), "${context.translation.installationDate}: ${assetModel.installationDate!.toAssetDetailsFormat ?? "-"}".bodyText(context),
"${context.translation.nextPmDate}: ${assetModel.nextPMDate.toAssetDetailsFormat}".bodyText(context), "${context.translation.nextPmDate}: ${assetModel.nextPMDate!.toAssetDetailsFormat}".bodyText(context),
"${context.translation.lastPmDate}: ${assetModel.lastPMDate.toAssetDetailsFormat}".bodyText(context), "${context.translation.lastPmDate}: ${assetModel.lastPMDate!.toAssetDetailsFormat}".bodyText(context),
if ((assetModel.modelDefinition.assetDescription ?? "").isNotEmpty) ...[ if ((assetModel.modelDefinition?.assetDescription ?? "").isNotEmpty) ...[
8.height, 8.height,
const Divider(color: AppColor.neutral30, height: 1, thickness: 1), const Divider(color: AppColor.neutral30, height: 1, thickness: 1),
8.height, 8.height,
assetModel.modelDefinition.assetDescription.bodyText(context), assetModel.modelDefinition!.assetDescription!.bodyText(context),
] ]
], ],
) )

@ -12,7 +12,7 @@ class AssetItemGridView extends StatelessWidget {
final Asset device; final Asset device;
final Function(Asset) onPressed; final Function(Asset) onPressed;
const AssetItemGridView({Key? key, this.device, this.onPressed}) : super(key: key); const AssetItemGridView({Key? key,required this.device,required this.onPressed}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -28,7 +28,7 @@ class AssetItemGridView extends StatelessWidget {
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
image: DecorationImage( image: DecorationImage(
fit: BoxFit.cover, fit: BoxFit.cover,
image: NetworkImage(device.assetPhoto != null ? URLs.getFileUrl(device.assetPhoto) : "https://www.lasteelcraft.com/images/no-image-available.png"), image: NetworkImage(device.assetPhoto != null ? URLs.getFileUrl(device.assetPhoto!)! : "https://www.lasteelcraft.com/images/no-image-available.png"),
)), )),
), ),
), ),
@ -38,7 +38,7 @@ class AssetItemGridView extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text( Text(
device.modelDefinition.assetName.cleanupWhitespace.capitalizeFirstOfEach, device.modelDefinition!.assetName!.cleanupWhitespace.capitalizeFirstOfEach,
maxLines: 2, maxLines: 2,
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
@ -48,7 +48,7 @@ class AssetItemGridView extends StatelessWidget {
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
"${context.translation.assetNumber} : ${device.assetNumber}".bodyText2(context), "${context.translation.assetNumber} : ${device.assetNumber}".bodyText2(context),
"${context.translation.modelName} : ${device.modelDefinition.modelName}".cleanupWhitespace.capitalizeFirstOfEach.bodyText2(context), "${context.translation.modelName} : ${device.modelDefinition!.modelName}".cleanupWhitespace.capitalizeFirstOfEach.bodyText2(context),
Text( Text(
"${context.translation.serialNo} : ${device.assetSerialNo}", "${context.translation.serialNo} : ${device.assetSerialNo}",
maxLines: 2, maxLines: 2,

@ -10,9 +10,9 @@ import 'package:test_sa/new_views/app_style/app_color.dart';
class AssetItemListView extends StatelessWidget { class AssetItemListView extends StatelessWidget {
final Asset device; final Asset device;
final Function(Asset) onPressed; final Function(Asset) onPressed;
final Widget selectButton; final Widget? selectButton;
const AssetItemListView({Key? key, this.device, this.onPressed, this.selectButton}) : super(key: key); const AssetItemListView({Key? key,required this.device,required this.onPressed, this.selectButton}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -27,7 +27,7 @@ class AssetItemListView extends StatelessWidget {
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
image: DecorationImage( image: DecorationImage(
fit: BoxFit.cover, fit: BoxFit.cover,
image: NetworkImage(device.assetPhoto != null ? URLs.getFileUrl(device.assetPhoto) : "https://www.lasteelcraft.com/images/no-image-available.png"), image: NetworkImage(device.assetPhoto != null ? URLs.getFileUrl(device.assetPhoto!)! : "https://www.lasteelcraft.com/images/no-image-available.png"),
)), )),
), ),
15.width, 15.width,
@ -39,10 +39,10 @@ class AssetItemListView extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
device.modelDefinition.assetName.cleanupWhitespace.capitalizeFirstOfEach.heading6(context), device.modelDefinition!.assetName!.cleanupWhitespace.capitalizeFirstOfEach.heading6(context),
8.height, 8.height,
"${context.translation.assetNumber} : ${device.assetNumber}".bodyText(context), "${context.translation.assetNumber} : ${device.assetNumber}".bodyText(context),
"${context.translation.modelName} : ${device.modelDefinition.modelName}".cleanupWhitespace.capitalizeFirstOfEach.bodyText(context), "${context.translation.modelName} : ${device.modelDefinition!.modelName}".cleanupWhitespace.capitalizeFirstOfEach.bodyText(context),
], ],
), ),
Row( Row(

@ -11,8 +11,8 @@ import '../../../models/device/asset.dart';
import '../../../new_views/app_style/app_color.dart'; import '../../../new_views/app_style/app_color.dart';
class AssetPicker extends StatelessWidget { class AssetPicker extends StatelessWidget {
final Function(Asset) onPick; final Function(Asset)? onPick;
final Asset device; final Asset? device;
final bool editable; final bool editable;
final bool showAssetInfo; final bool showAssetInfo;
final bool forPPM; final bool forPPM;
@ -43,9 +43,9 @@ class AssetPicker extends StatelessWidget {
], ],
), ),
).onPress(() async { ).onPress(() async {
Asset device = await Navigator.of(context).push(MaterialPageRoute(builder: (context)=>AssetScanQr(title: context.translation.assetScan,))) as Asset; Asset? device = await Navigator.of(context).push(MaterialPageRoute(builder: (context)=>AssetScanQr(title: context.translation.assetScan,))) as Asset?;
if (device != null) { if (device != null) {
onPick(device); onPick!(device);
} }
}) })
else else
@ -66,9 +66,9 @@ class AssetPicker extends StatelessWidget {
], ],
), ),
).onPress(() async { ).onPress(() async {
Asset device = await Navigator.of(context).push(MaterialPageRoute(builder: (context)=>AssetScanQr(title: context.translation.assetScan,))) as Asset; Asset? device = await Navigator.of(context).push(MaterialPageRoute(builder: (context)=>AssetScanQr(title: context.translation.assetScan,))) as Asset?;
if (device != null) { if (device != null) {
onPick(device); onPick!(device);
} }
}), }),
if (device != null && showAssetInfo) if (device != null && showAssetInfo)
@ -87,7 +87,7 @@ class AssetPicker extends StatelessWidget {
Row( Row(
children: [ children: [
Text( Text(
device.modelDefinition?.assetName?.cleanupWhitespace?.capitalizeFirstOfEach ?? "", device?.modelDefinition?.assetName?.cleanupWhitespace?.capitalizeFirstOfEach ?? "",
style: TextStyle( style: TextStyle(
fontSize: 14.toScreenWidth, fontSize: 14.toScreenWidth,
fontWeight: FontWeight.w500, fontWeight: FontWeight.w500,
@ -104,10 +104,10 @@ class AssetPicker extends StatelessWidget {
], ],
), ),
8.height, 8.height,
"${context.translation.assetNo}: ${device.assetNumber}".bodyText2(context).toShimmer(isShow: showLoading), "${context.translation.assetNo}: ${device!.assetNumber}".bodyText2(context).toShimmer(isShow: showLoading),
2.height, 2.height,
// "${context.translation.manufacture}: ${device.modelDefinition?.manufacturerName}".bodyText(context), // "${context.translation.manufacture}: ${device.modelDefinition?.manufacturerName}".bodyText(context),
"${context.translation.model}: ${device.modelDefinition?.modelName}".bodyText2(context).toShimmer(isShow: showLoading), "${context.translation.model}: ${device!.modelDefinition?.modelName}".bodyText2(context).toShimmer(isShow: showLoading),
// "${context.translation.serialNumber}: ${device.assetNumber}".bodyText(context), // "${context.translation.serialNumber}: ${device.assetNumber}".bodyText(context),
// const Divider().defaultStyle(context), // const Divider().defaultStyle(context),
// "${context.translation.department}: ${device.department?.departmentName}".bodyText(context), // "${context.translation.department}: ${device.department?.departmentName}".bodyText(context),

@ -11,8 +11,8 @@ import '../../../new_views/app_style/app_color.dart';
import '../../../providers/service_request_providers/commissioning_status_provider.dart'; import '../../../providers/service_request_providers/commissioning_status_provider.dart';
class CommissioningStatusButtons extends StatefulWidget { class CommissioningStatusButtons extends StatefulWidget {
final Function(Lookup) onSelect; final Function(Lookup?)? onSelect;
final Lookup initialValue; final Lookup? initialValue;
CommissioningStatusButtons({Key? key, this.onSelect, this.initialValue}) : super(key: key); CommissioningStatusButtons({Key? key, this.onSelect, this.initialValue}) : super(key: key);
@ -29,7 +29,7 @@ class _CommissioningStatusButtonsState extends State<CommissioningStatusButtons>
WidgetsFlutterBinding.ensureInitialized().addPostFrameCallback((timeStamp) { WidgetsFlutterBinding.ensureInitialized().addPostFrameCallback((timeStamp) {
final provider = Provider.of<CommissioningStatusProvider>(context, listen: false); final provider = Provider.of<CommissioningStatusProvider>(context, listen: false);
provider.getDate().then((value) { provider.getDate().then((value) {
if (widget.initialValue != null) _selectedIndex = provider.items.indexOf(widget.initialValue); if (widget.initialValue != null) _selectedIndex = provider.items.indexOf(widget.initialValue!);
setState(() {}); setState(() {});
}); });
}); });
@ -40,7 +40,7 @@ class _CommissioningStatusButtonsState extends State<CommissioningStatusButtons>
if (widget.initialValue != oldWidget.initialValue) { if (widget.initialValue != oldWidget.initialValue) {
final provider = Provider.of<CommissioningStatusProvider>(context, listen: false); final provider = Provider.of<CommissioningStatusProvider>(context, listen: false);
if (widget.initialValue != null) { if (widget.initialValue != null) {
_selectedIndex = provider.items.indexOf(widget.initialValue); _selectedIndex = provider.items.indexOf(widget.initialValue!);
} else { } else {
_selectedIndex = 0; _selectedIndex = 0;
} }
@ -99,12 +99,12 @@ class _CommissioningStatusButtonsState extends State<CommissioningStatusButtons>
), ),
shadows: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 14, offset: const Offset(0, 0), spreadRadius: 0)], shadows: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 14, offset: const Offset(0, 0), spreadRadius: 0)],
), ),
child: (index == 0 ? "All Assets" : snapshot.items[index - 1].name).tinyFont(context).custom(color: AppColor.filterButtonTextColor(context)), child: (index == 0 ? "All Assets" : snapshot.items[index - 1].name)!.tinyFont(context).custom(color: AppColor.filterButtonTextColor(context)),
).onPress(() { ).onPress(() {
setState(() { setState(() {
_selectedIndex = index; _selectedIndex = index;
}); });
widget.onSelect(index == 0 ? null : snapshot.items[index - 1]); widget.onSelect!(index == 0 ? null : snapshot.items[index - 1]);
}), }),
), ),
); );

@ -39,7 +39,7 @@ class PickAsset extends StatelessWidget {
children: [ children: [
context.translation.device.tinyFont(context).custom(color: context.isDark ? AppColor.neutral40 : AppColor.neutral50), context.translation.device.tinyFont(context).custom(color: context.isDark ? AppColor.neutral40 : AppColor.neutral50),
if (device != null) if (device != null)
device!.assetNumber.bodyText(context).custom(color: context.isDark ? AppColor.neutral40 : AppColor.neutral50) device!.assetNumber!.bodyText(context).custom(color: context.isDark ? AppColor.neutral40 : AppColor.neutral50)
else else
context.translation.pickAsset.bodyText(context).custom(color: context.isDark ? AppColor.neutral40 : AppColor.neutral50), context.translation.pickAsset.bodyText(context).custom(color: context.isDark ? AppColor.neutral40 : AppColor.neutral50),
], ],

@ -34,13 +34,13 @@ class MyAssetsPage extends StatefulWidget {
} }
class _MyAssetsPageState extends State<MyAssetsPage> { class _MyAssetsPageState extends State<MyAssetsPage> {
AssetProvider _devicesProvider; late AssetProvider _devicesProvider;
UserProvider _userProvider; late UserProvider _userProvider;
SettingProvider _settingProvider; late SettingProvider _settingProvider;
List<Asset> _searchableList = []; List<Asset> _searchableList = [];
List<Asset> _initList = []; List<Asset> _initList = [];
bool _firstTime = true; bool _firstTime = true;
AssetSearch _searchAsset; AssetSearch? _searchAsset;
bool showListView = true; bool showListView = true;
@ -135,7 +135,7 @@ class _MyAssetsPageState extends State<MyAssetsPage> {
context.translation.filter, context.translation.filter,
style: AppTextStyles.bodyText2.copyWith(color: AppColor.blueStatus(context)), style: AppTextStyles.bodyText2.copyWith(color: AppColor.blueStatus(context)),
).onPress(() async { ).onPress(() async {
final result = await Navigator.push(context, MaterialPageRoute(builder: (context) => AssetFilterScreen(data: _searchAsset))); final result = await Navigator.push(context, MaterialPageRoute(builder: (context) => AssetFilterScreen(data: _searchAsset!)));
if (result != null) { if (result != null) {
_searchAsset = result; _searchAsset = result;
} }
@ -163,9 +163,9 @@ class _MyAssetsPageState extends State<MyAssetsPage> {
nextPage: _devicesProvider.nextPage, nextPage: _devicesProvider.nextPage,
onLazyLoad: () async { onLazyLoad: () async {
await _devicesProvider.getDevicesList( await _devicesProvider.getDevicesList(
user: _userProvider.user, user: _userProvider.user!,
host: _settingProvider.host, host: _settingProvider.host!,
hospitalId: _userProvider.user.clientId, hospitalId: _userProvider.user!.clientId!,
search: _searchAsset?.copyWith(assetSerialNumber: snController.text, assetNo: numberController.text), search: _searchAsset?.copyWith(assetSerialNumber: snController.text, assetNo: numberController.text),
// serialNumber: snController.text, // serialNumber: snController.text,
// number: numberController.text, // number: numberController.text,

@ -14,7 +14,7 @@ class GasRefillItem extends StatelessWidget {
final GasRefillModel item; final GasRefillModel item;
final Function(GasRefillModel) onPressed; final Function(GasRefillModel) onPressed;
const GasRefillItem({Key? key, this.item, this.onPressed, this.index}) : super(key: key); const GasRefillItem({Key? key,required this.item,required this.onPressed,required this.index}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -30,19 +30,19 @@ class GasRefillItem extends StatelessWidget {
// backgroundColor: AppColor.getRequestStatusColorByName(context, item.priority), // backgroundColor: AppColor.getRequestStatusColorByName(context, item.priority),
// ), // ),
StatusLabel( StatusLabel(
label: item.status.name, label: item.status!.name,
textColor: AppColor.getRequestStatusTextColor(context, item.status.value), textColor: AppColor.getRequestStatusTextColor(context, item.status!.value!),
backgroundColor: AppColor.getRequestStatusColor(context, item.status.value), backgroundColor: AppColor.getRequestStatusColor(context, item.status!.value!),
), ),
1.width.expanded, 1.width.expanded,
Text(item.startDate != null ? item.startDate.toServiceRequestCardFormat : "", Text(item.startDate != null ? item.startDate!.toServiceRequestCardFormat : "",
textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral10 : const Color(0xFF3B3D4A))), textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral10 : const Color(0xFF3B3D4A))),
], ],
), ),
8.height, 8.height,
context.translation.gasRefillRequest.heading5(context), context.translation.gasRefillRequest.heading5(context),
'${context.translation.gasType}: ${item.gazRefillDetails[0].gasType.name}'.bodyText(context), '${context.translation.gasType}: ${item.gazRefillDetails![0].gasType!.name}'.bodyText(context),
'${context.translation.site}: ${item.site.name}'.bodyText(context), '${context.translation.site}: ${item.site!.name}'.bodyText(context),
8.height, 8.height,
Row( Row(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,

@ -12,7 +12,7 @@ class GasRefillList extends StatefulWidget {
final bool nextPage; final bool nextPage;
final Future<void> Function() onLazyLoad; final Future<void> Function() onLazyLoad;
const GasRefillList({Key? key, this.items, this.nextPage, this.onLazyLoad}) : super(key: key); const GasRefillList({Key? key,required this.items,required this.nextPage,required this.onLazyLoad}) : super(key: key);
@override @override
State<GasRefillList> createState() => _GasRefillListState(); State<GasRefillList> createState() => _GasRefillListState();

@ -6,7 +6,7 @@ class HospitalItem extends StatelessWidget {
final Hospital hospital; final Hospital hospital;
final Function(Hospital) onPressed; final Function(Hospital) onPressed;
const HospitalItem({Key? key, this.hospital, this.onPressed}) : super(key: key); const HospitalItem({Key? key, required this.hospital, required this.onPressed}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -19,11 +19,7 @@ class HospitalItem extends StatelessWidget {
borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)),
), ),
), ),
onPressed: onPressed == null onPressed: onPressed(hospital),
? null
: () {
onPressed(hospital);
},
child: ListTile( child: ListTile(
title: Text( title: Text(
hospital.name ?? "", hospital.name ?? "",

@ -1,90 +1,90 @@
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/hospitals_provider.dart'; // import 'package:test_sa/controllers/providers/api/hospitals_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; // import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/extensions/context_extension.dart'; // import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/hospital.dart'; // import 'package:test_sa/models/hospital.dart';
import 'package:test_sa/views/widgets/hospitals/hospital_item.dart'; // import 'package:test_sa/views/widgets/hospitals/hospital_item.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; // import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; // import 'package:test_sa/views/widgets/loaders/no_item_found.dart';
//
import '../app_text_form_field.dart'; // import '../app_text_form_field.dart';
//
class SingleHospitalPicker extends StatefulWidget { // class SingleHospitalPicker extends StatefulWidget {
static final String id = "/single-Hospital-Picker"; // static final String id = "/single-Hospital-Picker";
final bool sandraChoice = true; // final bool sandraChoice = true;
//
@override // @override
_SingleHospitalPickerState createState() => _SingleHospitalPickerState(); // _SingleHospitalPickerState createState() => _SingleHospitalPickerState();
} // }
// todo delete
class _SingleHospitalPickerState extends State<SingleHospitalPicker> { // class _SingleHospitalPickerState extends State<SingleHospitalPicker> {
HospitalsProvider _hospitalsProvider; // late HospitalsProvider _hospitalsProvider;
SettingProvider _settingProvider; // SettingProvider _settingProvider;
List<Hospital> _searchableList = []; // List<Hospital> _searchableList = [];
bool _firstTime = true; // bool _firstTime = true;
//
@override // @override
Widget build(BuildContext context) { // Widget build(BuildContext context) {
_hospitalsProvider = Provider.of<HospitalsProvider>(context); // _hospitalsProvider = Provider.of<HospitalsProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context); // _settingProvider = Provider.of<SettingProvider>(context);
if (_firstTime && _hospitalsProvider.hospitals != null) { // if (_firstTime && _hospitalsProvider.hospitals != null) {
_searchableList.addAll(_hospitalsProvider.hospitals); // _searchableList.addAll(_hospitalsProvider.hospitals);
_firstTime = false; // _firstTime = false;
} // }
//
return Scaffold( // return Scaffold(
resizeToAvoidBottomInset: false, // resizeToAvoidBottomInset: false,
body: LoadingManager( // body: LoadingManager(
isLoading: _hospitalsProvider.isLoading, // isLoading: _hospitalsProvider.isLoading,
stateCode: _hospitalsProvider.stateCode, // stateCode: _hospitalsProvider.stateCode,
isFailedLoading: _hospitalsProvider.hospitals == null, // isFailedLoading: _hospitalsProvider.hospitals == null,
onRefresh: () async { // onRefresh: () async {
_hospitalsProvider.reset(); // _hospitalsProvider.reset();
await _hospitalsProvider.getHospitals( // await _hospitalsProvider.getHospitals(
host: _settingProvider.host, // host: _settingProvider.host,
); // );
}, // },
child: Column( // child: Column(
children: [ // children: [
SizedBox( // SizedBox(
height: 48, // height: 48,
), // ),
Padding( // Padding(
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), // padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16),
child: ATextFormField( // child: ATextFormField(
hintText: context.translation.searchByName, // hintText: context.translation.searchByName,
style: Theme.of(context).textTheme.headline6, // style: Theme.of(context).textTheme.titleLarge,
suffixIcon: Icon(Icons.search_rounded), // suffixIcon: Icon(Icons.search_rounded),
onChange: (value) { // onChange: (value) {
_searchableList.clear(); // _searchableList.clear();
_searchableList.addAll(_hospitalsProvider.hospitals.where((element) => element.name.toLowerCase().contains(value.toLowerCase())).toList()); // _searchableList.addAll(_hospitalsProvider.hospitals.where((element) => element.name.toLowerCase().contains(value.toLowerCase())).toList());
setState(() {}); // setState(() {});
}, // },
), // ),
), // ),
Expanded( // Expanded(
child: _searchableList.isEmpty // child: _searchableList.isEmpty
? NoItemFound( // ? NoItemFound(
message: context.translation.noHospitalFound, // message: context.translation.noHospitalFound,
) // )
: ListView.builder( // : ListView.builder(
padding: EdgeInsets.zero, // padding: EdgeInsets.zero,
shrinkWrap: true, // shrinkWrap: true,
itemCount: _searchableList.length, // itemCount: _searchableList.length,
itemBuilder: (listContext, itemIndex) { // itemBuilder: (listContext, itemIndex) {
return HospitalItem( // return HospitalItem(
hospital: _searchableList[itemIndex], // hospital: _searchableList[itemIndex],
onPressed: (hospital) { // onPressed: (hospital) {
Navigator.of(context).pop(hospital); // Navigator.of(context).pop(hospital);
}, // },
); // );
}, // },
), // ),
), // ),
], // ],
), // ),
), // ),
); // );
} // }
} // }

@ -3,18 +3,17 @@ import 'dart:io';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart'; import 'package:fluttertoast/fluttertoast.dart';
import 'package:open_file/open_file.dart'; import 'package:open_file/open_file.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/views/app_style/sizing.dart';
import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart';
import 'package:test_sa/views/widgets/loaders/image_loader.dart'; import 'package:test_sa/views/widgets/loaders/image_loader.dart';
import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher.dart';
class FilesList extends StatelessWidget { class FilesList extends StatelessWidget {
final List<String> images; final List<String> images;
final EdgeInsets padding; final EdgeInsets? padding;
const FilesList({Key? key, this.images, this.padding}) : super(key: key); const FilesList({Key? key, this.images = const <String>[], this.padding}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -23,7 +22,7 @@ class FilesList extends StatelessWidget {
physics: const NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true, shrinkWrap: true,
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 6, mainAxisSpacing: 8, crossAxisSpacing: 8), gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 6, mainAxisSpacing: 8, crossAxisSpacing: 8),
itemCount: images?.length ?? 0, itemCount: images.length,
itemBuilder: (context, itemIndex) { itemBuilder: (context, itemIndex) {
if (images[itemIndex] == null || !images[itemIndex].contains(".")) { if (images[itemIndex] == null || !images[itemIndex].contains(".")) {
return Text("Bad\nFile"); return Text("Bad\nFile");
@ -61,7 +60,7 @@ class FilesList extends StatelessWidget {
body: SafeArea( body: SafeArea(
child: Stack( child: Stack(
children: [ children: [
InteractiveViewer(child: Image(image: (_isLocalUrl(images[itemIndex]) ? FileImage(File(images[itemIndex])) : NetworkImage(images[itemIndex])))).center, InteractiveViewer(child: Image(image: getImageObject(itemIndex))).center,
const ABackButton(), const ABackButton(),
], ],
), ),
@ -85,62 +84,79 @@ class FilesList extends StatelessWidget {
}, },
); );
return ListView.separated( // return ListView.separated(
padding: padding ?? EdgeInsets.symmetric(horizontal: 32 * AppStyle.getScaleFactor(context)), // padding: padding ?? EdgeInsets.symmetric(horizontal: 32 * AppStyle.getScaleFactor(context)),
scrollDirection: Axis.horizontal, // scrollDirection: Axis.horizontal,
itemCount: images?.length ?? 0, // itemCount: images?.length ?? 0,
separatorBuilder: (context, itemIndex) => 8.width, // separatorBuilder: (context, itemIndex) => 8.width,
itemBuilder: (context, itemIndex) { // itemBuilder: (context, itemIndex) {
if (images[itemIndex] == null || !images[itemIndex].contains(".")) { // if (images[itemIndex] == null || !images[itemIndex].contains(".")) {
return Text("Bad\nFile"); // return Text("Bad\nFile");
// }
// var isImage =
// images[itemIndex].split(".").last.toLowerCase() == "png" || images[itemIndex].split(".").last.toLowerCase() == "jpg" || images[itemIndex].split(".").last.toLowerCase() == "jpeg";
// var isPdf = images[itemIndex].split(".").last.toLowerCase() == "pdf";
// var isExcel = images[itemIndex].split(".").last.toLowerCase() == "xlsx";
//
// return (isImage
// ? (_isLocalUrl(images[itemIndex])
// ? Image.file(File(images[itemIndex]))
// : ImageLoader(
// url: images[itemIndex],
// boxFit: BoxFit.cover,
// ))
// : Image.asset("assets/images/${isPdf ? "pdf" : isExcel ? "excel" : "doc"}.png"))
// .onPress(() async {
// if (isImage) {
// Navigator.of(context).push(
// MaterialPageRoute(
// builder: (_) => Scaffold(
// body: SafeArea(
// child: Stack(
// children: [
// InteractiveViewer(child: Image(image: (_isLocalUrl(images[itemIndex]) ? FileImage(File(images[itemIndex])) : NetworkImage(images[itemIndex])))).center,
// const ABackButton(),
// ],
// ),
// ),
// ),
// ),
// );
// } else if (_isLocalUrl(images[itemIndex])) {
// OpenFile.open(images[itemIndex]);
// } else {
// try {
// if (!await launchUrl(Uri.parse(images[itemIndex]), mode: LaunchMode.externalApplication)) {
// Fluttertoast.showToast(msg: "UnExpected Error with file.");
// throw Exception('Could not launch ');
// }
// } catch (ex) {
// Fluttertoast.showToast(msg: "No Viewer found.");
// }
// }
// });
// });
} }
var isImage =
images[itemIndex].split(".").last.toLowerCase() == "png" || images[itemIndex].split(".").last.toLowerCase() == "jpg" || images[itemIndex].split(".").last.toLowerCase() == "jpeg";
var isPdf = images[itemIndex].split(".").last.toLowerCase() == "pdf";
var isExcel = images[itemIndex].split(".").last.toLowerCase() == "xlsx";
return (isImage ImageProvider getImageObject(int itemIndex) {
? (_isLocalUrl(images[itemIndex]) if (_isLocalUrl(images[itemIndex])) {
? Image.file(File(images[itemIndex])) return FileImage(File(images[itemIndex]));
: ImageLoader(
url: images[itemIndex],
boxFit: BoxFit.cover,
))
: Image.asset("assets/images/${isPdf ? "pdf" : isExcel ? "excel" : "doc"}.png"))
.onPress(() async {
if (isImage) {
Navigator.of(context).push(
MaterialPageRoute(
builder: (_) => Scaffold(
body: SafeArea(
child: Stack(
children: [
InteractiveViewer(child: Image(image: (_isLocalUrl(images[itemIndex]) ? FileImage(File(images[itemIndex])) : NetworkImage(images[itemIndex])))).center,
const ABackButton(),
],
),
),
),
),
);
} else if (_isLocalUrl(images[itemIndex])) {
OpenFile.open(images[itemIndex]);
} else {
try {
if (!await launchUrl(Uri.parse(images[itemIndex]), mode: LaunchMode.externalApplication)) {
Fluttertoast.showToast(msg: "UnExpected Error with file.");
throw Exception('Could not launch ');
} }
} catch (ex) { return NetworkImage(images[itemIndex]);
Fluttertoast.showToast(msg: "No Viewer found.");
} }
ImageProvider getImage(bool isImage, bool isPdf, bool isExcel, File file) {
if (isImage) {
if (_isLocalUrl(file.path)) {
return FileImage(file);
} }
}); return NetworkImage(URLs.getFileUrl(file.path)!);
}); }
return AssetImage("assets/images/${isPdf ? "pdf" : isExcel ? "excel" : "doc"}.png");
} }
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(':\\');
} }
} }

@ -1,61 +1,56 @@
import 'package:flutter/material.dart'; // import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart'; // import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:test_sa/views/app_style/sizing.dart'; // import 'package:test_sa/views/app_style/sizing.dart';
import 'package:test_sa/views/widgets/loaders/image_loader.dart'; // import 'package:test_sa/views/widgets/loaders/image_loader.dart';
//
class ImageItem extends StatelessWidget { // class ImageItem extends StatelessWidget {
final String url; // final String url;
final bool isVideo; // final bool isVideo;
final VoidCallback onPressed; // final VoidCallback onPressed;
// todo delete
const ImageItem({Key? key, this.url, this.isVideo = false, this.onPressed}) : super(key: key); // const ImageItem({Key? key,required this.url, this.isVideo = false, this.onPressed}) : super(key: key);
//
@override // @override
Widget build(BuildContext context) { // Widget build(BuildContext context) {
return Container( // return Container(
width: 80 * AppStyle.getScaleFactor(context), // width: 80 * AppStyle.getScaleFactor(context),
height: 40 * AppStyle.getScaleFactor(context), // height: 40 * AppStyle.getScaleFactor(context),
margin: EdgeInsets.symmetric( // margin: EdgeInsets.symmetric(
horizontal: 4 * AppStyle.getScaleFactor(context), // horizontal: 4 * AppStyle.getScaleFactor(context),
), // ),
decoration: BoxDecoration( // decoration: BoxDecoration(
border: Border.all( // border: Border.all(
color: Theme.of(context).dividerColor, // color: Theme.of(context).dividerColor,
width: 2 * AppStyle.getScaleFactor(context), // width: 2 * AppStyle.getScaleFactor(context),
), // ),
borderRadius: BorderRadius.circular(8 * AppStyle.getScaleFactor(context)), // borderRadius: BorderRadius.circular(8 * AppStyle.getScaleFactor(context)),
), // ),
child: ClipRRect( // child: ClipRRect(
borderRadius: BorderRadius.circular(6 * AppStyle.getScaleFactor(context)), // borderRadius: BorderRadius.circular(6 * AppStyle.getScaleFactor(context)),
child: Stack( // child: Stack(
fit: StackFit.expand, // fit: StackFit.expand,
alignment: Alignment.center, // alignment: Alignment.center,
children: [ // children: [
ImageLoader( // ImageLoader(url: url),
url: url, // MaterialButton(
), // onPressed: onPressed,
MaterialButton( // padding: EdgeInsets.zero,
onPressed: onPressed, // child: Visibility(
padding: EdgeInsets.zero, // visible: isVideo,
child: Visibility( // child: Center(
visible: isVideo, // child: Container(
child: Center( // decoration: BoxDecoration(color: Colors.black45, shape: BoxShape.circle),
child: Container( // child: FaIcon(
decoration: BoxDecoration( // FontAwesomeIcons.playCircle,
color: Colors.black45, // size: 32 * AppStyle.getScaleFactor(context),
shape: BoxShape.circle, // // color: AColors.orange,
), // ),
child: FaIcon( // ),
FontAwesomeIcons.playCircle, // )),
size: 32 * AppStyle.getScaleFactor(context), // ),
// color: AColors.orange, // ],
), // ),
), // ),
)), // );
), // }
], // }
),
),
);
}
}

@ -18,10 +18,11 @@ class MultiFilesPicker extends StatefulWidget {
final bool error; final bool error;
final List<File> files; final List<File> files;
final bool enabled, onlyImages; final bool enabled, onlyImages;
final Function(List<File>) onChange; final Function(List<File>)? onChange;
final bool showAsGrid; final bool showAsGrid;
const MultiFilesPicker({Key? key, this.files, this.label, this.error = false, this.enabled = true, this.onlyImages = false, this.onChange,this.showAsGrid=false}) : super(key: key); const MultiFilesPicker({Key? key, this.files = const <File>[], required this.label, this.error = false, this.enabled = true, this.onlyImages = false, this.onChange, this.showAsGrid = false})
: super(key: key);
@override @override
State<MultiFilesPicker> createState() => _MultiFilesPickerState(); State<MultiFilesPicker> createState() => _MultiFilesPickerState();
@ -33,7 +34,13 @@ class _MultiFilesPickerState extends State<MultiFilesPicker> {
return Column( return Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
AppDashedButton(title: widget.label, onPressed: (widget.enabled == false) ? () {} : widget.showAsGrid ? showFileSourceSheet:onFilePicker), AppDashedButton(
title: widget.label,
onPressed: (widget.enabled == false)
? () {}
: widget.showAsGrid
? showFileSourceSheet
: onFilePicker),
16.height, 16.height,
if (widget.files?.isNotEmpty ?? false) if (widget.files?.isNotEmpty ?? false)
Wrap( Wrap(
@ -51,7 +58,7 @@ class _MultiFilesPickerState extends State<MultiFilesPicker> {
} }
widget.files.remove(image); widget.files.remove(image);
if (widget.onChange != null) { if (widget.onChange != null) {
widget.onChange(widget.files); widget.onChange!(widget.files);
} }
setState(() {}); setState(() {});
}, },
@ -64,14 +71,14 @@ class _MultiFilesPickerState extends State<MultiFilesPicker> {
} }
fromFilePicker() async { fromFilePicker() async {
FilePickerResult result = await FilePicker.platform.pickFiles( FilePickerResult? result = await FilePicker.platform.pickFiles(
type: FileType.custom, type: FileType.custom,
allowMultiple: true, allowMultiple: true,
allowedExtensions: widget.onlyImages ? ['jpg', 'jpeg', 'png'] : ['jpg', 'jpeg', 'png', 'pdf', 'doc', 'docx', 'xlsx', 'pptx'], allowedExtensions: widget.onlyImages ? ['jpg', 'jpeg', 'png'] : ['jpg', 'jpeg', 'png', 'pdf', 'doc', 'docx', 'xlsx', 'pptx'],
); );
if (result != null) { if (result != null) {
for (var path in result.paths) { for (var path in result.paths) {
widget.files.add(File(path)); widget.files.add(File(path!));
} }
setState(() {}); setState(() {});
} }
@ -83,7 +90,7 @@ class _MultiFilesPickerState extends State<MultiFilesPicker> {
return; return;
} }
ImageSource source = (await showModalBottomSheet( ImageSource? source = (await showModalBottomSheet(
context: context, context: context,
shape: const RoundedRectangleBorder( shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.vertical( borderRadius: BorderRadius.vertical(
@ -114,7 +121,7 @@ class _MultiFilesPickerState extends State<MultiFilesPicker> {
12.height, 12.height,
], ],
).paddingAll(21), ).paddingAll(21),
)) as ImageSource; )) as ImageSource?;
if (source == null) return; if (source == null) return;
@ -122,15 +129,13 @@ class _MultiFilesPickerState extends State<MultiFilesPicker> {
if (pickedFile != null) { if (pickedFile != null) {
File fileImage = File(pickedFile.path); File fileImage = File(pickedFile.path);
if (fileImage != null) {
widget.files.add(fileImage); widget.files.add(fileImage);
if (widget.onChange != null) { if (widget.onChange != null) {
widget.onChange(widget.files); widget.onChange!(widget.files);
} }
setState(() {}); setState(() {});
} }
} }
}
Widget gridItem(IconData iconData, String title) { Widget gridItem(IconData iconData, String title) {
return Container( return Container(
@ -159,7 +164,7 @@ class _MultiFilesPickerState extends State<MultiFilesPicker> {
Fluttertoast.showToast(msg: context.translation.maxImagesNumberIs5); Fluttertoast.showToast(msg: context.translation.maxImagesNumberIs5);
return; return;
} }
ImageSource source = await showDialog( ImageSource? source = await showDialog(
context: context, context: context,
builder: (dialogContext) => CupertinoAlertDialog( builder: (dialogContext) => CupertinoAlertDialog(
actions: <Widget>[ actions: <Widget>[
@ -194,7 +199,7 @@ class _MultiFilesPickerState extends State<MultiFilesPicker> {
if (fileImage != null) { if (fileImage != null) {
widget.files.add(fileImage); widget.files.add(fileImage);
if (widget.onChange != null) { if (widget.onChange != null) {
widget.onChange(widget.files); widget.onChange!(widget.files);
} }
setState(() {}); setState(() {});
} }

@ -18,13 +18,13 @@ class MultiFilesPickerItem extends StatelessWidget {
final bool enabled; final bool enabled;
final Function(File) onRemoveTap; final Function(File) onRemoveTap;
const MultiFilesPickerItem({Key? key, this.file, this.enabled, this.onRemoveTap}) : super(key: key); const MultiFilesPickerItem({Key? key, required this.file, required this.enabled, required this.onRemoveTap}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
var isImage = file.path.split(".").last.toLowerCase() == "png" || file.path.split(".").last.toLowerCase() == "jpg" || file.path.split(".").last.toLowerCase() == "jpeg"; bool isImage = file.path.split(".").last.toLowerCase() == "png" || file.path.split(".").last.toLowerCase() == "jpg" || file.path.split(".").last.toLowerCase() == "jpeg";
var isPdf = file.path.split(".").last.toLowerCase() == "pdf"; bool isPdf = file.path.split(".").last.toLowerCase() == "pdf";
var isExcel = file.path.split(".").last.toLowerCase() == "xlsx"; bool isExcel = file.path.split(".").last.toLowerCase() == "xlsx";
return SizedBox( return SizedBox(
width: 54.toScreenWidth, width: 54.toScreenWidth,
@ -37,9 +37,7 @@ class MultiFilesPickerItem extends StatelessWidget {
decoration: BoxDecoration( decoration: BoxDecoration(
border: Border.all(width: 1, color: context.isDark ? AppColor.neutral30 : AppColor.neutral30), border: Border.all(width: 1, color: context.isDark ? AppColor.neutral30 : AppColor.neutral30),
image: DecorationImage( image: DecorationImage(
image: isImage image: getImage(isImage, isPdf, isExcel, file),
? (_isLocalUrl(file.path) ? FileImage(file) : NetworkImage( URLs.getFileUrl(file.path)))
: AssetImage("assets/images/${isPdf ? "pdf" : isExcel ? "excel" : "doc"}.png"),
fit: BoxFit.cover, fit: BoxFit.cover,
), ),
borderRadius: BorderRadius.circular(8), borderRadius: BorderRadius.circular(8),
@ -88,6 +86,16 @@ class MultiFilesPickerItem extends StatelessWidget {
); );
} }
ImageProvider getImage(bool isImage, bool isPdf, bool isExcel, File file) {
if (isImage) {
if (_isLocalUrl(file.path)) {
return FileImage(file);
}
return NetworkImage(URLs.getFileUrl(file.path)!);
}
return AssetImage("assets/images/${isPdf ? "pdf" : isExcel ? "excel" : "doc"}.png");
}
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(':\\');

@ -3,10 +3,10 @@ import 'package:test_sa/views/app_style/sizing.dart';
class ReportIssueItem extends StatelessWidget { class ReportIssueItem extends StatelessWidget {
final bool isSelected; final bool isSelected;
final String issueInfo; final String? issueInfo;
final Function(String, bool) onChange; final Function(String?, bool) onChange;
const ReportIssueItem({Key? key, this.isSelected, this.issueInfo, this.onChange}) : super(key: key); const ReportIssueItem({Key? key, this.isSelected = false, this.issueInfo, required this.onChange}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -25,7 +25,7 @@ class ReportIssueItem extends StatelessWidget {
padding: const EdgeInsets.symmetric(horizontal: 8), padding: const EdgeInsets.symmetric(horizontal: 8),
child: Text( child: Text(
issueInfo ?? "", issueInfo ?? "",
style: Theme.of(context).textTheme.subtitle2, style: Theme.of(context).textTheme.titleSmall,
textScaleFactor: AppStyle.getScaleFactor(context), textScaleFactor: AppStyle.getScaleFactor(context),
), ),
), ),
@ -35,7 +35,7 @@ class ReportIssueItem extends StatelessWidget {
child: Checkbox( child: Checkbox(
value: isSelected, value: isSelected,
onChanged: (value) { onChanged: (value) {
onChange(issueInfo, value); onChange(issueInfo, value!);
}, },
), ),
), ),

@ -3,10 +3,10 @@ import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/app_style/sizing.dart';
class FailedLoading extends StatelessWidget { class FailedLoading extends StatelessWidget {
final String message; final String? message;
final VoidCallback onReload; final VoidCallback onReload;
const FailedLoading({Key? key, this.message, this.onReload}) : super(key: key); const FailedLoading({Key? key, this.message,required this.onReload}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -16,7 +16,7 @@ class FailedLoading extends StatelessWidget {
children: [ children: [
Text( Text(
message ?? context.translation.httpError, message ?? context.translation.httpError,
style: Theme.of(context).textTheme.subtitle1, style: Theme.of(context).textTheme.titleMedium,
textScaleFactor: AppStyle.getScaleFactor(context), textScaleFactor: AppStyle.getScaleFactor(context),
), ),
SizedBox( SizedBox(

@ -2,12 +2,12 @@ import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class ImageLoader extends StatelessWidget { class ImageLoader extends StatelessWidget {
final String url; final String? url;
final BoxFit boxFit; final BoxFit? boxFit;
final Color color; final Color? color;
final Alignment alignment; final Alignment? alignment;
final double width; final double? width;
final double height; final double? height;
const ImageLoader({Key? key, required this.url, this.boxFit, this.color, this.alignment, this.width, this.height}) : super(key: key); const ImageLoader({Key? key, required this.url, this.boxFit, this.color, this.alignment, this.width, this.height}) : super(key: key);

@ -4,12 +4,8 @@ import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/app_style/app_color.dart';
class NoItemFound extends StatelessWidget { class NoItemFound extends StatelessWidget {
final String message; final String? message;
const NoItemFound({Key? key, this.message}) : super(key: key);
const NoItemFound({
Key? key,
this.message,
}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {

@ -14,7 +14,7 @@ class NotificationItem extends StatelessWidget {
final bool isLoading; final bool isLoading;
const NotificationItem({Key? key, this.notification, this.onPressed, this.isLoading = false}) : super(key: key); const NotificationItem({Key? key, required this.notification, required this.onPressed, this.isLoading = false}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -26,11 +26,11 @@ class NotificationItem extends StatelessWidget {
if (notification.priorityName != null) if (notification.priorityName != null)
StatusLabel( StatusLabel(
label: notification.priorityName, label: notification.priorityName,
textColor: AppColor.getRequestStatusTextColorByName(context, notification.priorityName), textColor: AppColor.getRequestStatusTextColorByName(context, notification.priorityName!),
backgroundColor: AppColor.getRequestStatusColorByName(context, notification.priorityName), backgroundColor: AppColor.getRequestStatusColorByName(context, notification.priorityName!),
).toShimmer(isShow: isLoading), ).toShimmer(isShow: isLoading),
8.width, 8.width,
if((notification.statusName ?? "").isNotEmpty && notification.sourceName!="Asset Transfer") if ((notification.statusName ?? "").isNotEmpty && notification.sourceName != "Asset Transfer")
StatusLabel( StatusLabel(
label: notification.statusName ?? "", label: notification.statusName ?? "",
textColor: AppColor.getRequestStatusTextColorByName(context, notification.statusName ?? ""), textColor: AppColor.getRequestStatusTextColorByName(context, notification.statusName ?? ""),
@ -50,7 +50,7 @@ class NotificationItem extends StatelessWidget {
).toShimmer(isShow: isLoading).expanded, ).toShimmer(isShow: isLoading).expanded,
8.width, 8.width,
Text( Text(
notification.createdOn.toServiceRequestCardFormat ?? "", notification.createdOn?.toServiceRequestCardFormat ?? "",
textAlign: TextAlign.right, textAlign: TextAlign.right,
style: AppTextStyles.tinyFont.copyWith( style: AppTextStyles.tinyFont.copyWith(
color: context.isDark ? AppColor.neutral20 : AppColor.neutral50, color: context.isDark ? AppColor.neutral20 : AppColor.neutral50,

@ -15,21 +15,21 @@ import '../../../new_views/app_style/app_text_style.dart';
class AutoCompletePartsField extends StatefulWidget { class AutoCompletePartsField extends StatefulWidget {
final String initialValue; final String initialValue;
final num assetId; final num? assetId;
final bool clearAfterPick, byName; final bool clearAfterPick, byName;
final Function(SparePartsWorkOrders) onPick; final Function(SparePartsWorkOrders) onPick;
const AutoCompletePartsField({Key? key, this.byName, this.initialValue, this.assetId, this.onPick, this.clearAfterPick = true}) : super(key: key); const AutoCompletePartsField({Key? key, required this.byName, required this.initialValue, this.assetId, required this.onPick, this.clearAfterPick = true}) : super(key: key);
@override @override
_AutoCompletePartsFieldState createState() => _AutoCompletePartsFieldState(); _AutoCompletePartsFieldState createState() => _AutoCompletePartsFieldState();
} }
class _AutoCompletePartsFieldState extends State<AutoCompletePartsField> { class _AutoCompletePartsFieldState extends State<AutoCompletePartsField> {
SettingProvider _settingProvider; late SettingProvider _settingProvider;
PartsProvider _partsProvider; late PartsProvider _partsProvider;
UserProvider _userProvider; late UserProvider _userProvider;
TextEditingController _controller; late TextEditingController _controller;
@override @override
void initState() { void initState() {

@ -1,38 +1,31 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_typeahead/flutter_typeahead.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/devices_provider.dart'; import 'package:test_sa/controllers/providers/api/devices_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/app_style/sizing.dart';
import 'package:test_sa/views/widgets/equipment/pick_asset.dart'; import 'package:test_sa/views/widgets/equipment/pick_asset.dart';
import '../../../../extensions/text_extensions.dart';
import '../../../../models/device/asset.dart'; import '../../../../models/device/asset.dart';
import '../../../../models/device/asset_search.dart';
import '../../../../new_views/app_style/app_color.dart'; import '../../../../new_views/app_style/app_color.dart';
import '../../../../new_views/app_style/app_text_style.dart';
class CalibrationToolAssetPicker extends StatefulWidget { class CalibrationToolAssetPicker extends StatefulWidget {
final Lookup initialValue; final Lookup? initialValue;
final int hospitalId; final int? hospitalId;
final Function(Lookup) onPick; final Function(Lookup) onPick;
const CalibrationToolAssetPicker({Key? key, this.initialValue, this.onPick, this.hospitalId}) : super(key: key); const CalibrationToolAssetPicker({Key? key, this.initialValue, required this.onPick, this.hospitalId}) : super(key: key);
@override @override
State<CalibrationToolAssetPicker> createState() => _CalibrationToolAssetPickerState(); State<CalibrationToolAssetPicker> createState() => _CalibrationToolAssetPickerState();
} }
class _CalibrationToolAssetPickerState extends State<CalibrationToolAssetPicker> { class _CalibrationToolAssetPickerState extends State<CalibrationToolAssetPicker> {
SettingProvider _settingProvider; late SettingProvider _settingProvider;
AssetProvider _devicesProvider; late AssetProvider _devicesProvider;
UserProvider _userProvider; late UserProvider _userProvider;
TextEditingController _controller; late TextEditingController _controller;
@override @override
void initState() { void initState() {
@ -75,11 +68,11 @@ class _CalibrationToolAssetPickerState extends State<CalibrationToolAssetPicker>
device: widget.initialValue == null device: widget.initialValue == null
? null ? null
: Asset( : Asset(
id: widget.initialValue.id, id: widget.initialValue!.id,
assetNumber: widget.initialValue.name, assetNumber: widget.initialValue!.name,
), ),
onPickAsset: (device) { onPickAsset: (device) {
widget.onPick(Lookup(id: device.id, name: device.assetNumber)); widget.onPick(Lookup(id: device.id?.toInt(), name: device.assetNumber));
}, },
), ),
], ],

@ -9,17 +9,15 @@ import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/ppm/ppm_calibration_tools.dart'; import 'package:test_sa/models/ppm/ppm_calibration_tools.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';
import 'package:test_sa/views/widgets/equipment/pick_asset.dart';
import 'package:test_sa/views/widgets/pentry/calibration_tool_asset_picker.dart'; import 'package:test_sa/views/widgets/pentry/calibration_tool_asset_picker.dart';
import '../../../new_views/app_style/app_color.dart'; import '../../../new_views/app_style/app_color.dart';
import '../date_and_time/date_picker.dart'; import '../date_and_time/date_picker.dart';
import 'auto_complete_fields/auto_complete_devices_field.dart';
class PentryCalibrationToolForm extends StatefulWidget { class PentryCalibrationToolForm extends StatefulWidget {
final List<PpmCalibrationTools> models; final List<PpmCalibrationTools>? models;
const PentryCalibrationToolForm({Key? key, this.models}) : super(key: key); const PentryCalibrationToolForm({Key? key, this.models = const <PpmCalibrationTools>[]}) : super(key: key);
@override @override
State<PentryCalibrationToolForm> createState() => _PentryCalibrationToolFormState(); State<PentryCalibrationToolForm> createState() => _PentryCalibrationToolFormState();
@ -30,10 +28,10 @@ class _PentryCalibrationToolFormState extends State<PentryCalibrationToolForm> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
final userProvider = Provider.of<UserProvider>(context); final userProvider = Provider.of<UserProvider>(context);
return ListView.builder( return ListView.builder(
itemCount: widget.models.length + 1, itemCount: widget.models!.length + 1,
padding: EdgeInsets.only(top: 16.toScreenHeight), padding: EdgeInsets.only(top: 16.toScreenHeight),
itemBuilder: (context, index) { itemBuilder: (context, index) {
if (index == widget.models.length) { if (index == widget.models!.length) {
return AppFilledButton( return AppFilledButton(
label: context.translation.addAsset, label: context.translation.addAsset,
maxWidth: true, maxWidth: true,
@ -41,21 +39,21 @@ class _PentryCalibrationToolFormState extends State<PentryCalibrationToolForm> {
buttonColor: context.isDark ? AppColor.neutral60 : AppColor.neutral50, buttonColor: context.isDark ? AppColor.neutral60 : AppColor.neutral50,
onPressed: () async { onPressed: () async {
if (widget.models?.isNotEmpty ?? false) { if (widget.models?.isNotEmpty ?? false) {
if (widget.models.last.assetId == null) { if (widget.models!.last.assetId == null) {
await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.assetNumber}"); await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.assetNumber}");
return; return;
} }
if (widget.models.last.calibrationDateOfTesters == null) { if (widget.models!.last.calibrationDateOfTesters == null) {
await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.date}"); await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.date}");
return; return;
} }
} }
widget.models.add(PpmCalibrationTools(id: 0)); widget.models!.add(PpmCalibrationTools(id: 0));
setState(() {}); setState(() {});
}, },
); );
} }
final model = widget.models[index]; final model = widget.models![index];
return Container( return Container(
padding: const EdgeInsets.all(16), padding: const EdgeInsets.all(16),
margin: EdgeInsets.only(bottom: 16.toScreenHeight), margin: EdgeInsets.only(bottom: 16.toScreenHeight),
@ -72,15 +70,15 @@ class _PentryCalibrationToolFormState extends State<PentryCalibrationToolForm> {
children: [ children: [
"${context.translation.asset} ${index + 1}".heading5(context), "${context.translation.asset} ${index + 1}".heading5(context),
"trash".toSvgAsset(height: 20, width: 15).onPress(() { "trash".toSvgAsset(height: 20, width: 15).onPress(() {
widget.models.remove(model); widget.models!.remove(model);
setState(() {}); setState(() {});
}), }),
], ],
), ),
16.height, 16.height,
CalibrationToolAssetPicker( CalibrationToolAssetPicker(
initialValue: model.assetId == null ? null : Lookup(id: model.assetId, name: model.assetNumber ?? ""), initialValue: model.assetId == null ? null : Lookup(id: model.assetId?.toInt(), name: model.assetNumber ?? ""),
hospitalId: userProvider.user.clientId, hospitalId: userProvider.user!.clientId,
onPick: (number) { onPick: (number) {
model.assetNumber = number.name; model.assetNumber = number.name;
model.assetId = number.id; model.assetId = number.id;

@ -11,10 +11,10 @@ import '../../../new_views/common_widgets/app_filled_button.dart';
import '../parts/auto_complete_parts_field.dart'; import '../parts/auto_complete_parts_field.dart';
class PentryPMKitForm extends StatefulWidget { class PentryPMKitForm extends StatefulWidget {
final List<PpmKits> models; final List<PpmKits>? models;
final num assetId; final num? assetId;
const PentryPMKitForm({Key? key, this.models, this.assetId}) : super(key: key); const PentryPMKitForm({Key? key, this.models = const <PpmKits>[], this.assetId}) : super(key: key);
@override @override
State<PentryPMKitForm> createState() => _PentryPMKitFormState(); State<PentryPMKitForm> createState() => _PentryPMKitFormState();
@ -24,11 +24,11 @@ class _PentryPMKitFormState extends State<PentryPMKitForm> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return ListView.builder( return ListView.builder(
itemCount: widget.models.length + 1, itemCount: widget.models!.length + 1,
shrinkWrap: true, shrinkWrap: true,
padding: EdgeInsets.only(top: 16.toScreenHeight), padding: EdgeInsets.only(top: 16.toScreenHeight),
itemBuilder: (context, index) { itemBuilder: (context, index) {
if (index == widget.models.length) { if (index == widget.models!.length) {
return AppFilledButton( return AppFilledButton(
label: context.translation.addItem, label: context.translation.addItem,
maxWidth: true, maxWidth: true,
@ -36,21 +36,21 @@ class _PentryPMKitFormState extends State<PentryPMKitForm> {
buttonColor: context.isDark ? AppColor.neutral60 : AppColor.neutral50, buttonColor: context.isDark ? AppColor.neutral60 : AppColor.neutral50,
onPressed: () async { onPressed: () async {
if (widget.models?.isNotEmpty ?? false) { if (widget.models?.isNotEmpty ?? false) {
if (widget.models.last.partNumber == null) { if (widget.models!.last.partNumber == null) {
await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.partNumber}"); await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.partNumber}");
return; return;
} }
if (widget.models.last.partName == null) { if (widget.models!.last.partName == null) {
await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.partName}"); await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.partName}");
return; return;
} }
} }
widget.models.add(PpmKits(id: 0)); widget.models!.add(PpmKits(id: 0));
setState(() {}); setState(() {});
}, },
); );
} }
final model = widget.models[index]; final model = widget.models![index];
return Container( return Container(
padding: const EdgeInsets.all(16), padding: const EdgeInsets.all(16),
margin: EdgeInsets.only(bottom: 16.toScreenHeight), margin: EdgeInsets.only(bottom: 16.toScreenHeight),
@ -67,7 +67,7 @@ class _PentryPMKitFormState extends State<PentryPMKitForm> {
children: [ children: [
"${context.translation.item} ${index + 1}".heading5(context), "${context.translation.item} ${index + 1}".heading5(context),
"trash".toSvgAsset(width: 15, height: 20).onPress(() { "trash".toSvgAsset(width: 15, height: 20).onPress(() {
widget.models.remove(model); widget.models!.remove(model);
setState(() {}); setState(() {});
}), }),
], ],

@ -11,7 +11,7 @@ import 'package:test_sa/new_views/common_widgets/single_item_drop_down_menu.dart
import 'package:test_sa/providers/ppm_checklist_status_provider.dart'; import 'package:test_sa/providers/ppm_checklist_status_provider.dart';
class PentryPMChecklistForm extends StatefulWidget { class PentryPMChecklistForm extends StatefulWidget {
final List<PpmChecklists> models; final List<PpmChecklists>? models;
const PentryPMChecklistForm({Key? key, this.models}) : super(key: key); const PentryPMChecklistForm({Key? key, this.models}) : super(key: key);
@ -25,19 +25,18 @@ class _PentryPMChecklistFormState extends State<PentryPMChecklistForm> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final list = List<PpmChecklists>? list = widget.models?.where((element) => element.task != null).toList();
widget.models?.where((element) => element.task != null)?.toList();
return (list?.isEmpty ?? true) return (list?.isEmpty ?? true)
? context.translation.noDataFound.heading5(context).center ? context.translation.noDataFound.heading5(context).center
: ListView.builder( : ListView.builder(
padding: EdgeInsets.only(top: 16.toScreenHeight), padding: EdgeInsets.only(top: 16.toScreenHeight),
itemCount: list?.length, itemCount: list?.length ?? 0,
shrinkWrap: true, shrinkWrap: true,
itemBuilder: (context, index) { itemBuilder: (context, index) {
return Card( return Card(
child: ExpansionTile( child: ExpansionTile(
shape: const Border(), shape: const Border(),
title: (list[index].task ?? "").heading5(context), title: (list![index].task ?? "").heading5(context),
onExpansionChanged: (value) { onExpansionChanged: (value) {
if (!value) { if (!value) {
showLabel.remove(index); showLabel.remove(index);
@ -46,28 +45,16 @@ class _PentryPMChecklistFormState extends State<PentryPMChecklistForm> {
} }
setState(() {}); setState(() {});
}, },
subtitle: showLabel.isNotEmpty && showLabel.contains(index) subtitle: showLabel.isNotEmpty && showLabel.contains(index) ? null : "${context.translation.status} ${list[index].taskStatusName}".bodyText(context),
? null iconColor: context.isDark ? AppColor.neutral30 : AppColor.neutral50,
: "${context.translation.status} ${list[index].taskStatusName}" collapsedIconColor: context.isDark ? AppColor.neutral30 : AppColor.neutral50,
.bodyText(context), childrenPadding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight),
iconColor:
context.isDark ? AppColor.neutral30 : AppColor.neutral50,
collapsedIconColor:
context.isDark ? AppColor.neutral30 : AppColor.neutral50,
childrenPadding: EdgeInsets.symmetric(
horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight),
children: [ children: [
if (showLabel.isNotEmpty && showLabel.contains(index)) if (showLabel.isNotEmpty && showLabel.contains(index))
SingleItemDropDownMenu<Lookup, SingleItemDropDownMenu<Lookup, PpmChecklistStatusProvider>(
PpmChecklistStatusProvider>(
context: context, context: context,
backgroundColor: backgroundColor: context.isDark ? AppColor.neutral50 : null,
context.isDark ? AppColor.neutral50 : null, initialValue: list[index].taskStatusId == null ? null : Lookup(id: list[index].taskStatusId!.toInt(), name: list[index].taskStatusName),
initialValue: list[index].taskStatusId == null
? null
: Lookup(
id: list[index].taskStatusId,
name: list[index].taskStatusName),
title: context.translation.status, title: context.translation.status,
onSelect: (value) { onSelect: (value) {
if (value != null) { if (value != null) {
@ -76,14 +63,12 @@ class _PentryPMChecklistFormState extends State<PentryPMChecklistForm> {
} }
}, },
), ),
if (showLabel.isNotEmpty && showLabel.contains(index)) if (showLabel.isNotEmpty && showLabel.contains(index)) 8.height,
8.height,
AppTextFormField( AppTextFormField(
labelText: context.translation.measuredValue, labelText: context.translation.measuredValue,
initialValue: list[index].measuredValue, initialValue: list[index].measuredValue ?? "",
// enable: false, // enable: false,
backgroundColor: backgroundColor: context.isDark ? AppColor.neutral20 : null,
context.isDark ? AppColor.neutral20 : null,
// backgroundColor: context.isDark ? AppColor.neutral50 : null, // backgroundColor: context.isDark ? AppColor.neutral50 : null,
onChange: (text) { onChange: (text) {
list[index].measuredValue = text; list[index].measuredValue = text;
@ -92,10 +77,9 @@ class _PentryPMChecklistFormState extends State<PentryPMChecklistForm> {
8.height, 8.height,
AppTextFormField( AppTextFormField(
labelText: context.translation.comment, labelText: context.translation.comment,
initialValue: list[index].taskComment, initialValue: list[index].taskComment ?? "",
// enable: false, // enable: false,
backgroundColor: backgroundColor: context.isDark ? AppColor.neutral20 : null,
context.isDark ? AppColor.neutral20 : null,
// backgroundColor: context.isDark ? AppColor.neutral50 : null, // backgroundColor: context.isDark ? AppColor.neutral50 : null,
onChange: (text) { onChange: (text) {
list[index].taskComment = text; list[index].taskComment = text;

@ -29,22 +29,22 @@ import '../timer/app_timer.dart';
class PentryTBSForm extends StatefulWidget { class PentryTBSForm extends StatefulWidget {
final Ppm model; final Ppm model;
const PentryTBSForm({Key? key, this.model}) : super(key: key); const PentryTBSForm({Key? key, required this.model}) : super(key: key);
@override @override
State<PentryTBSForm> createState() => _PentryTBSFormState(); State<PentryTBSForm> createState() => _PentryTBSFormState();
} }
class _PentryTBSFormState extends State<PentryTBSForm> { class _PentryTBSFormState extends State<PentryTBSForm> {
SupplierDetails initialSupplier; SupplierDetails? initialSupplier;
SuppPersons _suppPerson; SuppPersons? _suppPerson;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
widget.model?.files ??= []; widget.model?.files ??= [];
widget.model?.files = (widget.model.files ?? []).where((element) => element.attachmentName != null && element.attachmentName.isNotEmpty).toList(); widget.model?.files = (widget.model.files ?? []).where((element) => element.attachmentName?.isNotEmpty ?? false).toList();
double totalWorkingHours = widget.model.visitTimers.fold(0.0, (sum, item) => sum + DateTime.parse(item.endDateTime).difference(DateTime.parse(item.startDateTime)).inSeconds); double totalWorkingHours = widget.model.visitTimers?.fold(0.0, (sum, item) => (sum ?? 0) + DateTime.parse(item.endDateTime!).difference(DateTime.parse(item.startDateTime!)).inSeconds) ?? 0;
totalWorkingHours = totalWorkingHours; totalWorkingHours = totalWorkingHours;
@ -55,11 +55,11 @@ class _PentryTBSFormState extends State<PentryTBSForm> {
8.height, 8.height,
SingleItemDropDownMenu<Lookup, PPMVisitStatusProvider>( SingleItemDropDownMenu<Lookup, PPMVisitStatusProvider>(
context: context, context: context,
initialValue: widget.model.visitStatusId == null ? null : Lookup(name: widget.model.visitStatusName ?? "", id: widget.model.visitStatusId), initialValue: widget.model.visitStatusId == null ? null : Lookup(name: widget.model.visitStatusName ?? "", id: widget.model.visitStatusId?.toInt()),
title: context.translation.ppmVisit, title: context.translation.ppmVisit,
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;
setState(() {}); setState(() {});
return; return;
} }
@ -101,7 +101,7 @@ class _PentryTBSFormState extends State<PentryTBSForm> {
AppTimer( AppTimer(
label: context.translation.timer, label: context.translation.timer,
timer: widget.model.tbsTimer, timer: widget.model.tbsTimer,
enabled: widget.model.tbsTimer.endAt == null, enabled: widget.model.tbsTimer?.endAt == null,
timerProgress: (isRunning) { timerProgress: (isRunning) {
print("timerProgress:$isRunning"); print("timerProgress:$isRunning");
}, },
@ -113,7 +113,7 @@ class _PentryTBSFormState extends State<PentryTBSForm> {
8.height, 8.height,
SingleItemDropDownMenu<Lookup, PPMDeviceStatusProvider>( SingleItemDropDownMenu<Lookup, PPMDeviceStatusProvider>(
context: context, context: context,
initialValue: widget.model.deviceStatusId == null ? null : Lookup(name: widget.model.deviceStatusName ?? "", id: widget.model.deviceStatusId), initialValue: widget.model.deviceStatusId == null ? null : Lookup(name: widget.model.deviceStatusName ?? "", id: widget.model.deviceStatusId?.toInt()),
title: context.translation.deviceStatus, title: context.translation.deviceStatus,
onSelect: (value) { onSelect: (value) {
if (value != null) { if (value != null) {
@ -125,7 +125,7 @@ class _PentryTBSFormState extends State<PentryTBSForm> {
8.height, 8.height,
SingleItemDropDownMenu<Lookup, PpmTaskStatusProvider>( SingleItemDropDownMenu<Lookup, PpmTaskStatusProvider>(
context: context, context: context,
initialValue: widget.model.taskStatusId == null ? null : Lookup(name: widget.model.taskStatusName ?? "", id: widget.model.taskStatusId), initialValue: widget.model.taskStatusId == null ? null : Lookup(name: widget.model.taskStatusName ?? "", id: widget.model.taskStatusId?.toInt()),
title: context.translation.taskStatus, title: context.translation.taskStatus,
onSelect: (value) { onSelect: (value) {
if (value != null) { if (value != null) {
@ -137,7 +137,7 @@ class _PentryTBSFormState extends State<PentryTBSForm> {
8.height, 8.height,
SingleItemDropDownMenu<Lookup, PpmAssetAvailabilityProvider>( SingleItemDropDownMenu<Lookup, PpmAssetAvailabilityProvider>(
context: context, context: context,
initialValue: widget.model.assetAvailabilityId == null ? null : Lookup(name: widget.model.assetAvailabilityName ?? "", id: widget.model.assetAvailabilityId), initialValue: widget.model.assetAvailabilityId == null ? null : Lookup(name: widget.model.assetAvailabilityName ?? "", id: widget.model.assetAvailabilityId?.toInt()),
title: "Asset Availability", title: "Asset Availability",
onSelect: (value) { onSelect: (value) {
if (value != null) { if (value != null) {
@ -149,7 +149,7 @@ class _PentryTBSFormState extends State<PentryTBSForm> {
8.height, 8.height,
SingleItemDropDownMenu<Lookup, PpmElectricalSafetyProvider>( SingleItemDropDownMenu<Lookup, PpmElectricalSafetyProvider>(
context: context, context: context,
initialValue: widget.model.safetyId == null ? null : Lookup(name: widget.model.safetyName ?? "", id: widget.model.safetyId), initialValue: widget.model.safetyId == null ? null : Lookup(name: widget.model.safetyName ?? "", id: widget.model.safetyId?.toInt()),
title: "Electrical Safety", title: "Electrical Safety",
onSelect: (value) { onSelect: (value) {
if (value != null) { if (value != null) {
@ -161,7 +161,7 @@ class _PentryTBSFormState extends State<PentryTBSForm> {
8.height, 8.height,
SingleItemDropDownMenu<Lookup, PpmServiceProvider>( SingleItemDropDownMenu<Lookup, PpmServiceProvider>(
context: context, context: context,
initialValue: widget.model.typeOfServiceId == null ? null : Lookup(name: widget.model.typeOfServiceName ?? "", id: widget.model.typeOfServiceId), initialValue: widget.model.typeOfServiceId == null ? null : Lookup(name: widget.model.typeOfServiceName ?? "", id: widget.model.typeOfServiceId?.toInt()),
title: context.translation.serviceType, title: context.translation.serviceType,
onSelect: (value) { onSelect: (value) {
if (value != null) { if (value != null) {
@ -230,7 +230,7 @@ class _PentryTBSFormState extends State<PentryTBSForm> {
AppTimer( AppTimer(
label: "External Supplier Timer", label: "External Supplier Timer",
timer: widget.model.externalEngineerTimer, timer: widget.model.externalEngineerTimer,
enabled: widget.model.externalEngineerTimer.endAt == null, enabled: widget.model.externalEngineerTimer?.endAt == null,
timerProgress: (isRunning) { timerProgress: (isRunning) {
print("timerProgress:$isRunning"); print("timerProgress:$isRunning");
}, },
@ -247,7 +247,7 @@ class _PentryTBSFormState extends State<PentryTBSForm> {
from: DateTime.now().subtract(const Duration(days: 30)), from: DateTime.now().subtract(const Duration(days: 30)),
onDatePicker: (date) { onDatePicker: (date) {
if (date == null) return; if (date == null) return;
if (date.isBefore(DateTime.parse(widget.model.expectedDate))) { if (date.isBefore(DateTime.parse(widget.model.expectedDate!))) {
"Actual visit date must be greater then expected date".showToast; "Actual visit date must be greater then expected date".showToast;
return; return;
} }
@ -282,7 +282,7 @@ class _PentryTBSFormState extends State<PentryTBSForm> {
8.height, 8.height,
MultiFilesPicker( MultiFilesPicker(
label: context.translation.attachImage, label: context.translation.attachImage,
files: widget.model.files.map((e) => File(e.attachmentName)).toList(), files: widget.model.files!.map((e) => File(e.attachmentName!)).toList(),
onChange: (files) { onChange: (files) {
widget.model.files = files.map((e) => PpmAttachments(attachmentName: e.path)).toList(); widget.model.files = files.map((e) => PpmAttachments(attachmentName: e.path)).toList();
}, },

@ -17,9 +17,9 @@ import '../requests/request_status.dart';
class PpmItem extends StatelessWidget { class PpmItem extends StatelessWidget {
final Ppm ppm; final Ppm ppm;
final RequestsDetails request; final RequestsDetails? request;
const PpmItem({Key? key, this.ppm, this.request}) : super(key: key); const PpmItem({Key? key, required this.ppm, this.request}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -32,24 +32,24 @@ class PpmItem extends StatelessWidget {
children: [ children: [
Row( Row(
children: [ children: [
if (request.priority != null) if (request?.priority != null)
StatusLabel( StatusLabel(
label: request.priority, label: request!.priority,
textColor: AppColor.getRequestStatusTextColorByName(context, request.priority), textColor: AppColor.getRequestStatusTextColorByName(context, request!.priority!),
backgroundColor: AppColor.getRequestStatusColorByName(context, request.priority), backgroundColor: AppColor.getRequestStatusColorByName(context, request!.priority!),
), ),
if (request.priority != null) 8.width, if (request?.priority != null) 8.width,
StatusLabel( StatusLabel(
label: ppm.visitStatusName, label: ppm.visitStatusName,
id: ppm.deviceStatusId, id: ppm.deviceStatusId!.toInt(),
textColor: AppColor.getRequestStatusTextColorByName(context, ppm.visitStatusName), textColor: AppColor.getRequestStatusTextColorByName(context, ppm.visitStatusName!),
backgroundColor: AppColor.getRequestStatusColorByName(context, ppm.visitStatusName), backgroundColor: AppColor.getRequestStatusColorByName(context, ppm.visitStatusName!),
), ),
1.width.expanded, 1.width.expanded,
], ],
), ),
8.height, 8.height,
ppm.assetName.heading5(context), ppm.assetName!.heading5(context),
8.height, 8.height,
'${context.translation.assetNumber}: ${ppm.assetNumber}'.bodyText(context), '${context.translation.assetNumber}: ${ppm.assetNumber}'.bodyText(context),
'${context.translation.assetSN}: ${ppm.assetSerialNo}'.bodyText(context), '${context.translation.assetSN}: ${ppm.assetSerialNo}'.bodyText(context),
@ -66,7 +66,7 @@ class PpmItem extends StatelessWidget {
Icon(Icons.arrow_forward, color: AppColor.blueStatus(context), size: 14) Icon(Icons.arrow_forward, color: AppColor.blueStatus(context), size: 14)
], ],
).onPress(() { ).onPress(() {
Navigator.of(context).push(MaterialPageRoute(builder: (_) => PpmDetailsPage(request: RequestsDetails(id: ppm.id)))); Navigator.of(context).push(MaterialPageRoute(builder: (_) => PpmDetailsPage(request: RequestsDetails(id: ppm.id!.toInt()))));
}), }),
], ],
).expanded, ).expanded,
@ -74,13 +74,13 @@ class PpmItem extends StatelessWidget {
Column( Column(
crossAxisAlignment: CrossAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end,
children: [ children: [
if (userProvider.user.type == UsersTypes.engineer && (ppm.deviceStatusId != 270 || ppm.deviceStatusId != 269)) if (userProvider.user!.type == UsersTypes.engineer && (ppm.deviceStatusId != 270 || ppm.deviceStatusId != 269))
"edit".toSvgAsset(height: 48, width: 48).onPress(() { "edit".toSvgAsset(height: 48, width: 48).onPress(() {
Navigator.of(context).push(MaterialPageRoute(builder: (_) => EditPpm(ppm: ppm, details: request))); Navigator.of(context).push(MaterialPageRoute(builder: (_) => EditPpm(ppm: ppm, details: request)));
}), }),
if (userProvider.user.type == UsersTypes.engineer && (ppm.deviceStatusId != 270 || ppm.deviceStatusId != 269)) 8.height, if (userProvider.user!.type == UsersTypes.engineer && (ppm.deviceStatusId != 270 || ppm.deviceStatusId != 269)) 8.height,
Text( Text(
ppm.createdOn != null ? ppm.createdOn.toServiceRequestCardFormat : "", ppm.createdOn?.toServiceRequestCardFormat ?? "",
textAlign: TextAlign.end, textAlign: TextAlign.end,
style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
), ),

@ -16,7 +16,7 @@ import '../../pages/device_transfer/search_asset_page.dart';
class AssetScanQr extends StatefulWidget { class AssetScanQr extends StatefulWidget {
static const String id = "/asset-scan-qr"; static const String id = "/asset-scan-qr";
const AssetScanQr({Key? key, this.title}) : super(key: key); const AssetScanQr({Key? key, required this.title}) : super(key: key);
final String title; final String title;
@override @override
@ -24,11 +24,11 @@ class AssetScanQr extends StatefulWidget {
} }
class _AssetScanQrState extends State<AssetScanQr> { class _AssetScanQrState extends State<AssetScanQr> {
Barcode result; // Barcode result;
QRViewController _controller; QRViewController? _controller;
bool _scanDone = false; bool _scanDone = false;
final GlobalKey qrKey = GlobalKey(debugLabel: 'QR_scanner'); final GlobalKey qrKey = GlobalKey(debugLabel: 'QR_scanner');
AssetProvider _devicesProvider; late AssetProvider _devicesProvider;
// In order to get hot reload to work we need to pause the camera if the platform // In order to get hot reload to work we need to pause the camera if the platform
// is android, or resume the camera if the platform is iOS. // is android, or resume the camera if the platform is iOS.
@ -80,7 +80,7 @@ class _AssetScanQrState extends State<AssetScanQr> {
controller.scannedDataStream.listen((scanData) async { controller.scannedDataStream.listen((scanData) async {
if (!_scanDone) { if (!_scanDone) {
_scanDone = true; _scanDone = true;
final result = await _getDevice(scanData.code, isQr: true); final result = await _getDevice(scanData.code!, isQr: true);
if (result.isNotEmpty) { if (result.isNotEmpty) {
Navigator.of(context).pop(result[0]); Navigator.of(context).pop(result[0]);
} else { } else {

@ -13,8 +13,8 @@ class ScanQr extends StatefulWidget {
} }
class _ScanQrState extends State<ScanQr> { class _ScanQrState extends State<ScanQr> {
Barcode result; // Barcode result;
QRViewController _controller; QRViewController? _controller;
bool _scanDone = false; bool _scanDone = false;
final GlobalKey qrKey = GlobalKey(debugLabel: 'QR_scanner'); final GlobalKey qrKey = GlobalKey(debugLabel: 'QR_scanner');

@ -14,7 +14,7 @@ class ServiceRequestItem extends StatelessWidget {
final ServiceRequest request; final ServiceRequest request;
final Function(ServiceRequest) onPressed; final Function(ServiceRequest) onPressed;
const ServiceRequestItem({Key? key, this.request, this.onPressed, this.index}) : super(key: key); const ServiceRequestItem({Key? key, required this.request, required this.onPressed, required this.index}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -34,8 +34,8 @@ class ServiceRequestItem extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
StatusLabel( StatusLabel(
label: request.priority.name, label: request.priority!.name,
id: request.priority.id, id: request.priority!.id!,
/* textColor: AColors.getPriorityStatusTextColor(request.priority.id), /* textColor: AColors.getPriorityStatusTextColor(request.priority.id),
backgroundColor: AColors.getPriorityStatusColor(request.priority.id)*/ backgroundColor: AColors.getPriorityStatusColor(request.priority.id)*/
), ),
@ -44,7 +44,7 @@ class ServiceRequestItem extends StatelessWidget {
label: request.statusLabel, /*textColor: AColors.getRequestStatusTextColor(request.statusValue), backgroundColor: AColors.getRequestStatusColor(request.statusValue)*/ label: request.statusLabel, /*textColor: AColors.getRequestStatusTextColor(request.statusValue), backgroundColor: AColors.getRequestStatusColor(request.statusValue)*/
), ),
1.width.expanded, 1.width.expanded,
Text(request.date.toServiceRequestCardFormat, textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral30 : const Color(0xFF3B3D4A))), Text(request.date!.toServiceRequestCardFormat, textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral30 : const Color(0xFF3B3D4A))),
], ],
), ),
8.height, 8.height,
@ -54,11 +54,11 @@ class ServiceRequestItem extends StatelessWidget {
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : Color(0xFF757575)), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : Color(0xFF757575)),
), ),
Text( Text(
'${context.translation.assetNumber}: ${request.device.assetNumber}', '${context.translation.assetNumber}: ${request.device!.assetNumber}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : Color(0xFF757575)), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : Color(0xFF757575)),
), ),
Text( Text(
'${context.translation.requestType}: ${request.type.name}', '${context.translation.requestType}: ${request.type!.name}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : Color(0xFF757575)), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : Color(0xFF757575)),
), ),
Text( Text(

@ -14,7 +14,7 @@ class ServiceRequestsList extends StatelessWidget {
final bool nextPage; final bool nextPage;
final Future<void> Function() onLazyLoad; final Future<void> Function() onLazyLoad;
const ServiceRequestsList({Key? key, this.requests, this.nextPage, this.onLazyLoad}) : super(key: key); const ServiceRequestsList({Key? key,required this.requests,required this.nextPage,required this.onLazyLoad}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {

Loading…
Cancel
Save