From be4c8d76533a87a2a921bb543cf8226c9875fda0 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Thu, 12 Sep 2024 09:57:36 +0300 Subject: [PATCH] null safety conversation complete --- lib/attachment.dart | 15 +- .../providers/api/all_requests_provider.dart | 4 +- .../api/service_requests_provider.dart | 247 ++++++------ .../providers/settings/setting_provider.dart | 10 +- lib/controllers/validator/validator.dart | 2 +- lib/main.dart | 22 +- .../service_request/service_report.dart | 2 +- lib/new_views/app_style/app_color.dart | 4 +- .../common_widgets/app_text_form_field.dart | 9 +- .../single_item_drop_down_menu.dart | 4 +- .../requests/gas_refill_item_view.dart | 2 +- .../components/activities_list_view.dart | 16 +- .../activity_type_bottomsheet.dart | 2 +- .../initial_visit_bottomsheet.dart | 24 +- .../reject_request_bottomsheet.dart | 14 +- .../service_request_bottomsheet.dart | 89 ++--- .../views/components/request_detail_view.dart | 8 +- .../views/components/spare_part_request.dart | 6 +- .../views/components/verify_arrival_view.dart | 2 +- lib/utilities/general_utils.dart | 95 +++-- .../device_transfer/asset_filter_screen.dart | 25 +- .../device_transfer/asset_search_screen.dart | 10 +- .../device_transfer_details.dart | 44 +-- .../request_device_transfer.dart | 12 +- .../device_transfer/search_asset_page.dart | 22 +- .../track_device_transfer.dart | 18 +- .../update_device_transfer.dart | 62 ++- .../create_sub_workorder_page.dart | 128 +++---- .../user/gas_refill/gas_refill_comments.dart | 19 +- .../user/gas_refill/gas_refill_details.dart | 34 +- .../user/gas_refill/request_gas_refill.dart | 74 ++-- .../user/gas_refill/track_gas_refill.dart | 32 +- .../notifications/notifications_list.dart | 4 +- .../notifications/notifications_page.dart | 10 +- .../pages/user/ppm/ppm_details_page.dart | 26 +- lib/views/pages/user/ppm/ppm_page.dart | 19 +- .../pages/user/ppm/update_ppm/edit_ppm.dart | 18 +- lib/views/pages/user/profile_page.dart | 32 +- lib/views/pages/user/report_issues_page.dart | 358 +++++++++--------- .../add_supplier_engineer_bottom_sheet.dart | 8 +- .../user/requests/comments_bottom_sheet.dart | 12 +- .../requests/create_service_request_page.dart | 66 ++-- .../requests/first_action_bottom_sheet.dart | 18 +- .../future_request_service_details.dart | 102 ++--- .../requests/pending_requests_screen.dart | 22 +- .../pages/user/requests/requests_page.dart | 15 +- .../requests/service_request_details.dart | 64 ++-- .../requests/update_service_request_page.dart | 50 +-- .../work_order/create_service_report.dart | 49 +-- .../work_order/edit_service_report.dart | 50 +-- .../requests/work_order/part_no_button.dart | 20 +- .../work_order/update_service_report.dart | 8 +- .../work_order/work_order_details_page.dart | 40 +- .../work_order/work_orders_list_page.dart | 28 +- .../pending_request_bottom_sheet.dart | 2 +- .../bottom_sheets/selection_bottom_sheet.dart | 12 +- .../widgets/buttons/app_back_button.dart | 4 +- lib/views/widgets/buttons/app_button.dart | 31 +- .../widgets/buttons/app_icon_button.dart | 26 +- .../widgets/buttons/app_icon_button2.dart | 64 ++-- .../widgets/buttons/rounded_back_button.dart | 58 +-- .../widgets/date_and_time/time_picker.dart | 57 ++- .../widgets/departments/department_item.dart | 2 +- .../departments/single_department_picker.dart | 18 +- .../device_trancfer/device_transfer_item.dart | 4 +- .../device_trancfer/device_transfer_list.dart | 2 +- lib/views/widgets/dialogs/dialog.dart | 8 +- .../widgets/e_signature/e_signature.dart | 32 +- .../widgets/equipment/asset_detail_page.dart | 37 +- .../equipment/asset_item_gridview.dart | 8 +- .../equipment/asset_item_listview.dart | 10 +- lib/views/widgets/equipment/asset_picker.dart | 18 +- .../commissioning_status_buttons.dart | 12 +- lib/views/widgets/equipment/pick_asset.dart | 2 +- .../equipment/single_device_picker.dart | 16 +- .../widgets/gas_refill/gas_refill_item.dart | 14 +- .../widgets/gas_refill/gas_refill_list.dart | 2 +- .../widgets/hospitals/hospital_item.dart | 8 +- .../hospitals/single_hospital_picker.dart | 180 ++++----- lib/views/widgets/images/files_list.dart | 132 ++++--- lib/views/widgets/images/image_item.dart | 117 +++--- .../widgets/images/multi_image_picker.dart | 37 +- .../images/multi_image_picker_item.dart | 22 +- .../widgets/issues/report_issue_item.dart | 10 +- lib/views/widgets/loaders/failed_loading.dart | 6 +- lib/views/widgets/loaders/image_loader.dart | 12 +- lib/views/widgets/loaders/no_item_found.dart | 8 +- .../notifications/notification_item.dart | 20 +- .../parts/auto_complete_parts_field.dart | 12 +- .../pentry/calibration_tool_asset_picker.dart | 27 +- .../pentry/pentry_calibration_tool_form.dart | 24 +- .../widgets/pentry/pentry_pm_kit_form.dart | 20 +- .../pentry/pentry_ppm_check_list_form.dart | 48 +-- lib/views/widgets/pentry/pentry_tbs_form.dart | 32 +- lib/views/widgets/ppm/ppm_item.dart | 30 +- lib/views/widgets/qr/asset_scan_qr.dart | 10 +- lib/views/widgets/qr/scan_qr.dart | 4 +- .../requests/service_request_item.dart | 12 +- .../requests/service_request_list.dart | 2 +- 99 files changed, 1603 insertions(+), 1685 deletions(-) diff --git a/lib/attachment.dart b/lib/attachment.dart index ce9f97d3..c6700d92 100644 --- a/lib/attachment.dart +++ b/lib/attachment.dart @@ -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, ); diff --git a/lib/controllers/providers/api/all_requests_provider.dart b/lib/controllers/providers/api/all_requests_provider.dart index 168e2231..01f7c27b 100644 --- a/lib/controllers/providers/api/all_requests_provider.dart +++ b/lib/controllers/providers/api/all_requests_provider.dart @@ -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) { diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index 6e704523..f40457bc 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -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 serviceRequests; + List? serviceRequests; List workOrders = []; List _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 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 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 _requests = jsonList.map((i) => ServiceRequest.fromJson(i)).toList(); - return _requests[0]; - } else { - throw (HttpStatusManger.getStatusMessage(status: response.statusCode, subtitle: subtitle)); - } - } + // Future 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 _requests = jsonList.map((i) => ServiceRequest.fromJson(i)).toList(); + // return _requests[0]; + // } else { + // throw (HttpStatusManger.getStatusMessage(status: response.statusCode, subtitle: subtitle)); + // } + // } Future 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 createIssueReport({ - required String host, - required User user, - required Issue issue, - }) async { - Response response; - Map 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 checkAssetPendingRequest(int assetId) async { + // Future createIssueReport({ + // required String host, + // required User user, + // required Issue issue, + // }) async { + // Response response; + // Map 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 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 updateRequest({required User user, required ServiceRequest request}) async { isLoading = true; notifyListeners(); - Map serviceRequest = await getServiceRequestById(requestId: request.id) ?? ""; + Map serviceRequest = await getServiceRequestById(requestId: request.id!); final List callSiteContacts = (serviceRequest['callSiteContactPerson'] as List); final Map 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 getCallRequestForWorkOrder({String? callId}) async { + Future 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 getSubWorkOrderDetails({required String parentId}) async { + Future 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 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 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 updateServiceReport(BuildContext context, {required ServiceReport report}) async { Response response; - report.callRequest = CallRequest(id: report.callRequest.id); + report.callRequest = CallRequest(id: report.callRequest!.id!); Map body = report.toJson(); try { showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); @@ -573,20 +568,15 @@ class ServiceRequestsProvider extends ChangeNotifier { } } - Future updateServiceReportTimer({ - required String host, - required User user, - required TimerModel timer, - required ServiceRequest request, - }) async { + Future updateServiceReportTimer({required String host, required User user, required TimerModel timer, required ServiceRequest request}) async { Response response; Map 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 getServiceRequestObjectById({required String requestId}) async { + Future 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> 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 addSupplierEngineer(SupplierEngineer supplierEngineer) async { + Future 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; diff --git a/lib/controllers/providers/settings/setting_provider.dart b/lib/controllers/providers/settings/setting_provider.dart index 5097310a..7202f2b9 100644 --- a/lib/controllers/providers/settings/setting_provider.dart +++ b/lib/controllers/providers/settings/setting_provider.dart @@ -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); diff --git a/lib/controllers/validator/validator.dart b/lib/controllers/validator/validator.dart index bb84dfca..f3b3428b 100644 --- a/lib/controllers/validator/validator.dart +++ b/lib/controllers/validator/validator.dart @@ -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; } diff --git a/lib/main.dart b/lib/main.dart index ecf46317..47ebe4a4 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -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(), diff --git a/lib/models/service_request/service_report.dart b/lib/models/service_request/service_report.dart index 83dfa4f3..56a1da6f 100644 --- a/lib/models/service_request/service_report.dart +++ b/lib/models/service_request/service_report.dart @@ -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(); diff --git a/lib/new_views/app_style/app_color.dart b/lib/new_views/app_style/app_color.dart index 417a7ce1..e8e17a8e 100644 --- a/lib/new_views/app_style/app_color.dart +++ b/lib/new_views/app_style/app_color.dart @@ -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); diff --git a/lib/new_views/common_widgets/app_text_form_field.dart b/lib/new_views/common_widgets/app_text_form_field.dart index a105cada..da1e7a8a 100644 --- a/lib/new_views/common_widgets/app_text_form_field.dart +++ b/lib/new_views/common_widgets/app_text_form_field.dart @@ -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 { @override void initState() { - widget.controller?.text = widget.initialValue; // Use null-aware operator + if (widget.initialValue != null) { + widget.controller?.text = widget.initialValue!; + } + super.initState(); } diff --git a/lib/new_views/common_widgets/single_item_drop_down_menu.dart b/lib/new_views/common_widgets/single_item_drop_down_menu.dart index f15bcb29..55090049 100644 --- a/lib/new_views/common_widgets/single_item_drop_down_menu.dart +++ b/lib/new_views/common_widgets/single_item_drop_down_menu.dart @@ -16,7 +16,7 @@ class SingleItemDropDownMenu exte final T? initialValue; final bool enabled; final bool showAsBottomSheet; - final List staticData; + final List? staticData; final String title; final double? height; final bool showShadow; @@ -34,7 +34,7 @@ class SingleItemDropDownMenu 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, diff --git a/lib/new_views/pages/land_page/requests/gas_refill_item_view.dart b/lib/new_views/pages/land_page/requests/gas_refill_item_view.dart index 8a4fb3db..36f922db 100644 --- a/lib/new_views/pages/land_page/requests/gas_refill_item_view.dart +++ b/lib/new_views/pages/land_page/requests/gas_refill_item_view.dart @@ -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), ), diff --git a/lib/service_request_latest/views/components/activities_list_view.dart b/lib/service_request_latest/views/components/activities_list_view.dart index 60144d52..51865184 100644 --- a/lib/service_request_latest/views/components/activities_list_view.dart +++ b/lib/service_request_latest/views/components/activities_list_view.dart @@ -35,7 +35,7 @@ class ActivitiesListView extends StatelessWidget { body: Consumer(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; @@ -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, diff --git a/lib/service_request_latest/views/components/bottom_sheets/activity_type_bottomsheet.dart b/lib/service_request_latest/views/components/bottom_sheets/activity_type_bottomsheet.dart index 7bce4ae2..72cf5b25 100644 --- a/lib/service_request_latest/views/components/bottom_sheets/activity_type_bottomsheet.dart +++ b/lib/service_request_latest/views/components/bottom_sheets/activity_type_bottomsheet.dart @@ -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); }); }, ), diff --git a/lib/service_request_latest/views/components/bottom_sheets/initial_visit_bottomsheet.dart b/lib/service_request_latest/views/components/bottom_sheets/initial_visit_bottomsheet.dart index 3e48d19a..a8c90f5b 100644 --- a/lib/service_request_latest/views/components/bottom_sheets/initial_visit_bottomsheet.dart +++ b/lib/service_request_latest/views/components/bottom_sheets/initial_visit_bottomsheet.dart @@ -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(context, listen: false).assetGroup!.id == 1) ...[ + if (serviceRequestProvider.currentSelectedRequest?.firstAction?.id == 404 && Provider.of(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, diff --git a/lib/service_request_latest/views/components/bottom_sheets/reject_request_bottomsheet.dart b/lib/service_request_latest/views/components/bottom_sheets/reject_request_bottomsheet.dart index 3ff9376c..1a07e1f5 100644 --- a/lib/service_request_latest/views/components/bottom_sheets/reject_request_bottomsheet.dart +++ b/lib/service_request_latest/views/components/bottom_sheets/reject_request_bottomsheet.dart @@ -54,13 +54,13 @@ class RejectRequestBottomSheet extends StatelessWidget { SingleItemDropDownMenu( 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); }, ), diff --git a/lib/service_request_latest/views/components/bottom_sheets/service_request_bottomsheet.dart b/lib/service_request_latest/views/components/bottom_sheets/service_request_bottomsheet.dart index b6712e5d..21ec9609 100644 --- a/lib/service_request_latest/views/components/bottom_sheets/service_request_bottomsheet.dart +++ b/lib/service_request_latest/views/components/bottom_sheets/service_request_bottomsheet.dart @@ -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(context, listen: false).assetGroup.id == 1) ...[ + if (serviceRequestProvider.currentSelectedRequest?.firstAction?.id == 404 && Provider.of(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( 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 _formKey = GlobalKey(); final userProvider = Provider.of(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, ), ), ], diff --git a/lib/service_request_latest/views/components/request_detail_view.dart b/lib/service_request_latest/views/components/request_detail_view.dart index abc0f95f..1fb51bcc 100644 --- a/lib/service_request_latest/views/components/request_detail_view.dart +++ b/lib/service_request_latest/views/components/request_detail_view.dart @@ -84,7 +84,7 @@ class _RequestDetailViewState extends State { 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 { try { //use a common list AllRequestsProvider allRequestProvider = Provider.of(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 { ), 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 { 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); }, diff --git a/lib/service_request_latest/views/components/spare_part_request.dart b/lib/service_request_latest/views/components/spare_part_request.dart index 48517776..3f9dfffa 100644 --- a/lib/service_request_latest/views/components/spare_part_request.dart +++ b/lib/service_request_latest/views/components/spare_part_request.dart @@ -69,7 +69,7 @@ class _SparePartRequestState extends State with TickerProvider ServiceRequestsProvider serviceRequestsProvider = Provider.of(context, listen: false); Provider.of(context, listen: false).reset(); Provider.of(context, listen: false).reset(); - Provider.of(context, listen: false).serviceRequestId = serviceRequestsProvider.currentSelectedRequest.id; + Provider.of(context, listen: false).serviceRequestId = serviceRequestsProvider.currentSelectedRequest?.id; } // _isLoading = true; } @@ -88,12 +88,12 @@ class _SparePartRequestState extends State with TickerProvider _isLoading = true; setState(() {}); ServiceRequestsProvider serviceRequestsProvider = Provider.of(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(() {}); } diff --git a/lib/service_request_latest/views/components/verify_arrival_view.dart b/lib/service_request_latest/views/components/verify_arrival_view.dart index da3059d1..68df42e2 100644 --- a/lib/service_request_latest/views/components/verify_arrival_view.dart +++ b/lib/service_request_latest/views/components/verify_arrival_view.dart @@ -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); }); }, ), diff --git a/lib/utilities/general_utils.dart b/lib/utilities/general_utils.dart index d5548eae..08e06ce4 100644 --- a/lib/utilities/general_utils.dart +++ b/lib/utilities/general_utils.dart @@ -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 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); - } -} \ No newline at end of file +// 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 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); +// } +// } diff --git a/lib/views/pages/device_transfer/asset_filter_screen.dart b/lib/views/pages/device_transfer/asset_filter_screen.dart index 422b71c5..29773bfd 100644 --- a/lib/views/pages/device_transfer/asset_filter_screen.dart +++ b/lib/views/pages/device_transfer/asset_filter_screen.dart @@ -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 { - 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 { WidgetsFlutterBinding.ensureInitialized().addPostFrameCallback((timeStamp) async { loading = true; setState(() {}); - startDate = filter.supplyDateFrom; - endDate = filter.supplyDateTo; + startDate = filter!.supplyDateFrom; + endDate = filter!.supplyDateTo; final departmentProvider = Provider.of(context, listen: false); final siteProvider = Provider.of(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 { CommissioningStatusButtons( initialValue: _commissioningStatus, onSelect: (value) { - if (value == null) { - /// the selected value is [All Assets] + if (value != null) { + _commissioningStatus = value; } - _commissioningStatus = value; }, ), 16.height, diff --git a/lib/views/pages/device_transfer/asset_search_screen.dart b/lib/views/pages/device_transfer/asset_search_screen.dart index 007895b7..56de844c 100644 --- a/lib/views/pages/device_transfer/asset_search_screen.dart +++ b/lib/views/pages/device_transfer/asset_search_screen.dart @@ -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 { - AssetSearch search; + late AssetSearch search; final GlobalKey _formKey = GlobalKey(); - 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 { } void _search() async { - if (_formKey.currentState.validate()) { - _formKey.currentState.save(); + if (_formKey.currentState!.validate()) { + _formKey.currentState!.save(); final deviceProvider = Provider.of(context, listen: false); deviceProvider.reset(); showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); diff --git a/lib/views/pages/device_transfer/device_transfer_details.dart b/lib/views/pages/device_transfer/device_transfer_details.dart index 0a0313d9..50db3178 100644 --- a/lib/views/pages/device_transfer/device_transfer_details.dart +++ b/lib/views/pages/device_transfer/device_transfer_details.dart @@ -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 createState() => _DeviceTransferDetailsState(); } class _DeviceTransferDetailsState extends State { - UserProvider _userProvider; - AssetTransfer _model; + UserProvider? _userProvider; + AssetTransfer? _model; bool _isLoading = false; final GlobalKey _formKey = GlobalKey(); final GlobalKey _scaffoldKey = GlobalKey(); @@ -46,12 +46,12 @@ class _DeviceTransferDetailsState extends State { key: _scaffoldKey, body: SafeArea( child: FutureBuilder( - future: Provider.of(context).getRequestById(assetTransferId: widget.model.id), + future: Provider.of(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 { 8.height, const Divider().defaultStyle(context), 8.height, - _buildTextWidget(_model?.comment), + _buildTextWidget(_model!.comment!), ] ], ), @@ -110,7 +110,7 @@ class _DeviceTransferDetailsState extends State { // ), 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 { /// 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 { /// 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 { 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 { 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 { // "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(() {}); } diff --git a/lib/views/pages/device_transfer/request_device_transfer.dart b/lib/views/pages/device_transfer/request_device_transfer.dart index bc1412af..fed0c557 100644 --- a/lib/views/pages/device_transfer/request_device_transfer.dart +++ b/lib/views/pages/device_transfer/request_device_transfer.dart @@ -38,7 +38,7 @@ class RequestDeviceTransfer extends StatefulWidget { class _RequestDeviceTransferState extends State { UserProvider? _userProvider; SettingProvider? _settingProvider; - AssetTransferProvider? _deviceTransferProvider; + late AssetTransferProvider _deviceTransferProvider; final TextEditingController _requestedQuantityController = TextEditingController(); final AssetTransfer _transferModel = AssetTransfer(); final GlobalKey _formKey = GlobalKey(); @@ -61,12 +61,12 @@ class _RequestDeviceTransferState extends State { _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 { _assetDestination.floor = null; _assetDestination.department = null; _selectedNurse = null; - Provider.of(context, listen: false).siteId = value.id!.toInt(); + Provider.of(context, listen: false).siteId = value!.id!.toInt(); Provider.of(context, listen: false).getData(); setState(() {}); }, diff --git a/lib/views/pages/device_transfer/search_asset_page.dart b/lib/views/pages/device_transfer/search_asset_page.dart index 9491f4a9..cdb9a769 100644 --- a/lib/views/pages/device_transfer/search_asset_page.dart +++ b/lib/views/pages/device_transfer/search_asset_page.dart @@ -29,9 +29,9 @@ class SearchAssetPage extends StatefulWidget { class _SearchAssetPageState extends State { int _selectedIndex = 0; - AssetSearch search; - TextEditingController _searchController; - AssetProvider _deviceProvider; + AssetSearch? search; + late TextEditingController _searchController; + late AssetProvider _deviceProvider; List _searchableList = []; final GlobalKey _formKey = GlobalKey(); bool _isFirst = true; @@ -44,7 +44,7 @@ class _SearchAssetPageState extends State { @override void dispose() { - _searchController?.dispose(); + _searchController.dispose(); _deviceProvider.searchReset(); super.dispose(); } @@ -158,10 +158,10 @@ class _SearchAssetPageState extends State { 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 { /// 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; diff --git a/lib/views/pages/device_transfer/track_device_transfer.dart b/lib/views/pages/device_transfer/track_device_transfer.dart index e3d7f355..4db6cc2e 100644 --- a/lib/views/pages/device_transfer/track_device_transfer.dart +++ b/lib/views/pages/device_transfer/track_device_transfer.dart @@ -19,9 +19,9 @@ class TrackDeviceTransferPage extends StatefulWidget { } class _TrackDeviceTransferPageState extends State 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 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 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!, ), ), ], diff --git a/lib/views/pages/device_transfer/update_device_transfer.dart b/lib/views/pages/device_transfer/update_device_transfer.dart index 7902acfc..7f7f6141 100644 --- a/lib/views/pages/device_transfer/update_device_transfer.dart +++ b/lib/views/pages/device_transfer/update_device_transfer.dart @@ -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 createState() => _UpdateDeviceTransferState(); @@ -47,10 +43,10 @@ class UpdateDeviceTransfer extends StatefulWidget { class _UpdateDeviceTransferState extends State { 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 _formKey = GlobalKey(); @@ -60,7 +56,7 @@ class _UpdateDeviceTransferState extends State { _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 { ), ); } else { - _formModel.receiverVisitTimers.add( + _formModel.receiverVisitTimers?.add( VisitTimers( id: 0, startDateTime: _formModel.tbsTimer?.startAt?.toIso8601String(), @@ -88,11 +84,11 @@ class _UpdateDeviceTransferState extends State { 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 { } 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 { _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 { _deviceTransferProvider = Provider.of(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 { _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 { return SingleItemDropDownMenu( 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 { 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 { 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); } diff --git a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart index 14b5bb9e..33f82401 100644 --- a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart +++ b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart @@ -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 { final GlobalKey _formKey = GlobalKey(); - SearchWorkOrder _subWorkOrders; - ServiceReport _serviceReport; - PartsProvider _partsProvider; + late SearchWorkOrder _subWorkOrders; + late ServiceReport _serviceReport; + late PartsProvider _partsProvider; final List _files = []; List _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 { 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(context, listen: false).reset(); Provider.of(context, listen: false).reset(); - Provider.of(context, listen: false).serviceRequestId = widget.workOrder.callRequest.id.toString(); + Provider.of(context, listen: false).serviceRequestId = widget.workOrder?.callRequest!.id.toString(); } } - ServiceStatusProvider assetTypesProvider; - CallRequest _callRequestForWorkOrder; + late ServiceStatusProvider assetTypesProvider; + CallRequest? _callRequestForWorkOrder; Future getAssetType() async { Provider.of(context, listen: false).reset(); final serviceRequestProvider = Provider.of(context); Provider.of(context, listen: false).reset(); assetTypesProvider = Provider.of(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 { }); } - Asset loanAvailabilityAsset; + Asset? loanAvailabilityAsset; @override void dispose() { @@ -146,8 +147,8 @@ class _CreateSubWorkOrderPageState extends State { @override Widget build(BuildContext context) { - final user = Provider.of(context).user; - final isCurrentUserIsAssistantEmp = (user.userID != widget.workOrder.assignedEmployee?.id); + final user = Provider.of(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 { 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 { 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 { 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 { 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 { 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 { 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 { 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 { 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 { } }, ), - 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 { 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 { 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 { ); } - 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 { } 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) { diff --git a/lib/views/pages/user/gas_refill/gas_refill_comments.dart b/lib/views/pages/user/gas_refill/gas_refill_comments.dart index c5e802cf..24e5f806 100644 --- a/lib/views/pages/user/gas_refill/gas_refill_comments.dart +++ b/lib/views/pages/user/gas_refill/gas_refill_comments.dart @@ -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 { final GlobalKey _formKey = GlobalKey(); - GasRefillCommentsProvider commentsProvider; - String text; + late GasRefillCommentsProvider commentsProvider; + String? text; @override void initState() { @@ -44,7 +43,7 @@ class _GasRefillCommentsBottomSheetState extends State(context); + commentsProvider = Provider.of(context); final userProvider = Provider.of(context, listen: false); return Container( height: MediaQuery.of(context).size.height * 0.6, @@ -102,7 +101,7 @@ class _GasRefillCommentsBottomSheetState extends State 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) { diff --git a/lib/views/pages/user/gas_refill/gas_refill_details.dart b/lib/views/pages/user/gas_refill/gas_refill_details.dart index f1f1e844..99977c37 100644 --- a/lib/views/pages/user/gas_refill/gas_refill_details.dart +++ b/lib/views/pages/user/gas_refill/gas_refill_details.dart @@ -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 createState() => _GasRefillDetailsPageState(); @@ -31,7 +31,7 @@ class GasRefillDetailsPage extends StatefulWidget { class _GasRefillDetailsPageState extends State { GasRefillModel _model = GasRefillModel(gazRefillDetails: []); - UserProvider _userProvider; + late UserProvider _userProvider; bool _isLoading = false; final GlobalKey _formKey = GlobalKey(); @@ -54,12 +54,12 @@ class _GasRefillDetailsPageState extends State { 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 { 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 { 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 { 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 { }); }, ), - 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 { ).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 { mainAxisSize: MainAxisSize.min, children: [ Text( - '${context.translation.viewComments}', + context.translation.viewComments, style: AppTextStyles.bodyText.copyWith(color: AppColor.blueStatus(context)), ), 4.width, diff --git a/lib/views/pages/user/gas_refill/request_gas_refill.dart b/lib/views/pages/user/gas_refill/request_gas_refill.dart index 2fd8c745..06130c95 100644 --- a/lib/views/pages/user/gas_refill/request_gas_refill.dart +++ b/lib/views/pages/user/gas_refill/request_gas_refill.dart @@ -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 { 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 { 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 { } 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 { Future _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 { //_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 { _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 { 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 { 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 { 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 { 8.height, ESignature( title: "Nurse Signature", - oldSignature: widget.gasRefillModel.nurseSignature, + oldSignature: widget.gasRefillModel?.nurseSignature, newSignature: _nurseSignature, onSaved: (signature) { _nurseSignature = signature; diff --git a/lib/views/pages/user/gas_refill/track_gas_refill.dart b/lib/views/pages/user/gas_refill/track_gas_refill.dart index 7ae9867f..66d6df62 100644 --- a/lib/views/pages/user/gas_refill/track_gas_refill.dart +++ b/lib/views/pages/user/gas_refill/track_gas_refill.dart @@ -19,16 +19,16 @@ class TrackGasRefillPage extends StatefulWidget { } class _TrackGasRefillPageState extends State 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(context); - _gasRefillProvider.reset(); + _gasRefillProvider!.reset(); } _userProvider = Provider.of(context); _settingProvider = Provider.of(context); @@ -37,16 +37,12 @@ class _TrackGasRefillPageState extends State 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 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 ?? [], ), ), ], diff --git a/lib/views/pages/user/notifications/notifications_list.dart b/lib/views/pages/user/notifications/notifications_list.dart index 3fc9ecdf..04145836 100644 --- a/lib/views/pages/user/notifications/notifications_list.dart +++ b/lib/views/pages/user/notifications/notifications_list.dart @@ -12,7 +12,7 @@ class NotificationsList extends StatelessWidget { final bool nextPage; final Future Function() onLazyLoad; - const NotificationsList({Key? key, this.notifications, this.nextPage, this.onLazyLoad}) : super(key: key); + const NotificationsList({Key? key, this.notifications = const [], 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()); }, ); }, diff --git a/lib/views/pages/user/notifications/notifications_page.dart b/lib/views/pages/user/notifications/notifications_page.dart index 9d481cd7..3366a82d 100644 --- a/lib/views/pages/user/notifications/notifications_page.dart +++ b/lib/views/pages/user/notifications/notifications_page.dart @@ -17,9 +17,9 @@ class NotificationsPage extends StatefulWidget { } class _NotificationsPageState extends State 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 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 with TickerProvid nextPage: _notificationsProvider.nextPage, onLazyLoad: () async { await _notificationsProvider.getSystemNotifications( - user: _userProvider.user, + user: _userProvider.user!, // host: _settingProvider.host, // hospitalId: _userProvider.user.clientId, ); diff --git a/lib/views/pages/user/ppm/ppm_details_page.dart b/lib/views/pages/user/ppm/ppm_details_page.dart index d530ddd4..30488e02 100644 --- a/lib/views/pages/user/ppm/ppm_details_page.dart +++ b/lib/views/pages/user/ppm/ppm_details_page.dart @@ -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 { - UserProvider userProvider; + UserProvider? userProvider; - PpmProvider ppmProvider; + PpmProvider? ppmProvider; @override void initState() { @@ -55,12 +55,12 @@ class _PpmDetailsPageState extends State { 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 { 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 { '${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))); diff --git a/lib/views/pages/user/ppm/ppm_page.dart b/lib/views/pages/user/ppm/ppm_page.dart index 7a24acea..04a40945 100644 --- a/lib/views/pages/user/ppm/ppm_page.dart +++ b/lib/views/pages/user/ppm/ppm_page.dart @@ -22,9 +22,9 @@ class PpmPage extends StatefulWidget { } class _PpmPageState extends State 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 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)); }, ), diff --git a/lib/views/pages/user/ppm/update_ppm/edit_ppm.dart b/lib/views/pages/user/ppm/update_ppm/edit_ppm.dart index 21c98aea..f9711f22 100644 --- a/lib/views/pages/user/ppm/update_ppm/edit_ppm.dart +++ b/lib/views/pages/user/ppm/update_ppm/edit_ppm.dart @@ -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 createState() => _EditPpmState(); } class _EditPpmState extends State with SingleTickerProviderStateMixin { - UserProvider _userProvider; - PpmProvider _regularVisitsProvider; - Ppm _ppm; + late UserProvider _userProvider; + late PpmProvider _regularVisitsProvider; + late Ppm _ppm; final GlobalKey _scaffoldKey = GlobalKey(); - TabController _tabController; + late TabController _tabController; _onSubmit() async { if (!(await _ppm.validate(context))) { @@ -42,7 +42,7 @@ class _EditPpmState extends State 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 with SingleTickerProviderStateMixin { @override Widget build(BuildContext context) { - _userProvider = Provider.of(context,listen: false); - _regularVisitsProvider = Provider.of(context,listen: false); + _userProvider = Provider.of(context, listen: false); + _regularVisitsProvider = Provider.of(context, listen: false); return Scaffold( appBar: DefaultAppBar(title: context.translation.preventiveMaintenance), key: _scaffoldKey, diff --git a/lib/views/pages/user/profile_page.dart b/lib/views/pages/user/profile_page.dart index 8cf64fda..fb40b5af 100644 --- a/lib/views/pages/user/profile_page.dart +++ b/lib/views/pages/user/profile_page.dart @@ -25,10 +25,10 @@ class ProfilePage extends StatefulWidget { } class _ProfilePageState extends State { - 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 _formKey = GlobalKey(); @@ -42,7 +42,7 @@ class _ProfilePageState extends State { _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 { 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 { 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 { ); if (croppedFile != null) { - await snapshot.uploadProfileImage(_user.userID, File(croppedFile.path)); - Provider.of(context, listen: false).setUser(_userProvider.user); + await snapshot.uploadProfileImage(_user.userID!, File(croppedFile.path)); + Provider.of(context, listen: false).setUser(_userProvider.user!); } } }), @@ -120,7 +120,7 @@ class _ProfilePageState extends State { ); }), 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 { 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 { 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, ], ], diff --git a/lib/views/pages/user/report_issues_page.dart b/lib/views/pages/user/report_issues_page.dart index bb934eb4..93e59193 100644 --- a/lib/views/pages/user/report_issues_page.dart +++ b/lib/views/pages/user/report_issues_page.dart @@ -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 { - List _issues = []; - Issue _issue = Issue(reports: []); - double _height; - bool _isLoading = false; - ServiceRequestsProvider _serviceRequestsProvider; - UserProvider _userProvider; - SettingProvider _settingProvider; - final GlobalKey _formKey = GlobalKey(); - - @override - Widget build(BuildContext context) { - _serviceRequestsProvider = Provider.of(context); - _userProvider = Provider.of(context); - _settingProvider = Provider.of(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 { +// List _issues = []; +// Issue _issue = Issue(reports: []); +// late double _height; +// bool _isLoading = false; +// late ServiceRequestsProvider _serviceRequestsProvider; +// late UserProvider _userProvider; +// late SettingProvider _settingProvider; +// final GlobalKey _formKey = GlobalKey(); +// +// @override +// Widget build(BuildContext context) { +// _serviceRequestsProvider = Provider.of(context); +// _userProvider = Provider.of(context); +// _settingProvider = Provider.of(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(), +// ], +// ), +// ), +// ), +// ), +// ); +// } +// } diff --git a/lib/views/pages/user/requests/add_supplier_engineer_bottom_sheet.dart b/lib/views/pages/user/requests/add_supplier_engineer_bottom_sheet.dart index 68bb029a..96bdb7fc 100644 --- a/lib/views/pages/user/requests/add_supplier_engineer_bottom_sheet.dart +++ b/lib/views/pages/user/requests/add_supplier_engineer_bottom_sheet.dart @@ -30,7 +30,7 @@ class AddSupplierEngineerBottomSheet extends StatefulWidget { class _AddSupplierEngineerBottomSheetState extends State { final GlobalKey _formKey = GlobalKey(); - Lookup suppEngRole; + Lookup? suppEngRole; SupplierEngineer engineer = SupplierEngineer(); @@ -119,9 +119,9 @@ class _AddSupplierEngineerBottomSheetState extends State { final GlobalKey _formKey = GlobalKey(); - String text; + String? text; @override void initState() { @@ -100,7 +100,7 @@ class _CommentsBottomSheetState extends State { 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 { ], ), ), - 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 { 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); } diff --git a/lib/views/pages/user/requests/create_service_request_page.dart b/lib/views/pages/user/requests/create_service_request_page.dart index e78412c8..a426173d 100644 --- a/lib/views/pages/user/requests/create_service_request_page.dart +++ b/lib/views/pages/user/requests/create_service_request_page.dart @@ -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 { - 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 _deviceImages = []; bool _isLoading = false; bool _showDatePicker = false; final GlobalKey _formKey = GlobalKey(); final GlobalKey _scaffoldKey = GlobalKey(); - DateTime _dateTime; + DateTime? _dateTime; bool isFirstActionSubmitted = false; @@ -58,11 +58,11 @@ class CreateServiceRequestPageState extends State { 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 { return url.startsWith("/") || url.startsWith("file://") || url.substring(1).startsWith(':\\'); } - bool priority; + // bool priority; void getData() { Provider.of(context).getDate(); @@ -111,7 +111,7 @@ class CreateServiceRequestPageState extends State { Provider.of(context).getDate(); } - PendingAssetServiceRequest pendingAssetServiceRequest; + PendingAssetServiceRequest? pendingAssetServiceRequest; @override Widget build(BuildContext context) { @@ -151,21 +151,21 @@ class CreateServiceRequestPageState extends State { 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 { children: [ Text(context.translation.priority, style: Theme.of(context).textTheme.bodyLarge), Consumer(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 { 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 { }), ), 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 { 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 { 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 { ), ), 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 { } Future _submit() async { - _serviceRequest?.requestedThrough = Provider.of(context, listen: false).items?.firstWhere((element) => element.value == 3, orElse: () => null); - _serviceRequest?.type = Provider.of(context, listen: false).items?.firstWhere((element) => element.value == 1, orElse: () => null); + _serviceRequest?.requestedThrough = Provider.of(context, listen: false).items?.firstWhere((element) => element.value == 3, orElse: null); + _serviceRequest?.type = Provider.of(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 { _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, ); } diff --git a/lib/views/pages/user/requests/first_action_bottom_sheet.dart b/lib/views/pages/user/requests/first_action_bottom_sheet.dart index bba25d73..c329eb63 100644 --- a/lib/views/pages/user/requests/first_action_bottom_sheet.dart +++ b/lib/views/pages/user/requests/first_action_bottom_sheet.dart @@ -29,11 +29,11 @@ class FirstActionBottomSheet extends StatefulWidget { } class _FirstActionBottomSheetState extends State { - ServiceRequest _serviceRequest; - Asset asset; + late ServiceRequest _serviceRequest; + Asset? asset; final GlobalKey _formKey = GlobalKey(); - Lookup firstAction; + Lookup? firstAction; @override void initState() { @@ -77,7 +77,7 @@ class _FirstActionBottomSheetState extends State { 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 { 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 { ), ], - if (firstAction?.id == 404 && Provider.of(context, listen: false).assetGroup.id == 1) ...[ + if (firstAction?.id == 404 && Provider.of(context, listen: false).assetGroup!.id == 1) ...[ 8.height, Row( children: [ @@ -178,7 +178,7 @@ class _FirstActionBottomSheetState extends State { 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 { 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); }, ), diff --git a/lib/views/pages/user/requests/future_request_service_details.dart b/lib/views/pages/user/requests/future_request_service_details.dart index 8ec71c3f..8d8c7769 100644 --- a/lib/views/pages/user/requests/future_request_service_details.dart +++ b/lib/views/pages/user/requests/future_request_service_details.dart @@ -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 { - UserProvider _userProvider; - SettingProvider _settingProvider; - - @override - Widget build(BuildContext context) { - _userProvider = Provider.of(context); - _settingProvider = Provider.of(context); - String requestId = ModalRoute.of(context).settings.arguments; - - return Scaffold( - body: FutureBuilder( - future: ServiceRequestsProvider().getSingleServiceRequest(requestId: requestId, user: _userProvider.user, host: _settingProvider.host, subtitle: context.translation), - builder: (BuildContext context, AsyncSnapshot 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 { +// UserProvider _userProvider; +// SettingProvider _settingProvider; +// +// @override +// Widget build(BuildContext context) { +// _userProvider = Provider.of(context); +// _settingProvider = Provider.of(context); +// String requestId = ModalRoute.of(context).settings.arguments; +// +// return Scaffold( +// body: FutureBuilder( +// future: ServiceRequestsProvider().getSingleServiceRequest(requestId: requestId, user: _userProvider.user, host: _settingProvider.host, subtitle: context.translation), +// builder: (BuildContext context, AsyncSnapshot snapshot) { +// if (snapshot.hasError) { +// return FailedLoading( +// message: snapshot.error.toString(), +// onReload: () { +// setState(() {}); +// }, +// ); +// } +// if (snapshot.hasData) { +// return ServiceRequestDetailsPage( +// serviceRequest: snapshot.data, +// ); +// } +// return Center(child: ALoading()); +// }, +// ), +// ); +// } +// } diff --git a/lib/views/pages/user/requests/pending_requests_screen.dart b/lib/views/pages/user/requests/pending_requests_screen.dart index 9faa0911..1c8eee35 100644 --- a/lib/views/pages/user/requests/pending_requests_screen.dart +++ b/lib/views/pages/user/requests/pending_requests_screen.dart @@ -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()), ))); }))); } diff --git a/lib/views/pages/user/requests/requests_page.dart b/lib/views/pages/user/requests/requests_page.dart index 9f020ca3..c8b53489 100644 --- a/lib/views/pages/user/requests/requests_page.dart +++ b/lib/views/pages/user/requests/requests_page.dart @@ -16,9 +16,9 @@ class ServiceRequestsPage extends StatefulWidget { } class _ServiceRequestsPageState extends State 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 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!, ), ), ), diff --git a/lib/views/pages/user/requests/service_request_details.dart b/lib/views/pages/user/requests/service_request_details.dart index 24b7f417..c90cd223 100644 --- a/lib/views/pages/user/requests/service_request_details.dart +++ b/lib/views/pages/user/requests/service_request_details.dart @@ -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 createState() => _ServiceRequestDetailsPageState(); @@ -35,7 +35,7 @@ class ServiceRequestDetailsPage extends StatefulWidget { class _ServiceRequestDetailsPageState extends State { bool loading = false; - ServiceRequest serviceRequest; + ServiceRequest? serviceRequest; @override void initState() { @@ -48,7 +48,7 @@ class _ServiceRequestDetailsPageState extends State { setState(() {}); WidgetsFlutterBinding.ensureInitialized().addPostFrameCallback((timeStamp) async { Provider.of(context, listen: false).reset(); - serviceRequest = await Provider.of(context, listen: false).getServiceRequestObjectById(requestId: widget.serviceRequest.id); + serviceRequest = await Provider.of(context, listen: false).getServiceRequestObjectById(requestId: widget.serviceRequest.id!); loading = false; setState(() {}); }); @@ -75,34 +75,34 @@ class _ServiceRequestDetailsPageState extends State { 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 { 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 { 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 { 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 { 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 { 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 { useSafeArea: true, isScrollControlled: true, backgroundColor: Colors.transparent, - builder: (context) => FirstActionBottomSheet(request: serviceRequest), + builder: (context) => FirstActionBottomSheet(request: serviceRequest!), )) as bool; if (shouldReloadData ?? false) { getServiceRequest(); diff --git a/lib/views/pages/user/requests/update_service_request_page.dart b/lib/views/pages/user/requests/update_service_request_page.dart index 2aa2427a..f05db2c8 100644 --- a/lib/views/pages/user/requests/update_service_request_page.dart +++ b/lib/views/pages/user/requests/update_service_request_page.dart @@ -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 createState() => _UpdateServiceRequestPageState(); @@ -38,15 +38,15 @@ class UpdateServiceRequestPage extends StatefulWidget { class _UpdateServiceRequestPageState extends State { final GlobalKey _formKey = GlobalKey(); - TextEditingController _commentController; + late TextEditingController _commentController; List _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 { 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 { 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 { 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 { 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 { 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 { 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 { } Future _submit() async { - widget.serviceRequest?.requestedThrough = Provider.of(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(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(context, listen: false).updateRequest(user: _userProvider.user, request: widget.serviceRequest); + await Provider.of(context, listen: false).updateRequest(user: _userProvider.user!, request: widget.serviceRequest!); Navigator.of(context).pop(); } } diff --git a/lib/views/pages/user/requests/work_order/create_service_report.dart b/lib/views/pages/user/requests/work_order/create_service_report.dart index d2d74283..0c4018f4 100644 --- a/lib/views/pages/user/requests/work_order/create_service_report.dart +++ b/lib/views/pages/user/requests/work_order/create_service_report.dart @@ -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 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 _spareParts = []; @@ -84,7 +85,7 @@ class _CreateServiceReportState extends State with TickerPr // _isLoading = true; } - Asset loanAvailabilityAsset; + Asset? loanAvailabilityAsset; @override void dispose() { @@ -97,7 +98,7 @@ class _CreateServiceReportState extends State 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 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 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 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 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 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 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 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 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 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 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(context, listen: false).user; + final user = Provider.of(context, listen: false).user!; await _serviceRequestsProvider.createServiceReport(context, report: _serviceReport, request: widget.request, user: user); }, ), diff --git a/lib/views/pages/user/requests/work_order/edit_service_report.dart b/lib/views/pages/user/requests/work_order/edit_service_report.dart index 35ffe975..6c4c6a67 100644 --- a/lib/views/pages/user/requests/work_order/edit_service_report.dart +++ b/lib/views/pages/user/requests/work_order/edit_service_report.dart @@ -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 with TickerProviderStateMixin { - UserProvider _userProvider; - SettingProvider _settingProvider; - ServiceRequestsProvider _serviceRequestsProvider; + late UserProvider _userProvider; + late SettingProvider _settingProvider; + late ServiceRequestsProvider _serviceRequestsProvider; List _spareParts = []; - ServiceReport _serviceReport; + late ServiceReport _serviceReport; bool _isLoading = false; List _files = []; final GlobalKey _formKey = GlobalKey(); @@ -63,28 +63,28 @@ class _EditServiceReportState extends State 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(context, listen: false).reset(); - Provider.of(context, listen: false).serviceRequestId = _serviceReport.callRequest.id.toString(); + Provider.of(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 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 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 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 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 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 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 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); diff --git a/lib/views/pages/user/requests/work_order/part_no_button.dart b/lib/views/pages/user/requests/work_order/part_no_button.dart index cd16097c..ee62bb76 100644 --- a/lib/views/pages/user/requests/work_order/part_no_button.dart +++ b/lib/views/pages/user/requests/work_order/part_no_button.dart @@ -14,10 +14,10 @@ import '../../../../../providers/loading_list_notifier.dart'; class PartNoButton extends StatefulWidget { final List spareParts; - final List initialList; + final List? initialList; final TextEditingController controller; final bool disablePartEdit; - final Function(List sparePart) onChange; + final Function(List 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 { 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 { 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 { 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 { : 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 { : 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 ?? ""); diff --git a/lib/views/pages/user/requests/work_order/update_service_report.dart b/lib/views/pages/user/requests/work_order/update_service_report.dart index b972a63d..13a0d7ed 100644 --- a/lib/views/pages/user/requests/work_order/update_service_report.dart +++ b/lib/views/pages/user/requests/work_order/update_service_report.dart @@ -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 { @override Widget build(BuildContext context) { - ServiceRequestsProvider().getSingleServiceReport(context, reportId: widget.workOrder.id); + ServiceRequestsProvider().getSingleServiceReport(context, reportId: widget.workOrder.id!.toInt()); return Scaffold( body: FutureBuilder( - future: ServiceRequestsProvider().getSingleServiceReport(context, reportId: widget.workOrder.id), + future: ServiceRequestsProvider().getSingleServiceReport(context, reportId: widget.workOrder.id!.toInt()), builder: (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.hasError) { return FailedLoading( @@ -35,7 +35,7 @@ class _UpdateServiceReportState extends State { ); } 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()); }, diff --git a/lib/views/pages/user/requests/work_order/work_order_details_page.dart b/lib/views/pages/user/requests/work_order/work_order_details_page.dart index 197ac228..12250fd1 100644 --- a/lib/views/pages/user/requests/work_order/work_order_details_page.dart +++ b/lib/views/pages/user/requests/work_order/work_order_details_page.dart @@ -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( - future: Provider.of(context).getSingleServiceReport(context, reportId: workOrder.id), + future: Provider.of(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( diff --git a/lib/views/pages/user/requests/work_order/work_orders_list_page.dart b/lib/views/pages/user/requests/work_order/work_orders_list_page.dart index 4183f7a9..5e962503 100644 --- a/lib/views/pages/user/requests/work_order/work_orders_list_page.dart +++ b/lib/views/pages/user/requests/work_order/work_orders_list_page.dart @@ -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(context); - // SettingProvider _settingProvider = Provider.of(context); List workOrders = []; - ServiceRequestsProvider serviceRequestsProvider; - UserProvider _userProvider = Provider.of(context); - serviceRequestsProvider ??= Provider.of(context); + _userProvider = Provider.of(context); + serviceRequestsProvider = Provider.of(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; @@ -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) ], diff --git a/lib/views/widgets/bottom_sheets/pending_request_bottom_sheet.dart b/lib/views/widgets/bottom_sheets/pending_request_bottom_sheet.dart index 0b5fd66e..abf907c8 100644 --- a/lib/views/widgets/bottom_sheets/pending_request_bottom_sheet.dart +++ b/lib/views/widgets/bottom_sheets/pending_request_bottom_sheet.dart @@ -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, diff --git a/lib/views/widgets/bottom_sheets/selection_bottom_sheet.dart b/lib/views/widgets/bottom_sheets/selection_bottom_sheet.dart index 35622c21..9ad146bf 100644 --- a/lib/views/widgets/bottom_sheets/selection_bottom_sheet.dart +++ b/lib/views/widgets/bottom_sheets/selection_bottom_sheet.dart @@ -8,12 +8,12 @@ import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; typedef SelectionBuilderString = String Function(dynamic); class SelectionBottomSheet extends StatefulWidget { - final List items; + final List? 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(); @@ -24,7 +24,7 @@ class _SelectionBottomSheetState extends State> { String query = ""; - List get filteredList => widget.items.where((element) => widget.builderString(element).toLowerCase().contains(query.toLowerCase())).toList(); + List? get filteredList => widget.items?.where((element) => widget.builderString(element).toLowerCase().contains(query.toLowerCase())).toList(); @override void initState() { @@ -76,11 +76,11 @@ class _SelectionBottomSheetState extends State> { Expanded( // Wrap ListView with Expanded child: ListView.builder( - itemCount: filteredList.length, + itemCount: filteredList?.length, padding: const EdgeInsets.only(top: 8), itemBuilder: (cxt, index) => RadioListTile( // Specify type for RadioListTile - value: filteredList[index], + value: filteredList![index], dense: true, contentPadding: EdgeInsets.zero, groupValue: _selectedValue, @@ -91,7 +91,7 @@ class _SelectionBottomSheetState extends State> { setState(() {}); }, title: Text( - widget.builderString(filteredList[index]).cleanupWhitespace?.capitalizeFirstOfEach ?? "", + widget.builderString(filteredList![index]).cleanupWhitespace?.capitalizeFirstOfEach ?? "", style: Theme.of(context).textTheme.bodyLarge, ), ), diff --git a/lib/views/widgets/buttons/app_back_button.dart b/lib/views/widgets/buttons/app_back_button.dart index 06708ca0..a1ba5bb6 100644 --- a/lib/views/widgets/buttons/app_back_button.dart +++ b/lib/views/widgets/buttons/app_back_button.dart @@ -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); diff --git a/lib/views/widgets/buttons/app_button.dart b/lib/views/widgets/buttons/app_button.dart index 55306a41..59817b7e 100644 --- a/lib/views/widgets/buttons/app_button.dart +++ b/lib/views/widgets/buttons/app_button.dart @@ -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), ), ), ); } -} +} \ No newline at end of file diff --git a/lib/views/widgets/buttons/app_icon_button.dart b/lib/views/widgets/buttons/app_icon_button.dart index 198a8d91..7ceebf6a 100644 --- a/lib/views/widgets/buttons/app_icon_button.dart +++ b/lib/views/widgets/buttons/app_icon_button.dart @@ -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, ), ), diff --git a/lib/views/widgets/buttons/app_icon_button2.dart b/lib/views/widgets/buttons/app_icon_button2.dart index fff4421d..965838ac 100644 --- a/lib/views/widgets/buttons/app_icon_button2.dart +++ b/lib/views/widgets/buttons/app_icon_button2.dart @@ -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, +// ), +// ); +// } +// } diff --git a/lib/views/widgets/buttons/rounded_back_button.dart b/lib/views/widgets/buttons/rounded_back_button.dart index f05e8b1d..a6029824 100644 --- a/lib/views/widgets/buttons/rounded_back_button.dart +++ b/lib/views/widgets/buttons/rounded_back_button.dart @@ -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 +// ), +// ), +// ); +// } +// } diff --git a/lib/views/widgets/date_and_time/time_picker.dart b/lib/views/widgets/date_and_time/time_picker.dart index d1b2b2cf..7196512a 100644 --- a/lib/views/widgets/date_and_time/time_picker.dart +++ b/lib/views/widgets/date_and_time/time_picker.dart @@ -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); } } diff --git a/lib/views/widgets/departments/department_item.dart b/lib/views/widgets/departments/department_item.dart index 17119878..8e9cdd41 100644 --- a/lib/views/widgets/departments/department_item.dart +++ b/lib/views/widgets/departments/department_item.dart @@ -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) { diff --git a/lib/views/widgets/departments/single_department_picker.dart b/lib/views/widgets/departments/single_department_picker.dart index f9c83959..3abf4797 100644 --- a/lib/views/widgets/departments/single_department_picker.dart +++ b/lib/views/widgets/departments/single_department_picker.dart @@ -18,8 +18,8 @@ class SingleDepartmentPicker extends StatefulWidget { } class _SingleDepartmentPickerState extends State { - DepartmentsProvider _departmentsProvider; - SettingProvider _settingProvider; + late DepartmentsProvider _departmentsProvider; + late SettingProvider _settingProvider; List _searchableList = []; bool _firstTime = true; @@ -28,7 +28,7 @@ class _SingleDepartmentPickerState extends State { _departmentsProvider = Provider.of(context); _settingProvider = Provider.of(context); if (_firstTime && _departmentsProvider.departments != null) { - _searchableList.addAll(_departmentsProvider.departments); + _searchableList.addAll(_departmentsProvider.departments!); _firstTime = false; } @@ -40,24 +40,20 @@ class _SingleDepartmentPickerState extends State { 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(() {}); }, ), diff --git a/lib/views/widgets/device_trancfer/device_transfer_item.dart b/lib/views/widgets/device_trancfer/device_transfer_item.dart index bfdc2363..38dd7a44 100644 --- a/lib/views/widgets/device_trancfer/device_transfer_item.dart +++ b/lib/views/widgets/device_trancfer/device_transfer_item.dart @@ -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))), ], ), diff --git a/lib/views/widgets/device_trancfer/device_transfer_list.dart b/lib/views/widgets/device_trancfer/device_transfer_list.dart index fa5f542f..1c287d2c 100644 --- a/lib/views/widgets/device_trancfer/device_transfer_list.dart +++ b/lib/views/widgets/device_trancfer/device_transfer_list.dart @@ -11,7 +11,7 @@ class DeviceTransferList extends StatelessWidget { final bool nextPage; final Future 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) { diff --git a/lib/views/widgets/dialogs/dialog.dart b/lib/views/widgets/dialogs/dialog.dart index 473c2a69..56788636 100644 --- a/lib/views/widgets/dialogs/dialog.dart +++ b/lib/views/widgets/dialogs/dialog.dart @@ -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: [ TextButton( // child: Text(_subtitle.confirm), diff --git a/lib/views/widgets/e_signature/e_signature.dart b/lib/views/widgets/e_signature/e_signature.dart index d40311c6..6afd7aa3 100644 --- a/lib/views/widgets/e_signature/e_signature.dart +++ b/lib/views/widgets/e_signature/e_signature.dart @@ -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 createState() => _ESignatureState(); @@ -25,9 +25,9 @@ class ESignature extends StatefulWidget { class _ESignatureState extends State { // 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 { @override void dispose() { - _controller.dispose(); + _controller?.dispose(); super.dispose(); } @@ -55,7 +55,7 @@ class _ESignatureState extends State { ); print(widget.oldSignature); return FormField(onSaved: (_) async { - widget.onSaved(signature); + if (widget.onSaved != null) widget.onSaved!(signature); }, builder: (FormFieldState state) { return Column( children: [ @@ -87,9 +87,9 @@ class _ESignatureState extends State { )) .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 { 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 { 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: () { diff --git a/lib/views/widgets/equipment/asset_detail_page.dart b/lib/views/widgets/equipment/asset_detail_page.dart index 41e3ef2e..4831447f 100644 --- a/lib/views/widgets/equipment/asset_detail_page.dart +++ b/lib/views/widgets/equipment/asset_detail_page.dart @@ -37,18 +37,18 @@ class _AssetDetailPageState extends State { 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(context, listen: false); _assetProvider?.stateCode = null; return Scaffold( appBar: DefaultAppBar(title: context.translation.assetDetails), body: FutureBuilder( - future: _assetProvider.getAssetById(assetId, context.translation), + future: _assetProvider!.getAssetById(assetId!, context.translation), builder: (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.hasError) { return FailedLoading( @@ -62,7 +62,7 @@ class _AssetDetailPageState extends State { 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 { ), 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 { 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 { 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 { 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 { 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), ] ], ) diff --git a/lib/views/widgets/equipment/asset_item_gridview.dart b/lib/views/widgets/equipment/asset_item_gridview.dart index 50854733..cc463097 100644 --- a/lib/views/widgets/equipment/asset_item_gridview.dart +++ b/lib/views/widgets/equipment/asset_item_gridview.dart @@ -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, diff --git a/lib/views/widgets/equipment/asset_item_listview.dart b/lib/views/widgets/equipment/asset_item_listview.dart index 6b88eacf..26ee3ab8 100644 --- a/lib/views/widgets/equipment/asset_item_listview.dart +++ b/lib/views/widgets/equipment/asset_item_listview.dart @@ -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( diff --git a/lib/views/widgets/equipment/asset_picker.dart b/lib/views/widgets/equipment/asset_picker.dart index ceb91c2a..438a3a1a 100644 --- a/lib/views/widgets/equipment/asset_picker.dart +++ b/lib/views/widgets/equipment/asset_picker.dart @@ -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), diff --git a/lib/views/widgets/equipment/commissioning_status_buttons.dart b/lib/views/widgets/equipment/commissioning_status_buttons.dart index 9edf8730..9887745d 100644 --- a/lib/views/widgets/equipment/commissioning_status_buttons.dart +++ b/lib/views/widgets/equipment/commissioning_status_buttons.dart @@ -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 WidgetsFlutterBinding.ensureInitialized().addPostFrameCallback((timeStamp) { final provider = Provider.of(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 if (widget.initialValue != oldWidget.initialValue) { final provider = Provider.of(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 ), 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]); }), ), ); diff --git a/lib/views/widgets/equipment/pick_asset.dart b/lib/views/widgets/equipment/pick_asset.dart index fb543d02..94f89ab3 100644 --- a/lib/views/widgets/equipment/pick_asset.dart +++ b/lib/views/widgets/equipment/pick_asset.dart @@ -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), ], diff --git a/lib/views/widgets/equipment/single_device_picker.dart b/lib/views/widgets/equipment/single_device_picker.dart index 0ef510ed..d2cb14ee 100644 --- a/lib/views/widgets/equipment/single_device_picker.dart +++ b/lib/views/widgets/equipment/single_device_picker.dart @@ -34,13 +34,13 @@ class MyAssetsPage extends StatefulWidget { } class _MyAssetsPageState extends State { - AssetProvider _devicesProvider; - UserProvider _userProvider; - SettingProvider _settingProvider; + late AssetProvider _devicesProvider; + late UserProvider _userProvider; + late SettingProvider _settingProvider; List _searchableList = []; List _initList = []; bool _firstTime = true; - AssetSearch _searchAsset; + AssetSearch? _searchAsset; bool showListView = true; @@ -135,7 +135,7 @@ class _MyAssetsPageState extends State { 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 { 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, diff --git a/lib/views/widgets/gas_refill/gas_refill_item.dart b/lib/views/widgets/gas_refill/gas_refill_item.dart index 2ab6a566..4cf4af7d 100644 --- a/lib/views/widgets/gas_refill/gas_refill_item.dart +++ b/lib/views/widgets/gas_refill/gas_refill_item.dart @@ -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, diff --git a/lib/views/widgets/gas_refill/gas_refill_list.dart b/lib/views/widgets/gas_refill/gas_refill_list.dart index 71083653..1bd20761 100644 --- a/lib/views/widgets/gas_refill/gas_refill_list.dart +++ b/lib/views/widgets/gas_refill/gas_refill_list.dart @@ -12,7 +12,7 @@ class GasRefillList extends StatefulWidget { final bool nextPage; final Future 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 createState() => _GasRefillListState(); diff --git a/lib/views/widgets/hospitals/hospital_item.dart b/lib/views/widgets/hospitals/hospital_item.dart index aa8c5751..e33ce630 100644 --- a/lib/views/widgets/hospitals/hospital_item.dart +++ b/lib/views/widgets/hospitals/hospital_item.dart @@ -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 ?? "", diff --git a/lib/views/widgets/hospitals/single_hospital_picker.dart b/lib/views/widgets/hospitals/single_hospital_picker.dart index d2e40bdb..98368c20 100644 --- a/lib/views/widgets/hospitals/single_hospital_picker.dart +++ b/lib/views/widgets/hospitals/single_hospital_picker.dart @@ -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 { - HospitalsProvider _hospitalsProvider; - SettingProvider _settingProvider; - List _searchableList = []; - bool _firstTime = true; - - @override - Widget build(BuildContext context) { - _hospitalsProvider = Provider.of(context); - _settingProvider = Provider.of(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 { +// late HospitalsProvider _hospitalsProvider; +// SettingProvider _settingProvider; +// List _searchableList = []; +// bool _firstTime = true; +// +// @override +// Widget build(BuildContext context) { +// _hospitalsProvider = Provider.of(context); +// _settingProvider = Provider.of(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); +// }, +// ); +// }, +// ), +// ), +// ], +// ), +// ), +// ); +// } +// } diff --git a/lib/views/widgets/images/files_list.dart b/lib/views/widgets/images/files_list.dart index 7bfb27c4..d27330a5 100644 --- a/lib/views/widgets/images/files_list.dart +++ b/lib/views/widgets/images/files_list.dart @@ -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 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 [], 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(':\\'); } } diff --git a/lib/views/widgets/images/image_item.dart b/lib/views/widgets/images/image_item.dart index 0140b6c1..4cec3801 100644 --- a/lib/views/widgets/images/image_item.dart +++ b/lib/views/widgets/images/image_item.dart @@ -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, +// ), +// ), +// )), +// ), +// ], +// ), +// ), +// ); +// } +// } diff --git a/lib/views/widgets/images/multi_image_picker.dart b/lib/views/widgets/images/multi_image_picker.dart index 7df9c61e..206f8fd0 100644 --- a/lib/views/widgets/images/multi_image_picker.dart +++ b/lib/views/widgets/images/multi_image_picker.dart @@ -18,10 +18,11 @@ class MultiFilesPicker extends StatefulWidget { final bool error; final List files; final bool enabled, onlyImages; - final Function(List) onChange; + final Function(List)? 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 [], required this.label, this.error = false, this.enabled = true, this.onlyImages = false, this.onChange, this.showAsGrid = false}) + : super(key: key); @override State createState() => _MultiFilesPickerState(); @@ -33,7 +34,13 @@ class _MultiFilesPickerState extends State { 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 { } 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 { } 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 { 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 { 12.height, ], ).paddingAll(21), - )) as ImageSource; + )) as ImageSource?; if (source == null) return; @@ -122,13 +129,11 @@ class _MultiFilesPickerState extends State { 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 { Fluttertoast.showToast(msg: context.translation.maxImagesNumberIs5); return; } - ImageSource source = await showDialog( + ImageSource? source = await showDialog( context: context, builder: (dialogContext) => CupertinoAlertDialog( actions: [ @@ -194,7 +199,7 @@ class _MultiFilesPickerState extends State { if (fileImage != null) { widget.files.add(fileImage); if (widget.onChange != null) { - widget.onChange(widget.files); + widget.onChange!(widget.files); } setState(() {}); } diff --git a/lib/views/widgets/images/multi_image_picker_item.dart b/lib/views/widgets/images/multi_image_picker_item.dart index 8215529f..c95ee4c8 100644 --- a/lib/views/widgets/images/multi_image_picker_item.dart +++ b/lib/views/widgets/images/multi_image_picker_item.dart @@ -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(':\\'); diff --git a/lib/views/widgets/issues/report_issue_item.dart b/lib/views/widgets/issues/report_issue_item.dart index 893715a0..a8c54cec 100644 --- a/lib/views/widgets/issues/report_issue_item.dart +++ b/lib/views/widgets/issues/report_issue_item.dart @@ -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!); }, ), ), diff --git a/lib/views/widgets/loaders/failed_loading.dart b/lib/views/widgets/loaders/failed_loading.dart index 5f1e1a66..e8306fb3 100644 --- a/lib/views/widgets/loaders/failed_loading.dart +++ b/lib/views/widgets/loaders/failed_loading.dart @@ -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( diff --git a/lib/views/widgets/loaders/image_loader.dart b/lib/views/widgets/loaders/image_loader.dart index fc867288..676a130a 100644 --- a/lib/views/widgets/loaders/image_loader.dart +++ b/lib/views/widgets/loaders/image_loader.dart @@ -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); diff --git a/lib/views/widgets/loaders/no_item_found.dart b/lib/views/widgets/loaders/no_item_found.dart index c1ef410c..68523534 100644 --- a/lib/views/widgets/loaders/no_item_found.dart +++ b/lib/views/widgets/loaders/no_item_found.dart @@ -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) { diff --git a/lib/views/widgets/notifications/notification_item.dart b/lib/views/widgets/notifications/notification_item.dart index 09955e0c..c03614ed 100644 --- a/lib/views/widgets/notifications/notification_item.dart +++ b/lib/views/widgets/notifications/notification_item.dart @@ -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, diff --git a/lib/views/widgets/parts/auto_complete_parts_field.dart b/lib/views/widgets/parts/auto_complete_parts_field.dart index 05c9bde1..4c1386c6 100644 --- a/lib/views/widgets/parts/auto_complete_parts_field.dart +++ b/lib/views/widgets/parts/auto_complete_parts_field.dart @@ -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 { - SettingProvider _settingProvider; - PartsProvider _partsProvider; - UserProvider _userProvider; - TextEditingController _controller; + late SettingProvider _settingProvider; + late PartsProvider _partsProvider; + late UserProvider _userProvider; + late TextEditingController _controller; @override void initState() { diff --git a/lib/views/widgets/pentry/calibration_tool_asset_picker.dart b/lib/views/widgets/pentry/calibration_tool_asset_picker.dart index 5c0c40b0..eb0ea85a 100644 --- a/lib/views/widgets/pentry/calibration_tool_asset_picker.dart +++ b/lib/views/widgets/pentry/calibration_tool_asset_picker.dart @@ -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 createState() => _CalibrationToolAssetPickerState(); } class _CalibrationToolAssetPickerState extends State { - 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 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)); }, ), ], diff --git a/lib/views/widgets/pentry/pentry_calibration_tool_form.dart b/lib/views/widgets/pentry/pentry_calibration_tool_form.dart index 825b386d..4f3b82f6 100644 --- a/lib/views/widgets/pentry/pentry_calibration_tool_form.dart +++ b/lib/views/widgets/pentry/pentry_calibration_tool_form.dart @@ -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 models; + final List? models; - const PentryCalibrationToolForm({Key? key, this.models}) : super(key: key); + const PentryCalibrationToolForm({Key? key, this.models = const []}) : super(key: key); @override State createState() => _PentryCalibrationToolFormState(); @@ -30,10 +28,10 @@ class _PentryCalibrationToolFormState extends State { Widget build(BuildContext context) { final userProvider = Provider.of(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 { 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 { 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; diff --git a/lib/views/widgets/pentry/pentry_pm_kit_form.dart b/lib/views/widgets/pentry/pentry_pm_kit_form.dart index f744a48f..b9745429 100644 --- a/lib/views/widgets/pentry/pentry_pm_kit_form.dart +++ b/lib/views/widgets/pentry/pentry_pm_kit_form.dart @@ -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 models; - final num assetId; + final List? models; + final num? assetId; - const PentryPMKitForm({Key? key, this.models, this.assetId}) : super(key: key); + const PentryPMKitForm({Key? key, this.models = const [], this.assetId}) : super(key: key); @override State createState() => _PentryPMKitFormState(); @@ -24,11 +24,11 @@ class _PentryPMKitFormState extends State { @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 { 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 { children: [ "${context.translation.item} ${index + 1}".heading5(context), "trash".toSvgAsset(width: 15, height: 20).onPress(() { - widget.models.remove(model); + widget.models!.remove(model); setState(() {}); }), ], diff --git a/lib/views/widgets/pentry/pentry_ppm_check_list_form.dart b/lib/views/widgets/pentry/pentry_ppm_check_list_form.dart index a9af5ecb..01cbbd3c 100644 --- a/lib/views/widgets/pentry/pentry_ppm_check_list_form.dart +++ b/lib/views/widgets/pentry/pentry_ppm_check_list_form.dart @@ -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 models; + final List? models; const PentryPMChecklistForm({Key? key, this.models}) : super(key: key); @@ -25,19 +25,18 @@ class _PentryPMChecklistFormState extends State { @override Widget build(BuildContext context) { - final list = - widget.models?.where((element) => element.task != null)?.toList(); + List? 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 { } 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( + SingleItemDropDownMenu( 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 { } }, ), - 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 { 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; diff --git a/lib/views/widgets/pentry/pentry_tbs_form.dart b/lib/views/widgets/pentry/pentry_tbs_form.dart index 7b17d292..f3b175eb 100644 --- a/lib/views/widgets/pentry/pentry_tbs_form.dart +++ b/lib/views/widgets/pentry/pentry_tbs_form.dart @@ -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 createState() => _PentryTBSFormState(); } class _PentryTBSFormState extends State { - 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 { 8.height, SingleItemDropDownMenu( 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 { 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 { 8.height, SingleItemDropDownMenu( 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 { 8.height, SingleItemDropDownMenu( 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 { 8.height, SingleItemDropDownMenu( 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 { 8.height, SingleItemDropDownMenu( 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 { 8.height, SingleItemDropDownMenu( 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 { 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 { 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 { 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(); }, diff --git a/lib/views/widgets/ppm/ppm_item.dart b/lib/views/widgets/ppm/ppm_item.dart index f5557308..81d57678 100644 --- a/lib/views/widgets/ppm/ppm_item.dart +++ b/lib/views/widgets/ppm/ppm_item.dart @@ -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), ), diff --git a/lib/views/widgets/qr/asset_scan_qr.dart b/lib/views/widgets/qr/asset_scan_qr.dart index f0e0235c..36b8ed77 100644 --- a/lib/views/widgets/qr/asset_scan_qr.dart +++ b/lib/views/widgets/qr/asset_scan_qr.dart @@ -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 { - 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 { 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 { diff --git a/lib/views/widgets/qr/scan_qr.dart b/lib/views/widgets/qr/scan_qr.dart index bcb8ba3b..479376f3 100644 --- a/lib/views/widgets/qr/scan_qr.dart +++ b/lib/views/widgets/qr/scan_qr.dart @@ -13,8 +13,8 @@ class ScanQr extends StatefulWidget { } class _ScanQrState extends State { - Barcode result; - QRViewController _controller; + // Barcode result; + QRViewController? _controller; bool _scanDone = false; final GlobalKey qrKey = GlobalKey(debugLabel: 'QR_scanner'); diff --git a/lib/views/widgets/requests/service_request_item.dart b/lib/views/widgets/requests/service_request_item.dart index d2fe840e..e20ea589 100644 --- a/lib/views/widgets/requests/service_request_item.dart +++ b/lib/views/widgets/requests/service_request_item.dart @@ -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( diff --git a/lib/views/widgets/requests/service_request_list.dart b/lib/views/widgets/requests/service_request_list.dart index 38a83161..a525ac84 100644 --- a/lib/views/widgets/requests/service_request_list.dart +++ b/lib/views/widgets/requests/service_request_list.dart @@ -14,7 +14,7 @@ class ServiceRequestsList extends StatelessWidget { final bool nextPage; final Future 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) {