null safety conversation complete

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

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

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

@ -1,15 +1,12 @@
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:http/http.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/extensions/context_extension.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/service_request/pending_service_request_model.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
// like 400 customer request failed
// 500 service not available
int stateCode;
int? stateCode;
bool _isDetialLoading = false;
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
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;
notifyListeners();
} // list of user requests
List<ServiceRequest> serviceRequests;
List<ServiceRequest>? serviceRequests;
List<SearchWorkOrder> workOrders = [];
List<SparePartsWorkOrders> _sparePartList = [];
SparePartsWorkOrders _initialSelectedSparePart = SparePartsWorkOrders();
ServiceRequest _currentSelectedRequest;
ServiceRequest? _currentSelectedRequest;
int _selectedListIndex = 0;
int get selectedListIndex => _selectedListIndex;
@ -75,9 +72,9 @@ class ServiceRequestsProvider extends ChangeNotifier {
notifyListeners();
}
ServiceRequest get currentSelectedRequest => _currentSelectedRequest;
ServiceRequest? get currentSelectedRequest => _currentSelectedRequest;
set currentSelectedRequest(ServiceRequest value) {
set currentSelectedRequest(ServiceRequest? value) {
_currentSelectedRequest = value;
notifyListeners();
}
@ -85,7 +82,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
// when requests in-process _loading = true
// done _loading = true
// failed _loading = false
bool isLoading;
bool isLoading = false;
ServiceRequestSearch search = ServiceRequestSearch();
@ -116,7 +113,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
List requestsListJson = json.decode(response.body)["data"];
List<ServiceRequest> serviceRequestsPage = requestsListJson.map((request) => ServiceRequest.fromJson(request)).toList();
serviceRequests ??= [];
serviceRequests.addAll(serviceRequestsPage);
serviceRequests!.addAll(serviceRequestsPage);
notifyListeners();
if (serviceRequestsPage.length == pageItemNumber) {
nextPage = true;
@ -135,40 +132,40 @@ class ServiceRequestsProvider extends ChangeNotifier {
}
}
Future<ServiceRequest> getSingleServiceRequest({
required String requestId,
required String host,
required User user,
required AppLocalizations subtitle,
}) async {
String userData = '';
if (user != null) {
userData += "&uid=" + user.id;
userData += "&token=" + user.token;
}
Response response;
try {
response = await get(Uri.parse(
host +
URLs.getSingleServiceRequest +
'?call_nid=$requestId'
'$userData',
));
} catch (error) {
throw (HttpStatusManger.getStatusMessage(status: -1, subtitle: subtitle));
}
// If the call to the server was successful, parse the JSON.
if (response.statusCode >= 200 && response.statusCode < 300) {
// If the call to the server was successful, parse the JSON.
List jsonList = json.decode(utf8.decode(response.bodyBytes).replaceAll("\\", ""));
List<ServiceRequest> _requests = jsonList.map((i) => ServiceRequest.fromJson(i)).toList();
return _requests[0];
} else {
throw (HttpStatusManger.getStatusMessage(status: response.statusCode, subtitle: subtitle));
}
}
// Future<ServiceRequest> getSingleServiceRequest({
// required String requestId,
// required String host,
// required User user,
// required AppLocalizations subtitle,
// }) async {
// String userData = '';
// if (user != null) {
// userData += "&uid=" + user!.id!;
// userData += "&token=" + user!.token!;
// }
//
// Response response;
// try {
// response = await get(Uri.parse(
// host +
// URLs.getSingleServiceRequest +
// '?call_nid=$requestId'
// '$userData',
// ));
// } catch (error) {
// throw (HttpStatusManger.getStatusMessage(status: -1, subtitle: subtitle));
// }
//
// // If the call to the server was successful, parse the JSON.
// if (response.statusCode >= 200 && response.statusCode < 300) {
// // If the call to the server was successful, parse the JSON.
// List jsonList = json.decode(utf8.decode(response.bodyBytes).replaceAll("\\", ""));
// List<ServiceRequest> _requests = jsonList.map((i) => ServiceRequest.fromJson(i)).toList();
// return _requests[0];
// } else {
// throw (HttpStatusManger.getStatusMessage(status: response.statusCode, subtitle: subtitle));
// }
// }
Future<void> createRequest({
required BuildContext context,
@ -185,7 +182,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
"requestedTime": DateTime.now().toIso8601String(),
"client": user.clientId,
"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(),
"defectType": serviceRequest.defectType?.toJson(),
"typeofRequest": serviceRequest.type?.toJson(),
@ -226,7 +223,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
if (serviceRequests != null) {
var data = json.decode(utf8.decode(response.bodyBytes));
if (data is List) {
serviceRequests.insert(0, ServiceRequest.fromJson(data[0]));
serviceRequests!.insert(0, ServiceRequest.fromJson(data[0]));
} else {
if (data["data"] != null && data["data"] == true) {
// serviceRequests.insert(0, ServiceRequest.fromJson(data[0]));
@ -246,30 +243,30 @@ class ServiceRequestsProvider extends ChangeNotifier {
}
}
Future<int> createIssueReport({
required String host,
required User user,
required Issue issue,
}) async {
Response response;
Map<String, String> body = issue.toMap();
body["uid"] = user.id;
body["token"] = user.token;
try {
response = await post(
Uri.parse(host + URLs.createReport),
body: body,
);
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {}
return response.statusCode;
} catch (error) {
return -1;
}
}
Future<PendingAssetServiceRequest> checkAssetPendingRequest(int assetId) async {
// Future<int> createIssueReport({
// required String host,
// required User user,
// required Issue issue,
// }) async {
// Response response;
// Map<String, String> body = issue.toMap();
// body["uid"] = user.id;
// body["token"] = user.token;
// try {
// response = await post(
// Uri.parse(host + URLs.createReport),
// body: body,
// );
//
// stateCode = response.statusCode;
// if (response.statusCode >= 200 && response.statusCode < 300) {}
// return response.statusCode;
// } catch (error) {
// return -1;
// }
// }
Future<PendingAssetServiceRequest?> checkAssetPendingRequest(int assetId) async {
Response response;
try {
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 {
isLoading = true;
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 Map<String, dynamic> callSiteContactPerson = callSiteContacts.isEmpty ? {} : callSiteContacts[0];
Response response;
try {
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) {}
@ -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;
try {
response = await ApiManager.instance.get(
URLs.getCallRequestForWorkOrder + "?callId=$callId",
);
response = await ApiManager.instance.get(URLs.getCallRequestForWorkOrder + "?callId=$callId");
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
// 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;
try {
response = await ApiManager.instance.get(URLs.getSubWorkerInfoAccordingToPreviousStep + "?parentId=$parentId");
@ -491,38 +486,38 @@ class ServiceRequestsProvider extends ChangeNotifier {
}
}
Future<int> createDuplicatedReport({
required String host,
required User user,
required ServiceRequest request,
}) async {
Response response;
String userData = '';
if (user != null) {
userData += "&uid=" + user.id;
userData += "&token=" + user.token;
}
try {
response = await get(
Uri.parse(host + URLs.createDuplicatedReport + "?nid=${request.id}" + userData),
);
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
reset();
notifyListeners();
}
return response.statusCode;
} catch (error) {
return -1;
}
}
// Future<int> createDuplicatedReport({
// required String host,
// required User user,
// required ServiceRequest request,
// }) async {
// Response response;
// String userData = '';
// if (user != null) {
// userData += "&uid=" + user.id;
// userData += "&token=" + user.token;
// }
//
// try {
// response = await get(
// Uri.parse(host + URLs.createDuplicatedReport + "?nid=${request.id}" + userData),
// );
//
// stateCode = response.statusCode;
//
// if (response.statusCode >= 200 && response.statusCode < 300) {
// reset();
// notifyListeners();
// }
// return response.statusCode;
// } catch (error) {
// return -1;
// }
// }
Future<int> updateServiceReport(BuildContext context, {required ServiceReport report}) async {
Response response;
report.callRequest = CallRequest(id: report.callRequest.id);
report.callRequest = CallRequest(id: report.callRequest!.id!);
Map<String, dynamic> body = report.toJson();
try {
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
@ -573,20 +568,15 @@ class ServiceRequestsProvider extends ChangeNotifier {
}
}
Future<int> updateServiceReportTimer({
required String host,
required User user,
required TimerModel timer,
required ServiceRequest request,
}) async {
Future<int> updateServiceReportTimer({required String host, required User user, required TimerModel timer, required ServiceRequest request}) async {
Response response;
Map<String, dynamic> body = {};
body["uid"] = user.id;
body["token"] = user.token;
body["job_id"] = request.id;
body["start_time"] = (timer.startAt.millisecondsSinceEpoch / 1000).toStringAsFixed(0);
body["end_time"] = (timer.endAt.millisecondsSinceEpoch / 1000).toStringAsFixed(0);
body["working_hours"] = (timer.durationInSecond / 60 / 60).toStringAsFixed(5);
body["start_time"] = (timer.startAt!.millisecondsSinceEpoch / 1000).toStringAsFixed(0);
body["end_time"] = (timer.endAt!.millisecondsSinceEpoch / 1000).toStringAsFixed(0);
body["working_hours"] = (timer.durationInSecond! / 60 / 60).toStringAsFixed(5);
body["report_id"] = request.reportID;
try {
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 {
isDetialLoading = true;
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 {
Response response;
try {
response = await ApiManager.instance.get(
URLs.getServiceRequestById + "?callRequestId=$requestId",
);
response = await ApiManager.instance.get(URLs.getServiceRequestById + "?callRequestId=$requestId");
} catch (error) {
print(error);
return {};
@ -678,12 +666,9 @@ class ServiceRequestsProvider extends ChangeNotifier {
if (callerId?.isNotEmpty ?? false) "callId": callerId,
if (search.assetType != null) "assetSerialNo": search.assetType?.name,
if (search.workOrderNo != null) "workOrderNo": search.workOrderNo,
if (search.id != null) "workOrderNo": search.id?.toString(),
if (search.calllastSituation != null) "callslastSituationWO": search.calllastSituation.toJson(),
if (search.assignedEmployee != null)
"assignedEmployees": [
search.assignedEmployee.id,
],
if (search.id != null) "workOrderNo": search.id.toString(),
if (search.calllastSituation != null) "callslastSituationWO": search.calllastSituation!.toJson(),
if (search.assignedEmployee != null) "assignedEmployees": [search.assignedEmployee!.id],
// "statusWO": [],
if (site?.isNotEmpty ?? false) "site": site,
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;
notifyListeners();
Response response;
SuppEngineerWorkOrders res;
SuppEngineerWorkOrders? res;
try {
response = await ApiManager.instance.post(URLs.addSupplierEngineer, body: supplierEngineer.toJson());
stateCode = response.statusCode;

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

@ -3,7 +3,7 @@ class Validator {
Validator._();
// 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;
return true;
}

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

@ -311,7 +311,7 @@ class ServiceReport {
map['reviewComment'] = reviewComment;
map['comment'] = comment;
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) {
map['equipmentStatus'] = equipmentStatus!.toJson();

@ -81,7 +81,7 @@ class AppColor {
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()) {
case "in progress":
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()) {
case "medium":
return blueStatus(context);

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

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

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

@ -35,7 +35,7 @@ class ActivitiesListView extends StatelessWidget {
body: Consumer<ServiceRequestsProvider>(builder: (context, serviceRequestsProvider, child) {
return SafeArea(
child: FutureBuilder(
future: serviceRequestsProvider.searchWorkOrders(callId: serviceRequestsProvider.currentSelectedRequest.requestCode!),
future: serviceRequestsProvider.searchWorkOrders(callId: serviceRequestsProvider.currentSelectedRequest!.requestCode!),
builder: (context, snap) {
if (snap.connectionState == ConnectionState.waiting) return const Center(child: CircularProgressIndicator());
workOrders = snap.data as List<SearchWorkOrder>;
@ -61,7 +61,7 @@ class ActivitiesListView extends StatelessWidget {
backgroundColor: AppColor.getRequestStatusColorByName(context, workOrders[index].currentSituation!.name!),
),
8.height,
Text(serviceRequestsProvider.currentSelectedRequest.requestCode!,
Text(serviceRequestsProvider.currentSelectedRequest!.requestCode!,
style: AppTextStyles.heading5.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)),
Text(
'${context.translation.assetName}: ${workOrders[index].callRequest!.asset!.modelDefinition!.assetName?.cleanupWhitespace?.capitalizeFirstOfEach}',
@ -95,16 +95,16 @@ class ActivitiesListView extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.start,
children: [
if (_userProvider.user!.type == UsersTypes.engineer &&
serviceRequestsProvider.currentSelectedRequest.statusValue != 5 &&
serviceRequestsProvider.currentSelectedRequest.statusValue != 3)
serviceRequestsProvider.currentSelectedRequest?.statusValue != 5 &&
serviceRequestsProvider.currentSelectedRequest?.statusValue != 3)
"edit".toSvgAsset(height: 48, width: 48).onPress(() {
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 &&
serviceRequestsProvider.currentSelectedRequest.statusValue != 5 &&
serviceRequestsProvider.currentSelectedRequest.statusValue != 3)
serviceRequestsProvider.currentSelectedRequest?.statusValue != 5 &&
serviceRequestsProvider.currentSelectedRequest?.statusValue != 3)
8.height,
Text(workOrders[index].visitDate?.toServiceRequestCardFormat ?? "",
textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral30 : const Color(0xFF3B3D4A))),
@ -115,7 +115,7 @@ class ActivitiesListView extends StatelessWidget {
},
).expanded,
if (_userProvider.user!.type == UsersTypes.engineer &&
(serviceRequestsProvider.currentSelectedRequest.statusValue != 5 && serviceRequestsProvider.currentSelectedRequest.statusValue != 3))
(serviceRequestsProvider.currentSelectedRequest?.statusValue != 5 && serviceRequestsProvider.currentSelectedRequest?.statusValue != 3))
AppFilledButton(
label: context.translation.createNewActivity,
maxWidth: true,

@ -51,7 +51,7 @@ class ActivityTypeBottomSheet extends StatelessWidget {
subHeading: item['subHeading']!,
context: context,
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,
ADatePicker(
label: context.translation.visitDate,
date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest.visitDate ?? ""),
date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest?.visitDate ?? ""),
formatDateWithTime: true,
onDatePicker: (selectedDate) {
if (selectedDate != null) {
@ -71,11 +71,11 @@ class InitialVisitBottomSheet extends StatelessWidget {
selectedTime.minute,
);
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;
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,
Row(
children: [
ADatePicker(
label: context.translation.startDate,
date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest.startDate ?? ""),
date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest?.startDate ?? ""),
formatDateWithTime: true,
onDatePicker: (selectedDate) {
if (selectedDate != null) {
@ -109,7 +109,7 @@ class InitialVisitBottomSheet extends StatelessWidget {
);
if (selectedDateTime != null) {
serviceRequestProvider.currentSelectedRequest.startDate = selectedDateTime?.toIso8601String();
serviceRequestProvider.currentSelectedRequest?.startDate = selectedDateTime?.toIso8601String();
}
}
@ -120,7 +120,7 @@ class InitialVisitBottomSheet extends StatelessWidget {
8.width,
ADatePicker(
label: context.translation.endDate,
date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest.endDate ?? ""),
date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest?.endDate ?? ""),
formatDateWithTime: true,
onDatePicker: (selectedDate) {
if (selectedDate != null) {
@ -138,9 +138,9 @@ class InitialVisitBottomSheet extends StatelessWidget {
selectedTime.minute,
);
if (selectedDateTime != null) {
serviceRequestProvider.currentSelectedRequest.endDate = selectedDateTime?.toIso8601String();
serviceRequestProvider.currentSelectedRequest.workingHours =
(((DateTime.parse(serviceRequestProvider.currentSelectedRequest.endDate!).difference(DateTime.parse(serviceRequestProvider.currentSelectedRequest.startDate!)).inSeconds ?? 0) / 60) / 60).toStringAsFixed(2);
serviceRequestProvider.currentSelectedRequest?.endDate = selectedDateTime?.toIso8601String();
serviceRequestProvider.currentSelectedRequest?.workingHours =
(((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,
alignLabelWithHint: true,
onChange: (text) {
serviceRequestProvider.currentSelectedRequest.comments = text;
serviceRequestProvider.currentSelectedRequest?.comments = text;
},
onSaved: (text) {
serviceRequestProvider.currentSelectedRequest.comments = text;
serviceRequestProvider.currentSelectedRequest?.comments = text;
},
),
16.height,

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

@ -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/text_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/service_request/service_request.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/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/time_picker.dart';
import 'package:test_sa/views/widgets/timer/app_timer.dart';
import '../../../../controllers/providers/api/service_requests_provider.dart';
import '../../../../new_views/app_style/app_color.dart';
import '../../../../new_views/common_widgets/app_filled_button.dart';
@ -268,7 +267,7 @@ class ServiceRequestBottomSheet {
hideShadow: true,
height: 80.toScreenHeight,
backgroundColor: AppColor.neutral90,
date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest.startDate ?? ""),
date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest?.startDate ?? ""),
formatDateWithTime: true,
onDatePicker: (selectedDate) {
if (selectedDate != null) {
@ -286,15 +285,15 @@ class ServiceRequestBottomSheet {
selectedTime.minute,
);
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;
return;
}
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,
alignLabelWithHint: true,
onChange: (text) {
serviceRequestProvider.currentSelectedRequest.comments = text;
serviceRequestProvider.currentSelectedRequest?.comments = text;
},
onSaved: (text) {
serviceRequestProvider.currentSelectedRequest.comments = text;
serviceRequestProvider.currentSelectedRequest?.comments = text;
},
),
16.height,
@ -466,7 +465,7 @@ class ServiceRequestBottomSheet {
8.height,
ADatePicker(
label: context.translation.visitDate,
date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest.visitDate ?? ""),
date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest?.visitDate ?? ""),
formatDateWithTime: true,
onDatePicker: (selectedDate) {
if (selectedDate != null) {
@ -476,19 +475,13 @@ class ServiceRequestBottomSheet {
).then((selectedTime) {
// Handle the selected date and time here.
if (selectedTime != null) {
DateTime selectedDateTime = DateTime(
selectedDate.year,
selectedDate.month,
selectedDate.day,
selectedTime.hour,
selectedTime.minute,
);
DateTime selectedDateTime = DateTime(selectedDate.year, selectedDate.month, selectedDate.day, selectedTime.hour, selectedTime.minute);
if (selectedDateTime != 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;
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,
Row(
children: [
ADatePicker(
label: context.translation.startDate,
date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest.startDate ?? ""),
date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest?.startDate ?? ""),
formatDateWithTime: true,
onDatePicker: (selectedDate) {
if (selectedDate != null) {
@ -521,7 +514,7 @@ class ServiceRequestBottomSheet {
selectedTime.minute,
);
if (selectedDateTime != null) {
serviceRequestProvider.currentSelectedRequest.startDate = selectedDateTime?.toIso8601String();
serviceRequestProvider.currentSelectedRequest?.startDate = selectedDateTime?.toIso8601String();
}
}
});
@ -531,7 +524,7 @@ class ServiceRequestBottomSheet {
8.width,
ADatePicker(
label: context.translation.endDate,
date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest.endDate ?? ""),
date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest?.endDate ?? ""),
formatDateWithTime: true,
onDatePicker: (selectedDate) {
if (selectedDate != null) {
@ -541,17 +534,11 @@ class ServiceRequestBottomSheet {
).then((selectedTime) {
// Handle the selected date and time here.
if (selectedTime != null) {
DateTime selectedDateTime = DateTime(
selectedDate.year,
selectedDate.month,
selectedDate.day,
selectedTime.hour,
selectedTime.minute,
);
DateTime selectedDateTime = DateTime(selectedDate.year, selectedDate.month, selectedDate.day, selectedTime.hour, selectedTime.minute);
if (selectedDateTime != null) {
serviceRequestProvider.currentSelectedRequest.endDate = selectedDateTime?.toIso8601String();
serviceRequestProvider.currentSelectedRequest.workingHours = (((DateTime.parse(serviceRequestProvider.currentSelectedRequest.endDate)
.difference(DateTime.parse(serviceRequestProvider.currentSelectedRequest.startDate))
serviceRequestProvider.currentSelectedRequest?.endDate = selectedDateTime?.toIso8601String();
serviceRequestProvider.currentSelectedRequest?.workingHours = (((DateTime.parse(serviceRequestProvider.currentSelectedRequest!.endDate!)
.difference(DateTime.parse(serviceRequestProvider.currentSelectedRequest!.startDate!))
.inSeconds ??
0) /
60) /
@ -572,10 +559,10 @@ class ServiceRequestBottomSheet {
textInputType: TextInputType.multiline,
alignLabelWithHint: true,
onChange: (text) {
serviceRequestProvider.currentSelectedRequest.comments = text;
serviceRequestProvider.currentSelectedRequest?.comments = text;
},
onSaved: (text) {
serviceRequestProvider.currentSelectedRequest.comments = text;
serviceRequestProvider.currentSelectedRequest?.comments = text;
},
),
16.height,
@ -584,7 +571,7 @@ class ServiceRequestBottomSheet {
label: context.translation.save,
loading: snapshot.isLoading ?? false,
onPressed: () async {
_formKey.currentState.save();
_formKey.currentState!.save();
// await snapshot.updateRequest(user: userProvider.user, request: serviceRequestProvider.serviceRequest);
// Navigator.pop(context, true);
@ -635,11 +622,11 @@ class ServiceRequestBottomSheet {
SingleItemDropDownMenu<Lookup, FirstActionStatusProvider>(
context: context,
title: context.translation.rejectionReason,
initialValue: serviceRequestProvider.currentSelectedRequest.firstAction, //_serviceRequest.firstAction,
initialValue: serviceRequestProvider.currentSelectedRequest?.firstAction, //_serviceRequest.firstAction,
onSelect: (value) {
serviceRequestProvider.currentSelectedRequest.firstAction = value;
if (serviceRequestProvider.currentSelectedRequest.firstAction.value != 2) {
serviceRequestProvider.currentSelectedRequest.visitDate = null;
serviceRequestProvider.currentSelectedRequest?.firstAction = value;
if (serviceRequestProvider.currentSelectedRequest?.firstAction!.value != 2) {
serviceRequestProvider.currentSelectedRequest?.visitDate = null;
}
},
),
@ -649,10 +636,10 @@ class ServiceRequestBottomSheet {
textInputType: TextInputType.multiline,
alignLabelWithHint: true,
onChange: (text) {
serviceRequestProvider.currentSelectedRequest.comments = text;
serviceRequestProvider.currentSelectedRequest?.comments = text;
},
onSaved: (text) {
serviceRequestProvider.currentSelectedRequest.comments = text;
serviceRequestProvider.currentSelectedRequest?.comments = text;
},
),
16.height,
@ -665,9 +652,9 @@ class ServiceRequestBottomSheet {
showBorder: true,
loading: snapshot.isLoading ?? false,
onPressed: () async {
_formKey.currentState.save();
_formKey.currentState!.save();
// 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);
},
),
@ -776,12 +763,12 @@ class ServiceRequestBottomSheet {
itemBuilder: (context, index) {
final item = items[index];
return listItem(
icon: item['icon'],
heading: item['heading'],
subHeading: item['subHeading'],
icon: item['icon']!,
heading: item['heading']!,
subHeading: item['subHeading']!,
context: context,
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 userProvider = Provider.of<UserProvider>(context, listen: false);
return showModalBottomSheet(
@ -827,11 +814,11 @@ class ServiceRequestBottomSheet {
SizedBox(
width: 200.toScreenHeight,
child: AppFilledButton(
label: button1Text ?? context.translation.no,
label: noButtonText ?? context.translation.no,
loading: false,
buttonColor: AppColor.neutral40,
textColor: AppColor.black10,
onPressed: button1Tap ??
onPressed: onNoPressed ??
() async {
Navigator.pop(context);
// await snapshot.updateRequest(user: userProvider.user, request: serviceRequestProvider.serviceRequest);
@ -845,7 +832,7 @@ class ServiceRequestBottomSheet {
label: context.translation.yes,
buttonColor: AppColor.primary10,
loading: false,
onPressed: button2Tap,
onPressed: onYesPressed,
),
),
],

@ -84,7 +84,7 @@ class _RequestDetailViewState extends State<RequestDetailView> {
children: [
SingleChildScrollView(
padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth),
child: informationCard(serviceRequestsProvider.currentSelectedRequest, userProvider),
child: informationCard(serviceRequestsProvider.currentSelectedRequest!, userProvider),
).expanded,
Center(
child: InkWell(
@ -92,7 +92,7 @@ class _RequestDetailViewState extends State<RequestDetailView> {
try {
//use a common list
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) {
getServiceRequest(requestId: allRequestProvider.requestDetailList!.requestsDetails![index + 1].id.toString());
}
@ -108,7 +108,7 @@ class _RequestDetailViewState extends State<RequestDetailView> {
),
20.height,
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
? Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
@ -182,7 +182,7 @@ class _RequestDetailViewState extends State<RequestDetailView> {
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => WorkOrderListPage(serviceRequest: serviceRequestsProvider.currentSelectedRequest)),
MaterialPageRoute(builder: (context) => WorkOrderListPage(serviceRequest: serviceRequestsProvider.currentSelectedRequest!)),
);
// 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);
Provider.of<ServiceReportLastCallsProvider>(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;
}
@ -88,12 +88,12 @@ class _SparePartRequestState extends State<SparePartRequest> with TickerProvider
_isLoading = true;
setState(() {});
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();
_serviceReport.assignedEmployee = _serviceReport.callRequest?.assignedEmployee;
_serviceReport.equipmentStatus = _serviceReport.callRequest?.defectType;
_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;
setState(() {});
}

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

@ -22,7 +22,7 @@ import '../../widgets/equipment/commissioning_status_buttons.dart';
class AssetFilterScreen extends StatefulWidget {
static const String id = "asset_filter_screen";
final AssetSearch data;
final AssetSearch? data;
const AssetFilterScreen({Key? key, this.data}) : super(key: key);
@ -31,11 +31,11 @@ class AssetFilterScreen extends StatefulWidget {
}
class _AssetFilterScreenState extends State<AssetFilterScreen> {
AssetSearch filter;
Lookup _commissioningStatus;
Site _site;
Department _department;
String startDate, endDate;
late AssetSearch filter;
Lookup? _commissioningStatus;
Site? _site;
Department? _department;
String? startDate, endDate;
bool loading = false;
@override
@ -44,14 +44,14 @@ class _AssetFilterScreenState extends State<AssetFilterScreen> {
WidgetsFlutterBinding.ensureInitialized().addPostFrameCallback((timeStamp) async {
loading = true;
setState(() {});
startDate = filter.supplyDateFrom;
endDate = filter.supplyDateTo;
startDate = filter!.supplyDateFrom;
endDate = filter!.supplyDateTo;
final departmentProvider = Provider.of<DepartmentProvider>(context, listen: false);
final siteProvider = Provider.of<SiteProvider>(context, listen: false);
if (departmentProvider?.items?.isEmpty ?? true) await departmentProvider.getDate();
if (siteProvider?.items?.isEmpty ?? true) await siteProvider.getDate();
_department = departmentProvider.items?.firstWhere((element) => element.name == filter?.department, orElse: () => null);
_site = siteProvider.items?.firstWhere((element) => element.name == filter?.site, orElse: () => null);
_department = departmentProvider.items?.firstWhere((element) => element.name == filter?.department, orElse: null);
_site = siteProvider.items?.firstWhere((element) => element.name == filter?.site, orElse: null);
loading = false;
setState(() {});
});
@ -93,10 +93,9 @@ class _AssetFilterScreenState extends State<AssetFilterScreen> {
CommissioningStatusButtons(
initialValue: _commissioningStatus,
onSelect: (value) {
if (value == null) {
/// the selected value is [All Assets]
if (value != null) {
_commissioningStatus = value;
}
_commissioningStatus = value;
},
),
16.height,

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

@ -20,15 +20,15 @@ import '../../widgets/requests/request_status.dart';
class DeviceTransferDetails extends StatefulWidget {
final AssetTransfer model;
const DeviceTransferDetails({Key? key, this.model}) : super(key: key);
const DeviceTransferDetails({Key? key, required this.model}) : super(key: key);
@override
State<DeviceTransferDetails> createState() => _DeviceTransferDetailsState();
}
class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
UserProvider _userProvider;
AssetTransfer _model;
UserProvider? _userProvider;
AssetTransfer? _model;
bool _isLoading = false;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
@ -46,12 +46,12 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
key: _scaffoldKey,
body: SafeArea(
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) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const ALoading();
} else {
_model = snapshot.data;
_model = snapshot.data as AssetTransfer?;
return Form(
key: _formKey,
@ -83,7 +83,7 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
8.height,
const Divider().defaultStyle(context),
8.height,
_buildTextWidget(_model?.comment),
_buildTextWidget(_model!.comment!),
]
],
),
@ -110,7 +110,7 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
// ),
1.width,
Text(
_model?.createdOn != null ? _model.createdOn.toServiceRequestCardFormat : "",
_model?.createdOn != null ? _model!.createdOn!.toServiceRequestCardFormat : "",
textAlign: TextAlign.end,
style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
),
@ -131,10 +131,10 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
/// TBD
statusLabel: _model?.senderMachineStatusName != null
? StatusLabel(
label: _model?.senderMachineStatusName,
id: _model?.senderMachineStatusId,
textColor: AppColor.getRequestStatusTextColorByName(context, _model.senderMachineStatusName),
backgroundColor: AppColor.getRequestStatusColorByName(context, _model.senderMachineStatusName),
label: _model!.senderMachineStatusName!,
id: _model!.senderMachineStatusId!.toInt(),
textColor: AppColor.getRequestStatusTextColorByName(context, _model!.senderMachineStatusName!),
backgroundColor: AppColor.getRequestStatusColorByName(context, _model!.senderMachineStatusName!),
)
: null,
),
@ -151,10 +151,10 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
/// TBD
statusLabel: _model?.receiverMachineStatusName != null
? StatusLabel(
label: _model?.receiverMachineStatusName ?? "",
id: _model?.receiverMachineStatusId,
textColor: AppColor.getRequestStatusTextColorByName(context, _model.receiverMachineStatusName),
backgroundColor: AppColor.getRequestStatusColorByName(context, _model.receiverMachineStatusName))
label: _model!.receiverMachineStatusName ?? "",
id: _model!.receiverMachineStatusId!.toInt(),
textColor: AppColor.getRequestStatusTextColorByName(context, _model!.receiverMachineStatusName!),
backgroundColor: AppColor.getRequestStatusColorByName(context, _model!.receiverMachineStatusName!))
: null,
),
],
@ -176,13 +176,11 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
return text.bodyText(context);
}
_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 isCurrentRequestClosed = isSender
? ((_model?.senderMachineStatusName?.toLowerCase()?.contains("close") ?? false))
: ((_model?.receiverMachineStatusName?.toLowerCase()?.contains("close") ?? false));
_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 isCurrentRequestClosed =
isSender ? ((_model?.senderMachineStatusName?.toLowerCase().contains("close") ?? false)) : ((_model?.receiverMachineStatusName?.toLowerCase().contains("close") ?? false));
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
@ -198,7 +196,7 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
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 (isSender
@ -207,7 +205,7 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
//
"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) {
setState(() {});
}

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

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

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

@ -1,5 +1,4 @@
import 'dart:convert';
import 'dart:developer';
import 'dart:io';
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/widgets/images/multi_image_picker.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 '../../../models/lookup.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/default_app_bar.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/timer/app_timer.dart';
@ -38,7 +34,7 @@ class UpdateDeviceTransfer extends StatefulWidget {
final AssetTransfer model;
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
State<UpdateDeviceTransfer> createState() => _UpdateDeviceTransferState();
@ -47,10 +43,10 @@ class UpdateDeviceTransfer extends StatefulWidget {
class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
bool _isLoading = false;
bool _validate = false;
UserProvider _userProvider;
SettingProvider _settingProvider;
Uint8List _signature;
AssetTransferProvider _deviceTransferProvider;
late UserProvider _userProvider;
late SettingProvider _settingProvider;
Uint8List? _signature;
late AssetTransferProvider _deviceTransferProvider;
final TextEditingController _requestedQuantityController = TextEditingController();
final AssetTransfer _formModel = AssetTransfer();
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
@ -60,7 +56,7 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
_update() async {
if (widget.isSender) {
_formModel.senderVisitTimers.add(
_formModel.senderVisitTimers?.add(
VisitTimers(
id: 0,
startDateTime: _formModel.tbsTimer?.startAt?.toIso8601String(),
@ -69,7 +65,7 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
),
);
} else {
_formModel.receiverVisitTimers.add(
_formModel.receiverVisitTimers?.add(
VisitTimers(
id: 0,
startDateTime: _formModel.tbsTimer?.startAt?.toIso8601String(),
@ -88,11 +84,11 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
return false;
}
_validate = true;
if (!(_formKey.currentState.validate())) {
if (!(_formKey.currentState!.validate())) {
setState(() {});
return false;
}
_formKey.currentState.save();
_formKey.currentState!.save();
if (widget.isSender) {
_formModel.senderAttachments = [];
@ -109,9 +105,9 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
}
if (widget.isSender) {
_formModel.senderAttachments.add(AssetTransferAttachment(id: 0, attachmentName: attachmentName));
_formModel.senderAttachments!.add(AssetTransferAttachment(id: 0, attachmentName: attachmentName));
} else {
_formModel.receiverAttachments.add(AssetTransferAttachment(id: 0, attachmentName: attachmentName));
_formModel.receiverAttachments!.add(AssetTransferAttachment(id: 0, attachmentName: attachmentName));
}
}
} catch (error) {
@ -125,9 +121,9 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
_formModel.fromDetails(widget.model);
if (widget.isSender) {
_files = widget.model?.senderAttachments?.map((e) => File(e.attachmentName))?.toList();
_files = widget.model.senderAttachments?.map((e) => File(e.attachmentName!)).toList() ?? [];
} else {
_files = widget.model?.receiverAttachments?.map((e) => File(e.attachmentName))?.toList();
_files = widget.model.receiverAttachments?.map((e) => File(e.attachmentName!)).toList() ?? [];
}
super.initState();
@ -148,12 +144,12 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
_deviceTransferProvider = Provider.of<AssetTransferProvider>(context, listen: false);
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.receiverVisitTimers.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 ?? 0) + DateTime.parse(item.endDateTime!).difference(DateTime.parse(item.startDateTime!)).inSeconds) ?? 0);
bool isTimerEnable = widget.isSender
? (!(_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.senderMachineStatusName?.toLowerCase().contains("close") ?? false) || !(_formModel.senderMachineStatusName?.toLowerCase()?.contains("complete") ?? false))
: (!(_formModel.receiverMachineStatusName?.toLowerCase().contains("close") ?? false) || !(_formModel.receiverMachineStatusName?.toLowerCase()?.contains("complete") ?? false));
return Scaffold(
appBar: DefaultAppBar(title: context.translation.updateRequest),
@ -176,7 +172,7 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
_buildCard(),
8.height,
AppTextFormField(
initialValue: widget.isSender ? _formModel.senderTravelingHours : _formModel.receiverTravelingHours,
initialValue: widget.isSender ? _formModel.senderTravelingHours ?? "" : _formModel.receiverTravelingHours ?? "",
labelText: context.translation.travelingHours,
onChange: (text) {
widget.isSender ? _formModel.senderTravelingHours = text : _formModel.receiverTravelingHours = text;
@ -235,20 +231,20 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
return SingleItemDropDownMenu<Lookup, AssetTransferStatusProvider>(
context: context,
title: widget.isSender ? "Status Sender" : "Status Receiver", //,context.translation.reportStatus,
initialValue: snapshot.items
?.firstWhere((element) => element.name == (widget.isSender ? _formModel.senderMachineStatusName : _formModel.receiverMachineStatusName), orElse: () => null),
initialValue:
snapshot.items.firstWhere((element) => element.name == (widget.isSender ? _formModel.senderMachineStatusName : _formModel.receiverMachineStatusName), orElse: null),
onSelect: (value) {
if (value.value == 4) {
"Status cannot be change to ${value.name}.".addTranslation.showToast;
if (value?.value == 4) {
"Status cannot be change to ${value?.name}.".addTranslation.showToast;
setState(() {});
return;
}
if (widget.isSender) {
_formModel.senderMachineStatusName = value.name;
_formModel.senderMachineStatusId = value.id;
_formModel.senderMachineStatusName = value?.name;
_formModel.senderMachineStatusId = value?.id;
} else {
_formModel.receiverMachineStatusName = value.name;
_formModel.receiverMachineStatusId = value.id;
_formModel.receiverMachineStatusName = value?.name;
_formModel.receiverMachineStatusId = value?.id;
}
setState(() {});
},
@ -258,7 +254,7 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
MultiFilesPicker(label: context.translation.attachImage, files: _files),
8.height,
AppTextFormField(
initialValue: widget.isSender ? _formModel.senderComment : _formModel.receiverComment,
initialValue: widget.isSender ? _formModel.senderComment ?? "" : _formModel.receiverComment ?? "",
labelText: context.translation.comments,
textInputType: TextInputType.multiline,
alignLabelWithHint: true,
@ -303,8 +299,8 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
children: [
context.translation.transferDetails.heading5(context),
8.height,
'${context.translation.assetName}: ${_formModel.assetName.cleanupWhitespace.capitalizeFirstOfEach}'.bodyText(context),
'${context.translation.requesterName}: ${_formModel?.receiverEndUserName?.cleanupWhitespace?.capitalizeFirstOfEach ?? ""}'.bodyText(context),
'${context.translation.assetName}: ${_formModel.assetName?.cleanupWhitespace.capitalizeFirstOfEach}'.bodyText(context),
'${context.translation.requesterName}: ${_formModel.receiverEndUserName?.cleanupWhitespace?.capitalizeFirstOfEach ?? ""}'.bodyText(context),
],
).toShadowContainer(context);
}

@ -1,5 +1,4 @@
import 'dart:convert';
import 'dart:developer';
import 'dart:io';
import 'package:flutter/material.dart';
@ -57,7 +56,7 @@ import '../user/requests/work_order/part_no_button.dart';
class CreateSubWorkOrderPage extends StatefulWidget {
static const id = "/CreateSubWorkOrder";
final SearchWorkOrder workOrder;
final SearchWorkOrder? workOrder;
const CreateSubWorkOrderPage({this.workOrder, Key? key}) : super(key: key);
@ -67,15 +66,15 @@ class CreateSubWorkOrderPage extends StatefulWidget {
class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
SearchWorkOrder _subWorkOrders;
ServiceReport _serviceReport;
PartsProvider _partsProvider;
late SearchWorkOrder _subWorkOrders;
late ServiceReport _serviceReport;
late PartsProvider _partsProvider;
final List<File> _files = [];
List<SparePart> _spareParts = [];
bool _isLoading = false;
bool _showVendorFields = false;
SuppEngineerWorkOrders engineer;
SupplierDetails initialSupplier;
SuppEngineerWorkOrders? engineer;
SupplierDetails? initialSupplier;
final TextEditingController _workPreformedController = TextEditingController();
final TextEditingController _partQtyController = TextEditingController();
@ -86,41 +85,43 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
callRequest: CallRequest(id: widget?.workOrder?.callRequest?.id),
currentSituation: 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;
super.initState();
if (context.mounted) {
Provider.of<ServiceReportAssistantsEmployeeProvider>(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;
CallRequest _callRequestForWorkOrder;
late ServiceStatusProvider assetTypesProvider;
CallRequest? _callRequestForWorkOrder;
Future getAssetType() async {
Provider.of<ServiceReportLastCallsProvider>(context, listen: false).reset();
final serviceRequestProvider = Provider.of<ServiceRequestsProvider>(context);
Provider.of<ServiceRequestFaultDescriptionProvider>(context, listen: false).reset();
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) {
final subWoDetails = await serviceRequestProvider.getSubWorkOrderDetails(parentId: _subWorkOrders?.parentWOId.toString());
_subWorkOrders.copyDetails(subWoDetails);
_serviceReport.equipmentStatus = subWoDetails.equipmentStatus;
_serviceReport.reason = subWoDetails.reason;
initialSupplier = subWoDetails.supplier;
_serviceReport.faultDescription = subWoDetails.faultDescription;
_subWorkOrders.visitDate = subWoDetails.visitDate;
_subWorkOrders.sparePartsWorkOrders = subWoDetails.sparePartsWorkOrders;
ServiceReport? subWoDetails = await serviceRequestProvider.getSubWorkOrderDetails(parentId: _subWorkOrders.parentWOId.toString());
if (subWoDetails != null) {
_subWorkOrders.copyDetails(subWoDetails);
_serviceReport.equipmentStatus = subWoDetails.equipmentStatus;
_serviceReport.reason = subWoDetails.reason;
initialSupplier = subWoDetails.supplier;
_serviceReport.faultDescription = subWoDetails.faultDescription;
_subWorkOrders.visitDate = subWoDetails.visitDate;
_subWorkOrders.sparePartsWorkOrders = subWoDetails.sparePartsWorkOrders;
}
}
await assetTypesProvider.getTypes();
_subWorkOrders?.assetType = assetTypesProvider.statuses?.firstWhere(
(element) => element.value == _callRequestForWorkOrder?.assetType,
orElse: () => null,
orElse: null,
);
if (checkVendorFieldsVisibility(_subWorkOrders.calllastSituation)) {
if (_subWorkOrders.suppEngineerWorkOrders?.isNotEmpty ?? false) {
@ -135,7 +136,7 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
});
}
Asset loanAvailabilityAsset;
Asset? loanAvailabilityAsset;
@override
void dispose() {
@ -146,8 +147,8 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
@override
Widget build(BuildContext context) {
final user = Provider.of<UserProvider>(context).user;
final isCurrentUserIsAssistantEmp = (user.userID != widget.workOrder.assignedEmployee?.id);
final user = Provider.of<UserProvider>(context).user!;
final isCurrentUserIsAssistantEmp = (user.userID != widget.workOrder?.assignedEmployee?.id);
if (isCurrentUserIsAssistantEmp) {
// _subWorkOrders.assistantEmployees = [widget.workOrder.assistantEmployees?.first?.copyWith(id: 0)];
_subWorkOrders.assistantEmployees = [AssistantEmployees(id: 0, user: AssignedEmployee(id: user.userID, name: user.username))];
@ -190,32 +191,28 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
date: DateTime.tryParse(_subWorkOrders.visitDate ?? ""),
formatDateWithTime: true,
onDatePicker: (selectedDate) {
if (selectedDate != null) {
showTimePicker(
context: context,
initialTime: TimeOfDay.now(),
).then((selectedTime) {
if (selectedTime != null) {
DateTime selectedDateTime = DateTime(
selectedDate.year,
selectedDate.month,
selectedDate.day,
selectedTime.hour,
selectedTime.minute,
);
if (selectedDateTime != null) {
if (_subWorkOrders.visitDate != null && selectedDateTime.isBefore(DateTime.parse(_subWorkOrders.visitDate))) {
"Visit Date time must be greater then previous date".showToast;
return;
}
setState(() {
_subWorkOrders.visitDate = selectedDateTime?.toIso8601String();
});
}
showTimePicker(
context: context,
initialTime: TimeOfDay.now(),
).then((selectedTime) {
if (selectedTime != null) {
DateTime selectedDateTime = DateTime(
selectedDate.year,
selectedDate.month,
selectedDate.day,
selectedTime.hour,
selectedTime.minute,
);
if (_subWorkOrders.visitDate != null && selectedDateTime.isBefore(DateTime.parse(_subWorkOrders.visitDate!))) {
"Visit Date time must be greater then previous date".showToast;
return;
}
});
}
setState(() {
_subWorkOrders.visitDate = selectedDateTime?.toIso8601String();
});
}
});
},
),
8.height,
@ -229,7 +226,7 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
if (timer?.durationInSecond != 0) {
_subWorkOrders.workingHours = num.tryParse((((timer?.durationInSecond ?? 0) / 60) / 60)?.toStringAsFixed(2) ?? "0");
} 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);
_subWorkOrders.workingHours = num.tryParse(workingHours ?? "0");
}
@ -246,8 +243,8 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
assetTypesProvider.reset();
await assetTypesProvider.getTypes();
_subWorkOrders?.assetType = assetTypesProvider.statuses?.firstWhere(
(element) => element.value == _serviceReport.callRequest.assetType,
orElse: () => null,
(element) => element.value == _serviceReport.callRequest?.assetType,
orElse: null,
);
},
child: AppTextFormField(
@ -321,7 +318,7 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
onSelect: (supplier) {
if (supplier != null) {
_subWorkOrders.supplier = supplier;
log(_subWorkOrders.supplier?.suppPersons?.map((e) => e.personName)?.toString());
// log(_subWorkOrders.supplier?.suppPersons?.map((e) => e.personName)?.toString());
setState(() {});
}
},
@ -336,7 +333,7 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
enabled: _subWorkOrders?.supplier?.suppPersons?.isNotEmpty ?? false,
staticData: _subWorkOrders?.supplier?.suppPersons,
showAsBottomSheet: true,
initialValue: engineer == null ? null : SuppPersons.fromJson(engineer.toJson()),
initialValue: engineer == null ? null : SuppPersons.fromJson(engineer!.toJson()),
onSelect: (suppPerson) {
print(suppPerson?.toJson());
if (suppPerson != null) {
@ -374,7 +371,7 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
useSafeArea: true,
isScrollControlled: true,
backgroundColor: Colors.transparent,
builder: (context) => AddSupplierEngineerBottomSheet(_subWorkOrders.supplier.id),
builder: (context) => AddSupplierEngineerBottomSheet(_subWorkOrders.supplier!.id!.toInt()),
)) as SuppEngineerWorkOrders;
if (suppEngineer != null) {
_subWorkOrders?.supplier?.suppPersons ??= [];
@ -391,7 +388,7 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
initialValue: _subWorkOrders.faultDescription,
onSelect: (status) {
_subWorkOrders.faultDescription = status;
_workPreformedController?.text = _subWorkOrders.faultDescription?.workPerformed;
_workPreformedController?.text = _subWorkOrders.faultDescription?.workPerformed ?? "";
},
),
8.height,
@ -411,7 +408,7 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
if (status != null) {
setState(() {
_subWorkOrders.loanAvailablity = status;
if (_subWorkOrders.loanAvailablity.value != 1) {
if (_subWorkOrders.loanAvailablity?.value != 1) {
loanAvailabilityAsset = null;
_subWorkOrders.assetLoan = null;
}
@ -432,11 +429,10 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
}
},
),
8.height,
ServiceReportAssistantEmployeeMenu(
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: !isCurrentAssigned
@ -449,7 +445,7 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
if (employee == null) {
_subWorkOrders.assistantEmployees = [];
} else {
_subWorkOrders.assistantEmployees = [employee?.copyWith(id: 0)];
_subWorkOrders.assistantEmployees = [employee.copyWith(id: 0)];
}
},
),
@ -552,13 +548,13 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
setState(() {});
_subWorkOrders.suppEngineerWorkOrders = [];
if (engineer != null) {
_subWorkOrders.suppEngineerWorkOrders.add(engineer);
_subWorkOrders.suppEngineerWorkOrders!.add(engineer!);
}
// return;
if (await validate()) {
_subWorkOrders.attachmentsWorkOrder ??= [];
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) {}
_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) ||
(callsLastSituation?.name?.toLowerCase()?.contains("under repair-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) {
Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.supplierEngineer}");
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}");
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}");
return false;
} 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/no_item_found.dart';
import '../../../../models/gas_refill_comments_model.dart';
import '../../../../new_views/app_style/app_color.dart';
import '../../../widgets/loaders/loading_manager.dart';
@ -28,8 +27,8 @@ class GasRefillCommentsBottomSheet extends StatefulWidget {
class _GasRefillCommentsBottomSheetState extends State<GasRefillCommentsBottomSheet> {
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
GasRefillCommentsProvider commentsProvider;
String text;
late GasRefillCommentsProvider commentsProvider;
String? text;
@override
void initState() {
@ -44,7 +43,7 @@ class _GasRefillCommentsBottomSheetState extends State<GasRefillCommentsBottomSh
@override
Widget build(BuildContext context) {
commentsProvider= Provider.of<GasRefillCommentsProvider>(context);
commentsProvider = Provider.of<GasRefillCommentsProvider>(context);
final userProvider = Provider.of<UserProvider>(context, listen: false);
return Container(
height: MediaQuery.of(context).size.height * 0.6,
@ -102,7 +101,7 @@ class _GasRefillCommentsBottomSheetState extends State<GasRefillCommentsBottomSh
//8.height,
Align(
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)),
),
],
@ -111,8 +110,8 @@ class _GasRefillCommentsBottomSheetState extends State<GasRefillCommentsBottomSh
),
),
).expanded,
if (userProvider.user.type == UsersTypes.normal_user) 8.height,
if (userProvider.user.type == UsersTypes.normal_user)
if (userProvider.user!.type == UsersTypes.normal_user) 8.height,
if (userProvider.user!.type == UsersTypes.normal_user)
AppTextFormField(
labelText: "Type any comment",
backgroundColor: AppColor.neutral30,
@ -121,10 +120,10 @@ class _GasRefillCommentsBottomSheetState extends State<GasRefillCommentsBottomSh
validator: (value) => Validator.hasValue(value) ? null : context.translation.requiredField,
textInputType: TextInputType.multiline,
suffixIcon: "comment_send".toSvgAsset().paddingOnly(end: 16).onPress(() {
if (_formKey.currentState.validate()) {
_formKey.currentState.save();
if (_formKey.currentState!.validate()) {
_formKey.currentState!.save();
// 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) {

@ -21,9 +21,9 @@ import 'gas_refill_comments.dart';
class GasRefillDetailsPage extends StatefulWidget {
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
State<GasRefillDetailsPage> createState() => _GasRefillDetailsPageState();
@ -31,7 +31,7 @@ class GasRefillDetailsPage extends StatefulWidget {
class _GasRefillDetailsPageState extends State<GasRefillDetailsPage> {
GasRefillModel _model = GasRefillModel(gazRefillDetails: []);
UserProvider _userProvider;
late UserProvider _userProvider;
bool _isLoading = false;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
@ -54,12 +54,12 @@ class _GasRefillDetailsPageState extends State<GasRefillDetailsPage> {
key: _scaffoldKey,
body: SafeArea(
child: FutureBuilder(
future: _gasRefillProvider.getGasRefillObjectById(widget.model.id),
future: _gasRefillProvider.getGasRefillObjectById(widget.model.id!),
builder: (context, snap) {
if (snap.connectionState == ConnectionState.waiting) {
return const ALoading();
} else if (snap.hasData) {
_model = snap.data;
_model = snap.data as GasRefillModel;
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
@ -93,8 +93,8 @@ class _GasRefillDetailsPageState extends State<GasRefillDetailsPage> {
if (widget.priority != null)
StatusLabel(
label: widget.priority,
textColor: AppColor.getRequestStatusTextColorByName(context, widget.priority),
backgroundColor: AppColor.getRequestStatusColorByName(context, widget.priority),
textColor: AppColor.getRequestStatusTextColorByName(context, widget.priority!),
backgroundColor: AppColor.getRequestStatusColorByName(context, widget.priority!),
),
8.width,
StatusLabel(
@ -107,19 +107,19 @@ class _GasRefillDetailsPageState extends State<GasRefillDetailsPage> {
8.height,
context.translation.gasRefillRequest.heading5(context),
8.height,
'${context.translation.gasRequest}: ${gasRefillModel.gazRefillDetails[0].gasType?.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.gasRequest}: ${gasRefillModel.gazRefillDetails![0].gasType?.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.site}: ${gasRefillModel.site?.name?.cleanupWhitespace?.capitalizeFirstOfEach}'.bodyText(context),
'${context.translation.department}: ${gasRefillModel.department?.name?.cleanupWhitespace?.capitalizeFirstOfEach}'.bodyText(context),
'${context.translation.requestNo}: ${gasRefillModel.gazRefillNo}'.bodyText(context),
const Divider().defaultStyle(context),
'${context.translation.requestedQuantity}: ${gasRefillModel.gazRefillDetails[0]?.requestedQty ?? 0}'.bodyText(context),
'${context.translation.deliveredQuantity}: ${gasRefillModel.gazRefillDetails[0]?.deliverdQty ?? 0}'.bodyText(context),
'${context.translation.requestedQuantity}: ${gasRefillModel.gazRefillDetails![0]?.requestedQty ?? 0}'.bodyText(context),
'${context.translation.deliveredQuantity}: ${gasRefillModel.gazRefillDetails![0]?.deliverdQty ?? 0}'.bodyText(context),
8.height,
if (gasRefillModel.comment?.isNotEmpty ?? false) ...[
const Divider().defaultStyle(context),
gasRefillModel.comment.bodyText(context),
gasRefillModel.comment!.bodyText(context),
8.height,
]
],
@ -127,7 +127,7 @@ class _GasRefillDetailsPageState extends State<GasRefillDetailsPage> {
Column(
crossAxisAlignment: CrossAxisAlignment.end,
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(
() async {
_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(
(widget.date ?? gasRefillModel.expectedDate)?.toServiceRequestCardFormat ?? "",
textAlign: TextAlign.end,
@ -157,7 +157,7 @@ class _GasRefillDetailsPageState extends State<GasRefillDetailsPage> {
).paddingOnly(top: 16, start: 16, end: 16),
/// TBD
(_userProvider.user.type == UsersTypes.normal_user
(_userProvider.user!.type == UsersTypes.normal_user
? Container(
height: 50,
padding: const EdgeInsets.only(left: 16, right: 16),
@ -194,7 +194,7 @@ class _GasRefillDetailsPageState extends State<GasRefillDetailsPage> {
mainAxisSize: MainAxisSize.min,
children: [
Text(
'${context.translation.viewComments}',
context.translation.viewComments,
style: AppTextStyles.bodyText.copyWith(color: AppColor.blueStatus(context)),
),
4.width,

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

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

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

@ -23,7 +23,7 @@ class PpmDetailsPage extends StatefulWidget {
static const String id = "/visit-details";
final RequestsDetails request;
PpmDetailsPage({Key? key, this.request}) : super(key: key);
PpmDetailsPage({Key? key, required this.request}) : super(key: key);
@override
_PpmDetailsPageState createState() {
@ -32,9 +32,9 @@ class PpmDetailsPage extends StatefulWidget {
}
class _PpmDetailsPageState extends State<PpmDetailsPage> {
UserProvider userProvider;
UserProvider? userProvider;
PpmProvider ppmProvider;
PpmProvider? ppmProvider;
@override
void initState() {
@ -55,12 +55,12 @@ class _PpmDetailsPageState extends State<PpmDetailsPage> {
appBar: DefaultAppBar(title: context.translation.preventiveMaintenance),
body: SafeArea(
child: FutureBuilder(
future: ppmProvider.getPpmById(widget.request.id),
future: ppmProvider!.getPpmById(widget.request.id!),
builder: (context, snap) {
if (snap.connectionState == ConnectionState.waiting) {
return const ALoading();
} else if (snap.hasData) {
Ppm ppm = snap.data;
Ppm ppm = snap.data as Ppm;
return Column(children: [
SingleChildScrollView(
@ -72,21 +72,21 @@ class _PpmDetailsPageState extends State<PpmDetailsPage> {
if (widget.request.priority != null)
StatusLabel(
label: widget.request.priority,
textColor: AppColor.getRequestStatusTextColorByName(context, widget.request.priority),
backgroundColor: AppColor.getRequestStatusColorByName(context, widget.request.priority),
textColor: AppColor.getRequestStatusTextColorByName(context, widget.request.priority!),
backgroundColor: AppColor.getRequestStatusColorByName(context, widget.request.priority!),
),
if (widget.request.priority != null) 8.width,
StatusLabel(
label: ppm.visitStatusName,
id: ppm.deviceStatusId,
textColor: AppColor.getRequestStatusTextColorByName(context, ppm.visitStatusName),
backgroundColor: AppColor.getRequestStatusColorByName(context, ppm.visitStatusName),
id: ppm.deviceStatusId!.toInt(),
textColor: AppColor.getRequestStatusTextColorByName(context, ppm.visitStatusName!),
backgroundColor: AppColor.getRequestStatusColorByName(context, ppm.visitStatusName!),
),
1.width.expanded,
],
),
8.height,
ppm.assetName.heading5(context),
ppm.assetName!.heading5(context),
8.height,
'${context.translation.assetNumber}: ${ppm.assetNumber}'.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.floor}: ${ppm.floorName?.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),
).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(
onPressed: () async {
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 {
PpmProvider _visitsProvider;
UserProvider _userProvider;
SettingProvider _settingProvider;
late PpmProvider _visitsProvider;
late UserProvider _userProvider;
late SettingProvider _settingProvider;
@override
Widget build(BuildContext context) {
@ -41,23 +41,20 @@ class _PpmPageState extends State<PpmPage> with TickerProviderStateMixin {
stateCode: _visitsProvider.stateCode,
onRefresh: () async {
_visitsProvider.reset();
await _visitsProvider.getVisits(
user: _userProvider.user,
host: _settingProvider.host,
);
await _visitsProvider.getVisits(user: _userProvider.user!, host: _settingProvider.host!);
},
child: _visitsProvider.ppms.isEmpty
child: _visitsProvider.ppms?.isEmpty ?? true
? NoItemFound(message: context.translation.noVisitsFound)
: LazyLoading(
nextPage: _visitsProvider.nextPage,
onLazyLoad: () async {
await _visitsProvider.getVisits(user: _userProvider.user, host: _settingProvider.host);
await _visitsProvider.getVisits(user: _userProvider.user!, host: _settingProvider.host!);
},
child: ListView.builder(
itemCount: _visitsProvider.ppms.length,
itemCount: _visitsProvider.ppms!.length,
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 16),
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));
},
),

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

@ -25,10 +25,10 @@ class ProfilePage extends StatefulWidget {
}
class _ProfilePageState extends State<ProfilePage> {
UserProvider _userProvider;
SettingProvider _settingProvider;
double _width;
double _height;
late UserProvider _userProvider;
late SettingProvider _settingProvider;
late double _width;
late double _height;
User _user = User();
bool _firstTime = true;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
@ -42,7 +42,7 @@ class _ProfilePageState extends State<ProfilePage> {
_height = MediaQuery.of(context).size.height;
if (_firstTime) {
_user = User.fromJson(_userProvider.user.toJson());
_user = User.fromJson(_userProvider.user!.toJson());
_firstTime = false;
}
Color color = context.isDark ? AppColor.neutral10 : AppColor.neutral50;
@ -69,9 +69,9 @@ class _ProfilePageState extends State<ProfilePage> {
padding: const EdgeInsets.all(1), // Border radius
child: ClipOval(
child: snapshot.profileImage != null
? Image.file(snapshot.profileImage)
: (snapshot.user.profilePhotoName?.isNotEmpty ?? false)
? Image.network(snapshot.user.profilePhotoName)
? Image.file(snapshot.profileImage!)
: (snapshot.user!.profilePhotoName?.isNotEmpty ?? false)
? Image.network(snapshot.user!.profilePhotoName!)
: const Icon(
Icons.person,
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);
if (pickedFile != null) {
CroppedFile croppedFile = await ImageCropper().cropImage(
CroppedFile? croppedFile = await ImageCropper().cropImage(
sourcePath: pickedFile.path,
aspectRatioPresets: [CropAspectRatioPreset.square],
uiSettings: [
@ -111,8 +111,8 @@ class _ProfilePageState extends State<ProfilePage> {
);
if (croppedFile != null) {
await snapshot.uploadProfileImage(_user.userID, File(croppedFile.path));
Provider.of<SettingProvider>(context, listen: false).setUser(_userProvider.user);
await snapshot.uploadProfileImage(_user.userID!, File(croppedFile.path));
Provider.of<SettingProvider>(context, listen: false).setUser(_userProvider.user!);
}
}
}),
@ -120,7 +120,7 @@ class _ProfilePageState extends State<ProfilePage> {
);
}),
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),
],
),
@ -129,13 +129,13 @@ class _ProfilePageState extends State<ProfilePage> {
if ((_user.phoneNumber ?? "").isNotEmpty) ...[
const Divider().defaultStyle(context),
8.height,
_user.phoneNumber.heading5(context),
_user.phoneNumber!.heading5(context),
8.height,
],
if ((_user.extensionNo ?? "").isNotEmpty) ...[
const Divider().defaultStyle(context),
8.height,
_user.extensionNo.heading5(context),
_user.extensionNo!.heading5(context),
8.height,
],
if ((_user.departmentName?.length ?? 0) > 0) const Divider().defaultStyle(context),
@ -144,13 +144,13 @@ class _ProfilePageState extends State<ProfilePage> {
itemCount: _user.departmentName?.length ?? 0,
shrinkWrap: true,
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) ...[
const Divider().defaultStyle(context),
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,
],
],

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

@ -30,7 +30,7 @@ class AddSupplierEngineerBottomSheet extends StatefulWidget {
class _AddSupplierEngineerBottomSheetState extends State<AddSupplierEngineerBottomSheet> {
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
Lookup suppEngRole;
Lookup? suppEngRole;
SupplierEngineer engineer = SupplierEngineer();
@ -119,9 +119,9 @@ class _AddSupplierEngineerBottomSheetState extends State<AddSupplierEngineerBott
label: context.translation.save,
loading: snapshot.isLoading ?? false,
onPressed: () async {
_formKey.currentState.save();
_formKey.currentState!.save();
if (engineer.personName.isEmpty) {
if (engineer.personName?.isEmpty ?? true) {
"Engineer supplier name is empty".showToast;
return;
}
@ -129,7 +129,7 @@ class _AddSupplierEngineerBottomSheetState extends State<AddSupplierEngineerBott
engineer.personRoleId = suppEngRole?.id;
// print(engineer.toJson());
// return;
SuppEngineerWorkOrders suppEngineer = await snapshot.addSupplierEngineer(engineer);
SuppEngineerWorkOrders? suppEngineer = await snapshot.addSupplierEngineer(engineer);
if (suppEngineer == null) {
Fluttertoast.showToast(msg: "${context.translation.failedToCompleteRequest}");
return;

@ -28,7 +28,7 @@ class CommentsBottomSheet extends StatefulWidget {
class _CommentsBottomSheetState extends State<CommentsBottomSheet> {
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
String text;
String? text;
@override
void initState() {
@ -100,7 +100,7 @@ class _CommentsBottomSheetState extends State<CommentsBottomSheet> {
8.height,
Align(
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)),
),
],
@ -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)
if (userProvider.user!.type == UsersTypes.normal_user) 8.height,
if (userProvider.user!.type == UsersTypes.normal_user)
AppTextFormField(
labelText: "Type any comment",
backgroundColor: AppColor.neutral30,
@ -121,8 +121,8 @@ class _CommentsBottomSheetState extends State<CommentsBottomSheet> {
validator: (value) => Validator.hasValue(value) ? null : context.translation.requiredField,
textInputType: TextInputType.multiline,
suffixIcon: "comment_send".toSvgAsset().paddingOnly(end: 16).onPress(() {
if (_formKey.currentState.validate()) {
_formKey.currentState.save();
if (_formKey.currentState!.validate()) {
_formKey.currentState!.save();
final comment = Comment(id: 0, callRequestId: num.tryParse(widget.requestId ?? ""), comment: text);
commentsProvider.addComment(context, comment: comment);
}

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

@ -29,11 +29,11 @@ class FirstActionBottomSheet extends StatefulWidget {
}
class _FirstActionBottomSheetState extends State<FirstActionBottomSheet> {
ServiceRequest _serviceRequest;
Asset asset;
late ServiceRequest _serviceRequest;
Asset? asset;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
Lookup firstAction;
Lookup? firstAction;
@override
void initState() {
@ -77,7 +77,7 @@ class _FirstActionBottomSheetState extends State<FirstActionBottomSheet> {
setState(() {
//_serviceRequest.firstAction = value;
firstAction = value;
if (firstAction.value != 2) {
if (firstAction?.value != 2) {
_serviceRequest.visitDate = null;
}
});
@ -105,7 +105,7 @@ class _FirstActionBottomSheetState extends State<FirstActionBottomSheet> {
selectedTime.minute,
);
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;
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,
Row(
children: [
@ -178,7 +178,7 @@ class _FirstActionBottomSheetState extends State<FirstActionBottomSheet> {
setState(() {
_serviceRequest.endDate = selectedDateTime?.toIso8601String();
_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,
loading: snapshot.isLoading ?? false,
onPressed: () async {
_formKey.currentState.save();
_formKey.currentState!.save();
_serviceRequest.device = asset;
_serviceRequest.firstAction = firstAction;
await snapshot.updateRequest(user: userProvider.user, request: _serviceRequest);
await snapshot.updateRequest(user: userProvider.user!, request: _serviceRequest);
Navigator.pop(context, true);
},
),

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

@ -17,9 +17,9 @@ class PendingServiceRequestScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: DefaultAppBar(title: "Pending Requests (${pendingAssetServiceRequest.details.length})"),
appBar: DefaultAppBar(title: "Pending Requests (${pendingAssetServiceRequest.details!.length})"),
body: ListView.separated(
itemCount: pendingAssetServiceRequest.details.length,
itemCount: pendingAssetServiceRequest.details!.length,
padding: EdgeInsets.all(16),
separatorBuilder: (cxt, index) => 12.height,
itemBuilder: (cxt, index) => Container(
@ -34,26 +34,26 @@ class PendingServiceRequestScreen extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
pendingAssetServiceRequest.details[index].message.cleanupWhitespace?.capitalizeFirstOfEach ?? "",
pendingAssetServiceRequest.details![index].message!.cleanupWhitespace?.capitalizeFirstOfEach ?? "",
style: Theme.of(context).textTheme.bodyLarge,
),
if ((pendingAssetServiceRequest.details[index].callComments ?? "").isNotEmpty) ...[
if ((pendingAssetServiceRequest.details![index].callComments ?? "").isNotEmpty) ...[
4.height,
Text(
"${pendingAssetServiceRequest.details[index].callComments}",
style: Theme.of(context).textTheme.bodyMedium.copyWith(color: Color(0xff7D859A)),
"${pendingAssetServiceRequest.details![index].callComments}",
style: Theme.of(context).textTheme.bodyMedium!.copyWith(color: Color(0xff7D859A)),
),
],
if ((pendingAssetServiceRequest.details[index].voiceNote ?? "").isNotEmpty) ...[
if ((pendingAssetServiceRequest.details![index].voiceNote ?? "").isNotEmpty) ...[
4.height,
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,
Text(
"Created By: ${pendingAssetServiceRequest.details[index].createdBy}",
"Created By: ${pendingAssetServiceRequest.details![index].createdBy}",
style: Theme.of(context).textTheme.bodyMedium,
),
]
@ -66,7 +66,7 @@ class PendingServiceRequestScreen extends StatelessWidget {
).onPress(() {
Navigator.of(context).push(MaterialPageRoute(
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 {
ServiceRequestsProvider _serviceRequestsProvider;
UserProvider _userProvider;
SettingProvider _settingProvider;
late ServiceRequestsProvider _serviceRequestsProvider;
late UserProvider _userProvider;
late SettingProvider _settingProvider;
bool _expandedSearch = false;
bool _firstTime = true;
@ -42,15 +42,14 @@ class _ServiceRequestsPageState extends State<ServiceRequestsPage> with TickerPr
stateCode: _serviceRequestsProvider.stateCode,
onRefresh: () async {
_serviceRequestsProvider.reset();
await _serviceRequestsProvider.getRequests(hospitalId: _userProvider.user.clientId);
await _serviceRequestsProvider.getRequests(hospitalId: _userProvider.user!.clientId!);
},
child:
ServiceRequestsList(
child: ServiceRequestsList(
nextPage: _serviceRequestsProvider.nextPage,
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";
ServiceRequest serviceRequest;
ServiceRequestDetailsPage({Key? key, this.serviceRequest}) : super(key: key);
ServiceRequestDetailsPage({Key? key, required this.serviceRequest}) : super(key: key);
@override
State<ServiceRequestDetailsPage> createState() => _ServiceRequestDetailsPageState();
@ -35,7 +35,7 @@ class ServiceRequestDetailsPage extends StatefulWidget {
class _ServiceRequestDetailsPageState extends State<ServiceRequestDetailsPage> {
bool loading = false;
ServiceRequest serviceRequest;
ServiceRequest? serviceRequest;
@override
void initState() {
@ -48,7 +48,7 @@ class _ServiceRequestDetailsPageState extends State<ServiceRequestDetailsPage> {
setState(() {});
WidgetsFlutterBinding.ensureInitialized().addPostFrameCallback((timeStamp) async {
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;
setState(() {});
});
@ -75,34 +75,34 @@ class _ServiceRequestDetailsPageState extends State<ServiceRequestDetailsPage> {
Row(
children: [
StatusLabel(
label: serviceRequest.priority.name,
id: serviceRequest.priority.id,
textColor: AppColor.getPriorityStatusTextColor(context, serviceRequest.priority.id),
backgroundColor: AppColor.getPriorityStatusColor(context, serviceRequest.priority.id),
label: serviceRequest.priority!.name,
id: serviceRequest.priority!.id!,
textColor: AppColor.getPriorityStatusTextColor(context, serviceRequest.priority!.id!),
backgroundColor: AppColor.getPriorityStatusColor(context, serviceRequest.priority!.id!),
),
8.width,
StatusLabel(
label: serviceRequest.statusLabel,
textColor: AppColor.getRequestStatusTextColor(context, serviceRequest.statusValue),
backgroundColor: AppColor.getRequestStatusColor(context, serviceRequest.statusValue),
textColor: AppColor.getRequestStatusTextColor(context, serviceRequest.statusValue!),
backgroundColor: AppColor.getRequestStatusColor(context, serviceRequest.statusValue!),
),
1.width.expanded,
],
),
8.height,
Text(serviceRequest.deviceEnName?.cleanupWhitespace?.capitalizeFirstOfEach,
Text(serviceRequest.deviceEnName?.cleanupWhitespace?.capitalizeFirstOfEach ?? "",
style: AppTextStyles.heading5.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)),
8.height,
Text(
'${context.translation.assetNumber}: ${serviceRequest.device.assetNumber}',
'${context.translation.assetNumber}: ${serviceRequest.device!.assetNumber}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
),
Text(
'${context.translation.requestType}: ${serviceRequest.type.name}',
'${context.translation.requestType}: ${serviceRequest.type!.name}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
),
Text(
'${context.translation.equipmentStatus}: ${serviceRequest.defectType.name}',
'${context.translation.equipmentStatus}: ${serviceRequest.defectType!.name}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
),
Text(
@ -118,13 +118,13 @@ class _ServiceRequestDetailsPageState extends State<ServiceRequestDetailsPage> {
Column(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
if (_userProvider.user.type == UsersTypes.normal_user)
if (_userProvider.user!.type == UsersTypes.normal_user)
context.translation.code.toSvgAsset(width: 48).onPress(() {
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(
serviceRequest.date.toServiceRequestCardFormat,
serviceRequest.date!.toServiceRequestCardFormat,
textAlign: TextAlign.end,
style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
),
@ -136,31 +136,31 @@ class _ServiceRequestDetailsPageState extends State<ServiceRequestDetailsPage> {
const Divider().defaultStyle(context),
8.height,
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),
),
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),
),
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),
),
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),
),
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),
),
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),
),
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),
),
8.height,
@ -168,24 +168,24 @@ class _ServiceRequestDetailsPageState extends State<ServiceRequestDetailsPage> {
const Divider().defaultStyle(context),
8.height,
Text(
serviceRequest.callComments,
serviceRequest.callComments!,
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
),
],
if (serviceRequest.devicePhotos.isNotEmpty) ...[
if (serviceRequest.devicePhotos?.isNotEmpty ?? false) ...[
8.height,
const Divider().defaultStyle(context),
FilesList(images: serviceRequest.devicePhotos),
FilesList(images: serviceRequest.devicePhotos!),
],
if (serviceRequest.audio?.isNotEmpty ?? false) ...[
const Divider().defaultStyle(context),
16.height,
ASoundPlayer(audio: serviceRequest.audio),
ASoundPlayer(audio: serviceRequest.audio!),
8.height,
],
],
).paddingOnly(start: 16, end: 16, top: 16, bottom: 8),
(_userProvider.user.type == UsersTypes.normal_user
(_userProvider.user!.type == UsersTypes.normal_user
? Container(
height: 50,
padding: const EdgeInsets.only(left: 16, right: 16),
@ -238,7 +238,7 @@ class _ServiceRequestDetailsPageState extends State<ServiceRequestDetailsPage> {
isScrollControlled: true,
useRootNavigator: true,
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: [
SingleChildScrollView(
padding: const EdgeInsets.all(16),
child: informationCard(serviceRequest),
child: informationCard(serviceRequest!),
).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
? AppFilledButton(
label: context.translation.firstAction,
@ -274,7 +274,7 @@ class _ServiceRequestDetailsPageState extends State<ServiceRequestDetailsPage> {
useSafeArea: true,
isScrollControlled: true,
backgroundColor: Colors.transparent,
builder: (context) => FirstActionBottomSheet(request: serviceRequest),
builder: (context) => FirstActionBottomSheet(request: serviceRequest!),
)) as bool;
if (shouldReloadData ?? false) {
getServiceRequest();

@ -28,9 +28,9 @@ import '../../../widgets/sound/record_sound.dart';
class UpdateServiceRequestPage extends StatefulWidget {
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);
@override
State<UpdateServiceRequestPage> createState() => _UpdateServiceRequestPageState();
@ -38,15 +38,15 @@ class UpdateServiceRequestPage extends StatefulWidget {
class _UpdateServiceRequestPageState extends State<UpdateServiceRequestPage> {
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
TextEditingController _commentController;
late TextEditingController _commentController;
List<File> _deviceImages = [];
UserProvider _userProvider;
late UserProvider _userProvider;
@override
void initState() {
super.initState();
_deviceImages = widget.serviceRequest.devicePhotos.map((e) => File(e)).toList();
_commentController = TextEditingController(text: widget.serviceRequest.callComments ?? "");
_deviceImages = widget.serviceRequest?.devicePhotos?.map((e) => File(e)).toList() ?? [];
_commentController = TextEditingController(text: widget.serviceRequest?.callComments ?? "");
}
@override
@ -71,9 +71,9 @@ class _UpdateServiceRequestPageState extends State<UpdateServiceRequestPage> {
children: [
PickAsset(
editable: false,
device: widget.serviceRequest.device,
device: widget.serviceRequest?.device,
onPickAsset: (asset) {
widget.serviceRequest.device = asset;
widget.serviceRequest!.device = asset;
setState(() {});
},
),
@ -83,7 +83,7 @@ class _UpdateServiceRequestPageState extends State<UpdateServiceRequestPage> {
title: context.translation.priority,
initialValue: widget.serviceRequest?.priority,
onSelect: (value) {
widget.serviceRequest.priority = value;
widget.serviceRequest!.priority = value;
},
),
8.height,
@ -92,7 +92,7 @@ class _UpdateServiceRequestPageState extends State<UpdateServiceRequestPage> {
title: context.translation.equipmentStatus,
initialValue: widget.serviceRequest?.defectType,
onSelect: (value) {
widget.serviceRequest.defectType = value;
widget.serviceRequest!.defectType = value;
},
),
8.height,
@ -101,7 +101,7 @@ class _UpdateServiceRequestPageState extends State<UpdateServiceRequestPage> {
context: context,
enabled: false,
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,
@ -110,12 +110,12 @@ class _UpdateServiceRequestPageState extends State<UpdateServiceRequestPage> {
title: context.translation.requestType,
initialValue: widget.serviceRequest?.type,
onSelect: (value) {
widget.serviceRequest.type = value;
widget.serviceRequest!.type = value;
},
),
8.height,
MultiFilesPicker(label: context.translation.attachImage, files: _deviceImages),
((widget.serviceRequest.devicePhotos?.isNotEmpty ?? false) ? 16 : 8).height,
((widget.serviceRequest!.devicePhotos?.isNotEmpty ?? false) ? 16 : 8).height,
Align(
alignment: AlignmentDirectional.centerStart,
child: context.translation.callComments.heading5(context),
@ -124,16 +124,16 @@ class _UpdateServiceRequestPageState extends State<UpdateServiceRequestPage> {
AppTextFormField(
controller: _commentController,
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),
onSaved: (text) {
widget.serviceRequest.callComments = text;
widget.serviceRequest!.callComments = text;
},
),
8.height,
RecordSound(
onRecord: (audio) {
widget.serviceRequest.audio = audio;
widget.serviceRequest!.audio = audio;
},
enabled: widget.serviceRequest == null ? true : false,
),
@ -150,18 +150,18 @@ class _UpdateServiceRequestPageState extends State<UpdateServiceRequestPage> {
}
Future<void> _submit() async {
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)) {
_formKey.currentState.save();
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 (_isLocalUrl(widget.serviceRequest.audio)) {
final File file = File(widget.serviceRequest.audio);
widget.serviceRequest.audio = "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}";
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)) {
_formKey.currentState!.save();
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 (_isLocalUrl(widget.serviceRequest!.audio!)) {
final File file = File(widget.serviceRequest!.audio!);
widget.serviceRequest!.audio = "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}";
}
}
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();
}
}

@ -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_repair_location.dart';
import '../../../../widgets/timer/app_timer.dart';
class CreateServiceReport extends StatefulWidget {
static const String id = "/create-service-report";
final ServiceRequest request;
const CreateServiceReport({Key? key, this.request}) : super(key: key);
const CreateServiceReport({Key? key, required this.request}) : super(key: key);
@override
_CreateServiceReportState createState() => _CreateServiceReportState();
}
class _CreateServiceReportState extends State<CreateServiceReport> with TickerProviderStateMixin {
UserProvider _userProvider;
SettingProvider _settingProvider;
ServiceRequestsProvider _serviceRequestsProvider;
ServiceStatusProvider _assetTypeProvider;
PartsProvider _partsProvider;
ServiceReport _serviceReport;
late UserProvider _userProvider;
late SettingProvider _settingProvider;
late ServiceRequestsProvider _serviceRequestsProvider;
late ServiceStatusProvider _assetTypeProvider;
late PartsProvider _partsProvider;
late ServiceReport _serviceReport;
bool _isLoading = false;
List<SparePart> _spareParts = [];
@ -84,7 +85,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
// _isLoading = true;
}
Asset loanAvailabilityAsset;
Asset? loanAvailabilityAsset;
@override
void dispose() {
@ -97,7 +98,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
void getRequestForWorkOrder() async {
_isLoading = true;
setState(() {});
_serviceReport.callRequest = await _serviceRequestsProvider.getCallRequestForWorkOrder(callId: widget.request.id);
_serviceReport.callRequest = await _serviceRequestsProvider.getCallRequestForWorkOrder(callId: widget.request.id!);
await _assetTypeProvider.getTypes();
_serviceReport.assignedEmployee = _serviceReport.callRequest?.assignedEmployee;
_serviceReport.equipmentStatus = _serviceReport.callRequest?.defectType;
@ -119,7 +120,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
}
_serviceReport.assetType = _assetTypeProvider.statuses?.firstWhere(
(element) => element.value == _serviceReport.callRequest?.assetType,
orElse: () => null,
orElse: null,
);
return Scaffold(
@ -143,7 +144,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
widget.request.hospitalName.heading5(context),
widget.request.hospitalName!.heading5(context),
8.height,
"${context.translation.assetNo}: ${widget.request.deviceNumber}".bodyText(context),
"${context.translation.callId}: ${widget.request.requestCode}".bodyText(context),
@ -170,7 +171,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
selectedTime.minute,
);
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;
}
@ -194,7 +195,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
if (timer?.durationInSecond != 0) {
_serviceReport.workingHours = num.tryParse((((timer?.durationInSecond ?? 0) / 60) / 60)?.toStringAsFixed(2) ?? "0");
} 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);
_serviceReport.workingHours = num.tryParse(workingHours ?? "0");
}
@ -211,8 +212,8 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
_assetTypeProvider.reset();
await _assetTypeProvider.getTypes();
_serviceReport?.assetType = _assetTypeProvider.statuses?.firstWhere(
(element) => element.value == _serviceReport.callRequest.assetType,
orElse: () => null,
(element) => element.value == _serviceReport.callRequest!.assetType,
orElse: null,
);
},
child: AppTextFormField(
@ -256,7 +257,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
ServiceReportLastCallsMenu(
report: _serviceReport,
title: context.translation.callLastSituation,
parentId: "0",//widget.request.id,
parentId: "0", //widget.request.id,
onSelect: (status) {
_serviceReport.calllastSituation = status;
},
@ -267,7 +268,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
initialValue: _serviceReport.faultDescription,
onSelect: (status) {
_serviceReport.faultDescription = status;
_workPreformedController?.text = _serviceReport.faultDescription?.workPerformed;
_workPreformedController?.text = _serviceReport.faultDescription?.workPerformed ?? "";
},
),
8.height,
@ -287,7 +288,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
if (status != null) {
setState(() {
_serviceReport.loanAvailablity = status;
if (_serviceReport.loanAvailablity.value != 1) {
if (_serviceReport.loanAvailablity!.value != 1) {
loanAvailabilityAsset = null;
_serviceReport.assetLoan = null;
}
@ -311,13 +312,13 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
8.height,
ServiceReportAssistantEmployeeMenu(
title: context.translation.assignAssistant,
assetId: _serviceReport.callRequest?.asset?.id,
assetId: _serviceReport.callRequest!.asset!.id!,
initialValue: (_serviceReport.assistantEmployees?.isNotEmpty ?? false) ? _serviceReport.assistantEmployees?.first : null,
onSelect: (employee) {
if (employee == null) {
_serviceReport.assistantEmployees = [];
} 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(
label: context.translation.submitRequest,
onPressed: () async {
if ((!_formKey.currentState.validate()) || (!(await _serviceReport.validate(context)))) {
if ((!_formKey.currentState!.validate()) || (!(await _serviceReport.validate(context)))) {
setState(() {});
return;
}
_formKey.currentState.save();
_formKey.currentState!.save();
_serviceReport.attachmentsWorkOrder ??= [];
if (_files.isEmpty) _serviceReport.attachmentsWorkOrder = [];
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);
},
),

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

@ -14,10 +14,10 @@ import '../../../../../providers/loading_list_notifier.dart';
class PartNoButton extends StatefulWidget {
final List<SparePart> spareParts;
final List<SparePartsWorkOrders> initialList;
final List<SparePartsWorkOrders>? initialList;
final TextEditingController controller;
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);
@ -79,7 +79,7 @@ class _PartNoButtonState extends State<PartNoButton> {
labelText: context.translation.quantity,
textInputType: TextInputType.number,
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
? context.translation.requiredField
: Validator.isNumeric(value)
@ -98,10 +98,10 @@ class _PartNoButtonState extends State<PartNoButton> {
onPressed: widget.disablePartEdit
? null
: () {
if (current != null && _formKey.currentState.validate()) {
_formKey.currentState.save();
if (current != null && _formKey.currentState!.validate()) {
_formKey.currentState!.save();
list.add(current);
if (widget.onChange != null) widget.onChange(list);
if (widget.onChange != null) widget.onChange!(list);
current = SparePartsWorkOrders();
widget.controller.text = "";
setState(() {});
@ -123,14 +123,14 @@ class _PartNoButtonState extends State<PartNoButton> {
Row(
crossAxisAlignment: CrossAxisAlignment.start,
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),
32.width,
"trash".toSvgAsset(color: widget.disablePartEdit ? Colors.grey : null).onPress(widget.disablePartEdit
? null
: () {
list.remove(list[index]);
if (widget.onChange != null) widget.onChange(list);
if (widget.onChange != null) widget.onChange!(list);
setState(() {});
}),
],
@ -152,7 +152,7 @@ class _PartNoButtonState extends State<PartNoButton> {
: context.translation.onlyNumbers,
onChange: (text) {
list[index].installQty = num.tryParse(text ?? "");
if (widget.onChange != null) widget.onChange(list);
if (widget.onChange != null) widget.onChange!(list);
},
onSaved: (text) {
list[index].installQty = num.tryParse(text ?? "");
@ -173,7 +173,7 @@ class _PartNoButtonState extends State<PartNoButton> {
: context.translation.onlyNumbers,
onChange: (text) {
list[index].returnQty = num.tryParse(text ?? "");
if (widget.onChange != null) widget.onChange(list);
if (widget.onChange != null) widget.onChange!(list);
},
onSaved: (text) {
list[index].returnQty = num.tryParse(text ?? "");

@ -12,7 +12,7 @@ class UpdateServiceReport extends StatefulWidget {
final ServiceRequest request;
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
_UpdateServiceReportState createState() => _UpdateServiceReportState();
@ -21,10 +21,10 @@ class UpdateServiceReport extends StatefulWidget {
class _UpdateServiceReportState extends State<UpdateServiceReport> {
@override
Widget build(BuildContext context) {
ServiceRequestsProvider().getSingleServiceReport(context, reportId: widget.workOrder.id);
ServiceRequestsProvider().getSingleServiceReport(context, reportId: widget.workOrder.id!.toInt());
return Scaffold(
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) {
if (snapshot.hasError) {
return FailedLoading(
@ -35,7 +35,7 @@ class _UpdateServiceReportState extends State<UpdateServiceReport> {
);
}
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());
},

@ -23,8 +23,8 @@ import '../../../../widgets/requests/request_status.dart';
class WorkOrderDetailsPage extends StatelessWidget {
static const String id = "/work_order_details_page";
final SearchWorkOrder workOrder;
final ServiceRequest serviceRequest;
final SearchWorkOrder? workOrder;
final ServiceRequest? serviceRequest;
const WorkOrderDetailsPage({Key? key, this.workOrder, this.serviceRequest}) : super(key: key);
@ -34,7 +34,7 @@ class WorkOrderDetailsPage extends StatelessWidget {
return Scaffold(
appBar: DefaultAppBar(title: context.translation.activities),
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) {
final workOrderDetails = snapshot.data;
return Column(
@ -50,56 +50,56 @@ class WorkOrderDetailsPage extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
StatusLabel(
label: workOrderDetails.currentSituation?.name,
textColor: AppColor.getRequestStatusTextColorByName(context, workOrderDetails.currentSituation?.name),
backgroundColor: AppColor.getRequestStatusColorByName(context, workOrderDetails.currentSituation?.name),
label: workOrderDetails?.currentSituation?.name,
textColor: AppColor.getRequestStatusTextColorByName(context, workOrderDetails?.currentSituation?.name),
backgroundColor: AppColor.getRequestStatusColorByName(context, workOrderDetails?.currentSituation?.name),
),
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,
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),
),
Text(
'${context.translation.orderWorkNumber}: ${workOrderDetails.workOrderNo}',
'${context.translation.orderWorkNumber}: ${workOrderDetails!.workOrderNo}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
),
Text(
'${context.translation.assignedEmployee}: ${workOrderDetails.assignedEmployee?.name ?? ""}',
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)),
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)),
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)),
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)),
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)),
Text('${context.translation.currentSituation}: ${workOrderDetails.currentSituation?.name}',
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)),
Text('${context.translation.startDate}: ${workOrderDetails.startofWorkTime?.toServiceRequestDetailsFormat ?? "" ?? '' ?? ""}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20)),
Text('${context.translation.endDate}: ${workOrderDetails.endofWorkTime?.toServiceRequestDetailsFormat ?? "" ?? '' ?? ""}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20)),
if (workOrderDetails.attachmentsWorkOrder.isNotEmpty) ...[
if (workOrderDetails!.attachmentsWorkOrder?.isNotEmpty ?? false) ...[
8.height,
const Divider().defaultStyle(context),
FilesList(images: workOrderDetails.attachmentsWorkOrder.map((e) => e.name).toList()),
FilesList(images: workOrderDetails.attachmentsWorkOrder!.map((e) => e.name!).toList()),
],
],
).expanded,
Column(
crossAxisAlignment: CrossAxisAlignment.end,
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(() {
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,
// Text(workOrderDetails.endofWorkTime?.toServiceRequestCardFormat ?? "",
@ -109,7 +109,7 @@ class WorkOrderDetailsPage extends StatelessWidget {
],
).toShadowContainer(context),
).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(
onPressed: () {
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/extensions/context_extension.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/models/enums/user_types.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/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/default_app_bar.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/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/requests/request_status.dart';
class WorkOrderListPage extends StatelessWidget {
static const String id = "/work-order-list";
ServiceRequest serviceRequest;
final ServiceRequest? serviceRequest;
WorkOrderListPage({Key? key, this.serviceRequest}) : super(key: key);
late ServiceRequestsProvider serviceRequestsProvider;
late UserProvider _userProvider;
@override
Widget build(BuildContext context) {
// UserProvider _userProvider = Provider.of<UserProvider>(context);
// SettingProvider _settingProvider = Provider.of<SettingProvider>(context);
List<SearchWorkOrder> workOrders = [];
ServiceRequestsProvider serviceRequestsProvider;
UserProvider _userProvider = Provider.of<UserProvider>(context);
serviceRequestsProvider ??= Provider.of<ServiceRequestsProvider>(context);
_userProvider = Provider.of<UserProvider>(context);
serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context);
return Scaffold(
appBar: DefaultAppBar(title: context.translation.activities),
//backgroundColor: const Color(0xfff8f9fb),
body: SafeArea(
child: FutureBuilder(
future: serviceRequestsProvider.searchWorkOrders(callId: serviceRequest?.requestCode),
future: serviceRequestsProvider.searchWorkOrders(callId: serviceRequest!.requestCode!),
builder: (context, snap) {
if (snap.connectionState == ConnectionState.waiting) return const Center(child: CircularProgressIndicator());
workOrders = snap.data as List<SearchWorkOrder>;
@ -52,9 +46,9 @@ class WorkOrderListPage extends StatelessWidget {
itemCount: workOrders.length,
separatorBuilder: (czt, index) => 8.height,
itemBuilder: (context, index) {
return ActivityCardView(workOrders[index], serviceRequest);
return ActivityCardView(workOrders[index], serviceRequest!);
//older code....
//older code....
// Row(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
@ -115,12 +109,12 @@ class WorkOrderListPage extends StatelessWidget {
// ).toShadowContainer(context);
},
).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(
label: context.translation.createWorkOrder,
maxWidth: true,
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)
],

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

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

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

@ -1,15 +1,18 @@
import 'package:flutter/material.dart';
import 'package:test_sa/views/app_style/sizing.dart';
class AButton extends StatelessWidget {
import 'package:test_sa/views/app_style/sizing.dart';class AButton extends StatelessWidget {
final String text;
final Color color;
final EdgeInsets padding;
final TextStyle textStyle;
final VoidCallback onPressed;
final Color? color; // Nullable
final EdgeInsets? padding; // Nullable
final TextStyle? textStyle; // Nullable
final VoidCallback? onPressed; // Nullable
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
Widget build(BuildContext context) {
@ -18,18 +21,18 @@ class AButton extends StatelessWidget {
child: ElevatedButton(
style: ElevatedButton.styleFrom(
elevation: 0,
// foregroundColor: color.computeLuminance() > 0.5 ? AColors.black : Colors.white,
backgroundColor: color,
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,
child: Text(
text ?? "",
// style: textStyle ?? Theme.of(context).textTheme.subtitle2.copyWith(color: AColors.white, fontSize: 14, fontWeight: FontWeight.w600),
text,
style: textStyle,
textScaleFactor: AppStyle.getScaleFactor(context),
),
),
);
}
}
}

@ -4,13 +4,21 @@ import 'package:test_sa/views/app_style/sizing.dart';
class AIconButton extends StatelessWidget {
final IconData iconData;
final Color color;
final Color backgroundColor;
final VoidCallback onPressed;
final double iconSize;
final Color? color; // Nullable
final Color? backgroundColor; // Nullable
final VoidCallback? onPressed; // Nullable
final double? iconSize; // Nullable
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
Widget build(BuildContext context) {
@ -20,13 +28,15 @@ class AIconButton extends StatelessWidget {
child: ElevatedButton(
style: ElevatedButton.styleFrom(
padding: EdgeInsets.zero,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular((AppStyle.borderRadius - 4) * AppStyle.getScaleFactor(context))),
// backgroundColor: backgroundColor ?? AColors.onPrimaryColor,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular((AppStyle.borderRadius - 4) * AppStyle.getScaleFactor(context)),
),
backgroundColor: backgroundColor,
),
onPressed: onPressed,
child: FaIcon(
iconData,
// color: color ?? AColors.primaryColor,
color: color,
size: iconSize ?? 32,
),
),

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

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

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

@ -6,7 +6,7 @@ class DepartmentItem extends StatelessWidget {
final Department department;
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
Widget build(BuildContext context) {

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

@ -13,7 +13,7 @@ class DeviceTransferItem extends StatelessWidget {
final AssetTransfer item;
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
Widget build(BuildContext context) {
@ -58,7 +58,7 @@ class DeviceTransferItem extends StatelessWidget {
/// TBD
//StatusLabel(label: '', textColor: AColors.getRequestStatusTextColor(0), backgroundColor: AColors.getRequestStatusColor(0)),
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))),
],
),

@ -11,7 +11,7 @@ class DeviceTransferList extends StatelessWidget {
final bool nextPage;
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
Widget build(BuildContext context) {

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

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

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

@ -12,7 +12,7 @@ class AssetItemGridView extends StatelessWidget {
final Asset device;
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
Widget build(BuildContext context) {
@ -28,7 +28,7 @@ class AssetItemGridView extends StatelessWidget {
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
image: DecorationImage(
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,
children: [
Text(
device.modelDefinition.assetName.cleanupWhitespace.capitalizeFirstOfEach,
device.modelDefinition!.assetName!.cleanupWhitespace.capitalizeFirstOfEach,
maxLines: 2,
overflow: TextOverflow.ellipsis,
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
@ -48,7 +48,7 @@ class AssetItemGridView extends StatelessWidget {
mainAxisSize: MainAxisSize.min,
children: [
"${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(
"${context.translation.serialNo} : ${device.assetSerialNo}",
maxLines: 2,

@ -10,9 +10,9 @@ import 'package:test_sa/new_views/app_style/app_color.dart';
class AssetItemListView extends StatelessWidget {
final Asset device;
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
Widget build(BuildContext context) {
@ -27,7 +27,7 @@ class AssetItemListView extends StatelessWidget {
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
image: DecorationImage(
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,
@ -39,10 +39,10 @@ class AssetItemListView extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
device.modelDefinition.assetName.cleanupWhitespace.capitalizeFirstOfEach.heading6(context),
device.modelDefinition!.assetName!.cleanupWhitespace.capitalizeFirstOfEach.heading6(context),
8.height,
"${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(

@ -11,8 +11,8 @@ import '../../../models/device/asset.dart';
import '../../../new_views/app_style/app_color.dart';
class AssetPicker extends StatelessWidget {
final Function(Asset) onPick;
final Asset device;
final Function(Asset)? onPick;
final Asset? device;
final bool editable;
final bool showAssetInfo;
final bool forPPM;
@ -43,9 +43,9 @@ class AssetPicker extends StatelessWidget {
],
),
).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) {
onPick(device);
onPick!(device);
}
})
else
@ -66,9 +66,9 @@ class AssetPicker extends StatelessWidget {
],
),
).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) {
onPick(device);
onPick!(device);
}
}),
if (device != null && showAssetInfo)
@ -87,7 +87,7 @@ class AssetPicker extends StatelessWidget {
Row(
children: [
Text(
device.modelDefinition?.assetName?.cleanupWhitespace?.capitalizeFirstOfEach ?? "",
device?.modelDefinition?.assetName?.cleanupWhitespace?.capitalizeFirstOfEach ?? "",
style: TextStyle(
fontSize: 14.toScreenWidth,
fontWeight: FontWeight.w500,
@ -104,10 +104,10 @@ class AssetPicker extends StatelessWidget {
],
),
8.height,
"${context.translation.assetNo}: ${device.assetNumber}".bodyText2(context).toShimmer(isShow: showLoading),
"${context.translation.assetNo}: ${device!.assetNumber}".bodyText2(context).toShimmer(isShow: showLoading),
2.height,
// "${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),
// const Divider().defaultStyle(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';
class CommissioningStatusButtons extends StatefulWidget {
final Function(Lookup) onSelect;
final Lookup initialValue;
final Function(Lookup?)? onSelect;
final Lookup? initialValue;
CommissioningStatusButtons({Key? key, this.onSelect, this.initialValue}) : super(key: key);
@ -29,7 +29,7 @@ class _CommissioningStatusButtonsState extends State<CommissioningStatusButtons>
WidgetsFlutterBinding.ensureInitialized().addPostFrameCallback((timeStamp) {
final provider = Provider.of<CommissioningStatusProvider>(context, listen: false);
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(() {});
});
});
@ -40,7 +40,7 @@ class _CommissioningStatusButtonsState extends State<CommissioningStatusButtons>
if (widget.initialValue != oldWidget.initialValue) {
final provider = Provider.of<CommissioningStatusProvider>(context, listen: false);
if (widget.initialValue != null) {
_selectedIndex = provider.items.indexOf(widget.initialValue);
_selectedIndex = provider.items.indexOf(widget.initialValue!);
} else {
_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)],
),
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(() {
setState(() {
_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: [
context.translation.device.tinyFont(context).custom(color: context.isDark ? AppColor.neutral40 : AppColor.neutral50),
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
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> {
AssetProvider _devicesProvider;
UserProvider _userProvider;
SettingProvider _settingProvider;
late AssetProvider _devicesProvider;
late UserProvider _userProvider;
late SettingProvider _settingProvider;
List<Asset> _searchableList = [];
List<Asset> _initList = [];
bool _firstTime = true;
AssetSearch _searchAsset;
AssetSearch? _searchAsset;
bool showListView = true;
@ -135,7 +135,7 @@ class _MyAssetsPageState extends State<MyAssetsPage> {
context.translation.filter,
style: AppTextStyles.bodyText2.copyWith(color: AppColor.blueStatus(context)),
).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) {
_searchAsset = result;
}
@ -163,9 +163,9 @@ class _MyAssetsPageState extends State<MyAssetsPage> {
nextPage: _devicesProvider.nextPage,
onLazyLoad: () async {
await _devicesProvider.getDevicesList(
user: _userProvider.user,
host: _settingProvider.host,
hospitalId: _userProvider.user.clientId,
user: _userProvider.user!,
host: _settingProvider.host!,
hospitalId: _userProvider.user!.clientId!,
search: _searchAsset?.copyWith(assetSerialNumber: snController.text, assetNo: numberController.text),
// serialNumber: snController.text,
// number: numberController.text,

@ -14,7 +14,7 @@ class GasRefillItem extends StatelessWidget {
final GasRefillModel item;
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
Widget build(BuildContext context) {
@ -30,19 +30,19 @@ class GasRefillItem extends StatelessWidget {
// backgroundColor: AppColor.getRequestStatusColorByName(context, item.priority),
// ),
StatusLabel(
label: item.status.name,
textColor: AppColor.getRequestStatusTextColor(context, item.status.value),
backgroundColor: AppColor.getRequestStatusColor(context, item.status.value),
label: item.status!.name,
textColor: AppColor.getRequestStatusTextColor(context, item.status!.value!),
backgroundColor: AppColor.getRequestStatusColor(context, item.status!.value!),
),
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))),
],
),
8.height,
context.translation.gasRefillRequest.heading5(context),
'${context.translation.gasType}: ${item.gazRefillDetails[0].gasType.name}'.bodyText(context),
'${context.translation.site}: ${item.site.name}'.bodyText(context),
'${context.translation.gasType}: ${item.gazRefillDetails![0].gasType!.name}'.bodyText(context),
'${context.translation.site}: ${item.site!.name}'.bodyText(context),
8.height,
Row(
mainAxisSize: MainAxisSize.min,

@ -12,7 +12,7 @@ class GasRefillList extends StatefulWidget {
final bool nextPage;
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
State<GasRefillList> createState() => _GasRefillListState();

@ -6,7 +6,7 @@ class HospitalItem extends StatelessWidget {
final Hospital hospital;
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
Widget build(BuildContext context) {
@ -19,11 +19,7 @@ class HospitalItem extends StatelessWidget {
borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)),
),
),
onPressed: onPressed == null
? null
: () {
onPressed(hospital);
},
onPressed: onPressed(hospital),
child: ListTile(
title: Text(
hospital.name ?? "",

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

@ -3,18 +3,17 @@ import 'dart:io';
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.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/views/app_style/sizing.dart';
import 'package:test_sa/views/widgets/buttons/app_back_button.dart';
import 'package:test_sa/views/widgets/loaders/image_loader.dart';
import 'package:url_launcher/url_launcher.dart';
class FilesList extends StatelessWidget {
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
Widget build(BuildContext context) {
@ -23,7 +22,7 @@ class FilesList extends StatelessWidget {
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 6, mainAxisSpacing: 8, crossAxisSpacing: 8),
itemCount: images?.length ?? 0,
itemCount: images.length,
itemBuilder: (context, itemIndex) {
if (images[itemIndex] == null || !images[itemIndex].contains(".")) {
return Text("Bad\nFile");
@ -61,7 +60,7 @@ class FilesList extends StatelessWidget {
body: SafeArea(
child: Stack(
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(),
],
),
@ -85,62 +84,79 @@ class FilesList extends StatelessWidget {
},
);
return ListView.separated(
padding: padding ?? EdgeInsets.symmetric(horizontal: 32 * AppStyle.getScaleFactor(context)),
scrollDirection: Axis.horizontal,
itemCount: images?.length ?? 0,
separatorBuilder: (context, itemIndex) => 8.width,
itemBuilder: (context, itemIndex) {
if (images[itemIndex] == null || !images[itemIndex].contains(".")) {
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 ListView.separated(
// padding: padding ?? EdgeInsets.symmetric(horizontal: 32 * AppStyle.getScaleFactor(context)),
// scrollDirection: Axis.horizontal,
// itemCount: images?.length ?? 0,
// separatorBuilder: (context, itemIndex) => 8.width,
// itemBuilder: (context, itemIndex) {
// if (images[itemIndex] == null || !images[itemIndex].contains(".")) {
// 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.");
// }
// }
// });
// });
}
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.");
}
}
});
});
ImageProvider getImageObject(int itemIndex) {
if (_isLocalUrl(images[itemIndex])) {
return FileImage(File(images[itemIndex]));
}
return NetworkImage(images[itemIndex]);
}
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) {
if (url?.isEmpty != false) return false;
if (url.isEmpty != false) return false;
return url.startsWith("/") || url.startsWith("file://") || url.substring(1).startsWith(':\\');
}
}

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

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

@ -18,13 +18,13 @@ class MultiFilesPickerItem extends StatelessWidget {
final bool enabled;
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
Widget build(BuildContext context) {
var 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";
var isExcel = file.path.split(".").last.toLowerCase() == "xlsx";
bool isImage = file.path.split(".").last.toLowerCase() == "png" || file.path.split(".").last.toLowerCase() == "jpg" || file.path.split(".").last.toLowerCase() == "jpeg";
bool isPdf = file.path.split(".").last.toLowerCase() == "pdf";
bool isExcel = file.path.split(".").last.toLowerCase() == "xlsx";
return SizedBox(
width: 54.toScreenWidth,
@ -37,9 +37,7 @@ class MultiFilesPickerItem extends StatelessWidget {
decoration: BoxDecoration(
border: Border.all(width: 1, color: context.isDark ? AppColor.neutral30 : AppColor.neutral30),
image: DecorationImage(
image: isImage
? (_isLocalUrl(file.path) ? FileImage(file) : NetworkImage( URLs.getFileUrl(file.path)))
: AssetImage("assets/images/${isPdf ? "pdf" : isExcel ? "excel" : "doc"}.png"),
image: getImage(isImage, isPdf, isExcel, file),
fit: BoxFit.cover,
),
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) {
if (url?.isEmpty != false) return false;
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 {
final bool isSelected;
final String issueInfo;
final Function(String, bool) onChange;
final String? issueInfo;
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
Widget build(BuildContext context) {
@ -25,7 +25,7 @@ class ReportIssueItem extends StatelessWidget {
padding: const EdgeInsets.symmetric(horizontal: 8),
child: Text(
issueInfo ?? "",
style: Theme.of(context).textTheme.subtitle2,
style: Theme.of(context).textTheme.titleSmall,
textScaleFactor: AppStyle.getScaleFactor(context),
),
),
@ -35,7 +35,7 @@ class ReportIssueItem extends StatelessWidget {
child: Checkbox(
value: isSelected,
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';
class FailedLoading extends StatelessWidget {
final String message;
final String? message;
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
Widget build(BuildContext context) {
@ -16,7 +16,7 @@ class FailedLoading extends StatelessWidget {
children: [
Text(
message ?? context.translation.httpError,
style: Theme.of(context).textTheme.subtitle1,
style: Theme.of(context).textTheme.titleMedium,
textScaleFactor: AppStyle.getScaleFactor(context),
),
SizedBox(

@ -2,12 +2,12 @@ import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
class ImageLoader extends StatelessWidget {
final String url;
final BoxFit boxFit;
final Color color;
final Alignment alignment;
final double width;
final double height;
final String? url;
final BoxFit? boxFit;
final Color? color;
final Alignment? alignment;
final double? width;
final double? height;
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';
class NoItemFound extends StatelessWidget {
final String message;
const NoItemFound({
Key? key,
this.message,
}) : super(key: key);
final String? message;
const NoItemFound({Key? key, this.message}) : super(key: key);
@override
Widget build(BuildContext context) {

@ -14,7 +14,7 @@ class NotificationItem extends StatelessWidget {
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
Widget build(BuildContext context) {
@ -26,16 +26,16 @@ class NotificationItem extends StatelessWidget {
if (notification.priorityName != null)
StatusLabel(
label: notification.priorityName,
textColor: AppColor.getRequestStatusTextColorByName(context, notification.priorityName),
backgroundColor: AppColor.getRequestStatusColorByName(context, notification.priorityName),
textColor: AppColor.getRequestStatusTextColorByName(context, notification.priorityName!),
backgroundColor: AppColor.getRequestStatusColorByName(context, notification.priorityName!),
).toShimmer(isShow: isLoading),
8.width,
if((notification.statusName ?? "").isNotEmpty && notification.sourceName!="Asset Transfer")
StatusLabel(
label: notification.statusName ?? "",
textColor: AppColor.getRequestStatusTextColorByName(context, notification.statusName ?? ""),
backgroundColor: AppColor.getRequestStatusColorByName(context, notification.statusName ?? ""),
).toShimmer(isShow: isLoading),
if ((notification.statusName ?? "").isNotEmpty && notification.sourceName != "Asset Transfer")
StatusLabel(
label: notification.statusName ?? "",
textColor: AppColor.getRequestStatusTextColorByName(context, notification.statusName ?? ""),
backgroundColor: AppColor.getRequestStatusColorByName(context, notification.statusName ?? ""),
).toShimmer(isShow: isLoading),
],
),
8.height,
@ -50,7 +50,7 @@ class NotificationItem extends StatelessWidget {
).toShimmer(isShow: isLoading).expanded,
8.width,
Text(
notification.createdOn.toServiceRequestCardFormat ?? "",
notification.createdOn?.toServiceRequestCardFormat ?? "",
textAlign: TextAlign.right,
style: AppTextStyles.tinyFont.copyWith(
color: context.isDark ? AppColor.neutral20 : AppColor.neutral50,

@ -15,21 +15,21 @@ import '../../../new_views/app_style/app_text_style.dart';
class AutoCompletePartsField extends StatefulWidget {
final String initialValue;
final num assetId;
final num? assetId;
final bool clearAfterPick, byName;
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
_AutoCompletePartsFieldState createState() => _AutoCompletePartsFieldState();
}
class _AutoCompletePartsFieldState extends State<AutoCompletePartsField> {
SettingProvider _settingProvider;
PartsProvider _partsProvider;
UserProvider _userProvider;
TextEditingController _controller;
late SettingProvider _settingProvider;
late PartsProvider _partsProvider;
late UserProvider _userProvider;
late TextEditingController _controller;
@override
void initState() {

@ -1,38 +1,31 @@
import 'package:flutter/material.dart';
import 'package:flutter_typeahead/flutter_typeahead.dart';
import 'package:provider/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/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/views/app_style/sizing.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_search.dart';
import '../../../../new_views/app_style/app_color.dart';
import '../../../../new_views/app_style/app_text_style.dart';
class CalibrationToolAssetPicker extends StatefulWidget {
final Lookup initialValue;
final int hospitalId;
final Lookup? initialValue;
final int? hospitalId;
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
State<CalibrationToolAssetPicker> createState() => _CalibrationToolAssetPickerState();
}
class _CalibrationToolAssetPickerState extends State<CalibrationToolAssetPicker> {
SettingProvider _settingProvider;
AssetProvider _devicesProvider;
UserProvider _userProvider;
TextEditingController _controller;
late SettingProvider _settingProvider;
late AssetProvider _devicesProvider;
late UserProvider _userProvider;
late TextEditingController _controller;
@override
void initState() {
@ -75,11 +68,11 @@ class _CalibrationToolAssetPickerState extends State<CalibrationToolAssetPicker>
device: widget.initialValue == null
? null
: Asset(
id: widget.initialValue.id,
assetNumber: widget.initialValue.name,
id: widget.initialValue!.id,
assetNumber: widget.initialValue!.name,
),
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/ppm/ppm_calibration_tools.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 '../../../new_views/app_style/app_color.dart';
import '../date_and_time/date_picker.dart';
import 'auto_complete_fields/auto_complete_devices_field.dart';
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
State<PentryCalibrationToolForm> createState() => _PentryCalibrationToolFormState();
@ -30,10 +28,10 @@ class _PentryCalibrationToolFormState extends State<PentryCalibrationToolForm> {
Widget build(BuildContext context) {
final userProvider = Provider.of<UserProvider>(context);
return ListView.builder(
itemCount: widget.models.length + 1,
itemCount: widget.models!.length + 1,
padding: EdgeInsets.only(top: 16.toScreenHeight),
itemBuilder: (context, index) {
if (index == widget.models.length) {
if (index == widget.models!.length) {
return AppFilledButton(
label: context.translation.addAsset,
maxWidth: true,
@ -41,21 +39,21 @@ class _PentryCalibrationToolFormState extends State<PentryCalibrationToolForm> {
buttonColor: context.isDark ? AppColor.neutral60 : AppColor.neutral50,
onPressed: () async {
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}");
return;
}
if (widget.models.last.calibrationDateOfTesters == null) {
if (widget.models!.last.calibrationDateOfTesters == null) {
await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.date}");
return;
}
}
widget.models.add(PpmCalibrationTools(id: 0));
widget.models!.add(PpmCalibrationTools(id: 0));
setState(() {});
},
);
}
final model = widget.models[index];
final model = widget.models![index];
return Container(
padding: const EdgeInsets.all(16),
margin: EdgeInsets.only(bottom: 16.toScreenHeight),
@ -72,15 +70,15 @@ class _PentryCalibrationToolFormState extends State<PentryCalibrationToolForm> {
children: [
"${context.translation.asset} ${index + 1}".heading5(context),
"trash".toSvgAsset(height: 20, width: 15).onPress(() {
widget.models.remove(model);
widget.models!.remove(model);
setState(() {});
}),
],
),
16.height,
CalibrationToolAssetPicker(
initialValue: model.assetId == null ? null : Lookup(id: model.assetId, name: model.assetNumber ?? ""),
hospitalId: userProvider.user.clientId,
initialValue: model.assetId == null ? null : Lookup(id: model.assetId?.toInt(), name: model.assetNumber ?? ""),
hospitalId: userProvider.user!.clientId,
onPick: (number) {
model.assetNumber = number.name;
model.assetId = number.id;

@ -11,10 +11,10 @@ import '../../../new_views/common_widgets/app_filled_button.dart';
import '../parts/auto_complete_parts_field.dart';
class PentryPMKitForm extends StatefulWidget {
final List<PpmKits> models;
final num assetId;
final List<PpmKits>? models;
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
State<PentryPMKitForm> createState() => _PentryPMKitFormState();
@ -24,11 +24,11 @@ class _PentryPMKitFormState extends State<PentryPMKitForm> {
@override
Widget build(BuildContext context) {
return ListView.builder(
itemCount: widget.models.length + 1,
itemCount: widget.models!.length + 1,
shrinkWrap: true,
padding: EdgeInsets.only(top: 16.toScreenHeight),
itemBuilder: (context, index) {
if (index == widget.models.length) {
if (index == widget.models!.length) {
return AppFilledButton(
label: context.translation.addItem,
maxWidth: true,
@ -36,21 +36,21 @@ class _PentryPMKitFormState extends State<PentryPMKitForm> {
buttonColor: context.isDark ? AppColor.neutral60 : AppColor.neutral50,
onPressed: () async {
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}");
return;
}
if (widget.models.last.partName == null) {
if (widget.models!.last.partName == null) {
await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.partName}");
return;
}
}
widget.models.add(PpmKits(id: 0));
widget.models!.add(PpmKits(id: 0));
setState(() {});
},
);
}
final model = widget.models[index];
final model = widget.models![index];
return Container(
padding: const EdgeInsets.all(16),
margin: EdgeInsets.only(bottom: 16.toScreenHeight),
@ -67,7 +67,7 @@ class _PentryPMKitFormState extends State<PentryPMKitForm> {
children: [
"${context.translation.item} ${index + 1}".heading5(context),
"trash".toSvgAsset(width: 15, height: 20).onPress(() {
widget.models.remove(model);
widget.models!.remove(model);
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';
class PentryPMChecklistForm extends StatefulWidget {
final List<PpmChecklists> models;
final List<PpmChecklists>? models;
const PentryPMChecklistForm({Key? key, this.models}) : super(key: key);
@ -25,19 +25,18 @@ class _PentryPMChecklistFormState extends State<PentryPMChecklistForm> {
@override
Widget build(BuildContext context) {
final list =
widget.models?.where((element) => element.task != null)?.toList();
List<PpmChecklists>? list = widget.models?.where((element) => element.task != null).toList();
return (list?.isEmpty ?? true)
? context.translation.noDataFound.heading5(context).center
: ListView.builder(
padding: EdgeInsets.only(top: 16.toScreenHeight),
itemCount: list?.length,
itemCount: list?.length ?? 0,
shrinkWrap: true,
itemBuilder: (context, index) {
return Card(
child: ExpansionTile(
shape: const Border(),
title: (list[index].task ?? "").heading5(context),
title: (list![index].task ?? "").heading5(context),
onExpansionChanged: (value) {
if (!value) {
showLabel.remove(index);
@ -46,28 +45,16 @@ class _PentryPMChecklistFormState extends State<PentryPMChecklistForm> {
}
setState(() {});
},
subtitle: showLabel.isNotEmpty && showLabel.contains(index)
? null
: "${context.translation.status} ${list[index].taskStatusName}"
.bodyText(context),
iconColor:
context.isDark ? AppColor.neutral30 : AppColor.neutral50,
collapsedIconColor:
context.isDark ? AppColor.neutral30 : AppColor.neutral50,
childrenPadding: EdgeInsets.symmetric(
horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight),
subtitle: showLabel.isNotEmpty && showLabel.contains(index) ? null : "${context.translation.status} ${list[index].taskStatusName}".bodyText(context),
iconColor: context.isDark ? AppColor.neutral30 : AppColor.neutral50,
collapsedIconColor: context.isDark ? AppColor.neutral30 : AppColor.neutral50,
childrenPadding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight),
children: [
if (showLabel.isNotEmpty && showLabel.contains(index))
SingleItemDropDownMenu<Lookup,
PpmChecklistStatusProvider>(
SingleItemDropDownMenu<Lookup, PpmChecklistStatusProvider>(
context: context,
backgroundColor:
context.isDark ? AppColor.neutral50 : null,
initialValue: list[index].taskStatusId == null
? null
: Lookup(
id: list[index].taskStatusId,
name: list[index].taskStatusName),
backgroundColor: context.isDark ? AppColor.neutral50 : null,
initialValue: list[index].taskStatusId == null ? null : Lookup(id: list[index].taskStatusId!.toInt(), name: list[index].taskStatusName),
title: context.translation.status,
onSelect: (value) {
if (value != null) {
@ -76,14 +63,12 @@ class _PentryPMChecklistFormState extends State<PentryPMChecklistForm> {
}
},
),
if (showLabel.isNotEmpty && showLabel.contains(index))
8.height,
if (showLabel.isNotEmpty && showLabel.contains(index)) 8.height,
AppTextFormField(
labelText: context.translation.measuredValue,
initialValue: list[index].measuredValue,
initialValue: list[index].measuredValue ?? "",
// enable: false,
backgroundColor:
context.isDark ? AppColor.neutral20 : null,
backgroundColor: context.isDark ? AppColor.neutral20 : null,
// backgroundColor: context.isDark ? AppColor.neutral50 : null,
onChange: (text) {
list[index].measuredValue = text;
@ -92,10 +77,9 @@ class _PentryPMChecklistFormState extends State<PentryPMChecklistForm> {
8.height,
AppTextFormField(
labelText: context.translation.comment,
initialValue: list[index].taskComment,
initialValue: list[index].taskComment ?? "",
// enable: false,
backgroundColor:
context.isDark ? AppColor.neutral20 : null,
backgroundColor: context.isDark ? AppColor.neutral20 : null,
// backgroundColor: context.isDark ? AppColor.neutral50 : null,
onChange: (text) {
list[index].taskComment = text;

@ -29,22 +29,22 @@ import '../timer/app_timer.dart';
class PentryTBSForm extends StatefulWidget {
final Ppm model;
const PentryTBSForm({Key? key, this.model}) : super(key: key);
const PentryTBSForm({Key? key, required this.model}) : super(key: key);
@override
State<PentryTBSForm> createState() => _PentryTBSFormState();
}
class _PentryTBSFormState extends State<PentryTBSForm> {
SupplierDetails initialSupplier;
SuppPersons _suppPerson;
SupplierDetails? initialSupplier;
SuppPersons? _suppPerson;
@override
Widget build(BuildContext context) {
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;
@ -55,11 +55,11 @@ class _PentryTBSFormState extends State<PentryTBSForm> {
8.height,
SingleItemDropDownMenu<Lookup, PPMVisitStatusProvider>(
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,
onSelect: (value) {
if (value?.value == 4) {
"Status cannot be change to ${value.name}.".addTranslation.showToast;
"Status cannot be change to ${value?.name}.".addTranslation.showToast;
setState(() {});
return;
}
@ -101,7 +101,7 @@ class _PentryTBSFormState extends State<PentryTBSForm> {
AppTimer(
label: context.translation.timer,
timer: widget.model.tbsTimer,
enabled: widget.model.tbsTimer.endAt == null,
enabled: widget.model.tbsTimer?.endAt == null,
timerProgress: (isRunning) {
print("timerProgress:$isRunning");
},
@ -113,7 +113,7 @@ class _PentryTBSFormState extends State<PentryTBSForm> {
8.height,
SingleItemDropDownMenu<Lookup, PPMDeviceStatusProvider>(
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,
onSelect: (value) {
if (value != null) {
@ -125,7 +125,7 @@ class _PentryTBSFormState extends State<PentryTBSForm> {
8.height,
SingleItemDropDownMenu<Lookup, PpmTaskStatusProvider>(
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,
onSelect: (value) {
if (value != null) {
@ -137,7 +137,7 @@ class _PentryTBSFormState extends State<PentryTBSForm> {
8.height,
SingleItemDropDownMenu<Lookup, PpmAssetAvailabilityProvider>(
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",
onSelect: (value) {
if (value != null) {
@ -149,7 +149,7 @@ class _PentryTBSFormState extends State<PentryTBSForm> {
8.height,
SingleItemDropDownMenu<Lookup, PpmElectricalSafetyProvider>(
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",
onSelect: (value) {
if (value != null) {
@ -161,7 +161,7 @@ class _PentryTBSFormState extends State<PentryTBSForm> {
8.height,
SingleItemDropDownMenu<Lookup, PpmServiceProvider>(
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,
onSelect: (value) {
if (value != null) {
@ -230,7 +230,7 @@ class _PentryTBSFormState extends State<PentryTBSForm> {
AppTimer(
label: "External Supplier Timer",
timer: widget.model.externalEngineerTimer,
enabled: widget.model.externalEngineerTimer.endAt == null,
enabled: widget.model.externalEngineerTimer?.endAt == null,
timerProgress: (isRunning) {
print("timerProgress:$isRunning");
},
@ -247,7 +247,7 @@ class _PentryTBSFormState extends State<PentryTBSForm> {
from: DateTime.now().subtract(const Duration(days: 30)),
onDatePicker: (date) {
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;
return;
}
@ -282,7 +282,7 @@ class _PentryTBSFormState extends State<PentryTBSForm> {
8.height,
MultiFilesPicker(
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) {
widget.model.files = files.map((e) => PpmAttachments(attachmentName: e.path)).toList();
},

@ -17,9 +17,9 @@ import '../requests/request_status.dart';
class PpmItem extends StatelessWidget {
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
Widget build(BuildContext context) {
@ -32,24 +32,24 @@ class PpmItem extends StatelessWidget {
children: [
Row(
children: [
if (request.priority != null)
if (request?.priority != null)
StatusLabel(
label: request.priority,
textColor: AppColor.getRequestStatusTextColorByName(context, request.priority),
backgroundColor: AppColor.getRequestStatusColorByName(context, request.priority),
label: request!.priority,
textColor: AppColor.getRequestStatusTextColorByName(context, request!.priority!),
backgroundColor: AppColor.getRequestStatusColorByName(context, request!.priority!),
),
if (request.priority != null) 8.width,
if (request?.priority != null) 8.width,
StatusLabel(
label: ppm.visitStatusName,
id: ppm.deviceStatusId,
textColor: AppColor.getRequestStatusTextColorByName(context, ppm.visitStatusName),
backgroundColor: AppColor.getRequestStatusColorByName(context, ppm.visitStatusName),
id: ppm.deviceStatusId!.toInt(),
textColor: AppColor.getRequestStatusTextColorByName(context, ppm.visitStatusName!),
backgroundColor: AppColor.getRequestStatusColorByName(context, ppm.visitStatusName!),
),
1.width.expanded,
],
),
8.height,
ppm.assetName.heading5(context),
ppm.assetName!.heading5(context),
8.height,
'${context.translation.assetNumber}: ${ppm.assetNumber}'.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)
],
).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,
@ -74,13 +74,13 @@ class PpmItem extends StatelessWidget {
Column(
crossAxisAlignment: CrossAxisAlignment.end,
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(() {
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(
ppm.createdOn != null ? ppm.createdOn.toServiceRequestCardFormat : "",
ppm.createdOn?.toServiceRequestCardFormat ?? "",
textAlign: TextAlign.end,
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 {
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;
@override
@ -24,11 +24,11 @@ class AssetScanQr extends StatefulWidget {
}
class _AssetScanQrState extends State<AssetScanQr> {
Barcode result;
QRViewController _controller;
// Barcode result;
QRViewController? _controller;
bool _scanDone = false;
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
// 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 {
if (!_scanDone) {
_scanDone = true;
final result = await _getDevice(scanData.code, isQr: true);
final result = await _getDevice(scanData.code!, isQr: true);
if (result.isNotEmpty) {
Navigator.of(context).pop(result[0]);
} else {

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

@ -14,7 +14,7 @@ class ServiceRequestItem extends StatelessWidget {
final ServiceRequest request;
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
Widget build(BuildContext context) {
@ -34,8 +34,8 @@ class ServiceRequestItem extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
StatusLabel(
label: request.priority.name,
id: request.priority.id,
label: request.priority!.name,
id: request.priority!.id!,
/* textColor: AColors.getPriorityStatusTextColor(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)*/
),
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,
@ -54,11 +54,11 @@ class ServiceRequestItem extends StatelessWidget {
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : Color(0xFF757575)),
),
Text(
'${context.translation.assetNumber}: ${request.device.assetNumber}',
'${context.translation.assetNumber}: ${request.device!.assetNumber}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : Color(0xFF757575)),
),
Text(
'${context.translation.requestType}: ${request.type.name}',
'${context.translation.requestType}: ${request.type!.name}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : Color(0xFF757575)),
),
Text(

@ -14,7 +14,7 @@ class ServiceRequestsList extends StatelessWidget {
final bool nextPage;
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
Widget build(BuildContext context) {

Loading…
Cancel
Save