From f6942528289666e9740f2389d33af2fd0ddf344c Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Sun, 15 Sep 2024 12:28:43 +0300 Subject: [PATCH] null safety conversion after merge. --- .../stapper_widget/custom_stepper.dart | 10 +- lib/controllers/api_routes/api_manager.dart | 7 +- .../api/service_requests_provider.dart | 349 +++++++-------- lib/dashboard_latest/dashboard_provider.dart | 57 ++- lib/dashboard_latest/dashboard_view.dart | 71 ++- .../widgets/progress_fragment.dart | 8 +- lib/extensions/string_extensions.dart | 6 +- lib/extensions/text_extensions.dart | 45 +- lib/extensions/widget_extensions.dart | 70 +-- .../spare_part/activity_spare_part_model.dart | 36 +- .../workorder/fix_remotely_model.dart | 33 +- .../workorder/mark_as_fixed_model.dart | 19 +- .../workorder/need_visit_model.dart | 24 +- .../workorder/nurse_action_model.dart | 24 +- lib/models/lookup.dart | 21 +- ...shboardCount.dart => dashboard_count.dart} | 58 +-- lib/models/new_models/dashboard_detail.dart | 84 ++-- lib/models/new_models/gas_refill_model.dart | 47 +- lib/models/new_models/workOrderDetail.dart | 423 +++++++----------- lib/new_views/app_style/app_themes.dart | 8 +- .../common_widgets/app_bottom_nav_bar.dart | 13 +- .../common_widgets/app_dashed_button.dart | 30 +- .../common_widgets/app_filled_button.dart | 49 +- lib/new_views/pages/land_page/land_page.dart | 12 +- .../pages/land_page/requests_list_page.dart | 21 +- lib/providers/work_order/reason_provider.dart | 3 +- .../action_button/footer_action_button.dart | 8 +- .../views/components/initial_visit_card.dart | 2 +- .../views/components/request_detail_view.dart | 120 +++-- .../views/components/timer_widget.dart | 4 +- .../views/components/verify_arrival_view.dart | 15 +- .../components/verify_assets_details.dart | 26 +- .../components/work_order_card_view.dart | 18 +- .../work_order/create_service_report.dart | 2 +- .../widgets/date_and_time/date_picker.dart | 62 +-- .../widgets/date_and_time/time_picker.dart | 30 +- .../widgets/e_signature/e_signature.dart | 78 ++-- .../widgets/images/multi_image_picker.dart | 37 +- 38 files changed, 828 insertions(+), 1102 deletions(-) rename lib/models/new_models/{dashboardCount.dart => dashboard_count.dart} (51%) diff --git a/lib/common_widgets/stapper_widget/custom_stepper.dart b/lib/common_widgets/stapper_widget/custom_stepper.dart index 068c505c..43818e14 100644 --- a/lib/common_widgets/stapper_widget/custom_stepper.dart +++ b/lib/common_widgets/stapper_widget/custom_stepper.dart @@ -25,7 +25,7 @@ class CustomStepper extends StatefulWidget { final double stepRadius; final int activeStep; final int maxReachedStep; - final Set reachedSteps; + final Set? reachedSteps; final AlignmentGeometry alignment; final double internalPadding; final EdgeInsetsGeometry padding; @@ -41,9 +41,9 @@ class CustomStepper extends StatefulWidget { final LineStyle lineStyle; const CustomStepper({ - Key key, - @required this.activeStep, - @required this.steps, + Key? key, + required this.activeStep, + required this.steps, this.reachedSteps, this.maxReachedStep, this.onStepReached, @@ -84,7 +84,7 @@ class CustomStepper extends StatefulWidget { } class _CustomStepperState extends State { - ScrollController _scrollController; + late ScrollController _scrollController; int _selectedIndex; LineStyle lineStyle; EdgeInsetsGeometry _padding; diff --git a/lib/controllers/api_routes/api_manager.dart b/lib/controllers/api_routes/api_manager.dart index 77a9dfd0..e78fb4ac 100644 --- a/lib/controllers/api_routes/api_manager.dart +++ b/lib/controllers/api_routes/api_manager.dart @@ -83,10 +83,8 @@ class ApiManager { return response; } - Future postWithOutBody( - String url, { - Map headers, - }) async { + + Future postWithOutBody(String url, {Map? headers}) async { headers ??= {}; headers.addAll(_headers); @@ -118,7 +116,6 @@ class ApiManager { return response; } - Future put(String url, {Map? headers, required Map body}) async { headers ??= {}; diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index 406eb304..f3f60954 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -1,16 +1,12 @@ import 'dart:convert'; -import 'dart:developer'; 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'; @@ -30,7 +26,6 @@ class ServiceRequestsProvider extends ChangeNotifier { // number of items call in each request final pageItemNumber = 10; - //reset provider data void reset() { workOrders = []; @@ -42,16 +37,8 @@ class ServiceRequestsProvider extends ChangeNotifier { // state code of current request to defied error message // like 400 customer request failed // 500 service not available - int stateCode; - bool _isDetialLoading=false; - bool _ackhnowledge = false; - - bool get ackhnowledge => _ackhnowledge; - - set ackhnowledge(bool value) { - _ackhnowledge = value; - notifyListeners(); - } + int? stateCode; + bool _isDetialLoading = false; bool get isDetialLoading => _isDetialLoading; @@ -59,32 +46,23 @@ class ServiceRequestsProvider extends ChangeNotifier { _isDetialLoading = value; notifyListeners(); } // 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 workOrders = []; - SearchWorkOrder _formWorkOrder=SearchWorkOrder(); - - SearchWorkOrder get formWorkOrder => _formWorkOrder; - - set formWorkOrder(SearchWorkOrder value) { - _formWorkOrder = value; - notifyListeners(); - } + List? serviceRequests; + List workOrders = []; List _sparePartList = []; - - SparePartsWorkOrders _initialSelectedSparePart = SparePartsWorkOrders(); - ServiceRequest _currentSelectedRequest; + ServiceRequest? _currentSelectedRequest; int _selectedListIndex = 0; int get selectedListIndex => _selectedListIndex; @@ -94,19 +72,17 @@ class ServiceRequestsProvider extends ChangeNotifier { notifyListeners(); } - ServiceRequest get currentSelectedRequest => _currentSelectedRequest; + ServiceRequest? get currentSelectedRequest => _currentSelectedRequest; - set currentSelectedRequest(ServiceRequest value) { + set currentSelectedRequest(ServiceRequest? value) { _currentSelectedRequest = value; - print('notify listner for current selected request Called...'); notifyListeners(); } - // when requests in-process _loading = true // done _loading = true // failed _loading = false - bool isLoading; + bool isLoading = false; ServiceRequestSearch search = ServiceRequestSearch(); @@ -115,7 +91,7 @@ class ServiceRequestsProvider extends ChangeNotifier { /// return state code if request complete may be 200, 404 or 403 /// for more details check http state manager /// lib\controllers\http_status_manger\http_status_manger.dart - Future getRequests({@required int hospitalId}) async { + Future getRequests({required int hospitalId}) async { if (isLoading == true) return -2; isLoading = true; if (serviceRequests?.isEmpty ?? false) notifyListeners(); @@ -137,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; @@ -156,46 +132,46 @@ 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, - @required String host, - @required User user, - @required ServiceRequest serviceRequest, + required BuildContext context, + required String host, + required User user, + required ServiceRequest serviceRequest, }) async { var body = { "id": 0, @@ -206,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(), @@ -247,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])); @@ -267,33 +243,33 @@ 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"); + response = await ApiManager.instance.get(URLs.CheckIfAssetHasAnotherServiceRequest + "?assetId=$assetId"); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) {} return PendingAssetServiceRequest.fromJson(json.decode(response.body)["data"]); @@ -303,16 +279,16 @@ class ServiceRequestsProvider extends ChangeNotifier { } } - Future updateRequest({@required User user, @required ServiceRequest request}) async { + 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) {} @@ -328,7 +304,7 @@ class ServiceRequestsProvider extends ChangeNotifier { "requestedThrough": request.requestedThrough?.toJson(), "voiceNote": request.audio, "assets": request.deviceId == null ? [] : [request.deviceId], - "attachmentsCallRequest": (request.devicePhotos?.isNotEmpty ?? false) ? request.devicePhotos?.map((e) => {"name": e.getFileName})?.toList() : [], + "attachmentsCallRequest": (request.devicePhotos?.isNotEmpty ?? false) ? request.devicePhotos?.map((e) => {"name": e.getFileName}).toList() : [], "assignedEmployee": { "id": request.engineerId, "name": request.engineerName, @@ -350,10 +326,10 @@ class ServiceRequestsProvider extends ChangeNotifier { "status": request.statusId == null ? null : { - "id": request.statusId, - "name": request.statusLabel, - "value": request.statusValue, - }, + "id": request.statusId, + "name": request.statusLabel, + "value": request.statusValue, + }, "callLastSituation": null, "firstAction": request.firstAction?.toJson(), "loanAvailablity": request.loanAvailability?.toJson(), @@ -387,12 +363,12 @@ class ServiceRequestsProvider extends ChangeNotifier { } } - Future createServiceReport(BuildContext context, {@required ServiceReport report, @required User user, @required ServiceRequest request}) async { + Future createServiceReport(BuildContext context, {required ServiceReport report, required User user, required ServiceRequest request}) async { Response response; try { showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); final body = report.toJson(); - final callRequest = CallRequest(id: num.tryParse(request?.id ?? "")).toJson(); + final callRequest = CallRequest(id: num.tryParse(request.id ?? "")).toJson(); final contactPerson = [ { "id": 0, @@ -426,7 +402,7 @@ class ServiceRequestsProvider extends ChangeNotifier { } } - Future createSubWorkOrder({@required SearchWorkOrder workOrder, bool makeSuppPersonsEmpty = false}) async { + Future createSubWorkOrder({required SearchWorkOrder workOrder, bool makeSuppPersonsEmpty = false}) async { Response response; try { if (makeSuppPersonsEmpty) workOrder.supplier?.suppPersons = []; @@ -444,19 +420,17 @@ 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 Map listJson = json.decode(response.body)["data"]; - log(listJson?.toString()); + // log(listJson?.toString()); callRequestForWorkOrder = CallRequest.fromJson(listJson); } @@ -468,13 +442,13 @@ class ServiceRequestsProvider extends ChangeNotifier { } } - Future> searchWorkOrders({@required String callId}) async { + Future> searchWorkOrders({required String callId}) async { Response response; try { var body = { "pageSize": pageItemNumber, - "pageNumber": ((workOrders?.length ?? 0) ~/ pageItemNumber) + 1, + "pageNumber": ((workOrders.length ?? 0) ~/ pageItemNumber) + 1, "callId": callId, }; response = await ApiManager.instance.post(URLs.searchWorkOrders, body: body); @@ -495,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"); @@ -512,38 +486,38 @@ class ServiceRequestsProvider extends ChangeNotifier { } } - Future createDuplicatedReport({ - @required String host, - @required User user, - @required ServiceRequest request, - }) async { + // 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; - 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()); @@ -554,7 +528,7 @@ class ServiceRequestsProvider extends ChangeNotifier { Fluttertoast.showToast(msg: context.translation.successfulRequestMessage); Navigator.of(context).pop(); } else { - Fluttertoast.showToast(msg: "${context.translation.failedToCompleteRequest}"); + Fluttertoast.showToast(msg: context.translation.failedToCompleteRequest); } Navigator.of(context).pop(); return response.statusCode; @@ -565,7 +539,7 @@ class ServiceRequestsProvider extends ChangeNotifier { } } - Future updateWorkOrderDetails({@required SearchWorkOrder workOrder}) async { + Future updateWorkOrderDetails({required SearchWorkOrder workOrder}) async { Response response; //Map body = report.toMap(request); // body["uid"] = user.id; @@ -594,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( @@ -626,7 +595,7 @@ class ServiceRequestsProvider extends ChangeNotifier { } } - Future getSingleServiceReport(BuildContext context, {@required int reportId}) async { + Future getSingleServiceReport(BuildContext context, {required int reportId}) async { Response response; try { response = await ApiManager.instance.get(URLs.getServiceReport + "?workOrderId=$reportId"); @@ -643,29 +612,27 @@ 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"); if (response.statusCode >= 200 && response.statusCode < 300) { - isDetialLoading=false; + isDetialLoading = false; return ServiceRequest.fromJson(json.decode(response.body)["data"]); } else { - isDetialLoading=false; + isDetialLoading = false; return null; } } catch (error) { - isDetialLoading=false; + isDetialLoading = false; return null; } } - Future> getServiceRequestById({@required String requestId}) async { + 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 {}; @@ -686,29 +653,26 @@ class ServiceRequestsProvider extends ChangeNotifier { } Future> searchForWorkOrders( - SearchWorkOrder search, - String callerId, - Lookup dateOperator, - String site, - ) async { + SearchWorkOrder search, + String callerId, + Lookup dateOperator, + String site, + ) async { Response response; try { var body = { "pageSize": pageItemNumber, - "pageNumber": ((workOrders?.length ?? 0) ~/ pageItemNumber) + 1, - if (callerId?.isNotEmpty ?? false) "callId": callerId, + "pageNumber": ((workOrders.length ?? 0) ~/ pageItemNumber) + 1, + 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(), - if (search.visitDate != null && dateOperator != null) "visitDateFrom": search.visitDate, + if (site.isNotEmpty ?? false) "site": site, + if (search.visitDate != null) "visitDateSymbol": dateOperator.toJson(), + if (search.visitDate != null) "visitDateFrom": search.visitDate, }; print(body); response = await ApiManager.instance.post(URLs.searchWorkOrders, body: body); @@ -731,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; @@ -758,6 +722,7 @@ class ServiceRequestsProvider extends ChangeNotifier { _initialSelectedSparePart = value; notifyListeners(); } + List get sparePartList => _sparePartList; set sparePartList(List value) { diff --git a/lib/dashboard_latest/dashboard_provider.dart b/lib/dashboard_latest/dashboard_provider.dart index 715ff72a..88243aab 100644 --- a/lib/dashboard_latest/dashboard_provider.dart +++ b/lib/dashboard_latest/dashboard_provider.dart @@ -1,19 +1,19 @@ import 'dart:convert'; + import 'package:flutter/widgets.dart'; import 'package:http/http.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/enums/user_types.dart'; -import 'package:test_sa/models/new_models/dashboardCount.dart'; -import 'package:test_sa/models/new_models/dashboard_detail.dart'; +import 'package:test_sa/models/new_models/dashboard_count.dart'; +import 'package:test_sa/models/new_models/dashboard_detail.dart' as DD; class DashBoardProvider extends ChangeNotifier { bool isAllCountLoading = false; bool isLoading = false; bool _isDetailLoading = false; - int _status =0; - + int _status = 0; int get status => _status; @@ -31,15 +31,15 @@ class DashBoardProvider extends ChangeNotifier { notifyListeners(); } - int stateCode; + int? stateCode; - DashboardCount dashboardCount; + DashboardCount? dashboardCount; - DashboardDetail _requestDetailList; + DD.DashboardDetail? _requestDetailList; - DashboardDetail get requestDetailList => _requestDetailList; + DD.DashboardDetail? get requestDetailList => _requestDetailList; - set requestDetailList(DashboardDetail value) { + set requestDetailList(DD.DashboardDetail? value) { _requestDetailList = value; notifyListeners(); } @@ -54,24 +54,23 @@ class DashBoardProvider extends ChangeNotifier { stateCode = null; } - - Future getDashBoardCount({@required UsersTypes usersType}) async { + Future getDashBoardCount({required UsersTypes usersType}) async { isAllCountLoading = true; - String url=''; - if(usersType==UsersTypes.engineer){ + String url = ''; + if (usersType == UsersTypes.engineer) { url = URLs.engineerDashboardCountUrl; } - if(usersType==UsersTypes.nurse){ - url=URLs.nurseDashboardCountUrl; + if (usersType == UsersTypes.nurse) { + url = URLs.nurseDashboardCountUrl; } Response response; try { response = await ApiManager.instance.postWithOutBody(url); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { - dashboardCount = DashboardCount.fromJson(json.decode(response.body)); - } - notifyListeners(); + dashboardCount = DashboardCount.fromJson(json.decode(response.body)); + } + notifyListeners(); isAllCountLoading = false; notifyListeners(); return response.statusCode; @@ -83,36 +82,35 @@ class DashBoardProvider extends ChangeNotifier { } } - - Future getRequestDetail({bool showLoader = true,UsersTypes usersType, int status}) async { - isDetailLoading =showLoader; + Future getRequestDetail({bool showLoader = true, required UsersTypes usersType, required int status}) async { + isDetailLoading = showLoader; Response response; - String url=''; - if(usersType==UsersTypes.engineer){ + String url = ''; + if (usersType == UsersTypes.engineer) { url = URLs.engineerDashboardDetailsUrl; } - if(usersType==UsersTypes.nurse){ - url=URLs.nurseDashboardDetailsUrl; + if (usersType == UsersTypes.nurse) { + url = URLs.nurseDashboardDetailsUrl; } try { Map body = { "statusValue": status, "pageNumber": pageNum, - "pageSize" : pageItemNumber, + "pageSize": pageItemNumber, }; response = await ApiManager.instance.post(url, body: body); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { if (requestDetailList == null) { - requestDetailList = DashboardDetail.fromJson(json.decode(response.body)); + requestDetailList = DD.DashboardDetail.fromJson(json.decode(response.body)); isDetailLoading = false; notifyListeners(); } else { - requestDetailList.data.addAll(DashboardDetail.fromJson(json.decode(response.body)["data"][0]).data); + requestDetailList!.data!.addAll(DD.Data.fromJson(json.decode(response.body)["data"][0]).data); isDetailLoading = false; notifyListeners(); } - if (requestDetailList.data.length >= pageItemNumber) { + if (requestDetailList!.data!.length >= pageItemNumber) { nextPage = true; } else { nextPage = false; @@ -138,5 +136,4 @@ class DashBoardProvider extends ChangeNotifier { _isDetailLoading = value; notifyListeners(); } - } diff --git a/lib/dashboard_latest/dashboard_view.dart b/lib/dashboard_latest/dashboard_view.dart index a9348703..f6fea02a 100644 --- a/lib/dashboard_latest/dashboard_view.dart +++ b/lib/dashboard_latest/dashboard_view.dart @@ -10,16 +10,12 @@ import 'package:test_sa/controllers/providers/api/all_requests_provider.dart'; import 'package:test_sa/controllers/providers/api/notifications_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; -import 'package:test_sa/dashboard_latest/dashboard_provider.dart'; import 'package:test_sa/dashboard_latest/widgets/app_bar_widget.dart'; -import 'package:test_sa/extensions/context_extension.dart'; +import 'package:test_sa/dashboard_latest/widgets/progress_fragment.dart'; +import 'package:test_sa/dashboard_latest/widgets/requests_fragment.dart'; import 'package:test_sa/extensions/int_extensions.dart'; -import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/user.dart'; -import 'package:test_sa/new_views/app_style/app_color.dart'; -import 'package:test_sa/dashboard_latest/widgets/progress_fragment.dart'; -import 'package:test_sa/dashboard_latest/widgets/requests_fragment.dart'; import 'package:test_sa/service_request_latest/request_detail_provider.dart'; import 'package:test_sa/utilities/request_utils.dart'; @@ -28,7 +24,7 @@ import 'widgets/request_category_fragment.dart'; class DashboardView extends StatefulWidget { final VoidCallback onDrawerPress; - const DashboardView({Key key, this.onDrawerPress}) : super(key: key); + const DashboardView({Key? key, required this.onDrawerPress}) : super(key: key); @override State createState() => _DashboardViewState(); @@ -37,15 +33,13 @@ class DashboardView extends StatefulWidget { class _DashboardViewState extends State { int _currentPage = 0; bool isFCM = true; - User user; + late User user; - SettingProvider settingProvider; - UserProvider userProvider; - - AllRequestsProvider allRequestsProvider; - - NotificationsProvider notificationsProvider; - ScrollController _scrollController; + late SettingProvider settingProvider; + late UserProvider userProvider; + late AllRequestsProvider allRequestsProvider; + late NotificationsProvider notificationsProvider; + late ScrollController _scrollController; @override void initState() { @@ -61,16 +55,16 @@ class _DashboardViewState extends State { RequestDetailProvider requestDetailProvider = Provider.of(context, listen: false); allRequestsProvider = Provider.of(context, listen: false); notificationsProvider = Provider.of(context, listen: false); - user = userProvider.user; + user = userProvider.user!; log('user token i got is ${user.token}'); await getAllRequests(); - await requestDetailProvider.engineerRejectWorkOrder(id: '3',feedBack: 'Abcdef'); + await requestDetailProvider.engineerRejectWorkOrder(id: '3', feedBack: 'Abcdef'); if (isFCM) { FirebaseNotificationManger.initialized(context); NotificationManger.initialisation((notificationDetails) { - FirebaseNotificationManger.handleMessage(context, json.decode(notificationDetails.payload)); + FirebaseNotificationManger.handleMessage(context, json.decode(notificationDetails.payload!)); }, (id, title, body, payload) async {}); isFCM = false; @@ -83,30 +77,27 @@ class _DashboardViewState extends State { allRequestsProvider.isFilterRequestLoading = true; allRequestsProvider.currentListIndex = 0; allRequestsProvider.filterRequest = null; - var tabs = RequestUtils.getTabs(userType: userProvider.user.type, context: context); + var tabs = RequestUtils.getTabs(userType: userProvider.user!.type!, context: context); allRequestsProvider.status = tabs[0]['status']; - allRequestsProvider.getRequests(); - allRequestsProvider.pageNum = 1; - allRequestsProvider.getFilterRequests(showLoader: true, status: tabs[0]['status']).whenComplete(() { - allRequestsProvider.requestDetailList = allRequestsProvider.filterRequest; - }); - allRequestsProvider.isAllLoading = false; - notificationsProvider.getSystemNotifications(user: userProvider.user, resetProvider: true); + allRequestsProvider.getRequests(); + allRequestsProvider.pageNum = 1; + allRequestsProvider.getFilterRequests(showLoader: true, status: tabs[0]['status']).whenComplete(() { + allRequestsProvider.requestDetailList = allRequestsProvider.filterRequest; + }); + allRequestsProvider.isAllLoading = false; + notificationsProvider.getSystemNotifications(user: userProvider.user!, resetProvider: true); } - void handleScroll() async{ + void handleScroll() async { _scrollController = ScrollController(); _scrollController.addListener(() async { - if (_scrollController?.position?.pixels == - _scrollController?.position?.maxScrollExtent && - !allRequestsProvider.isFilterRequestLoading) { + if (_scrollController?.position?.pixels == _scrollController?.position?.maxScrollExtent && !allRequestsProvider.isFilterRequestLoading) { allRequestsProvider.pageNum = allRequestsProvider.pageNum + 1; - await allRequestsProvider.getFilterRequests(showLoader:false,status: allRequestsProvider.status); + await allRequestsProvider.getFilterRequests(showLoader: false, status: allRequestsProvider.status); } }); } - @override void dispose() { _scrollController.dispose(); @@ -124,26 +115,18 @@ class _DashboardViewState extends State { )), body: RefreshIndicator( onRefresh: () async { - getInitialData(); + getInitialData(); return Future.delayed(const Duration(milliseconds: 250)); }, child: Scrollbar( controller: _scrollController, child: SingleChildScrollView( - // physics: AlwaysScrollableScrollPhysics(), - controller: _scrollController, + // physics: AlwaysScrollableScrollPhysics(), + controller: _scrollController, child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, - children: [ - 14.height, - ProgressFragment(), - 25.height, - SizedBox( - height: 110.toScreenHeight, child: const RequestsFragment()), - 16.height, - const RequestCategoryFragment() - ], + children: [14.height, ProgressFragment(), 25.height, SizedBox(height: 110.toScreenHeight, child: const RequestsFragment()), 16.height, const RequestCategoryFragment()], ).paddingOnly(start: 16, end: 16, top: 0, bottom: 8), ), ), diff --git a/lib/dashboard_latest/widgets/progress_fragment.dart b/lib/dashboard_latest/widgets/progress_fragment.dart index 6c316a10..d7ef7f18 100644 --- a/lib/dashboard_latest/widgets/progress_fragment.dart +++ b/lib/dashboard_latest/widgets/progress_fragment.dart @@ -163,16 +163,14 @@ import '../../controllers/providers/api/user_provider.dart'; import '../../models/enums/user_types.dart'; class ProgressFragment extends StatelessWidget { - ProgressFragment({Key key}) : super(key: key); + ProgressFragment({Key? key}) : super(key: key); - UserProvider _userProvider; - - AllRequestsProvider _provider; + late UserProvider _userProvider; @override Widget build(BuildContext context) { _userProvider = Provider.of(context); - bool isCurrentUserNotEngineer = (_userProvider.user.type != UsersTypes.engineer); + bool isCurrentUserNotEngineer = (_userProvider.user!.type != UsersTypes.engineer); return Consumer( builder: (context, snapshot, _) { int total = (snapshot.completedRequests?.total?.count ?? 0) + (snapshot.inProgressRequests?.total?.count ?? 0) + (isCurrentUserNotEngineer ? (snapshot.openRequests?.total?.count ?? 0) : 0); diff --git a/lib/extensions/string_extensions.dart b/lib/extensions/string_extensions.dart index bcab7808..80a0f88d 100644 --- a/lib/extensions/string_extensions.dart +++ b/lib/extensions/string_extensions.dart @@ -10,12 +10,14 @@ extension StringExtensions on String { DateTime dateTime = DateTime.parse(this); return "${DateFormat('dd MMM, yyyy').format(dateTime)}\n${DateFormat('hh:mm a').format(dateTime)}"; } + String get toDragAbleTimerFormat { - DateTime dateTime = DateTime.tryParse(this); + DateTime dateTime = DateTime.parse(this); return DateFormat('HH:mm:ss').format(dateTime); } + String get toInitialVisitCardFormat { - DateTime dateTime = DateTime.tryParse(this); + DateTime dateTime = DateTime.parse(this); return "${DateFormat('dd MMM, yyyy').format(dateTime)} at ${DateFormat('hh:mm a').format(dateTime)}"; } diff --git a/lib/extensions/text_extensions.dart b/lib/extensions/text_extensions.dart index 581fd843..6d1fadfc 100644 --- a/lib/extensions/text_extensions.dart +++ b/lib/extensions/text_extensions.dart @@ -16,7 +16,9 @@ extension TextStyles on String { Text heading4(BuildContext context) => getTextWithStyle(this, AppTextStyles.heading4, context.isDark ? AppColor.neutral30 : AppColor.neutral50); Text heading5(BuildContext context) => getTextWithStyle(this, AppTextStyles.heading5, context.isDark ? AppColor.neutral30 : AppColor.neutral50); + Text bottomSheetHeadingTextStyle(BuildContext context) => getTextWithStyle(this, AppTextStyles.bottomSheetHeadingTextStyle, context.isDark ? AppColor.neutral30 : AppColor.black20); + Text customHeadingText(BuildContext context) => getTextWithStyle(this, AppTextStyles.customHeadingText, context.isDark ? AppColor.neutral30 : AppColor.neutral50); Text heading6(BuildContext context) => getTextWithStyle(this, AppTextStyles.heading6, context.isDark ? AppColor.neutral30 : AppColor.neutral50); @@ -33,11 +35,11 @@ extension TextStyles on String { } extension CustomText on Text { - Text custom({Color color, FontWeight fontWeight, TextAlign align,double fontSize,double lineHeight,double letterSpacing}) { + Text custom({Color? color, FontWeight? fontWeight, TextAlign? align, double? fontSize, double? lineHeight, double? letterSpacing}) { return Text( - data, + data!, textAlign: align, - style: style.copyWith( + style: style?.copyWith( color: color, height: lineHeight, letterSpacing: letterSpacing, @@ -93,12 +95,16 @@ abstract class AppTextStyles { decoration: TextDecoration.none, ); static const TextStyle customHeadingText = TextStyle( - fontFamily: 'Poppins', - fontSize: 27, // Font size in logical pixels - fontWeight: FontWeight.w500, // Equivalent to font-weight: 500 - height: 31 / 27, // Line height (in Flutter, it's a multiplier of font size) - letterSpacing: -0.04 * 27, // Letter spacing, converted to logical pixels - color: Colors.black, // Set your desired text color + fontFamily: 'Poppins', + fontSize: 27, + // Font size in logical pixels + fontWeight: FontWeight.w500, + // Equivalent to font-weight: 500 + height: 31 / 27, + // Line height (in Flutter, it's a multiplier of font size) + letterSpacing: -0.04 * 27, + // Letter spacing, converted to logical pixels + color: Colors.black, // Set your desired text color ); static final TextStyle heading6 = TextStyle( @@ -161,27 +167,12 @@ extension CapExtension on String { } extension FilesExtension on String { - SvgPicture toSvgAsset({ - int width, - int height, - Color color, - BoxFit fit = BoxFit.contain, - }) => + SvgPicture toSvgAsset({int? width, int? height, Color? color, BoxFit fit = BoxFit.contain}) => SvgPicture.asset("assets/images/$this.svg", width: width?.toScreenWidth, height: height?.toScreenHeight, color: color, fit: fit); - Image toPngAsset({ - int width, - int height, - Color color, - BoxFit fit = BoxFit.contain, - }) => + Image toPngAsset({int? width, int? height, Color? color, BoxFit fit = BoxFit.contain}) => Image.asset("assets/images/$this.png", width: width?.toScreenWidth, height: height?.toScreenHeight, color: color, fit: fit); - LottieBuilder toLottieAsset({ - int width, - int height, - BoxFit fit = BoxFit.contain, - bool repeat = true, - }) => + LottieBuilder toLottieAsset({int? width, int? height, BoxFit fit = BoxFit.contain, bool repeat = true}) => Lottie.asset("assets/lottie/$this.json", width: width?.toScreenWidth, height: height?.toScreenHeight, fit: fit, repeat: repeat); } diff --git a/lib/extensions/widget_extensions.dart b/lib/extensions/widget_extensions.dart index a183c640..83f16cd5 100644 --- a/lib/extensions/widget_extensions.dart +++ b/lib/extensions/widget_extensions.dart @@ -18,30 +18,32 @@ extension WidgetExtensions on Widget { Widget circle(double value) => ClipRRect(borderRadius: BorderRadius.circular(value), child: this); Widget paddingAll(double value) => Padding(padding: EdgeInsets.all(value), child: this); - Widget indicatorWidget({double height,double width,Color color})=> Container( - width: height??40.toScreenWidth, - height: width??5.toScreenHeight, - decoration: BoxDecoration(color:color?? AppColor.white50, borderRadius: BorderRadius.circular(30)), - child: this, - ); - Widget flushBar({@required BuildContext context,String title,String message,double duration,Color backgroundColor})=>Flushbar( - flushbarPosition: FlushbarPosition.TOP, - backgroundColor: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); + + Widget indicatorWidget({double? height, double? width, Color? color}) => Container( + width: height ?? 40.toScreenWidth, + height: width ?? 5.toScreenHeight, + decoration: BoxDecoration(color: color ?? AppColor.white50, borderRadius: BorderRadius.circular(30)), + child: this, + ); + + Widget flushBar({required BuildContext context, required String title, required String message, int? duration, Color? backgroundColor}) => Flushbar( + flushbarPosition: FlushbarPosition.TOP, + backgroundColor: backgroundColor ?? AppColor.green70, + title: title, + message: message, + 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); Widget paddingOnly({int start = 0, int end = 0, int top = 0, int bottom = 0}) => Padding(padding: EdgeInsetsDirectional.only(start: start.toScreenWidth, end: end.toScreenWidth, top: top.toScreenHeight, bottom: bottom.toScreenHeight), child: this); @@ -87,15 +89,17 @@ extension WidgetExtensions on Widget { child: this, ) : this; - Widget bottomSheetContainer(BuildContext context, { EdgeInsets padding}) => Container( - clipBehavior: Clip.antiAlias, - margin: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom), - decoration: BoxDecoration( - color:AppColor.background(context), - borderRadius: const BorderRadius.only(topRight: Radius.circular(20), topLeft: Radius.circular(20)), - ), - padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight), - child: this,); + + Widget bottomSheetContainer(BuildContext context, {EdgeInsets? padding}) => Container( + clipBehavior: Clip.antiAlias, + margin: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom), + decoration: BoxDecoration( + color: AppColor.background(context), + borderRadius: const BorderRadius.only(topRight: Radius.circular(20), topLeft: Radius.circular(20)), + ), + padding: padding ?? EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight), + child: this, + ); Widget toShadowCircleContainer(BuildContext context, {bool showShadow = true, double padding = 16}) => showShadow ? Container( diff --git a/lib/models/helper_data_models/spare_part/activity_spare_part_model.dart b/lib/models/helper_data_models/spare_part/activity_spare_part_model.dart index 6293805e..28236026 100644 --- a/lib/models/helper_data_models/spare_part/activity_spare_part_model.dart +++ b/lib/models/helper_data_models/spare_part/activity_spare_part_model.dart @@ -1,18 +1,17 @@ class ActivitySparePartModel { - int id; - int workOrderId; - int partCatalogItemId; - int quantity; - String comment; - List sparePartAttachments; + int? id; + int? workOrderId; + int? partCatalogItemId;int? quantity; + String? comment; + List? sparePartAttachments; - ActivitySparePartModel( - {this.id, - this.workOrderId, - this.partCatalogItemId, - this.quantity, - this.comment, - this.sparePartAttachments}); + ActivitySparePartModel({ + this.id, + this.workOrderId, + this.partCatalogItemId, + this.quantity, + this.comment,this.sparePartAttachments, + }); ActivitySparePartModel.fromJson(Map json) { id = json['id']; @@ -23,8 +22,7 @@ class ActivitySparePartModel { if (json['acitiySparePartAttachments'] != null) { sparePartAttachments = []; json['acitiySparePartAttachments'].forEach((v) { - sparePartAttachments - .add(SparePartAttachments.fromJson(v)); + sparePartAttachments!.add(SparePartAttachments.fromJson(v)); }); } } @@ -38,15 +36,15 @@ class ActivitySparePartModel { data['comment'] = comment; if (sparePartAttachments != null) { data['acitiySparePartAttachments'] = - sparePartAttachments.map((v) => v.toJson()).toList(); + sparePartAttachments!.map((v) => v.toJson()).toList(); } return data; } } class SparePartAttachments { - int id; - String name; + int? id; + String? name; SparePartAttachments({this.id, this.name}); @@ -61,4 +59,4 @@ class SparePartAttachments { data['name'] = name; return data; } -} +} \ No newline at end of file diff --git a/lib/models/helper_data_models/workorder/fix_remotely_model.dart b/lib/models/helper_data_models/workorder/fix_remotely_model.dart index 75523cb5..ee1b7cdc 100644 --- a/lib/models/helper_data_models/workorder/fix_remotely_model.dart +++ b/lib/models/helper_data_models/workorder/fix_remotely_model.dart @@ -1,35 +1,18 @@ class FixRemotely { - int workOrderId; - DateTime startDate; - DateTime endDate; - int workingHour; - String comment; + int? workOrderId; + DateTime? startDate; + DateTime? endDate; + int? workingHour; + String? comment; - FixRemotely({ - this.workOrderId, - this.startDate, - this.endDate, - this.workingHour, - this.comment, - }); + FixRemotely({this.workOrderId, this.startDate, this.endDate, this.workingHour, this.comment}); factory FixRemotely.fromJson(Map json) { return FixRemotely( - workOrderId: json['workOrderId'], - startDate: DateTime.parse(json['startDate']), - endDate: DateTime.parse(json['endDate']), - workingHour: json['workingHour'], - comment: json['comment'], - ); + workOrderId: json['workOrderId'], startDate: DateTime.tryParse(json['startDate']), endDate: DateTime.tryParse(json['endDate']), workingHour: json['workingHour'], comment: json['comment']); } Map toJson() { - return { - 'workOrderId': workOrderId, - 'startDate': startDate.toIso8601String(), - 'endDate': endDate.toIso8601String(), - 'workingHour': workingHour, - 'comment': comment, - }; + return {'workOrderId': workOrderId, 'startDate': startDate?.toIso8601String(), 'endDate': endDate?.toIso8601String(), 'workingHour': workingHour, 'comment': comment}; } } diff --git a/lib/models/helper_data_models/workorder/mark_as_fixed_model.dart b/lib/models/helper_data_models/workorder/mark_as_fixed_model.dart index a44cb687..373697cf 100644 --- a/lib/models/helper_data_models/workorder/mark_as_fixed_model.dart +++ b/lib/models/helper_data_models/workorder/mark_as_fixed_model.dart @@ -1,23 +1,14 @@ class MarkAsFixed { - int workOrderId; - String feedback; + int? workOrderId; + String? feedback; - MarkAsFixed({ - this.workOrderId, - this.feedback, - }); + MarkAsFixed({this.workOrderId, this.feedback}); factory MarkAsFixed.fromJson(Map json) { - return MarkAsFixed( - workOrderId: json['workOrderId'], - feedback: json['feedback'], - ); + return MarkAsFixed(workOrderId: json['workOrderId'], feedback: json['feedback']); } Map toJson() { - return { - 'workOrderId': workOrderId, - 'feedback': feedback, - }; + return {'workOrderId': workOrderId, 'feedback': feedback}; } } diff --git a/lib/models/helper_data_models/workorder/need_visit_model.dart b/lib/models/helper_data_models/workorder/need_visit_model.dart index d345af95..71c225d9 100644 --- a/lib/models/helper_data_models/workorder/need_visit_model.dart +++ b/lib/models/helper_data_models/workorder/need_visit_model.dart @@ -1,27 +1,15 @@ class NeedVisit { - int workOrderId; - DateTime visitDate; - String comment; + int? workOrderId; + DateTime? visitDate; + String? comment; - NeedVisit({ - this.workOrderId, - this.visitDate, - this.comment, - }); + NeedVisit({this.workOrderId, this.visitDate, this.comment}); factory NeedVisit.fromJson(Map json) { - return NeedVisit( - workOrderId: json['workOrderId'], - visitDate: DateTime.parse(json['visitDate']), - comment: json['comment'], - ); + return NeedVisit(workOrderId: json['workOrderId'], visitDate: DateTime.tryParse(json['visitDate']), comment: json['comment']); } Map toJson() { - return { - 'workOrderId': workOrderId, - 'visitDate': visitDate.toIso8601String(), - 'comment': comment, - }; + return {'workOrderId': workOrderId, 'visitDate': visitDate?.toIso8601String(), 'comment': comment}; } } diff --git a/lib/models/helper_data_models/workorder/nurse_action_model.dart b/lib/models/helper_data_models/workorder/nurse_action_model.dart index 86647e7f..9af3c560 100644 --- a/lib/models/helper_data_models/workorder/nurse_action_model.dart +++ b/lib/models/helper_data_models/workorder/nurse_action_model.dart @@ -1,27 +1,15 @@ class NurseActionModel { - int workOrderId; - String feedback; - String signatureNurse; + int? workOrderId; + String? feedback; + String? signatureNurse; - NurseActionModel({ - this.workOrderId, - this.feedback, - this.signatureNurse, - }); + NurseActionModel({this.workOrderId, this.feedback, this.signatureNurse}); factory NurseActionModel.fromJson(Map json) { - return NurseActionModel( - workOrderId: json['workOrderId'], - feedback: json['feedback'], - signatureNurse: json['signatureNurse'], - ); + return NurseActionModel(workOrderId: json['workOrderId'], feedback: json['feedback'], signatureNurse: json['signatureNurse']); } Map toJson() { - return { - 'workOrderId': workOrderId, - 'feedback': feedback, - 'signatureNurse': signatureNurse, - }; + return {'workOrderId': workOrderId, 'feedback': feedback, 'signatureNurse': signatureNurse}; } } diff --git a/lib/models/lookup.dart b/lib/models/lookup.dart index 8552e081..eee96ef2 100644 --- a/lib/models/lookup.dart +++ b/lib/models/lookup.dart @@ -1,21 +1,25 @@ import 'base.dart'; class Lookup extends Base { - final int id, value; + int? id; // Now nullable + int? value; // Now nullable + String? name; // Now nullable - Lookup({this.id, this.value, String name}) : super(identifier: id?.toString(), name: name); + Lookup({this.id, this.value, this.name}) : super(identifier: id?.toString(), name: name); @override bool operator ==(Object other) => identical(this, other) || other is Lookup && ((value != null && value == other.value) || (id != null && id == other.id)); @override - int get hashCode => id?.hashCode ?? value?.hashCode; + int get hashCode => id.hashCode ^ value.hashCode; // Use XOR for hash code combination - toJson() { + Map toJson() { + // Return a Map instead of calling a function return {"id": id, "name": name, "value": value}; } - factory Lookup.fromStatus(Lookup old) { + static Lookup? fromStatus(Lookup? old) { + // Now accepts nullable Lookup and returns nullable Lookup if (old == null) return null; return Lookup( name: old.name, @@ -24,9 +28,12 @@ class Lookup extends Base { ); } - factory Lookup.fromJson(Map parsedJson) { + // CreatedBy.fromJson(dynamic json) { + // userId = json['userId'] ?? ''; + // userName = json['userName'] ?? ''; + // } - if (parsedJson == null) return null; + factory Lookup.fromJson(Map parsedJson) { return Lookup( name: parsedJson["name"], id: parsedJson["id"], diff --git a/lib/models/new_models/dashboardCount.dart b/lib/models/new_models/dashboard_count.dart similarity index 51% rename from lib/models/new_models/dashboardCount.dart rename to lib/models/new_models/dashboard_count.dart index 7fddba76..55bafffa 100644 --- a/lib/models/new_models/dashboardCount.dart +++ b/lib/models/new_models/dashboard_count.dart @@ -1,21 +1,15 @@ class DashboardCount { - Data data; - String message; - String title; - String innerMessage; - int responseCode; - bool isSuccess; + Data? data; + String? message; + String? title; + String? innerMessage; + int? responseCode; + bool? isSuccess; - DashboardCount( - {this.data, - this.message, - this.title, - this.innerMessage, - this.responseCode, - this.isSuccess}); + DashboardCount({this.data, this.message, this.title, this.innerMessage, this.responseCode, this.isSuccess}); DashboardCount.fromJson(Map json) { - data = json['data'] != null ? Data.fromJson(json['data']) : null; + data = json['data'] != null ? Data.fromJson(json['data']) : null; message = json['message']; title = json['title']; innerMessage = json['innerMessage']; @@ -26,7 +20,7 @@ class DashboardCount { Map toJson() { final Map data = {}; if (this.data != null) { - data['data'] = this.data.toJson(); + data['data'] = this.data!.toJson(); } data['message'] = message; data['title'] = title; @@ -38,28 +32,22 @@ class DashboardCount { } class Data { - int countOpen; - int countInprogress; - int countComplete; - int countAcknowledge; - int countHighPriority; - int countOverdue; + int? countOpen; + int? countInprogress; + int? countComplete; + int? countAcknowledge; + int? countHighPriority; + int? countOverdue; - Data( - {this.countOpen, - this.countInprogress, - this.countComplete, - this.countAcknowledge, - this.countHighPriority, - this.countOverdue}); + Data({this.countOpen, this.countInprogress, this.countComplete, this.countAcknowledge, this.countHighPriority, this.countOverdue}); Data.fromJson(Map json) { - countOpen = json['countOpen']??0; - countInprogress = json['countInprogress']??0; - countComplete = json['countComplete']??0; - countAcknowledge = json['countAcknowledge']??0; - countHighPriority = json['countHighPriority']??0; - countOverdue = json['countOverdue']??0; + countOpen = json['countOpen'] ?? 0; + countInprogress = json['countInprogress'] ?? 0; + countComplete = json['countComplete'] ?? 0; + countAcknowledge = json['countAcknowledge'] ?? 0; + countHighPriority = json['countHighPriority'] ?? 0; + countOverdue = json['countOverdue'] ?? 0; } Map toJson() { @@ -72,4 +60,4 @@ class Data { data['countOverdue'] = countOverdue; return data; } -} \ No newline at end of file +} diff --git a/lib/models/new_models/dashboard_detail.dart b/lib/models/new_models/dashboard_detail.dart index 110488b9..36126766 100644 --- a/lib/models/new_models/dashboard_detail.dart +++ b/lib/models/new_models/dashboard_detail.dart @@ -1,26 +1,19 @@ class DashboardDetail { - List data; - int totalRows; - String message; - String title; - String innerMessage; - int responseCode; - bool isSuccess; + List? data; + int? totalRows; + String? message; + String? title; + String? innerMessage; + int? responseCode; + bool? isSuccess; - DashboardDetail( - {this.data, - this.totalRows, - this.message, - this.title, - this.innerMessage, - this.responseCode, - this.isSuccess}); + DashboardDetail({this.data, this.totalRows, this.message, this.title, this.innerMessage, this.responseCode, this.isSuccess}); DashboardDetail.fromJson(Map json) { if (json['data'] != null) { data = []; json['data'].forEach((v) { - data.add(Data.fromJson(v)); + data!.add(Data.fromJson(v)); }); } totalRows = json['totalRows']; @@ -34,7 +27,7 @@ class DashboardDetail { Map toJson() { final Map data = {}; if (this.data != null) { - data['data'] = this.data.map((v) => v.toJson()).toList(); + data['data'] = this.data!.map((v) => v.toJson()).toList(); } data['totalRows'] = totalRows; data['message'] = message; @@ -47,28 +40,18 @@ class DashboardDetail { } class Data { - int id; - String typeTransaction; - String transactionDate; - String statusName; - String priorityName; - bool isHighPriority; - String assetName; - String assetNumber; - String requestTypeName; - String requestNo; + int? id; + String? typeTransaction; + String? transactionDate; + String? statusName; + String? priorityName; + bool? isHighPriority; + String? assetName; + String? assetNumber; + String? requestTypeName; + String? requestNo; - Data( - {this.id, - this.typeTransaction, - this.transactionDate, - this.statusName, - this.priorityName, - this.isHighPriority, - this.assetName, - this.assetNumber, - this.requestTypeName, - this.requestNo}); + Data({this.id, this.typeTransaction, this.transactionDate, this.statusName, this.priorityName, this.isHighPriority, this.assetName, this.assetNumber, this.requestTypeName, this.requestNo}); Data.fromJson(Map json) { id = json['id']; @@ -98,22 +81,16 @@ class Data { return data; } } -class CommonResponseModel{ - bool data; - String message; - String title; - String innerMessage; - int responseCode; - bool isSuccess; - CommonResponseModel({ - this.data, - this.message, - this.title, - this.innerMessage, - this.responseCode, - this.isSuccess, - }); +class CommonResponseModel { + bool? data; + String? message; + String? title; + String? innerMessage; + int? responseCode; + bool? isSuccess; + + CommonResponseModel({this.data, this.message, this.title, this.innerMessage, this.responseCode, this.isSuccess}); factory CommonResponseModel.fromJson(Map json) { return CommonResponseModel( @@ -137,4 +114,3 @@ class CommonResponseModel{ }; } } - diff --git a/lib/models/new_models/gas_refill_model.dart b/lib/models/new_models/gas_refill_model.dart index 99dbb4c1..5b5c6b97 100644 --- a/lib/models/new_models/gas_refill_model.dart +++ b/lib/models/new_models/gas_refill_model.dart @@ -12,30 +12,29 @@ import 'package:test_sa/models/new_models/site.dart'; import 'package:test_sa/models/timer_model.dart'; class GasRefillModel { - GasRefillModel({ - this.id, - this.gazRefillNo, - this.expectedDate, - this.expectedTime, - this.startDate, - this.startTime, - this.endDate, - this.endTime, - this.engSignature, - this.nurseSignature, - this.workingHours, - this.site, - this.building, - this.floor, - this.department, - this.assignedEmployee, - this.status, - this.comment, - this.gazRefillDetails, - this.localEngineerSignature, - this.localNurseSignature, - this.timer, - }); + GasRefillModel( + {this.id, + this.gazRefillNo, + this.expectedDate, + this.expectedTime, + this.startDate, + this.startTime, + this.endDate, + this.endTime, + this.engSignature, + this.nurseSignature, + this.workingHours, + this.site, + this.building, + this.floor, + this.department, + this.assignedEmployee, + this.status, + this.comment, + this.gazRefillDetails, + this.localEngineerSignature, + this.localNurseSignature, + this.timer}); GasRefillModel.fromJson(dynamic json) { id = json['id']; diff --git a/lib/models/new_models/workOrderDetail.dart b/lib/models/new_models/workOrderDetail.dart index 249570c8..f17c3d78 100644 --- a/lib/models/new_models/workOrderDetail.dart +++ b/lib/models/new_models/workOrderDetail.dart @@ -1,25 +1,18 @@ import 'package:test_sa/models/lookup.dart'; class WorkOrderDetail { - WorkOrder data; - String message; - String title; - String innerMessage; - int responseCode; - bool isSuccess; - - WorkOrderDetail({ - this.data, - this.message, - this.title, - this.innerMessage, - this.responseCode, - this.isSuccess, - }); + WorkOrder? data; + String? message; + String? title; + String? innerMessage; + int? responseCode; + bool? isSuccess; + + WorkOrderDetail({this.data, this.message, this.title, this.innerMessage, this.responseCode, this.isSuccess}); factory WorkOrderDetail.fromJson(Map json) { return WorkOrderDetail( - data: WorkOrder.fromJson(json['data']), + data: json['data'] == null ? null : WorkOrder.fromJson(json['data']), message: json['message'], title: json['title'], innerMessage: json['innerMessage'], @@ -27,6 +20,7 @@ class WorkOrderDetail { isSuccess: json['isSuccess'], ); } + Map toJson() { return { 'data': data?.toJson(), @@ -40,46 +34,46 @@ class WorkOrderDetail { } class WorkOrder { - String workOrderNo; - WorkOrderCreatedBy workOrderCreatedBy; - DateTime requestedDate; - Asset asset; - Lookup assetGroup; - Lookup manufacturer; - Lookup model; - Lookup assetNDModel; - Site site; - Lookup building; - Lookup floor; - Lookup department; + String? workOrderNo; + WorkOrderCreatedBy? workOrderCreatedBy; + DateTime? requestedDate; + Asset? asset; + Lookup? assetGroup; + Lookup? manufacturer; + Lookup? model; + Lookup? assetNDModel; + Site? site; + Lookup? building; + Lookup? floor; + Lookup? department; dynamic room; - Lookup assetType; - AssignedEmployee assignedEmployee; + Lookup? assetType; + AssignedEmployee? assignedEmployee; dynamic lastActivityStatus; - Lookup status; - Lookup nextStep; + Lookup? status; + Lookup? nextStep; dynamic assetVerificationType; - List workOrderContactPerson; - EquipmentStatus equipmentStatus; - Priority priority; - RequestedThrough requestedThrough; - TypeOfRequest typeofRequest; + List? workOrderContactPerson; + EquipmentStatus? equipmentStatus; + Priority? priority; + RequestedThrough? requestedThrough; + TypeOfRequest? typeofRequest; dynamic loanAvailablity; dynamic assetLoan; dynamic safety; - ProblemDescription problemDescription; - String comments; - String voiceNote; - List workOrderAttachments; + ProblemDescription? problemDescription; + String? comments; + String? voiceNote; + List? workOrderAttachments; dynamic returnToService; dynamic serviceType; dynamic failureReasone; dynamic solution; dynamic totalWorkingHours; - List workOrderHistory; - List activityMaintenances; - List activitySpareParts; - List activityAssetToBeRetireds; + List? workOrderHistory; + List? activityMaintenances; + List? activitySpareParts; + List? activityAssetToBeRetireds; WorkOrder({ this.workOrderNo, @@ -130,24 +124,22 @@ class WorkOrder { workOrderCreatedBy: WorkOrderCreatedBy.fromJson(json['workOrderCreatedBy']), requestedDate: DateTime.parse(json['requestedDate']), asset: Asset.fromJson(json['asset']), - assetGroup: json['assetGroup']??Lookup.fromJson(json['assetGroup']), - manufacturer:json['manufacturer']?? Lookup.fromJson(json['manufacturer']), - model: json['model']?? Lookup.fromJson(json['model']), - assetNDModel:json['assetNDModel']?? Lookup.fromJson(json['assetNDModel']), + assetGroup: json['assetGroup'] ?? Lookup.fromJson(json['assetGroup']), + manufacturer: json['manufacturer'] ?? Lookup.fromJson(json['manufacturer']), + model: json['model'] ?? Lookup.fromJson(json['model']), + assetNDModel: json['assetNDModel'] ?? Lookup.fromJson(json['assetNDModel']), site: Site.fromJson(json['site']), - building: json['building']??Lookup.fromJson(json['building']), - floor: json['floor']??Lookup.fromJson(json['floor']), - department:json['department']?? Lookup.fromJson(json['department']), + building: json['building'] ?? Lookup.fromJson(json['building']), + floor: json['floor'] ?? Lookup.fromJson(json['floor']), + department: json['department'] ?? Lookup.fromJson(json['department']), room: json['room'], - assetType: json['assetType']??Lookup.fromJson(json['assetType']), + assetType: json['assetType'] ?? Lookup.fromJson(json['assetType']), assignedEmployee: AssignedEmployee.fromJson(json['assignedEmployee']), lastActivityStatus: json['lastActivityStatus'], - status: json['status']??Lookup.fromJson(json['status']), - nextStep: json['nextStep']??Lookup.fromJson(json['nextStep']), + status: json['status'] ?? Lookup.fromJson(json['status']), + nextStep: json['nextStep'] ?? Lookup.fromJson(json['nextStep']), assetVerificationType: json['assetVerificationType'], - workOrderContactPerson: (json['workOrderContactPerson'] as List) - .map((i) => WorkOrderContactPerson.fromJson(i)) - .toList(), + workOrderContactPerson: (json['workOrderContactPerson'] as List).map((i) => WorkOrderContactPerson.fromJson(i)).toList(), equipmentStatus: EquipmentStatus.fromJson(json['equipmentStatus']), priority: Priority.fromJson(json['priority']), requestedThrough: RequestedThrough.fromJson(json['requestedThrough']), @@ -164,44 +156,43 @@ class WorkOrder { failureReasone: json['failureReasone'], solution: json['solution'], totalWorkingHours: json['totalWorkingHours'], - workOrderHistory: (json['workOrderHistory'] as List) - .map((i) => WorkOrderHistory.fromJson(i)) - .toList(), + workOrderHistory: (json['workOrderHistory'] as List).map((i) => WorkOrderHistory.fromJson(i)).toList(), activityMaintenances: json['activityMaintenances'] as List, activitySpareParts: json['activitySpareParts'] as List, activityAssetToBeRetireds: json['activityAssetToBeRetireds'] as List, ); } + Map toJson() { return { 'workOrderNo': workOrderNo, - 'workOrderCreatedBy': workOrderCreatedBy.toJson(), - 'requestedDate': requestedDate.toIso8601String(), - 'asset': asset.toJson(), - 'assetGroup': assetGroup.toJson(), - 'manufacturer': manufacturer.toJson(), - 'model': model.toJson(), - 'assetNDModel': assetNDModel.toJson(), - 'site': site.toJson(), - 'building': building.toJson(), - 'floor': floor.toJson(), - 'department': department.toJson(), + 'workOrderCreatedBy': workOrderCreatedBy?.toJson(), + 'requestedDate': requestedDate?.toIso8601String(), + 'asset': asset?.toJson(), + 'assetGroup': assetGroup?.toJson(), + 'manufacturer': manufacturer?.toJson(), + 'model': model?.toJson(), + 'assetNDModel': assetNDModel?.toJson(), + 'site': site?.toJson(), + 'building': building?.toJson(), + 'floor': floor?.toJson(), + 'department': department?.toJson(), 'room': room, - 'assetType': assetType.toJson(), - 'assignedEmployee': assignedEmployee.toJson(), + 'assetType': assetType?.toJson(), + 'assignedEmployee': assignedEmployee?.toJson(), 'lastActivityStatus': lastActivityStatus, - 'status': status.toJson(), - 'nextStep': nextStep.toJson(), + 'status': status?.toJson(), + 'nextStep': nextStep?.toJson(), 'assetVerificationType': assetVerificationType, - 'workOrderContactPerson': workOrderContactPerson.map((i) => i.toJson()).toList(), - 'equipmentStatus': equipmentStatus.toJson(), - 'priority': priority.toJson(), - 'requestedThrough': requestedThrough.toJson(), - 'typeofRequest': typeofRequest.toJson(), + 'workOrderContactPerson': workOrderContactPerson?.map((i) => i.toJson()).toList(), + 'equipmentStatus': equipmentStatus?.toJson(), + 'priority': priority?.toJson(), + 'requestedThrough': requestedThrough?.toJson(), + 'typeofRequest': typeofRequest?.toJson(), 'loanAvailablity': loanAvailablity, 'assetLoan': assetLoan, 'safety': safety, - 'problemDescription': problemDescription.toJson(), + 'problemDescription': problemDescription?.toJson(), 'comments': comments, 'voiceNote': voiceNote, 'workOrderAttachments': workOrderAttachments, @@ -210,75 +201,55 @@ class WorkOrder { 'failureReasone': failureReasone, 'solution': solution, 'totalWorkingHours': totalWorkingHours, - 'workOrderHistory': workOrderHistory.map((i) => i.toJson()).toList(), + 'workOrderHistory': workOrderHistory?.map((i) => i.toJson()).toList(), 'activityMaintenances': activityMaintenances, 'activitySpareParts': activitySpareParts, 'activityAssetToBeRetireds': activityAssetToBeRetireds, }; } - } class WorkOrderCreatedBy { - String id; - String userName; + String? id; + String? userName; WorkOrderCreatedBy({this.id, this.userName}); factory WorkOrderCreatedBy.fromJson(Map json) { - return WorkOrderCreatedBy( - id: json['id'], - userName: json['userName'], - ); + return WorkOrderCreatedBy(id: json['id'], userName: json['userName']); } + Map toJson() { - return { - 'id': id, - 'userName': userName, - }; + return {'id': id, 'userName': userName}; } } class Asset { - int id; - String assetNumber; + int? id; + String? assetNumber; Asset({this.id, this.assetNumber}); factory Asset.fromJson(Map json) { - return Asset( - id: json['id'], - assetNumber: json['assetNumber'], - ); + return Asset(id: json['id'], assetNumber: json['assetNumber']); } + Map toJson() { - return { - 'id': id, - 'assetNumber': assetNumber, - }; + return {'id': id, 'assetNumber': assetNumber}; } } class WorkOrderContactPerson { - int id; - String name; - String employeeId; - String position; - String extension; - String email; - String mobilePhone; - ContactUser contactUser; - - WorkOrderContactPerson({ - this.id, - this.name, - this.employeeId, - this.position, - this.extension, - this.email, - this.mobilePhone, - this.contactUser, - }); + int? id; + String? name; + String? employeeId; + String? position; + String? extension; + String? email; + String? mobilePhone; + ContactUser? contactUser; + + WorkOrderContactPerson({this.id, this.name, this.employeeId, this.position, this.extension, this.email, this.mobilePhone, this.contactUser}); factory WorkOrderContactPerson.fromJson(Map json) { return WorkOrderContactPerson( @@ -289,7 +260,7 @@ class WorkOrderContactPerson { extension: json['extension'], email: json['email'], mobilePhone: json['mobilePhone'], - contactUser: ContactUser.fromJson(json['contactUser']), + contactUser: json['contactUser'] == null ? null : ContactUser.fromJson(json['contactUser']), ); } @@ -302,72 +273,53 @@ class WorkOrderContactPerson { 'extension': extension, 'email': email, 'mobilePhone': mobilePhone, - 'contactUser': contactUser.toJson(), + 'contactUser': contactUser?.toJson(), }; } } class ContactUser { - String id; - String userName; + String? id; + String? userName; - ContactUser({ - this.id, - this.userName, - }); + ContactUser({this.id, this.userName}); factory ContactUser.fromJson(Map json) { - return ContactUser( - id: json['id'], - userName: json['userName'], - ); + return ContactUser(id: json['id'], userName: json['userName']); } Map toJson() { - return { - 'id': id, - 'userName': userName, - }; + return {'id': id, 'userName': userName}; } } class AssignedEmployee { - String id; - String userName; + String? id; + String? userName; AssignedEmployee({this.id, this.userName}); factory AssignedEmployee.fromJson(Map json) { - return AssignedEmployee( - id: json['id'], - userName: json['userName'], - ); + return AssignedEmployee(id: json['id'], userName: json['userName']); } + Map toJson() { - return { - 'id': id, - 'userName': userName, - }; + return {'id': id, 'userName': userName}; } } class Site { - int id; - String siteName; + int? id; + String? siteName; Site({this.id, this.siteName}); factory Site.fromJson(Map json) { - return Site( - id: json['id'], - siteName: json['siteName'], - ); + return Site(id: json['id'], siteName: json['siteName']); } + Map toJson() { - return { - 'id': id, - 'siteName': siteName, - }; + return {'id': id, 'siteName': siteName}; } } @@ -589,151 +541,118 @@ class Site { // } // } - - - class EquipmentStatus { - int id; - String name; - int value; + int? id; + String? name; + int? value; EquipmentStatus({this.id, this.name, this.value}); factory EquipmentStatus.fromJson(Map json) { - return EquipmentStatus( - id: json['id'], - name: json['name'], - value: json['value'], - ); + return EquipmentStatus(id: json['id'], name: json['name'], value: json['value']); } + Map toJson() { - return { - 'id': id, - 'name': name, - 'value': value, - }; + return {'id': id, 'name': name, 'value': value}; } } class Priority { - int id; - String name; - int value; + int? id; + String? name; + int? value; Priority({this.id, this.name, this.value}); factory Priority.fromJson(Map json) { - return Priority( - id: json['id'], - name: json['name'], - value: json['value'], - ); + return Priority(id: json['id'], name: json['name'], value: json['value']); } + Map toJson() { - return { - 'id': id, - 'name': name, - 'value': value, - }; + return {'id': id, 'name': name, 'value': value}; } } class RequestedThrough { - int id; - String name; + int? id; + String? name; RequestedThrough({this.id, this.name}); factory RequestedThrough.fromJson(Map json) { - return RequestedThrough( - id: json['id'], - name: json['name'], - ); + return RequestedThrough(id: json['id'], name: json['name']); } + Map toJson() { - return { - 'id': id, - 'name': name, - }; + return {'id': id, 'name': name}; } } class TypeOfRequest { - int id; - String name; + int? id; + String? name; TypeOfRequest({this.id, this.name}); factory TypeOfRequest.fromJson(Map json) { - return TypeOfRequest( - id: json['id'], - name: json['name'], - ); + return TypeOfRequest(id: json['id'], name: json['name']); } + Map toJson() { - return { - 'id': id, - 'name': name, - }; + return {'id': id, 'name': name}; } } class ProblemDescription { - int id; - String name; + int? id; + String? name; ProblemDescription({this.id, this.name}); factory ProblemDescription.fromJson(Map json) { - return ProblemDescription( - id: json['id'], - name: json['name'], - ); + return ProblemDescription(id: json['id'], name: json['name']); } + Map toJson() { - return { - 'id': id, - 'name': name, - }; + return {'id': id, 'name': name}; } } class WorkOrderHistory { - int id; - Lookup workOrderStatus; + int? id; + Lookup? workOrderStatus; dynamic activityStatus; // Since activityStatus is null, it's dynamic - String date; - HistoryUser user; - Lookup step; + String? date; + HistoryUser? user; + Lookup? step; dynamic fixRemotelyStartTime; // Since it's null, it's dynamic dynamic fixRemotelyEndTime; // Since it's null, it's dynamic dynamic fixRemotelyWorkingHours; // Since it's null, it's dynamic - String comments; + String? comments; dynamic needAVisitDateTime; // Since it's null, it's dynamic - WorkOrderHistory({ - this.id, - this.workOrderStatus, - this.activityStatus, - this.date, - this.user, - this.step, - this.fixRemotelyStartTime, - this.fixRemotelyEndTime, - this.fixRemotelyWorkingHours, - this.comments, - this.needAVisitDateTime, - }); + WorkOrderHistory( + {this.id, + this.workOrderStatus, + this.activityStatus, + this.date, + this.user, + this.step, + this.fixRemotelyStartTime, + this.fixRemotelyEndTime, + this.fixRemotelyWorkingHours, + this.comments, + this.needAVisitDateTime}); factory WorkOrderHistory.fromJson(Map json) { return WorkOrderHistory( id: json['id'], //json['assetType'] != null ? Lookup.fromJson(json['assetType']) : null; - workOrderStatus:json['workorderStatus']??Lookup.fromJson(json['workorderStatus']), + workOrderStatus: json['workorderStatus'] ?? Lookup.fromJson(json['workorderStatus']), activityStatus: json['activityStatus'], date: json['date'], user: HistoryUser.fromJson(json['user']), - step: json['step']??Lookup.fromJson(json['step']), + step: json['step'] ?? Lookup.fromJson(json['step']), fixRemotelyStartTime: json['fixRemotlyStartTime'], fixRemotelyEndTime: json['fixRemotlyEndTime'], fixRemotelyWorkingHours: json['fixRemotlyWorkingHours'], @@ -746,11 +665,11 @@ class WorkOrderHistory { return { 'id': id, // Lookup.fromJson(json['workorderStatus']) - 'workorderStatus': workOrderStatus.toJson(), + 'workorderStatus': workOrderStatus?.toJson(), 'activityStatus': activityStatus, 'date': date, - 'user': user.toJson(), - 'step': step.toJson(), + 'user': user?.toJson(), + 'step': step?.toJson(), 'fixRemotelyStartTime': fixRemotelyStartTime, 'fixRemotelyEndTime': fixRemotelyEndTime, 'fixRemotelyWorkingHours': fixRemotelyWorkingHours, @@ -789,26 +708,17 @@ class WorkOrderHistory { // } class HistoryUser { - String id; - String userName; + String? id; + String? userName; - HistoryUser({ - this.id, - this.userName, - }); + HistoryUser({this.id, this.userName}); factory HistoryUser.fromJson(Map json) { - return HistoryUser( - id: json['id'], - userName: json['userName'], - ); + return HistoryUser(id: json['id'], userName: json['userName']); } Map toJson() { - return { - 'id': id, - 'userName': userName, - }; + return {'id': id, 'userName': userName}; } } @@ -839,4 +749,3 @@ class HistoryUser { // }; // } // } - diff --git a/lib/new_views/app_style/app_themes.dart b/lib/new_views/app_style/app_themes.dart index 587092f6..9e82c8a3 100644 --- a/lib/new_views/app_style/app_themes.dart +++ b/lib/new_views/app_style/app_themes.dart @@ -19,8 +19,8 @@ class AppThemes { ), bottomNavigationBarTheme: BottomNavigationBarThemeData( type: BottomNavigationBarType.fixed, - unselectedLabelStyle: ThemeData.light().textTheme.bodySmall.copyWith(fontWeight: FontWeight.w500), - selectedLabelStyle: ThemeData.light().textTheme.bodySmall.copyWith(fontWeight: FontWeight.w500), + unselectedLabelStyle: ThemeData.light().textTheme.bodySmall?.copyWith(fontWeight: FontWeight.w500), + selectedLabelStyle: ThemeData.light().textTheme.bodySmall?.copyWith(fontWeight: FontWeight.w500), selectedItemColor: AppColor.primary90, unselectedItemColor: AppColor.neutral120, backgroundColor: Colors.white, @@ -47,8 +47,8 @@ class AppThemes { ), bottomNavigationBarTheme: BottomNavigationBarThemeData( type: BottomNavigationBarType.fixed, - unselectedLabelStyle: ThemeData.dark().textTheme.bodySmall.copyWith(fontWeight: FontWeight.w500), - selectedLabelStyle: ThemeData.dark().textTheme.bodySmall.copyWith(fontWeight: FontWeight.w500), + unselectedLabelStyle: ThemeData.dark().textTheme.bodySmall?.copyWith(fontWeight: FontWeight.w500), + selectedLabelStyle: ThemeData.dark().textTheme.bodySmall?.copyWith(fontWeight: FontWeight.w500), selectedItemColor: AppColor.primary40, unselectedItemColor: AppColor.neutral10, backgroundColor: AppColor.neutral60, diff --git a/lib/new_views/common_widgets/app_bottom_nav_bar.dart b/lib/new_views/common_widgets/app_bottom_nav_bar.dart index 13da57ae..8e5f4565 100644 --- a/lib/new_views/common_widgets/app_bottom_nav_bar.dart +++ b/lib/new_views/common_widgets/app_bottom_nav_bar.dart @@ -2,7 +2,6 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/extensions/context_extension.dart'; -import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/enums/user_types.dart'; @@ -12,11 +11,11 @@ class AppBottomNavigationBar extends StatelessWidget { final Function(int index) onPressed; final int selectedIndex; - const AppBottomNavigationBar({Key key, @required this.onPressed, @required this.selectedIndex}) : super(key: key); + const AppBottomNavigationBar({Key? key, required this.onPressed, required this.selectedIndex}) : super(key: key); @override Widget build(BuildContext context) { - bool isEngineer = (Provider.of(context, listen: false).user.type) == UsersTypes.engineer; + bool isEngineer = (Provider.of(context, listen: false).user!.type) == UsersTypes.engineer; return Container( // height: 86.toScreenHeight, decoration: BoxDecoration( @@ -41,19 +40,19 @@ class AppBottomNavigationBar extends StatelessWidget { ); } - BottomNavigationBarItem navBarItem(BuildContext context, {@required int index, @required String iconName, @required String label, bool showLabel = true}) { + BottomNavigationBarItem navBarItem(BuildContext context, {required int index, required String iconName, required String label, bool showLabel = true}) { return BottomNavigationBarItem( icon: iconName - ?.toSvgAsset( + .toSvgAsset( width: showLabel ? 28 : 38, height: showLabel ? 26 : 40, - color: showLabel||(showLabel && selectedIndex != 2) + color: showLabel || (showLabel && selectedIndex != 2) ? selectedIndex == index ? Theme.of(context).bottomNavigationBarTheme.selectedItemColor : Theme.of(context).bottomNavigationBarTheme.unselectedItemColor : null, ) - ?.paddingOnly(top: 21, bottom: showLabel ? 4 : 0), + .paddingOnly(top: 21, bottom: showLabel ? 4 : 0), label: showLabel ? label : '', ); } diff --git a/lib/new_views/common_widgets/app_dashed_button.dart b/lib/new_views/common_widgets/app_dashed_button.dart index 9fc2f841..9e805de8 100644 --- a/lib/new_views/common_widgets/app_dashed_button.dart +++ b/lib/new_views/common_widgets/app_dashed_button.dart @@ -10,11 +10,11 @@ import '../app_style/app_color.dart'; class AppDashedButton extends StatelessWidget { final String title; final VoidCallback onPressed; - double height; - Color buttonColor; - Widget icon; + double? height; + Color? buttonColor; + Widget? icon; - AppDashedButton({@required this.title, @required this.onPressed, Key key,this.height,this.icon,this.buttonColor}) : super(key: key); + AppDashedButton({required this.title, required this.onPressed, Key? key, this.height, this.icon, this.buttonColor}) : super(key: key); @override Widget build(BuildContext context) { @@ -26,20 +26,20 @@ class AppDashedButton extends StatelessWidget { child: DottedBorder( strokeWidth: 1, padding: EdgeInsets.symmetric(vertical: 16.toScreenHeight, horizontal: 16.toScreenWidth), - color: context.isDark ? AppColor.primary40 : buttonColor?? AppColor.black20, + color: context.isDark ? AppColor.primary40 : buttonColor ?? AppColor.black20, dashPattern: const [4, 3], radius: const Radius.circular(10), borderType: BorderType.RRect, - child:icon!=null? - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - icon, - 7.width, - title.heading6(context).custom(color: context.isDark ? AppColor.primary40 : buttonColor??AppColor.black10).center, - ], - ): - title.heading6(context).custom(color: context.isDark ? AppColor.primary40 : buttonColor?? AppColor.primary10).center, + child: icon != null + ? Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + icon!, + 7.width, + title.heading6(context).custom(color: context.isDark ? AppColor.primary40 : buttonColor ?? AppColor.black10).center, + ], + ) + : title.heading6(context).custom(color: context.isDark ? AppColor.primary40 : buttonColor ?? AppColor.primary10).center, ), ).onPress(onPressed); } diff --git a/lib/new_views/common_widgets/app_filled_button.dart b/lib/new_views/common_widgets/app_filled_button.dart index a1f8577f..193503ed 100644 --- a/lib/new_views/common_widgets/app_filled_button.dart +++ b/lib/new_views/common_widgets/app_filled_button.dart @@ -5,27 +5,15 @@ import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; class AppFilledButton extends StatelessWidget { - final VoidCallback onPressed; + final VoidCallback? onPressed; final String label; final bool maxWidth, loading; - final Color buttonColor; - final Color textColor; + final Color? buttonColor; + final Color? textColor; final bool showBorder; - final bool showIcon; - final Widget icon; - const AppFilledButton({ - @required this.onPressed, - @required this.label, - this.maxWidth = false, - this.icon, - this.loading = false, - this.showBorder = false, - this.showIcon = false, - this.buttonColor, - this.textColor, - Key key, - }) : super(key: key); + const AppFilledButton({ this.onPressed, required this.label, this.maxWidth = false, this.loading = false, this.showBorder = false, this.buttonColor, this.textColor, Key? key}) + : super(key: key); @override Widget build(BuildContext context) { @@ -40,25 +28,14 @@ class AppFilledButton extends StatelessWidget { ), child: loading ? SizedBox( - width: 24, - height: 24, - child: CircularProgressIndicator( - color: textColor ?? AppColor.background(context), - strokeWidth: 2, - ), - ) - : showIcon&&icon!=null? - Center( - child: Row( - mainAxisSize:MainAxisSize.min, - children: [ - icon, - 8.width, - label.heading6(context).custom(color: textColor ?? AppColor.background(context)) - ], - ), - ): - label.heading6(context).custom(color: textColor ?? AppColor.background(context)), + width: 24, + height: 24, + child: CircularProgressIndicator( + color: textColor ?? AppColor.background(context), + strokeWidth: 2, + ), + ) + : label.heading6(context).custom(color: textColor ?? AppColor.background(context)), ).onPress(onPressed); } } diff --git a/lib/new_views/pages/land_page/land_page.dart b/lib/new_views/pages/land_page/land_page.dart index 2fb2ad43..090372bb 100644 --- a/lib/new_views/pages/land_page/land_page.dart +++ b/lib/new_views/pages/land_page/land_page.dart @@ -29,7 +29,7 @@ import 'dashboard_page.dart'; class LandPage extends StatefulWidget { static const String routeName = "/land-page"; - const LandPage({Key key}) : super(key: key); + const LandPage({Key? key}) : super(key: key); @override State createState() => _LandPageState(); @@ -39,8 +39,8 @@ class _LandPageState extends State { final GlobalKey _scaffoldKey = GlobalKey(); int currentPageIndex = 0; bool showAppbar = true; - List _pages; - UserProvider _userProvider; + late List _pages; + UserProvider? _userProvider; @override void initState() { @@ -104,11 +104,11 @@ class _LandPageState extends State { _userProvider = Provider.of(context, listen: false); _pages = [ DashboardView(onDrawerPress: (() { - _scaffoldKey.currentState.isDrawerOpen ? _scaffoldKey.currentState.closeDrawer() : _scaffoldKey.currentState.openDrawer(); + _scaffoldKey.currentState!.isDrawerOpen ? _scaffoldKey.currentState!.closeDrawer() : _scaffoldKey.currentState!.openDrawer(); })), // const old_page.LandPage(), const MyRequestsPage(), - if (_userProvider.user.type != UsersTypes.engineer) const CalendarPage(), + if (_userProvider!.user!.type != UsersTypes.engineer) const CalendarPage(), const MyAssetsPage(fromBottomBar: true), ]; checkLocalAuth(); @@ -135,7 +135,7 @@ class _LandPageState extends State { bottomNavigationBar: AppBottomNavigationBar( selectedIndex: currentPageIndex, onPressed: (index) { - bool isEngineer = _userProvider.user.type == UsersTypes.engineer; + bool isEngineer = _userProvider!.user!.type == UsersTypes.engineer; if (index == (!isEngineer ? 4 : 3)) { showModalBottomSheet( context: context, diff --git a/lib/new_views/pages/land_page/requests_list_page.dart b/lib/new_views/pages/land_page/requests_list_page.dart index 292eb7dd..a79b6a6e 100644 --- a/lib/new_views/pages/land_page/requests_list_page.dart +++ b/lib/new_views/pages/land_page/requests_list_page.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/providers/api/all_requests_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/extensions/context_extension.dart'; @@ -8,27 +7,23 @@ import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/all_requests_and_count_model.dart'; import 'package:test_sa/models/enums/user_types.dart'; -import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/common_widgets/default_app_bar.dart'; -import 'package:test_sa/dashboard_latest/widgets/request_category_list.dart'; import 'package:test_sa/new_views/pages/land_page/requests/request_paginated_listview.dart'; -import 'package:test_sa/new_views/pages/land_page/widgets/request_item_view_list.dart'; -import 'package:test_sa/views/widgets/loaders/lazy_loading.dart'; class RequestsListPage extends StatefulWidget { static const String routeName = "/requests-list-page"; final int index; final String title; - const RequestsListPage(this.index, this.title, {Key key}) : super(key: key); + const RequestsListPage(this.index, this.title, {Key? key}) : super(key: key); @override State createState() => _RequestsListPageState(); } class _RequestsListPageState extends State { - AllRequestsProvider _provider; - ScrollController _scrollController; + late AllRequestsProvider _provider; + late ScrollController _scrollController; @override void initState() { @@ -51,12 +46,11 @@ class _RequestsListPageState extends State { void handleScroll() async { _scrollController = ScrollController(); - int pageNo =1; + int pageNo = 1; _scrollController.addListener(() async { if (_scrollController?.position?.pixels == _scrollController?.position?.maxScrollExtent && !_provider.isRequestCategoryLoading) { - pageNo = pageNo + 1; - callRequestApis(showLoader: false,pageNo: pageNo); + callRequestApis(showLoader: false, pageNo: pageNo); } }); } @@ -80,7 +74,8 @@ class _RequestsListPageState extends State { WidgetsBinding.instance.addPostFrameCallback((_) { snapshot.requestDetailList = snapshot.selectedRequestCategory; }); - return RequestPaginatedList(snapshot.selectedRequestCategory.requestsDetails ?? [], snapshot.isRequestCategoryLoading, snapshot.selectedRequestCategory.total.count, _scrollController); + return RequestPaginatedList( + snapshot.selectedRequestCategory!.requestsDetails ?? [], snapshot.isRequestCategoryLoading, snapshot.selectedRequestCategory?.total?.count ?? 0, _scrollController); } bool isLoading = widget.index == 0 ? snapshot.isHighPriorityLoading @@ -109,7 +104,7 @@ class _RequestsListPageState extends State { int pageNo = 1, int pageSize = 10, }) async { - UsersTypes usersTypes = Provider.of(context, listen: false).user.type; + UsersTypes usersTypes = Provider.of(context, listen: false).user!.type!; print('i am here at ${widget.index}'); if (widget.index == 0) { diff --git a/lib/providers/work_order/reason_provider.dart b/lib/providers/work_order/reason_provider.dart index e99c91e6..533e3218 100644 --- a/lib/providers/work_order/reason_provider.dart +++ b/lib/providers/work_order/reason_provider.dart @@ -9,7 +9,8 @@ import '../../models/lookup.dart'; class ReasonProvider extends LoadingListNotifier { - String serviceRequestId; + String? serviceRequestId; + @override Future getDate() async { if (loading == true) return -2; diff --git a/lib/service_request_latest/views/components/action_button/footer_action_button.dart b/lib/service_request_latest/views/components/action_button/footer_action_button.dart index 09b6b349..6629b79f 100644 --- a/lib/service_request_latest/views/components/action_button/footer_action_button.dart +++ b/lib/service_request_latest/views/components/action_button/footer_action_button.dart @@ -9,7 +9,7 @@ import 'package:test_sa/service_request_latest/views/components/bottom_sheets/se class FooterActionButton { - static Widget footerContainer({@required Widget child}){ + static Widget footerContainer({required Widget child}){ return Align( alignment: Alignment.bottomCenter, child: Container( @@ -20,7 +20,7 @@ class FooterActionButton { ); } - static Widget footerWidget({@required int status,@required BuildContext context}){ + static Widget footerWidget({required int status,required BuildContext context}){ switch(status){ //accept reject... case 1: @@ -119,8 +119,8 @@ class FooterActionButton { child: AppFilledButton( label: context.translation.iHaveArrived, - showIcon: true, - icon: 'arrived_icon'.toSvgAsset(), + //showIcon: true, + // icon: 'arrived_icon'.toSvgAsset(), buttonColor: AppColor.green70, onPressed: () async { diff --git a/lib/service_request_latest/views/components/initial_visit_card.dart b/lib/service_request_latest/views/components/initial_visit_card.dart index 4da5616c..94705cea 100644 --- a/lib/service_request_latest/views/components/initial_visit_card.dart +++ b/lib/service_request_latest/views/components/initial_visit_card.dart @@ -7,7 +7,7 @@ import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; class InitialVisitCard extends StatelessWidget { - const InitialVisitCard({Key key}) : super(key: key); + const InitialVisitCard({Key? key}) : super(key: key); @override Widget build(BuildContext context) { 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 0e6cac3b..b302f404 100644 --- a/lib/service_request_latest/views/components/request_detail_view.dart +++ b/lib/service_request_latest/views/components/request_detail_view.dart @@ -15,28 +15,22 @@ 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/action_button/footer_action_button.dart'; -import 'package:test_sa/service_request_latest/views/components/bottom_sheets/service_request_bottomsheet.dart'; import 'package:test_sa/service_request_latest/views/components/initial_visit_card.dart'; import 'package:test_sa/service_request_latest/views/components/timer_widget.dart'; import 'package:test_sa/service_request_latest/views/forms/asset_retired/asset_retired.dart'; -import 'package:test_sa/service_request_latest/views/nurse/create_new_request_view.dart'; import 'package:test_sa/views/pages/user/requests/comments_bottom_sheet.dart'; import 'package:test_sa/views/pages/user/requests/update_service_request_page.dart'; -import 'package:test_sa/views/pages/user/requests/work_order/work_orders_list_page.dart'; import 'package:test_sa/views/widgets/images/files_list.dart'; import 'package:test_sa/views/widgets/loaders/app_loading.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart'; import 'package:test_sa/views/widgets/sound/sound_player.dart'; -import '../../../models/lookup.dart'; -import '../forms/maintenance_request/maintenance_request_main.dart'; - class RequestDetailView extends StatefulWidget { static const String id = "/call-details"; ServiceRequest serviceRequest; bool fromTabView = false; - RequestDetailView({Key key, this.serviceRequest, this.fromTabView = false}) : super(key: key); + RequestDetailView({Key? key,required this.serviceRequest, this.fromTabView = false}) : super(key: key); @override State createState() => _RequestDetailViewState(); @@ -58,16 +52,14 @@ class _RequestDetailViewState extends State { // setState(() {}); }); } - final GlobalKey _detailsCardKey = GlobalKey(); - void createBreakPoint(){ + final GlobalKey _detailsCardKey = GlobalKey(); - final RenderBox detailContainerBox = - _detailsCardKey.currentContext?.findRenderObject() as RenderBox; + void createBreakPoint() { + final RenderBox detailContainerBox = _detailsCardKey.currentContext?.findRenderObject() as RenderBox; final detailContainerHeight = detailContainerBox?.size?.height; - - } + @override Widget build(BuildContext context) { UserProvider _userProvider = Provider.of(context, listen: false); @@ -87,10 +79,10 @@ class _RequestDetailViewState extends State { }); } - Widget requestDetailCard({ServiceRequestsProvider serviceRequestsProvider, UserProvider userProvider}) { - if(!serviceRequestsProvider.isDetialLoading){ - createBreakPoint(); - } + Widget requestDetailCard({required ServiceRequestsProvider serviceRequestsProvider, required UserProvider userProvider}) { + if (!serviceRequestsProvider.isDetialLoading) { + createBreakPoint(); + } return SafeArea( key: _detailsCardKey, child: serviceRequestsProvider.isDetialLoading @@ -108,18 +100,18 @@ class _RequestDetailViewState extends State { mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ - informationCard(serviceRequestsProvider.currentSelectedRequest, userProvider), + informationCard(serviceRequestsProvider.currentSelectedRequest!, userProvider), 40.height, - // skipForLater(serviceRequestsProvider.currentSelectedRequest), - // 20.height, + // skipForLater(serviceRequestsProvider.currentSelectedRequest), + // 20.height, const InitialVisitCard(), 20.height, ], ), ), FooterActionButton.footerWidget(status: 1, context: context), - const TimerWidget(), + TimerWidget(), ], ), ); @@ -143,30 +135,30 @@ class _RequestDetailViewState extends State { mainAxisSize: MainAxisSize.min, children: [ StatusLabel( - label: serviceRequest.priority.name, - id: serviceRequest.priority.id, + label: serviceRequest.priority?.name, + id: serviceRequest.priority!.id!, radius: 4, - textColor: AppColor.getPriorityStatusTextColor(context, serviceRequest.priority.id), - backgroundColor: AppColor.getPriorityStatusColor(context, serviceRequest.priority.id), + textColor: AppColor.getPriorityStatusTextColor(context, serviceRequest.priority!.id!), + backgroundColor: AppColor.getPriorityStatusColor(context, serviceRequest.priority!.id!), ), 8.width, StatusLabel( radius: 4, 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, 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), ), @@ -191,31 +183,31 @@ class _RequestDetailViewState extends State { style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), ), 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), ), ], @@ -232,7 +224,7 @@ class _RequestDetailViewState extends State { ), 8.height, 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( @@ -249,24 +241,24 @@ class _RequestDetailViewState 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), @@ -319,49 +311,43 @@ class _RequestDetailViewState extends State { isScrollControlled: true, useRootNavigator: true, backgroundColor: Colors.transparent, - builder: (context) => CommentsBottomSheet(requestId: serviceRequest.id), + builder: (context) => CommentsBottomSheet(requestId: serviceRequest.id!), ); }), //set condition for show asset detail button... - if(true)...[ + if (true) ...[ assetRetiredButton(serviceRequest: serviceRequest), ] ], ).toShadowContainer(context, padding: 0); } - Widget assetRetiredButton({ServiceRequest serviceRequest}){ + Widget assetRetiredButton({required ServiceRequest serviceRequest}) { return Padding( - padding: EdgeInsets.symmetric(horizontal: 16.toScreenHeight,vertical: 12.toScreenWidth), + padding: EdgeInsets.symmetric(horizontal: 16.toScreenHeight, vertical: 12.toScreenWidth), child: AppFilledButton( - label: context.translation.assetToBeRetired, - maxWidth: true, - buttonColor: Colors.white54, - textColor: AppColor.red30, - showBorder: true, - onPressed: () async { - // ServiceRequestBottomSheet.nurseTakeActionBottomSheet(context: context); - Navigator.push(context, MaterialPageRoute(builder: (context)=>const AssetRetired())); - - } - ), + label: context.translation.assetToBeRetired, + maxWidth: true, + buttonColor: Colors.white54, + textColor: AppColor.red30, + showBorder: true, + onPressed: () async { + // ServiceRequestBottomSheet.nurseTakeActionBottomSheet(context: context); + Navigator.push(context, MaterialPageRoute(builder: (context) => AssetRetired())); + }), ); - - - - } - Widget skipForLater (ServiceRequest serviceRequest){ - return Center( + Widget skipForLater(ServiceRequest serviceRequest) { + return Center( child: InkWell( onTap: () async { try { //use a common list AllRequestsProvider allRequestProvider = Provider.of(context, listen: false); - int index = allRequestProvider.requestDetailList.requestsDetails.indexWhere((element) => element.id.toString() == serviceRequest.id); - if (index != -1 && index != allRequestProvider.requestDetailList.requestsDetails.length) { - getServiceRequest(requestId: allRequestProvider.requestDetailList.requestsDetails[index + 1].id.toString()); + int index = allRequestProvider.requestDetailList!.requestsDetails!.indexWhere((element) => element.id.toString() == serviceRequest.id); + if (index != -1 && index != allRequestProvider.requestDetailList!.requestsDetails!.length) { + getServiceRequest(requestId: allRequestProvider.requestDetailList!.requestsDetails![index + 1].id.toString()); } } catch (e) { print(e); diff --git a/lib/service_request_latest/views/components/timer_widget.dart b/lib/service_request_latest/views/components/timer_widget.dart index b96b3186..c258e5f5 100644 --- a/lib/service_request_latest/views/components/timer_widget.dart +++ b/lib/service_request_latest/views/components/timer_widget.dart @@ -11,7 +11,7 @@ import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/service_request_latest/request_detail_provider.dart'; class TimerWidget extends StatefulWidget { - const TimerWidget({Key key}) : super(key: key); + const TimerWidget({Key? key}) : super(key: key); @override _TimerWidgetState createState() => _TimerWidgetState(); @@ -19,7 +19,7 @@ class TimerWidget extends StatefulWidget { class _TimerWidgetState extends State { - Offset position = Offset(SizeConfig.screenWidth - 100, SizeConfig.screenHeight / 2 - 50); + Offset position = Offset(SizeConfig.screenWidth! - 100, SizeConfig.screenHeight! / 2 - 50); @override void initState() { // TODO: implement initState 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 a5661d0e..9fde8966 100644 --- a/lib/service_request_latest/views/components/verify_arrival_view.dart +++ b/lib/service_request_latest/views/components/verify_arrival_view.dart @@ -15,7 +15,7 @@ import 'package:test_sa/views/widgets/qr/scan_qr.dart'; import 'activities_list_view.dart'; class VerifyArrivalView extends StatelessWidget { - VerifyArrivalView({Key key}) : super(key: key); + VerifyArrivalView({Key? key}) : super(key: key); @override Widget build(BuildContext context) { @@ -37,13 +37,12 @@ class VerifyArrivalView extends StatelessWidget { 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: serviceRequestsProvider.currentSelectedRequest, index: index,context: context); + onItemTap(serviceRequest: serviceRequestsProvider.currentSelectedRequest!, index: index,context: context); }); }, ), @@ -52,7 +51,7 @@ class VerifyArrivalView extends StatelessWidget { ); } - Widget listItem({@required BuildContext context, @required String icon, @required String heading, @required String subHeading, @required VoidCallback onTap}) { + Widget listItem({required BuildContext context, required String icon, required String heading, required String subHeading, required VoidCallback onTap}) { return Padding( padding: EdgeInsets.only(left: 16.toScreenWidth,right: 16.toScreenWidth,bottom: 12.toScreenHeight), @@ -81,7 +80,7 @@ class VerifyArrivalView extends StatelessWidget { ); } - void onItemTap({@required int index, @required ServiceRequest serviceRequest,@required BuildContext context}) { + void onItemTap({required int index, required ServiceRequest serviceRequest,required BuildContext context}) { switch(index){ case 0: Navigator.push( diff --git a/lib/service_request_latest/views/components/verify_assets_details.dart b/lib/service_request_latest/views/components/verify_assets_details.dart index 7b702b26..b59a08bf 100644 --- a/lib/service_request_latest/views/components/verify_assets_details.dart +++ b/lib/service_request_latest/views/components/verify_assets_details.dart @@ -20,6 +20,7 @@ import 'package:test_sa/providers/work_order/reason_provider.dart'; import 'package:test_sa/service_request_latest/views/components/bottom_sheets/service_request_bottomsheet.dart'; import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; + import '../../../../../controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart'; import '../../../../../controllers/providers/api/status_drop_down/report/service_types_provider.dart'; import '../../../../../models/lookup.dart'; @@ -31,19 +32,19 @@ import '../../../controllers/validator/validator.dart'; class SparePartRequest extends StatefulWidget { static const String id = "/verify-assets-detail"; - const SparePartRequest({Key key}) : super(key: key); + const SparePartRequest({Key? key}) : super(key: key); @override _SparePartRequestState createState() => _SparePartRequestState(); } class _SparePartRequestState 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 = []; @@ -68,12 +69,11 @@ 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; } - Asset loanAvailabilityAsset; @override void dispose() { @@ -87,12 +87,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); - await _assetTypeProvider.getTypes(user: _userProvider.user, host: _settingProvider.host); + _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(() {}); } @@ -109,7 +109,7 @@ class _SparePartRequestState extends State with TickerProvider } _serviceReport.assetType = _assetTypeProvider.statuses?.firstWhere( (element) => element.value == _serviceReport.callRequest?.assetType, - orElse: () => null, + orElse: null, ); return Scaffold( diff --git a/lib/service_request_latest/views/components/work_order_card_view.dart b/lib/service_request_latest/views/components/work_order_card_view.dart index 3aaf39cb..97c23b5c 100644 --- a/lib/service_request_latest/views/components/work_order_card_view.dart +++ b/lib/service_request_latest/views/components/work_order_card_view.dart @@ -21,7 +21,7 @@ class WorkOrderCardView extends StatelessWidget { final ServiceRequest serviceRequest; final bool showShadow; - WorkOrderCardView(this.workOrder, this.serviceRequest, {Key key, this.showShadow = true}) : super(key: key); + WorkOrderCardView(this.workOrder, this.serviceRequest, {Key? key, this.showShadow = true}) : super(key: key); @override Widget build(BuildContext context) { @@ -34,18 +34,18 @@ class WorkOrderCardView extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ StatusLabel( - label: workOrder.currentSituation.name, - textColor: AppColor.getRequestStatusTextColorByName(context, workOrder.currentSituation.name), - backgroundColor: AppColor.getRequestStatusColorByName(context, workOrder.currentSituation.name), + label: workOrder.currentSituation!.name, + textColor: AppColor.getRequestStatusTextColorByName(context, workOrder.currentSituation?.name), + backgroundColor: AppColor.getRequestStatusColorByName(context, workOrder.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)), Text( - '${context.translation.assetName}: ${workOrder.callRequest.asset.modelDefinition.assetName?.cleanupWhitespace?.capitalizeFirstOfEach}', + '${context.translation.assetName}: ${workOrder.callRequest?.asset?.modelDefinition?.assetName?.cleanupWhitespace?.capitalizeFirstOfEach}', style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), ), Text( - '${context.translation.currentSituation}: ${workOrder.currentSituation.name}', + '${context.translation.currentSituation}: ${workOrder.currentSituation?.name}', style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), ), 16.height, @@ -71,13 +71,13 @@ class WorkOrderCardView extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.end, mainAxisAlignment: MainAxisAlignment.start, children: [ - if (_userProvider.user.type == UsersTypes.engineer && serviceRequest.statusValue != 5 && serviceRequest.statusValue != 3) + if (_userProvider.user!.type == UsersTypes.engineer && serviceRequest.statusValue != 5 && serviceRequest.statusValue != 3) "edit_icon".toSvgAsset(height: 21, width: 21).onPress(() { Navigator.of(context).push( MaterialPageRoute(builder: (_) => UpdateServiceReport(request: serviceRequest, workOrder: workOrder)), ); }), - if (_userProvider.user.type == UsersTypes.engineer && serviceRequest.statusValue != 5 && serviceRequest.statusValue != 3) 8.height, + if (_userProvider.user!.type == UsersTypes.engineer && serviceRequest.statusValue != 5 && serviceRequest.statusValue != 3) 8.height, Text(workOrder.visitDate?.toServiceRequestCardFormat ?? "", textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral30 : const Color(0xFF3B3D4A))), ], 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 86fe22bd..99f4bcb6 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 @@ -80,7 +80,7 @@ class _CreateServiceReportState extends State with TickerPr if (context.mounted) { Provider.of(context, listen: false).reset(); Provider.of(context, listen: false).reset(); - Provider.of(context, listen: false).serviceRequestId = widget.request.id; + Provider.of(context, listen: false).serviceRequestId = widget.request.id!; } // _isLoading = true; } diff --git a/lib/views/widgets/date_and_time/date_picker.dart b/lib/views/widgets/date_and_time/date_picker.dart index 03b25ea2..1af8a172 100644 --- a/lib/views/widgets/date_and_time/date_picker.dart +++ b/lib/views/widgets/date_and_time/date_picker.dart @@ -7,26 +7,26 @@ import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; class ADatePicker extends StatelessWidget { - final DateTime date; - final DateTime from; - final DateTime to; + final DateTime? date; // Nullable + final DateTime? from; // Nullable + final DateTime? to; // Nullable final String label; final bool hideShadow; - final String hint; - final Function(DateTime) onDatePicker; - final bool enable, withBorder, withIcon; - final Color backgroundColor; + final String? hint; // Nullable + final Function(DateTime)? onDatePicker; // Nullable + final bool enable; + final bool withBorder; + final Color? backgroundColor; // Nullable final bool formatDateWithTime; - final double height; + final double? height; // Nullable const ADatePicker({ - Key key, - @required this.label, + Key? key, + required this.label, this.withBorder = true, this.height, this.backgroundColor, this.hideShadow = false, - this.withIcon = true, this.hint, this.date, this.formatDateWithTime = false, @@ -42,11 +42,11 @@ class ADatePicker extends StatelessWidget { 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: hideShadow ? null : [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)], @@ -54,35 +54,37 @@ class ADatePicker 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), - (date?.toIso8601String == null - ? hint ?? context.translation.pickADate - : (formatDateWithTime ? date?.toIso8601String()?.toFirstActionFormat : (date?.toIso8601String()?.split("T")?.first ?? context.translation.pickADate))) + (date == null + ? hint ?? context.translation.pickADate + : (formatDateWithTime + ? date?.toIso8601String()?.toFirstActionFormat // Use null-aware operator + : (date?.toIso8601String()?.split("T")?.first ?? 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(), - withIcon ? "calender".toSvgAsset(width: 20, color: context.isDark ? AppColor.neutral10 : null) : const SizedBox(), + "calender".toSvgAsset(width: 20, color: context.isDark ? AppColor.neutral10 : null), ], ), ).onPress(enable ? () async { - DateTime picked = await showDatePicker( - context: context, - initialDate: DateTime.now(), - firstDate: from ?? DateTime.now(), - lastDate: to ?? DateTime.now().add(const Duration(days: 365)), - ); - if (onDatePicker != null) onDatePicker(picked); - } + final DateTime? picked = await showDatePicker( + // Nullable DateTime + context: context, + initialDate: DateTime.now(), + firstDate: from ?? DateTime.now(), + lastDate: to ?? DateTime.now().add(const Duration(days: 365)), + ); + if (picked != null && onDatePicker != null) { + onDatePicker!(picked); // Use null-aware operator + } + } : null); } } diff --git a/lib/views/widgets/date_and_time/time_picker.dart b/lib/views/widgets/date_and_time/time_picker.dart index 74ea5bb6..dac9a94a 100644 --- a/lib/views/widgets/date_and_time/time_picker.dart +++ b/lib/views/widgets/date_and_time/time_picker.dart @@ -1,24 +1,23 @@ 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; final String label; - final String icon; - final String hint; - final Function(TimeOfDay) onTimePicker; + final String? icon; + final String? hint; + final Function(TimeOfDay)? onTimePicker; final bool enable, withBorder, withIcon; - final Color backgroundColor; - final double height; + final Color? backgroundColor; + final double? height; const ATimePicker({ - Key key, - @required this.label, + Key? key, + required this.label, this.withBorder = true, this.icon, this.withIcon = true, @@ -55,7 +54,7 @@ class ATimePicker extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ label.tinyFont(context), - (time == null ? hint ?? context.translation.pickTime : (time.format(context) ?? context.translation.pickADate)) + (time == null ? hint ?? context.translation.pickTime : (time?.format(context) ?? context.translation.pickADate)) .bodyText(context) .custom(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), ], @@ -64,26 +63,21 @@ class ATimePicker extends StatelessWidget { enable ? 16.width : const Spacer(), withIcon ? icon != null - ? icon.toSvgAsset(width: 20, color: context.isDark ? AppColor.neutral10 : null) + ? icon!.toSvgAsset(width: 20, color: context.isDark ? AppColor.neutral10 : null) : "calender".toSvgAsset(width: 20, color: context.isDark ? AppColor.neutral10 : null) : const SizedBox(), ], ), ).onPress(enable ? () async { - // Define the initial time TimeOfDay initialTime = TimeOfDay.now(); - - // Show the time picker with the initial time set - TimeOfDay pickedTime = await showTimePicker( + 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)}"); + if (onTimePicker != null) onTimePicker!(pickedTime); } } : null); diff --git a/lib/views/widgets/e_signature/e_signature.dart b/lib/views/widgets/e_signature/e_signature.dart index 4fbc46ba..86d61899 100644 --- a/lib/views/widgets/e_signature/e_signature.dart +++ b/lib/views/widgets/e_signature/e_signature.dart @@ -11,15 +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; - Color backgroundColor; - bool showShadow=true; - 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; - ESignature({Key key, this.title, this.oldSignature, this.onSaved, this.onChange, this.newSignature,this.backgroundColor,this.showShadow=true}) : 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(); @@ -27,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; @@ -44,7 +42,7 @@ class _ESignatureState extends State { @override void dispose() { - _controller.dispose(); + _controller?.dispose(); super.dispose(); } @@ -57,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: [ @@ -65,9 +63,9 @@ class _ESignatureState extends State { width: MediaQuery.of(context).size.width, padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight), decoration: BoxDecoration( - color:widget.backgroundColor ?? (context.isDark ? AppColor.background(context) : Colors.white), + color: context.isDark ? AppColor.background(context) : Colors.white, borderRadius: _editable ? const BorderRadius.only(topLeft: Radius.circular(10), topRight: Radius.circular(10)) : BorderRadius.circular(10), - boxShadow:widget.showShadow? [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)]:[], + boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)], ), child: Column( crossAxisAlignment: CrossAxisAlignment.center, @@ -78,20 +76,20 @@ class _ESignatureState extends State { children: [ widget.title.tinyFont(context).paddingOnly(top: 8), (!_editable - ? "edit".toSvgAsset(width: 48).paddingOnly(top: 8) - : Container( - width: 48.toScreenWidth, - height: 48.toScreenWidth, - decoration: BoxDecoration(borderRadius: BorderRadius.circular(100), border: Border.all(color: AppColor.neutral30)), - padding: const EdgeInsets.all(11), - margin: const EdgeInsets.only(top: 8), - child: "done".toSvgAsset(width: 26), - )) + ? "edit".toSvgAsset(width: 48).paddingOnly(top: 8) + : Container( + width: 48.toScreenWidth, + height: 48.toScreenWidth, + decoration: BoxDecoration(borderRadius: BorderRadius.circular(100), border: Border.all(color: AppColor.neutral30)), + padding: const EdgeInsets.all(11), + margin: const EdgeInsets.only(top: 8), + child: "done".toSvgAsset(width: 26), + )) .onPress(() async { if (_editable) { - signature = await _controller.toPngBytes(); + signature = await _controller!.toPngBytes(); if (widget.onChange != null) { - widget.onChange(signature); + widget.onChange!(signature!); } } _editable = !_editable; @@ -101,20 +99,20 @@ class _ESignatureState extends State { ), ((widget.oldSignature != null || signature != null) && !_editable) ? Container( - 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)), - ) + 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)!), + ) : AbsorbPointer( - absorbing: !_editable, - child: Signature( - controller: _controller, - height: 135.toScreenHeight, - width: MediaQuery.of(context).size.width - 64.toScreenWidth, - backgroundColor: Colors.transparent, - ), - ), + absorbing: !_editable, + child: Signature( + controller: _controller!, + height: 135.toScreenHeight, + width: MediaQuery.of(context).size.width - 64.toScreenWidth, + backgroundColor: Colors.transparent, + ), + ), ], ), ), @@ -127,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/images/multi_image_picker.dart b/lib/views/widgets/images/multi_image_picker.dart index c8e114bb..3bf25b9b 100644 --- a/lib/views/widgets/images/multi_image_picker.dart +++ b/lib/views/widgets/images/multi_image_picker.dart @@ -18,13 +18,24 @@ class MultiFilesPicker extends StatefulWidget { final bool error; final List files; final bool enabled, onlyImages; - double buttonHeight; - Widget buttonIcon; - Color buttonColor; - final Function(List) onChange; + double? buttonHeight; + Widget? buttonIcon; + Color? buttonColor; + final Function(List)? onChange; final bool showAsGrid; - MultiFilesPicker({Key key, this.files, this.label, this.error = false, this.buttonHeight, this.buttonIcon, this.enabled = true, this.onlyImages = false, this.onChange, this.showAsGrid = false,this.buttonColor}) + MultiFilesPicker( + {Key? key, + this.files = const [], + required this.label, + this.error = false, + this.buttonHeight, + this.buttonIcon, + this.enabled = true, + this.onlyImages = false, + this.onChange, + this.showAsGrid = false, + this.buttonColor}) : super(key: key); @override @@ -48,13 +59,13 @@ class _MultiFilesPickerState extends State { ? showFileSourceSheet : onFilePicker), 16.height, - if (widget.files?.isNotEmpty ?? false) + if (widget.files.isNotEmpty) Wrap( spacing: 8.toScreenWidth, children: List.generate( - widget.files.length, + widget.files!.length, (index) { - File image = widget.files[index]; + File image = widget.files![index]; return MultiFilesPickerItem( file: image, enabled: widget.enabled, @@ -64,7 +75,7 @@ class _MultiFilesPickerState extends State { } widget.files.remove(image); if (widget.onChange != null) { - widget.onChange(widget.files); + widget.onChange!(widget.files); } setState(() {}); }, @@ -77,14 +88,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(() {}); } @@ -138,7 +149,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(() {}); } @@ -207,7 +218,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(() {}); }